Added statistics tests and handled errors from a KoralQuery processor.
Change-Id: I859655d13c40d75550406b43c56420b571d8488c
diff --git a/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java b/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
index b30a915..e611f4e 100644
--- a/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
+++ b/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
@@ -31,6 +31,7 @@
*/
public static final int NO_QUERY = 301;
+ public static final int SERIALIZATION_FAILED = 302;
/**
@@ -40,7 +41,7 @@
// fixme: use unsupported resource and include type in return message
public static final int POLICY_ERROR_DEFAULT = 400;
public static final int UNSUPPORTED_RESOURCE = 402;
- public static final int FAILED_REWRITE = 403;
+ public static final int REWRITE_FAILED = 403;
//public static final int UNSUPPORTED_FOUNDRY = 403;
//public static final int UNSUPPORTED_CORPUS = 404;
//public static final int UNSUPPORTED_LAYER = 405;
diff --git a/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java b/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
index 811c227..d2671be 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
@@ -1,19 +1,22 @@
package de.ids_mannheim.korap.utils;
+import java.util.List;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
-import de.ids_mannheim.korap.query.serialize.CollectionQueryProcessor;
-import edu.emory.mathcs.backport.java.util.Arrays;
-import java.io.IOError;
-import java.util.Map;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
+import de.ids_mannheim.korap.query.serialize.CollectionQueryProcessor;
+import de.ids_mannheim.korap.response.Notifications;
+import de.ids_mannheim.korap.web.utils.KustvaktResponseHandler;
+import edu.emory.mathcs.backport.java.util.Arrays;
/**
* convenience builder class for collection query
*
- * @author hanl
- * @date 16/09/2014
+ * @author hanl, margaretha
+ * @date 29/06/2017
*/
public class KoralCollectionQueryBuilder {
@@ -98,7 +101,7 @@
}
- public Object rebaseCollection () {
+ public Object rebaseCollection (){
if (this.builder.length() == 0 && this.base == null)
return null;
@@ -107,6 +110,21 @@
CollectionQueryProcessor tree = new CollectionQueryProcessor(
this.verbose);
tree.process(this.builder.toString());
+ if (tree.getErrors().size() > 0){
+ Notifications notif = new Notifications();
+ int code;
+ for (List<Object> e : tree.getErrors()){
+ code = (int) e.get(0);
+ if (e.get(1) instanceof String){
+ notif.addError(code, (String) e.get(1));
+ }
+ else{
+ notif.addError(code, (String[]) e.get(1));
+ }
+ }
+
+ throw KustvaktResponseHandler.throwit(StatusCodes.SERIALIZATION_FAILED,notif.toJsonString());
+ }
request = JsonUtils.valueToTree(tree.getRequestMap());
}
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java b/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
index 9b559fb..8d35f95 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
@@ -753,24 +753,34 @@
}
}
-
- @POST
- @Path("stats")
- public Response getStats (@Context SecurityContext context,
- @Context Locale locale, String json) {
+ // EM: changed method POST to GET
+ @GET
+ @Path("statistics")
+ public Response getStatistics (@Context SecurityContext context,
+ @Context Locale locale, @QueryParam("collectionQuery")
+ String collectionQuery) {
+
+ if (collectionQuery == null || collectionQuery.isEmpty()){
+ throw KustvaktResponseHandler.throwit(new KustvaktException(
+ StatusCodes.MISSING_ARGUMENT, "Parameter collectionQuery is missing.",
+ "collectionQuery"));
+ }
+
+
KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
- builder.with(json);
- String stats = searchKrill.getStatistics(builder.toJSON());
-
+ builder.with(collectionQuery);
+ String json = builder.toJSON();
+
+ String stats = searchKrill.getStatistics(json);
if (stats.contains("-1"))
throw KustvaktResponseHandler.throwit(StatusCodes.NO_VALUE_FOUND);
-
+ jlog.debug("Stats: "+stats);
return Response.ok(stats).build();
}
-
+ // EM: what is child?
@GET
- @Path("{type}/{id}/{child}/stats")
+ @Path("{type}/{id}/{child}/statistics")
public Response getStatisticsbyIdChild (@Context SecurityContext context,
@Context Locale locale, @PathParam("type") String type,
@PathParam("id") String id, @PathParam("child") String child) {
@@ -983,32 +993,32 @@
KoralCollectionQueryBuilder cquery = new KoralCollectionQueryBuilder();
cquery.setBaseQuery(base);
- cachetmp = ResourceFactory.getCachedCollection(cquery.toJSON());
+ try {
+ cachetmp = ResourceFactory.getCachedCollection(cquery.toJSON());
- // see if collection was cached!
- VirtualCollection tmp = resourceHandler.getCache(cachetmp.getId(),
- VirtualCollection.class);
- // if not cached, fill with stats values
- if (tmp == null) {
- String stats = searchKrill.getStatistics(cquery.toJSON());
- cachetmp.setStats(JsonUtils.readSimple(stats, Map.class));
- }
-
- if (!cache) {
- collection = ResourceFactory.getPermanentCollection(cachetmp,
- name, description);
- vals = collection.toMap();
- try {
- resourceHandler.storeResources(user, collection);
+ // see if collection was cached!
+ VirtualCollection tmp = resourceHandler.getCache(cachetmp.getId(),
+ VirtualCollection.class);
+ // if not cached, fill with stats values
+ if (tmp == null) {
+ String stats = searchKrill.getStatistics(cquery.toJSON());
+ cachetmp.setStats(JsonUtils.readSimple(stats, Map.class));
}
- catch (KustvaktException e) {
- jlog.error("Exception encountered: {}", e.string());
- throw KustvaktResponseHandler.throwit(e);
+
+ if (!cache) {
+ collection = ResourceFactory.getPermanentCollection(cachetmp,
+ name, description);
+ vals = collection.toMap();
+ resourceHandler.storeResources(user, collection);
}
+ else {
+ resourceHandler.cache(cachetmp);
+ vals = cachetmp.toMap();
+ }
+
}
- else {
- resourceHandler.cache(cachetmp);
- vals = cachetmp.toMap();
+ catch (KustvaktException e) {
+ throw KustvaktResponseHandler.throwit(e);
}
}
return Response.ok(JsonUtils.toJSON(vals)).build();
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java b/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
index c9785f4..a422904 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
@@ -20,12 +20,15 @@
import org.slf4j.LoggerFactory;
import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriBuilder;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
import java.util.Set;
/**
@@ -274,22 +277,39 @@
}
- //todo: switch to new serialization
- @POST
- @Path("stats")
- public Response getStats (String json) {
+// //todo: switch to new serialization
+// @POST
+// @Path("stats")
+// public Response getStats (String json) {
+// KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
+// builder.with(json);
+//
+// // todo: policy override in extension!
+// String stats = searchKrill.getStatistics(builder.toJSON());
+// if (stats.contains("-1"))
+// throw KustvaktResponseHandler.throwit(StatusCodes.NO_VALUE_FOUND);
+//
+// return Response.ok(stats).build();
+// }
+
+ @GET
+ @Path("statistics")
+ public Response getStatistics (@QueryParam("collectionQuery")
+ String collectionQuery) {
+
KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
- builder.with(json);
-
- // todo: policy override in extension!
- String stats = searchKrill.getStatistics(builder.toJSON());
+ builder.with(collectionQuery);
+ String json = builder.toJSON();
+
+ String stats = searchKrill.getStatistics(json);
if (stats.contains("-1"))
throw KustvaktResponseHandler.throwit(StatusCodes.NO_VALUE_FOUND);
-
+ jlog.debug("Stats: "+stats);
return Response.ok(stats).build();
}
+
/*
* TODO: The problem here is, that the matchinfo path makes no
* distinction between docs and texts - unlike DeReKo, the backend
diff --git a/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktResponseHandler.java b/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktResponseHandler.java
index 086336b..44fb085 100644
--- a/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktResponseHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktResponseHandler.java
@@ -40,7 +40,6 @@
return new WebApplicationException(s);
}
-
public static WebApplicationException throwit (int code) {
return new WebApplicationException(Response.status(getStatus(code))
.entity(buildNotification(code, "", "")).build());
@@ -53,7 +52,11 @@
.entity(buildNotification(code, message, entity)).build());
}
-
+ public static WebApplicationException throwit (int code, String notification) {
+ return new WebApplicationException(Response.status(getStatus(code))
+ .entity(notification).build());
+ }
+
private static String buildNotification (KustvaktException e) {
register(e.getRecords());
return buildNotification(e.getStatusCode(), e.getMessage(),