blob: 55110d0776708a658b9fd868c7ca0ab67d537de4 [file] [log] [blame]
margaretha563aabe2018-09-13 20:39:45 +02001package de.ids_mannheim.korap.rewrite;
2
3import org.springframework.beans.factory.annotation.Autowired;
4import org.springframework.stereotype.Component;
5
6import com.fasterxml.jackson.databind.JsonNode;
7import com.fasterxml.jackson.databind.node.ObjectNode;
8
9import de.ids_mannheim.korap.config.KustvaktConfiguration;
10import de.ids_mannheim.korap.entity.VirtualCorpus;
11import de.ids_mannheim.korap.exceptions.KustvaktException;
12import de.ids_mannheim.korap.resource.rewrite.KoralNode;
13import de.ids_mannheim.korap.resource.rewrite.KoralNode.RewriteIdentifier;
14import de.ids_mannheim.korap.resource.rewrite.RewriteTask;
15import de.ids_mannheim.korap.service.VirtualCorpusService;
16import de.ids_mannheim.korap.user.User;
margaretha9e53bb22018-09-14 19:39:15 +020017import de.ids_mannheim.korap.util.StatusCodes;
margaretha563aabe2018-09-13 20:39:45 +020018import de.ids_mannheim.korap.utils.JsonUtils;
19
20@Component
21public class VirtualCorpusRewrite implements RewriteTask.RewriteQuery {
22
23 @Autowired
24 private VirtualCorpusService vcService;
25
26 @Override
margaretha1bc9cca2018-12-11 15:09:44 +010027 public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
margaretha563aabe2018-09-13 20:39:45 +020028 User user) throws KustvaktException {
29 if (node.has("collection")) {
margarethad6f39d52018-12-06 14:21:39 +010030 node = node.at("/collection");
31 findVCRef(user.getUsername(), node);
margaretha563aabe2018-09-13 20:39:45 +020032 }
margaretha1bc9cca2018-12-11 15:09:44 +010033 return node;
margaretha563aabe2018-09-13 20:39:45 +020034 }
35
36 private void findVCRef (String username, KoralNode koralNode)
37 throws KustvaktException {
38 if (koralNode.has("@type")
39 && koralNode.get("@type").equals("koral:docGroupRef")) {
40 if (!koralNode.has("ref")) {
margaretha9e53bb22018-09-14 19:39:15 +020041 throw new KustvaktException(StatusCodes.MISSING_VC_REFERENCE,
42 "ref is not found");
margaretha563aabe2018-09-13 20:39:45 +020043 }
44 else {
45 String vcName = koralNode.get("ref");
margaretha9e53bb22018-09-14 19:39:15 +020046 String vcOwner = "system";
margaretha488e04b2018-09-19 18:17:45 +020047 boolean ownerExist = false;
margaretha9e53bb22018-09-14 19:39:15 +020048 if (vcName.contains("/")) {
49 String[] names = vcName.split("/");
50 if (names.length == 2) {
51 vcOwner = names[0];
52 vcName = names[1];
margaretha488e04b2018-09-19 18:17:45 +020053 ownerExist = true;
margaretha9e53bb22018-09-14 19:39:15 +020054 }
55 }
margaretha563aabe2018-09-13 20:39:45 +020056
57 VirtualCorpus vc =
margaretha9e53bb22018-09-14 19:39:15 +020058 vcService.searchVCByName(username, vcName, vcOwner);
margaretha563aabe2018-09-13 20:39:45 +020059 if (!vc.isCached()) {
margaretha9e53bb22018-09-14 19:39:15 +020060 rewriteVC(vc, koralNode);
margaretha563aabe2018-09-13 20:39:45 +020061 }
margaretha488e04b2018-09-19 18:17:45 +020062 else if (ownerExist) {
63 removeOwner(vc.getKoralQuery(), vcOwner, koralNode);
64 }
margaretha563aabe2018-09-13 20:39:45 +020065 }
66
67 }
68 else if (koralNode.has("operands")) {
69 KoralNode operands = koralNode.at("/operands");
70
71 for (int i = 0; i < operands.size(); i++) {
72 KoralNode operand = operands.get(i);
73 findVCRef(username, operand);
74 operand.buildRewrites();
75 }
76
77 }
78 }
margaretha9e53bb22018-09-14 19:39:15 +020079
margaretha488e04b2018-09-19 18:17:45 +020080 private void removeOwner (String koralQuery, String vcOwner,
81 KoralNode koralNode) throws KustvaktException {
82 JsonNode jsonNode = koralNode.rawNode();
83 String ref = jsonNode.at("/ref").asText();
84 koralNode.remove("ref", new RewriteIdentifier("ref", ref));
85
86 ref = ref.substring(vcOwner.length()+1, ref.length());
87 koralNode.set("ref", ref, new RewriteIdentifier("ref", ref));
88 }
89
margaretha9e53bb22018-09-14 19:39:15 +020090 private void rewriteVC (VirtualCorpus vc, KoralNode koralNode)
91 throws KustvaktException {
92 String koralQuery = vc.getKoralQuery();
93 JsonNode kq = JsonUtils.readTree(koralQuery).at("/collection");
94 JsonNode jsonNode = koralNode.rawNode();
95 // rewrite
96 koralNode.remove("@type",
97 new RewriteIdentifier("@type", jsonNode.at("/@type").asText()));
98 koralNode.remove("ref",
99 new RewriteIdentifier("ref", jsonNode.at("/ref").asText()));
100 koralNode.setAll((ObjectNode) kq);
101 }
margaretha563aabe2018-09-13 20:39:45 +0200102}