| Joachim Bingel | 4b405f5 | 2013-11-15 15:29:30 +0000 | [diff] [blame] | 1 | package de.ids_mannheim.korap.query.serialize; |
| 2 | |
| Joachim Bingel | c8a28e4 | 2014-04-24 15:06:42 +0000 | [diff] [blame] | 3 | import java.util.ArrayList; |
| Joachim Bingel | fbc8879 | 2014-09-17 11:11:52 +0000 | [diff] [blame] | 4 | import java.util.Arrays; |
| Joachim Bingel | c8a28e4 | 2014-04-24 15:06:42 +0000 | [diff] [blame] | 5 | import java.util.LinkedHashMap; |
| Joachim Bingel | 8be1bdc | 2014-07-21 09:41:05 +0000 | [diff] [blame] | 6 | import java.util.LinkedList; |
| Joachim Bingel | c8a28e4 | 2014-04-24 15:06:42 +0000 | [diff] [blame] | 7 | import java.util.List; |
| Joachim Bingel | 4b405f5 | 2013-11-15 15:29:30 +0000 | [diff] [blame] | 8 | import java.util.Map; |
| Joachim Bingel | c8a28e4 | 2014-04-24 15:06:42 +0000 | [diff] [blame] | 9 | |
| Joachim Bingel | c8a28e4 | 2014-04-24 15:06:42 +0000 | [diff] [blame] | 10 | import org.antlr.v4.runtime.tree.ParseTree; |
| Joachim Bingel | c63f781 | 2014-07-30 09:12:25 +0000 | [diff] [blame] | 11 | import org.slf4j.Logger; |
| Joachim Bingel | 4b405f5 | 2013-11-15 15:29:30 +0000 | [diff] [blame] | 12 | |
| Joachim Bingel | 3fa584b | 2014-12-17 13:35:43 +0000 | [diff] [blame] | 13 | import de.ids_mannheim.korap.query.serialize.util.StatusCodes; |
| Joachim Bingel | 6003b85 | 2014-12-18 14:20:55 +0000 | [diff] [blame] | 14 | import de.ids_mannheim.korap.query.serialize.util.QueryException; |
| Joachim Bingel | 87480d0 | 2014-01-17 14:07:46 +0000 | [diff] [blame] | 15 | |
| Joachim Bingel | 4b405f5 | 2013-11-15 15:29:30 +0000 | [diff] [blame] | 16 | public abstract class AbstractSyntaxTree { |
| Joachim Bingel | c8a28e4 | 2014-04-24 15:06:42 +0000 | [diff] [blame] | 17 | |
| Joachim Bingel | 87480d0 | 2014-01-17 14:07:46 +0000 | [diff] [blame] | 18 | public abstract void process(String query) throws QueryException; |
| Joachim Bingel | d4ae5fd | 2014-04-29 15:00:16 +0000 | [diff] [blame] | 19 | |
| 20 | public static final Integer MAXIMUM_DISTANCE = 100; |
| Joachim Bingel | c63f781 | 2014-07-30 09:12:25 +0000 | [diff] [blame] | 21 | |
| 22 | Logger log; |
| 23 | /** |
| 24 | * The query |
| 25 | */ |
| 26 | String query; |
| Joachim Bingel | 8be1bdc | 2014-07-21 09:41:05 +0000 | [diff] [blame] | 27 | /** |
| 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 Bingel | 95e44fd | 2014-11-07 19:20:42 +0000 | [diff] [blame] | 53 | 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 Bingel | 9e6b948 | 2014-10-15 12:02:49 +0000 | [diff] [blame] | 56 | LinkedHashMap<String, Object> collection = new LinkedHashMap<String,Object>(); |
| Joachim Bingel | c63f781 | 2014-07-30 09:12:25 +0000 | [diff] [blame] | 57 | |
| 58 | AbstractSyntaxTree() { |
| Joachim Bingel | f8a578b | 2014-10-08 08:41:00 +0000 | [diff] [blame] | 59 | requestMap.put("@context", "http://ids-mannheim.de/ns/KorAP/json-ld/v0.2/context.jsonld"); |
| Joachim Bingel | 95e44fd | 2014-11-07 19:20:42 +0000 | [diff] [blame] | 60 | requestMap.put("errors", errors); |
| Joachim Bingel | c63f781 | 2014-07-30 09:12:25 +0000 | [diff] [blame] | 61 | requestMap.put("warnings", warnings); |
| Joachim Bingel | 95e44fd | 2014-11-07 19:20:42 +0000 | [diff] [blame] | 62 | requestMap.put("messages", messages); |
| Joachim Bingel | 9e6b948 | 2014-10-15 12:02:49 +0000 | [diff] [blame] | 63 | requestMap.put("collection", collection); |
| Joachim Bingel | e3fe367 | 2014-12-17 18:35:58 +0000 | [diff] [blame] | 64 | requestMap.put("query", new LinkedHashMap<String, Object>()); |
| Joachim Bingel | 832800e | 2014-10-17 14:46:39 +0000 | [diff] [blame] | 65 | requestMap.put("meta", new LinkedHashMap<String, Object>()); |
| Joachim Bingel | c63f781 | 2014-07-30 09:12:25 +0000 | [diff] [blame] | 66 | } |
| 67 | |
| Joachim Bingel | 95e44fd | 2014-11-07 19:20:42 +0000 | [diff] [blame] | 68 | 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 Bingel | e3fe367 | 2014-12-17 18:35:58 +0000 | [diff] [blame] | 92 | |
| 93 | public void addError(List<Object> fullErrorMsg) { |
| 94 | errors.add(fullErrorMsg); |
| 95 | } |
| Joachim Bingel | 95e44fd | 2014-11-07 19:20:42 +0000 | [diff] [blame] | 96 | |
| Joachim Bingel | c63f781 | 2014-07-30 09:12:25 +0000 | [diff] [blame] | 97 | public Map<String, Object> getRequestMap() { |
| 98 | return requestMap; |
| 99 | } |
| 100 | |
| Joachim Bingel | c8a28e4 | 2014-04-24 15:06:42 +0000 | [diff] [blame] | 101 | 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 Bingel | 03dfd95 | 2014-07-30 08:08:53 +0000 | [diff] [blame] | 107 | 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 Bingel | c8a28e4 | 2014-04-24 15:06:42 +0000 | [diff] [blame] | 114 | 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 Bingel | d4ae5fd | 2014-04-29 15:00:16 +0000 | [diff] [blame] | 119 | |
| Joachim Bingel | 402c6e1 | 2014-05-08 17:09:06 +0000 | [diff] [blame] | 120 | 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 Bingel | 2bb0b7f | 2014-07-23 12:25:37 +0000 | [diff] [blame] | 128 | 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 Bingel | b895c1f | 2014-09-29 09:31:05 +0000 | [diff] [blame] | 137 | term.put("operation", "operation:"+relation); |
| Joachim Bingel | 2bb0b7f | 2014-07-23 12:25:37 +0000 | [diff] [blame] | 138 | term.put("operands", new ArrayList<Object>()); |
| 139 | return term; |
| 140 | } |
| 141 | |
| Joachim Bingel | c8a28e4 | 2014-04-24 15:06:42 +0000 | [diff] [blame] | 142 | 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 Bingel | 687e4d4 | 2014-07-30 09:34:18 +0000 | [diff] [blame] | 156 | protected LinkedHashMap<String, Object> makeRepetition(Integer min, Integer max) { |
| Joachim Bingel | 14239d8 | 2014-07-22 09:55:04 +0000 | [diff] [blame] | 157 | LinkedHashMap<String, Object> group = makeGroup("repetition"); |
| Joachim Bingel | 6163156 | 2014-07-24 14:26:02 +0000 | [diff] [blame] | 158 | group.put("boundary", makeBoundary(min, max)); |
| 159 | group.put("min", min); |
| Joachim Bingel | 687e4d4 | 2014-07-30 09:34:18 +0000 | [diff] [blame] | 160 | if (max != null) { |
| 161 | group.put("max", max); |
| 162 | } |
| Joachim Bingel | 95e44fd | 2014-11-07 19:20:42 +0000 | [diff] [blame] | 163 | addMessage(303, "Deprecated 2014-07-24: 'min' and 'max' to be supported until 3 months from deprecation date."); |
| Joachim Bingel | 14239d8 | 2014-07-22 09:55:04 +0000 | [diff] [blame] | 164 | return group; |
| 165 | } |
| 166 | |
| Joachim Bingel | 0973797 | 2014-09-22 09:43:06 +0000 | [diff] [blame] | 167 | @Deprecated |
| Joachim Bingel | 33bd45f | 2014-06-25 15:00:54 +0000 | [diff] [blame] | 168 | 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 Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 177 | protected LinkedHashMap<String, Object> makePosition(String[] allowedFrames, String[] classRefCheck) { |
| Joachim Bingel | fbc8879 | 2014-09-17 11:11:52 +0000 | [diff] [blame] | 178 | LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>(); |
| 179 | group.put("@type", "korap:group"); |
| 180 | group.put("operation", "operation:position"); |
| Joachim Bingel | 0973797 | 2014-09-22 09:43:06 +0000 | [diff] [blame] | 181 | group.put("frames", Arrays.asList(allowedFrames)); |
| Joachim Bingel | fbc8879 | 2014-09-17 11:11:52 +0000 | [diff] [blame] | 182 | group.put("operands", new ArrayList<Object>()); |
| Joachim Bingel | aaabb72 | 2014-09-24 14:29:10 +0000 | [diff] [blame] | 183 | // DEPRECATED 'frame' |
| Joachim Bingel | 755ada9 | 2014-12-16 13:55:37 +0000 | [diff] [blame] | 184 | if (classRefCheck == null || classRefCheck.length==0) classRefCheck = new String[]{"classRefCheck:includes"}; |
| Joachim Bingel | aaabb72 | 2014-09-24 14:29:10 +0000 | [diff] [blame] | 185 | String frame = ""; |
| Joachim Bingel | 9e6b948 | 2014-10-15 12:02:49 +0000 | [diff] [blame] | 186 | |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 187 | if (allowedFrames.length==0 && classRefCheck[0]=="classRefCheck:includes") { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 188 | frame = "frame:contains"; |
| Joachim Bingel | 6cb4b64 | 2014-12-01 10:52:05 +0000 | [diff] [blame] | 189 | } else if (allowedFrames[0]=="frames:overlapsLeft" && allowedFrames[1]=="frames:overlapsRight" && classRefCheck[0]=="classRefCheck:intersects") { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 190 | frame = "frame:overlaps"; |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 191 | } else if (allowedFrames[0]=="frames:startswith" && classRefCheck[0]=="classRefCheck:includes") { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 192 | frame = "frame:startswith"; |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 193 | } else if (allowedFrames[0]=="frames:endswith" && classRefCheck[0]=="classRefCheck:includes") { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 194 | frame = "frame:endswith"; |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 195 | } else if (allowedFrames[0]=="frames:matches" && classRefCheck[0]=="classRefCheck:includes" && classRefCheck.length==1) { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 196 | frame = "frame:matches"; |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 197 | } 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 Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 200 | frame = "frame:matches"; |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 201 | } else if (allowedFrames[0]=="frames:contains" && classRefCheck[0]=="classRefCheck:includes") { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 202 | frame = "frame:contains"; |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 203 | } else if (allowedFrames[0]=="frames:startswith" && classRefCheck[0]=="classRefCheck:intersects") { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 204 | frame = "frame:overlapsLeft"; |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 205 | } else if (allowedFrames[0]=="frames:endswith" && classRefCheck[0]=="classRefCheck:intersects") { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 206 | frame = "frame:overlapsRight"; |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 207 | } else if (allowedFrames[0]=="frames:matches" && classRefCheck[0]=="classRefCheck:intersects") { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 208 | frame = "frame:matches"; |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 209 | } else if (allowedFrames[0]=="frames:matches" && classRefCheck[0]=="classRefCheck:unequals") { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 210 | frame = "frame:matches"; |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 211 | } else if (allowedFrames[0]=="frames:matches" && classRefCheck[0]=="classRefCheck:equals") { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 212 | frame = "frame:matches"; |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 213 | } else if (allowedFrames[0]=="frames:contains" && classRefCheck[0]=="classRefCheck:intersects") { |
| Joachim Bingel | 93e6c70 | 2014-09-30 15:19:23 +0000 | [diff] [blame] | 214 | frame = "frame:contains"; |
| Joachim Bingel | aaabb72 | 2014-09-24 14:29:10 +0000 | [diff] [blame] | 215 | } |
| 216 | group.put("frame", frame); |
| Joachim Bingel | 3fa584b | 2014-12-17 13:35:43 +0000 | [diff] [blame] | 217 | addMessage(StatusCodes.DEPRECATED_QUERY_ELEMENT, "Deprecated 2014-09-22: 'frame' only to be supported until 3 months from deprecation date. " + |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 218 | "Position frames are now expressed through 'frames'."); |
| Joachim Bingel | fbc8879 | 2014-09-17 11:11:52 +0000 | [diff] [blame] | 219 | return group; |
| 220 | } |
| 221 | |
| Joachim Bingel | 0900a89 | 2014-06-30 16:26:21 +0000 | [diff] [blame] | 222 | protected LinkedHashMap<String, Object> makeSpanClass(int classCount) { |
| Joachim Bingel | bd38636 | 2014-10-02 12:03:18 +0000 | [diff] [blame] | 223 | return makeSpanClass(classCount, true); |
| 224 | } |
| 225 | |
| 226 | protected LinkedHashMap<String, Object> makeSpanClass(int classCount, boolean setBySystem) { |
| Joachim Bingel | fc42881 | 2014-06-18 14:50:14 +0000 | [diff] [blame] | 227 | LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>(); |
| 228 | group.put("@type", "korap:group"); |
| 229 | group.put("operation", "operation:class"); |
| Joachim Bingel | bd38636 | 2014-10-02 12:03:18 +0000 | [diff] [blame] | 230 | if (setBySystem) { |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 231 | group.put("class", 128+classCount); |
| 232 | group.put("classOut", 128+classCount); |
| Joachim Bingel | 95e44fd | 2014-11-07 19:20:42 +0000 | [diff] [blame] | 233 | addMessage("A class has been introduced into the backend representation of " + |
| Joachim Bingel | 6b491c2 | 2014-10-21 08:35:18 +0000 | [diff] [blame] | 234 | "your query for later reference to a part of the query. The class id is "+(128+classCount)); |
| Joachim Bingel | bd38636 | 2014-10-02 12:03:18 +0000 | [diff] [blame] | 235 | } else { |
| 236 | group.put("class", classCount); |
| Joachim Bingel | 9e6b948 | 2014-10-15 12:02:49 +0000 | [diff] [blame] | 237 | group.put("classOut", classCount); |
| Joachim Bingel | bd38636 | 2014-10-02 12:03:18 +0000 | [diff] [blame] | 238 | } |
| Joachim Bingel | 3fa584b | 2014-12-17 13:35:43 +0000 | [diff] [blame] | 239 | addMessage(StatusCodes.DEPRECATED_QUERY_ELEMENT, "Deprecated 2014-10-07: 'class' only to be supported until 3 months from deprecation date. " + |
| Joachim Bingel | 9e6b948 | 2014-10-15 12:02:49 +0000 | [diff] [blame] | 240 | "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 Bingel | 8fbdfa7 | 2014-12-04 10:33:34 +0000 | [diff] [blame] | 249 | group.put("classRefCheck", check); |
| Joachim Bingel | 9e6b948 | 2014-10-15 12:02:49 +0000 | [diff] [blame] | 250 | group.put("classIn", Arrays.asList(classIn)); |
| 251 | group.put("classOut", classOut); |
| Joachim Bingel | b4ab250 | 2014-11-06 10:07:26 +0000 | [diff] [blame] | 252 | group.put("class", classOut); |
| Joachim Bingel | 3fa584b | 2014-12-17 13:35:43 +0000 | [diff] [blame] | 253 | addMessage(StatusCodes.DEPRECATED_QUERY_ELEMENT, "Deprecated 2014-10-07: 'class' only to be supported until 3 months from deprecation date. " + |
| Joachim Bingel | b4ab250 | 2014-11-06 10:07:26 +0000 | [diff] [blame] | 254 | "Classes are now defined using the 'classOut' attribute."); |
| Joachim Bingel | 9e6b948 | 2014-10-15 12:02:49 +0000 | [diff] [blame] | 255 | 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 Bingel | fc42881 | 2014-06-18 14:50:14 +0000 | [diff] [blame] | 266 | group.put("operands", new ArrayList<Object>()); |
| 267 | return group; |
| 268 | } |
| 269 | |
| Joachim Bingel | 6289241 | 2014-08-06 15:18:59 +0000 | [diff] [blame] | 270 | @Deprecated |
| Joachim Bingel | d4ae5fd | 2014-04-29 15:00:16 +0000 | [diff] [blame] | 271 | 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 Bingel | 6289241 | 2014-08-06 15:18:59 +0000 | [diff] [blame] | 278 | protected LinkedHashMap<String, Object> makeRelation() { |
| Joachim Bingel | d4ae5fd | 2014-04-29 15:00:16 +0000 | [diff] [blame] | 279 | LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>(); |
| 280 | group.put("@type", "korap:relation"); |
| Joachim Bingel | d4ae5fd | 2014-04-29 15:00:16 +0000 | [diff] [blame] | 281 | return group; |
| 282 | } |
| 283 | |
| Joachim Bingel | 687e4d4 | 2014-07-30 09:34:18 +0000 | [diff] [blame] | 284 | protected LinkedHashMap<String, Object> makeBoundary(Integer min, Integer max) { |
| Joachim Bingel | d4ae5fd | 2014-04-29 15:00:16 +0000 | [diff] [blame] | 285 | LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>(); |
| 286 | group.put("@type", "korap:boundary"); |
| 287 | group.put("min", min); |
| Joachim Bingel | 687e4d4 | 2014-07-30 09:34:18 +0000 | [diff] [blame] | 288 | if (max != null) { |
| 289 | group.put("max", max); |
| 290 | } |
| Joachim Bingel | d4ae5fd | 2014-04-29 15:00:16 +0000 | [diff] [blame] | 291 | return group; |
| 292 | } |
| Joachim Bingel | 402c6e1 | 2014-05-08 17:09:06 +0000 | [diff] [blame] | 293 | |
| Joachim Bingel | 687e4d4 | 2014-07-30 09:34:18 +0000 | [diff] [blame] | 294 | protected LinkedHashMap<String, Object> makeDistance(String key, Integer min, Integer max) { |
| Joachim Bingel | 402c6e1 | 2014-05-08 17:09:06 +0000 | [diff] [blame] | 295 | LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>(); |
| Joachim Bingel | 832800e | 2014-10-17 14:46:39 +0000 | [diff] [blame] | 296 | if (key.equals("w")) { |
| 297 | group.put("@type", "korap:distance"); |
| 298 | } else { |
| 299 | group.put("@type", "cosmas:distance"); |
| 300 | } |
| Joachim Bingel | 402c6e1 | 2014-05-08 17:09:06 +0000 | [diff] [blame] | 301 | group.put("key", key); |
| Joachim Bingel | 5a146cd | 2014-07-24 14:44:57 +0000 | [diff] [blame] | 302 | group.put("boundary", makeBoundary(min, max)); |
| Joachim Bingel | 402c6e1 | 2014-05-08 17:09:06 +0000 | [diff] [blame] | 303 | group.put("min", min); |
| Joachim Bingel | 687e4d4 | 2014-07-30 09:34:18 +0000 | [diff] [blame] | 304 | if (max != null) { |
| 305 | group.put("max", max); |
| 306 | } |
| Joachim Bingel | 3fa584b | 2014-12-17 13:35:43 +0000 | [diff] [blame] | 307 | addMessage(StatusCodes.DEPRECATED_QUERY_ELEMENT, "Deprecated 2014-07-24: 'min' and 'max' to be supported until 3 months from deprecation date."); |
| Joachim Bingel | 402c6e1 | 2014-05-08 17:09:06 +0000 | [diff] [blame] | 308 | return group; |
| 309 | } |
| Joachim Bingel | d4ae5fd | 2014-04-29 15:00:16 +0000 | [diff] [blame] | 310 | |
| Joachim Bingel | 571c420 | 2014-07-08 14:07:19 +0000 | [diff] [blame] | 311 | protected LinkedHashMap<String, Object> makeReference(ArrayList<Integer> classRefs, String operation) { |
| Joachim Bingel | 9c3ddb9 | 2014-06-23 13:49:58 +0000 | [diff] [blame] | 312 | LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>(); |
| Joachim Bingel | fb9d5fd | 2014-06-25 09:32:43 +0000 | [diff] [blame] | 313 | group.put("@type", "korap:reference"); |
| Joachim Bingel | 571c420 | 2014-07-08 14:07:19 +0000 | [diff] [blame] | 314 | group.put("operation", "operation:"+operation); |
| Joachim Bingel | 9bbd4fc | 2014-08-11 14:56:48 +0000 | [diff] [blame] | 315 | if (classRefs!= null && !classRefs.isEmpty()) { |
| 316 | group.put("classRef", classRefs); |
| 317 | } |
| Joachim Bingel | 9c3ddb9 | 2014-06-23 13:49:58 +0000 | [diff] [blame] | 318 | return group; |
| 319 | } |
| 320 | |
| Joachim Bingel | 571c420 | 2014-07-08 14:07:19 +0000 | [diff] [blame] | 321 | protected LinkedHashMap<String, Object> makeReference(ArrayList<Integer> classRefs) { |
| 322 | return makeReference(classRefs, "focus"); |
| 323 | } |
| 324 | |
| Joachim Bingel | 755ada9 | 2014-12-16 13:55:37 +0000 | [diff] [blame] | 325 | protected LinkedHashMap<String, Object> makeReference(int classRef, String operation, boolean setBySystem) { |
| Joachim Bingel | 571c420 | 2014-07-08 14:07:19 +0000 | [diff] [blame] | 326 | ArrayList<Integer> classRefs = new ArrayList<Integer>(); |
| Joachim Bingel | 755ada9 | 2014-12-16 13:55:37 +0000 | [diff] [blame] | 327 | if (setBySystem) classRef = classRef+128; |
| Joachim Bingel | 571c420 | 2014-07-08 14:07:19 +0000 | [diff] [blame] | 328 | classRefs.add(classRef); |
| 329 | return makeReference(classRefs, operation); |
| 330 | } |
| 331 | |
| Joachim Bingel | 755ada9 | 2014-12-16 13:55:37 +0000 | [diff] [blame] | 332 | protected LinkedHashMap<String, Object> makeReference(int classRef, boolean setBySystem) { |
| Joachim Bingel | fb9d5fd | 2014-06-25 09:32:43 +0000 | [diff] [blame] | 333 | ArrayList<Integer> classRefs = new ArrayList<Integer>(); |
| Joachim Bingel | 755ada9 | 2014-12-16 13:55:37 +0000 | [diff] [blame] | 334 | if (setBySystem) classRef = classRef+128; |
| Joachim Bingel | fb9d5fd | 2014-06-25 09:32:43 +0000 | [diff] [blame] | 335 | classRefs.add(classRef); |
| Joachim Bingel | 571c420 | 2014-07-08 14:07:19 +0000 | [diff] [blame] | 336 | return makeReference(classRefs, "focus"); |
| Joachim Bingel | fb9d5fd | 2014-06-25 09:32:43 +0000 | [diff] [blame] | 337 | } |
| 338 | |
| Joachim Bingel | 755ada9 | 2014-12-16 13:55:37 +0000 | [diff] [blame] | 339 | protected LinkedHashMap<String, Object> makeReference(int classRef) { |
| 340 | return makeReference(classRef, false); |
| 341 | } |
| 342 | |
| Joachim Bingel | 0973797 | 2014-09-22 09:43:06 +0000 | [diff] [blame] | 343 | 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 Bingel | 896067a | 2014-11-07 19:02:27 +0000 | [diff] [blame] | 352 | 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 Bingel | c8a28e4 | 2014-04-24 15:06:42 +0000 | [diff] [blame] | 361 | protected void addOperandsToGroup(LinkedHashMap<String, Object> group) { |
| 362 | ArrayList<Object> operands = new ArrayList<Object>(); |
| 363 | group.put("operands", operands); |
| 364 | } |
| 365 | |
| Joachim Bingel | 571c420 | 2014-07-08 14:07:19 +0000 | [diff] [blame] | 366 | 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 Bingel | bd38636 | 2014-10-02 12:03:18 +0000 | [diff] [blame] | 376 | LinkedHashMap<String, Object> classGroup = makeSpanClass(classId, true); |
| Joachim Bingel | 571c420 | 2014-07-08 14:07:19 +0000 | [diff] [blame] | 377 | ((ArrayList<Object>) classGroup.get("operands")).add(group); |
| 378 | return classGroup; |
| 379 | } |
| 380 | |
| Joachim Bingel | aaabb72 | 2014-09-24 14:29:10 +0000 | [diff] [blame] | 381 | /** |
| 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 Bingel | 95e44fd | 2014-11-07 19:20:42 +0000 | [diff] [blame] | 391 | addWarning(warning); |
| Joachim Bingel | aaabb72 | 2014-09-24 14:29:10 +0000 | [diff] [blame] | 392 | log.warn("User warning: "+warning); |
| 393 | } |
| 394 | return number; |
| 395 | } |
| Joachim Bingel | 4b405f5 | 2013-11-15 15:29:30 +0000 | [diff] [blame] | 396 | } |