blob: 53a42f18f63c8af91b928d262dcd94d18ce38d20 [file] [log] [blame]
Eliza Margaretha269e5a62014-09-30 16:58:23 +00001package de.ids_mannheim.korap.search;
2
Nils Diewald67f54042014-09-27 14:53:38 +00003import java.util.*;
Nils Diewaldea28b622014-10-01 16:01:31 +00004import java.io.*;
Nils Diewald67f54042014-09-27 14:53:38 +00005
6import org.apache.lucene.search.spans.SpanQuery;
7
Nils Diewalda14ecd62015-02-26 21:00:20 +00008import de.ids_mannheim.korap.KrillIndex;
Nils Diewald0339d462015-02-26 14:53:56 +00009import de.ids_mannheim.korap.KrillQuery;
Nils Diewald884dbcf2015-02-27 17:02:28 +000010import de.ids_mannheim.korap.response.Result;
Nils Diewaldbbd39a52015-02-23 19:56:57 +000011import de.ids_mannheim.korap.Krill;
Nils Diewald392bcf32015-02-26 20:01:17 +000012import de.ids_mannheim.korap.response.Match;
Nils Diewald8904c1d2015-02-26 16:13:18 +000013import de.ids_mannheim.korap.query.QueryBuilder;
Nils Diewald67f54042014-09-27 14:53:38 +000014import de.ids_mannheim.korap.index.FieldDocument;
15
Nils Diewaldbe5943e2014-10-21 19:35:34 +000016import de.ids_mannheim.korap.util.QueryException;
17
Nils Diewald67f54042014-09-27 14:53:38 +000018import com.fasterxml.jackson.databind.ObjectMapper;
19import com.fasterxml.jackson.databind.JsonNode;
20
21import static de.ids_mannheim.korap.Test.*;
22
23import static org.junit.Assert.*;
24import org.junit.Test;
25import org.junit.Ignore;
26import org.junit.runner.RunWith;
27import org.junit.runners.JUnit4;
28
29@RunWith(JUnit4.class)
Nils Diewald884dbcf2015-02-27 17:02:28 +000030public class TestResult {
Nils Diewald67f54042014-09-27 14:53:38 +000031
32 @Test
Nils Diewaldbb33da22015-03-04 16:24:25 +000033 public void checkJSONResult () throws Exception {
Nils Diewalda14ecd62015-02-26 21:00:20 +000034 KrillIndex ki = new KrillIndex();
Nils Diewaldbbd39a52015-02-23 19:56:57 +000035 FieldDocument fd = new FieldDocument();
36 fd.addString("ID", "doc-1");
37 fd.addString("UID", "1");
Nils Diewaldbb33da22015-03-04 16:24:25 +000038 fd.addTV("base", "abab", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]"
39 + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]"
40 + "[(3-4)s:b|i:a|_3#3-4]");
Nils Diewaldbbd39a52015-02-23 19:56:57 +000041 ki.addDoc(fd);
42 fd = new FieldDocument();
43 fd.addString("ID", "doc-2");
44 fd.addString("UID", "2");
Nils Diewaldbb33da22015-03-04 16:24:25 +000045 fd.addTV("base", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
46 + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]");
Nils Diewaldbbd39a52015-02-23 19:56:57 +000047 ki.addDoc(fd);
Nils Diewald67f54042014-09-27 14:53:38 +000048
Nils Diewaldbbd39a52015-02-23 19:56:57 +000049 // Commit!
50 ki.commit();
Nils Diewald67f54042014-09-27 14:53:38 +000051
Nils Diewald8904c1d2015-02-26 16:13:18 +000052 QueryBuilder kq = new QueryBuilder("base");
Nils Diewaldbb33da22015-03-04 16:24:25 +000053 SpanQuery q = (SpanQuery) kq.or(kq._(1, kq.seg("s:a")))
54 .or(kq._(2, kq.seg("s:b"))).toQuery();
Nils Diewald884dbcf2015-02-27 17:02:28 +000055 Result kr = ki.search(q);
Nils Diewaldbbd39a52015-02-23 19:56:57 +000056 assertEquals((long) 7, kr.getTotalResults());
Nils Diewald67f54042014-09-27 14:53:38 +000057
Nils Diewaldbbd39a52015-02-23 19:56:57 +000058 ObjectMapper mapper = new ObjectMapper();
59 JsonNode res = mapper.readTree(kr.toJsonString());
Akrond504f212015-06-20 00:27:54 +020060 assertEquals(7, res.at("/meta/totalResults").asInt());
Nils Diewaldbbd39a52015-02-23 19:56:57 +000061 assertEquals("spanOr([{1: base:s:a}, {2: base:s:b}])",
Akrond504f212015-06-20 00:27:54 +020062 res.at("/meta/serialQuery").asText());
Nils Diewaldbbd39a52015-02-23 19:56:57 +000063 assertEquals(0, res.at("/startIndex").asInt());
Akrond504f212015-06-20 00:27:54 +020064 assertEquals(25, res.at("/meta/itemsPerPage").asInt());
65 assertEquals("token", res.at("/meta/context/left/0").asText());
66 assertEquals(6, res.at("/meta/context/left/1").asInt());
67 assertEquals("token", res.at("/meta/context/right/0").asText());
68 assertEquals(6, res.at("/meta/context/right/1").asInt());
Nils Diewald67f54042014-09-27 14:53:38 +000069
Nils Diewaldbbd39a52015-02-23 19:56:57 +000070 assertEquals("base", res.at("/matches/0/field").asText());
71 /*
72 Probably a Jackson bug
73 assertTrue(res.at("/matches/0/startMore").asBoolean());
74 assertTrue(res.at("/matches/0/endMore").asBoolean());
75 */
76 assertEquals(1, res.at("/matches/0/UID").asInt());
77 assertEquals("doc-1", res.at("/matches/0/docID").asText());
Akron7d45e6b2015-06-26 17:23:42 +020078 assertEquals("match-doc-1-p0-1(1)0-0", res.at("/matches/0/matchID")
79 .asText());
Nils Diewaldbb33da22015-03-04 16:24:25 +000080 assertEquals(
81 "<span class=\"context-left\"></span><mark><mark class=\"class-1 level-0\">a</mark></mark><span class=\"context-right\">bab</span>",
82 res.at("/matches/0/snippet").asText());
Nils Diewald67f54042014-09-27 14:53:38 +000083
Nils Diewaldbbd39a52015-02-23 19:56:57 +000084 assertEquals("base", res.at("/matches/6/field").asText());
85 /*
86 Probably a Jackson bug
87 assertEquals(true, res.at("/matches/6/startMore").asBoolean());
88 assertEquals(true, res.at("/matches/6/endMore").asBoolean());
89 */
90 assertEquals(2, res.at("/matches/6/UID").asInt());
91 assertEquals("doc-2", res.at("/matches/6/docID").asText());
Akron7d45e6b2015-06-26 17:23:42 +020092 assertEquals("match-doc-2-p2-3(1)2-2", res.at("/matches/6/matchID")
93 .asText());
Nils Diewaldbb33da22015-03-04 16:24:25 +000094 assertEquals(
95 "<span class=\"context-left\">ab</span><mark><mark class=\"class-1 level-0\">a</mark></mark><span class=\"context-right\"></span>",
96 res.at("/matches/6/snippet").asText());
Nils Diewald67f54042014-09-27 14:53:38 +000097 };
Nils Diewaldea28b622014-10-01 16:01:31 +000098
Nils Diewaldbb33da22015-03-04 16:24:25 +000099
Nils Diewaldea28b622014-10-01 16:01:31 +0000100 @Test
Nils Diewaldbb33da22015-03-04 16:24:25 +0000101 public void checkJSONResultWarningBug () throws Exception {
Nils Diewalda14ecd62015-02-26 21:00:20 +0000102 KrillIndex ki = new KrillIndex();
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000103 FieldDocument fd = new FieldDocument();
104 fd.addString("ID", "doc-1");
105 fd.addString("UID", "1");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000106 fd.addTV("tokens", "abab", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]"
107 + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]"
108 + "[(3-4)s:b|i:a|_3#3-4]");
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000109 ki.addDoc(fd);
110 ki.commit();
Nils Diewald886d3212014-11-14 01:27:23 +0000111
Nils Diewaldbb33da22015-03-04 16:24:25 +0000112 String json = getString(getClass().getResource(
113 "/queries/bugs/optionality_warning.jsonld").getFile());
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000114 Krill ks = new Krill(json);
Nils Diewald886d3212014-11-14 01:27:23 +0000115
Nils Diewald884dbcf2015-02-27 17:02:28 +0000116 Result kr = ks.apply(ki);
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000117 assertEquals((long) 2, kr.getTotalResults());
Nils Diewald886d3212014-11-14 01:27:23 +0000118
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000119 ObjectMapper mapper = new ObjectMapper();
120 JsonNode res = mapper.readTree(kr.toJsonString());
Nils Diewald886d3212014-11-14 01:27:23 +0000121
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000122 // Old:
123 // assertEquals("Optionality of query is ignored", res.at("/warning").asText());
Nils Diewaldbb33da22015-03-04 16:24:25 +0000124 assertEquals("Optionality of query is ignored", res.at("/warnings/0/1")
125 .asText());
Nils Diewald886d3212014-11-14 01:27:23 +0000126 };
127
128
129 @Test
Nils Diewaldbb33da22015-03-04 16:24:25 +0000130 public void checkJSONResultForJSONInput () throws Exception {
Nils Diewalda14ecd62015-02-26 21:00:20 +0000131 KrillIndex ki = new KrillIndex();
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000132 FieldDocument fd = new FieldDocument();
133 fd.addString("ID", "doc-1");
134 fd.addString("UID", "1");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000135 fd.addTV("tokens", "abab", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]"
136 + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]"
137 + "[(3-4)s:b|i:a|_3#3-4]");
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000138 ki.addDoc(fd);
139 fd = new FieldDocument();
140 fd.addString("ID", "doc-2");
141 fd.addString("UID", "2");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000142 fd.addTV("tokens", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
143 + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]");
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000144 ki.addDoc(fd);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000145
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000146 // Commit!
147 ki.commit();
Nils Diewaldea28b622014-10-01 16:01:31 +0000148
Nils Diewaldbb33da22015-03-04 16:24:25 +0000149 String json = getString(getClass().getResource(
150 "/queries/bsp-result-check.jsonld").getFile());
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000151 Krill ks = new Krill(json);
Nils Diewald884dbcf2015-02-27 17:02:28 +0000152 Result kr = ks.apply(ki);
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000153 assertEquals((long) 7, kr.getTotalResults());
Akronbb5d1732015-06-22 01:22:40 +0200154
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000155 ObjectMapper mapper = new ObjectMapper();
156 JsonNode res = mapper.readTree(kr.toJsonString());
Nils Diewaldea28b622014-10-01 16:01:31 +0000157
Akrond504f212015-06-20 00:27:54 +0200158 assertEquals(7, res.at("/meta/totalResults").asInt());
Akronbb5d1732015-06-22 01:22:40 +0200159 assertEquals("spanOr([tokens:s:a, tokens:s:b])",
160 res.at("/meta/serialQuery").asText());
Akrond504f212015-06-20 00:27:54 +0200161 assertEquals(5, res.at("/meta/itemsPerPage").asInt());
162 assertEquals(0, res.at("/meta/startIndex").asInt());
163
164 // Request meta
Akronb1166442015-06-27 00:34:19 +0200165 // assertEquals(1, res.at("/meta/startPage").asInt());
166 assertEquals(5, res.at("/meta/count").asInt());
167 assertEquals("token", res.at("/meta/context/left/0").asText());
168 assertEquals(3, res.at("/meta/context/left/1").asInt());
169 assertEquals("char", res.at("/meta/context/right/0").asText());
170 assertEquals(6, res.at("/meta/context/right/1").asInt());
Akrond504f212015-06-20 00:27:54 +0200171 assertEquals("token", res.at("/meta/context/left/0").asText());
172 assertEquals(3, res.at("/meta/context/left/1").asInt());
173 assertEquals("char", res.at("/meta/context/right/0").asText());
174 assertEquals(6, res.at("/meta/context/right/1").asInt());
Nils Diewaldea28b622014-10-01 16:01:31 +0000175
Akrond504f212015-06-20 00:27:54 +0200176 // Query
177 assertEquals("koral:group", res.at("/query/@type").asText());
Akronbb5d1732015-06-22 01:22:40 +0200178 assertEquals("operation:or", res.at("/query/operation").asText());
Nils Diewaldea28b622014-10-01 16:01:31 +0000179
Akronbb5d1732015-06-22 01:22:40 +0200180 assertEquals("koral:token", res.at("/query/operands/0/@type").asText());
181 assertEquals("koral:term", res.at("/query/operands/0/wrap/@type")
Nils Diewaldbb33da22015-03-04 16:24:25 +0000182 .asText());
Akronbb5d1732015-06-22 01:22:40 +0200183 assertEquals("orth", res.at("/query/operands/0/wrap/layer").asText());
Akrond504f212015-06-20 00:27:54 +0200184 assertEquals("a", res.at("/query/operands/0/wrap/key").asText());
185 assertEquals("match:eq", res.at("/query/operands/0/wrap/match")
Nils Diewaldbb33da22015-03-04 16:24:25 +0000186 .asText());
Akronbb5d1732015-06-22 01:22:40 +0200187 assertEquals("koral:token", res.at("/query/operands/1/@type").asText());
188 assertEquals("koral:term", res.at("/query/operands/1/wrap/@type")
Nils Diewaldbb33da22015-03-04 16:24:25 +0000189 .asText());
Akronbb5d1732015-06-22 01:22:40 +0200190 assertEquals("orth", res.at("/query/operands/1/wrap/layer").asText());
Akrond504f212015-06-20 00:27:54 +0200191 assertEquals("b", res.at("/query/operands/1/wrap/key").asText());
192 assertEquals("match:eq", res.at("/query/operands/1/wrap/match")
Nils Diewaldbb33da22015-03-04 16:24:25 +0000193 .asText());
Nils Diewaldea28b622014-10-01 16:01:31 +0000194
Akrond504f212015-06-20 00:27:54 +0200195 // Matches
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000196 assertEquals(1, res.at("/matches/0/UID").asInt());
197 assertEquals("doc-1", res.at("/matches/0/docID").asText());
Akron48937e92015-06-26 01:49:02 +0200198 assertEquals("match-doc-1-p0-1", res.at("/matches/0/matchID").asText());
Nils Diewaldbb33da22015-03-04 16:24:25 +0000199 assertEquals(
200 "<span class=\"context-left\"></span><mark>a</mark><span class=\"context-right\">bab</span>",
201 res.at("/matches/0/snippet").asText());
Akrond504f212015-06-20 00:27:54 +0200202
203 // No primaryData serialization
204 assertTrue(res.at("/matches/0/primaryData").isMissingNode());
Nils Diewaldea28b622014-10-01 16:01:31 +0000205 };
206
Nils Diewaldbb33da22015-03-04 16:24:25 +0000207
Nils Diewald277e9ce2014-11-06 03:42:11 +0000208 @Test
Nils Diewaldbb33da22015-03-04 16:24:25 +0000209 public void checkJSONTokenResult () throws Exception {
Nils Diewalda14ecd62015-02-26 21:00:20 +0000210 KrillIndex ki = new KrillIndex();
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000211 FieldDocument fd = new FieldDocument();
212 fd.addString("ID", "doc-1");
213 fd.addString("UID", "1");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000214 fd.addTV("base", "abab", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]"
215 + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]"
216 + "[(3-4)s:b|i:a|_3#3-4]");
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000217 ki.addDoc(fd);
218 fd = new FieldDocument();
219 fd.addString("ID", "doc-2");
220 fd.addString("UID", "2");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000221 fd.addTV("base", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
222 + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]");
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000223 ki.addDoc(fd);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000224
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000225 // Commit!
226 ki.commit();
Nils Diewald277e9ce2014-11-06 03:42:11 +0000227
Nils Diewald8904c1d2015-02-26 16:13:18 +0000228 QueryBuilder kq = new QueryBuilder("base");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000229 SpanQuery q = (SpanQuery) kq.seq(kq.seg("s:a")).append(kq.seg("s:b"))
230 .toQuery();
Nils Diewald884dbcf2015-02-27 17:02:28 +0000231 Result kr = ki.search(q);
Nils Diewald277e9ce2014-11-06 03:42:11 +0000232
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000233 assertEquals((long) 3, kr.getTotalResults());
234 ObjectMapper mapper = new ObjectMapper();
235 JsonNode res = mapper.readTree(kr.toTokenListJsonString());
Akrond504f212015-06-20 00:27:54 +0200236
237 assertEquals(3, res.at("/meta/totalResults").asInt());
Akronbb5d1732015-06-22 01:22:40 +0200238 assertEquals("spanNext(base:s:a, base:s:b)", res
239 .at("/meta/serialQuery").asText());
Akrond504f212015-06-20 00:27:54 +0200240 assertEquals(0, res.at("/meta/startIndex").asInt());
241 assertEquals(25, res.at("/meta/itemsPerPage").asInt());
Nils Diewald277e9ce2014-11-06 03:42:11 +0000242
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000243 assertEquals("doc-1", res.at("/matches/0/textSigle").asText());
244 assertEquals(0, res.at("/matches/0/tokens/0/0").asInt());
245 assertEquals(1, res.at("/matches/0/tokens/0/1").asInt());
246 assertEquals(1, res.at("/matches/0/tokens/1/0").asInt());
247 assertEquals(2, res.at("/matches/0/tokens/1/1").asInt());
Nils Diewald277e9ce2014-11-06 03:42:11 +0000248
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000249 assertEquals("doc-1", res.at("/matches/1/textSigle").asText());
250 assertEquals(2, res.at("/matches/1/tokens/0/0").asInt());
251 assertEquals(3, res.at("/matches/1/tokens/0/1").asInt());
252 assertEquals(3, res.at("/matches/1/tokens/1/0").asInt());
253 assertEquals(4, res.at("/matches/1/tokens/1/1").asInt());
Nils Diewald277e9ce2014-11-06 03:42:11 +0000254
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000255 assertEquals("doc-2", res.at("/matches/2/textSigle").asText());
256 assertEquals(0, res.at("/matches/2/tokens/0/0").asInt());
257 assertEquals(1, res.at("/matches/2/tokens/0/1").asInt());
258 assertEquals(1, res.at("/matches/2/tokens/1/0").asInt());
259 assertEquals(2, res.at("/matches/2/tokens/1/1").asInt());
Nils Diewald277e9ce2014-11-06 03:42:11 +0000260 };
Nils Diewaldbb33da22015-03-04 16:24:25 +0000261
262
Nils Diewaldea28b622014-10-01 16:01:31 +0000263 public static String getString (String path) {
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000264 StringBuilder contentBuilder = new StringBuilder();
265 try {
266 BufferedReader in = new BufferedReader(new FileReader(path));
267 String str;
268 while ((str = in.readLine()) != null) {
269 contentBuilder.append(str);
270 };
271 in.close();
Nils Diewaldbb33da22015-03-04 16:24:25 +0000272 }
273 catch (IOException e) {
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000274 fail(e.getMessage());
275 }
276 return contentBuilder.toString();
Nils Diewaldea28b622014-10-01 16:01:31 +0000277 };
Nils Diewald67f54042014-09-27 14:53:38 +0000278};