From 6a7cd2c84e1b534c08e7c665bb4c39cdbcb7c4ea Mon Sep 17 00:00:00 2001 From: Julie Sullivan Date: Tue, 10 Mar 2020 17:20:55 +0000 Subject: [PATCH] add gene sequence end point. #528 --- .../core/api/queries/AbstractQuery.java | 9 +++--- .../lib/impl/core/GeneCoreDBAdaptor.java | 12 ++++++-- .../lib/impl/core/MongoDBAdaptor.java | 4 +-- .../impl/core/TranscriptCoreDBAdaptor.java | 2 -- .../cellbase/lib/managers/AggregationApi.java | 5 ++++ .../cellbase/lib/managers/GeneManager.java | 29 +++++++++++++++++++ .../server/rest/GenericRestWSServer.java | 10 +++++-- .../server/rest/feature/GeneWSServer.java | 29 +++++++++++++++++++ 8 files changed, 87 insertions(+), 13 deletions(-) diff --git a/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/AbstractQuery.java b/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/AbstractQuery.java index efa2d93c48..e18d417230 100644 --- a/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/AbstractQuery.java +++ b/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/AbstractQuery.java @@ -139,10 +139,11 @@ public void updateParams(Map uriParams) throws QueryException { } params.remove(fieldNameDotNotation); } - // TODO handle assembly better. we're just ignoring it now. - if (!params.isEmpty()) { - throw new QueryException("Invalid query parameter found: " + params.keySet().toString()); - } + // TODO there are params in the query string that are not in the query, e.g. aa and position for substitution scores + // do we remove this check? or handle expected parameteters? I think we delete this. +// if (!params.isEmpty()) { +// throw new QueryException("Invalid query parameter found: " + params.keySet().toString()); +// } objectMapper.updateValue(this, objectHashMap); } catch (JsonProcessingException e) { throw new IllegalArgumentException(e); diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/GeneCoreDBAdaptor.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/GeneCoreDBAdaptor.java index 7a4291a23a..347801b751 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/GeneCoreDBAdaptor.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/GeneCoreDBAdaptor.java @@ -334,9 +334,15 @@ public Bson parseQuery(GeneQuery geneQuery) { case "transcripts.xrefs": if (!visited) { List identifers = new ArrayList<>(); - identifers.addAll(geneQuery.getIds()); - identifers.addAll(geneQuery.getNames()); - identifers.addAll(geneQuery.getTranscriptsXrefs()); + if (geneQuery.getIds() != null) { + identifers.addAll(geneQuery.getIds()); + } + if (geneQuery.getNames() != null) { + identifers.addAll(geneQuery.getNames()); + } + if (geneQuery.getTranscriptsXrefs() != null) { + identifers.addAll(geneQuery.getTranscriptsXrefs()); + } createIdRegionQuery(geneQuery.getRegions(), identifers, andBsonList); visited = true; } diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/MongoDBAdaptor.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/MongoDBAdaptor.java index 6ee99456e4..5c817e8ac0 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/MongoDBAdaptor.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/MongoDBAdaptor.java @@ -145,7 +145,7 @@ protected void createIdRegionQuery(List regions, List ids, List< Bson end = Filters.gte("end", regions.get(0).getStart()); andBsonList.add(Filters.and(chromosome, start, end)); } else if (CollectionUtils.isEmpty(regions) && ids.size() == 1) { - Bson idFilter = Filters.eq("id", ids.get(0)); + Bson idFilter = Filters.eq("transcripts.xrefs.id", ids.get(0)); andBsonList.add(idFilter); } else { List orBsonList = new ArrayList<>(); @@ -159,7 +159,7 @@ protected void createIdRegionQuery(List regions, List ids, List< } if (CollectionUtils.isNotEmpty(ids)) { for (String id : ids) { - Bson idFilter = Filters.eq("id", id); + Bson idFilter = Filters.eq("transcripts.xrefs.id", id); orBsonList.add(idFilter); } } diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/TranscriptCoreDBAdaptor.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/TranscriptCoreDBAdaptor.java index a1c234cd84..67edaa2f4b 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/TranscriptCoreDBAdaptor.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/impl/core/TranscriptCoreDBAdaptor.java @@ -50,8 +50,6 @@ public TranscriptCoreDBAdaptor(String species, String assembly, MongoDataStore m logger.debug("TranscriptMongoDBAdaptor: in 'constructor'"); } - - // @Override // public CellBaseDataResult getCdna(String id) { // Bson bson = Filters.eq("transcripts.xrefs.id", id); diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/AggregationApi.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/AggregationApi.java index 70c63159e9..c5a247360f 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/AggregationApi.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/AggregationApi.java @@ -21,6 +21,11 @@ public interface AggregationApi extends FeatureApi { + default CellBaseDataResult count(Q query) { + query.setCount(Boolean.TRUE); + return getDBAdaptor().count(query); + } + default CellBaseDataResult groupBy(Q query) { query.setCount(Boolean.FALSE); return getDBAdaptor().groupBy(query); diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/GeneManager.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/GeneManager.java index b7c5809fb4..fe2dc73b80 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/GeneManager.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/GeneManager.java @@ -16,17 +16,25 @@ package org.opencb.cellbase.lib.managers; +import org.apache.commons.collections.CollectionUtils; import org.opencb.biodata.models.core.Gene; +import org.opencb.biodata.models.core.GenomeSequenceFeature; +import org.opencb.biodata.models.core.Region; import org.opencb.cellbase.core.api.core.CellBaseCoreDBAdaptor; import org.opencb.cellbase.core.api.queries.GeneQuery; import org.opencb.cellbase.core.config.CellBaseConfiguration; +import org.opencb.cellbase.core.result.CellBaseDataResult; import org.opencb.cellbase.lib.impl.core.GeneCoreDBAdaptor; +import org.opencb.cellbase.lib.impl.core.GenomeMongoDBAdaptor; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; public class GeneManager extends AbstractManager implements AggregationApi { private GeneCoreDBAdaptor geneDBAdaptor; + private GenomeMongoDBAdaptor genomeDBAdaptor; public GeneManager(String species, String assembly, CellBaseConfiguration configuration) { super(species, assembly, configuration); @@ -35,6 +43,7 @@ public GeneManager(String species, String assembly, CellBaseConfiguration config private void init() { geneDBAdaptor = dbAdaptorFactory.getGeneDBAdaptor(species, assembly); + genomeDBAdaptor = dbAdaptorFactory.getGenomeDBAdaptor(species, assembly); } public Iterator iterator(GeneQuery geneQuery) { @@ -46,6 +55,26 @@ public CellBaseCoreDBAdaptor getDBAdaptor() { return geneDBAdaptor; } + public List> getSequence(List queries) { + List> sequences = new ArrayList<>(); + for (GeneQuery query : queries) { + // get the coordinates for the gene + CellBaseDataResult geneCellBaseDataResult = geneDBAdaptor.query(query); + + // get the sequences for those coordinates + List results = geneCellBaseDataResult.getResults(); + if (CollectionUtils.isNotEmpty(results)) { + Gene gene = results.get(0); + Region region = Region.parseRegion(gene.getChromosome() + ":" + gene.getStart() + "-" + gene.getEnd()); + CellBaseDataResult sequence = genomeDBAdaptor.getSequence(region, query.toQueryOptions()); + sequences.add(sequence); + } else { + sequences.add(null); + } + } + return sequences; + } + // public List getRegulatoryElements(Query geneQuery, String genes) { // String[] geneArray = genes.split(","); // List geneQueryResults = new ArrayList<>(geneArray.length); diff --git a/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/GenericRestWSServer.java b/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/GenericRestWSServer.java index dfbf52ff85..0842f6967f 100755 --- a/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/GenericRestWSServer.java +++ b/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/GenericRestWSServer.java @@ -25,6 +25,7 @@ import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper; import com.google.common.base.Splitter; import io.swagger.annotations.ApiOperation; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.opencb.cellbase.core.CellBaseDataResponse; @@ -180,7 +181,10 @@ public Map convertMultiToMap(MultivaluedMap mult return convertedMap; } for (Map.Entry> entry : multivaluedMap.entrySet()) { - convertedMap.put(entry.getKey(), String.join(",", entry.getValue())); + List values = entry.getValue(); + if (CollectionUtils.isNotEmpty(values)) { + convertedMap.put(entry.getKey(), String.join(",", entry.getValue())); + } } return convertedMap; } @@ -364,7 +368,9 @@ protected Response createStringResponse(String str) { protected Response createJsonResponse(CellBaseDataResponse queryResponse) { try { - System.out.println("queryResponse.getResponses().get(0).toString() = " + queryResponse.getResponses().get(0).toString()); + if (CollectionUtils.isNotEmpty(queryResponse.getResponses()) && queryResponse.getResponses().get(0) != null) { + System.out.println("queryResponse.getResponses().get(0).toString() = " + queryResponse.getResponses().get(0).toString()); + } String value = jsonObjectWriter.writeValueAsString(queryResponse); ResponseBuilder ok = Response.ok(value, MediaType.APPLICATION_JSON_TYPE.withCharset("utf-8")); return buildResponse(ok); diff --git a/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/feature/GeneWSServer.java b/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/feature/GeneWSServer.java index 2fc2938493..87fe7ebfae 100755 --- a/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/feature/GeneWSServer.java +++ b/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/feature/GeneWSServer.java @@ -21,6 +21,7 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.formats.protein.uniprot.v202003jaxb.Entry; import org.opencb.biodata.models.core.Gene; +import org.opencb.biodata.models.core.GenomeSequenceFeature; import org.opencb.biodata.models.core.Transcript; import org.opencb.biodata.models.core.TranscriptTfbs; import org.opencb.biodata.models.variant.Variant; @@ -691,6 +692,34 @@ public Response getProteinById(@PathParam("genes") @ApiParam(name = "genes", val } } + @GET + @Path("/{genes}/sequence") + @ApiOperation(httpMethod = "GET", value = "Return sequences for specified genes", response = GenomeSequenceFeature.class, + responseContainer = "QueryResponse") + @ApiImplicitParams({ + @ApiImplicitParam(name = "exclude", value = ParamConstants.EXCLUDE_DESCRIPTION, + required = false, dataType = "java.util.List", paramType = "query"), + @ApiImplicitParam(name = "include", value = ParamConstants.INCLUDE_DESCRIPTION, + required = false, dataType = "java.util.List", paramType = "query") + }) + public Response getSequence(@PathParam("genes") @ApiParam(name = "genes", value = ParamConstants.GENE_IDS, + required = true) String genes) { + try { + List queries = new ArrayList<>(); + String[] identifiers = genes.split(","); + for (String identifier : identifiers) { + GeneQuery query = new GeneQuery(uriParams); + query.setTranscriptsXrefs(Arrays.asList(identifier)); + queries.add(query); + logger.info("REST GeneQuery: " + query.toString()); + } + List> queryResults = geneManager.getSequence(queries); + return createOkResponse(queryResults); + } catch (Exception e) { + return createErrorResponse(e); + } + } + // @GET // @Path("/{genes}/ppi") // @ApiOperation(httpMethod = "GET", value = "Get the protein-protein interactions in which this gene is involved",