@@ -284,115 +284,127 @@ void queryStringSyntax(String field, String value1, String value2, String noMatc
284
284
).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 2 ) );
285
285
286
286
// ranges:
287
- // We are not running these range tests if the value contains square brackets [] because there is a problem in a Lucene query parser
288
- // and even if the query is escaped as `[2018\-01\-01T12\:58\:30.000000000\+02\:00\[Africa\/Cairo\] TO 2018\-02\-01T08\:15\:30.000000000\-02\:00\[\-02\:00\]]`
289
- // Fails for both Lucene and Elasticsearch backends...
290
- if ( !( value1 .contains ( "]" ) || value2 .contains ( "]" ) ) ) {
287
+ // for ZDT we have an additional "escape" by wrapping the values in quotes.
288
+ // See https://github.com/apache/lucene/issues/13234#issuecomment-2076083215
289
+ String value1RangeEscaped ;
290
+ String value2RangeEscaped ;
291
+ if ( ( value1 .contains ( "]" ) || value2 .contains ( "]" ) ) ) {
292
+ value1RangeEscaped = "\" " + value1 + "\" " ;
293
+ value2RangeEscaped = "\" " + value2 + "\" " ;
294
+ }
295
+ else {
296
+ value1RangeEscaped = value1 ;
297
+ value2RangeEscaped = value2 ;
298
+ }
299
+
300
+ assertThatHits (
301
+ scope .query ()
302
+ .where ( f -> f .queryString ().field ( field )
303
+ .matching (
304
+ String .format ( Locale .ROOT , "[%s TO %s]" , value1RangeEscaped , value2RangeEscaped ) ) )
305
+ .fetchAllHits ()
306
+ ).hasDocRefHitsAnyOrder (
307
+ indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ), syntaxDataSet .docId ( 2 ) );
308
+
309
+ assertThatHits (
310
+ scope .query ()
311
+ .where ( f -> f .queryString ().field ( field )
312
+ .matching (
313
+ String .format ( Locale .ROOT , "{%s TO %s}" , value1RangeEscaped , value2RangeEscaped ) ) )
314
+ .fetchAllHits ()
315
+ ).isEmpty ();
316
+
317
+ assertThatHits (
318
+ scope .query ()
319
+ .where ( f -> f .queryString ().field ( field )
320
+ .matching (
321
+ String .format ( Locale .ROOT , "[%s TO %s}" , value1RangeEscaped , value2RangeEscaped ) ) )
322
+ .fetchAllHits ()
323
+ ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ) );
324
+
325
+ assertThatHits (
326
+ scope .query ()
327
+ .where ( f -> f .queryString ().field ( field )
328
+ .matching (
329
+ String .format ( Locale .ROOT , "{%s TO %s]" , value1RangeEscaped , value2RangeEscaped ) ) )
330
+ .fetchAllHits ()
331
+ ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 2 ) );
332
+
333
+ if ( noMatch != null ) {
291
334
assertThatHits (
292
335
scope .query ()
293
336
.where ( f -> f .queryString ().field ( field )
294
- .matching ( String .format ( Locale .ROOT , "[%s TO %s ]" , value1 , value2 ) ) )
337
+ .matching ( String .format ( Locale .ROOT , "[%s TO * ]" , value1RangeEscaped ) ) )
295
338
.fetchAllHits ()
296
339
).hasDocRefHitsAnyOrder (
297
- indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ), syntaxDataSet .docId ( 2 ) );
298
-
340
+ indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ), syntaxDataSet .docId ( 2 ),
341
+ syntaxDataSet .docId ( 3 )
342
+ );
299
343
assertThatHits (
300
344
scope .query ()
301
345
.where ( f -> f .queryString ().field ( field )
302
- .matching ( String .format ( Locale .ROOT , "{%s TO %s} " , value1 , value2 ) ) )
346
+ .matching ( String .format ( Locale .ROOT , "{%s TO *] " , value1RangeEscaped ) ) )
303
347
.fetchAllHits ()
304
- ).isEmpty ();
348
+ ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 2 ),
349
+ syntaxDataSet .docId ( 3 )
350
+ );
305
351
306
352
assertThatHits (
307
353
scope .query ()
308
- .where ( f -> f .queryString ().field ( field )
309
- .matching ( String .format ( Locale .ROOT , "[%s TO %s}" , value1 , value2 ) ) )
354
+ .where ( f -> f .queryString ().field ( field ).matching ( "-" + noMatch ) )
310
355
.fetchAllHits ()
311
- ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ) );
312
-
356
+ ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ),
357
+ syntaxDataSet .docId ( 2 ),
358
+ syntaxDataSet .docId ( 3 )
359
+ );
313
360
assertThatHits (
314
361
scope .query ()
315
- .where ( f -> f .queryString ().field ( field )
316
- .matching ( String .format ( Locale .ROOT , "{%s TO %s]" , value1 , value2 ) ) )
362
+ .where ( f -> f .queryString ().field ( field ).matching ( "!" + noMatch ) )
317
363
.fetchAllHits ()
318
- ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 2 ) );
319
-
320
- if ( noMatch != null ) {
321
- assertThatHits (
322
- scope .query ()
323
- .where ( f -> f .queryString ().field ( field )
324
- .matching ( String .format ( Locale .ROOT , "[%s TO *]" , value1 ) ) )
325
- .fetchAllHits ()
326
- ).hasDocRefHitsAnyOrder (
327
- indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ), syntaxDataSet .docId ( 2 ),
328
- syntaxDataSet .docId ( 3 )
329
- );
330
- assertThatHits (
331
- scope .query ()
332
- .where ( f -> f .queryString ().field ( field )
333
- .matching ( String .format ( Locale .ROOT , "{%s TO *]" , value1 ) ) )
334
- .fetchAllHits ()
335
- ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 2 ),
336
- syntaxDataSet .docId ( 3 )
337
- );
338
-
339
- assertThatHits (
340
- scope .query ()
341
- .where ( f -> f .queryString ().field ( field ).matching ( "-" + noMatch ) )
342
- .fetchAllHits ()
343
- ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ),
344
- syntaxDataSet .docId ( 2 ),
345
- syntaxDataSet .docId ( 3 )
346
- );
347
- assertThatHits (
348
- scope .query ()
349
- .where ( f -> f .queryString ().field ( field ).matching ( "!" + noMatch ) )
350
- .fetchAllHits ()
351
- ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ),
352
- syntaxDataSet .docId ( 2 ),
353
- syntaxDataSet .docId ( 3 )
354
- );
355
-
356
- assertThatHits (
357
- scope .query ()
358
- .where ( f -> f .queryString ().field ( field ).matching ( noMatch ) )
359
- .fetchAllHits ()
360
- ).isEmpty ();
361
- }
362
- else {
363
- assertThatHits (
364
- scope .query ()
365
- .where ( f -> f .queryString ().field ( field )
366
- .matching ( String .format ( Locale .ROOT , "[%s TO *]" , value1 ) ) )
367
- .fetchAllHits ()
368
- ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ),
369
- syntaxDataSet .docId ( 2 )
370
- );
371
-
372
- assertThatHits (
373
- scope .query ()
374
- .where ( f -> f .queryString ().field ( field )
375
- .matching ( String .format ( Locale .ROOT , "{%s TO *]" , value1 ) ) )
376
- .fetchAllHits ()
377
- ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 2 ) );
378
- }
364
+ ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ),
365
+ syntaxDataSet .docId ( 2 ),
366
+ syntaxDataSet .docId ( 3 )
367
+ );
379
368
369
+ assertThatHits (
370
+ scope .query ()
371
+ .where ( f -> f .queryString ().field ( field ).matching ( noMatch ) )
372
+ .fetchAllHits ()
373
+ ).isEmpty ();
374
+ }
375
+ else {
380
376
assertThatHits (
381
377
scope .query ()
382
378
.where ( f -> f .queryString ().field ( field )
383
- .matching ( String .format ( Locale .ROOT , "[* TO %s ]" , value2 ) ) )
379
+ .matching ( String .format ( Locale .ROOT , "[%s TO * ]" , value1RangeEscaped ) ) )
384
380
.fetchAllHits ()
385
- ).hasDocRefHitsAnyOrder (
386
- indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ), syntaxDataSet .docId ( 2 ) );
381
+ ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ),
382
+ syntaxDataSet .docId ( 2 )
383
+ );
387
384
388
385
assertThatHits (
389
386
scope .query ()
390
387
.where ( f -> f .queryString ().field ( field )
391
- .matching ( String .format ( Locale .ROOT , "[* TO %s} " , value2 ) ) )
388
+ .matching ( String .format ( Locale .ROOT , "{%s TO *] " , value1RangeEscaped ) ) )
392
389
.fetchAllHits ()
393
- ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ) );
390
+ ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 2 ) );
394
391
}
395
392
393
+ assertThatHits (
394
+ scope .query ()
395
+ .where ( f -> f .queryString ().field ( field )
396
+ .matching ( String .format ( Locale .ROOT , "[* TO %s]" , value2RangeEscaped ) ) )
397
+ .fetchAllHits ()
398
+ ).hasDocRefHitsAnyOrder (
399
+ indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ), syntaxDataSet .docId ( 2 ) );
400
+
401
+ assertThatHits (
402
+ scope .query ()
403
+ .where ( f -> f .queryString ().field ( field )
404
+ .matching ( String .format ( Locale .ROOT , "[* TO %s}" , value2RangeEscaped ) ) )
405
+ .fetchAllHits ()
406
+ ).hasDocRefHitsAnyOrder ( indexForSyntaxParsingCheck .typeName (), syntaxDataSet .docId ( 1 ) );
407
+
396
408
assertThatHits (
397
409
scope .query ()
398
410
.where ( f -> f .queryString ().field ( field ).matching ( String .format ( Locale .ROOT , "\" %s\" " , value1 ) ) )
0 commit comments