blob: fd4285f6c6be39315add45f0b324c036ac3a96b8 [file] [log] [blame]
Nils Diewald93d6d1b2015-02-02 21:47:43 +00001package de.ids_mannheim.korap.query;
2
Nils Diewald5c375702015-02-09 20:58:24 +00003import java.io.IOException;
4import java.util.Collection;
5
Nils Diewald93d6d1b2015-02-02 21:47:43 +00006import de.ids_mannheim.korap.query.FrameConstraint;
7import de.ids_mannheim.korap.util.QueryException;
Nils Diewald5c375702015-02-09 20:58:24 +00008import org.apache.lucene.search.spans.Spans;
9
Nils Diewald93d6d1b2015-02-02 21:47:43 +000010
11import static org.junit.Assert.*;
12import org.junit.Test;
13import org.junit.Ignore;
14import org.junit.runner.RunWith;
15import org.junit.runners.JUnit4;
16
17/**
18 * @author diewald
19 */
20@RunWith(JUnit4.class)
21public class TestFrameConstraint {
22
23 @Test
24 public void testInitialization () throws QueryException {
25 FrameConstraint fc = new FrameConstraint();
26 assertEquals(fc.check(1), false);
27 };
28
29 @Test
30 public void testBitVector () throws QueryException {
31 int a = 1;
32 int b = 1 << 1;
33
34 assertEquals(3, a ^ b);
35 };
36
37 @Test
38 public void testOr () throws QueryException {
39 FrameConstraint fc = new FrameConstraint();
40
41 // Nothing set
42 assertEquals(fc.check("precedes"), false);
43 assertEquals(fc.check("precedesDirectly"), false);
44 assertEquals(fc.check("overlapsLeft"), false);
45 assertEquals(fc.check("alignsLeft"), false);
46 assertEquals(fc.check("startsWith"), false);
47 assertEquals(fc.check("matches"), false);
48 assertEquals(fc.check("isWithin"), false);
49 assertEquals(fc.check("isAround"), false);
50 assertEquals(fc.check("endsWith"), false);
51 assertEquals(fc.check("alignsRight"), false);
52 assertEquals(fc.check("overlapsRight"), false);
53 assertEquals(fc.check("succeedsDirectly"), false);
54 assertEquals(fc.check("succeeds"), false);
55
56 // Some or
Nils Diewald83c9b162015-02-03 21:05:07 +000057 fc.add("succeeds").add("succeedsDirectly");
Nils Diewald93d6d1b2015-02-02 21:47:43 +000058 assertEquals(fc.check("precedes"), false);
59 assertEquals(fc.check("precedesDirectly"), false);
60 assertEquals(fc.check("overlapsLeft"), false);
61 assertEquals(fc.check("alignsLeft"), false);
62 assertEquals(fc.check("startsWith"), false);
63 assertEquals(fc.check("matches"), false);
64 assertEquals(fc.check("isWithin"), false);
65 assertEquals(fc.check("isAround"), false);
66 assertEquals(fc.check("endsWith"), false);
67 assertEquals(fc.check("alignsRight"), false);
68 assertEquals(fc.check("overlapsRight"), false);
69 assertEquals(fc.check("succeedsDirectly"), true);
70 assertEquals(fc.check("succeeds"), true);
71
72 // Moar or
Nils Diewald83c9b162015-02-03 21:05:07 +000073 fc.add("precedes").add("precedesDirectly");
Nils Diewald93d6d1b2015-02-02 21:47:43 +000074 assertEquals(fc.check("precedes"), true);
75 assertEquals(fc.check("precedesDirectly"), true);
76 assertEquals(fc.check("overlapsLeft"), false);
77 assertEquals(fc.check("alignsLeft"), false);
78 assertEquals(fc.check("startsWith"), false);
79 assertEquals(fc.check("matches"), false);
80 assertEquals(fc.check("isWithin"), false);
81 assertEquals(fc.check("isAround"), false);
82 assertEquals(fc.check("endsWith"), false);
83 assertEquals(fc.check("alignsRight"), false);
84 assertEquals(fc.check("overlapsRight"), false);
85 assertEquals(fc.check("succeedsDirectly"), true);
86 assertEquals(fc.check("succeeds"), true);
87
88 // Moar or
Nils Diewald83c9b162015-02-03 21:05:07 +000089 fc.add("matches").add("startsWith");
Nils Diewald93d6d1b2015-02-02 21:47:43 +000090 assertEquals(fc.check("precedes"), true);
91 assertEquals(fc.check("precedesDirectly"), true);
92 assertEquals(fc.check("overlapsLeft"), false);
93 assertEquals(fc.check("alignsLeft"), false);
94 assertEquals(fc.check("startsWith"), true);
95 assertEquals(fc.check("matches"), true);
96 assertEquals(fc.check("isWithin"), false);
97 assertEquals(fc.check("isAround"), false);
98 assertEquals(fc.check("endsWith"), false);
99 assertEquals(fc.check("alignsRight"), false);
100 assertEquals(fc.check("overlapsRight"), false);
101 assertEquals(fc.check("succeedsDirectly"), true);
102 assertEquals(fc.check("succeeds"), true);
103
104 // Invert
105 fc.invert();
106 assertEquals(fc.check("precedes"), false);
107 assertEquals(fc.check("precedesDirectly"), false);
108 assertEquals(fc.check("overlapsLeft"), true);
109 assertEquals(fc.check("alignsLeft"), true);
110 assertEquals(fc.check("startsWith"), false);
111 assertEquals(fc.check("matches"), false);
112 assertEquals(fc.check("isWithin"), true);
113 assertEquals(fc.check("isAround"), true);
114 assertEquals(fc.check("endsWith"), true);
115 assertEquals(fc.check("alignsRight"), true);
116 assertEquals(fc.check("overlapsRight"), true);
117 assertEquals(fc.check("succeedsDirectly"), false);
118 assertEquals(fc.check("succeeds"), false);
119
Nils Diewald83c9b162015-02-03 21:05:07 +0000120 fc.add("precedes").
121 add("precedesDirectly").
122 add("startsWith").
123 add("matches");
Nils Diewald93d6d1b2015-02-02 21:47:43 +0000124 assertEquals(fc.check("precedes"), true);
125 assertEquals(fc.check("precedesDirectly"), true);
126 assertEquals(fc.check("overlapsLeft"), true);
127 assertEquals(fc.check("alignsLeft"), true);
128 assertEquals(fc.check("startsWith"), true);
129 assertEquals(fc.check("matches"), true);
130 assertEquals(fc.check("isWithin"), true);
131 assertEquals(fc.check("isAround"), true);
132 assertEquals(fc.check("endsWith"), true);
133 assertEquals(fc.check("alignsRight"), true);
134 assertEquals(fc.check("overlapsRight"), true);
135 assertEquals(fc.check("succeedsDirectly"), false);
136 assertEquals(fc.check("succeeds"), false);
137
Nils Diewald83c9b162015-02-03 21:05:07 +0000138 fc.add("succeeds").
139 add("succeedsDirectly");
Nils Diewald93d6d1b2015-02-02 21:47:43 +0000140 assertEquals(fc.check("precedes"), true);
141 assertEquals(fc.check("precedesDirectly"), true);
142 assertEquals(fc.check("overlapsLeft"), true);
143 assertEquals(fc.check("alignsLeft"), true);
144 assertEquals(fc.check("startsWith"), true);
145 assertEquals(fc.check("matches"), true);
146 assertEquals(fc.check("isWithin"), true);
147 assertEquals(fc.check("isAround"), true);
148 assertEquals(fc.check("endsWith"), true);
149 assertEquals(fc.check("alignsRight"), true);
150 assertEquals(fc.check("overlapsRight"), true);
151 assertEquals(fc.check("succeedsDirectly"), true);
152 assertEquals(fc.check("succeeds"), true);
153 };
154
155 @Test
156 public void testOrVector () throws QueryException {
157 FrameConstraint fc1 = new FrameConstraint();
158 // Some or
Nils Diewald83c9b162015-02-03 21:05:07 +0000159 fc1.add("succeeds").add("succeedsDirectly");
Nils Diewald93d6d1b2015-02-02 21:47:43 +0000160 assertEquals(fc1.check("precedes"), false);
161 assertEquals(fc1.check("precedesDirectly"), false);
162 assertEquals(fc1.check("overlapsLeft"), false);
163 assertEquals(fc1.check("alignsLeft"), false);
164 assertEquals(fc1.check("startsWith"), false);
165 assertEquals(fc1.check("matches"), false);
166 assertEquals(fc1.check("isWithin"), false);
167 assertEquals(fc1.check("isAround"), false);
168 assertEquals(fc1.check("endsWith"), false);
169 assertEquals(fc1.check("alignsRight"), false);
170 assertEquals(fc1.check("overlapsRight"), false);
171 assertEquals(fc1.check("succeedsDirectly"), true);
172 assertEquals(fc1.check("succeeds"), true);
173
174 FrameConstraint fc2 = new FrameConstraint();
Nils Diewald83c9b162015-02-03 21:05:07 +0000175 fc2.add("precedes").add("precedesDirectly");
Nils Diewald93d6d1b2015-02-02 21:47:43 +0000176 assertEquals(fc2.check("precedes"), true);
177 assertEquals(fc2.check("precedesDirectly"), true);
178 assertEquals(fc2.check("overlapsLeft"), false);
179 assertEquals(fc2.check("alignsLeft"), false);
180 assertEquals(fc2.check("startsWith"), false);
181 assertEquals(fc2.check("matches"), false);
182 assertEquals(fc2.check("isWithin"), false);
183 assertEquals(fc2.check("isAround"), false);
184 assertEquals(fc2.check("endsWith"), false);
185 assertEquals(fc2.check("alignsRight"), false);
186 assertEquals(fc2.check("overlapsRight"), false);
187 assertEquals(fc2.check("succeedsDirectly"), false);
188 assertEquals(fc2.check("succeeds"), false);
189
Nils Diewald83c9b162015-02-03 21:05:07 +0000190 fc1.add(fc2);
Nils Diewald93d6d1b2015-02-02 21:47:43 +0000191 assertEquals(fc1.check("precedes"), true);
192 assertEquals(fc1.check("precedesDirectly"), true);
193 assertEquals(fc1.check("overlapsLeft"), false);
194 assertEquals(fc1.check("alignsLeft"), false);
195 assertEquals(fc1.check("startsWith"), false);
196 assertEquals(fc1.check("matches"), false);
197 assertEquals(fc1.check("isWithin"), false);
198 assertEquals(fc1.check("isAround"), false);
199 assertEquals(fc1.check("endsWith"), false);
200 assertEquals(fc1.check("alignsRight"), false);
201 assertEquals(fc1.check("overlapsRight"), false);
202 assertEquals(fc1.check("succeedsDirectly"), true);
203 assertEquals(fc1.check("succeeds"), true);
204 };
Nils Diewald5c375702015-02-09 20:58:24 +0000205
Nils Diewalde7a820b2015-02-12 21:34:50 +0000206 @Test
207 public void testConstellation () throws QueryException {
208 FrameConstraint fc1 = new FrameConstraint();
209 fc1.invert();
210
211 // Precedes
212 assertEquals(
213 FrameConstraint.PRECEDES,
214 fc1._constellation(new TestSpans(2,3), new TestSpans(4,5))
215 );
216
217 // PrecedesDirectly
218 assertEquals(
219 FrameConstraint.PRECEDES_DIRECTLY,
220 fc1._constellation(new TestSpans(2,3), new TestSpans(3,5))
221 );
222
223 // OverlapsLeft
224 assertEquals(
225 FrameConstraint.OVERLAPS_LEFT,
226 fc1._constellation(new TestSpans(2,4), new TestSpans(3,5))
227 );
228
229 // AlignsLeft
230 assertEquals(
231 FrameConstraint.ALIGNS_LEFT,
232 fc1._constellation(new TestSpans(2,4), new TestSpans(2,5))
233 );
234
235 // StartsWith
236 assertEquals(
237 FrameConstraint.STARTS_WITH,
238 fc1._constellation(new TestSpans(2,5), new TestSpans(2,4))
239 );
240
241 // Matches
242 assertEquals(
243 FrameConstraint.MATCHES,
244 fc1._constellation(new TestSpans(2,5), new TestSpans(2,5))
245 );
246
247 // IsWithin
248 assertEquals(
249 FrameConstraint.IS_WITHIN,
250 fc1._constellation(new TestSpans(3,4), new TestSpans(2,5))
251 );
252
253 // IsAround
254 assertEquals(
255 FrameConstraint.IS_AROUND,
256 fc1._constellation(new TestSpans(2,5), new TestSpans(3,4))
257 );
258
259 // EndsWith
260 assertEquals(
261 FrameConstraint.ENDS_WITH,
262 fc1._constellation(new TestSpans(3,5), new TestSpans(4,5))
263 );
264
265 // AlignsRight
266 assertEquals(
267 FrameConstraint.ALIGNS_RIGHT,
268 fc1._constellation(new TestSpans(3,4), new TestSpans(2,4))
269 );
270
271 // OverlapsRight
272 assertEquals(
273 FrameConstraint.OVERLAPS_RIGHT,
274 fc1._constellation(new TestSpans(3,5), new TestSpans(2,4))
275 );
276
277 // SucceedsDirectly
278 assertEquals(
279 FrameConstraint.SUCCEEDS_DIRECTLY,
280 fc1._constellation(new TestSpans(4,6), new TestSpans(2,4))
281 );
282
283 // Succeeds
284 assertEquals(
285 FrameConstraint.SUCCEEDS,
286 fc1._constellation(new TestSpans(5,6), new TestSpans(2,4))
287 );
288 };
289
Nils Diewald5c375702015-02-09 20:58:24 +0000290 private class TestSpans extends Spans {
291 private int s, e;
292
Nils Diewalde7a820b2015-02-12 21:34:50 +0000293 // Constructor
294 public TestSpans (int start, int end) {
295 this.s = start;
296 this.e = end;
297 };
298
Nils Diewald5c375702015-02-09 20:58:24 +0000299 @Override
300 public int doc () {
301 return 0;
302 };
303
304 @Override
305 public int start () {
306 return this.s;
307 };
308
309 @Override
310 public int end () {
311 return this.e;
312 };
313
314 @Override
315 public boolean skipTo (int target) {
316 return true;
317 };
318
319 @Override
320 public boolean next () {
321 return true;
322 };
323
324 public Collection<byte[]> getPayload() throws IOException {
325 return null;
326 }
327
328 @Override
329 public boolean isPayloadAvailable() throws IOException {
330 return false;
331 };
332
333 @Override
334 public String toString () {
335 return "";
336 };
337
338 @Override
339 public long cost () {
340 return 1;
341 };
342
343 };
Nils Diewald93d6d1b2015-02-02 21:47:43 +0000344};