/* * Copyright 2015-2016 OpenCB * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.opencb.opencga.app.cli.main.executors.catalog; import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.*; import org.opencb.opencga.app.cli.main.executors.OpencgaCommandExecutor; import org.opencb.opencga.app.cli.main.executors.catalog.commons.AclCommandExecutor; import org.opencb.opencga.app.cli.main.executors.catalog.commons.AnnotationCommandExecutor; import org.opencb.opencga.app.cli.main.options.SampleCommandOptions; import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.models.Individual; import org.opencb.opencga.catalog.models.Sample; import org.opencb.opencga.catalog.models.acls.permissions.SampleAclEntry; import java.io.IOException; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; /** * Created by imedina on 03/06/16. */ public class SampleCommandExecutor extends OpencgaCommandExecutor { private SampleCommandOptions samplesCommandOptions; private AclCommandExecutor<Sample, SampleAclEntry> aclCommandExecutor; private AnnotationCommandExecutor<Sample, SampleAclEntry> annotationCommandExecutor; public SampleCommandExecutor(SampleCommandOptions samplesCommandOptions) { super(samplesCommandOptions.commonCommandOptions); this.samplesCommandOptions = samplesCommandOptions; this.aclCommandExecutor = new AclCommandExecutor<>(); this.annotationCommandExecutor = new AnnotationCommandExecutor<>(); } @Override public void execute() throws Exception { logger.debug("Executing samples command line"); String subCommandString = getParsedSubCommand(samplesCommandOptions.jCommander); QueryResponse queryResponse = null; switch (subCommandString) { case "create": queryResponse = create(); break; case "load": queryResponse = load(); break; case "info": queryResponse = info(); break; case "search": queryResponse = search(); break; case "update": queryResponse = update(); break; case "delete": queryResponse = delete(); break; case "groupBy": queryResponse = groupBy(); break; case "individuals": queryResponse = getIndividuals(); break; case "acl": queryResponse = aclCommandExecutor.acls(samplesCommandOptions.aclsCommandOptions, openCGAClient.getSampleClient()); break; case "acl-create": queryResponse = aclCommandExecutor.aclsCreate(samplesCommandOptions.aclsCreateCommandOptions, openCGAClient.getSampleClient()); break; case "acl-member-delete": queryResponse = aclCommandExecutor.aclMemberDelete(samplesCommandOptions.aclsMemberDeleteCommandOptions, openCGAClient.getSampleClient()); break; case "acl-member-info": queryResponse = aclCommandExecutor.aclMemberInfo(samplesCommandOptions.aclsMemberInfoCommandOptions, openCGAClient.getSampleClient()); break; case "acl-member-update": queryResponse = aclCommandExecutor.aclMemberUpdate(samplesCommandOptions.aclsMemberUpdateCommandOptions, openCGAClient.getSampleClient()); break; case "annotation-sets-create": queryResponse = annotationCommandExecutor.createAnnotationSet(samplesCommandOptions.annotationCreateCommandOptions, openCGAClient.getSampleClient()); break; case "annotation-sets-all-info": queryResponse = annotationCommandExecutor.getAllAnnotationSets(samplesCommandOptions.annotationAllInfoCommandOptions, openCGAClient.getSampleClient()); break; case "annotation-sets-search": queryResponse = annotationCommandExecutor.searchAnnotationSets(samplesCommandOptions.annotationSearchCommandOptions, openCGAClient.getSampleClient()); break; case "annotation-sets-delete": queryResponse = annotationCommandExecutor.deleteAnnotationSet(samplesCommandOptions.annotationDeleteCommandOptions, openCGAClient.getSampleClient()); break; case "annotation-sets-info": queryResponse = annotationCommandExecutor.getAnnotationSet(samplesCommandOptions.annotationInfoCommandOptions, openCGAClient.getSampleClient()); break; case "annotation-sets-update": queryResponse = annotationCommandExecutor.updateAnnotationSet(samplesCommandOptions.annotationUpdateCommandOptions, openCGAClient.getSampleClient()); break; default: logger.error("Subcommand not valid"); break; } createOutput(queryResponse); } private QueryResponse<Sample> create() throws CatalogException, IOException { logger.debug("Creating sample"); ObjectMap params = new ObjectMap(); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.DESCRIPTION.key(), samplesCommandOptions.createCommandOptions.description); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.SOURCE.key(), samplesCommandOptions.createCommandOptions.source); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.NAME.key(), samplesCommandOptions.createCommandOptions.name); params.put(SampleDBAdaptor.QueryParams.SOMATIC.key(), samplesCommandOptions.createCommandOptions.somatic); if (StringUtils.isNotEmpty(samplesCommandOptions.createCommandOptions.individual)) { params.put("individual", new ObjectMap("name", samplesCommandOptions.createCommandOptions.individual)); } return openCGAClient.getSampleClient().create(samplesCommandOptions.createCommandOptions.study, params); } private QueryResponse<Sample> load() throws CatalogException, IOException { logger.debug("Loading samples from a pedigree file"); ObjectMap params = new ObjectMap(); params.putIfNotEmpty("file", samplesCommandOptions.loadCommandOptions.pedFile); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.VARIABLE_SET_ID.key(), samplesCommandOptions.loadCommandOptions.variableSetId); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.STUDY.key(), samplesCommandOptions.loadCommandOptions.study); return openCGAClient.getSampleClient().loadFromPed(samplesCommandOptions.loadCommandOptions.study, params); } private QueryResponse<Sample> info() throws CatalogException, IOException { logger.debug("Getting samples information"); ObjectMap params = new ObjectMap(); params.putIfNotNull(SampleDBAdaptor.QueryParams.STUDY.key(), resolveStudy(samplesCommandOptions.infoCommandOptions.study)); params.putIfNotEmpty(QueryOptions.INCLUDE, samplesCommandOptions.infoCommandOptions.dataModelOptions.include); params.putIfNotEmpty(QueryOptions.EXCLUDE, samplesCommandOptions.infoCommandOptions.dataModelOptions.exclude); if (samplesCommandOptions.infoCommandOptions.noLazy) { params.put("lazy", false); } return openCGAClient.getSampleClient().get(samplesCommandOptions.infoCommandOptions.sample, params); } private QueryResponse<Sample> search() throws CatalogException, IOException { logger.debug("Searching samples"); Query query = new Query(); query.putIfNotEmpty(SampleDBAdaptor.QueryParams.STUDY.key(), resolveStudy(samplesCommandOptions.searchCommandOptions.study)); query.putIfNotEmpty(SampleDBAdaptor.QueryParams.NAME.key(), samplesCommandOptions.searchCommandOptions.name); query.putIfNotEmpty(SampleDBAdaptor.QueryParams.SOURCE.key(), samplesCommandOptions.searchCommandOptions.source); query.putIfNotEmpty(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), samplesCommandOptions.searchCommandOptions.individual); query.putIfNotEmpty(SampleDBAdaptor.QueryParams.ANNOTATION_SET_NAME.key(), samplesCommandOptions.searchCommandOptions.annotationSetName); query.putIfNotEmpty(SampleDBAdaptor.QueryParams.VARIABLE_SET_ID.key(), samplesCommandOptions.searchCommandOptions.variableSetId); query.putIfNotEmpty(SampleDBAdaptor.QueryParams.ANNOTATION.key(), samplesCommandOptions.searchCommandOptions.annotation); QueryOptions queryOptions = new QueryOptions(); queryOptions.putIfNotEmpty(QueryOptions.INCLUDE, samplesCommandOptions.searchCommandOptions.dataModelOptions.include); queryOptions.putIfNotEmpty(QueryOptions.EXCLUDE, samplesCommandOptions.searchCommandOptions.dataModelOptions.exclude); queryOptions.put(QueryOptions.LIMIT, samplesCommandOptions.searchCommandOptions.numericOptions.limit); queryOptions.put(QueryOptions.SKIP, samplesCommandOptions.searchCommandOptions.numericOptions.skip); queryOptions.put("count", samplesCommandOptions.searchCommandOptions.numericOptions.count); return openCGAClient.getSampleClient().search(query, queryOptions); } private QueryResponse<Sample> update() throws CatalogException, IOException { logger.debug("Updating samples"); ObjectMap params = new ObjectMap(); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.NAME.key(), samplesCommandOptions.updateCommandOptions.name); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.DESCRIPTION.key(), samplesCommandOptions.updateCommandOptions.description); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.SOURCE.key(), samplesCommandOptions.updateCommandOptions.source); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), samplesCommandOptions.updateCommandOptions.individual); params.putIfNotNull(SampleDBAdaptor.QueryParams.SOMATIC.key(), samplesCommandOptions.updateCommandOptions.somatic); return openCGAClient.getSampleClient().update(samplesCommandOptions.updateCommandOptions.sample, samplesCommandOptions.updateCommandOptions.study, params); } private QueryResponse<Sample> delete() throws CatalogException, IOException { logger.debug("Deleting the selected sample"); ObjectMap params = new ObjectMap(); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.STUDY.key(), samplesCommandOptions.deleteCommandOptions.study); return openCGAClient.getSampleClient().delete(samplesCommandOptions.deleteCommandOptions.sample, params); } private QueryResponse<ObjectMap> groupBy() throws CatalogException, IOException { logger.debug("Group By samples"); String study = resolveStudy(samplesCommandOptions.groupByCommandOptions.study); ObjectMap params = new ObjectMap(); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.STUDY.key(), study); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.ID.key(), samplesCommandOptions.groupByCommandOptions.id); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.NAME.key(), samplesCommandOptions.groupByCommandOptions.name); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.SOURCE.key(), samplesCommandOptions.groupByCommandOptions.source); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), samplesCommandOptions.groupByCommandOptions.individual); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.ANNOTATION_SET_NAME.key(), samplesCommandOptions.groupByCommandOptions.annotationSetName); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.VARIABLE_SET_ID.key(), samplesCommandOptions.groupByCommandOptions.variableSetId); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.ANNOTATION.key(), samplesCommandOptions.groupByCommandOptions.annotation); return openCGAClient.getSampleClient().groupBy(samplesCommandOptions.groupByCommandOptions.study, samplesCommandOptions.groupByCommandOptions.fields, params); } private QueryResponse<Individual> getIndividuals() throws CatalogException, IOException { logger.debug("Getting individuals of sample(s)"); ObjectMap params = new ObjectMap(); params.putIfNotEmpty(SampleDBAdaptor.QueryParams.STUDY.key(), resolveStudy(samplesCommandOptions.individualCommandOptions.study)); params.put("lazy", false); // Obtain the whole individual entity params.putIfNotNull(QueryOptions.INCLUDE, samplesCommandOptions.individualCommandOptions.dataModelOptions.include); params.putIfNotNull(QueryOptions.EXCLUDE, samplesCommandOptions.individualCommandOptions.dataModelOptions.exclude); QueryResponse<Sample> sampleQueryResponse = openCGAClient.getSampleClient().get(samplesCommandOptions.individualCommandOptions.sample, params); if (sampleQueryResponse.allResultsSize() == 0) { return new QueryResponse<>(sampleQueryResponse.getApiVersion(), -1, sampleQueryResponse.getWarning(), sampleQueryResponse.getError(), sampleQueryResponse.getQueryOptions(), new LinkedList<>()); } // We get the individuals from the sample response List<Individual> individualList = sampleQueryResponse.allResults() .stream() .map(Sample::getIndividual) .collect(Collectors.toCollection(LinkedList::new)); return new QueryResponse<>(sampleQueryResponse.getApiVersion(), -1, sampleQueryResponse.getWarning(), sampleQueryResponse.getError(), sampleQueryResponse.getQueryOptions(), Arrays.asList(new QueryResult<>(samplesCommandOptions.individualCommandOptions.sample, -1, individualList.size(), individualList.size(), "", "", individualList))); } }