package org.opencb.opencga.storage.core.manager.variant;
import org.apache.commons.lang.StringUtils;
import org.opencb.commons.datastore.core.Query;
import org.opencb.commons.datastore.core.QueryOptions;
import org.opencb.commons.datastore.core.QueryParam;
import org.opencb.opencga.catalog.db.api.SampleDBAdaptor;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.managers.CatalogManager;
import org.opencb.opencga.catalog.models.Sample;
import org.opencb.opencga.storage.core.manager.CatalogUtils;
import org.opencb.opencga.storage.core.variant.adaptors.VariantDBAdaptor;
import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException;
import java.util.List;
import java.util.stream.Collectors;
import static org.opencb.opencga.storage.core.variant.adaptors.VariantDBAdaptorUtils.*;
/**
* Created on 28/02/17.
*
* @author Jacobo Coll <jacobo167@gmail.com>
*/
public class VariantCatalogQueryUtils extends CatalogUtils {
public static final String SAMPLE_FILTER_DESC =
"Selects some samples using metadata information from Catalog. e.g. age>20;ontologies=hpo:123,hpo:456;name=smith";
public static final QueryParam SAMPLE_FILTER = QueryParam.create("sampleFilter", SAMPLE_FILTER_DESC, QueryParam.Type.TEXT_ARRAY);
// public static final QueryParam SAMPLE_FILTER_GENOTYPE = QueryParam.create("sampleFilterGenotype", "", QueryParam.Type.TEXT_ARRAY);
public VariantCatalogQueryUtils(CatalogManager catalogManager) {
super(catalogManager);
}
/**
* Transforms a high level Query to a query fully understandable by storage.
* @param query High level query. Will be modified by the method.
* @param sessionId User's session id
* @return Modified input query (same instance)
* @throws CatalogException if there is any catalog error
*/
public Query parseQuery(Query query, String sessionId) throws CatalogException {
if (query == null) {
// Nothing to do!
return null;
}
List<Long> studies = getStudies(query, VariantDBAdaptor.VariantQueryParams.STUDIES, sessionId);
String defaultStudyStr;
long defaultStudyId = -1;
if (studies.size() == 1) {
defaultStudyId = studies.get(0);
defaultStudyStr = String.valueOf(studies.get(0));
} else {
defaultStudyStr = null;
}
transformFilter(query, VariantDBAdaptor.VariantQueryParams.STUDIES, value -> catalogManager.getStudyId(value, sessionId));
transformFilter(query, VariantDBAdaptor.VariantQueryParams.RETURNED_STUDIES, value -> catalogManager.getStudyId(value, sessionId));
transformFilter(query, VariantDBAdaptor.VariantQueryParams.COHORTS, value ->
catalogManager.getCohortManager().getId(value, defaultStudyStr, sessionId).getResourceId());
transformFilter(query, VariantDBAdaptor.VariantQueryParams.FILES, value ->
catalogManager.getFileId(value, defaultStudyStr, sessionId));
transformFilter(query, VariantDBAdaptor.VariantQueryParams.RETURNED_FILES, value ->
catalogManager.getFileId(value, defaultStudyStr, sessionId));
// TODO: Parse returned sample filter and add genotype filter
if (isValidParam(query, SAMPLE_FILTER)) {
String sampleAnnotation = query.getString(SAMPLE_FILTER.key());
Query sampleQuery = parseSampleAnnotationQuery(sampleAnnotation, SampleDBAdaptor.QueryParams::getParam);
sampleQuery.append(SampleDBAdaptor.QueryParams.STUDY_ID.key(), defaultStudyId);
QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, SampleDBAdaptor.QueryParams.ID);
List<Long> sampleIds = catalogManager.getAllSamples(defaultStudyId, sampleQuery, options, sessionId).getResult().stream()
.map(Sample::getId)
.collect(Collectors.toList());
if (sampleIds.isEmpty()) {
throw new VariantQueryException("Could not found samples with this annotation: " + sampleAnnotation);
}
String genotype = query.getString("sampleAnnotationGenotype");
// String genotype = query.getString(VariantDBAdaptor.VariantQueryParams.GENOTYPE.key());
if (StringUtils.isNotBlank(genotype)) {
StringBuilder sb = new StringBuilder();
for (Long sampleId : sampleIds) {
sb.append(sampleId).append(IS)
.append(genotype)
.append(AND); // TODO: Should this be an AND (;) or an OR (,)?
}
query.append(VariantDBAdaptor.VariantQueryParams.GENOTYPE.key(), sb.toString());
if (!isValidParam(query, VariantDBAdaptor.VariantQueryParams.RETURNED_SAMPLES)) {
query.append(VariantDBAdaptor.VariantQueryParams.RETURNED_SAMPLES.key(), sampleIds);
}
} else {
query.append(VariantDBAdaptor.VariantQueryParams.SAMPLES.key(), sampleIds);
}
}
return query;
}
}