diff --git a/cellbase-core/pom.xml b/cellbase-core/pom.xml index d5216b9dbf..b6a5e584bb 100644 --- a/cellbase-core/pom.xml +++ b/cellbase-core/pom.xml @@ -23,7 +23,11 @@ org.opencb.biodata biodata-tools - + + commons-beanutils + commons-beanutils + 1.9.4 + org.glassfish.jersey.core jersey-client diff --git a/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/AbstractQuery.java b/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/AbstractQuery.java index ccb5223da1..a5878afcf0 100644 --- a/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/AbstractQuery.java +++ b/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/AbstractQuery.java @@ -16,22 +16,18 @@ package org.opencb.cellbase.core.api.queries; +import org.apache.commons.beanutils.BeanUtils; import org.slf4j.Logger; -import java.util.ArrayList; +import javax.ws.rs.core.MultivaluedMap; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.List; +import java.util.Map; -public class AbstractQuery { +public class AbstractQuery extends QueryOptions { - protected List includes; - protected List excludes; - protected Integer skip; - protected Integer limit; - protected String sort; - protected String facet; - protected String timeout; - protected Boolean count; protected Logger logger; final static int DEFAULT_LIMIT = 10; @@ -40,133 +36,27 @@ public class AbstractQuery { public AbstractQuery() { } -// public T of(Map map) throws JsonProcessingException { -// ObjectMapper objectMapper= new ObjectMapper(); -// String value = objectMapper.writeValueAsString(map); -// return objectMapper.readValue(value, (Class) T); -// } - -// public QueryOptions addQueryOption(String key, Object value) { -// if (queryOptions == null) { -// queryOptions = new QueryOptions(); -// } -// queryOptions.put(key, value); -// return queryOptions; -// } -// -// public QueryOptions getQueryOptions() { -// return queryOptions; -// } -// -// public AbstractQuery setQueryOptions(QueryOptions queryOptions) { -// this.queryOptions = queryOptions; -// return this; -// } - - public List getIncludes() { - return includes; - } - - public AbstractQuery setIncludes(List includes) { - this.includes = includes; - return this; - } - - public List getExcludes() { - return excludes; - } - - public AbstractQuery setExcludes(List excludes) { - this.excludes = excludes; - return this; - } - - public AbstractQuery addExcludes(String excludes) { - if (this.excludes == null) { - this.excludes = new ArrayList<>(); + public static Object of(MultivaluedMap map, Class clazz) + throws NoSuchFieldException, IllegalAccessException, InstantiationException, InvocationTargetException { + Object query = clazz.newInstance(); + for (Map.Entry> entry : map.entrySet()) { + String fieldName = entry.getKey(); + List values = entry.getValue(); + Field field = clazz.getField(fieldName); + if (field.getType().equals("Boolean")) { + Boolean bool = Boolean.parseBoolean(values.get(0)); + BeanUtils.setProperty(query, fieldName, bool); + } else if (field.getType().equals("Integer")) { + Integer intValue = Integer.parseInt(values.get(0)); + BeanUtils.setProperty(query, fieldName, intValue); + } else if (field.getType().equals("List")) { + List valuesArray = Arrays.asList(values.get(0).split(",")); + BeanUtils.setProperty(query, fieldName, valuesArray); + } else { + BeanUtils.setProperty(query, fieldName, values.get(0)); + } } - this.excludes.addAll(Arrays.asList(excludes.split(","))); - return this; - } - - public Integer getSkip() { - return skip; - } - - public AbstractQuery setSkip(Integer skip) { - this.skip = skip; - return this; - } - - public AbstractQuery addSkipIfAbsent() { - if (skip == null) { - skip = DEFAULT_SKIP; - } - return this; - } - - public Integer getLimit() { - return limit; - } - - public AbstractQuery setLimit(Integer limit) { - this.limit = limit; - return this; + return query; } - public AbstractQuery addLimitIfAbsent() { - if (limit == null) { - limit = DEFAULT_LIMIT; - } - return this; - } - - public String getSort() { - return sort; - } - - public AbstractQuery setSort(String sort) { - this.sort = sort; - return this; - } - - public String getFacet() { - return facet; - } - - public AbstractQuery setFacet(String facet) { - this.facet = facet; - return this; - } - - public String getTimeout() { - return timeout; - } - - public AbstractQuery setTimeout(String timeout) { - this.timeout = timeout; - return this; - } - - public Boolean getCount() { - return count; - } - - public AbstractQuery setCount(Boolean count) { - this.count = count; - return this; - } - - @Override - public String toString() { - return "AbstractQuery{" + - "includes=" + includes + - ", excludes=" + excludes + - ", skip=" + skip + - ", limit=" + limit + - ", sort='" + sort + '\'' + - ", facet='" + facet + '\'' + - ", timeout='" + timeout + '\'' + - '}'; - } } diff --git a/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/GeneQuery.java b/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/GeneQuery.java index 13aaa7e5ef..c928a1debc 100644 --- a/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/GeneQuery.java +++ b/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/GeneQuery.java @@ -16,13 +16,10 @@ package org.opencb.cellbase.core.api.queries; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.opencb.biodata.models.core.Region; import java.util.Arrays; import java.util.List; -import java.util.Map; public class GeneQuery extends FeatureQuery { @@ -45,16 +42,8 @@ public class GeneQuery extends FeatureQuery { private List annotationDrugsGene; public GeneQuery() { - - } - - - public GeneQuery(Builder builder) { - } - - // public GeneQuery(MultivaluedMap multivaluedMap) throws CellbaseException { // for (Map.Entry> entry : multivaluedMap.entrySet()) { // @@ -125,11 +114,11 @@ public GeneQuery(Builder builder) { // } // } - public static GeneQuery of(Map map) throws JsonProcessingException { - ObjectMapper objectMapper= new ObjectMapper(); - String value = objectMapper.writeValueAsString(map); - return objectMapper.readValue(value, GeneQuery.class); - } +// public static GeneQuery of(Map map) throws JsonProcessingException { +// ObjectMapper objectMapper= new ObjectMapper(); +// String value = objectMapper.writeValueAsString(map); +// return objectMapper.readValue(value, GeneQuery.class); +// } public List getIds() { return ids; diff --git a/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/ProjectionQueryOptions.java b/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/ProjectionQueryOptions.java new file mode 100644 index 0000000000..a435cc9421 --- /dev/null +++ b/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/ProjectionQueryOptions.java @@ -0,0 +1,64 @@ +/* + * Copyright 2015-2020 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.cellbase.core.api.queries; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ProjectionQueryOptions { + + List excludes; + List includes; + + public ProjectionQueryOptions() { + } + + public List getExcludes() { + return excludes; + } + + public ProjectionQueryOptions setExcludes(List excludes) { + this.excludes = excludes; + return this; + } + + public ProjectionQueryOptions addExcludes(String excludes) { + if (this.excludes == null) { + this.excludes = new ArrayList<>(); + } + this.excludes.addAll(Arrays.asList(excludes.split(","))); + return this; + } + + public List getIncludes() { + return includes; + } + + public ProjectionQueryOptions setIncludes(List includes) { + this.includes = includes; + return this; + } + + @Override + public String toString() { + return "ProjectionQueryOptions{" + + "excludes=" + excludes + + ", includes=" + includes + + '}'; + } +} diff --git a/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/QueryOptions.java b/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/QueryOptions.java new file mode 100644 index 0000000000..519e03f2a5 --- /dev/null +++ b/cellbase-core/src/main/java/org/opencb/cellbase/core/api/queries/QueryOptions.java @@ -0,0 +1,90 @@ +/* + * Copyright 2015-2020 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.cellbase.core.api.queries; + +public class QueryOptions extends ProjectionQueryOptions { + + protected Integer skip; + protected Integer limit; + protected String sort; + protected Boolean count; + protected Order order; + + enum Order { + ASCENDING, + DESCENDING + } + + public QueryOptions() { + } + + public Integer getSkip() { + return skip; + } + + public QueryOptions setSkip(Integer skip) { + this.skip = skip; + return this; + } + + public Integer getLimit() { + return limit; + } + + public QueryOptions setLimit(Integer limit) { + this.limit = limit; + return this; + } + + public String getSort() { + return sort; + } + + public QueryOptions setSort(String sort) { + this.sort = sort; + return this; + } + + public Boolean getCount() { + return count; + } + + public QueryOptions setCount(Boolean count) { + this.count = count; + return this; + } + + public Order getOrder() { + return order; + } + + public QueryOptions setOrder(Order order) { + this.order = order; + return this; + } + + @Override + public String toString() { + return "QueryOptions{" + + "skip=" + skip + + ", limit=" + limit + + ", sort='" + sort + '\'' + + ", count=" + count + + ", order=" + order + + '}'; + } +} diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/GeneManager.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/GeneManager.java index 1b20363758..3d4ae8ead4 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/GeneManager.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/managers/GeneManager.java @@ -70,7 +70,7 @@ private List createXrefQueries(GeneQuery geneQuery, String xrefs) { List queries = new ArrayList<>(ids.length); for (String id : ids) { // TODO need to clone query properly - GeneQuery geneXrefQuery = new GeneQuery(geneQuery); + GeneQuery geneXrefQuery = new GeneQuery(); geneXrefQuery.setTranscriptsXrefs(id); queries.add(geneXrefQuery); } @@ -97,7 +97,7 @@ public List getTfbs(GeneQuery geneQuery, String genes) { List geneQueryResults = new ArrayList<>(geneArray.length); for (String gene : geneArray) { geneQuery.setTranscriptsXrefs(gene); - CellBaseDataResult geneQueryResult = getTfbs(geneQuery, gene); + CellBaseDataResult geneQueryResult = geneDBAdaptor.getTfbs(geneQuery, gene); geneQueryResult.setId(gene); geneQueryResults.add(geneQueryResult); } @@ -108,7 +108,7 @@ public List getByTranscript(GeneQuery geneQuery, String tran List queries = createQueries(geneQuery, transcriptId, GeneDBAdaptor.QueryParams.TRANSCRIPT_ID.key()); List geneQueryResults = geneDBAdaptor.nativeGet(queries); for (int i = 0; i < queries.size(); i++) { - geneQueryResults.get(i).setId((String) queries.get(i).get(GeneDBAdaptor.QueryParams.TRANSCRIPT_ID.key())); + geneQueryResults.get(i).setId(queries.get(i).getTranscriptsId().get(0))); } return geneQueryResults; } @@ -118,14 +118,14 @@ public List getByRegion(GeneQuery geneQuery, String region) List queries = createQueries(geneQuery, region, GeneDBAdaptor.QueryParams.REGION.key()); List geneQueryResults = geneDBAdaptor.getIntervalFrequencies(queries, geneQuery.getInterval()); for (int i = 0; i < queries.size(); i++) { - geneQueryResults.get(i).setId((String) geneQuery.get(GeneDBAdaptor.QueryParams.REGION.key())); + geneQueryResults.get(i).setId(geneQuery.getRegions().get(0).toString()); } return geneQueryResults; } else { List queries = createQueries(geneQuery, region, GeneDBAdaptor.QueryParams.REGION.key()); List geneQueryResults = geneDBAdaptor.nativeGet(queries); for (int i = 0; i < queries.size(); i++) { - geneQueryResults.get(i).setId((String) queries.get(i).get(GeneDBAdaptor.QueryParams.REGION.key())); + geneQueryResults.get(i).setId(queries.get(i).getRegions().get(0).toString()); } return geneQueryResults; } @@ -135,7 +135,7 @@ public List getByTf(GeneQuery geneQuery, String tf) { List queries = createQueries(geneQuery, tf, GeneDBAdaptor.QueryParams.NAME.key()); List geneQueryResults = geneDBAdaptor.nativeGet(queries); for (int i = 0; i < queries.size(); i++) { - geneQueryResults.get(i).setId((String) queries.get(i).get(GeneDBAdaptor.QueryParams.NAME.key())); + geneQueryResults.get(i).setId(queries.get(i).getNames().get(0)); } return geneQueryResults; } @@ -152,8 +152,4 @@ public List getGeneByEnsemblId(String id) { } return geneQueryResults; } - - - - } diff --git a/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/feature/GeneWSServer.java b/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/feature/GeneWSServer.java index f4382fa99e..5e026e4e7c 100755 --- a/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/feature/GeneWSServer.java +++ b/cellbase-server/src/main/java/org/opencb/cellbase/server/rest/feature/GeneWSServer.java @@ -45,6 +45,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Map; @@ -307,11 +308,12 @@ public Response getAggregationStats(@DefaultValue("") @QueryParam("fields") @ApiImplicitParam(name = "skip", value = ParamConstants.SKIP_DESCRIPTION, required = false, defaultValue = "0", dataType = "java.util.List", paramType = "query") }) - public Response getAll() throws CellbaseException, JsonProcessingException { + public Response getAll() throws CellbaseException, InvocationTargetException, InstantiationException, IllegalAccessException, + NoSuchFieldException { // GeneQuery geneQuery = new GeneQuery(uriInfo.getQueryParameters()); // gene/search?limit=1 & biotype=bt1,bt2,bt3 ... - ObjectMap params = parseQueryParams(); - GeneQuery geneQuery = GeneQuery.of(params); +// ObjectMap params = parseQueryParams(); + GeneQuery geneQuery = (GeneQuery) GeneQuery.of(uriInfo.getQueryParameters(), GeneQuery.class); CellBaseDataResult queryResults = geneManager.search(geneQuery); return createOkResponse(queryResults); }