Skip to content

Commit

Permalink
server: add endpoint 'snp' and update endpotins variant/search varian…
Browse files Browse the repository at this point in the history
…t/info to look for dbSNP ID, #TASK-5820, #TASK-5789
  • Loading branch information
jtarraga committed Mar 11, 2024
1 parent 2d6ca96 commit 56b3eb6
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@

import com.mongodb.bulk.BulkWriteResult;
import com.mongodb.client.model.Filters;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.opencb.biodata.models.core.GenomicScoreRegion;
import org.opencb.biodata.models.core.Region;
import org.opencb.biodata.models.core.Snp;
import org.opencb.biodata.models.variant.Variant;
import org.opencb.biodata.models.variant.avro.Score;
import org.opencb.biodata.models.variant.avro.StructuralVariantType;
Expand All @@ -40,6 +42,7 @@
import org.opencb.cellbase.lib.iterator.CellBaseIterator;
import org.opencb.cellbase.lib.iterator.CellBaseMongoDBIterator;
import org.opencb.cellbase.lib.iterator.VariantMongoDBIterator;
import org.opencb.commons.datastore.core.DataResult;
import org.opencb.commons.datastore.core.Query;
import org.opencb.commons.datastore.core.QueryOptions;
import org.opencb.commons.datastore.core.QueryParam;
Expand All @@ -50,6 +53,7 @@
import java.util.*;
import java.util.function.Consumer;

import static org.opencb.cellbase.core.ParamConstants.API_KEY_PARAM;
import static org.opencb.cellbase.core.ParamConstants.DATA_RELEASE_PARAM;
import static org.opencb.cellbase.lib.MongoDBCollectionConfiguration.VARIATION_FUNCTIONAL_SCORE_CHUNK_SIZE;

Expand All @@ -68,6 +72,7 @@ public class VariantMongoDBAdaptor extends CellBaseDBAdaptor implements CellBase


private Map<Integer, MongoDBCollection> caddDBCollectionByRelease;
private Map<Integer, MongoDBCollection> snpDBCollectionByRelease;

