blob: 8232617c43879de8bb175da67999c7a6f758e85a [file] [log] [blame]
Joachim Bingel4b405f52013-11-15 15:29:30 +00001package de.ids_mannheim.korap.query.serialize;
2
Joachim Bingelc8a28e42014-04-24 15:06:42 +00003import java.util.ArrayList;
Joachim Bingelfbc88792014-09-17 11:11:52 +00004import java.util.Arrays;
Joachim Bingelc8a28e42014-04-24 15:06:42 +00005import java.util.LinkedHashMap;
Joachim Bingel8be1bdc2014-07-21 09:41:05 +00006import java.util.LinkedList;
Joachim Bingelc8a28e42014-04-24 15:06:42 +00007import java.util.List;
Joachim Bingel4b405f52013-11-15 15:29:30 +00008import java.util.Map;
Joachim Bingelc8a28e42014-04-24 15:06:42 +00009
Joachim Bingelc8a28e42014-04-24 15:06:42 +000010import org.antlr.v4.runtime.tree.ParseTree;
Joachim Bingelc63f7812014-07-30 09:12:25 +000011import org.slf4j.Logger;
Joachim Bingel4b405f52013-11-15 15:29:30 +000012
Joachim Bingel3fa584b2014-12-17 13:35:43 +000013import de.ids_mannheim.korap.query.serialize.util.StatusCodes;
Joachim Bingel6003b852014-12-18 14:20:55 +000014import de.ids_mannheim.korap.query.serialize.util.QueryException;
Joachim Bingel87480d02014-01-17 14:07:46 +000015
Joachim Bingel4b405f52013-11-15 15:29:30 +000016public abstract class AbstractSyntaxTree {
Joachim Bingelc8a28e42014-04-24 15:06:42 +000017
Joachim Bingel87480d02014-01-17 14:07:46 +000018 public abstract void process(String query) throws QueryException;
Joachim Bingeld4ae5fd2014-04-29 15:00:16 +000019
20 public static final Integer MAXIMUM_DISTANCE = 100;
Joachim Bingelc63f7812014-07-30 09:12:25 +000021
22 Logger log;
23 /**
24 * The query
25 */
26 String query;
Joachim Bingel8be1bdc2014-07-21 09:41:05 +000027 /**
28 * Top-level map representing the whole request.
29 */
30 LinkedHashMap<String, Object> requestMap = new LinkedHashMap<String, Object>();
31 /**
32 * Keeps track of open node categories
33 */
34 LinkedList<String> openNodeCats = new LinkedList<String>();
35 /**
36 * Keeps track of all visited nodes in a tree
37 */
38 List<ParseTree> visited = new ArrayList<ParseTree>();
39 /**
40 * Keeps track of active object.
41 */
42 LinkedList<LinkedHashMap<String, Object>> objectStack = new LinkedList<LinkedHashMap<String, Object>>();
43 /**
44 * Keeps track of how many objects there are to pop after every recursion of {@link #processNode(ParseTree)}
45 */
46 LinkedList<Integer> objectsToPop = new LinkedList<Integer>();
47 /**
48 * If true, print debug statements
49 */
50 public static boolean verbose = false;
51 ParseTree currentNode = null;
52 Integer stackedObjects = 0;
Joachim Bingel95e44fd2014-11-07 19:20:42 +000053 private ArrayList<List<Object>> errors = new ArrayList<List<Object>>();
54 private ArrayList<List<Object>> warnings = new ArrayList<List<Object>>();
55 private ArrayList<List<Object>> messages = new ArrayList<List<Object>>();
Joachim Bingel9e6b9482014-10-15 12:02:49 +000056 LinkedHashMap<String, Object> collection = new LinkedHashMap<String,Object>();
Joachim Bingelc63f7812014-07-30 09:12:25 +000057
58 AbstractSyntaxTree() {
Joachim Bingelf8a578b2014-10-08 08:41:00 +000059 requestMap.put("@context", "http://ids-mannheim.de/ns/KorAP/json-ld/v0.2/context.jsonld");
Joachim Bingel95e44fd2014-11-07 19:20:42 +000060 requestMap.put("errors", errors);
Joachim Bingelc63f7812014-07-30 09:12:25 +000061 requestMap.put("warnings", warnings);
Joachim Bingel95e44fd2014-11-07 19:20:42 +000062 requestMap.put("messages", messages);
Joachim Bingel9e6b9482014-10-15 12:02:49 +000063 requestMap.put("collection", collection);
Joachim Bingele3fe3672014-12-17 18:35:58 +000064 requestMap.put("query", new LinkedHashMap<String, Object>());
Joachim Bingel832800e2014-10-17 14:46:39 +000065 requestMap.put("meta", new LinkedHashMap<String, Object>());
Joachim Bingelc63f7812014-07-30 09:12:25 +000066 }
67
Joachim Bingel95e44fd2014-11-07 19:20:42 +000068 public void addWarning(int code, String msg) {
69 List<Object> warning = Arrays.asList(new Object[]{code, msg});
70 warnings.add(warning);
71 }
72
73 public void addWarning(String msg) {
74 List<Object> warning = Arrays.asList(new Object[]{msg});
75 warnings.add(warning);
76 }
77
78 public void addMessage(int code, String msg) {
79 List<Object> message = Arrays.asList(new Object[]{code, msg});
80 messages.add(message);
81 }
82
83 public void addMessage(String msg) {
84 List<Object> message = Arrays.asList(new Object[]{msg});
85 messages.add(message);
86 }
87
88 public void addError(int code, String msg) {
89 List<Object> error = Arrays.asList(new Object[]{code, msg});
90 errors.add(error);
91 }
Joachim Bingele3fe3672014-12-17 18:35:58 +000092
93 public void addError(List<Object> fullErrorMsg) {
94 errors.add(fullErrorMsg);
95 }
Joachim Bingel95e44fd2014-11-07 19:20:42 +000096
Joachim Bingelc63f7812014-07-30 09:12:25 +000097 public Map<String, Object> getRequestMap() {
98 return requestMap;
99 }
100
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000101 protected LinkedHashMap<String, Object> makeSpan() {
102 LinkedHashMap<String, Object> span = new LinkedHashMap<String, Object>();
103 span.put("@type", "korap:span");
104 return span;
105 }
106
Joachim Bingel03dfd952014-07-30 08:08:53 +0000107 protected LinkedHashMap<String, Object> makeSpan(String key) {
108 LinkedHashMap<String, Object> span = new LinkedHashMap<String, Object>();
109 span.put("@type", "korap:span");
110 span.put("key", key);
111 return span;
112 }
113
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000114 protected LinkedHashMap<String, Object> makeTerm() {
115 LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
116 term.put("@type", "korap:term");
117 return term;
118 }
Joachim Bingeld4ae5fd2014-04-29 15:00:16 +0000119
Joachim Bingel402c6e12014-05-08 17:09:06 +0000120 protected LinkedHashMap<String, Object> makeTermGroup(String relation) {
121 LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
122 term.put("@type", "korap:termGroup");
123 term.put("relation", "relation:"+relation);
124 term.put("operands", new ArrayList<Object>());
125 return term;
126 }
127
Joachim Bingel2bb0b7f2014-07-23 12:25:37 +0000128 protected LinkedHashMap<String, Object> makeDoc() {
129 LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
130 term.put("@type", "korap:doc");
131 return term;
132 }
133
134 protected LinkedHashMap<String, Object> makeDocGroup(String relation) {
135 LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
136 term.put("@type", "korap:docGroup");
Joachim Bingelb895c1f2014-09-29 09:31:05 +0000137 term.put("operation", "operation:"+relation);
Joachim Bingel2bb0b7f2014-07-23 12:25:37 +0000138 term.put("operands", new ArrayList<Object>());
139 return term;
140 }
141
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000142 protected LinkedHashMap<String, Object> makeToken() {
143 LinkedHashMap<String, Object> token = new LinkedHashMap<String, Object>();
144 token.put("@type", "korap:token");
145 return token;
146 }
147
148 protected LinkedHashMap<String, Object> makeGroup(String operation) {
149 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
150 group.put("@type", "korap:group");
151 group.put("operation", "operation:"+operation);
152 group.put("operands", new ArrayList<Object>());
153 return group;
154 }
155
Joachim Bingel687e4d42014-07-30 09:34:18 +0000156 protected LinkedHashMap<String, Object> makeRepetition(Integer min, Integer max) {
Joachim Bingel14239d82014-07-22 09:55:04 +0000157 LinkedHashMap<String, Object> group = makeGroup("repetition");
Joachim Bingel61631562014-07-24 14:26:02 +0000158 group.put("boundary", makeBoundary(min, max));
159 group.put("min", min);
Joachim Bingel687e4d42014-07-30 09:34:18 +0000160 if (max != null) {
161 group.put("max", max);
162 }
Joachim Bingel95e44fd2014-11-07 19:20:42 +0000163 addMessage(303, "Deprecated 2014-07-24: 'min' and 'max' to be supported until 3 months from deprecation date.");
Joachim Bingel14239d82014-07-22 09:55:04 +0000164 return group;
165 }
166
Joachim Bingel09737972014-09-22 09:43:06 +0000167 @Deprecated
Joachim Bingel33bd45f2014-06-25 15:00:54 +0000168 protected LinkedHashMap<String, Object> makePosition(String frame) {
169 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
170 group.put("@type", "korap:group");
171 group.put("operation", "operation:position");
172 group.put("frame", "frame:"+frame);
173 group.put("operands", new ArrayList<Object>());
174 return group;
175 }
176
Joachim Bingel6b491c22014-10-21 08:35:18 +0000177 protected LinkedHashMap<String, Object> makePosition(String[] allowedFrames, String[] classRefCheck) {
Joachim Bingelfbc88792014-09-17 11:11:52 +0000178 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
179 group.put("@type", "korap:group");
180 group.put("operation", "operation:position");
Joachim Bingel09737972014-09-22 09:43:06 +0000181 group.put("frames", Arrays.asList(allowedFrames));
Joachim Bingelfbc88792014-09-17 11:11:52 +0000182 group.put("operands", new ArrayList<Object>());
Joachim Bingelaaabb722014-09-24 14:29:10 +0000183 // DEPRECATED 'frame'
Joachim Bingel755ada92014-12-16 13:55:37 +0000184 if (classRefCheck == null || classRefCheck.length==0) classRefCheck = new String[]{"classRefCheck:includes"};
Joachim Bingelaaabb722014-09-24 14:29:10 +0000185 String frame = "";
Joachim Bingel9e6b9482014-10-15 12:02:49 +0000186
Joachim Bingel6b491c22014-10-21 08:35:18 +0000187 if (allowedFrames.length==0 && classRefCheck[0]=="classRefCheck:includes") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000188 frame = "frame:contains";
Joachim Bingel6cb4b642014-12-01 10:52:05 +0000189 } else if (allowedFrames[0]=="frames:overlapsLeft" && allowedFrames[1]=="frames:overlapsRight" && classRefCheck[0]=="classRefCheck:intersects") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000190 frame = "frame:overlaps";
Joachim Bingel6b491c22014-10-21 08:35:18 +0000191 } else if (allowedFrames[0]=="frames:startswith" && classRefCheck[0]=="classRefCheck:includes") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000192 frame = "frame:startswith";
Joachim Bingel6b491c22014-10-21 08:35:18 +0000193 } else if (allowedFrames[0]=="frames:endswith" && classRefCheck[0]=="classRefCheck:includes") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000194 frame = "frame:endswith";
Joachim Bingel6b491c22014-10-21 08:35:18 +0000195 } else if (allowedFrames[0]=="frames:matches" && classRefCheck[0]=="classRefCheck:includes" && classRefCheck.length==1) {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000196 frame = "frame:matches";
Joachim Bingel6b491c22014-10-21 08:35:18 +0000197 } else if (allowedFrames[0]=="frames:matches" && classRefCheck[0]=="classRefCheck:includes" && classRefCheck[1]=="classRefCheck:unequals") {
198 frame = "frame:matches";
199 } else if (allowedFrames[0]=="frames:matches" && classRefCheck[0]=="classRefCheck:equals") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000200 frame = "frame:matches";
Joachim Bingel6b491c22014-10-21 08:35:18 +0000201 } else if (allowedFrames[0]=="frames:contains" && classRefCheck[0]=="classRefCheck:includes") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000202 frame = "frame:contains";
Joachim Bingel6b491c22014-10-21 08:35:18 +0000203 } else if (allowedFrames[0]=="frames:startswith" && classRefCheck[0]=="classRefCheck:intersects") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000204 frame = "frame:overlapsLeft";
Joachim Bingel6b491c22014-10-21 08:35:18 +0000205 } else if (allowedFrames[0]=="frames:endswith" && classRefCheck[0]=="classRefCheck:intersects") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000206 frame = "frame:overlapsRight";
Joachim Bingel6b491c22014-10-21 08:35:18 +0000207 } else if (allowedFrames[0]=="frames:matches" && classRefCheck[0]=="classRefCheck:intersects") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000208 frame = "frame:matches";
Joachim Bingel6b491c22014-10-21 08:35:18 +0000209 } else if (allowedFrames[0]=="frames:matches" && classRefCheck[0]=="classRefCheck:unequals") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000210 frame = "frame:matches";
Joachim Bingel6b491c22014-10-21 08:35:18 +0000211 } else if (allowedFrames[0]=="frames:matches" && classRefCheck[0]=="classRefCheck:equals") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000212 frame = "frame:matches";
Joachim Bingel6b491c22014-10-21 08:35:18 +0000213 } else if (allowedFrames[0]=="frames:contains" && classRefCheck[0]=="classRefCheck:intersects") {
Joachim Bingel93e6c702014-09-30 15:19:23 +0000214 frame = "frame:contains";
Joachim Bingelaaabb722014-09-24 14:29:10 +0000215 }
216 group.put("frame", frame);
Joachim Bingel3fa584b2014-12-17 13:35:43 +0000217 addMessage(StatusCodes.DEPRECATED_QUERY_ELEMENT, "Deprecated 2014-09-22: 'frame' only to be supported until 3 months from deprecation date. " +
Joachim Bingel6b491c22014-10-21 08:35:18 +0000218 "Position frames are now expressed through 'frames'.");
Joachim Bingelfbc88792014-09-17 11:11:52 +0000219 return group;
220 }
221
Joachim Bingel0900a892014-06-30 16:26:21 +0000222 protected LinkedHashMap<String, Object> makeSpanClass(int classCount) {
Joachim Bingelbd386362014-10-02 12:03:18 +0000223 return makeSpanClass(classCount, true);
224 }
225
226 protected LinkedHashMap<String, Object> makeSpanClass(int classCount, boolean setBySystem) {
Joachim Bingelfc428812014-06-18 14:50:14 +0000227 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
228 group.put("@type", "korap:group");
229 group.put("operation", "operation:class");
Joachim Bingelbd386362014-10-02 12:03:18 +0000230 if (setBySystem) {
Joachim Bingel6b491c22014-10-21 08:35:18 +0000231 group.put("class", 128+classCount);
232 group.put("classOut", 128+classCount);
Joachim Bingel95e44fd2014-11-07 19:20:42 +0000233 addMessage("A class has been introduced into the backend representation of " +
Joachim Bingel6b491c22014-10-21 08:35:18 +0000234 "your query for later reference to a part of the query. The class id is "+(128+classCount));
Joachim Bingelbd386362014-10-02 12:03:18 +0000235 } else {
236 group.put("class", classCount);
Joachim Bingel9e6b9482014-10-15 12:02:49 +0000237 group.put("classOut", classCount);
Joachim Bingelbd386362014-10-02 12:03:18 +0000238 }
Joachim Bingel3fa584b2014-12-17 13:35:43 +0000239 addMessage(StatusCodes.DEPRECATED_QUERY_ELEMENT, "Deprecated 2014-10-07: 'class' only to be supported until 3 months from deprecation date. " +
Joachim Bingel9e6b9482014-10-15 12:02:49 +0000240 "Classes are now defined using the 'classOut' attribute.");
241 group.put("operands", new ArrayList<Object>());
242 return group;
243 }
244
245 protected LinkedHashMap<String, Object> makeClassRefCheck(ArrayList<String> check, Integer[] classIn, int classOut) {
246 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
247 group.put("@type", "korap:group");
248 group.put("operation", "operation:class");
Joachim Bingel8fbdfa72014-12-04 10:33:34 +0000249 group.put("classRefCheck", check);
Joachim Bingel9e6b9482014-10-15 12:02:49 +0000250 group.put("classIn", Arrays.asList(classIn));
251 group.put("classOut", classOut);
Joachim Bingelb4ab2502014-11-06 10:07:26 +0000252 group.put("class", classOut);
Joachim Bingel3fa584b2014-12-17 13:35:43 +0000253 addMessage(StatusCodes.DEPRECATED_QUERY_ELEMENT, "Deprecated 2014-10-07: 'class' only to be supported until 3 months from deprecation date. " +
Joachim Bingelb4ab2502014-11-06 10:07:26 +0000254 "Classes are now defined using the 'classOut' attribute.");
Joachim Bingel9e6b9482014-10-15 12:02:49 +0000255 group.put("operands", new ArrayList<Object>());
256 return group;
257 }
258
259 protected LinkedHashMap<String, Object> makeClassRefOp(String operation, Integer[] classIn, int classOut) {
260 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
261 group.put("@type", "korap:group");
262 group.put("operation", "operation:class");
263 group.put("classRefOp", operation);
264 group.put("classIn", Arrays.asList(classIn));
265 group.put("classOut", classOut);
Joachim Bingelfc428812014-06-18 14:50:14 +0000266 group.put("operands", new ArrayList<Object>());
267 return group;
268 }
269
Joachim Bingel62892412014-08-06 15:18:59 +0000270 @Deprecated
Joachim Bingeld4ae5fd2014-04-29 15:00:16 +0000271 protected LinkedHashMap<String, Object> makeTreeRelation(String reltype) {
272 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
273 group.put("@type", "korap:treeRelation");
274 if (reltype != null) group.put("reltype", reltype);
275 return group;
276 }
277
Joachim Bingel62892412014-08-06 15:18:59 +0000278 protected LinkedHashMap<String, Object> makeRelation() {
Joachim Bingeld4ae5fd2014-04-29 15:00:16 +0000279 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
280 group.put("@type", "korap:relation");
Joachim Bingeld4ae5fd2014-04-29 15:00:16 +0000281 return group;
282 }
283
Joachim Bingel687e4d42014-07-30 09:34:18 +0000284 protected LinkedHashMap<String, Object> makeBoundary(Integer min, Integer max) {
Joachim Bingeld4ae5fd2014-04-29 15:00:16 +0000285 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
286 group.put("@type", "korap:boundary");
287 group.put("min", min);
Joachim Bingel687e4d42014-07-30 09:34:18 +0000288 if (max != null) {
289 group.put("max", max);
290 }
Joachim Bingeld4ae5fd2014-04-29 15:00:16 +0000291 return group;
292 }
Joachim Bingel402c6e12014-05-08 17:09:06 +0000293
Joachim Bingel687e4d42014-07-30 09:34:18 +0000294 protected LinkedHashMap<String, Object> makeDistance(String key, Integer min, Integer max) {
Joachim Bingel402c6e12014-05-08 17:09:06 +0000295 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
Joachim Bingel832800e2014-10-17 14:46:39 +0000296 if (key.equals("w")) {
297 group.put("@type", "korap:distance");
298 } else {
299 group.put("@type", "cosmas:distance");
300 }
Joachim Bingel402c6e12014-05-08 17:09:06 +0000301 group.put("key", key);
Joachim Bingel5a146cd2014-07-24 14:44:57 +0000302 group.put("boundary", makeBoundary(min, max));
Joachim Bingel402c6e12014-05-08 17:09:06 +0000303 group.put("min", min);
Joachim Bingel687e4d42014-07-30 09:34:18 +0000304 if (max != null) {
305 group.put("max", max);
306 }
Joachim Bingel3fa584b2014-12-17 13:35:43 +0000307 addMessage(StatusCodes.DEPRECATED_QUERY_ELEMENT, "Deprecated 2014-07-24: 'min' and 'max' to be supported until 3 months from deprecation date.");
Joachim Bingel402c6e12014-05-08 17:09:06 +0000308 return group;
309 }
Joachim Bingeld4ae5fd2014-04-29 15:00:16 +0000310
Joachim Bingel571c4202014-07-08 14:07:19 +0000311 protected LinkedHashMap<String, Object> makeReference(ArrayList<Integer> classRefs, String operation) {
Joachim Bingel9c3ddb92014-06-23 13:49:58 +0000312 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
Joachim Bingelfb9d5fd2014-06-25 09:32:43 +0000313 group.put("@type", "korap:reference");
Joachim Bingel571c4202014-07-08 14:07:19 +0000314 group.put("operation", "operation:"+operation);
Joachim Bingel9bbd4fc2014-08-11 14:56:48 +0000315 if (classRefs!= null && !classRefs.isEmpty()) {
316 group.put("classRef", classRefs);
317 }
Joachim Bingel9c3ddb92014-06-23 13:49:58 +0000318 return group;
319 }
320
Joachim Bingel571c4202014-07-08 14:07:19 +0000321 protected LinkedHashMap<String, Object> makeReference(ArrayList<Integer> classRefs) {
322 return makeReference(classRefs, "focus");
323 }
324
Joachim Bingel755ada92014-12-16 13:55:37 +0000325 protected LinkedHashMap<String, Object> makeReference(int classRef, String operation, boolean setBySystem) {
Joachim Bingel571c4202014-07-08 14:07:19 +0000326 ArrayList<Integer> classRefs = new ArrayList<Integer>();
Joachim Bingel755ada92014-12-16 13:55:37 +0000327 if (setBySystem) classRef = classRef+128;
Joachim Bingel571c4202014-07-08 14:07:19 +0000328 classRefs.add(classRef);
329 return makeReference(classRefs, operation);
330 }
331
Joachim Bingel755ada92014-12-16 13:55:37 +0000332 protected LinkedHashMap<String, Object> makeReference(int classRef, boolean setBySystem) {
Joachim Bingelfb9d5fd2014-06-25 09:32:43 +0000333 ArrayList<Integer> classRefs = new ArrayList<Integer>();
Joachim Bingel755ada92014-12-16 13:55:37 +0000334 if (setBySystem) classRef = classRef+128;
Joachim Bingelfb9d5fd2014-06-25 09:32:43 +0000335 classRefs.add(classRef);
Joachim Bingel571c4202014-07-08 14:07:19 +0000336 return makeReference(classRefs, "focus");
Joachim Bingelfb9d5fd2014-06-25 09:32:43 +0000337 }
338
Joachim Bingel755ada92014-12-16 13:55:37 +0000339 protected LinkedHashMap<String, Object> makeReference(int classRef) {
340 return makeReference(classRef, false);
341 }
342
Joachim Bingel09737972014-09-22 09:43:06 +0000343 protected LinkedHashMap<String, Object> makeResetReference() {
344 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
345 group.put("@type", "korap:reference");
346 group.put("operation", "operation:focus");
347 group.put("reset", true);
348 group.put("operands", new ArrayList<Object>());
349 return group;
350 }
351
Joachim Bingel896067a2014-11-07 19:02:27 +0000352 protected LinkedHashMap<String, Object> makeSpanReference(Integer[] spanRef, String operation) {
353 LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
354 group.put("@type", "korap:reference");
355 group.put("operation", "operation:"+operation);
356 group.put("spanRef", Arrays.asList(spanRef));
357 group.put("operands", new ArrayList<Object>());
358 return group;
359 }
360
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000361 protected void addOperandsToGroup(LinkedHashMap<String, Object> group) {
362 ArrayList<Object> operands = new ArrayList<Object>();
363 group.put("operands", operands);
364 }
365
Joachim Bingel571c4202014-07-08 14:07:19 +0000366 protected LinkedHashMap<String, Object> wrapInReference(LinkedHashMap<String, Object> group, Integer classId) {
367 LinkedHashMap<String, Object> refGroup = makeReference(classId);
368 ArrayList<Object> operands = new ArrayList<Object>();
369 operands.add(group);
370 refGroup.put("operands", operands);
371 return refGroup;
372 }
373
374 @SuppressWarnings("unchecked")
375 protected LinkedHashMap<String, Object> wrapInClass(LinkedHashMap<String, Object> group, Integer classId) {
Joachim Bingelbd386362014-10-02 12:03:18 +0000376 LinkedHashMap<String, Object> classGroup = makeSpanClass(classId, true);
Joachim Bingel571c4202014-07-08 14:07:19 +0000377 ((ArrayList<Object>) classGroup.get("operands")).add(group);
378 return classGroup;
379 }
380
Joachim Bingelaaabb722014-09-24 14:29:10 +0000381 /**
382 * Ensures that a distance or quantification value does not exceed the allowed maximum value.
383 * @param number
384 * @return The input number if it is below the allowed maximum value, else the maximum value.
385 */
386 protected int cropToMaxValue(int number) {
387 if (number > MAXIMUM_DISTANCE) {
388 number = MAXIMUM_DISTANCE;
389 String warning = String.format("You specified a distance between two segments that is greater than " +
390 "the allowed max value of %d. Your query will be re-interpreted using a distance of %d.", MAXIMUM_DISTANCE, MAXIMUM_DISTANCE);
Joachim Bingel95e44fd2014-11-07 19:20:42 +0000391 addWarning(warning);
Joachim Bingelaaabb722014-09-24 14:29:10 +0000392 log.warn("User warning: "+warning);
393 }
394 return number;
395 }
Joachim Bingel4b405f52013-11-15 15:29:30 +0000396}