Introduced query reference rewrite mechanism
Change-Id: If05c5d6b4a1071d72bc7e7293d6130393a00ca87
diff --git a/full/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java b/full/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java
new file mode 100644
index 0000000..aab0b77
--- /dev/null
+++ b/full/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java
@@ -0,0 +1,110 @@
+package de.ids_mannheim.korap.rewrite;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import de.ids_mannheim.korap.config.KustvaktConfiguration;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.rewrite.KoralNode.RewriteIdentifier;
+import de.ids_mannheim.korap.service.QueryReferenceService;
+import de.ids_mannheim.korap.user.User;
+import de.ids_mannheim.korap.util.StatusCodes;
+import de.ids_mannheim.korap.utils.JsonUtils;
+
+/**
+ * Rewrites query reference with the corresponding koral
+ * query describing the actual query fragment.
+ *
+ * Based on VirtualCorpusRewrite.
+ *
+ * @author diewald, margaretha
+ *
+ */
+@Component
+public class QueryReferenceRewrite implements RewriteTask.RewriteQuery {
+
+ @Autowired
+ private KustvaktConfiguration config;
+
+ @Autowired
+ private QueryReferenceService refService;
+
+ @Override
+ public KoralNode rewriteQuery (KoralNode node,
+ KustvaktConfiguration config,
+ User user) throws KustvaktException {
+ if (node.has("query")) {
+ node = node.at("/query");
+ findQueryRef(user.getUsername(), node);
+ }
+ return node;
+ }
+
+ private void findQueryRef (String username, KoralNode koralNode)
+ throws KustvaktException {
+ if (koralNode.has("@type")
+ && koralNode.get("@type").equals("koral:queryRef")) {
+ if (!koralNode.has("ref")) {
+ throw new KustvaktException(
+ StatusCodes.MISSING_QUERY_REFERENCE,
+ "ref is not found"
+ );
+ }
+ else {
+ String queryRefName = koralNode.get("ref");
+ String queryRefOwner = "system";
+ boolean ownerExist = false;
+ if (queryRefName.contains("/")) {
+ String[] names = queryRefName.split("/");
+ if (names.length == 2) {
+ queryRefOwner = names[0];
+ queryRefName = names[1];
+ ownerExist = true;
+ }
+ }
+
+ JsonNode qref = refService.searchQueryByName(
+ username,
+ queryRefName,
+ queryRefOwner);
+
+ rewriteQuery(qref,koralNode);
+ }
+ }
+
+ else if (koralNode.has("operands")) {
+ KoralNode operands = koralNode.at("/operands");
+
+ for (int i = 0; i < operands.size(); i++) {
+ KoralNode operand = operands.get(i);
+ this.findQueryRef(username, operand);
+ operand.buildRewrites();
+ }
+ }
+ }
+
+
+ private void removeOwner (String koralQuery,
+ String queryRefOwner,
+ KoralNode koralNode) throws KustvaktException {
+ JsonNode jsonNode = koralNode.rawNode();
+ String ref = jsonNode.at("/ref").asText();
+ koralNode.remove("ref", new RewriteIdentifier("ref", ref));
+
+ ref = ref.substring(queryRefOwner.length() + 1, ref.length());
+ koralNode.set("ref", ref, new RewriteIdentifier("ref", ref));
+ }
+
+ private void rewriteQuery (JsonNode qref, KoralNode koralNode)
+ throws KustvaktException {
+ JsonNode jsonNode = koralNode.rawNode();
+ koralNode.remove("@type",
+ new RewriteIdentifier("@type", jsonNode.at("/@type").asText()));
+ koralNode.remove("ref",
+ new RewriteIdentifier("ref", jsonNode.at("/ref").asText()));
+ koralNode.setAll((ObjectNode) qref);
+ }
+}
diff --git a/full/src/main/java/de/ids_mannheim/korap/service/QueryReferenceService.java b/full/src/main/java/de/ids_mannheim/korap/service/QueryReferenceService.java
new file mode 100644
index 0000000..eb99f68
--- /dev/null
+++ b/full/src/main/java/de/ids_mannheim/korap/service/QueryReferenceService.java
@@ -0,0 +1,34 @@
+package de.ids_mannheim.korap.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import de.ids_mannheim.korap.utils.JsonUtils;
+
+/**
+ * @author diewald
+ */
+@Service
+public class QueryReferenceService {
+
+
+ public JsonNode searchQueryByName (String username,
+ String refName,
+ String createdBy) throws KustvaktException {
+
+ String refCode = createdBy + "/" + refName;
+
+ if (refCode.equals("system/emptyToken")) {
+ return JsonUtils.readTree("{\"@type\":\"koral:token\"}");
+ };
+
+ throw new KustvaktException(
+ StatusCodes.NO_RESOURCE_FOUND,
+ "Query reference " + refCode + " is not found.",
+ String.valueOf(refCode));
+ }
+};