diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/impl/ElasticsearchSearchQuerySelectStepImpl.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/impl/ElasticsearchSearchQuerySelectStepImpl.java index 552d1fad904..ea99d1ef799 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/impl/ElasticsearchSearchQuerySelectStepImpl.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/impl/ElasticsearchSearchQuerySelectStepImpl.java @@ -20,8 +20,8 @@ import org.hibernate.search.engine.backend.session.spi.BackendSessionContext; import org.hibernate.search.engine.search.loading.spi.SearchLoadingContextBuilder; import org.hibernate.search.engine.search.predicate.SearchPredicate; -import org.hibernate.search.engine.search.predicate.dsl.BooleanPredicateOptionsCollector; import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; +import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanOperatorPredicateClausesCollector; import org.hibernate.search.engine.search.projection.SearchProjection; import org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep; import org.hibernate.search.engine.search.projection.spi.ProjectionAccumulator; @@ -101,7 +101,7 @@ public ElasticsearchSearchQueryOptionsStep where( @Override public ElasticsearchSearchQueryOptionsStep where( - BiConsumer> predicateContributor) { + BiConsumer> predicateContributor) { return selectEntity().where( predicateContributor ); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQuerySelectStepImpl.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQuerySelectStepImpl.java index f219686e0cf..9b306598921 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQuerySelectStepImpl.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQuerySelectStepImpl.java @@ -20,8 +20,8 @@ import org.hibernate.search.engine.backend.session.spi.BackendSessionContext; import org.hibernate.search.engine.search.loading.spi.SearchLoadingContextBuilder; import org.hibernate.search.engine.search.predicate.SearchPredicate; -import org.hibernate.search.engine.search.predicate.dsl.BooleanPredicateOptionsCollector; import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; +import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanOperatorPredicateClausesCollector; import org.hibernate.search.engine.search.projection.SearchProjection; import org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep; import org.hibernate.search.engine.search.projection.spi.ProjectionAccumulator; @@ -100,7 +100,7 @@ public LuceneSearchQueryOptionsStep where( @Override public LuceneSearchQueryOptionsStep where( - BiConsumer> predicateContributor) { + BiConsumer> predicateContributor) { return selectEntity().where( predicateContributor ); } diff --git a/documentation/src/main/asciidoc/reference/search-dsl-predicate.asciidoc b/documentation/src/main/asciidoc/reference/search-dsl-predicate.asciidoc index 0e575badf2b..63eac41dd4b 100644 --- a/documentation/src/main/asciidoc/reference/search-dsl-predicate.asciidoc +++ b/documentation/src/main/asciidoc/reference/search-dsl-predicate.asciidoc @@ -813,13 +813,32 @@ It is possible to define the `and` predicate inside a lambda expression. This is especially useful when clauses need to be added dynamically to the `and` predicate, for example based on user input. -.Easily adding clauses dynamically using `with(...)` and the lambda syntax +.Easily adding clauses dynamically using `.where(...)` and the lambda syntax ==== [source, JAVA, indent=0, subs="+callouts"] ---- include::{sourcedir}/org/hibernate/search/documentation/search/predicate/PredicateDslIT.java[tags=and-dynamicParameters-root] ---- <1> Get a custom object holding the search parameters provided by the user through a web form, for example. +<2> Call `.where(BiConsumer)`. +The consumer, implemented by a lambda expression, will receive a predicate factory as well as clause collector as an argument, +and will add clauses to that collector as necessary. +<3> By default, a boolean predicate will match nothing if there is no clause. +To match every document when there is no clause, add a `and` clause that matches everything. +<4> Inside the lambda, the code is free to use any Java language constructs, such as `if` or `for`, +to control the addition of clauses. +In this case, we only add clauses if the relevant parameter was filled in by the user. +==== + +Another syntax relying on the method `with(...)` can be useful when the `and` predicate is not the root predicate: + +.Easily adding clauses dynamically using `with(...)` and the lambda syntax +==== +[source, JAVA, indent=0, subs="+callouts"] +---- +include::{sourcedir}/org/hibernate/search/documentation/search/predicate/PredicateDslIT.java[tags=and-dynamicParameters-with] +---- +<1> Get a custom object holding the search parameters provided by the user through a web form, for example. <2> Call `.where(Function)`. The function, implemented by a lambda expression, will receive a predicate factory, use it to build an `and` predicate, invoke the `with(Consumer)` method and return this predicate. The consumer, implemented by a lambda expression, @@ -1056,24 +1075,8 @@ It is possible to define the `bool` predicate inside a lambda expression. This is especially useful when clauses need to be added dynamically to the `bool` predicate, for example based on user input. -.Easily adding clauses dynamically using `.where(...)` and the lambda syntax -==== -[source, JAVA, indent=0, subs="+callouts"] ----- -include::{sourcedir}/org/hibernate/search/documentation/search/predicate/PredicateDslIT.java[tags=bool-dynamicParameters-root] ----- -<1> Get a custom object holding the search parameters provided by the user through a web form, for example. -<2> Call `.where(BiConsumer)`. -The consumer, implemented by a lambda expression, will receive a predicate factory as well as clause collector as an argument, -and will add clauses to that collector as necessary. -<3> By default, a boolean predicate will match nothing if there is no clause. -To match every document when there is no clause, add a `must` clause that matches everything. -<4> Inside the lambda, the code is free to use any Java language constructs, such as `if` or `for`, -to control the addition of clauses. -In this case, we only add clauses if the relevant parameter was filled in by the user. -==== - -Another syntax relying on the method `with(...)` can be useful when the boolean predicate is not the root predicate: +TIP: If you simply want to build a root predicate matching multiple, dynamically generated clauses, +consider using the < ... )` syntax>> instead. .Easily adding clauses dynamically using `with(...)` and the lambda syntax ==== diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/PredicateDslIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/PredicateDslIT.java index 54e0276e1d9..48f5a2cbd20 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/PredicateDslIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/PredicateDslIT.java @@ -189,6 +189,32 @@ public void and() { withinSearchSession( searchSession -> { // tag::and-dynamicParameters-root[] MySearchParameters searchParameters = getSearchParameters(); // <1> + List hits = searchSession.search( Book.class ) + .where( (f, root) -> { // <2> + root.add( f.matchAll() ); // <3> + if ( searchParameters.getGenreFilter() != null ) { // <4> + root.add( f.match().field( "genre" ) + .matching( searchParameters.getGenreFilter() ) ); + } + if ( searchParameters.getFullTextFilter() != null ) { + root.add( f.match().fields( "title", "description" ) + .matching( searchParameters.getFullTextFilter() ) ); + } + if ( searchParameters.getPageCountMaxFilter() != null ) { + root.add( f.range().field( "pageCount" ) + .atMost( searchParameters.getPageCountMaxFilter() ) ); + } + } ) + .fetchHits( 20 ); + // end::and-dynamicParameters-root[] + assertThat( hits ) + .extracting( Book::getId ) + .containsExactlyInAnyOrder( BOOK1_ID, BOOK2_ID ); + } ); + + withinSearchSession( searchSession -> { + // tag::and-dynamicParameters-with[] + MySearchParameters searchParameters = getSearchParameters(); // <1> List hits = searchSession.search( Book.class ) .where( f -> f.and().with( and -> { // <2> and.add( f.matchAll() ); // <3> @@ -206,7 +232,7 @@ public void and() { } } ) ) .fetchHits( 20 ); - // end::and-dynamicParameters-root[] + // end::and-dynamicParameters-with[] assertThat( hits ) .extracting( Book::getId ) .containsExactlyInAnyOrder( BOOK1_ID, BOOK2_ID ); @@ -332,46 +358,20 @@ public void bool() { .containsExactlyInAnyOrder( BOOK2_ID, BOOK4_ID ); } ); - withinSearchSession( searchSession -> { - // tag::bool-dynamicParameters-root[] - MySearchParameters searchParameters = getSearchParameters(); // <1> - List hits = searchSession.search( Book.class ) - .where( (f, b) -> { // <2> - b.must( f.matchAll() ); // <3> - if ( searchParameters.getGenreFilter() != null ) { // <4> - b.must( f.match().field( "genre" ) - .matching( searchParameters.getGenreFilter() ) ); - } - if ( searchParameters.getFullTextFilter() != null ) { - b.must( f.match().fields( "title", "description" ) - .matching( searchParameters.getFullTextFilter() ) ); - } - if ( searchParameters.getPageCountMaxFilter() != null ) { - b.must( f.range().field( "pageCount" ) - .atMost( searchParameters.getPageCountMaxFilter() ) ); - } - } ) - .fetchHits( 20 ); - // end::bool-dynamicParameters-root[] - assertThat( hits ) - .extracting( Book::getId ) - .containsExactlyInAnyOrder( BOOK1_ID, BOOK2_ID ); - } ); - withinSearchSession( searchSession -> { // tag::bool-dynamicParameters-with[] MySearchParameters searchParameters = getSearchParameters(); // <1> List hits = searchSession.search( Book.class ) - .where( (f, b) -> { // <2> - b.must( f.matchAll() ); + .where( (f, root) -> { // <2> + root.add( f.matchAll() ); if ( searchParameters.getGenreFilter() != null ) { - b.must( f.match().field( "genre" ) + root.add( f.match().field( "genre" ) .matching( searchParameters.getGenreFilter() ) ); } if ( !searchParameters.getAuthorFilters().isEmpty() ) { - b.must( f.bool().with( b2 -> { // <3> + root.add( f.bool().with( b -> { // <3> for ( String authorFilter : searchParameters.getAuthorFilters() ) { // <4> - b2.should( f.match().fields( "authors.firstName", "authors.lastName" ) + b.should( f.match().fields( "authors.firstName", "authors.lastName" ) .matching( authorFilter ) ); } } ) ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanOperatorPredicateClausesCollector.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanOperatorPredicateClausesCollector.java index 0b4696f3118..a3dcf4d929f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanOperatorPredicateClausesCollector.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanOperatorPredicateClausesCollector.java @@ -6,6 +6,7 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; @@ -34,6 +35,11 @@ * For the {@link SearchPredicateFactory#nested(String) nested} predicate, * documents will have to match all clauses. * + *
  • + * For the root predicate defined through the second parameter of the lambda passed + * to {@link org.hibernate.search.engine.search.query.dsl.SearchQueryWhereStep#where(BiConsumer)}, + * documents will have to match all clauses. + *
  • * * * @param The "self" type (the actual exposed type of this collector). diff --git a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryWhereStep.java b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryWhereStep.java index c66ed9d7a9a..db4c1fc1ca7 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryWhereStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryWhereStep.java @@ -14,6 +14,7 @@ import org.hibernate.search.engine.search.predicate.dsl.BooleanPredicateOptionsCollector; import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanOperatorPredicateClausesCollector; /** * The step in a query definition where the predicate, i.e. the "WHERE" clause, can be set. @@ -49,10 +50,12 @@ public interface SearchQueryWhereStep< /** * Set the predicate for this query. * @param predicateContributor A consumer that will use the factory passed in parameter to create predicates - * and add them to the collector passed in parameter. + * and add them as clauses to the collector passed in parameter. * Should generally be a lambda expression. + * The resulting root predicate will have to match all clauses. * @return The next step. + * @see SimpleBooleanPredicateClausesCollector */ - N where(BiConsumer> predicateContributor); + N where(BiConsumer> predicateContributor); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/impl/DefaultSearchQuerySelectStep.java b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/impl/DefaultSearchQuerySelectStep.java index 70907cb48ef..26843a71fd6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/impl/DefaultSearchQuerySelectStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/impl/DefaultSearchQuerySelectStep.java @@ -13,9 +13,9 @@ import org.hibernate.search.engine.backend.session.spi.BackendSessionContext; import org.hibernate.search.engine.search.loading.spi.SearchLoadingContextBuilder; import org.hibernate.search.engine.search.predicate.SearchPredicate; -import org.hibernate.search.engine.search.predicate.dsl.BooleanPredicateOptionsCollector; import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanOperatorPredicateClausesCollector; import org.hibernate.search.engine.search.projection.SearchProjection; import org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep; import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory; @@ -96,7 +96,7 @@ public DefaultSearchQueryOptionsStep, LOS> select(SearchProjection... @Override public SearchQueryOptionsStep where( - BiConsumer> predicateContributor) { + BiConsumer> predicateContributor) { return selectEntity().where( predicateContributor ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractDelegatingSearchQuerySelectStep.java b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractDelegatingSearchQuerySelectStep.java index c2c9c7b7c7b..74dc44af725 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractDelegatingSearchQuerySelectStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractDelegatingSearchQuerySelectStep.java @@ -11,7 +11,7 @@ import java.util.function.Function; import org.hibernate.search.engine.search.predicate.SearchPredicate; -import org.hibernate.search.engine.search.predicate.dsl.BooleanPredicateOptionsCollector; +import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanOperatorPredicateClausesCollector; import org.hibernate.search.engine.search.projection.SearchProjection; import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; @@ -78,7 +78,7 @@ public AbstractDelegatingSearchQuerySelectStep(SearchQuerySelectStep where( - BiConsumer> predicateContributor) { + BiConsumer> predicateContributor) { return delegate.where( predicateContributor ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractSearchQueryOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractSearchQueryOptionsStep.java index ef151708207..1c8cb2dad13 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractSearchQueryOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractSearchQueryOptionsStep.java @@ -20,10 +20,10 @@ import org.hibernate.search.engine.search.aggregation.dsl.SearchAggregationFactory; import org.hibernate.search.engine.search.loading.spi.SearchLoadingContextBuilder; import org.hibernate.search.engine.search.predicate.SearchPredicate; -import org.hibernate.search.engine.search.predicate.dsl.BooleanPredicateOptionsCollector; -import org.hibernate.search.engine.search.predicate.dsl.BooleanPredicateClausesStep; import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanOperatorPredicateClausesCollector; +import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanOperatorPredicateClausesStep; import org.hibernate.search.engine.search.query.SearchQuery; import org.hibernate.search.engine.search.query.SearchResult; import org.hibernate.search.engine.search.query.SearchScroll; @@ -72,11 +72,11 @@ public S where(Function predicateCont } @Override - public S where(BiConsumer> predicateContributor) { + public S where(BiConsumer> predicateContributor) { PDF factory = predicateFactory(); - BooleanPredicateClausesStep boolStep = factory.bool(); - predicateContributor.accept( factory, boolStep ); - searchQueryBuilder.predicate( boolStep.toPredicate() ); + SimpleBooleanOperatorPredicateClausesStep andStep = factory.and(); + predicateContributor.accept( factory, andStep ); + searchQueryBuilder.predicate( andStep.toPredicate() ); return thisAsS(); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AndPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AndPredicateSpecificsIT.java index 0c3e562f3b8..b133f120160 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AndPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AndPredicateSpecificsIT.java @@ -194,6 +194,29 @@ public void add_function() { .hasDocRefHitsAnyOrder( index.typeName(), DOCUMENT_1 ); } + @Test + public void where() { + assertThatQuery( index.query() + .where( (f, root) -> { + root.add( f.match().field( "field1" ).matching( FIELD1_VALUE1 ) ); + } ) ) + .hasDocRefHitsAnyOrder( index.typeName(), DOCUMENT_1 ); + + assertThatQuery( index.query() + .where( (f, root) -> { + root.add( f.match().field( "field1" ).matching( FIELD1_VALUE1 ) ); + root.add( f.match().field( "field2" ).matching( FIELD2_VALUE2 ) ); + } ) ) + .hasNoHits(); + + assertThatQuery( index.query() + .where( (f, root) -> { + root.add( f.match().field( "field1" ).matching( FIELD1_VALUE1 ) ); + root.add( f.match().field( "field2" ).matching( FIELD2_VALUE1 ) ); + } ) ) + .hasDocRefHitsAnyOrder( index.typeName(), DOCUMENT_1 ); + } + @Test public void with() { assertThatQuery( index.query() diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/BoolPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/BoolPredicateSpecificsIT.java index 6fef9693007..0e8462042be 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/BoolPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/BoolPredicateSpecificsIT.java @@ -363,16 +363,6 @@ public void mustNot_should() { .hasDocRefHitsAnyOrder( index.typeName(), DOCUMENT_2 ); } - @Test - public void where() { - assertThatQuery( index.query() - .where( (f, b) -> { - b.should( f.match().field( "field1" ).matching( FIELD1_VALUE1 ) ); - b.should( f.match().field( "field1" ).matching( FIELD1_VALUE2 ) ); - } ) ) - .hasDocRefHitsAnyOrder( index.typeName(), DOCUMENT_1, DOCUMENT_2 ); - } - @Test public void with() { assertThatQuery( index.query() diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NestedPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NestedPredicateSpecificsIT.java index b9b0f6de524..5f46d8bc462 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NestedPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NestedPredicateSpecificsIT.java @@ -95,9 +95,9 @@ public void search_nestedOnTwoLevels() { @Test public void search_nestedOnTwoLevels_onlySecondLevel() { assertThatQuery( mainIndex.query() - .where( (f, b) -> b + .where( (f, root) -> root // This is referred to as "condition 1" in the data initialization method - .must( f.nested( "nestedObject.nestedObject" ) + .add( f.nested( "nestedObject.nestedObject" ) .add( f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION1_FIELD1 ) @@ -108,7 +108,7 @@ public void search_nestedOnTwoLevels_onlySecondLevel() { ) ) // This is referred to as "condition 2" in the data initialization method - .must( f.nested( "nestedObject.nestedObject" ) + .add( f.nested( "nestedObject.nestedObject" ) .add( f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD1 ) @@ -126,9 +126,9 @@ public void search_nestedOnTwoLevels_onlySecondLevel() { @Test public void with() { assertThatQuery( mainIndex.query() - .where( (f, b) -> b + .where( (f, root) -> root // This is referred to as "condition 1" in the data initialization method - .must( f.nested( "nestedObject.nestedObject" ) + .add( f.nested( "nestedObject.nestedObject" ) .with( n -> { n.add( f.match() .field( "nestedObject.nestedObject.field1" ) @@ -141,7 +141,7 @@ public void with() { } ) ) // This is referred to as "condition 2" in the data initialization method - .must( f.nested( "nestedObject.nestedObject" ) + .add( f.nested( "nestedObject.nestedObject" ) .with( n -> { n.add( f.match() .field( "nestedObject.nestedObject.field1" ) diff --git a/integrationtest/showcase/library/src/main/java/org/hibernate/search/integrationtest/showcase/library/repository/indexsearch/IndexSearchDocumentRepositoryImpl.java b/integrationtest/showcase/library/src/main/java/org/hibernate/search/integrationtest/showcase/library/repository/indexsearch/IndexSearchDocumentRepositoryImpl.java index bb3587f587b..c6adae6d9d1 100644 --- a/integrationtest/showcase/library/src/main/java/org/hibernate/search/integrationtest/showcase/library/repository/indexsearch/IndexSearchDocumentRepositoryImpl.java +++ b/integrationtest/showcase/library/src/main/java/org/hibernate/search/integrationtest/showcase/library/repository/indexsearch/IndexSearchDocumentRepositoryImpl.java @@ -62,15 +62,15 @@ public Optional getByIsbn(String isbnAsString) { @Override public List searchByMedium(String terms, BookMedium medium, int offset, int limit) { return Search.session( entityManager ).search( Book.class ) - .where( (f, b) -> { + .where( (f, root) -> { if ( terms != null && !terms.isEmpty() ) { - b.must( f.match() + root.add( f.match() .field( "title" ).boost( 2.0f ) .field( "summary" ) .matching( terms ) ); } - b.must( f.match().field( "copies.medium" ).matching( medium ) ); + root.add( f.match().field( "copies.medium" ).matching( medium ) ); } ) .sort( b -> b.field( "title_sort" ) ) .fetchHits( offset, limit ); @@ -82,10 +82,10 @@ public List> searchAroundMe(String terms, String tags, List libraryServices, int offset, int limit) { return Search.session( entityManager ).search( DOCUMENT_CLASS ) - .where( (f, b) -> { + .where( (f, root) -> { // Match query if ( terms != null && !terms.isEmpty() ) { - b.must( f.match() + root.add( f.match() .field( "title" ).boost( 2.0f ) .field( "summary" ) .matching( terms ) @@ -94,7 +94,7 @@ public List> searchAroundMe(String terms, String tags, // Bridged query with complex bridge: TODO HSEARCH-3320 rely on the bridge to split the String String[] splitTags = tags == null ? null : tags.split( "," ); if ( splitTags != null && splitTags.length > 0 ) { - b.must( f.bool().with( b2 -> { + root.add( f.bool().with( b2 -> { for ( String tag : splitTags ) { b2.must( f.match() .field( "tags" ) @@ -105,7 +105,7 @@ public List> searchAroundMe(String terms, String tags, } // Spatial query if ( myLocation != null && maxDistanceInKilometers != null ) { - b.must( f.spatial() + root.add( f.spatial() .within() .field( "copies.library.location" ) .circle( myLocation, maxDistanceInKilometers, DistanceUnit.KILOMETERS ) @@ -113,7 +113,7 @@ public List> searchAroundMe(String terms, String tags, } // Nested query + must loop if ( libraryServices != null && !libraryServices.isEmpty() ) { - b.must( f.nested( "copies" ) + root.add( f.nested( "copies" ) .with( b2 -> { for ( LibraryServiceOption service : libraryServices ) { b2.add( f.match() diff --git a/integrationtest/showcase/library/src/main/java/org/hibernate/search/integrationtest/showcase/library/repository/indexsearch/IndexSearchLibraryRepositoryImpl.java b/integrationtest/showcase/library/src/main/java/org/hibernate/search/integrationtest/showcase/library/repository/indexsearch/IndexSearchLibraryRepositoryImpl.java index 5bf974c2f14..e9491cfc590 100644 --- a/integrationtest/showcase/library/src/main/java/org/hibernate/search/integrationtest/showcase/library/repository/indexsearch/IndexSearchLibraryRepositoryImpl.java +++ b/integrationtest/showcase/library/src/main/java/org/hibernate/search/integrationtest/showcase/library/repository/indexsearch/IndexSearchLibraryRepositoryImpl.java @@ -92,22 +92,22 @@ public LibraryFacetedSearchResult searchFaceted(String terms, Integer minCollect AggregationKey> aggByLibraryServiceKey = AggregationKey.of( "libraryService" ); SearchResult result = Search.session( entityManager ) .search( Library.class ) - .where( (f, b) -> { - b.must( f.matchAll() ); // Match all libraries by default + .where( (f, root) -> { + root.add( f.matchAll() ); // Match all libraries by default // Match query if ( terms != null && !terms.isEmpty() ) { - b.must( f.match() + root.add( f.match() .field( "name" ) .matching( terms ) ); } if ( minCollectionSize != null ) { - b.must( f.range().field( "collectionSize" ).atLeast( minCollectionSize ) ); + root.add( f.range().field( "collectionSize" ).atLeast( minCollectionSize ) ); } // Nested query + must loop if ( libraryServices != null && !libraryServices.isEmpty() ) { for ( LibraryServiceOption service : libraryServices ) { - b.must( f.match() + root.add( f.match() .field( "services" ) .matching( service ) );