blob: 72cfb235ed9ebdc58eb2bcafe13c33431284651d [file] [log] [blame]
Nils Diewald488a3ba2015-02-26 16:15:16 +00001package de.ids_mannheim.korap.query;
2
3import de.ids_mannheim.korap.KrillQuery;
4import de.ids_mannheim.korap.query.wrap.*;
5import org.apache.lucene.util.automaton.RegExp;
6
7import org.slf4j.Logger;
8import org.slf4j.LoggerFactory;
9
10/**
11 * QueryBuilder implements a simple API for wrapping
12 * KrillQuery classes.
Nils Diewaldbb33da22015-03-04 16:24:25 +000013 *
Nils Diewald488a3ba2015-02-26 16:15:16 +000014 * Build complex queries.
15 * <blockquote><pre>
Nils Diewaldbb33da22015-03-04 16:24:25 +000016 * QueryBuilder qb = new QueryBuilder("tokens");
17 * SpanQueryWrapper sqw = (SpanQueryWrapper)
18 * qb.seq(
19 * qb.empty(),
20 * qb.seg(
21 * qb.re("mate/p=N.*"),
22 * qb.re("opennlp/p=N.*")
23 * )
24 * );
Nils Diewald488a3ba2015-02-26 16:15:16 +000025 * </pre></blockquote>
Nils Diewaldbb33da22015-03-04 16:24:25 +000026 *
Nils Diewald488a3ba2015-02-26 16:15:16 +000027 * @author diewald
28 */
29public class QueryBuilder {
30 private String field;
31
32 // Logger
33 private final static Logger log = LoggerFactory.getLogger(KrillQuery.class);
34
35 // This advices the java compiler to ignore all loggings
36 public static final boolean DEBUG = false;
37
38 // <legacy>
Nils Diewaldbb33da22015-03-04 16:24:25 +000039 public static final byte OVERLAP = SpanWithinQuery.OVERLAP,
40 REAL_OVERLAP = SpanWithinQuery.REAL_OVERLAP,
41 WITHIN = SpanWithinQuery.WITHIN,
42 REAL_WITHIN = SpanWithinQuery.REAL_WITHIN,
43 ENDSWITH = SpanWithinQuery.ENDSWITH,
44 STARTSWITH = SpanWithinQuery.STARTSWITH,
45 MATCH = SpanWithinQuery.MATCH;
46
47
Nils Diewald488a3ba2015-02-26 16:15:16 +000048 // </legacy>
49
50
51 /**
52 * Construct a new QueryBuilder object.
53 */
54 public QueryBuilder (String field) {
55 this.field = field;
56 };
57
Nils Diewaldbb33da22015-03-04 16:24:25 +000058
Nils Diewald488a3ba2015-02-26 16:15:16 +000059 /**
60 * Create a query object based on a regular expression.
Nils Diewaldbb33da22015-03-04 16:24:25 +000061 *
Nils Diewald488a3ba2015-02-26 16:15:16 +000062 * <blockquote><pre>
Akron74748c62016-06-29 00:22:43 +020063 * QueryBuilder kq = new QueryBuilder("tokens");
Nils Diewaldbb33da22015-03-04 16:24:25 +000064 * SpanRegexQueryWrapper re = kq.re(".+?");
Nils Diewald488a3ba2015-02-26 16:15:16 +000065 * </pre></blockquote>
Nils Diewaldbb33da22015-03-04 16:24:25 +000066 *
67 * @param re
68 * The regular expession as a string.
Nils Diewald488a3ba2015-02-26 16:15:16 +000069 * @return A {@link SpanRegexQueryWrapper} object.
70 */
71 public SpanRegexQueryWrapper re (String re) {
72 return new SpanRegexQueryWrapper(this.field, re, RegExp.ALL, false);
73 };
74
75
76 /**
77 * Create a query object based on a regular expression.
Nils Diewaldbb33da22015-03-04 16:24:25 +000078 *
79 * Supports flags as defined in
80 * {@link org.apache.lucene.util.automaton.RegExp}:
Nils Diewald488a3ba2015-02-26 16:15:16 +000081 * <ul>
Nils Diewaldbb33da22015-03-04 16:24:25 +000082 * <li><tt>RegExp.ALL</tt> - enables all optional regexp
83 * syntax</li>
84 * <li><tt>RegExp.ANYSTRING</tt> - enables anystring (@)</li>
85 * <li><tt>RegExp.AUTOMATON</tt> - enables named automata
86 * (&lt;identifier&gt;)</li>
87 * <li><tt>RegExp.COMPLEMENT</tt> - enables complement (~)</li>
88 * <li><tt>RegExp.EMPTY</tt> - enables empty language (#)</li>
89 * <li><tt>RegExp.INTERSECTION</tt> - enables intersection
90 * (&amp;)</li>
91 * <li><tt>RegExp.INTERVAL</tt> - enables numerical intervals
92 * (&lt;n-m&gt;)</li>
93 * <li><tt>RegExp.NONE</tt> - enables no optional regexp
94 * syntax</li>
Nils Diewald488a3ba2015-02-26 16:15:16 +000095 * </ul>
Nils Diewaldbb33da22015-03-04 16:24:25 +000096 *
Nils Diewald488a3ba2015-02-26 16:15:16 +000097 * <blockquote><pre>
Akron74748c62016-06-29 00:22:43 +020098 * QueryBuilder kq = new QueryBuilder("tokens");
Nils Diewaldbb33da22015-03-04 16:24:25 +000099 * SpanRegexQueryWrapper re = kq.re("[Aa]lternatives?",
100 * RegExp.NONE);
Nils Diewald488a3ba2015-02-26 16:15:16 +0000101 * </pre></blockquote>
Nils Diewaldbb33da22015-03-04 16:24:25 +0000102 *
103 * @param re
104 * The regular expession as a string.
105 * @param flags
106 * The flag for the regular expression.
Nils Diewald488a3ba2015-02-26 16:15:16 +0000107 * @return A {@link SpanRegexQueryWrapper} object.
108 */
109 public SpanRegexQueryWrapper re (String re, int flags) {
110 return new SpanRegexQueryWrapper(this.field, re, flags, false);
111 };
112
113
114 /**
115 * Create a query object based on a regular expression.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000116 *
Nils Diewald488a3ba2015-02-26 16:15:16 +0000117 * Supports flags (see above) and case insensitivity.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000118 *
Nils Diewald488a3ba2015-02-26 16:15:16 +0000119 * <blockquote><pre>
Akron74748c62016-06-29 00:22:43 +0200120 * QueryBuilder kq = new QueryBuilder("tokens");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000121 * SpanRegexQueryWrapper re = kq.re("alternatives?", RegExp.NONE,
122 * true);
Nils Diewald488a3ba2015-02-26 16:15:16 +0000123 * </pre></blockquote>
Nils Diewaldbb33da22015-03-04 16:24:25 +0000124 *
125 * @param re
126 * The regular expession as a string.
127 * @param flags
128 * The flag for the regular expression.
129 * @param caseinsensitive
130 * A boolean value indicating case insensitivity.
Nils Diewald488a3ba2015-02-26 16:15:16 +0000131 * @return A {@link SpanRegexQueryWrapper} object.
132 */
Nils Diewaldbb33da22015-03-04 16:24:25 +0000133 public SpanRegexQueryWrapper re (String re, int flags,
134 boolean caseinsensitive) {
Nils Diewald488a3ba2015-02-26 16:15:16 +0000135 return new SpanRegexQueryWrapper(this.field, re, flags, caseinsensitive);
136 };
137
138
139 /**
140 * Create a query object based on a regular expression.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000141 *
Nils Diewald488a3ba2015-02-26 16:15:16 +0000142 * Supports case insensitivity.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000143 *
Nils Diewald488a3ba2015-02-26 16:15:16 +0000144 * <blockquote><pre>
Akron74748c62016-06-29 00:22:43 +0200145 * QueryBuilder kq = new QueryBuilder("tokens");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000146 * SpanRegexQueryWrapper re = kq.re("alternatives?", true);
Nils Diewald488a3ba2015-02-26 16:15:16 +0000147 * </pre></blockquote>
Nils Diewaldbb33da22015-03-04 16:24:25 +0000148 *
149 * @param re
150 * The regular expession as a string.
151 * @param flags
152 * The flag for the regular expression.
Nils Diewald488a3ba2015-02-26 16:15:16 +0000153 * @return A {@link SpanRegexQueryWrapper} object.
154 */
155 public SpanRegexQueryWrapper re (String re, boolean caseinsensitive) {
Nils Diewaldbb33da22015-03-04 16:24:25 +0000156 return new SpanRegexQueryWrapper(this.field, re, RegExp.ALL,
157 caseinsensitive);
Nils Diewald488a3ba2015-02-26 16:15:16 +0000158 };
159
Nils Diewaldbb33da22015-03-04 16:24:25 +0000160
Nils Diewald488a3ba2015-02-26 16:15:16 +0000161 /**
162 * Create a query object based on a wildcard term.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000163 * <tt>*</tt> indicates an optional sequence of arbitrary
164 * characters,
Nils Diewald488a3ba2015-02-26 16:15:16 +0000165 * <tt>?</tt> indicates a single character,
166 * <tt>\</tt> can be used for escaping.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000167 *
168 * @param wc
169 * The wildcard term as a string.
Nils Diewald488a3ba2015-02-26 16:15:16 +0000170 * @return A {@link SpanWildcardQueryWrapper} object.
171 */
172 public SpanWildcardQueryWrapper wc (String wc) {
173 return new SpanWildcardQueryWrapper(this.field, wc, false);
174 };
175
Nils Diewaldbb33da22015-03-04 16:24:25 +0000176
Nils Diewald488a3ba2015-02-26 16:15:16 +0000177 /**
178 * Create a query object based on a wildcard term.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000179 * <tt>*</tt> indicates an optional sequence of arbitrary
180 * characters,
Nils Diewald488a3ba2015-02-26 16:15:16 +0000181 * <tt>?</tt> indicates a single character,
182 * <tt>\</tt> can be used for escaping.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000183 *
Nils Diewald488a3ba2015-02-26 16:15:16 +0000184 * Supports case insensitivity.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000185 *
Nils Diewald488a3ba2015-02-26 16:15:16 +0000186 * <blockquote><pre>
Akron74748c62016-06-29 00:22:43 +0200187 * QueryBuilder kq = new QueryBuilder("tokens");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000188 * SpanWildcardQueryWrapper wc = kq.wc("wall*", true);
Nils Diewald488a3ba2015-02-26 16:15:16 +0000189 * </pre></blockquote>
Nils Diewaldbb33da22015-03-04 16:24:25 +0000190 *
191 * @param wc
192 * The wildcard term as a string.
193 * @param caseinsensitive
194 * A boolean value indicating case insensitivity.
Nils Diewald488a3ba2015-02-26 16:15:16 +0000195 * @return A {@link SpanWildcardQueryWrapper} object.
196 */
197 public SpanWildcardQueryWrapper wc (String wc, boolean caseinsensitive) {
198 return new SpanWildcardQueryWrapper(this.field, wc, caseinsensitive);
199 };
200
201
202 /**
203 * Create a segment query object.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000204 *
Nils Diewald488a3ba2015-02-26 16:15:16 +0000205 * <blockquote><pre>
Akron74748c62016-06-29 00:22:43 +0200206 * QueryBuilder kq = new QueryBuilder("tokens");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000207 * SpanSegmentQueryWrapper seg = kq.seg();
Nils Diewald488a3ba2015-02-26 16:15:16 +0000208 * </pre></blockquote>
Nils Diewaldbb33da22015-03-04 16:24:25 +0000209 *
Nils Diewald488a3ba2015-02-26 16:15:16 +0000210 * @return A {@link SpanSegmentQueryWrapper} object.
211 */
212 public SpanSegmentQueryWrapper seg () {
213 return new SpanSegmentQueryWrapper(this.field);
214 };
215
216
217 /**
218 * Create a segment query object.
219 * Supports sequences of strings or {@link SpanRegexQueryWrapper},
220 * and {@link SpanAlterQueryWrapper} objects.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000221 *
Nils Diewald488a3ba2015-02-26 16:15:16 +0000222 * <blockquote><pre>
Akron74748c62016-06-29 00:22:43 +0200223 * QueryBuilder kq = new QueryBuilder("tokens");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000224 * SpanSegmentQueryWrapper seg = kq.seg(
225 * kq.re("mate/p=.*?"),
226 * kq.re("opennlp/p=.*?")
227 * );
Nils Diewald488a3ba2015-02-26 16:15:16 +0000228 * </pre></blockquote>
Nils Diewaldbb33da22015-03-04 16:24:25 +0000229 *
230 * @param terms
231 * [] An array of terms, the segment consists of.
Nils Diewald488a3ba2015-02-26 16:15:16 +0000232 * @return A {@link SpanSegmentQueryWrapper} object.
233 */
234 // Sequence of regular expression queries
235 public SpanSegmentQueryWrapper seg (SpanRegexQueryWrapper ... terms) {
236 SpanSegmentQueryWrapper ssq = new SpanSegmentQueryWrapper(this.field);
237 for (SpanRegexQueryWrapper t : terms)
238 ssq.with(t);
239 return ssq;
240 };
241
Nils Diewaldbb33da22015-03-04 16:24:25 +0000242
Nils Diewald488a3ba2015-02-26 16:15:16 +0000243 // Sequence of alternative queries
244 public SpanSegmentQueryWrapper seg (SpanAlterQueryWrapper ... terms) {
245 SpanSegmentQueryWrapper ssq = new SpanSegmentQueryWrapper(this.field);
246 for (SpanAlterQueryWrapper t : terms)
247 ssq.with(t);
248 return ssq;
249 };
250
Nils Diewaldbb33da22015-03-04 16:24:25 +0000251
Nils Diewald488a3ba2015-02-26 16:15:16 +0000252 // Sequence of alternative queries
253 public SpanSegmentQueryWrapper seg (String ... terms) {
254 SpanSegmentQueryWrapper ssq = new SpanSegmentQueryWrapper(this.field);
255 for (String t : terms)
256 ssq.with(t);
257 return ssq;
258 };
259
Nils Diewaldbb33da22015-03-04 16:24:25 +0000260
Nils Diewald488a3ba2015-02-26 16:15:16 +0000261 /**
262 * Create an empty query segment.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000263 *
Nils Diewald488a3ba2015-02-26 16:15:16 +0000264 * <blockquote><pre>
Akron74748c62016-06-29 00:22:43 +0200265 * QueryBuilder kq = new QueryBuilder("tokens");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000266 * SpanRepetitionQueryWrapper seg = kq.empty();
Nils Diewald488a3ba2015-02-26 16:15:16 +0000267 * </pre></blockquote>
268 */
269 public SpanRepetitionQueryWrapper empty () {
270 return new SpanRepetitionQueryWrapper();
271 };
272
273
274 // TODO: Further JavaDocs
275
276
277 /**
278 * Create a segment alternation query object.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000279 *
280 * @param terms
281 * [] An array of alternative terms.
Nils Diewald488a3ba2015-02-26 16:15:16 +0000282 */
283 public SpanAlterQueryWrapper or (SpanQueryWrapper ... terms) {
284 SpanAlterQueryWrapper ssaq = new SpanAlterQueryWrapper(this.field);
285 for (SpanQueryWrapper t : terms)
286 ssaq.or(t);
287 return ssaq;
288 };
289
290
291 public SpanAlterQueryWrapper or (String ... terms) {
292 SpanAlterQueryWrapper ssaq = new SpanAlterQueryWrapper(this.field);
293 for (String t : terms)
294 ssaq.or(t);
295 return ssaq;
296 };
297
298
299 // SpanSegmentSequenceQueries
300 /**
301 * Create a sequence of segments query object.
302 */
303 public SpanSequenceQueryWrapper seq () {
304 return new SpanSequenceQueryWrapper(this.field);
305 };
306
307
308 /**
309 * Create a sequence of segments query object.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000310 *
311 * @param terms
312 * [] An array of segment defining terms.
Nils Diewald488a3ba2015-02-26 16:15:16 +0000313 */
314 public SpanSequenceQueryWrapper seq (SpanQueryWrapper ... terms) {
315 SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper(this.field);
316 for (SpanQueryWrapper t : terms)
317 sssq.append(t);
318 return sssq;
319 };
320
321
322 /**
323 * Create a sequence of segments query object.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000324 *
325 * @param re
326 * A SpanSegmentRegexQuery, starting the sequence.
Nils Diewald488a3ba2015-02-26 16:15:16 +0000327 */
328 public SpanSequenceQueryWrapper seq (SpanRegexQueryWrapper re) {
329 return new SpanSequenceQueryWrapper(this.field, re);
330 };
331
332
333 public SpanSequenceQueryWrapper seq (Object ... terms) {
334 SpanSequenceQueryWrapper ssq = new SpanSequenceQueryWrapper(this.field);
335 for (Object t : terms) {
336 if (t instanceof SpanQueryWrapper) {
337 ssq.append((SpanQueryWrapper) t);
338 }
339 else if (t instanceof SpanRegexQueryWrapper) {
340 ssq.append((SpanRegexQueryWrapper) t);
341 }
342 else {
Nils Diewaldbb33da22015-03-04 16:24:25 +0000343 log.error("{} is not an acceptable parameter for seq()",
344 t.getClass());
Nils Diewald488a3ba2015-02-26 16:15:16 +0000345 return ssq;
346 };
347 };
348 return ssq;
349 };
350
351
352 public SpanElementQueryWrapper tag (String element) {
353 return new SpanElementQueryWrapper(this.field, element);
354 };
355
Nils Diewaldbb33da22015-03-04 16:24:25 +0000356
Nils Diewald488a3ba2015-02-26 16:15:16 +0000357 /**
358 * Create a wrapping within query object.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000359 *
360 * @param element
361 * A SpanQuery.
362 * @param embedded
363 * A SpanQuery that is wrapped in the element.
Nils Diewald488a3ba2015-02-26 16:15:16 +0000364 */
365 @Deprecated
366 public SpanWithinQueryWrapper within (SpanQueryWrapper element,
Nils Diewaldbb33da22015-03-04 16:24:25 +0000367 SpanQueryWrapper embedded) {
Nils Diewald488a3ba2015-02-26 16:15:16 +0000368 return new SpanWithinQueryWrapper(element, embedded);
369 };
Nils Diewaldbb33da22015-03-04 16:24:25 +0000370
371
Nils Diewald488a3ba2015-02-26 16:15:16 +0000372 public SpanWithinQueryWrapper contains (SpanQueryWrapper element,
Nils Diewaldbb33da22015-03-04 16:24:25 +0000373 SpanQueryWrapper embedded) {
Nils Diewald488a3ba2015-02-26 16:15:16 +0000374 return new SpanWithinQueryWrapper(element, embedded, WITHIN);
375 };
376
Nils Diewaldbb33da22015-03-04 16:24:25 +0000377
Nils Diewald488a3ba2015-02-26 16:15:16 +0000378 public SpanWithinQueryWrapper startswith (SpanQueryWrapper element,
Nils Diewaldbb33da22015-03-04 16:24:25 +0000379 SpanQueryWrapper embedded) {
Nils Diewald488a3ba2015-02-26 16:15:16 +0000380 return new SpanWithinQueryWrapper(element, embedded, STARTSWITH);
381 };
382
Nils Diewaldbb33da22015-03-04 16:24:25 +0000383
Nils Diewald488a3ba2015-02-26 16:15:16 +0000384 public SpanWithinQueryWrapper endswith (SpanQueryWrapper element,
Nils Diewaldbb33da22015-03-04 16:24:25 +0000385 SpanQueryWrapper embedded) {
Nils Diewald488a3ba2015-02-26 16:15:16 +0000386 return new SpanWithinQueryWrapper(element, embedded, ENDSWITH);
387 };
388
Nils Diewaldbb33da22015-03-04 16:24:25 +0000389
Nils Diewald488a3ba2015-02-26 16:15:16 +0000390 public SpanWithinQueryWrapper overlaps (SpanQueryWrapper element,
Nils Diewaldbb33da22015-03-04 16:24:25 +0000391 SpanQueryWrapper embedded) {
Nils Diewald488a3ba2015-02-26 16:15:16 +0000392 return new SpanWithinQueryWrapper(element, embedded, OVERLAP);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000393 };
394
Nils Diewald488a3ba2015-02-26 16:15:16 +0000395
396 public SpanWithinQueryWrapper matches (SpanQueryWrapper element,
Nils Diewaldbb33da22015-03-04 16:24:25 +0000397 SpanQueryWrapper embedded) {
Nils Diewald488a3ba2015-02-26 16:15:16 +0000398 return new SpanWithinQueryWrapper(element, embedded, MATCH);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000399 };
400
Nils Diewald488a3ba2015-02-26 16:15:16 +0000401
402 // Class
403 public SpanClassQueryWrapper _ (byte number, SpanQueryWrapper element) {
404 return new SpanClassQueryWrapper(element, number);
405 };
406
Nils Diewaldbb33da22015-03-04 16:24:25 +0000407
Nils Diewald488a3ba2015-02-26 16:15:16 +0000408 public SpanClassQueryWrapper _ (int number, SpanQueryWrapper element) {
409 return new SpanClassQueryWrapper(element, number);
410 };
411
Nils Diewaldbb33da22015-03-04 16:24:25 +0000412
Nils Diewald488a3ba2015-02-26 16:15:16 +0000413 public SpanClassQueryWrapper _ (short number, SpanQueryWrapper element) {
414 return new SpanClassQueryWrapper(element, number);
415 };
416
Nils Diewaldbb33da22015-03-04 16:24:25 +0000417
Nils Diewald488a3ba2015-02-26 16:15:16 +0000418 public SpanClassQueryWrapper _ (SpanQueryWrapper element) {
419 return new SpanClassQueryWrapper(element);
420 };
421
Nils Diewaldbb33da22015-03-04 16:24:25 +0000422
Nils Diewald488a3ba2015-02-26 16:15:16 +0000423 // Focus
424 public SpanFocusQueryWrapper focus (byte number, SpanQueryWrapper element) {
425 return new SpanFocusQueryWrapper(element, number);
426 };
427
Nils Diewaldbb33da22015-03-04 16:24:25 +0000428
Nils Diewald488a3ba2015-02-26 16:15:16 +0000429 public SpanFocusQueryWrapper focus (int number, SpanQueryWrapper element) {
430 return new SpanFocusQueryWrapper(element, number);
431 };
432
Nils Diewaldbb33da22015-03-04 16:24:25 +0000433
Nils Diewald488a3ba2015-02-26 16:15:16 +0000434 public SpanFocusQueryWrapper focus (short number, SpanQueryWrapper element) {
435 return new SpanFocusQueryWrapper(element, number);
436 };
437
Nils Diewaldbb33da22015-03-04 16:24:25 +0000438
Nils Diewald488a3ba2015-02-26 16:15:16 +0000439 public SpanFocusQueryWrapper focus (SpanQueryWrapper element) {
440 return new SpanFocusQueryWrapper(element);
441 };
442
Nils Diewaldbb33da22015-03-04 16:24:25 +0000443
Nils Diewald488a3ba2015-02-26 16:15:16 +0000444 // Repetition
Nils Diewaldbb33da22015-03-04 16:24:25 +0000445 public SpanRepetitionQueryWrapper repeat (SpanQueryWrapper element,
446 int exact) {
Nils Diewald488a3ba2015-02-26 16:15:16 +0000447 return new SpanRepetitionQueryWrapper(element, exact);
448 };
449
Nils Diewaldbb33da22015-03-04 16:24:25 +0000450
451 public SpanRepetitionQueryWrapper repeat (SpanQueryWrapper element,
452 int min, int max) {
Nils Diewald488a3ba2015-02-26 16:15:16 +0000453 return new SpanRepetitionQueryWrapper(element, min, max);
454 };
455};