blob: 506d246b6730d355a31fb85058453e2341f69429 [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.*;
Akron67d2ff02018-06-19 10:51:16 +02005import static de.ids_mannheim.korap.TestSimple.*;
Nils Diewald67f54042014-09-27 14:53:38 +00006
7import org.apache.lucene.search.spans.SpanQuery;
8
Nils Diewalda14ecd62015-02-26 21:00:20 +00009import de.ids_mannheim.korap.KrillIndex;
Nils Diewald0339d462015-02-26 14:53:56 +000010import de.ids_mannheim.korap.KrillQuery;
Nils Diewald884dbcf2015-02-27 17:02:28 +000011import de.ids_mannheim.korap.response.Result;
Nils Diewaldbbd39a52015-02-23 19:56:57 +000012import de.ids_mannheim.korap.Krill;
Nils Diewald392bcf32015-02-26 20:01:17 +000013import de.ids_mannheim.korap.response.Match;
Nils Diewald8904c1d2015-02-26 16:13:18 +000014import de.ids_mannheim.korap.query.QueryBuilder;
Nils Diewald67f54042014-09-27 14:53:38 +000015import de.ids_mannheim.korap.index.FieldDocument;
16
Nils Diewaldbe5943e2014-10-21 19:35:34 +000017import de.ids_mannheim.korap.util.QueryException;
18
Nils Diewald67f54042014-09-27 14:53:38 +000019import com.fasterxml.jackson.databind.ObjectMapper;
20import com.fasterxml.jackson.databind.JsonNode;
21
22import static de.ids_mannheim.korap.Test.*;
23
24import static org.junit.Assert.*;
25import org.junit.Test;
26import org.junit.Ignore;
27import org.junit.runner.RunWith;
28import org.junit.runners.JUnit4;
29
30@RunWith(JUnit4.class)
Nils Diewald884dbcf2015-02-27 17:02:28 +000031public class TestResult {
Nils Diewald67f54042014-09-27 14:53:38 +000032
33 @Test
Nils Diewaldbb33da22015-03-04 16:24:25 +000034 public void checkJSONResult () throws Exception {
Nils Diewalda14ecd62015-02-26 21:00:20 +000035 KrillIndex ki = new KrillIndex();
Nils Diewaldbbd39a52015-02-23 19:56:57 +000036 FieldDocument fd = new FieldDocument();
37 fd.addString("ID", "doc-1");
38 fd.addString("UID", "1");
Eliza Margaretha6f989202016-10-14 21:48:29 +020039 fd.addTV("base", "abab",
40 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" + "[(1-2)s:b|i:b|_1#1-2]"
41 + "[(2-3)s:a|i:c|_2#2-3]" + "[(3-4)s:b|i:a|_3#3-4]");
Nils Diewaldbbd39a52015-02-23 19:56:57 +000042 ki.addDoc(fd);
43 fd = new FieldDocument();
44 fd.addString("ID", "doc-2");
45 fd.addString("UID", "2");
Nils Diewaldbb33da22015-03-04 16:24:25 +000046 fd.addTV("base", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
47 + "[(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 +000048 ki.addDoc(fd);
Nils Diewald67f54042014-09-27 14:53:38 +000049
Nils Diewaldbbd39a52015-02-23 19:56:57 +000050 // Commit!
51 ki.commit();
Nils Diewald67f54042014-09-27 14:53:38 +000052
Nils Diewald8904c1d2015-02-26 16:13:18 +000053 QueryBuilder kq = new QueryBuilder("base");
Akron4f52a632018-02-09 19:02:40 +010054 SpanQuery q = (SpanQuery) kq.or(kq.nr(1, kq.seg("s:a")))
55 .or(kq.nr(2, kq.seg("s:b"))).toQuery();
Nils Diewald884dbcf2015-02-27 17:02:28 +000056 Result kr = ki.search(q);
Nils Diewaldbbd39a52015-02-23 19:56:57 +000057 assertEquals((long) 7, kr.getTotalResults());
Nils Diewald67f54042014-09-27 14:53:38 +000058
Nils Diewaldbbd39a52015-02-23 19:56:57 +000059 ObjectMapper mapper = new ObjectMapper();
60 JsonNode res = mapper.readTree(kr.toJsonString());
Akrond504f212015-06-20 00:27:54 +020061 assertEquals(7, res.at("/meta/totalResults").asInt());
Nils Diewaldbbd39a52015-02-23 19:56:57 +000062 assertEquals("spanOr([{1: base:s:a}, {2: base:s:b}])",
Akrond504f212015-06-20 00:27:54 +020063 res.at("/meta/serialQuery").asText());
Nils Diewaldbbd39a52015-02-23 19:56:57 +000064 assertEquals(0, res.at("/startIndex").asInt());
Akrond504f212015-06-20 00:27:54 +020065 assertEquals(25, res.at("/meta/itemsPerPage").asInt());
66 assertEquals("token", res.at("/meta/context/left/0").asText());
67 assertEquals(6, res.at("/meta/context/left/1").asInt());
68 assertEquals("token", res.at("/meta/context/right/0").asText());
69 assertEquals(6, res.at("/meta/context/right/1").asInt());
Nils Diewald67f54042014-09-27 14:53:38 +000070
Akrone64cc162019-01-08 18:40:37 +010071 // assertEquals("base", res.at("/matches/0/field").asText());
Nils Diewaldbbd39a52015-02-23 19:56:57 +000072 /*
73 Probably a Jackson bug
74 assertTrue(res.at("/matches/0/startMore").asBoolean());
75 assertTrue(res.at("/matches/0/endMore").asBoolean());
76 */
77 assertEquals(1, res.at("/matches/0/UID").asInt());
78 assertEquals("doc-1", res.at("/matches/0/docID").asText());
Eliza Margaretha6f989202016-10-14 21:48:29 +020079 assertEquals("match-doc-1-p0-1(1)0-0",
80 res.at("/matches/0/matchID").asText());
Nils Diewaldbb33da22015-03-04 16:24:25 +000081 assertEquals(
Akronf05fde62016-08-03 23:46:17 +020082 "<span class=\"context-left\"></span><span class=\"match\"><mark><mark class=\"class-1 level-0\">a</mark></mark></span><span class=\"context-right\">bab</span>",
Nils Diewaldbb33da22015-03-04 16:24:25 +000083 res.at("/matches/0/snippet").asText());
Nils Diewald67f54042014-09-27 14:53:38 +000084
Akrone64cc162019-01-08 18:40:37 +010085 // assertEquals("base", res.at("/matches/6/field").asText());
Nils Diewaldbbd39a52015-02-23 19:56:57 +000086 /*
87 Probably a Jackson bug
88 assertEquals(true, res.at("/matches/6/startMore").asBoolean());
89 assertEquals(true, res.at("/matches/6/endMore").asBoolean());
90 */
91 assertEquals(2, res.at("/matches/6/UID").asInt());
92 assertEquals("doc-2", res.at("/matches/6/docID").asText());
Eliza Margaretha6f989202016-10-14 21:48:29 +020093 assertEquals("match-doc-2-p2-3(1)2-2",
94 res.at("/matches/6/matchID").asText());
Nils Diewaldbb33da22015-03-04 16:24:25 +000095 assertEquals(
Akronf05fde62016-08-03 23:46:17 +020096 "<span class=\"context-left\">ab</span><span class=\"match\"><mark><mark class=\"class-1 level-0\">a</mark></mark></span><span class=\"context-right\"></span>",
Nils Diewaldbb33da22015-03-04 16:24:25 +000097 res.at("/matches/6/snippet").asText());
Nils Diewald67f54042014-09-27 14:53:38 +000098 };
Nils Diewaldea28b622014-10-01 16:01:31 +000099
Nils Diewaldbb33da22015-03-04 16:24:25 +0000100
Nils Diewaldea28b622014-10-01 16:01:31 +0000101 @Test
Nils Diewaldbb33da22015-03-04 16:24:25 +0000102 public void checkJSONResultWarningBug () throws Exception {
Nils Diewalda14ecd62015-02-26 21:00:20 +0000103 KrillIndex ki = new KrillIndex();
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000104 FieldDocument fd = new FieldDocument();
105 fd.addString("ID", "doc-1");
106 fd.addString("UID", "1");
Eliza Margaretha6f989202016-10-14 21:48:29 +0200107 fd.addTV("tokens", "abab",
108 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" + "[(1-2)s:b|i:b|_1#1-2]"
109 + "[(2-3)s:a|i:c|_2#2-3]" + "[(3-4)s:b|i:a|_3#3-4]");
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000110 ki.addDoc(fd);
111 ki.commit();
Nils Diewald886d3212014-11-14 01:27:23 +0000112
Akron67d2ff02018-06-19 10:51:16 +0200113 String json = getJsonString(getClass()
Eliza Margaretha6f989202016-10-14 21:48:29 +0200114 .getResource("/queries/bugs/optionality_warning.jsonld")
115 .getFile());
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000116 Krill ks = new Krill(json);
Nils Diewald886d3212014-11-14 01:27:23 +0000117
Nils Diewald884dbcf2015-02-27 17:02:28 +0000118 Result kr = ks.apply(ki);
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000119 assertEquals((long) 2, kr.getTotalResults());
Nils Diewald886d3212014-11-14 01:27:23 +0000120
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000121 ObjectMapper mapper = new ObjectMapper();
122 JsonNode res = mapper.readTree(kr.toJsonString());
Nils Diewald886d3212014-11-14 01:27:23 +0000123
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000124 // Old:
125 // assertEquals("Optionality of query is ignored", res.at("/warning").asText());
Eliza Margaretha6f989202016-10-14 21:48:29 +0200126 assertEquals("Optionality of query is ignored",
127 res.at("/warnings/0/1").asText());
Nils Diewald886d3212014-11-14 01:27:23 +0000128 };
129
130
131 @Test
Nils Diewaldbb33da22015-03-04 16:24:25 +0000132 public void checkJSONResultForJSONInput () throws Exception {
Nils Diewalda14ecd62015-02-26 21:00:20 +0000133 KrillIndex ki = new KrillIndex();
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000134 FieldDocument fd = new FieldDocument();
135 fd.addString("ID", "doc-1");
136 fd.addString("UID", "1");
Eliza Margaretha6f989202016-10-14 21:48:29 +0200137 fd.addTV("tokens", "abab",
138 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" + "[(1-2)s:b|i:b|_1#1-2]"
139 + "[(2-3)s:a|i:c|_2#2-3]" + "[(3-4)s:b|i:a|_3#3-4]");
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000140 ki.addDoc(fd);
141 fd = new FieldDocument();
142 fd.addString("ID", "doc-2");
143 fd.addString("UID", "2");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000144 fd.addTV("tokens", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
145 + "[(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 +0000146 ki.addDoc(fd);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000147
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000148 // Commit!
149 ki.commit();
Nils Diewaldea28b622014-10-01 16:01:31 +0000150
Akron67d2ff02018-06-19 10:51:16 +0200151 String json = getJsonString(getClass()
Eliza Margaretha6f989202016-10-14 21:48:29 +0200152 .getResource("/queries/bsp-result-check.jsonld").getFile());
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000153 Krill ks = new Krill(json);
Nils Diewald884dbcf2015-02-27 17:02:28 +0000154 Result kr = ks.apply(ki);
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000155 assertEquals((long) 7, kr.getTotalResults());
Akronbb5d1732015-06-22 01:22:40 +0200156
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000157 ObjectMapper mapper = new ObjectMapper();
158 JsonNode res = mapper.readTree(kr.toJsonString());
Nils Diewaldea28b622014-10-01 16:01:31 +0000159
Akrond504f212015-06-20 00:27:54 +0200160 assertEquals(7, res.at("/meta/totalResults").asInt());
Akronbb5d1732015-06-22 01:22:40 +0200161 assertEquals("spanOr([tokens:s:a, tokens:s:b])",
162 res.at("/meta/serialQuery").asText());
Akrond504f212015-06-20 00:27:54 +0200163 assertEquals(5, res.at("/meta/itemsPerPage").asInt());
164 assertEquals(0, res.at("/meta/startIndex").asInt());
165
166 // Request meta
Akronb1166442015-06-27 00:34:19 +0200167 // assertEquals(1, res.at("/meta/startPage").asInt());
168 assertEquals(5, res.at("/meta/count").asInt());
169 assertEquals("token", res.at("/meta/context/left/0").asText());
170 assertEquals(3, res.at("/meta/context/left/1").asInt());
171 assertEquals("char", res.at("/meta/context/right/0").asText());
172 assertEquals(6, res.at("/meta/context/right/1").asInt());
Akrond504f212015-06-20 00:27:54 +0200173 assertEquals("token", res.at("/meta/context/left/0").asText());
174 assertEquals(3, res.at("/meta/context/left/1").asInt());
175 assertEquals("char", res.at("/meta/context/right/0").asText());
176 assertEquals(6, res.at("/meta/context/right/1").asInt());
Nils Diewaldea28b622014-10-01 16:01:31 +0000177
Akrond504f212015-06-20 00:27:54 +0200178 // Query
179 assertEquals("koral:group", res.at("/query/@type").asText());
Akronbb5d1732015-06-22 01:22:40 +0200180 assertEquals("operation:or", res.at("/query/operation").asText());
Nils Diewaldea28b622014-10-01 16:01:31 +0000181
Akronbb5d1732015-06-22 01:22:40 +0200182 assertEquals("koral:token", res.at("/query/operands/0/@type").asText());
Eliza Margaretha6f989202016-10-14 21:48:29 +0200183 assertEquals("koral:term",
184 res.at("/query/operands/0/wrap/@type").asText());
Akronbb5d1732015-06-22 01:22:40 +0200185 assertEquals("orth", res.at("/query/operands/0/wrap/layer").asText());
Akrond504f212015-06-20 00:27:54 +0200186 assertEquals("a", res.at("/query/operands/0/wrap/key").asText());
Eliza Margaretha6f989202016-10-14 21:48:29 +0200187 assertEquals("match:eq",
188 res.at("/query/operands/0/wrap/match").asText());
Akronbb5d1732015-06-22 01:22:40 +0200189 assertEquals("koral:token", res.at("/query/operands/1/@type").asText());
Eliza Margaretha6f989202016-10-14 21:48:29 +0200190 assertEquals("koral:term",
191 res.at("/query/operands/1/wrap/@type").asText());
Akronbb5d1732015-06-22 01:22:40 +0200192 assertEquals("orth", res.at("/query/operands/1/wrap/layer").asText());
Akrond504f212015-06-20 00:27:54 +0200193 assertEquals("b", res.at("/query/operands/1/wrap/key").asText());
Eliza Margaretha6f989202016-10-14 21:48:29 +0200194 assertEquals("match:eq",
195 res.at("/query/operands/1/wrap/match").asText());
Nils Diewaldea28b622014-10-01 16:01:31 +0000196
Akrond504f212015-06-20 00:27:54 +0200197 // Matches
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000198 assertEquals(1, res.at("/matches/0/UID").asInt());
199 assertEquals("doc-1", res.at("/matches/0/docID").asText());
Akron48937e92015-06-26 01:49:02 +0200200 assertEquals("match-doc-1-p0-1", res.at("/matches/0/matchID").asText());
Nils Diewaldbb33da22015-03-04 16:24:25 +0000201 assertEquals(
Akronf05fde62016-08-03 23:46:17 +0200202 "<span class=\"context-left\"></span><span class=\"match\"><mark>a</mark></span><span class=\"context-right\">bab</span>",
Nils Diewaldbb33da22015-03-04 16:24:25 +0000203 res.at("/matches/0/snippet").asText());
Akrond504f212015-06-20 00:27:54 +0200204
205 // No primaryData serialization
206 assertTrue(res.at("/matches/0/primaryData").isMissingNode());
Nils Diewaldea28b622014-10-01 16:01:31 +0000207 };
208
Nils Diewaldbb33da22015-03-04 16:24:25 +0000209
Nils Diewald277e9ce2014-11-06 03:42:11 +0000210 @Test
Nils Diewaldbb33da22015-03-04 16:24:25 +0000211 public void checkJSONTokenResult () throws Exception {
Nils Diewalda14ecd62015-02-26 21:00:20 +0000212 KrillIndex ki = new KrillIndex();
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000213 FieldDocument fd = new FieldDocument();
214 fd.addString("ID", "doc-1");
215 fd.addString("UID", "1");
Eliza Margaretha6f989202016-10-14 21:48:29 +0200216 fd.addTV("base", "abab",
217 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" + "[(1-2)s:b|i:b|_1#1-2]"
218 + "[(2-3)s:a|i:c|_2#2-3]" + "[(3-4)s:b|i:a|_3#3-4]");
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000219 ki.addDoc(fd);
220 fd = new FieldDocument();
221 fd.addString("ID", "doc-2");
222 fd.addString("UID", "2");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000223 fd.addTV("base", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
224 + "[(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 +0000225 ki.addDoc(fd);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000226
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000227 // Commit!
228 ki.commit();
Nils Diewald277e9ce2014-11-06 03:42:11 +0000229
Nils Diewald8904c1d2015-02-26 16:13:18 +0000230 QueryBuilder kq = new QueryBuilder("base");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000231 SpanQuery q = (SpanQuery) kq.seq(kq.seg("s:a")).append(kq.seg("s:b"))
232 .toQuery();
Nils Diewald884dbcf2015-02-27 17:02:28 +0000233 Result kr = ki.search(q);
Nils Diewald277e9ce2014-11-06 03:42:11 +0000234
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000235 assertEquals((long) 3, kr.getTotalResults());
236 ObjectMapper mapper = new ObjectMapper();
237 JsonNode res = mapper.readTree(kr.toTokenListJsonString());
Akrond504f212015-06-20 00:27:54 +0200238
239 assertEquals(3, res.at("/meta/totalResults").asInt());
Eliza Margaretha6f989202016-10-14 21:48:29 +0200240 assertEquals("spanNext(base:s:a, base:s:b)",
241 res.at("/meta/serialQuery").asText());
Akrond504f212015-06-20 00:27:54 +0200242 assertEquals(0, res.at("/meta/startIndex").asInt());
243 assertEquals(25, res.at("/meta/itemsPerPage").asInt());
Nils Diewald277e9ce2014-11-06 03:42:11 +0000244
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000245 assertEquals("doc-1", res.at("/matches/0/textSigle").asText());
246 assertEquals(0, res.at("/matches/0/tokens/0/0").asInt());
247 assertEquals(1, res.at("/matches/0/tokens/0/1").asInt());
248 assertEquals(1, res.at("/matches/0/tokens/1/0").asInt());
249 assertEquals(2, res.at("/matches/0/tokens/1/1").asInt());
Nils Diewald277e9ce2014-11-06 03:42:11 +0000250
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000251 assertEquals("doc-1", res.at("/matches/1/textSigle").asText());
252 assertEquals(2, res.at("/matches/1/tokens/0/0").asInt());
253 assertEquals(3, res.at("/matches/1/tokens/0/1").asInt());
254 assertEquals(3, res.at("/matches/1/tokens/1/0").asInt());
255 assertEquals(4, res.at("/matches/1/tokens/1/1").asInt());
Nils Diewald277e9ce2014-11-06 03:42:11 +0000256
Nils Diewaldbbd39a52015-02-23 19:56:57 +0000257 assertEquals("doc-2", res.at("/matches/2/textSigle").asText());
258 assertEquals(0, res.at("/matches/2/tokens/0/0").asInt());
259 assertEquals(1, res.at("/matches/2/tokens/0/1").asInt());
260 assertEquals(1, res.at("/matches/2/tokens/1/0").asInt());
261 assertEquals(2, res.at("/matches/2/tokens/1/1").asInt());
Nils Diewald277e9ce2014-11-06 03:42:11 +0000262 };
Nils Diewald67f54042014-09-27 14:53:38 +0000263};