Skip to content

Commit 411cb0e

Browse files
committed
HSEARCH-4558 Enable more range tests for ZoneDateTime and query string predicates
1 parent b9c36c1 commit 411cb0e

File tree

2 files changed

+93
-100
lines changed

2 files changed

+93
-100
lines changed

integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateSpecificsIT.java

Lines changed: 93 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -284,115 +284,127 @@ void queryStringSyntax(String field, String value1, String value2, String noMatc
284284
).hasDocRefHitsAnyOrder( indexForSyntaxParsingCheck.typeName(), syntaxDataSet.docId( 2 ) );
285285

286286
// 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 ) {
291334
assertThatHits(
292335
scope.query()
293336
.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 ) ) )
295338
.fetchAllHits()
296339
).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+
);
299343
assertThatHits(
300344
scope.query()
301345
.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 ) ) )
303347
.fetchAllHits()
304-
).isEmpty();
348+
).hasDocRefHitsAnyOrder( indexForSyntaxParsingCheck.typeName(), syntaxDataSet.docId( 2 ),
349+
syntaxDataSet.docId( 3 )
350+
);
305351

306352
assertThatHits(
307353
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 ) )
310355
.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+
);
313360
assertThatHits(
314361
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 ) )
317363
.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+
);
379368

369+
assertThatHits(
370+
scope.query()
371+
.where( f -> f.queryString().field( field ).matching( noMatch ) )
372+
.fetchAllHits()
373+
).isEmpty();
374+
}
375+
else {
380376
assertThatHits(
381377
scope.query()
382378
.where( f -> f.queryString().field( field )
383-
.matching( String.format( Locale.ROOT, "[* TO %s]", value2 ) ) )
379+
.matching( String.format( Locale.ROOT, "[%s TO *]", value1RangeEscaped ) ) )
384380
.fetchAllHits()
385-
).hasDocRefHitsAnyOrder(
386-
indexForSyntaxParsingCheck.typeName(), syntaxDataSet.docId( 1 ), syntaxDataSet.docId( 2 ) );
381+
).hasDocRefHitsAnyOrder( indexForSyntaxParsingCheck.typeName(), syntaxDataSet.docId( 1 ),
382+
syntaxDataSet.docId( 2 )
383+
);
387384

388385
assertThatHits(
389386
scope.query()
390387
.where( f -> f.queryString().field( field )
391-
.matching( String.format( Locale.ROOT, "[* TO %s}", value2 ) ) )
388+
.matching( String.format( Locale.ROOT, "{%s TO *]", value1RangeEscaped ) ) )
392389
.fetchAllHits()
393-
).hasDocRefHitsAnyOrder( indexForSyntaxParsingCheck.typeName(), syntaxDataSet.docId( 1 ) );
390+
).hasDocRefHitsAnyOrder( indexForSyntaxParsingCheck.typeName(), syntaxDataSet.docId( 2 ) );
394391
}
395392

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+
396408
assertThatHits(
397409
scope.query()
398410
.where( f -> f.queryString().field( field ).matching( String.format( Locale.ROOT, "\"%s\"", value1 ) ) )

integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateSpecificsIT.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import static org.hibernate.search.util.impl.integrationtest.common.assertion.SearchHitsAssert.assertThatHits;
1111
import static org.hibernate.search.util.impl.integrationtest.common.assertion.SearchResultAssert.assertThatQuery;
1212

13-
import java.time.Instant;
1413
import java.util.ArrayList;
1514
import java.util.Collections;
1615
import java.util.EnumSet;
@@ -24,7 +23,6 @@
2423
import org.hibernate.search.engine.search.predicate.dsl.SimpleQueryFlag;
2524
import org.hibernate.search.engine.search.predicate.dsl.SimpleQueryStringPredicateFieldStep;
2625
import org.hibernate.search.engine.search.query.SearchQuery;
27-
import org.hibernate.search.integrationtest.backend.tck.testsupport.types.InstantFieldTypeDescriptor;
2826
import org.hibernate.search.integrationtest.backend.tck.testsupport.types.StandardFieldTypeDescriptor;
2927
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.TckBackendFeatures;
3028
import org.hibernate.search.integrationtest.backend.tck.testsupport.util.TckConfiguration;
@@ -404,23 +402,6 @@ void simpleQueryStringSyntax(String field, String value1, String value2, String
404402

405403
}
406404

407-
public static List<? extends Arguments> simpleQueryStringSyntax1() {
408-
// String field, String value1, String value2, String noMatch, String unParsableValue
409-
TckBackendFeatures backendFeatures = TckConfiguration.get().getBackendFeatures();
410-
return List.of(
411-
Arguments.of( "integer", "1", "2", "100", "not-an-int" ),
412-
Arguments.of( "instant",
413-
backendFeatures.formatForQueryStringPredicate( InstantFieldTypeDescriptor.INSTANCE,
414-
Instant.parse( "2000-01-01T01:01:01Z" ) ),
415-
backendFeatures.formatForQueryStringPredicate( InstantFieldTypeDescriptor.INSTANCE,
416-
Instant.parse( "2000-02-02T02:02:02Z" ) ),
417-
backendFeatures.formatForQueryStringPredicate( InstantFieldTypeDescriptor.INSTANCE,
418-
Instant.parse( "2222-02-02T02:02:02Z" ) ),
419-
"not-an-instant" ),
420-
Arguments.of( "localDate", "2000-01-01", "2000-02-02", "2222-02-02", "not-an-localDate" )
421-
);
422-
}
423-
424405
public static List<? extends Arguments> simpleQueryStringSyntax() {
425406
// String field, String value1, String value2, String noMatch, String unParsableValue
426407
TckBackendFeatures backendFeatures = TckConfiguration.get().getBackendFeatures();

0 commit comments

Comments
 (0)