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);
}