package org.opencb.opencga.storage.core.variant.dummy; import com.google.common.collect.BiMap; import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.feature.Genotype; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.VariantSource; import org.opencb.biodata.models.variant.avro.AdditionalAttribute; import org.opencb.biodata.models.variant.avro.FileEntry; import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.biodata.models.variant.stats.VariantSourceStats; import org.opencb.biodata.models.variant.stats.VariantStats; import org.opencb.cellbase.client.rest.CellBaseClient; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryResult; import org.opencb.opencga.core.results.VariantQueryResult; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.StudyConfiguration; import org.opencb.opencga.storage.core.metadata.StudyConfigurationManager; import org.opencb.opencga.storage.core.variant.adaptors.*; import org.opencb.opencga.storage.core.variant.stats.VariantStatsWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.*; import java.util.function.Consumer; /** * Created on 28/11/16. * * @author Jacobo Coll <jacobo167@gmail.com> */ public class DummyVariantDBAdaptor implements VariantDBAdaptor { private final String dbName; private boolean closed = false; private Logger logger = LoggerFactory.getLogger(DummyVariantDBAdaptor.class); private static final List<String> TEMPLATES; static { TEMPLATES = new ArrayList<>(); for (int chr = 1; chr <= 22; chr++) { TEMPLATES.add(chr + ":1000:A:C"); } TEMPLATES.add("X:1000:A:C"); TEMPLATES.add("Y:1000:A:C"); TEMPLATES.add("MT:1000:A:C"); } public DummyVariantDBAdaptor(String dbName) { this.dbName = dbName; } @Override public VariantQueryResult<Variant> get(Query query, QueryOptions options) { List<Variant> variants = new ArrayList<>(); iterator(query, options).forEachRemaining(variants::add); return new VariantQueryResult<>("", 0, variants.size(), variants.size(), "", "", variants, null); } @Override public List<VariantQueryResult<Variant>> get(List<Query> queries, QueryOptions options) { return null; } @Override public VariantQueryResult<Variant> getPhased(String variant, String studyName, String sampleName, QueryOptions options, int windowsSize) { return null; } @Override public QueryResult<Long> count(Query query) { return new QueryResult<>("", 0, 1, 1, "", "", Collections.singletonList((long) TEMPLATES.size())); } @Override public QueryResult distinct(Query query, String field) { return null; } @Override public VariantDBIterator iterator() { return iterator(new Query(), new QueryOptions()); } @Override public VariantDBIterator iterator(Query query, QueryOptions options) { List<Variant> variants = new ArrayList<>(TEMPLATES.size()); for (String template : TEMPLATES) { Variant variant = new Variant(template); Map<Integer, List<Integer>> returnedSamples = getReturnedSamples(query, options); returnedSamples.forEach((study, samples) -> { StudyConfiguration sc = getStudyConfigurationManager().getStudyConfiguration(study, null).first(); if (sc.getIndexedFiles().isEmpty()) { // Ignore non indexed studies return; // continue } StudyEntry st = new StudyEntry(sc.getStudyName(), Collections.emptyList(), Collections.singletonList("GT")); BiMap<Integer, String> samplesMap = sc.getSampleIds().inverse(); for (Integer sampleId : samples) { st.addSampleData(samplesMap.get(sampleId), Collections.singletonList("0/0")); } variant.addStudyEntry(st); for (Integer cid : sc.getCalculatedStats()) { VariantStats stats = new VariantStats(); stats.addGenotype(new Genotype("0/0"), sc.getCohorts().get(cid).size()); st.setStats(sc.getCohortIds().inverse().get(cid), stats); } List<FileEntry> files = new ArrayList<>(); for (Integer id : sc.getIndexedFiles()) { files.add(new FileEntry(id.toString(), "", Collections.emptyMap())); } st.setFiles(files); }); variants.add(variant); } return toVariantDBIterator(variants); } VariantDBIterator toVariantDBIterator(final List<Variant> variants) { return new VariantDBIterator() { Iterator<Variant> iterator = variants.iterator(); @Override public boolean hasNext() { return iterator.hasNext(); } @Override public Variant next() { return iterator.next(); } }; } @Override public QueryResult getFrequency(Query query, Region region, int regionIntervalSize) { return null; } @Override public QueryResult rank(Query query, String field, int numResults, boolean asc) { return null; } @Override public QueryResult groupBy(Query query, String field, QueryOptions options) { return null; } @Override public QueryResult groupBy(Query query, List<String> fields, QueryOptions options) { return null; } // Update methods @Override public QueryResult updateStats(List<VariantStatsWrapper> variantStatsWrappers, StudyConfiguration studyConfiguration, QueryOptions options) { QueryResult queryResult = new QueryResult(); logger.info("Writing " + variantStatsWrappers.size() + " statistics"); queryResult.setNumResults(variantStatsWrappers.size()); queryResult.setNumTotalResults(variantStatsWrappers.size()); return queryResult; } @Override public QueryResult updateAnnotations(List<VariantAnnotation> variantAnnotations, QueryOptions queryOptions) { return new QueryResult(); } @Override public QueryResult updateCustomAnnotations(Query query, String name, AdditionalAttribute attribute, QueryOptions options) { System.out.println("Update custom annotation : " + name); return new QueryResult(); } // Unsupported methods @Override public QueryResult insert(List<Variant> variants, String studyName, QueryOptions options) { throw new UnsupportedOperationException(); } @Override public QueryResult delete(Query query, QueryOptions options) { throw new UnsupportedOperationException(); } @Override public QueryResult deleteSamples(String studyName, List<String> sampleNames, QueryOptions options) { throw new UnsupportedOperationException(); } @Override public QueryResult deleteFile(String studyName, String fileName, QueryOptions options) { throw new UnsupportedOperationException(); } @Override public QueryResult deleteStudy(String studyName, QueryOptions options) { throw new UnsupportedOperationException(); } @Override public QueryResult updateStats(List<VariantStatsWrapper> variantStatsWrappers, String studyName, QueryOptions queryOptions) { throw new UnsupportedOperationException(); } @Override public QueryResult deleteStats(String studyName, String cohortName, QueryOptions options) { throw new UnsupportedOperationException(); } @Override @Deprecated public QueryResult addAnnotations(List<VariantAnnotation> variantAnnotations, QueryOptions queryOptions) { throw new UnsupportedOperationException(); } @Override public QueryResult deleteAnnotation(String annotationId, Query query, QueryOptions queryOptions) { throw new UnsupportedOperationException(); } @Override public VariantSourceDBAdaptor getVariantSourceDBAdaptor() { return new VariantSourceDBAdaptor() { @Override public QueryResult<Long> count() { return new QueryResult<>(); } @Override public void updateVariantSource(VariantSource variantSource) throws StorageEngineException { } @Override public Iterator<VariantSource> iterator(Query query, QueryOptions options) throws IOException { return Collections.emptyIterator(); } @Override public QueryResult updateSourceStats(VariantSourceStats variantSourceStats, StudyConfiguration studyConfiguration, QueryOptions queryOptions) { return new QueryResult(); } @Override public void close() throws IOException { } }; } @Override public StudyConfigurationManager getStudyConfigurationManager() { return new DummyStudyConfigurationManager(); } @Override public void setStudyConfigurationManager(StudyConfigurationManager studyConfigurationManager) { } @Override public CellBaseClient getCellBaseClient() { return null; } @Override public VariantDBAdaptorUtils getDBAdaptorUtils() { return new VariantDBAdaptorUtils(this); } @Override public void close() throws IOException { closed = true; } }