blob: 18fd8f80c4efd1c52f43e1ab071ce55ac78e3ea2 [file] [log] [blame]
Eliza Margarethab0e91432014-01-28 15:26:31 +00001package de.ids_mannheim.korap.index;
2
3import static org.junit.Assert.assertEquals;
Eliza Margaretha40260542014-10-01 10:32:09 +00004import static org.junit.Assert.fail;
Eliza Margarethab0e91432014-01-28 15:26:31 +00005
Akronc12567c2016-06-03 00:40:52 +02006import java.util.*;
7import java.io.*;
Akron67d2ff02018-06-19 10:51:16 +02008import static de.ids_mannheim.korap.TestSimple.*;
Eliza Margarethab0e91432014-01-28 15:26:31 +00009
10import org.apache.lucene.index.Term;
margarethae3a166c2021-09-30 16:57:24 +020011import org.apache.lucene.search.spans.SpanOrQuery;
Eliza Margarethab0e91432014-01-28 15:26:31 +000012import org.apache.lucene.search.spans.SpanQuery;
13import org.apache.lucene.search.spans.SpanTermQuery;
14import org.junit.Test;
15import org.junit.runner.RunWith;
16import org.junit.runners.JUnit4;
17
Nils Diewalda14ecd62015-02-26 21:00:20 +000018import de.ids_mannheim.korap.KrillIndex;
Nils Diewald0339d462015-02-26 14:53:56 +000019import de.ids_mannheim.korap.KrillQuery;
Eliza Margarethad4693462014-03-17 13:16:18 +000020import de.ids_mannheim.korap.query.DistanceConstraint;
margaretha71c66ee2015-12-11 14:39:55 +010021import de.ids_mannheim.korap.query.QueryBuilder;
Eliza Margarethab0e91432014-01-28 15:26:31 +000022import de.ids_mannheim.korap.query.SpanDistanceQuery;
23import de.ids_mannheim.korap.query.SpanElementQuery;
Eliza Margarethafead2062014-01-28 16:34:09 +000024import de.ids_mannheim.korap.query.SpanNextQuery;
Nils Diewald92729ce2014-10-06 16:00:17 +000025import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper;
margarethac66265c2016-12-14 13:48:45 +010026import de.ids_mannheim.korap.response.Match;
margaretha71c66ee2015-12-11 14:39:55 +010027import de.ids_mannheim.korap.response.Result;
Eliza Margaretha40260542014-10-01 10:32:09 +000028import de.ids_mannheim.korap.util.QueryException;
Eliza Margarethab0e91432014-01-28 15:26:31 +000029
margarethac66265c2016-12-14 13:48:45 +010030/**
31 * @author margaretha
32 *
33 */
Eliza Margarethab0e91432014-01-28 15:26:31 +000034@RunWith(JUnit4.class)
Eliza Margaretha1751dbf2014-02-03 09:47:19 +000035public class TestElementDistanceIndex {
Nils Diewaldbb33da22015-03-04 16:24:25 +000036
37 Result kr;
38 KrillIndex ki;
39
Nils Diewaldbb33da22015-03-04 16:24:25 +000040 private FieldDocument createFieldDoc0 () {
41 FieldDocument fd = new FieldDocument();
Eliza Margarethab0e91432014-01-28 15:26:31 +000042 fd.addString("ID", "doc-0");
margarethaf420cb32023-02-14 17:49:33 +010043 fd.addTV("tokens", "bbcbbbc",
44 "[(0-1)s:b|s:c|_0$<i>0<i>1|<>:s$<b>64<i>0<i>2<i>1<b>0]"
45 + "[(1-2)s:b|_1$<i>1<i>2]"
46 + "[(2-3)s:c|_2$<i>2<i>3|<>:s$<b>64<i>2<i>3<i>3<b>0]"
47 + "[(3-4)s:b|_3$<i>3<i>4|<>:s$<b>64<i>3<i>4<i>4<b>0]"
48 + "[(4-5)s:b|_4$<i>4<i>5|<>:s$<b>64<i>4<i>5<i>5<b>0]"
49 + "[(5-6)s:b|_5$<i>5<i>6]"
50 + "[(6-7)s:c|_6$<i>6<i>7|<>:s$<b>64<i>6<i>7<i>7<b>0]");
Eliza Margarethab0e91432014-01-28 15:26:31 +000051 return fd;
Nils Diewaldbb33da22015-03-04 16:24:25 +000052 }
53
Nils Diewaldbb33da22015-03-04 16:24:25 +000054 private FieldDocument createFieldDoc1 () {
55 FieldDocument fd = new FieldDocument();
Eliza Margarethab0e91432014-01-28 15:26:31 +000056 fd.addString("ID", "doc-1");
Eliza Margaretha6f989202016-10-14 21:48:29 +020057 fd.addTV("tokens", "ecebdc",
margarethaf420cb32023-02-14 17:49:33 +010058 "[(0-1)s:e|_0$<i>0<i>1|<>:base/s:t$<b>64<i>0<i>6<i>6<b>0|<>:s$<b>64<i>0<i>1<i>1<b>0]"
59 + "[(1-2)s:c|s:b|_1$<i>1<i>2|<>:s$<b>64<i>1<i>2<i>2<b>0]"
60 + "[(2-3)s:e|_2$<i>2<i>3|<>:s$<b>64<i>2<i>3<i>3<b>0]"
61 + "[(3-4)s:b|_3$<i>3<i>4|<>:s$<b>64<i>3<i>4<i>4<b>0]"
62 + "[(4-5)s:c|_4$<i>4<i>5|<>:s$<b>64<i>4<i>5<i>5<b>0]"
63 + "[(5-6)s:c|_5$<i>5<i>6|<>:s$<b>64<i>5<i>6<i>6<b>0]");
Eliza Margarethab0e91432014-01-28 15:26:31 +000064 return fd;
Nils Diewaldbb33da22015-03-04 16:24:25 +000065 }
66
Nils Diewaldbb33da22015-03-04 16:24:25 +000067 private FieldDocument createFieldDoc2 () {
68 FieldDocument fd = new FieldDocument();
Eliza Margaretha8f9934c2014-02-06 13:04:32 +000069 fd.addString("ID", "doc-2");
margaretha93d0d622017-01-04 14:53:33 +010070 fd.addTV("tokens", "bbbddd",
margarethaf420cb32023-02-14 17:49:33 +010071 "[(0-1)s:b|_0$<i>0<i>1|<>:p$<b>64<i>0<i>1<i>1<b>0]"
72 + "[(1-2)s:b|_1$<i>1<i>2]"
73 + "[(2-3)s:b|_2$<i>2<i>3|<>:p$<b>64<i>2<i>3<i>3<b>0]"
74 + "[(3-4)s:d|_3$<i>3<i>4|<>:p$<b>64<i>3<i>4<i>4<b>0]"
75 + "[(4-5)s:d|_4$<i>4<i>5|<>:p$<b>64<i>4<i>5<i>5<b>0]"
76 + "[(5-6)s:d|_5$<i>5<i>6]");
Eliza Margarethab0e91432014-01-28 15:26:31 +000077 return fd;
Nils Diewaldbb33da22015-03-04 16:24:25 +000078 }
79
Nils Diewaldbb33da22015-03-04 16:24:25 +000080 private FieldDocument createFieldDoc3 () {
81 FieldDocument fd = new FieldDocument();
Eliza Margaretha8f9934c2014-02-06 13:04:32 +000082 fd.addString("ID", "doc-3");
margaretha93d0d622017-01-04 14:53:33 +010083 fd.addTV("tokens", "bdbcdd",
margarethaf420cb32023-02-14 17:49:33 +010084 "[(0-1)s:b|_0$<i>0<i>1|<>:s$<b>64<i>0<i>2<i>2<b>0]"
85 + "[(1-2)s:d|_1$<i>1<i>2]"
86 + "[(2-3)s:b|_2$<i>2<i>3|<>:s$<b>64<i>2<i>3<i>3<b>0]"
87 + "[(3-4)s:c|_3$<i>3<i>4|<>:s$<b>64<i>3<i>5<i>5<b>0]"
88 + "[(4-5)s:d|_4$<i>4<i>5|<>:s$<b>64<i>4<i>5<i>5<b>0]"
89 + "[(5-6)s:d|_5$<i>5<i>6]");
Eliza Margarethafead2062014-01-28 16:34:09 +000090 return fd;
Nils Diewaldbb33da22015-03-04 16:24:25 +000091 }
margaretha9614d972019-07-17 15:05:32 +020092
margaretha4ad135c2017-01-12 12:49:44 +010093 private FieldDocument createFieldDoc4 () {
94 FieldDocument fd = new FieldDocument();
95 fd.addString("ID", "doc-4");
96 fd.addTV("tokens", "bdbcdd",
margarethaf420cb32023-02-14 17:49:33 +010097 "[(0-1)s:b|_0$<i>0<i>1|<>:s$<b>64<i>0<i>1<i>1<b>0]"
98 + "[(1-2)s:d|_1$<i>1<i>2]"
99 + "[(2-3)s:c|s:b|_2$<i>2<i>3|<>:s$<b>64<i>2<i>3<i>3<b>0]"
100 + "[(3-4)s:c|_3$<i>3<i>4|<>:s$<b>64<i>3<i>5<i>5<b>0]"
101 + "[(4-5)s:d|_4$<i>4<i>5|<>:s$<b>64<i>4<i>5<i>5<b>0]"
102 + "[(5-6)s:d|_5$<i>5<i>6]");
margaretha4ad135c2017-01-12 12:49:44 +0100103 return fd;
104 }
margarethae3a166c2021-09-30 16:57:24 +0200105
106 private FieldDocument createFieldDoc5 () {
107 FieldDocument fd = new FieldDocument();
108 fd.addString("ID", "doc-5");
109 fd.addTV("tokens", "edef",
margarethaf420cb32023-02-14 17:49:33 +0100110 "[(0-1)s:e|_0$<i>0<i>1]"
111 + "[(1-2)s:d|_1$<i>1<i>2]"
112 + "[(2-3)s:e|_2$<i>2<i>3]"
113 + "[(3-4)s:f|_3$<i>3<i>4]");
margarethae3a166c2021-09-30 16:57:24 +0200114 return fd;
115 }
margarethaf420cb32023-02-14 17:49:33 +0100116
117 private FieldDocument createFieldDoc6 () {
118 FieldDocument fd = new FieldDocument();
119 fd.addString("ID", "doc-6");
120 fd.addTV("tokens", "bebcee",
121 "[(0-1)s:b|_0$<i>0<i>1|<>:s$<b>64<i>0<i>4<i>4<b>0]"
122 + "[(1-2)s:e|_1$<i>1<i>2]"
123 + "[(2-3)s:b|_2$<i>2<i>3]"
124 + "[(3-4)s:c|_3$<i>3<i>4]"
125 + "[(4-5)s:e|_4$<i>4<i>5|<>:s$<b>64<i>4<i>6<i>6<b>0]"
126 + "[(5-6)s:e|_5$<i>5<i>6]");
127 return fd;
128 }
129
130 private FieldDocument createFieldDoc7 () {
131 FieldDocument fd = new FieldDocument();
132 fd.addString("ID", "doc-5");
133 fd.addTV("tokens", "beef",
134 "[(0-1)s:b|_0$<i>0<i>1|<>:s$<b>64<i>0<i>4<i>4<b>0]"
135 + "[(1-2)s:e|_1$<i>1<i>2]"
136 + "[(2-3)s:e|_2$<i>2<i>3]"
137 + "[(3-4)s:f|_3$<i>3<i>4]");
138 return fd;
139 }
140
Nils Diewaldbb33da22015-03-04 16:24:25 +0000141
Nils Diewaldbb33da22015-03-04 16:24:25 +0000142 public SpanQuery createQuery (String elementType, String x, String y,
143 int min, int max, boolean isOrdered) {
144
Akronc12567c2016-06-03 00:40:52 +0200145 SpanElementQuery e = new SpanElementQuery("tokens", elementType);
146 return new SpanDistanceQuery(new SpanTermQuery(new Term("tokens", x)),
147 new SpanTermQuery(new Term("tokens", y)),
148 new DistanceConstraint(e, min, max, isOrdered, false), true);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000149 }
150
Nils Diewaldbb33da22015-03-04 16:24:25 +0000151 /**
152 * Multiple documents
153 * Ensure terms and elements are in the same doc
154 * Ensure terms are in elements
155 * Check filter candidate list
Eliza Margaretha6f989202016-10-14 21:48:29 +0200156 */
Nils Diewaldbb33da22015-03-04 16:24:25 +0000157 @Test
158 public void testCase1 () throws IOException {
Nils Diewaldbb33da22015-03-04 16:24:25 +0000159 ki = new KrillIndex();
160 ki.addDoc(createFieldDoc0());
161 ki.addDoc(createFieldDoc1());
margaretha93d0d622017-01-04 14:53:33 +0100162 ki.addDoc(createFieldDoc3());
Eliza Margarethab0e91432014-01-28 15:26:31 +0000163 ki.commit();
Nils Diewaldbb33da22015-03-04 16:24:25 +0000164
165 SpanQuery sq;
margaretha93d0d622017-01-04 14:53:33 +0100166 sq = createQuery("s", "s:b", "s:c", 1, 1, true);
Akrond2926902016-02-13 18:37:36 +0100167
Eliza Margarethab0e91432014-01-28 15:26:31 +0000168 kr = ki.search(sq, (short) 10);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000169
margaretha93d0d622017-01-04 14:53:33 +0100170 assertEquals(4, kr.getTotalResults());
Nils Diewalde1ecd5e2014-11-27 02:17:24 +0000171 assertEquals(0, kr.getMatch(0).startPos);
margaretha93d0d622017-01-04 14:53:33 +0100172 assertEquals(3, kr.getMatch(0).endPos);
173 assertEquals(4, kr.getMatch(1).startPos);
174 assertEquals(7, kr.getMatch(1).endPos);
175 assertEquals(3, kr.getMatch(2).startPos);
176 assertEquals(5, kr.getMatch(2).endPos);
177 assertEquals(2, kr.getMatch(3).startPos);
178 assertEquals(4, kr.getMatch(3).endPos);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000179 }
180
margaretha4ad135c2017-01-12 12:49:44 +0100181 /**
182 * Ignore nested element distance unit
margaretha9614d972019-07-17 15:05:32 +0200183 */
margaretha4ad135c2017-01-12 12:49:44 +0100184 @Test
185 public void testCase1b () throws IOException {
186 ki = new KrillIndex();
187 ki.addDoc(createFieldDoc4());
188 ki.commit();
margarethaf420cb32023-02-14 17:49:33 +0100189 // b~d~b/c~c~dd
margaretha4ad135c2017-01-12 12:49:44 +0100190 SpanQuery sq;
191 sq = createQuery("s", "s:b", "s:c", 1, 1, true);
192
193 kr = ki.search(sq, (short) 10);
194
195 assertEquals(2, kr.getTotalResults());
196 assertEquals(0, kr.getMatch(0).startPos);
197 assertEquals(3, kr.getMatch(0).endPos);
198 assertEquals(2, kr.getMatch(1).startPos);
199 assertEquals(4, kr.getMatch(1).endPos);
200 }
201
Nils Diewaldbb33da22015-03-04 16:24:25 +0000202 /**
203 * Ensure terms and elements are in the same doc
Eliza Margaretha6f989202016-10-14 21:48:29 +0200204 */
Nils Diewaldbb33da22015-03-04 16:24:25 +0000205 @Test
206 public void testCase2 () throws IOException {
Nils Diewaldbb33da22015-03-04 16:24:25 +0000207 ki = new KrillIndex();
208 ki.addDoc(createFieldDoc0());
Eliza Margarethab0e91432014-01-28 15:26:31 +0000209 ki.addDoc(createFieldDoc1());
210 ki.addDoc(createFieldDoc2());
211 ki.commit();
Nils Diewaldbb33da22015-03-04 16:24:25 +0000212
Eliza Margarethab0e91432014-01-28 15:26:31 +0000213 SpanQuery sq;
Nils Diewaldbb33da22015-03-04 16:24:25 +0000214 sq = createQuery("p", "s:b", "s:d", 1, 1, true);
Eliza Margarethab0e91432014-01-28 15:26:31 +0000215 kr = ki.search(sq, (short) 10);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000216
Marc Kupietz26e05d22025-09-24 13:59:26 +0200217 assertEquals(1, kr.getTotalResults());
Nils Diewalde1ecd5e2014-11-27 02:17:24 +0000218 assertEquals(2, kr.getMatch(0).getLocalDocID());
219 assertEquals(2, kr.getMatch(0).startPos);
220 assertEquals(4, kr.getMatch(0).endPos);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000221
222 }
223
Nils Diewaldbb33da22015-03-04 16:24:25 +0000224 /** Skip to */
225 @Test
226 public void testCase3 () throws IOException {
Nils Diewaldbb33da22015-03-04 16:24:25 +0000227 ki = new KrillIndex();
228 ki.addDoc(createFieldDoc0());
Eliza Margarethafead2062014-01-28 16:34:09 +0000229 ki.addDoc(createFieldDoc1());
230 ki.addDoc(createFieldDoc3());
231 ki.commit();
Nils Diewaldbb33da22015-03-04 16:24:25 +0000232
Eliza Margarethafead2062014-01-28 16:34:09 +0000233 SpanQuery sq, edq;
Nils Diewaldbb33da22015-03-04 16:24:25 +0000234 edq = createQuery("s", "s:b", "s:c", 1, 1, true);
235
Akronc12567c2016-06-03 00:40:52 +0200236 sq = new SpanNextQuery(edq,
237 new SpanTermQuery(new Term("tokens", "s:d")));
Nils Diewaldbb33da22015-03-04 16:24:25 +0000238
Eliza Margarethafead2062014-01-28 16:34:09 +0000239 kr = ki.search(sq, (short) 10);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000240
margaretha93d0d622017-01-04 14:53:33 +0100241 assertEquals(1, kr.getTotalResults());
Nils Diewalde1ecd5e2014-11-27 02:17:24 +0000242 assertEquals(2, kr.getMatch(0).getLocalDocID());
243 assertEquals(2, kr.getMatch(0).startPos);
244 assertEquals(5, kr.getMatch(0).endPos);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000245
246 }
247
Nils Diewaldbb33da22015-03-04 16:24:25 +0000248 /** Same tokens in different elements */
249 @Test
250 public void testCase4 () throws IOException {
Nils Diewaldbb33da22015-03-04 16:24:25 +0000251 ki = new KrillIndex();
252 ki.addDoc(createFieldDoc0());
Eliza Margaretha45b5be12014-02-04 11:22:46 +0000253 ki.commit();
Nils Diewaldbb33da22015-03-04 16:24:25 +0000254
Eliza Margaretha45b5be12014-02-04 11:22:46 +0000255 SpanQuery sq;
Nils Diewaldbb33da22015-03-04 16:24:25 +0000256 sq = createQuery("s", "s:b", "s:b", 1, 2, true);
Eliza Margaretha45b5be12014-02-04 11:22:46 +0000257 kr = ki.search(sq, (short) 10);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000258
Marc Kupietz26e05d22025-09-24 13:59:26 +0200259 assertEquals(2, kr.getTotalResults());
Nils Diewalde1ecd5e2014-11-27 02:17:24 +0000260 assertEquals(0, kr.getMatch(0).startPos);
261 assertEquals(4, kr.getMatch(0).endPos);
262 assertEquals(3, kr.getMatch(1).startPos);
263 assertEquals(5, kr.getMatch(1).endPos);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000264
Eliza Margaretha40260542014-10-01 10:32:09 +0000265 }
Nils Diewaldbb33da22015-03-04 16:24:25 +0000266
Nils Diewaldbb33da22015-03-04 16:24:25 +0000267 /** Test query from json */
268 @Test
269 public void testCase5 () throws Exception {
Nils Diewaldbb33da22015-03-04 16:24:25 +0000270 ki = new KrillIndex();
271 ki.addDoc(getClass().getResourceAsStream("/wiki/00001.json.gz"), true);
Eliza Margaretha40260542014-10-01 10:32:09 +0000272 ki.commit();
Nils Diewaldbb33da22015-03-04 16:24:25 +0000273
margaretha9614d972019-07-17 15:05:32 +0200274 String jsonPath =
275 getClass().getResource("/queries/cosmas1.json").getFile();
Akrond6f5f592018-06-19 15:58:16 +0200276 SpanQueryWrapper sqwi = getJsonQuery(jsonPath);
Akronc12567c2016-06-03 00:40:52 +0200277 kr = ki.search(sqwi.toQuery(), (short) 10);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000278
Nils Diewalde1ecd5e2014-11-27 02:17:24 +0000279 assertEquals((long) 3, kr.getTotalResults());
Eliza Margaretha42b407b2014-10-01 10:36:33 +0000280 assertEquals(14, kr.getMatch(0).startPos);
281 assertEquals(19, kr.getMatch(0).endPos);
282 assertEquals(30, kr.getMatch(1).startPos);
283 assertEquals(33, kr.getMatch(1).endPos);
Eliza Margaretha40260542014-10-01 10:32:09 +0000284 }
Nils Diewaldbb33da22015-03-04 16:24:25 +0000285
margaretha9614d972019-07-17 15:05:32 +0200286 @Test
287 public void testCQLAnd () throws Exception {
288 ki = new KrillIndex();
289 ki.addDoc(getClass().getResourceAsStream("/wiki/00001.json.gz"), true);
290 ki.commit();
291
292 String jsonPath = getClass()
293 .getResource("/queries/distances/cql-and.jsonld").getFile();
294 SpanQueryWrapper sqwi = getJsonQuery(jsonPath);
295 SpanQuery query = sqwi.toQuery();
296 assertEquals(
297 "spanElementDistance(tokens:s:Buchstaben, tokens:s:Alphabet, "
298 + "[(base/s:s[0:0], notOrdered, notExcluded)])",
299 query.toString());
300 kr = ki.search(sqwi.toQuery(), (short) 10);
301
302 assertEquals((long) 1, kr.getTotalResults());
303 }
Nils Diewaldbb33da22015-03-04 16:24:25 +0000304
Akronc12567c2016-06-03 00:40:52 +0200305 /** Test query from json (2) */
306 @Test
307 public void testCase6 () throws Exception {
308 ki = new KrillIndex();
309 ki.addDoc(createFieldDoc0());
310 ki.addDoc(createFieldDoc1());
311 ki.addDoc(createFieldDoc2());
312 ki.commit();
313
314 SpanQueryWrapper sqwi;
315 sqwi = new QueryBuilder("tokens").tag("base/s:t");
316
317 kr = ki.search(sqwi.toQuery(), (short) 10);
Marc Kupietz26e05d22025-09-24 13:59:26 +0200318 assertEquals(1, kr.getTotalResults());
Akronf05fde62016-08-03 23:46:17 +0200319 assertEquals("[[ecebdc]]", kr.getMatch(0).getSnippetBrackets());
Akronc12567c2016-06-03 00:40:52 +0200320
Akron67d2ff02018-06-19 10:51:16 +0200321 String jsonPath = getClass()
322 .getResource("/queries/distances/in-same-t.jsonld").getFile();
Akrond6f5f592018-06-19 15:58:16 +0200323 sqwi = getJsonQuery(jsonPath);
Akronc12567c2016-06-03 00:40:52 +0200324
325 assertEquals(
326 "spanElementDistance(tokens:s:c, tokens:s:e, [(base/s:t[0:0], ordered, notExcluded)])",
327 sqwi.toQuery().toString());
328
Akronc12567c2016-06-03 00:40:52 +0200329 kr = ki.search(sqwi.toQuery(), (short) 10);
margaretha9614d972019-07-17 15:05:32 +0200330 assertEquals(1, kr.getTotalResults()); // Is 1 correct or
331 // should it not be
332 // ordered?
margarethaf420cb32023-02-14 17:49:33 +0100333 assertEquals("e[[ce]]bdc", kr.getMatch(0).getSnippetBrackets());
margarethac66265c2016-12-14 13:48:45 +0100334 }
margarethae3a166c2021-09-30 16:57:24 +0200335
336 @Test
337 public void testNoMoreFirstSpans () throws IOException {
338 ki = new KrillIndex();
339 ki.addDoc(createFieldDoc3());
340 ki.addDoc(createFieldDoc5());
341 ki.commit();
342
343 // c or b
344 SpanOrQuery soq = new SpanOrQuery(
345 new SpanTermQuery(new Term("tokens", "s:c")),
346 new SpanTermQuery(new Term("tokens", "s:b")));
347
348 // (c or b) /s0 d
349 SpanElementQuery e = new SpanElementQuery("tokens", "s");
350 SpanDistanceQuery sdq = new SpanDistanceQuery(
351 soq,
352 new SpanTermQuery(new Term("tokens", "s:d")),
353 new DistanceConstraint(e, 0, 0, true, false), true);
354
355 kr = ki.search(sdq, (short) 10);
margarethaf420cb32023-02-14 17:49:33 +0100356 assertEquals(2, kr.getTotalResults());
margarethae3a166c2021-09-30 16:57:24 +0200357 }
358
359 @Test
360 public void testNoMoreSecondSpans () throws IOException {
361 ki = new KrillIndex();
362 ki.addDoc(createFieldDoc3());
363 ki.addDoc(createFieldDoc5());
364 ki.commit();
365
366 // c or b
367 SpanOrQuery soq = new SpanOrQuery(
368 new SpanTermQuery(new Term("tokens", "s:c")),
369 new SpanTermQuery(new Term("tokens", "s:b")));
370
371 // d /s0(c or b)
372 SpanElementQuery e = new SpanElementQuery("tokens", "s");
373 SpanDistanceQuery sdq = new SpanDistanceQuery(
374 new SpanTermQuery(new Term("tokens", "s:d")),
375 soq,
376 new DistanceConstraint(e, 0, 0, true, false), true);
377
378 kr = ki.search(sdq, (short) 10);
379 assertEquals(0, kr.getTotalResults());
380 }
381
margarethaf420cb32023-02-14 17:49:33 +0100382
383
margarethae3a166c2021-09-30 16:57:24 +0200384 @Test
385 public void testNoElementSpans () throws IOException {
386 ki = new KrillIndex();
387 ki.addDoc(createFieldDoc3());
388 ki.addDoc(createFieldDoc5());
389 ki.commit();
390
391 // c or e
392 SpanOrQuery soq = new SpanOrQuery(
393 new SpanTermQuery(new Term("tokens", "s:c")),
394 new SpanTermQuery(new Term("tokens", "s:e")));
395
396 // (c or e) /s0 d
397 SpanElementQuery e = new SpanElementQuery("tokens", "s");
398 SpanDistanceQuery sdq = new SpanDistanceQuery(
399 soq,
400 new SpanTermQuery(new Term("tokens", "s:d")),
401 new DistanceConstraint(e, 0, 0, true, false), true);
402
403 kr = ki.search(sdq, (short) 10);
margarethaf420cb32023-02-14 17:49:33 +0100404 assertEquals(1, kr.getTotalResults());
405 }
406
407 @Test
408 public void testNoMoreFirstSpanWithSpanOrQuery () throws IOException {
409 ki = new KrillIndex();
410 ki.addDoc(createFieldDoc3());
411 ki.addDoc(createFieldDoc5());
412 ki.commit();
413
414 // c or d
415 SpanOrQuery soq = new SpanOrQuery(
416 new SpanTermQuery(new Term("tokens", "s:c")),
417 new SpanTermQuery(new Term("tokens", "s:d")));
418
419 // b /s0 (c or d)
420 SpanElementQuery e = new SpanElementQuery("tokens", "s");
421 SpanDistanceQuery sdq = new SpanDistanceQuery(
422 new SpanTermQuery(new Term("tokens", "s:b")),
423 soq,
424 new DistanceConstraint(e, 0, 0, true, false), true);
425
426 kr = ki.search(sdq, (short) 10);
427 assertEquals(1, kr.getTotalResults());
428 }
429
430 @Test
431 public void testNoMoreSecondSpansOrQuery () throws IOException {
432 ki = new KrillIndex();
433 ki.addDoc(createFieldDoc6());
434 ki.addDoc(createFieldDoc5());
435 ki.addDoc(createFieldDoc7());
436 ki.commit();
437
438 // c or d
439 SpanOrQuery soq = new SpanOrQuery(
440 new SpanTermQuery(new Term("tokens", "s:c")),
441 new SpanTermQuery(new Term("tokens", "s:d")));
442
443 // b /s0(c or d)
444 SpanElementQuery e = new SpanElementQuery("tokens", "s");
445 SpanDistanceQuery sdq = new SpanDistanceQuery(
446 new SpanTermQuery(new Term("tokens", "s:b")),
447 soq,
448 new DistanceConstraint(e, 0, 0, true, false), true);
449
450 kr = ki.search(sdq, (short) 10);
451
452 assertEquals(2, kr.getTotalResults());
453
454// System.out.println(kr.getTotalResults());
455// for (Match m : kr.getMatches()) {
456// System.out.println(m.getSnippetBrackets());
457// }
margarethae3a166c2021-09-30 16:57:24 +0200458 }
margarethac66265c2016-12-14 13:48:45 +0100459}