/*
* 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.IndividualCommandOptions;
import org.opencb.opencga.catalog.db.api.IndividualDBAdaptor;
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.IndividualAclEntry;
import java.io.IOException;
/**
* Created by agaor on 6/06/16.
*/
public class IndividualCommandExecutor extends OpencgaCommandExecutor {
private IndividualCommandOptions individualsCommandOptions;
private AclCommandExecutor<Individual, IndividualAclEntry> aclCommandExecutor;
private AnnotationCommandExecutor<Individual, IndividualAclEntry> annotationCommandExecutor;
public IndividualCommandExecutor(IndividualCommandOptions individualsCommandOptions) {
super(individualsCommandOptions.commonCommandOptions);
this.individualsCommandOptions = individualsCommandOptions;
this.aclCommandExecutor = new AclCommandExecutor<>();
this.annotationCommandExecutor = new AnnotationCommandExecutor<>();
}
@Override
public void execute() throws Exception {
logger.debug("Executing individuals command line");
String subCommandString = getParsedSubCommand(individualsCommandOptions.jCommander);
QueryResponse queryResponse = null;
switch (subCommandString) {
case "create":
queryResponse = create();
break;
case "info":
queryResponse = info();
break;
case "search":
queryResponse = search();
break;
case "update":
queryResponse = update();
break;
case "delete":
queryResponse = delete();
break;
case "group-by":
queryResponse = groupBy();
break;
case "samples":
queryResponse = getSamples();
break;
case "acl":
queryResponse = aclCommandExecutor.acls(individualsCommandOptions.aclsCommandOptions, openCGAClient.getIndividualClient());
break;
case "acl-create":
queryResponse = aclCommandExecutor.aclsCreate(individualsCommandOptions.aclsCreateCommandOptions,
openCGAClient.getIndividualClient());
break;
case "acl-member-delete":
queryResponse = aclCommandExecutor.aclMemberDelete(individualsCommandOptions.aclsMemberDeleteCommandOptions,
openCGAClient.getIndividualClient());
break;
case "acl-member-info":
queryResponse = aclCommandExecutor.aclMemberInfo(individualsCommandOptions.aclsMemberInfoCommandOptions,
openCGAClient.getIndividualClient());
break;
case "acl-member-update":
queryResponse = aclCommandExecutor.aclMemberUpdate(individualsCommandOptions.aclsMemberUpdateCommandOptions,
openCGAClient.getIndividualClient());
break;
case "annotation-sets-create":
queryResponse = annotationCommandExecutor.createAnnotationSet(individualsCommandOptions.annotationCreateCommandOptions,
openCGAClient.getIndividualClient());
break;
case "annotation-sets-all-info":
queryResponse = annotationCommandExecutor.getAllAnnotationSets(individualsCommandOptions.annotationAllInfoCommandOptions,
openCGAClient.getIndividualClient());
break;
case "annotation-sets-search":
queryResponse = annotationCommandExecutor.searchAnnotationSets(individualsCommandOptions.annotationSearchCommandOptions,
openCGAClient.getIndividualClient());
break;
case "annotation-sets-delete":
queryResponse = annotationCommandExecutor.deleteAnnotationSet(individualsCommandOptions.annotationDeleteCommandOptions,
openCGAClient.getIndividualClient());
break;
case "annotation-sets-info":
queryResponse = annotationCommandExecutor.getAnnotationSet(individualsCommandOptions.annotationInfoCommandOptions,
openCGAClient.getIndividualClient());
break;
case "annotation-sets-update":
queryResponse = annotationCommandExecutor.updateAnnotationSet(individualsCommandOptions.annotationUpdateCommandOptions,
openCGAClient.getIndividualClient());
break;
default:
logger.error("Subcommand not valid");
break;
}
createOutput(queryResponse);
}
private QueryResponse<Individual> create() throws CatalogException, IOException {
logger.debug("Creating individual");
ObjectMap params = new ObjectMap();
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.NAME.key(), individualsCommandOptions.createCommandOptions.name);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.FAMILY.key(), individualsCommandOptions.createCommandOptions.family);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.FATHER_ID.key(), individualsCommandOptions.createCommandOptions.fatherId);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.MOTHER_ID.key(), individualsCommandOptions.createCommandOptions.motherId);
String sex = individualsCommandOptions.createCommandOptions.sex;
if (individualsCommandOptions.createCommandOptions.sex != null) {
try {
params.put(IndividualDBAdaptor.QueryParams.SEX.key(), Individual.Sex.valueOf(sex));
} catch (IllegalArgumentException e) {
logger.error("{} not recognized as a proper individual sex", sex);
return null;
}
}
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.ETHNICITY.key(), individualsCommandOptions.createCommandOptions.ethnicity);
IndividualCommandOptions.CreateCommandOptions commandOptions = individualsCommandOptions.createCommandOptions;
Individual.Species species = new Individual.Species();
if (commandOptions.speciesCommonName != null) {
species.setCommonName(commandOptions.speciesCommonName);
}
if (commandOptions.speciesScientificName != null) {
species.setScientificName(commandOptions.speciesScientificName);
}
if (commandOptions.speciesTaxonomyCode != null) {
species.setTaxonomyCode(commandOptions.speciesTaxonomyCode);
}
params.put(IndividualDBAdaptor.QueryParams.SPECIES.key(), species);
Individual.Population population = new Individual.Population();
if (commandOptions.populationName != null) {
population.setName(commandOptions.populationName);
}
if (commandOptions.populationSubpopulation != null) {
population.setSubpopulation(commandOptions.populationSubpopulation);
}
if (commandOptions.populationDescription != null) {
population.setDescription(commandOptions.populationDescription);
}
params.put("population", population);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.KARYOTYPIC_SEX.key(), commandOptions.karyotypicSex);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.LIFE_STATUS.key(), commandOptions.lifeStatus);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.AFFECTATION_STATUS.key(), commandOptions.affectationStatus);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.DATE_OF_BIRTH.key(), commandOptions.dateOfBirth);
return openCGAClient.getIndividualClient().create(resolveStudy(commandOptions.study), params);
}
private QueryResponse<Individual> info() throws CatalogException, IOException {
logger.debug("Getting individual information");
ObjectMap params = new ObjectMap();
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.STUDY.key(), resolveStudy(individualsCommandOptions.infoCommandOptions.study));
params.putIfNotNull(QueryOptions.INCLUDE, individualsCommandOptions.infoCommandOptions.dataModelOptions.include);
params.putIfNotNull(QueryOptions.EXCLUDE, individualsCommandOptions.infoCommandOptions.dataModelOptions.exclude);
return openCGAClient.getIndividualClient().get(individualsCommandOptions.infoCommandOptions.individual, params);
}
private QueryResponse<Individual> search() throws CatalogException, IOException {
logger.debug("Searching individuals");
Query query = new Query();
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.STUDY.key(), resolveStudy(individualsCommandOptions.searchCommandOptions.study));
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.NAME.key(), individualsCommandOptions.searchCommandOptions.name);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.FATHER_ID.key(), individualsCommandOptions.searchCommandOptions.fatherId);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.MOTHER_ID.key(), individualsCommandOptions.searchCommandOptions.motherId);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.FAMILY.key(), individualsCommandOptions.searchCommandOptions.family);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SEX.key(), individualsCommandOptions.searchCommandOptions.sex);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.ETHNICITY.key(), individualsCommandOptions.searchCommandOptions.ethnicity);
// TODO: Remove these 2 deprecated parameters in future release
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SPECIES_COMMON_NAME.key(),
individualsCommandOptions.searchCommandOptions.species);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.POPULATION_NAME.key(),
individualsCommandOptions.searchCommandOptions.population);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SPECIES_COMMON_NAME.key(),
individualsCommandOptions.searchCommandOptions.speciesCommonName);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SPECIES_TAXONOMY_CODE.key(),
individualsCommandOptions.searchCommandOptions.speciesTaxonomyCode);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SPECIES_SCIENTIFIC_NAME.key(),
individualsCommandOptions.searchCommandOptions.speciesScientificName);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.POPULATION_NAME.key(),
individualsCommandOptions.searchCommandOptions.populationName);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.POPULATION_SUBPOPULATION.key(),
individualsCommandOptions.searchCommandOptions.populationSubpopulation);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.POPULATION_DESCRIPTION.key(),
individualsCommandOptions.searchCommandOptions.populationDescription);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.KARYOTYPIC_SEX.key(),
individualsCommandOptions.searchCommandOptions.karyotypicSex);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.LIFE_STATUS.key(), individualsCommandOptions.searchCommandOptions.lifeStatus);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.AFFECTATION_STATUS.key(),
individualsCommandOptions.searchCommandOptions.affectationStatus);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.VARIABLE_SET_ID.key(),
individualsCommandOptions.searchCommandOptions.variableSetId);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.ANNOTATION.key(),
individualsCommandOptions.searchCommandOptions.annotation);
query.putIfNotEmpty(IndividualDBAdaptor.QueryParams.ANNOTATION_SET_NAME.key(),
individualsCommandOptions.searchCommandOptions.annotationSetName);
QueryOptions queryOptions = new QueryOptions();
queryOptions.putIfNotEmpty(QueryOptions.INCLUDE, individualsCommandOptions.searchCommandOptions.dataModelOptions.include);
queryOptions.putIfNotEmpty(QueryOptions.EXCLUDE, individualsCommandOptions.searchCommandOptions.dataModelOptions.exclude);
queryOptions.put(QueryOptions.SKIP, individualsCommandOptions.searchCommandOptions.numericOptions.skip);
queryOptions.put(QueryOptions.LIMIT, individualsCommandOptions.searchCommandOptions.numericOptions.limit);
queryOptions.put("count", individualsCommandOptions.searchCommandOptions.numericOptions.count);
return openCGAClient.getIndividualClient().search(query, queryOptions);
}
private QueryResponse<Individual> update() throws CatalogException, IOException {
logger.debug("Updating individual information");
ObjectMap params = new ObjectMap();
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.NAME.key(), individualsCommandOptions.updateCommandOptions.name);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.FAMILY.key(), individualsCommandOptions.updateCommandOptions.family);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.FATHER_ID.key(), individualsCommandOptions.updateCommandOptions.fatherId);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.MOTHER_ID.key(), individualsCommandOptions.updateCommandOptions.motherId);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.DATE_OF_BIRTH.key(),
individualsCommandOptions.updateCommandOptions.dateOfBirth);
String sex = individualsCommandOptions.updateCommandOptions.sex;
if (individualsCommandOptions.updateCommandOptions.sex != null) {
try {
params.put(IndividualDBAdaptor.QueryParams.SEX.key(), Individual.Sex.valueOf(sex));
} catch (IllegalArgumentException e) {
logger.error("{} not recognized as a proper individual sex", sex);
return null;
}
}
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.ETHNICITY.key(), individualsCommandOptions.updateCommandOptions.ethnicity);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SPECIES_TAXONOMY_CODE.key(),
individualsCommandOptions.updateCommandOptions.speciesTaxonomyCode);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SPECIES_COMMON_NAME.key(),
individualsCommandOptions.updateCommandOptions.speciesCommonName);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SPECIES_SCIENTIFIC_NAME.key(),
individualsCommandOptions.updateCommandOptions.speciesScientificName);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.POPULATION_NAME.key(),
individualsCommandOptions.updateCommandOptions.populationName);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.POPULATION_DESCRIPTION.key(),
individualsCommandOptions.updateCommandOptions.populationDescription);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.POPULATION_SUBPOPULATION.key(),
individualsCommandOptions.updateCommandOptions.populationSubpopulation);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.KARYOTYPIC_SEX.key(),
individualsCommandOptions.updateCommandOptions.karyotypicSex);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.LIFE_STATUS.key(),
individualsCommandOptions.updateCommandOptions.lifeStatus);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.AFFECTATION_STATUS.key(),
individualsCommandOptions.updateCommandOptions.affectationStatus);
return openCGAClient.getIndividualClient().update(individualsCommandOptions.updateCommandOptions.individual,
resolveStudy(individualsCommandOptions.updateCommandOptions.study), params);
}
private QueryResponse<Individual> delete() throws CatalogException, IOException {
logger.debug("Deleting individual information");
ObjectMap params = new ObjectMap();
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.STUDY.key(), resolveStudy(individualsCommandOptions.deleteCommandOptions.study));
return openCGAClient.getIndividualClient().delete(individualsCommandOptions.deleteCommandOptions.individual, params);
}
private QueryResponse<ObjectMap> groupBy() throws CatalogException, IOException {
logger.debug("Group by individuals");
ObjectMap params = new ObjectMap();
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.STUDY.key(), resolveStudy(individualsCommandOptions.groupByCommandOptions.study));
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.ID.key(), individualsCommandOptions.groupByCommandOptions.id);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.NAME.key(), individualsCommandOptions.groupByCommandOptions.name);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.FATHER_ID.key(), individualsCommandOptions.groupByCommandOptions.fatherId);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.MOTHER_ID.key(), individualsCommandOptions.groupByCommandOptions.motherId);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.FAMILY.key(), individualsCommandOptions.groupByCommandOptions.family);
params.put(IndividualDBAdaptor.QueryParams.SEX.key(), individualsCommandOptions.groupByCommandOptions.sex);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.ETHNICITY.key(), individualsCommandOptions.groupByCommandOptions.ethnicity);
// TODO: Remove these 2 deprecated parameters in future release
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SPECIES_COMMON_NAME.key(),
individualsCommandOptions.groupByCommandOptions.species);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.POPULATION_NAME.key(),
individualsCommandOptions.groupByCommandOptions.population);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SPECIES_TAXONOMY_CODE.key(),
individualsCommandOptions.groupByCommandOptions.speciesTaxonomyCode);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SPECIES_COMMON_NAME.key(),
individualsCommandOptions.groupByCommandOptions.speciesCommonName);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.SPECIES_SCIENTIFIC_NAME.key(),
individualsCommandOptions.groupByCommandOptions.speciesScientificName);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.POPULATION_NAME.key(),
individualsCommandOptions.groupByCommandOptions.populationName);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.POPULATION_DESCRIPTION.key(),
individualsCommandOptions.groupByCommandOptions.populationDescription);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.POPULATION_SUBPOPULATION.key(),
individualsCommandOptions.groupByCommandOptions.populationSubpopulation);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.KARYOTYPIC_SEX.key(),
individualsCommandOptions.groupByCommandOptions.karyotypicSex);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.LIFE_STATUS.key(),
individualsCommandOptions.groupByCommandOptions.lifeStatus);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.AFFECTATION_STATUS.key(),
individualsCommandOptions.groupByCommandOptions.affectationStatus);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.VARIABLE_SET_ID.key(),
individualsCommandOptions.groupByCommandOptions.variableSetId);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.ANNOTATION.key(),
individualsCommandOptions.groupByCommandOptions.annotation);
params.putIfNotEmpty(IndividualDBAdaptor.QueryParams.ANNOTATION_SET_NAME.key(),
individualsCommandOptions.groupByCommandOptions.annotationSetName);
return openCGAClient.getIndividualClient().groupBy(
individualsCommandOptions.groupByCommandOptions.study, individualsCommandOptions.groupByCommandOptions.fields, params);
}
private QueryResponse<Sample> getSamples() throws CatalogException, IOException {
logger.debug("Getting samples of individual(s)");
Query query = new Query();
query.putIfNotEmpty(SampleDBAdaptor.QueryParams.STUDY.key(), resolveStudy(individualsCommandOptions.sampleCommandOptions.study));
query.putIfNotEmpty(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), individualsCommandOptions.sampleCommandOptions.individual);
QueryOptions options = new QueryOptions();
options.putIfNotNull(QueryOptions.INCLUDE, individualsCommandOptions.sampleCommandOptions.dataModelOptions.include);
options.putIfNotNull(QueryOptions.EXCLUDE, individualsCommandOptions.sampleCommandOptions.dataModelOptions.exclude);
return openCGAClient.getSampleClient().search(query, options);
}
}