From 962e04aedf277fbe17100179ffb3ad9cf9f5e481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Wed, 24 Aug 2022 14:37:41 +0200 Subject: [PATCH] HSEARCH-4676 Use .and() syntax by default with the nested() predicate --- .../dsl/object/DocumentModelDslObjectIT.java | 4 +- .../IndexedEmbeddedStructureNestedIT.java | 4 +- .../search/paths/FieldPathsIT.java | 8 +- .../search/predicate/PredicateDslIT.java | 4 +- ...leBooleanOperatorPredicateClausesStep.java | 2 +- .../dsl/NestedPredicateClausesCollector.java | 19 ++++ .../dsl/NestedPredicateClausesStep.java | 11 ++- .../dsl/NestedPredicateOptionsCollector.java | 17 ---- .../predicate/dsl/SearchPredicateFactory.java | 3 + ...leanOperatorPredicateClausesCollector.java | 4 + ...leBooleanOperatorPredicateClausesStep.java | 94 +++++++++++++++++++ .../impl/NestedPredicateClausesStepImpl.java | 6 +- ...oleanOperatorPredicateClausesStepImpl.java | 68 +------------- .../spi/AbstractSearchPredicateFactory.java | 4 +- .../backend/tck/ObjectStructureIT.java | 14 +-- .../backend/tck/dynamic/FieldTemplateIT.java | 4 +- .../tck/dynamic/ObjectFieldTemplateIT.java | 14 +-- .../tck/multitenancy/MultiTenancyBaseIT.java | 10 +- .../AbstractPredicateInObjectFieldIT.java | 14 +-- .../predicate/ExistsPredicateSpecificsIT.java | 2 +- .../predicate/NestedPredicateSpecificsIT.java | 68 +++++++------- .../IndexSearchDocumentRepositoryImpl.java | 2 +- 22 files changed, 209 insertions(+), 167 deletions(-) create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateClausesCollector.java delete mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateOptionsCollector.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractSimpleBooleanOperatorPredicateClausesStep.java diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/bridge/document/model/dsl/object/DocumentModelDslObjectIT.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/bridge/document/model/dsl/object/DocumentModelDslObjectIT.java index d10ab7c6e8e..7a10072d9b5 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/bridge/document/model/dsl/object/DocumentModelDslObjectIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/bridge/document/model/dsl/object/DocumentModelDslObjectIT.java @@ -59,9 +59,9 @@ public void smoke() { .must( f.range().field( "summary.shipping" ) .atMost( new BigDecimal( "10.0" ) ) ) .must( f.nested( "lineItems" ) - .must( f.range().field( "lineItems.amount" ) + .add( f.range().field( "lineItems.amount" ) .between( new BigDecimal( "7.0" ), new BigDecimal( "9.0" ) ) ) - .must( f.match().field( "lineItems.category" ) + .add( f.match().field( "lineItems.category" ) .matching( "BOOK" ) ) ) ) diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/indexedembedded/structure/nested/IndexedEmbeddedStructureNestedIT.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/indexedembedded/structure/nested/IndexedEmbeddedStructureNestedIT.java index 2b8fa6db27b..f0e17f966bb 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/indexedembedded/structure/nested/IndexedEmbeddedStructureNestedIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/indexedembedded/structure/nested/IndexedEmbeddedStructureNestedIT.java @@ -90,8 +90,8 @@ public void smoke() { // tag::include[] List hits = searchSession.search( Book.class ) .where( f -> f.nested( "authors" ) // <1> - .must( f.match().field( "authors.firstName" ).matching( "Ty" ) ) // <2> - .must( f.match().field( "authors.lastName" ).matching( "Abraham" ) ) ) // <2> + .add( f.match().field( "authors.firstName" ).matching( "Ty" ) ) // <2> + .add( f.match().field( "authors.lastName" ).matching( "Abraham" ) ) ) // <2> .fetchHits( 20 ); assertThat( hits ).isEmpty(); // <3> diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/paths/FieldPathsIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/paths/FieldPathsIT.java index 085e78bbaf6..a1d05cde19f 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/paths/FieldPathsIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/paths/FieldPathsIT.java @@ -79,9 +79,9 @@ public void nested_explicit() { // tag::nested_explicit[] List hits = searchSession.search( Book.class ) .where( f -> f.nested( "writers" ) - .must( f.match().field( "writers.firstName" ) // <1> + .add( f.match().field( "writers.firstName" ) // <1> .matching( "isaac" ) ) - .must( f.match().field( "writers.lastName" ) + .add( f.match().field( "writers.lastName" ) .matching( "asimov" ) ) ) .fetchHits( 20 ); @@ -99,11 +99,11 @@ public void withRoot() { List hits = searchSession.search( Book.class ) .where( f -> f.bool() .should( f.nested( "writers" ) - .must( matchFirstAndLastName( // <1> + .add( matchFirstAndLastName( // <1> f.withRoot( "writers" ), // <2> "bob", "kane" ) ) ) .should( f.nested( "artists" ) - .must( matchFirstAndLastName( // <3> + .add( matchFirstAndLastName( // <3> f.withRoot( "artists" ), // <4> "bill", "finger" ) ) ) ) .fetchHits( 20 ); 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 a2ab38a3903..54e0276e1d9 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 @@ -941,9 +941,9 @@ public void nested() { // tag::nested[] List hits = searchSession.search( Book.class ) .where( f -> f.nested( "authors" ) // <1> - .must( f.match().field( "authors.firstName" ) + .add( f.match().field( "authors.firstName" ) .matching( "isaac" ) ) // <2> - .must( f.match().field( "authors.lastName" ) + .add( f.match().field( "authors.lastName" ) .matching( "asimov" ) ) ) // <3> .fetchHits( 20 ); // <4> // end::nested[] diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericSimpleBooleanOperatorPredicateClausesStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericSimpleBooleanOperatorPredicateClausesStep.java index b655397a2f6..96bbabece91 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericSimpleBooleanOperatorPredicateClausesStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericSimpleBooleanOperatorPredicateClausesStep.java @@ -25,7 +25,7 @@ public interface GenericSimpleBooleanOperatorPredicateClausesStep S extends C, C extends SimpleBooleanOperatorPredicateClausesCollector > - extends SimpleBooleanOperatorPredicateClausesCollector { + extends SimpleBooleanOperatorPredicateClausesCollector, PredicateFinalStep { @Override default S add(PredicateFinalStep searchPredicate) { diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateClausesCollector.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateClausesCollector.java new file mode 100644 index 00000000000..02ff6573666 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateClausesCollector.java @@ -0,0 +1,19 @@ +/* + * Hibernate Search, full-text search for your domain model + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.search.engine.search.predicate.dsl; + +/** + * An object where the clauses + * of a {@link SearchPredicateFactory#nested(String) nested predicate} can be set. + *

+ * The resulting nested predicate must match all inner clauses, + * similarly to an {@link SearchPredicateFactory#and() "and" predicate}. + */ +public interface NestedPredicateClausesCollector> + extends SimpleBooleanOperatorPredicateClausesCollector { + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateClausesStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateClausesStep.java index 4a5da370175..732a3e35b5e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateClausesStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateClausesStep.java @@ -7,16 +7,17 @@ package org.hibernate.search.engine.search.predicate.dsl; /** - * The step in a nested predicate definition where clauses can be added. + * The step in a nested predicate definition where + * clauses can be added. *

- * Different types of clauses have different effects; - * see {@link BooleanPredicateOptionsCollector}. + * The resulting nested predicate must match all inner clauses, + * similarly to an {@link SearchPredicateFactory#and() "and" predicate}. * * @param The "self" type (the actual exposed type of this step). */ public interface NestedPredicateClausesStep> - extends GenericBooleanPredicateClausesStep>, - NestedPredicateOptionsCollector> { + extends GenericSimpleBooleanOperatorPredicateClausesStep>, + NestedPredicateClausesCollector> { // TODO HSEARCH-3090 add tuning methods, like the "score_mode" in Elasticsearch (avg, min, ...) diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateOptionsCollector.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateOptionsCollector.java deleted file mode 100644 index fedd617bc0c..00000000000 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateOptionsCollector.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Hibernate Search, full-text search for your domain model - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later - * See the lgpl.txt file in the root directory or . - */ -package org.hibernate.search.engine.search.predicate.dsl; - -/** - * An object where the clauses and options of a {@link SearchPredicateFactory#nested(String) nested predicate} can be set. - *

- * Different types of clauses have different effects, see {@link BooleanPredicateOptionsCollector}. - */ -public interface NestedPredicateOptionsCollector> - extends BooleanPredicateOptionsCollector { - -} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactory.java index b469ce6389f..e26fb8c702e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactory.java @@ -202,6 +202,9 @@ SimpleBooleanOperatorPredicateOptionsStep or(PredicateFinalStep firstSearchPr /** * Match documents where a {@link ObjectStructure#NESTED nested object} matches inner predicates * to be defined in the next steps. + *

+ * The resulting nested predicate must match all inner clauses, + * similarly to an {@link #and() "and" predicate}. * * @param objectFieldPath The path to the (nested) object field that must match. * @return The initial step of a DSL where the "nested" predicate can be defined. 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 8bdb735d625..0b4696f3118 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 @@ -30,6 +30,10 @@ * For the {@link SearchPredicateFactory#or() or} predicate, * documents will have to match any clauses (at least one). * + *

  • + * For the {@link SearchPredicateFactory#nested(String) nested} predicate, + * 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/predicate/dsl/impl/AbstractSimpleBooleanOperatorPredicateClausesStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractSimpleBooleanOperatorPredicateClausesStep.java new file mode 100644 index 00000000000..acf2f80b7d0 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractSimpleBooleanOperatorPredicateClausesStep.java @@ -0,0 +1,94 @@ +/* + * Hibernate Search, full-text search for your domain model + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.search.engine.search.predicate.dsl.impl; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +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.GenericSimpleBooleanOperatorPredicateClausesStep; +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.predicate.dsl.spi.AbstractPredicateFinalStep; +import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; +import org.hibernate.search.engine.search.predicate.spi.BooleanPredicateBuilder; + +public abstract class AbstractSimpleBooleanOperatorPredicateClausesStep> + extends AbstractPredicateFinalStep + implements GenericSimpleBooleanOperatorPredicateClausesStep { + + public enum SimpleBooleanPredicateOperator + implements BiConsumer { + AND { + @Override + public void accept(BooleanPredicateBuilder builder, + SearchPredicate searchPredicate) { + builder.must( searchPredicate ); + } + }, + OR { + @Override + public void accept(BooleanPredicateBuilder builder, + SearchPredicate searchPredicate) { + builder.should( searchPredicate ); + } + } + } + + private final SimpleBooleanPredicateOperator operator; + + private final BooleanPredicateBuilder builder; + + private final SearchPredicateFactory factory; + + AbstractSimpleBooleanOperatorPredicateClausesStep(SimpleBooleanPredicateOperator operator, + SearchPredicateDslContext dslContext, + SearchPredicateFactory factory) { + super( dslContext ); + this.operator = operator; + this.builder = dslContext.scope().predicateBuilders().bool(); + this.factory = factory; + } + + protected abstract S self(); + + @Override + public S add(SearchPredicate searchPredicate) { + operator.accept( builder, searchPredicate ); + return self(); + } + + @Override + public S add(Function clauseContributor) { + return add( clauseContributor.apply( factory ) ); + } + + public S boost(float boost) { + builder.boost( boost ); + return self(); + } + + public S constantScore() { + builder.constantScore(); + return self(); + } + + @Override + public S with(Consumer contributor) { + contributor.accept( self() ); + return self(); + } + + @Override + protected SearchPredicate build() { + return builder.build(); + } +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NestedPredicateClausesStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NestedPredicateClausesStepImpl.java index 2a518d5a496..9990a54cf7f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NestedPredicateClausesStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NestedPredicateClausesStepImpl.java @@ -8,7 +8,7 @@ import org.hibernate.search.engine.search.predicate.SearchPredicate; import org.hibernate.search.engine.search.predicate.dsl.NestedPredicateClausesStep; -import org.hibernate.search.engine.search.predicate.dsl.NestedPredicateOptionsCollector; +import org.hibernate.search.engine.search.predicate.dsl.NestedPredicateClausesCollector; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; import org.hibernate.search.engine.search.predicate.spi.NestedPredicateBuilder; @@ -16,14 +16,14 @@ public final class NestedPredicateClausesStepImpl - extends AbstractBooleanPredicateClausesStep> + extends AbstractSimpleBooleanOperatorPredicateClausesStep> implements NestedPredicateClausesStep { private final NestedPredicateBuilder builder; public NestedPredicateClausesStepImpl(SearchPredicateDslContext dslContext, String objectFieldPath, SearchPredicateFactory factory) { - super( dslContext, factory ); + super( SimpleBooleanPredicateOperator.AND, dslContext, factory ); this.builder = dslContext.scope().fieldQueryElement( objectFieldPath, PredicateTypeKeys.NESTED ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleBooleanOperatorPredicateClausesStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleBooleanOperatorPredicateClausesStepImpl.java index f53dc8989bf..cb5accd8dab 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleBooleanOperatorPredicateClausesStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleBooleanOperatorPredicateClausesStepImpl.java @@ -6,54 +6,21 @@ */ package org.hibernate.search.engine.search.predicate.dsl.impl; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; - import org.hibernate.search.engine.search.predicate.SearchPredicate; 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.predicate.dsl.spi.AbstractPredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -import org.hibernate.search.engine.search.predicate.spi.BooleanPredicateBuilder; public final class SimpleBooleanOperatorPredicateClausesStepImpl - extends AbstractPredicateFinalStep + extends AbstractSimpleBooleanOperatorPredicateClausesStep> implements SimpleBooleanOperatorPredicateClausesStep { - public enum SimpleBooleanPredicateOperator - implements BiConsumer { - AND { - @Override - public void accept(BooleanPredicateBuilder builder, - SearchPredicate searchPredicate) { - builder.must( searchPredicate ); - } - }, - OR { - @Override - public void accept(BooleanPredicateBuilder builder, - SearchPredicate searchPredicate) { - builder.should( searchPredicate ); - } - } - } - - private final SimpleBooleanPredicateOperator operator; - - private final BooleanPredicateBuilder builder; - - private final SearchPredicateFactory factory; - public SimpleBooleanOperatorPredicateClausesStepImpl(SimpleBooleanPredicateOperator operator, SearchPredicateDslContext dslContext, SearchPredicateFactory factory) { - super( dslContext ); - this.operator = operator; - this.builder = dslContext.scope().predicateBuilders().bool(); - this.factory = factory; + super( operator, dslContext, factory ); } public SimpleBooleanOperatorPredicateClausesStepImpl(SimpleBooleanPredicateOperator operator, @@ -81,36 +48,7 @@ public SimpleBooleanOperatorPredicateClausesStepImpl(SimpleBooleanPredicateOpera } @Override - public SimpleBooleanOperatorPredicateClausesStepImpl add(SearchPredicate searchPredicate) { - operator.accept( builder, searchPredicate ); + protected SimpleBooleanOperatorPredicateClausesStepImpl self() { return this; } - - @Override - public SimpleBooleanOperatorPredicateClausesStepImpl add( - Function clauseContributor) { - return add( clauseContributor.apply( factory ) ); - } - - public SimpleBooleanOperatorPredicateClausesStepImpl boost(float boost) { - builder.boost( boost ); - return this; - } - - public SimpleBooleanOperatorPredicateClausesStepImpl constantScore() { - builder.constantScore(); - return this; - } - - @Override - public SimpleBooleanOperatorPredicateClausesStepImpl with( - Consumer> contributor) { - contributor.accept( this ); - return this; - } - - @Override - protected SearchPredicate build() { - return builder.build(); - } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/spi/AbstractSearchPredicateFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/spi/AbstractSearchPredicateFactory.java index c0a1b7ee98c..0b84913dea8 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/spi/AbstractSearchPredicateFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/spi/AbstractSearchPredicateFactory.java @@ -6,8 +6,8 @@ */ package org.hibernate.search.engine.search.predicate.dsl.spi; -import static org.hibernate.search.engine.search.predicate.dsl.impl.SimpleBooleanOperatorPredicateClausesStepImpl.SimpleBooleanPredicateOperator.AND; -import static org.hibernate.search.engine.search.predicate.dsl.impl.SimpleBooleanOperatorPredicateClausesStepImpl.SimpleBooleanPredicateOperator.OR; +import static org.hibernate.search.engine.search.predicate.dsl.impl.AbstractSimpleBooleanOperatorPredicateClausesStep.SimpleBooleanPredicateOperator.AND; +import static org.hibernate.search.engine.search.predicate.dsl.impl.AbstractSimpleBooleanOperatorPredicateClausesStep.SimpleBooleanPredicateOperator.OR; import java.util.function.Consumer; diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/ObjectStructureIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/ObjectStructureIT.java index b93ed9cc84b..4365043aca0 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/ObjectStructureIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/ObjectStructureIT.java @@ -112,10 +112,10 @@ public void search_match() { query = scope.query() .where( f -> f.nested( "nestedObject" ) - .must( f.match().field( "nestedObject.string" ).matching( MATCHING_STRING ) ) - .must( f.match().field( "nestedObject.string_analyzed" ).matching( MATCHING_STRING_ANALYZED ) ) - .must( f.match().field( "nestedObject.integer" ).matching( MATCHING_INTEGER ) ) - .must( f.match().field( "nestedObject.localDate" ).matching( MATCHING_LOCAL_DATE ) ) + .add( f.match().field( "nestedObject.string" ).matching( MATCHING_STRING ) ) + .add( f.match().field( "nestedObject.string_analyzed" ).matching( MATCHING_STRING_ANALYZED ) ) + .add( f.match().field( "nestedObject.integer" ).matching( MATCHING_INTEGER ) ) + .add( f.match().field( "nestedObject.localDate" ).matching( MATCHING_LOCAL_DATE ) ) ) .toQuery(); assertThatQuery( query ) @@ -146,13 +146,13 @@ public void search_range() { query = scope.query() .where( f -> f.nested( "nestedObject" ) - .must( f.range().field( "nestedObject.string" ) + .add( f.range().field( "nestedObject.string" ) .between( MATCHING_STRING, MATCHING_STRING ) ) - .must( f.range().field( "nestedObject.integer" ) + .add( f.range().field( "nestedObject.integer" ) .between( MATCHING_INTEGER - 1, MATCHING_INTEGER + 1 ) ) - .must( f.range().field( "nestedObject.localDate" ) + .add( f.range().field( "nestedObject.localDate" ) .between( MATCHING_LOCAL_DATE.minusDays( 1 ), MATCHING_LOCAL_DATE.plusDays( 1 ) ) ) ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/dynamic/FieldTemplateIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/dynamic/FieldTemplateIT.java index 01ad3ebf8b5..107105c19c0 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/dynamic/FieldTemplateIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/dynamic/FieldTemplateIT.java @@ -273,8 +273,8 @@ private SearchQuery query( .where( f -> { if ( fieldStructure.isInNested() ) { return f.nested( getParentFieldPath() ) - .must( predicateContributor ) - .must( f.match().field( getFieldPath( "discriminator" ) ) + .add( predicateContributor ) + .add( f.match().field( getFieldPath( "discriminator" ) ) .matching( "included" ) ); } else { diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/dynamic/ObjectFieldTemplateIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/dynamic/ObjectFieldTemplateIT.java index 6fc6df4bdb3..f6d401c7505 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/dynamic/ObjectFieldTemplateIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/dynamic/ObjectFieldTemplateIT.java @@ -491,9 +491,9 @@ private SearchQuery query( private void checkNested(String objectFieldPath) { assertThatQuery( query( f -> f.nested( objectFieldPath ) - .must( f.match().field( objectFieldPath + "." + FIRSTNAME_FIELD ) + .add( f.match().field( objectFieldPath + "." + FIRSTNAME_FIELD ) .matching( FIRSTNAME_1 ) ) - .must( f.match().field( objectFieldPath + "." + LASTNAME_FIELD ) + .add( f.match().field( objectFieldPath + "." + LASTNAME_FIELD ) .matching( LASTNAME_1 ) ) ) ) .hasDocRefHitsAnyOrder( index.typeName(), DOCUMENT_MATCHING_FOR_NESTED ); @@ -502,19 +502,19 @@ private void checkNested(String objectFieldPath) { private void checkFlattened(String objectFieldPath) { assertThatThrownBy( () -> query( f -> f.nested( objectFieldPath ) - .must( f.match().field( objectFieldPath + "." + FIRSTNAME_FIELD ) + .add( f.match().field( objectFieldPath + "." + FIRSTNAME_FIELD ) .matching( FIRSTNAME_1 ) ) - .must( f.match().field( objectFieldPath + "." + LASTNAME_FIELD ) + .add( f.match().field( objectFieldPath + "." + LASTNAME_FIELD ) .matching( LASTNAME_1 ) ) ) ) .hasMessageContainingAll( "Cannot use 'predicate:nested' on field '" + objectFieldPath + "'.", "Some object field features require a nested structure; " + "try setting the field structure to 'NESTED' and reindexing all your data" ); assertThatQuery( query( - f -> f.bool() - .must( f.match().field( objectFieldPath + "." + FIRSTNAME_FIELD ) + f -> f.and() + .add( f.match().field( objectFieldPath + "." + FIRSTNAME_FIELD ) .matching( FIRSTNAME_1 ) ) - .must( f.match().field( objectFieldPath + "." + LASTNAME_FIELD ) + .add( f.match().field( objectFieldPath + "." + LASTNAME_FIELD ) .matching( LASTNAME_1 ) ) ) ) .hasDocRefHitsAnyOrder( index.typeName(), DOCUMENT_MATCHING_FOR_NESTED, DOCUMENT_MATCHING_FOR_ALL ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/multitenancy/MultiTenancyBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/multitenancy/MultiTenancyBaseIT.java index 807421a7bf3..ed658223672 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/multitenancy/MultiTenancyBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/multitenancy/MultiTenancyBaseIT.java @@ -141,7 +141,7 @@ public void search_on_nested_object_only_returns_elements_of_the_tenant() { ) ) .where( f -> f.nested( "nestedObject" ) - .must( f.match() + .add( f.match() .field( "nestedObject.string" ).matching( STRING_VALUE_1 ) ) ) .toQuery(); @@ -155,7 +155,7 @@ public void search_on_nested_object_only_returns_elements_of_the_tenant() { ) ) .where( f -> f.nested( "nestedObject" ) - .must( f.match() + .add( f.match() .field( "nestedObject.string" ).matching( STRING_VALUE_1 ) ) ) .toQuery(); @@ -256,7 +256,7 @@ public void update_only_updates_elements_of_the_tenant() { ) ) .where( f -> f.nested( "nestedObject" ) - .must( f.match() + .add( f.match() .field( "nestedObject.string" ).matching( UPDATED_STRING ) ) ) .toQuery(); @@ -283,7 +283,7 @@ public void update_only_updates_elements_of_the_tenant() { ) ) .where( f -> f.nested( "nestedObject" ) - .must( f.match() + .add( f.match() .field( "nestedObject.string" ).matching( UPDATED_STRING ) ) ) .toQuery(); @@ -308,7 +308,7 @@ public void update_only_updates_elements_of_the_tenant() { ) ) .where( f -> f.nested( "nestedObject" ) - .must( f.match() + .add( f.match() .field( "nestedObject.string" ).matching( STRING_VALUE_1 ) ) ) .toQuery(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateInObjectFieldIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateInObjectFieldIT.java index f32d4e9bd36..8a6a3bc7077 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateInObjectFieldIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateInObjectFieldIT.java @@ -66,7 +66,7 @@ public void flattenedX2() { public void nestedX1_explicit() { assertThatQuery( mainIndex.query() .where( f -> f.nested( binding.nested.absolutePath ) - .must( predicate( f, binding.nested, 0 ) ) ) + .add( predicate( f, binding.nested, 0 ) ) ) .routing( dataSet.routingKey ) ) .hasDocRefHitsAnyOrder( mainIndex.typeName(), dataSet.docId( 0 ) ); } @@ -83,8 +83,8 @@ public void nestedX1_implicit() { public void nestedX2_explicit() { assertThatQuery( mainIndex.query() .where( f -> f.nested( binding.nested.absolutePath ) - .must( f.nested( binding.nested.nested.absolutePath ) - .must( predicate( f, binding.nested.nested, 0 ) ) ) ) + .add( f.nested( binding.nested.nested.absolutePath ) + .add( predicate( f, binding.nested.nested, 0 ) ) ) ) .routing( dataSet.routingKey ) ) .hasDocRefHitsAnyOrder( mainIndex.typeName(), dataSet.docId( 0 ) ); } @@ -101,7 +101,7 @@ public void nestedX2_implicit() { public void nestedX2_explicit_implicit() { assertThatQuery( mainIndex.query() .where( f -> f.nested( binding.nested.absolutePath ) - .must( predicate( f, binding.nested.nested, 0 ) ) ) + .add( predicate( f, binding.nested.nested, 0 ) ) ) .routing( dataSet.routingKey ) ) .hasDocRefHitsAnyOrder( mainIndex.typeName(), dataSet.docId( 0 ) ); } @@ -110,8 +110,8 @@ public void nestedX2_explicit_implicit() { public void nestedX3_explicitX2_implicit() { assertThatQuery( mainIndex.query() .where( f -> f.nested( binding.nested.absolutePath ) - .must( f.nested( binding.nested.nested.absolutePath ) - .must( predicate( f, binding.nested.nested.nested, 0 ) ) ) ) + .add( f.nested( binding.nested.nested.absolutePath ) + .add( predicate( f, binding.nested.nested.nested, 0 ) ) ) ) .routing( dataSet.routingKey ) ) .hasDocRefHitsAnyOrder( mainIndex.typeName(), dataSet.docId( 0 ) ); } @@ -120,7 +120,7 @@ public void nestedX3_explicitX2_implicit() { public void nestedX3_explicit_implicitX2() { assertThatQuery( mainIndex.query() .where( f -> f.nested( binding.nested.absolutePath ) - .must( predicate( f, binding.nested.nested.nested, 0 ) ) ) + .add( predicate( f, binding.nested.nested.nested, 0 ) ) ) .routing( dataSet.routingKey ) ) .hasDocRefHitsAnyOrder( mainIndex.typeName(), dataSet.docId( 0 ) ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateSpecificsIT.java index 61268f6076c..c04d34ffefe 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateSpecificsIT.java @@ -150,7 +150,7 @@ public void inNestedPredicate_missing() { assertThatQuery( mainIndex.query() .where( f -> f.nested( mainIndex.binding().nestedObject.relativeFieldName ) - .mustNot( f.exists().field( fieldPath ) ) ) + .add( f.matchAll().except( f.exists().field( fieldPath ) ) ) ) .routing( dataSet.routingKey ) ) // No match for document 0, since all of its nested objects have this field .hasDocRefHitsAnyOrder( mainIndex.typeName(), dataSet.docId( 1 ), dataSet.docId( 2 ) ); 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 fe6acfd85f6..b9b0f6de524 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 @@ -66,23 +66,23 @@ public void search_nestedOnTwoLevels() { assertThatQuery( mainIndex.query() .where( f -> f.nested( "nestedObject" ) // This is referred to as "condition 1" in the data initialization method - .must( f.nested( "nestedObject.nestedObject" ) - .must( f.match() + .add( f.nested( "nestedObject.nestedObject" ) + .add( f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION1_FIELD1 ) ) - .must( f.match() + .add( f.match() .field( "nestedObject.nestedObject.field2" ) .matching( MATCHING_SECOND_LEVEL_CONDITION1_FIELD2 ) ) ) // This is referred to as "condition 2" in the data initialization method - .must( f.nested( "nestedObject.nestedObject" ) - .must( f.match() + .add( f.nested( "nestedObject.nestedObject" ) + .add( f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD1 ) ) - .must( f.match() + .add( f.match() .field( "nestedObject.nestedObject.field2" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD2 ) ) @@ -98,22 +98,22 @@ public void search_nestedOnTwoLevels_onlySecondLevel() { .where( (f, b) -> b // This is referred to as "condition 1" in the data initialization method .must( f.nested( "nestedObject.nestedObject" ) - .must( f.match() + .add( f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION1_FIELD1 ) ) - .must( f.match() + .add( f.match() .field( "nestedObject.nestedObject.field2" ) .matching( MATCHING_SECOND_LEVEL_CONDITION1_FIELD2 ) ) ) // This is referred to as "condition 2" in the data initialization method .must( f.nested( "nestedObject.nestedObject" ) - .must( f.match() + .add( f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD1 ) ) - .must( f.match() + .add( f.match() .field( "nestedObject.nestedObject.field2" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD2 ) ) @@ -130,11 +130,11 @@ public void with() { // This is referred to as "condition 1" in the data initialization method .must( f.nested( "nestedObject.nestedObject" ) .with( n -> { - n.must( f.match() + n.add( f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION1_FIELD1 ) ); - n.must( f.match() + n.add( f.match() .field( "nestedObject.nestedObject.field2" ) .matching( MATCHING_SECOND_LEVEL_CONDITION1_FIELD2 ) ); @@ -143,11 +143,11 @@ public void with() { // This is referred to as "condition 2" in the data initialization method .must( f.nested( "nestedObject.nestedObject" ) .with( n -> { - n.must( f.match() + n.add( f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD1 ) ); - n.must( f.match() + n.add( f.match() .field( "nestedObject.nestedObject.field2" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD2 ) ); @@ -162,17 +162,17 @@ public void with() { public void search_nestedOnTwoLevels_conditionOnFirstLevel() { assertThatQuery( mainIndex.query() .where( f -> f.nested( "nestedObject" ) - .must( f.match() + .add( f.match() .field( "nestedObject.string" ) .matching( MATCHING_STRING ) ) // This is referred to as "condition 2" in the data initialization method - .must( f.nested( "nestedObject.nestedObject" ) - .must( f.match() + .add( f.nested( "nestedObject.nestedObject" ) + .add( f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD1 ) ) - .must( f.match() + .add( f.match() .field( "nestedObject.nestedObject.field2" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD2 ) ) @@ -187,19 +187,19 @@ public void search_nestedOnTwoLevels_separatePredicates() { StubMappingScope scope = mainIndex.createScope(); SearchPredicate predicate1 = scope.predicate().nested( "nestedObject.nestedObject" ) - .must( f -> f.match() + .add( f -> f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION1_FIELD1 ) ) - .must( f -> f.match() + .add( f -> f.match() .field( "nestedObject.nestedObject.field2" ) .matching( MATCHING_SECOND_LEVEL_CONDITION1_FIELD2 ) ) .toPredicate(); SearchPredicate predicate2 = scope.predicate().nested( "nestedObject.nestedObject" ) - .must( f -> f.match() + .add( f -> f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD1 ) ) - .must( f -> f.match() + .add( f -> f.match() .field( "nestedObject.nestedObject.field2" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD2 ) ) .toPredicate(); @@ -207,9 +207,9 @@ public void search_nestedOnTwoLevels_separatePredicates() { assertThatQuery( scope.query() .where( f -> f.nested( "nestedObject" ) // This is referred to as "condition 1" in the data initialization method - .must( predicate1 ) + .add( predicate1 ) // This is referred to as "condition 2" in the data initialization method - .must( predicate2 ) + .add( predicate2 ) ) ) .hasDocRefHitsAnyOrder( mainIndex.typeName(), DOCUMENT_1 ) .hasTotalHitCount( 1 ); @@ -222,11 +222,11 @@ public void invalidNestedPath_parent() { assertThatThrownBy( () -> mainIndex.query() .where( f -> f.nested( objectFieldPath ) - .must( f.match() + .add( f.match() .field( fieldInParentPath ) .matching( "irrelevant_because_this_will_fail" ) ) - .must( f.match() + .add( f.match() .field( fieldInParentPath ) .matching( "irrelevant_because_this_will_fail" ) ) @@ -246,11 +246,11 @@ public void invalidNestedPath_sibling() { assertThatThrownBy( () -> mainIndex.query() .where( f -> f.nested( objectFieldPath ) - .must( f.match() + .add( f.match() .field( fieldInSiblingPath ) .matching( "irrelevant_because_this_will_fail" ) ) - .must( f.match() + .add( f.match() .field( fieldInSiblingPath ) .matching( "irrelevant_because_this_will_fail" ) ) @@ -274,23 +274,23 @@ public void multiIndex_missingNestedField() { SearchPredicateFactory f = scope.predicate(); SearchPredicate nestedPredicate = f.nested( "nestedObject" ) // This is referred to as "condition 1" in the data initialization method - .must( f.nested( "nestedObject.nestedObject" ) - .must( f.match() + .add( f.nested( "nestedObject.nestedObject" ) + .add( f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION1_FIELD1 ) ) - .must( f.match() + .add( f.match() .field( "nestedObject.nestedObject.field2" ) .matching( MATCHING_SECOND_LEVEL_CONDITION1_FIELD2 ) ) ) // This is referred to as "condition 2" in the data initialization method - .must( f.nested( "nestedObject.nestedObject" ) - .must( f.match() + .add( f.nested( "nestedObject.nestedObject" ) + .add( f.match() .field( "nestedObject.nestedObject.field1" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD1 ) ) - .must( f.match() + .add( f.match() .field( "nestedObject.nestedObject.field2" ) .matching( MATCHING_SECOND_LEVEL_CONDITION2_FIELD2 ) ) 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 20cff1c8f9e..bb3587f587b 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 @@ -116,7 +116,7 @@ public List> searchAroundMe(String terms, String tags, b.must( f.nested( "copies" ) .with( b2 -> { for ( LibraryServiceOption service : libraryServices ) { - b2.must( f.match() + b2.add( f.match() .field( "copies.library.services" ) .matching( service ) );