blob: 0d998990c1250b162548a8c1cc7c62b3c36dc41a [file] [log] [blame]
Eliza Margaretha7788a982014-08-29 16:10:52 +00001package de.ids_mannheim.korap.query;
2
Nils Diewald6d50c1f2013-12-04 20:14:08 +00003import java.util.*;
4import java.io.*;
5
6import org.apache.lucene.search.spans.SpanQuery;
7import de.ids_mannheim.korap.query.wrap.SpanQueryWrapperInterface;
8
9import de.ids_mannheim.korap.KorapQuery;
10import de.ids_mannheim.korap.util.QueryException;
11
12import static org.junit.Assert.*;
13import org.junit.Test;
14import org.junit.Ignore;
15import org.junit.runner.RunWith;
16import org.junit.runners.JUnit4;
17
18@RunWith(JUnit4.class)
19public class TestKorapQueryJSON {
20
Nils Diewaldc6b78752013-12-05 19:05:12 +000021 private String defaultFoundry = "mate/";
22
Nils Diewald1455e1e2014-08-01 16:12:43 +000023 @Test
Nils Diewald6d50c1f2013-12-04 20:14:08 +000024 public void queryJSONBsp1 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +000025 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp1.jsonld").getFile());
Nils Diewald6d50c1f2013-12-04 20:14:08 +000026
Nils Diewald1455e1e2014-08-01 16:12:43 +000027 // There is a repetition in here
Nils Diewald6d50c1f2013-12-04 20:14:08 +000028 // ([base=foo]|[base=bar])[base=foobar]
Nils Diewald1455e1e2014-08-01 16:12:43 +000029 assertEquals(sqwi.toQuery().toString(),
Eliza Margaretha7788a982014-08-29 16:10:52 +000030 "spanOr([tokens:base:foo, spanRepetition(spanNext(tokens:base:foo, tokens:base:bar){1,100})])");
Nils Diewald1455e1e2014-08-01 16:12:43 +000031 assertTrue(sqwi.isOptional());
Nils Diewald6d50c1f2013-12-04 20:14:08 +000032 };
33
34 @Test
35 public void queryJSONBsp1b () {
36
Nils Diewaldc86aa482014-02-12 16:58:05 +000037 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp1b.jsonld").getFile());
Nils Diewald6d50c1f2013-12-04 20:14:08 +000038
39 // [base=foo]|([base=foo][base=bar]) meta author=Goethe&year=1815
Nils Diewaldc6b78752013-12-05 19:05:12 +000040 assertEquals(sqwi.toQuery().toString(), "spanOr([tokens:"+defaultFoundry+"l:foo, spanNext(tokens:"+defaultFoundry+"l:foo, tokens:"+defaultFoundry+"l:bar)])");
Nils Diewald6d50c1f2013-12-04 20:14:08 +000041 };
42
43
44 @Test
45 public void queryJSONBsp2 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +000046 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp2.jsonld").getFile());
Nils Diewald6d50c1f2013-12-04 20:14:08 +000047
48 // ([base=foo]|[base=bar])[base=foobar]
Nils Diewaldc6b78752013-12-05 19:05:12 +000049 assertEquals(sqwi.toQuery().toString(), "spanNext(spanOr([tokens:"+defaultFoundry+"l:foo, tokens:"+defaultFoundry+"l:bar]), tokens:"+defaultFoundry+"l:foobar)");
Nils Diewald6d50c1f2013-12-04 20:14:08 +000050 };
51
52 @Test
53 public void queryJSONBsp3 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +000054 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp3.jsonld").getFile());
Nils Diewald6d50c1f2013-12-04 20:14:08 +000055
56 // shrink({[base=Mann]})
Nils Diewaldc6b78752013-12-05 19:05:12 +000057 assertEquals(sqwi.toQuery().toString(), "shrink(0: {0: tokens:"+defaultFoundry+"l:Mann})");
Nils Diewald6d50c1f2013-12-04 20:14:08 +000058 };
59
60 @Test
61 public void queryJSONBsp4 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +000062 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp4.jsonld").getFile());
Nils Diewald6d50c1f2013-12-04 20:14:08 +000063
64 // shrink({[base=foo]}[orth=bar])
Nils Diewaldc6b78752013-12-05 19:05:12 +000065 assertEquals(sqwi.toQuery().toString(), "shrink(0: spanNext({0: tokens:"+defaultFoundry+"l:foo}, tokens:s:bar))");
Nils Diewald6d50c1f2013-12-04 20:14:08 +000066 };
67
68 @Test
69 public void queryJSONBsp5 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +000070 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp5.jsonld").getFile());
Nils Diewald6d50c1f2013-12-04 20:14:08 +000071
72 // shrink(1:[base=Der]{1:[base=Mann]})
Nils Diewaldc6b78752013-12-05 19:05:12 +000073 assertEquals(sqwi.toQuery().toString(), "shrink(1: spanNext(tokens:"+defaultFoundry+"l:Der, {1: tokens:"+defaultFoundry+"l:Mann}))");
Nils Diewald6d50c1f2013-12-04 20:14:08 +000074 };
75
76 @Test
77 public void queryJSONBsp6 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +000078 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp6.jsonld").getFile());
Nils Diewald6d50c1f2013-12-04 20:14:08 +000079
80 // [base=katze]
Nils Diewaldc6b78752013-12-05 19:05:12 +000081 assertEquals(sqwi.toQuery().toString(), "tokens:"+defaultFoundry+"l:Katze");
Nils Diewald6d50c1f2013-12-04 20:14:08 +000082 };
83
Nils Diewald1455e1e2014-08-01 16:12:43 +000084 @Test
Nils Diewald6d50c1f2013-12-04 20:14:08 +000085 public void queryJSONBsp7 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +000086 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp7.jsonld").getFile());
Nils Diewald6d50c1f2013-12-04 20:14:08 +000087
88 // [!base=Katze]
Nils Diewaldcc7c0b32014-07-31 19:58:22 +000089 assertEquals("tokens:mate/l:Katze", sqwi.toQuery().toString());
90 assertTrue(sqwi.isNegative());
Nils Diewald6d50c1f2013-12-04 20:14:08 +000091 };
92
Nils Diewald6d50c1f2013-12-04 20:14:08 +000093 @Test
94 public void queryJSONBsp9 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +000095 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp9.jsonld").getFile());
Nils Diewald6d50c1f2013-12-04 20:14:08 +000096
97 // [base=Katze&orth=Katzen]
Nils Diewald97b66382014-02-11 00:32:23 +000098 assertEquals(sqwi.toQuery().toString(), "spanSegment(tokens:"+defaultFoundry+"l:Katze, tokens:s:Katzen)");
Nils Diewald4d183ea2013-12-05 02:51:38 +000099 };
100
101 @Test
Nils Diewald8c543432014-02-27 18:25:38 +0000102 public void queryJSONBsp9b () {
103 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp9b.jsonld").getFile());
104
105 // [base=Katze&orth=Katzen]
106 assertEquals(sqwi.toQuery().toString(), "spanSegment(tokens:mate/m:number:pl, tokens:tt/p:NN)");
107 };
108
109
110 @Test
Nils Diewald4d183ea2013-12-05 02:51:38 +0000111 public void queryJSONBsp10 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +0000112 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp10.jsonld").getFile());
Nils Diewald4d183ea2013-12-05 02:51:38 +0000113
114 // [base=Katze][orth=und][orth=Hunde]
Nils Diewaldc6b78752013-12-05 19:05:12 +0000115 assertEquals(sqwi.toQuery().toString(), "spanNext(spanNext(tokens:"+defaultFoundry+"l:Katze, tokens:s:und), tokens:s:Hunde)");
Nils Diewald4d183ea2013-12-05 02:51:38 +0000116 };
117
Nils Diewald1455e1e2014-08-01 16:12:43 +0000118 @Test
Nils Diewald4d183ea2013-12-05 02:51:38 +0000119 public void queryJSONBsp11 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +0000120 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp11.jsonld").getFile());
Nils Diewald4d183ea2013-12-05 02:51:38 +0000121
Nils Diewald1455e1e2014-08-01 16:12:43 +0000122 // [base!=Katze | orth!=Katzen]
123 /*
124 Imagine a([^b]|[^c])d
125 Matches abd and acd
126 Interpretation would be not(spanAnd(...))
127 */
128 assertEquals(sqwi.toQuery().toString(), "spanOr([tokens:mate/l:Katze, tokens:s:Katzen])");
129 assertTrue(sqwi.isNegative());
Nils Diewald6d50c1f2013-12-04 20:14:08 +0000130 };
Nils Diewald4d183ea2013-12-05 02:51:38 +0000131
132 @Test
133 public void queryJSONBsp12 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +0000134 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp12.jsonld").getFile());
Nils Diewald4d183ea2013-12-05 02:51:38 +0000135
136 // contains(<np>,[base=Mann])
Nils Diewald6802acd2014-03-18 18:29:30 +0000137 assertEquals(sqwi.toQuery().toString(), "spanContain(<tokens:np />, tokens:"+defaultFoundry+"l:Mann)");
Nils Diewald4d183ea2013-12-05 02:51:38 +0000138 };
139
Nils Diewald1455e1e2014-08-01 16:12:43 +0000140 @Test
Nils Diewald4d183ea2013-12-05 02:51:38 +0000141 public void queryJSONBsp13 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +0000142 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp13.jsonld").getFile());
Nils Diewald4d183ea2013-12-05 02:51:38 +0000143
Nils Diewald1455e1e2014-08-01 16:12:43 +0000144 assertEquals(sqwi.toQuery().toString(), "spanStartsWith(<tokens:np />, tokens:mate/p:Det)");
Nils Diewald4d183ea2013-12-05 02:51:38 +0000145 };
146
147 @Test
148 public void queryJSONBsp13b () {
Nils Diewaldc86aa482014-02-12 16:58:05 +0000149 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp13b.jsonld").getFile());
Nils Diewald4d183ea2013-12-05 02:51:38 +0000150
Nils Diewaldc86aa482014-02-12 16:58:05 +0000151 // startswith(<np>,[pos=Det])
Nils Diewald6802acd2014-03-18 18:29:30 +0000152 assertEquals(sqwi.toQuery().toString(), "spanStartsWith(<tokens:np />, tokens:mate/p:Det)");
Nils Diewald4d183ea2013-12-05 02:51:38 +0000153 };
154
Nils Diewald26087ea2013-12-05 16:51:30 +0000155 @Test
Nils Diewald4d183ea2013-12-05 02:51:38 +0000156 public void queryJSONBsp14 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +0000157 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp14.jsonld").getFile());
Nils Diewald4d183ea2013-12-05 02:51:38 +0000158
159 // 'vers{2,3}uch'
Nils Diewald26087ea2013-12-05 16:51:30 +0000160 assertEquals(sqwi.toQuery().toString(), "SpanMultiTermQueryWrapper(tokens:/s:vers{2,3}uch/)");
Nils Diewald4d183ea2013-12-05 02:51:38 +0000161 };
162
Nils Diewald26087ea2013-12-05 16:51:30 +0000163 @Test
164 public void queryJSONBsp15 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +0000165 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp15.jsonld").getFile());
Nils Diewald26087ea2013-12-05 16:51:30 +0000166
167 // [orth='vers.*ch']
168 assertEquals(sqwi.toQuery().toString(), "SpanMultiTermQueryWrapper(tokens:/s:vers.*ch/)");
169 };
170
171 @Test
172 public void queryJSONBsp16 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +0000173 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp16.jsonld").getFile());
Nils Diewald26087ea2013-12-05 16:51:30 +0000174
175 // [(base=bar|base=foo)&orth=foobar]
Nils Diewald97b66382014-02-11 00:32:23 +0000176 assertEquals(sqwi.toQuery().toString(), "spanSegment(spanOr([tokens:"+defaultFoundry+"l:bar, tokens:"+defaultFoundry+"l:foo]), tokens:s:foobar)");
Nils Diewald26087ea2013-12-05 16:51:30 +0000177 };
178
179 @Test
180 public void queryJSONBsp17 () {
Nils Diewaldc86aa482014-02-12 16:58:05 +0000181 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp17.jsonld").getFile());
Nils Diewald26087ea2013-12-05 16:51:30 +0000182
183 // within(<np>,[base=Mann])
Nils Diewald6802acd2014-03-18 18:29:30 +0000184 assertEquals(sqwi.toQuery().toString(), "spanContain(<tokens:np />, tokens:"+defaultFoundry+"l:Mann)");
Nils Diewald26087ea2013-12-05 16:51:30 +0000185 };
Nils Diewald6d50c1f2013-12-04 20:14:08 +0000186
Nils Diewald9cc86fe2013-12-07 17:45:59 +0000187 @Test
188 public void queryJSONDemo () throws QueryException {
Nils Diewaldc86aa482014-02-12 16:58:05 +0000189 SpanQueryWrapperInterface sqwi = new KorapQuery("tokens").fromJSON("{ \"query\" : { \"@type\" : \"korap:token\", \"wrap\" : { \"@type\" : \"korap:term\", \"foundry\" : \"base\", \"layer\" : \"p\", \"key\" : \"foo\", \"match\" : \"match:eq\" }}}");
Nils Diewald9cc86fe2013-12-07 17:45:59 +0000190
191 assertEquals(sqwi.toQuery().toString(), "tokens:base/p:foo");
192 };
193
Nils Diewald630811f2013-12-11 16:40:28 +0000194 @Test
195 public void queryJSONBspClass () {
Nils Diewaldc86aa482014-02-12 16:58:05 +0000196 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp-class.jsonld").getFile());
Nils Diewald630811f2013-12-11 16:40:28 +0000197
198 // within(<np>,[base=Mann])
199 assertEquals(sqwi.toQuery().toString(), "{0: spanNext(tokens:tt/p:ADJA, tokens:mate/p:NN)}");
200 };
201
Nils Diewald9cc86fe2013-12-07 17:45:59 +0000202
Nils Diewald164f8be2014-02-13 02:43:16 +0000203 @Test
204 public void queryJSONcosmas3 () {
205 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/cosmas3.json").getFile());
206
207 // "das /+w1:3 Buch"
Nils Diewald0f5a2792014-02-13 17:20:36 +0000208 assertEquals(sqwi.toQuery().toString(), "spanDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded)])");
Nils Diewald164f8be2014-02-13 02:43:16 +0000209 };
210
211 @Test
212 public void queryJSONcosmas4 () {
213 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/cosmas4.json").getFile());
214
Nils Diewalda1118032014-02-13 20:50:48 +0000215 // "das /+w1:3,s1:1 Buch"
Nils Diewald0f5a2792014-02-13 17:20:36 +0000216 assertEquals(sqwi.toQuery().toString(), "spanMultipleDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded), (s[1:1], ordered, notExcluded)])");
Nils Diewald164f8be2014-02-13 02:43:16 +0000217 };
218
219 @Test
Nils Diewalda1118032014-02-13 20:50:48 +0000220 public void queryJSONcosmas4b () {
221 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/cosmas4b.json").getFile());
222
223 // "das /+w1:3,s1 Buch"
224 assertEquals(sqwi.toQuery().toString(), "spanMultipleDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded), (s[0:1], ordered, notExcluded)])");
225 };
226
227 @Test
Nils Diewald164f8be2014-02-13 02:43:16 +0000228 public void queryJSONcosmas10 () {
229 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/cosmas10.json").getFile());
230
231 // "Institut für $deutsche Sprache"
232 assertEquals(sqwi.toQuery().toString(), "spanNext(spanNext(spanNext(tokens:s:Institut, tokens:s:für), tokens:i:deutsche), tokens:s:Sprache)");
233 };
234
235 @Test
236 public void queryJSONcosmas10b () {
237 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/cosmas10b.json").getFile());
238
239 // "Institut $FÜR $deutsche Sprache"
240 assertEquals(sqwi.toQuery().toString(), "spanNext(spanNext(spanNext(tokens:s:Institut, tokens:i:für), tokens:i:deutsche), tokens:s:Sprache)");
241 };
242
243 @Test
244 public void queryJSONcosmas16 () {
245 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/cosmas16.json").getFile());
246
247 // "$wegen #IN(L) <s>"
Nils Diewald6802acd2014-03-18 18:29:30 +0000248 assertEquals(sqwi.toQuery().toString(), "shrink(1: spanStartsWith(<tokens:s />, {1: tokens:i:wegen}))");
Nils Diewald164f8be2014-02-13 02:43:16 +0000249 };
250
251 @Test
252 public void queryJSONcosmas17 () {
253 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/cosmas17.json").getFile());
254
255 // "#BED($wegen , +sa)"
Nils Diewald6802acd2014-03-18 18:29:30 +0000256 assertEquals(sqwi.toQuery().toString(), "spanStartsWith(<tokens:s />, tokens:i:wegen)");
Nils Diewald164f8be2014-02-13 02:43:16 +0000257 };
258
259 @Test
260 public void queryJSONcosmas20 () {
261 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/cosmas20.json").getFile());
262
263 // "MORPH(V) #IN(R) #ELEM(S)"
264 // TODO: Uses defaultfoundry!
Nils Diewald6802acd2014-03-18 18:29:30 +0000265 assertEquals(sqwi.toQuery().toString(), "shrink(1: spanEndsWith(<tokens:s />, {1: tokens:mate/p:V}))");
Nils Diewald164f8be2014-02-13 02:43:16 +0000266 };
267
Nils Diewalddc8dc342014-07-25 13:38:50 +0000268
269 @Test
270 public void queryJSONrepetition () {
271 SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp-repetition.jsonld").getFile());
272
273 // der[cnx/p=A]{0,2}[tt/p=NN]
Eliza Margaretha7788a982014-08-29 16:10:52 +0000274 assertEquals(sqwi.toQuery().toString(), "spanNext(spanOr([tokens:s:der, spanNext(tokens:s:der, spanRepetition(tokens:cnx/p:A{1,2}))]), tokens:tt/p:NN)");
Nils Diewalddc8dc342014-07-25 13:38:50 +0000275 };
276
Nils Diewald6d50c1f2013-12-04 20:14:08 +0000277 public static String getString (String path) {
278 StringBuilder contentBuilder = new StringBuilder();
279 try {
280 BufferedReader in = new BufferedReader(new FileReader(path));
281 String str;
282 while ((str = in.readLine()) != null) {
283 contentBuilder.append(str);
284 };
285 in.close();
286 } catch (IOException e) {
287 fail(e.getMessage());
288 }
289 return contentBuilder.toString();
290 };
291
292 public static SpanQueryWrapperInterface jsonQuery (String jsonFile) {
293 SpanQueryWrapperInterface sqwi;
294
295 try {
296 String json = getString(jsonFile);
297 sqwi = new KorapQuery("tokens").fromJSON(json);
298 }
299 catch (QueryException e) {
300 fail(e.getMessage());
301 sqwi = new KorapQuery("tokens").seg("???");
302 };
303 return sqwi;
304 };
Nils Diewald4d183ea2013-12-05 02:51:38 +0000305};