/*
* 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.opencb.commons.datastore.core.ObjectMap;
import org.opencb.commons.datastore.core.Query;
import org.opencb.commons.datastore.core.QueryOptions;
import org.opencb.commons.datastore.core.QueryResponse;
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.CohortCommandOptions;
import org.opencb.opencga.catalog.db.api.CohortDBAdaptor;
import org.opencb.opencga.catalog.db.api.JobDBAdaptor;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.models.Cohort;
import org.opencb.opencga.catalog.models.Sample;
import org.opencb.opencga.catalog.models.acls.permissions.CohortAclEntry;
import java.io.IOException;
/**
* Created by imedina on 03/06/16.
*/
public class CohortCommandExecutor extends OpencgaCommandExecutor {
private CohortCommandOptions cohortsCommandOptions;
private AclCommandExecutor<Cohort, CohortAclEntry> aclCommandExecutor;
private AnnotationCommandExecutor<Cohort, CohortAclEntry> annotationCommandExecutor;
public CohortCommandExecutor(CohortCommandOptions cohortsCommandOptions) {
super(cohortsCommandOptions.commonCommandOptions);
this.cohortsCommandOptions = cohortsCommandOptions;
this.aclCommandExecutor = new AclCommandExecutor<>();
this.annotationCommandExecutor = new AnnotationCommandExecutor<>();
}
@Override
public void execute() throws Exception {
logger.debug("Executing cohorts command line");
String subCommandString = getParsedSubCommand(cohortsCommandOptions.jCommander);
QueryResponse queryResponse = null;
switch (subCommandString) {
case "create":
queryResponse = create();
break;
case "info":
queryResponse = info();
break;
case "samples":
queryResponse = samples();
break;
case "update":
queryResponse = update();
break;
case "delete":
queryResponse = delete();
break;
case "stats":
queryResponse = stats();
break;
case "search":
queryResponse = search();
break;
case "group-by":
queryResponse = groupBy();
break;
case "acl":
queryResponse = aclCommandExecutor.acls(cohortsCommandOptions.aclsCommandOptions, openCGAClient.getCohortClient());
break;
case "acl-create":
queryResponse = aclCommandExecutor.aclsCreate(cohortsCommandOptions.aclsCreateCommandOptions,
openCGAClient.getCohortClient());
break;
case "acl-member-delete":
queryResponse = aclCommandExecutor.aclMemberDelete(cohortsCommandOptions.aclsMemberDeleteCommandOptions,
openCGAClient.getCohortClient());
break;
case "acl-member-info":
queryResponse = aclCommandExecutor.aclMemberInfo(cohortsCommandOptions.aclsMemberInfoCommandOptions,
openCGAClient.getCohortClient());
break;
case "acl-member-update":
queryResponse = aclCommandExecutor.aclMemberUpdate(cohortsCommandOptions.aclsMemberUpdateCommandOptions,
openCGAClient.getCohortClient());
break;
case "annotation-sets-create":
queryResponse = annotationCommandExecutor.createAnnotationSet(cohortsCommandOptions.annotationCreateCommandOptions,
openCGAClient.getCohortClient());
break;
case "annotation-sets-all-info":
queryResponse = annotationCommandExecutor.getAllAnnotationSets(cohortsCommandOptions.annotationAllInfoCommandOptions,
openCGAClient.getCohortClient());
break;
case "annotation-sets-search":
queryResponse = annotationCommandExecutor.searchAnnotationSets(cohortsCommandOptions.annotationSearchCommandOptions,
openCGAClient.getCohortClient());
break;
case "annotation-sets-delete":
queryResponse = annotationCommandExecutor.deleteAnnotationSet(cohortsCommandOptions.annotationDeleteCommandOptions,
openCGAClient.getCohortClient());
break;
case "annotation-sets-info":
queryResponse = annotationCommandExecutor.getAnnotationSet(cohortsCommandOptions.annotationInfoCommandOptions,
openCGAClient.getCohortClient());
break;
case "annotation-sets-update":
queryResponse = annotationCommandExecutor.updateAnnotationSet(cohortsCommandOptions.annotationUpdateCommandOptions,
openCGAClient.getCohortClient());
break;
default:
logger.error("Subcommand not valid");
break;
}
createOutput(queryResponse);
}
private QueryResponse search() throws IOException {
CohortCommandOptions.SearchCommandOptions commandOptions = cohortsCommandOptions.searchCommandOptions;
logger.debug("Searching cohorts");
Query query = new Query();
query.putIfNotEmpty(CohortDBAdaptor.QueryParams.STUDY.key(), resolveStudy(commandOptions.study));
query.putIfNotEmpty(CohortDBAdaptor.QueryParams.NAME.key(), commandOptions.name);
query.putIfNotNull(CohortDBAdaptor.QueryParams.TYPE.key(), commandOptions.type);
query.putIfNotNull(CohortDBAdaptor.QueryParams.STATUS.key(), commandOptions.status);
query.putIfNotEmpty(CohortDBAdaptor.QueryParams.SAMPLES.key(), commandOptions.samples);
QueryOptions queryOptions = new QueryOptions();
queryOptions.putIfNotEmpty(QueryOptions.INCLUDE, commandOptions.dataModelOptions.include);
queryOptions.putIfNotEmpty(QueryOptions.EXCLUDE, commandOptions.dataModelOptions.exclude);
queryOptions.put(QueryOptions.LIMIT, commandOptions.numericOptions.limit);
queryOptions.put(QueryOptions.SKIP, commandOptions.numericOptions.skip);
queryOptions.put("count", commandOptions.numericOptions.count);
return openCGAClient.getCohortClient().search(query,queryOptions);
}
private QueryResponse<Cohort> create() throws CatalogException, IOException {
logger.debug("Creating a new cohort");
ObjectMap params = new ObjectMap();
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.NAME.key(), cohortsCommandOptions.createCommandOptions.name);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.SAMPLES.key(), cohortsCommandOptions.createCommandOptions.sampleIds);
params.putIfNotNull(CohortDBAdaptor.QueryParams.TYPE.key(), cohortsCommandOptions.createCommandOptions.type);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.DESCRIPTION.key(), cohortsCommandOptions.createCommandOptions.description);
return openCGAClient.getCohortClient().create(resolveStudy(cohortsCommandOptions.createCommandOptions.study),
cohortsCommandOptions.createCommandOptions.variableSetId, cohortsCommandOptions.createCommandOptions.variable, params);
}
private QueryResponse<Cohort> info() throws CatalogException, IOException {
logger.debug("Getting cohort information");
ObjectMap params = new ObjectMap();
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.STUDY.key(), resolveStudy(cohortsCommandOptions.infoCommandOptions.study));
params.putIfNotEmpty(QueryOptions.INCLUDE, cohortsCommandOptions.infoCommandOptions.dataModelOptions.include);
params.putIfNotEmpty(QueryOptions.EXCLUDE, cohortsCommandOptions.infoCommandOptions.dataModelOptions.exclude);
return openCGAClient.getCohortClient().get(cohortsCommandOptions.infoCommandOptions.cohort, params);
}
private QueryResponse<Sample> samples() throws CatalogException, IOException {
logger.debug("Listing samples belonging to a cohort");
Query query = new Query();
query.putIfNotEmpty(CohortDBAdaptor.QueryParams.STUDY.key(), resolveStudy(cohortsCommandOptions.samplesCommandOptions.study));
QueryOptions queryOptions = new QueryOptions();
queryOptions.putIfNotEmpty(QueryOptions.INCLUDE, cohortsCommandOptions.samplesCommandOptions.dataModelOptions.include);
queryOptions.putIfNotEmpty(QueryOptions.EXCLUDE, cohortsCommandOptions.samplesCommandOptions.dataModelOptions.exclude);
queryOptions.put(QueryOptions.LIMIT, cohortsCommandOptions.samplesCommandOptions.numericOptions.limit);
queryOptions.put(QueryOptions.SKIP, cohortsCommandOptions.samplesCommandOptions.numericOptions.skip);
queryOptions.put("count", cohortsCommandOptions.samplesCommandOptions.numericOptions.count);
return openCGAClient.getCohortClient().getSamples(cohortsCommandOptions.samplesCommandOptions.cohort, query, queryOptions);
}
private QueryResponse<Cohort> update() throws CatalogException, IOException {
logger.debug("Updating cohort");
ObjectMap params = new ObjectMap();
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.NAME.key(), cohortsCommandOptions.updateCommandOptions.name);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.CREATION_DATE.key(), cohortsCommandOptions.updateCommandOptions.creationDate);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.DESCRIPTION.key(), cohortsCommandOptions.updateCommandOptions.description);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.SAMPLES.key(), cohortsCommandOptions.updateCommandOptions.samples);
return openCGAClient.getCohortClient().update(cohortsCommandOptions.updateCommandOptions.cohort,
resolveStudy(cohortsCommandOptions.updateCommandOptions.study), params);
}
private QueryResponse<Cohort> delete() throws CatalogException, IOException {
logger.debug("Deleting cohort");
ObjectMap params = new ObjectMap();
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.STUDY.key(), resolveStudy(cohortsCommandOptions.deleteCommandOptions.study));
return openCGAClient.getCohortClient().delete(cohortsCommandOptions.deleteCommandOptions.cohort, params);
}
private QueryResponse<Object> stats() throws CatalogException, IOException {
logger.debug("Calculating variant stats for a set of cohorts");
Query query = new Query();
query.putIfNotEmpty(CohortDBAdaptor.QueryParams.STUDY.key(), resolveStudy(cohortsCommandOptions.statsCommandOptions.study));
QueryOptions queryOptions = new QueryOptions();
queryOptions.put("calculate", cohortsCommandOptions.statsCommandOptions.calculate);
queryOptions.put("delete", cohortsCommandOptions.statsCommandOptions.delete);
queryOptions.putIfNotEmpty("log", cohortsCommandOptions.statsCommandOptions.log);
queryOptions.putIfNotEmpty(JobDBAdaptor.QueryParams.OUT_DIR_ID.key(), cohortsCommandOptions.statsCommandOptions.outdirId);
return openCGAClient.getCohortClient().getStats(cohortsCommandOptions.statsCommandOptions.cohort, query, queryOptions);
}
private QueryResponse<ObjectMap> groupBy() throws CatalogException, IOException {
logger.debug("Group by cohorts");
ObjectMap params = new ObjectMap();
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.STUDY.key(), resolveStudy(cohortsCommandOptions.groupByCommandOptions.study));
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.ID.key(), cohortsCommandOptions.groupByCommandOptions.id);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.NAME.key(), cohortsCommandOptions.groupByCommandOptions.name);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.TYPE.key(), cohortsCommandOptions.groupByCommandOptions.type);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.STATUS_NAME.key(), cohortsCommandOptions.groupByCommandOptions.status);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.CREATION_DATE.key(), cohortsCommandOptions.groupByCommandOptions.creationDate);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.SAMPLES.key(), cohortsCommandOptions.groupByCommandOptions.sampleIds);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.ATTRIBUTES.key(), cohortsCommandOptions.groupByCommandOptions.attributes);
params.putIfNotEmpty(CohortDBAdaptor.QueryParams.NATTRIBUTES.key(), cohortsCommandOptions.groupByCommandOptions.nattributes);
return openCGAClient.getCohortClient().groupBy(cohortsCommandOptions.groupByCommandOptions.study,
cohortsCommandOptions.groupByCommandOptions.fields,params);
}
}