public VariantMongoDBAdaptor(MongoDataStore mongoDataStore) {
super(mongoDataStore);
Expand All @@ -80,6 +85,7 @@ private void init() {

mongoDBCollectionByRelease = buildCollectionByReleaseMap("variation");
caddDBCollectionByRelease = buildCollectionByReleaseMap("variation_functional_score");
snpDBCollectionByRelease = buildCollectionByReleaseMap("snp");
}

public CellBaseDataResult<Variant> next(Query query, QueryOptions options) {
Expand Down Expand Up @@ -207,7 +213,7 @@ public CellBaseDataResult groupBy(Query query, List<String> fields, QueryOptions
}

@Deprecated
private Bson parseQuery(Query query) {
private Bson parseQuery(Query query) throws CellBaseException {
List<Bson> andBsonList = new ArrayList<>();

createOrQuery(query, ParamConstants.QueryParams.CHROMOSOME.key(), "chromosome", andBsonList);
Expand All @@ -221,7 +227,12 @@ private Bson parseQuery(Query query) {
}
createRegionQuery(query, ParamConstants.QueryParams.REGION.key(),
MongoDBCollectionConfiguration.VARIATION_CHUNK_SIZE, andBsonList);
createOrQuery(query, ParamConstants.QueryParams.ID.key(), "id", andBsonList);

if (StringUtils.isNotEmpty(query.getString(ParamConstants.QueryParams.ID.key()))) {
List<String> variantIds = getVariantIds(query.getAsStringList(ParamConstants.QueryParams.ID.key()),
query.getInt(DATA_RELEASE_PARAM));
createOrQuery(variantIds, "id", andBsonList);
}

createImprecisePositionQuery(query, ParamConstants.QueryParams.CI_START_LEFT.key(),
ParamConstants.QueryParams.CI_START_RIGHT.key(),
Expand All @@ -243,16 +254,21 @@ private Bson parseQuery(Query query) {
}
}

public Bson parseQuery(VariantQuery query) {
public Bson parseQuery(VariantQuery query) throws CellBaseException {
List<Bson> andBsonList = new ArrayList<>();
try {
for (Map.Entry<String, Object> entry : query.toObjectMap().entrySet()) {
String dotNotationName = entry.getKey();
Object value = entry.getValue();
switch (dotNotationName) {
case "id":
List<String> variantIds = getVariantIds(Arrays.asList(query.getId().split(",")), query.getDataRelease());
createAndOrQuery(variantIds, dotNotationName, QueryParam.Type.STRING, andBsonList);
break;
case "region":
createRegionQuery(query, query.getRegions(), MongoDBCollectionConfiguration.VARIATION_CHUNK_SIZE, andBsonList);
break;
case API_KEY_PARAM:
case DATA_RELEASE_PARAM:
case "svType":
// don't do anything, this is parsed later
Expand Down Expand Up @@ -283,7 +299,7 @@ public Bson parseQuery(VariantQuery query) {
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
throw new CellBaseException(e.getMessage());
}

logger.debug("variant parsed query: " + andBsonList.toString());
Expand Down Expand Up @@ -745,13 +761,14 @@ public List<CellBaseDataResult<Variant>> info(List<String> ids, ProjectionQueryO
throws CellBaseException {
List<CellBaseDataResult<Variant>> results = new ArrayList<>();
MongoDBCollection mongoDBCollection = getCollectionByRelease(mongoDBCollectionByRelease, dataRelease);
for (String id : ids) {
Bson projection = getProjection(queryOptions);
List<Bson> orBsonList = new ArrayList<>(ids.size());
orBsonList.add(Filters.eq("id", id));
Bson bson = Filters.or(orBsonList);
results.add(new CellBaseDataResult<>(mongoDBCollection.find(bson, projection, Variant.class, new QueryOptions())));
Bson projection = getProjection(queryOptions);
List<String> variantIds = getVariantIds(ids, dataRelease);
List<Bson> orBsonList = new ArrayList<>(variantIds.size());
for (String variantId : variantIds) {
orBsonList.add(Filters.eq("id", variantId));
}
Bson bson = Filters.or(orBsonList);
results.add(new CellBaseDataResult<>(mongoDBCollection.find(bson, projection, Variant.class, new QueryOptions())));
return results;
}

Expand All @@ -776,6 +793,46 @@ public CellBaseDataResult<GenomicScoreRegion> getFunctionalScoreRegion(List<Stri

return new CellBaseDataResult<>(mongoDBCollection.find(bson, projection, GenomicScoreRegion.class, new QueryOptions()));
}

private List<String> getVariantIds(List<String> ids, int dataRelease) throws CellBaseException {
List<String> variantIds = new ArrayList<>();
List<String> snpIds = new ArrayList<>();
for (String id : ids) {
if (id.startsWith("rs")) {
snpIds.add(id);
} else {
variantIds.add(id);
}
}
if (CollectionUtils.isNotEmpty(snpIds)) {
List<Bson> orBsonList = new ArrayList<>();
for (String snpId : snpIds) {
orBsonList.add(Filters.eq("id", snpId));
}
Bson query = Filters.or(orBsonList);

MongoDBCollection mongoDBCollection = getCollectionByRelease(snpDBCollectionByRelease, dataRelease);
DataResult<Snp> snpDataResult = mongoDBCollection.find(query, null, Snp.class, new QueryOptions());

Set<String> results = new HashSet<>();

// Build the variant IDs
if (snpDataResult.getNumResults() > 0) {
for (Snp snp : snpDataResult.getResults()) {
for (String allele : snp.getAlleles()) {
results.add(snp.getChromosome() + ":" + snp.getPosition() + ":" + snp.getReference() + ":" + allele);
}
}
}

// Add new variant IDs, if necessary
if (CollectionUtils.isNotEmpty(results)) {
variantIds.addAll(results);
}
}

return variantIds;
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,17 @@

package org.opencb.cellbase.lib.managers;

import org.opencb.biodata.models.core.Gene;
import org.opencb.biodata.models.core.GenomicScoreRegion;
import org.opencb.biodata.models.core.Region;
import org.opencb.biodata.models.core.SpliceScore;
import org.opencb.biodata.models.core.*;
import org.opencb.biodata.models.variant.Variant;
import org.opencb.biodata.models.variant.VariantBuilder;
import org.opencb.biodata.models.variant.avro.SampleEntry;
import org.opencb.biodata.models.variant.avro.Score;
import org.opencb.biodata.models.variant.avro.VariantAnnotation;
import org.opencb.biodata.models.variant.avro.VariantType;
import org.opencb.cellbase.core.ParamConstants;
import org.opencb.cellbase.core.api.SnpQuery;
import org.opencb.cellbase.core.api.VariantQuery;
import org.opencb.cellbase.core.api.key.ApiKeyLicensedDataUtils;
import org.opencb.cellbase.core.api.query.CellBaseQueryOptions;
import org.opencb.cellbase.core.api.query.QueryException;
import org.opencb.cellbase.core.config.CellBaseConfiguration;
Expand All @@ -36,9 +35,9 @@
import org.opencb.cellbase.core.result.CellBaseDataResult;
import org.opencb.cellbase.core.variant.AnnotationBasedPhasedQueryManager;
import org.opencb.cellbase.lib.impl.core.CellBaseCoreDBAdaptor;
import org.opencb.cellbase.lib.impl.core.SnpMongoDBAdaptor;
import org.opencb.cellbase.lib.impl.core.SpliceScoreMongoDBAdaptor;
import org.opencb.cellbase.lib.impl.core.VariantMongoDBAdaptor;
import org.opencb.cellbase.core.api.key.ApiKeyLicensedDataUtils;
import org.opencb.cellbase.lib.variant.VariantAnnotationUtils;
import org.opencb.cellbase.lib.variant.annotation.CellBaseNormalizerSequenceAdaptor;
import org.opencb.cellbase.lib.variant.annotation.VariantAnnotationCalculator;
Expand All @@ -59,6 +58,7 @@ public class VariantManager extends AbstractManager implements AggregationApi<Va
+ ":[(alt)|(left_ins_seq)...(right_ins_seq)]";
private VariantMongoDBAdaptor variantDBAdaptor;
private SpliceScoreMongoDBAdaptor spliceDBAdaptor;
private SnpMongoDBAdaptor snpDBAdaptor;

private CellBaseManagerFactory cellbaseManagerFactory;
private GenomeManager genomeManager;
Expand All @@ -77,6 +77,7 @@ public VariantManager(String species, String assembly, CellBaseConfiguration con
private void init() throws CellBaseException {
variantDBAdaptor = dbAdaptorFactory.getVariationDBAdaptor();
spliceDBAdaptor = dbAdaptorFactory.getSpliceScoreDBAdaptor();
snpDBAdaptor = dbAdaptorFactory.getSnpDBAdaptor();
cellbaseManagerFactory = new CellBaseManagerFactory(configuration);
genomeManager = cellbaseManagerFactory.getGenomeManager(species, assembly);
}
Expand Down Expand Up @@ -353,4 +354,8 @@ public CellBaseDataResult<GenomicScoreRegion> getFunctionalScoreRegion(List<Regi

return variantDBAdaptor.getFunctionalScoreRegion(new ArrayList<>(chunkIdSet), options, dataRelease);
}

public CellBaseDataResult<Snp> getSnps(SnpQuery query) throws CellBaseException {
return snpDBAdaptor.query(query);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@

import io.swagger.annotations.*;
import org.apache.commons.lang.StringUtils;
import org.opencb.biodata.models.core.Snp;
import org.opencb.biodata.models.variant.Variant;
import org.opencb.biodata.models.variant.avro.VariantAnnotation;
import org.opencb.cellbase.core.api.SnpQuery;
import org.opencb.cellbase.core.api.VariantQuery;
import org.opencb.cellbase.core.models.DataRelease;
import org.opencb.cellbase.core.result.CellBaseDataResult;
Expand Down Expand Up @@ -493,6 +495,39 @@ public Response getAllConsequenceTypes() {
}
}

@GET
@Path("/snp")
@ApiOperation(httpMethod = "GET", value = "Get SNPs",
response = Snp.class, responseContainer = "QueryResponse")
@ApiImplicitParams({
@ApiImplicitParam(name = "exclude", value = EXCLUDE_DESCRIPTION,
required = false, dataType = "java.util.List", paramType = "query"),
@ApiImplicitParam(name = "include", value = INCLUDE_DESCRIPTION,
required = false, dataType = "java.util.List", paramType = "query"),
@ApiImplicitParam(name = "sort", value = SORT_DESCRIPTION,
required = false, dataType = "java.util.List", paramType = "query"),
@ApiImplicitParam(name = "order", value = ORDER_DESCRIPTION,
required = false, dataType = "java.util.List", paramType = "query",
defaultValue = "", allowableValues="ASCENDING,DESCENDING"),
@ApiImplicitParam(name = "limit", value = LIMIT_DESCRIPTION,
required = false, defaultValue = DEFAULT_LIMIT, dataType = "java.util.List",
paramType = "query"),
@ApiImplicitParam(name = "skip", value = SKIP_DESCRIPTION,
required = false, defaultValue = DEFAULT_SKIP, dataType = "java.util.List",
paramType = "query")
})
public Response getSnps(@QueryParam("id") @ApiParam(name = "id", value = "ID") String id,
@QueryParam("chromosome") @ApiParam(name = "chromosome", value = "Chromsome") String chromosome,
@QueryParam("position") @ApiParam(name = "position", value = "Position") Integer position) {
try {
SnpQuery query = new SnpQuery(uriParams);
CellBaseDataResult<Snp> queryResult = variantManager.getSnps(query);
return createOkResponse(queryResult);
} catch (Exception e) {
return createErrorResponse(e);
}
}

// FIXME: 29/04/16 GET and POST web services to be fixed
// @GET
// @Path("/{variants}/consequenceType")
Expand Down

0 comments on commit 56b3eb6

Please sign in to comment.