From d3f01ddf5416c7b915ab5e429e4ce475c5ee0142 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Tue, 7 May 2024 18:31:53 +0200 Subject: [PATCH 01/25] HSEARCH-3319 Add base scope/scope provider to the engine --- .../engine/mapper/scope/SearchScope.java | 128 ++++++++++++++++++ .../mapper/scope/SearchScopeProvider.java | 72 ++++++++++ .../search/mapper/orm/scope/SearchScope.java | 3 +- .../mapper/orm/scope/SearchScopeProvider.java | 5 +- .../pojo/standalone/scope/SearchScope.java | 4 +- .../standalone/scope/SearchScopeProvider.java | 3 +- 6 files changed, 210 insertions(+), 5 deletions(-) create mode 100644 engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java new file mode 100644 index 00000000000..6f1513bab3f --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java @@ -0,0 +1,128 @@ +/* + * 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.mapper.scope; + +import java.util.function.Function; + +import org.hibernate.search.engine.backend.scope.IndexScopeExtension; +import org.hibernate.search.engine.common.EntityReference; +import org.hibernate.search.engine.search.aggregation.AggregationKey; +import org.hibernate.search.engine.search.aggregation.SearchAggregation; +import org.hibernate.search.engine.search.aggregation.dsl.SearchAggregationFactory; +import org.hibernate.search.engine.search.highlighter.dsl.SearchHighlighterFactory; +import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory; +import org.hibernate.search.engine.search.query.dsl.SearchQueryOptionsStep; +import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; +import org.hibernate.search.engine.search.query.dsl.SearchQueryWhereStep; +import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory; +import org.hibernate.search.util.common.SearchException; + +/** + * Represents a set of types and the corresponding indexes. + *

+ * The scope can be used for search, to build search-related objects (predicate, sort, projection, aggregation, ...), + * or to define the targeted entities/indexes + * when passing it to the search session. + * + * @param A supertype of all types in this scope. + * @param The type of entity reference used by the scope. + */ +public interface SearchScope { + + /** + * Initiate the building of a search predicate. + *

+ * The predicate will only be valid for search queries + * created using this scope or another scope instance targeting the same indexes. + *

+ * Note this method is only necessary if you do not want to use lambda expressions, + * since you can {@link SearchQueryWhereStep#where(Function) define predicates with lambdas} + * within the search query DSL, + * removing the need to create separate objects to represent the predicates. + * + * @return A predicate factory. + * @see SearchPredicateFactory + */ + SearchPredicateFactory predicate(); + + /** + * Initiate the building of a search sort. + *

+ * The sort will only be valid for search queries + * created using this scope or another scope instance targeting the same indexes. + * or a wider scope. + *

+ * Note this method is only necessary if you do not want to use lambda expressions, + * since you can {@link SearchQueryOptionsStep#sort(Function) define sorts with lambdas} + * within the search query DSL, + * removing the need to create separate objects to represent the sorts. + * + * @return A sort factory. + * @see SearchSortFactory + */ + SearchSortFactory sort(); + + /** + * Initiate the building of a search projection that will be valid for the indexes in this scope. + *

+ * The projection will only be valid for search queries + * created using this scope or another scope instance targeting the same indexes. + *

+ * Note this method is only necessary if you do not want to use lambda expressions, + * since you can {@link SearchQuerySelectStep#select(Function)} define projections with lambdas} + * within the search query DSL, + * removing the need to create separate objects to represent the projections. + * + * @return A projection factory. + * @see SearchProjectionFactory + */ + SearchProjectionFactory projection(); + + /** + * Initiate the building of a search aggregation that will be valid for the indexes in this scope. + *

+ * The aggregation will only be usable in search queries + * created using this scope or another scope instance targeting the same indexes. + *

+ * Note this method is only necessary if you do not want to use lambda expressions, + * since you can {@link SearchQueryOptionsStep#aggregation(AggregationKey, SearchAggregation)} define aggregations with lambdas} + * within the search query DSL, + * removing the need to create separate objects to represent the aggregation. + * + * @return An aggregation factory. + * @see SearchAggregationFactory + */ + SearchAggregationFactory aggregation(); + + /** + * Initiate the building of a highlighter that will be valid for the indexes in this scope. + *

+ * The highlighter will only be valid for search queries + * created using this scope or another scope instance targeting the same indexes. + *

+ * Note this method is only necessary if you do not want to use lambda expressions, + * since you can {@link SearchQueryOptionsStep#highlighter(Function) define highlighters with lambdas} + * within the search query DSL, + * removing the need to create separate objects to represent the projections. + * + * @return A highlighter factory. + */ + SearchHighlighterFactory highlighter(); + + /** + * Extend the current search scope with the given extension, + * resulting in an extended search scope offering backend-specific utilities. + * + * @param extension The extension to apply. + * @param The type of search scope provided by the extension. + * @return The extended search scope. + * @throws SearchException If the extension cannot be applied (wrong underlying technology, ...). + */ + T extension(IndexScopeExtension extension); + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java new file mode 100644 index 00000000000..e4f40c162f1 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java @@ -0,0 +1,72 @@ +/* + * 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.mapper.scope; + +import java.util.Collection; +import java.util.Collections; + +import org.hibernate.search.engine.common.EntityReference; + +/** + * A provider of {@link SearchScope} instances. + */ +public interface SearchScopeProvider { + + /** + * Creates a {@link SearchScope} limited to + * indexed entity types among the given class and its subtypes. + * + * @param clazz A class that must be an indexed entity type or a supertype of such type. + * @param A supertype of all indexed entity types to include in the scope. + * @return The created scope. + * @see SearchScope + */ + default SearchScope scope(Class clazz) { + return scope( Collections.singleton( clazz ) ); + } + + /** + * Creates a {@link SearchScope} limited to + * indexed entity types among the given classes and their subtypes. + * + * @param classes A collection of classes. + * Each must be an indexed entity type or a supertype of such type. + * @param A supertype of all indexed entity types to include in the scope. + * @return The created scope. + * @see SearchScope + */ + SearchScope scope(Collection> classes); + + /** + * Creates a {@link SearchScope} limited to + * indexed entity types among the entity with the given name and its subtypes. + * + * @param expectedSuperType A supertype of all entity types to include in the scope. + * @param entityName An entity name. + * The referenced entity type must be an indexed entity type or a supertype of such type. + * @param A supertype of all indexed entity types to include in the scope. + * @return The created scope. + * @see SearchScope + */ + default SearchScope scope(Class expectedSuperType, String entityName) { + return scope( expectedSuperType, Collections.singleton( entityName ) ); + } + + /** + * Creates a {@link SearchScope} limited to + * indexed entity types among the entities with the given names and their subtypes. + * + * @param expectedSuperType A supertype of all indexed entity types to include in the scope. + * @param entityNames A collection of entity names. + * Each entity type referenced in the collection must be an indexed entity type or a supertype of such type. + * @param A supertype of all indexed entity types to include in the scope. + * @return The created scope. + * @see SearchScope + */ + SearchScope scope(Class expectedSuperType, Collection entityNames); + +} diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java index 14413a2228f..3b0105ea4c5 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java @@ -36,7 +36,8 @@ * * @param A supertype of all types in this scope. */ -public interface SearchScope { +@SuppressWarnings("deprecation") +public interface SearchScope extends org.hibernate.search.engine.mapper.scope.SearchScope { /** * Initiate the building of a search predicate. diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java index c74e5ef8c2a..90a4d95aac8 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java @@ -7,6 +7,8 @@ import java.util.Collection; import java.util.Collections; +import org.hibernate.search.engine.common.EntityReference; + import jakarta.persistence.Entity; /** @@ -15,7 +17,8 @@ * @see org.hibernate.search.mapper.orm.mapping.SearchMapping * @see org.hibernate.search.mapper.orm.session.SearchSession */ -public interface SearchScopeProvider { +@SuppressWarnings( "deprecation" ) +public interface SearchScopeProvider extends org.hibernate.search.engine.mapper.scope.SearchScopeProvider{ /** * Creates a {@link SearchScope} limited to diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java index eebe0134134..6ef339e69b0 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java @@ -40,7 +40,7 @@ * @param A supertype of all types in this scope. */ @Incubating -public interface SearchScope { +public interface SearchScope extends org.hibernate.search.engine.mapper.scope.SearchScope { /** * Initiate the building of a search predicate. @@ -88,7 +88,7 @@ public interface SearchScope { * @return A projection factory. * @see SearchProjectionFactory */ - SearchProjectionFactory projection(); + SearchProjectionFactory projection(); /** * Initiate the building of a search aggregation that will be valid for the indexes in this scope. diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java index 5fc8327a7a9..0ee57b9e93a 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.Collections; +import org.hibernate.search.engine.common.EntityReference; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; import org.hibernate.search.util.common.annotation.Incubating; @@ -17,7 +18,7 @@ * @see org.hibernate.search.mapper.pojo.standalone.session.SearchSession */ @Incubating -public interface SearchScopeProvider { +public interface SearchScopeProvider extends org.hibernate.search.engine.mapper.scope.SearchScopeProvider { /** * Creates a {@link SearchScope} limited to From 97be2eddd815fb995c35fe3e40f04ac14629b566 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Tue, 7 May 2024 18:58:18 +0200 Subject: [PATCH 02/25] HSEARCH-3319 Create reference traits interfaces --- .../search/reference/FieldReference.java | 20 +++++++++++++++++++ .../search/reference/RootReferenceScope.java | 15 ++++++++++++++ .../AggregationFieldReference.java | 10 ++++++++++ .../RangeAggregationFieldReference.java | 8 ++++++++ .../TermsAggregationFieldReference.java | 8 ++++++++ .../TypedAggregationFieldReference.java | 16 +++++++++++++++ .../object/FlattenedFieldReference.java | 8 ++++++++ .../object/NestedFieldReference.java | 8 ++++++++ .../object/ObjectFieldReference.java | 10 ++++++++++ .../ExistsPredicateFieldReference.java | 8 ++++++++ .../predicate/KnnPredicateFieldReference.java | 8 ++++++++ .../MatchPredicateFieldReference.java | 8 ++++++++ .../NestedPredicateFieldReference.java | 8 ++++++++ .../PhrasePredicateFieldReference.java | 8 ++++++++ .../predicate/PredicateFieldReference.java | 10 ++++++++++ .../PrefixPredicateFieldReference.java | 8 ++++++++ .../QueryStringPredicateFieldReference.java | 8 ++++++++ .../RangePredicateFieldReference.java | 8 ++++++++ .../RegexpPredicateFieldReference.java | 8 ++++++++ ...pleQueryStringPredicateFieldReference.java | 8 ++++++++ ...hinBoundingBoxPredicateFieldReference.java | 8 ++++++++ ...alWithinCirclePredicateFieldReference.java | 8 ++++++++ ...lWithinPolygonPredicateFieldReference.java | 8 ++++++++ .../TermsPredicateFieldReference.java | 8 ++++++++ .../TypedPredicateFieldReference.java | 17 ++++++++++++++++ .../WildcardPredicateFieldReference.java | 8 ++++++++ .../DistanceProjectionFieldReference.java | 8 ++++++++ .../FieldProjectionFieldReference.java | 8 ++++++++ .../HighlightProjectionFieldReference.java | 8 ++++++++ .../ObjectProjectionFieldReference.java | 8 ++++++++ .../projection/ProjectionFieldReference.java | 10 ++++++++++ .../TypedProjectionFieldReference.java | 17 ++++++++++++++++ .../sort/FieldSortFieldReference.java | 8 ++++++++ .../sort/ScoreSortFieldReference.java | 8 ++++++++ .../reference/sort/SortFieldReference.java | 10 ++++++++++ .../sort/TypedSortFieldReference.java | 16 +++++++++++++++ 36 files changed, 351 insertions(+) create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/FieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AggregationFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/RangeAggregationFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TermsAggregationFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TypedAggregationFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/object/FlattenedFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/object/NestedFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/object/ObjectFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/ExistsPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/KnnPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/MatchPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/NestedPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PhrasePredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/QueryStringPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RangePredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SimpleQueryStringPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinBoundingBoxPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinCirclePredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinPolygonPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TypedPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/projection/FieldProjectionFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/projection/HighlightProjectionFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ObjectProjectionFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ProjectionFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/sort/FieldSortFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/sort/ScoreSortFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/sort/SortFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/sort/TypedSortFieldReference.java diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/FieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/FieldReference.java new file mode 100644 index 00000000000..4073268968b --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/FieldReference.java @@ -0,0 +1,20 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference; + +import org.hibernate.search.util.common.annotation.Incubating; + +/** + * The most common interface for the field reference hierarchy. + * @param Containing type. + */ +@Incubating +public interface FieldReference { + + String absolutePath(); + + Class scopeRootType(); + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java new file mode 100644 index 00000000000..c3a195700b3 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java @@ -0,0 +1,15 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference; + +import org.hibernate.search.engine.common.EntityReference; +import org.hibernate.search.engine.mapper.scope.SearchScope; +import org.hibernate.search.engine.mapper.scope.SearchScopeProvider; + +public interface RootReferenceScope { + Class rootReferenceType(); + + , P extends SearchScopeProvider> S create(P scopeProvider); +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AggregationFieldReference.java new file mode 100644 index 00000000000..b1c38aaed4f --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AggregationFieldReference.java @@ -0,0 +1,10 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.aggregation; + +import org.hibernate.search.engine.search.reference.FieldReference; + +public interface AggregationFieldReference extends FieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/RangeAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/RangeAggregationFieldReference.java new file mode 100644 index 00000000000..7a5cdfaaf5e --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/RangeAggregationFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.aggregation; + +public interface RangeAggregationFieldReference extends TypedAggregationFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TermsAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TermsAggregationFieldReference.java new file mode 100644 index 00000000000..061c24ee540 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TermsAggregationFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.aggregation; + +public interface TermsAggregationFieldReference extends TypedAggregationFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TypedAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TypedAggregationFieldReference.java new file mode 100644 index 00000000000..96f638f1593 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TypedAggregationFieldReference.java @@ -0,0 +1,16 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.aggregation; + +import org.hibernate.search.engine.search.common.ValueModel; + +public interface TypedAggregationFieldReference extends AggregationFieldReference { + + Class aggregationType(); + + default ValueModel valueModel() { + return ValueModel.MAPPING; + } +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/object/FlattenedFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/FlattenedFieldReference.java new file mode 100644 index 00000000000..7379071e118 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/FlattenedFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.object; + +public interface FlattenedFieldReference extends ObjectFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/object/NestedFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/NestedFieldReference.java new file mode 100644 index 00000000000..9d7e7fdfb50 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/NestedFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.object; + +public interface NestedFieldReference extends ObjectFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/object/ObjectFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/ObjectFieldReference.java new file mode 100644 index 00000000000..8d6b616e640 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/ObjectFieldReference.java @@ -0,0 +1,10 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.object; + +import org.hibernate.search.engine.search.reference.FieldReference; + +public interface ObjectFieldReference extends FieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/ExistsPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/ExistsPredicateFieldReference.java new file mode 100644 index 00000000000..3392b749dcb --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/ExistsPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface ExistsPredicateFieldReference extends PredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/KnnPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/KnnPredicateFieldReference.java new file mode 100644 index 00000000000..8fe308e63d1 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/KnnPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface KnnPredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/MatchPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/MatchPredicateFieldReference.java new file mode 100644 index 00000000000..84d1fef7fa6 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/MatchPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface MatchPredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/NestedPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/NestedPredicateFieldReference.java new file mode 100644 index 00000000000..94f1aebc193 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/NestedPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface NestedPredicateFieldReference extends PredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PhrasePredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PhrasePredicateFieldReference.java new file mode 100644 index 00000000000..9f7d1501913 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PhrasePredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface PhrasePredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java new file mode 100644 index 00000000000..308ce02d85b --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java @@ -0,0 +1,10 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +import org.hibernate.search.engine.search.reference.FieldReference; + +public interface PredicateFieldReference extends FieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java new file mode 100644 index 00000000000..7f755ea6e02 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface PrefixPredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/QueryStringPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/QueryStringPredicateFieldReference.java new file mode 100644 index 00000000000..9a5dc6afd26 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/QueryStringPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface QueryStringPredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RangePredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RangePredicateFieldReference.java new file mode 100644 index 00000000000..b2b314aee13 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RangePredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface RangePredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java new file mode 100644 index 00000000000..d113b50a25e --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface RegexpPredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SimpleQueryStringPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SimpleQueryStringPredicateFieldReference.java new file mode 100644 index 00000000000..de6b471a451 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SimpleQueryStringPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface SimpleQueryStringPredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinBoundingBoxPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinBoundingBoxPredicateFieldReference.java new file mode 100644 index 00000000000..4bdf5dd5a82 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinBoundingBoxPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface SpatialWithinBoundingBoxPredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinCirclePredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinCirclePredicateFieldReference.java new file mode 100644 index 00000000000..0409cf6a9ab --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinCirclePredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface SpatialWithinCirclePredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinPolygonPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinPolygonPredicateFieldReference.java new file mode 100644 index 00000000000..b8b125bf35c --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinPolygonPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface SpatialWithinPolygonPredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java new file mode 100644 index 00000000000..91deefa1342 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface TermsPredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TypedPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TypedPredicateFieldReference.java new file mode 100644 index 00000000000..1bec47b7a0a --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TypedPredicateFieldReference.java @@ -0,0 +1,17 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.engine.search.reference.FieldReference; + +public interface TypedPredicateFieldReference extends FieldReference { + + Class predicateType(); + + default ValueModel valueModel() { + return ValueModel.MAPPING; + } +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java new file mode 100644 index 00000000000..226252be60f --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +public interface WildcardPredicateFieldReference extends TypedPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java new file mode 100644 index 00000000000..45e5e26fc16 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.projection; + +public interface DistanceProjectionFieldReference extends TypedProjectionFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/FieldProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/FieldProjectionFieldReference.java new file mode 100644 index 00000000000..a0157d25c7b --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/FieldProjectionFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.projection; + +public interface FieldProjectionFieldReference extends TypedProjectionFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/HighlightProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/HighlightProjectionFieldReference.java new file mode 100644 index 00000000000..07a314ff9f6 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/HighlightProjectionFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.projection; + +public interface HighlightProjectionFieldReference extends ProjectionFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ObjectProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ObjectProjectionFieldReference.java new file mode 100644 index 00000000000..1d4e7e4e4e9 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ObjectProjectionFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.projection; + +public interface ObjectProjectionFieldReference extends ProjectionFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ProjectionFieldReference.java new file mode 100644 index 00000000000..7cca7f2941f --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ProjectionFieldReference.java @@ -0,0 +1,10 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.projection; + +import org.hibernate.search.engine.search.reference.FieldReference; + +public interface ProjectionFieldReference extends FieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java new file mode 100644 index 00000000000..7c9373ff233 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java @@ -0,0 +1,17 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.projection; + +import org.hibernate.search.engine.search.common.ValueConvert; +import org.hibernate.search.engine.search.common.ValueModel; + +public interface TypedProjectionFieldReference extends ProjectionFieldReference { + + Class projectionType(); + + default ValueModel valueModel() { + return ValueModel.MAPPING; + } +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/FieldSortFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/FieldSortFieldReference.java new file mode 100644 index 00000000000..0a20f240fa7 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/FieldSortFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.sort; + +public interface FieldSortFieldReference extends TypedSortFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/ScoreSortFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/ScoreSortFieldReference.java new file mode 100644 index 00000000000..9300a25b71c --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/ScoreSortFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.sort; + +public interface ScoreSortFieldReference extends TypedSortFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/SortFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/SortFieldReference.java new file mode 100644 index 00000000000..0dcb59996da --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/SortFieldReference.java @@ -0,0 +1,10 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.sort; + +import org.hibernate.search.engine.search.reference.FieldReference; + +public interface SortFieldReference extends FieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/TypedSortFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/TypedSortFieldReference.java new file mode 100644 index 00000000000..100d39a8c44 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/TypedSortFieldReference.java @@ -0,0 +1,16 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.sort; + +import org.hibernate.search.engine.search.common.ValueModel; + +public interface TypedSortFieldReference extends SortFieldReference { + + Class sortType(); + + default ValueModel valueModel() { + return ValueModel.MAPPING; + } +} From 683e87c9d57c2166261ef2be2811200f6391572c Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 9 May 2024 10:09:54 +0200 Subject: [PATCH 03/25] HSEARCH-3319 Add context type --- .../elasticsearch/ElasticsearchExtension.java | 44 +++++----- .../ElasticsearchSearchIndexScopeImpl.java | 15 ++-- ...ElasticsearchSearchAggregationFactory.java | 7 +- ...ticsearchSearchAggregationFactoryImpl.java | 18 ++-- .../ElasticsearchSearchPredicateFactory.java | 6 +- ...asticsearchSearchPredicateFactoryImpl.java | 11 +-- .../impl/ElasticsearchNamedPredicate.java | 9 +- .../ElasticsearchSearchProjectionFactory.java | 5 +- ...sticsearchSearchProjectionFactoryImpl.java | 9 +- .../ElasticsearchSearchQueryOptionsStep.java | 11 +-- .../ElasticsearchSearchQuerySelectStep.java | 25 +++--- .../ElasticsearchSearchQueryWhereStep.java | 9 +- ...asticsearchSearchQueryOptionsStepImpl.java | 24 +++--- ...lasticsearchSearchQuerySelectStepImpl.java | 39 +++++---- .../ElasticsearchSearchQueryIndexScope.java | 8 +- .../dsl/ElasticsearchSearchSortFactory.java | 9 +- .../ElasticsearchSearchSortFactoryImpl.java | 25 +++--- .../backend/lucene/LuceneExtension.java | 41 ++++----- .../impl/LuceneSearchIndexScopeImpl.java | 14 +-- .../dsl/LuceneSearchAggregationFactory.java | 4 +- .../LuceneSearchAggregationFactoryImpl.java | 17 ++-- .../dsl/LuceneSearchPredicateFactory.java | 2 +- .../LuceneSearchPredicateFactoryImpl.java | 11 +-- .../predicate/impl/LuceneNamedPredicate.java | 9 +- .../dsl/LuceneSearchProjectionFactory.java | 5 +- .../LuceneSearchProjectionFactoryImpl.java | 9 +- .../dsl/LuceneSearchQueryOptionsStep.java | 9 +- .../dsl/LuceneSearchQuerySelectStep.java | 25 +++--- .../query/dsl/LuceneSearchQueryWhereStep.java | 4 +- .../LuceneSearchQueryOptionsStepImpl.java | 21 ++--- .../impl/LuceneSearchQuerySelectStepImpl.java | 39 +++++---- .../impl/LuceneSearchQueryIndexScope.java | 8 +- .../sort/dsl/LuceneSearchSortFactory.java | 8 +- .../dsl/impl/LuceneSearchSortFactoryImpl.java | 19 ++-- .../namedpredicate/SkuIdentifierBinder.java | 4 +- .../MyFieldProjectionBinder.java | 2 +- .../multi/MyFieldProjectionBinder.java | 2 +- .../annotation/MyFieldProjectionBinder.java | 2 +- .../param/string/MyFieldProjectionBinder.java | 2 +- .../simple/MyFieldProjectionBinder.java | 2 +- .../HibernateOrmEntryPointsIT.java | 21 ++--- .../GettingStartedDefaultAnalysisIT.java | 2 +- .../StandalonePojoEntryPointsIT.java | 21 ++--- .../GettingStartedDefaultAnalysisIT.java | 2 +- .../search/aggregation/AggregationDslIT.java | 2 +- .../search/paths/FieldPathsIT.java | 2 +- .../search/predicate/PredicateDslIT.java | 2 +- .../search/projection/ProjectionDslIT.java | 2 +- .../documentation/search/sort/SortDslIT.java | 2 +- .../mapping/impl/MappedIndexManagerImpl.java | 6 +- .../mapping/spi/MappedIndexManager.java | 4 +- .../engine/mapper/scope/SearchScope.java | 17 ++-- .../mapper/scope/SearchScopeProvider.java | 18 ++-- .../impl/MappedIndexScopeBuilderImpl.java | 4 +- .../scope/impl/MappedIndexScopeImpl.java | 12 +-- .../mapper/scope/spi/MappedIndexScope.java | 13 +-- .../scope/spi/MappedIndexScopeBuilder.java | 4 +- .../dsl/AggregationFilterStep.java | 3 +- .../dsl/AvgAggregationFieldStep.java | 7 +- .../dsl/AvgAggregationOptionsStep.java | 8 +- .../dsl/CountAggregationFieldStep.java | 5 +- .../dsl/CountAggregationOptionsStep.java | 8 +- .../CountDistinctAggregationFieldStep.java | 5 +- .../CountDistinctAggregationOptionsStep.java | 8 +- .../dsl/ExtendedSearchAggregationFactory.java | 26 +++--- .../dsl/MaxAggregationFieldStep.java | 7 +- .../dsl/MaxAggregationOptionsStep.java | 8 +- .../dsl/MinAggregationFieldStep.java | 7 +- .../dsl/MinAggregationOptionsStep.java | 8 +- .../dsl/RangeAggregationFieldStep.java | 9 +- .../dsl/RangeAggregationOptionsStep.java | 8 +- .../dsl/RangeAggregationRangeMoreStep.java | 12 +-- .../dsl/RangeAggregationRangeStep.java | 6 +- .../dsl/SearchAggregationFactory.java | 24 +++--- .../SearchAggregationFactoryExtension.java | 5 +- .../dsl/SumAggregationFieldStep.java | 7 +- .../dsl/SumAggregationOptionsStep.java | 8 +- .../dsl/TermsAggregationFieldStep.java | 9 +- .../dsl/TermsAggregationOptionsStep.java | 7 +- .../dsl/impl/AvgAggregationFieldStepImpl.java | 9 +- .../impl/AvgAggregationOptionsStepImpl.java | 12 +-- .../impl/CountAggregationFieldStepImpl.java | 10 +-- .../impl/CountAggregationOptionsStepImpl.java | 12 +-- ...CountDistinctAggregationFieldStepImpl.java | 10 +-- ...untDistinctAggregationOptionsStepImpl.java | 12 +-- .../dsl/impl/MaxAggregationFieldStepImpl.java | 9 +- .../impl/MaxAggregationOptionsStepImpl.java | 12 +-- .../dsl/impl/MinAggregationFieldStepImpl.java | 9 +- .../impl/MinAggregationOptionsStepImpl.java | 12 +-- .../impl/RangeAggregationFieldStepImpl.java | 9 +- .../impl/RangeAggregationRangeStepImpl.java | 22 +++-- .../dsl/impl/SumAggregationFieldStepImpl.java | 9 +- .../impl/SumAggregationOptionsStepImpl.java | 12 +-- .../impl/TermsAggregationFieldStepImpl.java | 9 +- .../impl/TermsAggregationOptionsStepImpl.java | 24 +++--- .../WithParametersAggregationFinalStep.java | 2 +- .../spi/AbstractSearchAggregationFactory.java | 29 ++++--- .../dsl/spi/SearchAggregationDslContext.java | 12 ++- .../definition/PredicateDefinition.java | 2 +- .../PredicateDefinitionContext.java | 9 +- .../dsl/BooleanPredicateClausesStep.java | 5 +- .../dsl/BooleanPredicateOptionsCollector.java | 10 +-- .../dsl/ExtendedSearchPredicateFactory.java | 5 +- .../GenericBooleanPredicateClausesStep.java | 14 +-- ...ericSimpleBooleanPredicateClausesStep.java | 8 +- .../predicate/dsl/KnnPredicateFieldStep.java | 5 +- .../dsl/KnnPredicateOptionsStep.java | 15 ++-- .../predicate/dsl/KnnPredicateVectorStep.java | 7 +- .../dsl/MatchAllPredicateOptionsStep.java | 4 +- .../dsl/NestedPredicateClausesCollector.java | 6 +- .../dsl/NestedPredicateClausesStep.java | 7 +- .../dsl/NestedPredicateFieldStep.java | 3 +- .../dsl/NestedPredicateNestStep.java | 4 +- .../predicate/dsl/SearchPredicateFactory.java | 26 +++--- .../dsl/SearchPredicateFactoryExtension.java | 4 +- ...teFactoryExtensionIfSupportedMoreStep.java | 6 +- ...dicateFactoryExtensionIfSupportedStep.java | 6 +- ...impleBooleanPredicateClausesCollector.java | 5 +- .../SimpleBooleanPredicateClausesStep.java | 5 +- .../AbstractBooleanPredicateClausesStep.java | 16 ++-- ...ractSimpleBooleanPredicateClausesStep.java | 11 +-- .../impl/BooleanPredicateClausesStepImpl.java | 11 +-- .../dsl/impl/KnnPredicateFieldStepImpl.java | 28 +++--- .../MatchAllPredicateOptionsStepImpl.java | 20 ++--- .../impl/NamedPredicateOptionsStepImpl.java | 2 +- .../impl/NestedPredicateClausesStepImpl.java | 13 +-- .../impl/NestedPredicateFieldStepImpl.java | 18 ++-- .../SearchPredicateFactoryExtensionStep.java | 16 ++-- ...SimpleBooleanPredicateClausesStepImpl.java | 17 ++-- .../spi/AbstractSearchPredicateFactory.java | 55 ++++++------ .../predicate/spi/NamedPredicateBuilder.java | 2 +- ...ValuesBasedPredicateDefinitionContext.java | 8 +- .../definition/ProjectionDefinition.java | 2 +- .../spi/CompositeProjectionDefinition.java | 4 +- .../spi/ConstantProjectionDefinition.java | 2 +- .../spi/DistanceProjectionDefinition.java | 6 +- .../spi/FieldProjectionDefinition.java | 6 +- .../spi/ObjectProjectionDefinition.java | 6 +- .../dsl/ExtendedSearchProjectionFactory.java | 5 +- .../dsl/SearchProjectionFactory.java | 9 +- .../dsl/SearchProjectionFactoryExtension.java | 4 +- ...onFactoryExtensionIfSupportedMoreStep.java | 7 +- ...ectionFactoryExtensionIfSupportedStep.java | 7 +- .../CompositeProjectionInnerStepImpl.java | 10 +-- .../impl/EntityProjectionOptionsStepImpl.java | 8 +- .../SearchProjectionFactoryExtensionStep.java | 14 +-- .../spi/AbstractSearchProjectionFactory.java | 13 +-- .../query/dsl/SearchQueryDslExtension.java | 5 +- .../query/dsl/SearchQueryOptionsStep.java | 8 +- .../query/dsl/SearchQuerySelectStep.java | 24 +++--- .../query/dsl/SearchQueryWhereStep.java | 8 +- .../impl/DefaultSearchQueryOptionsStep.java | 28 +++--- .../impl/DefaultSearchQuerySelectStep.java | 37 ++++---- ...stractDelegatingSearchQuerySelectStep.java | 41 ++++----- ...bstractExtendedSearchQueryOptionsStep.java | 11 +-- .../spi/AbstractSearchQueryOptionsStep.java | 15 ++-- .../spi/AbstractSearchQuerySelectStep.java | 11 +-- .../query/spi/SearchQueryIndexScope.java | 8 +- .../search/reference/RootReferenceScope.java | 2 +- .../TypedProjectionFieldReference.java | 1 - .../sort/dsl/CompositeSortComponentsStep.java | 5 +- .../sort/dsl/DistanceSortOptionsStep.java | 8 +- .../sort/dsl/ExtendedSearchSortFactory.java | 14 +-- .../search/sort/dsl/FieldSortOptionsStep.java | 5 +- .../search/sort/dsl/ScoreSortOptionsStep.java | 5 +- .../search/sort/dsl/SearchSortFactory.java | 25 +++--- .../sort/dsl/SearchSortFactoryExtension.java | 5 +- ...rtFactoryExtensionIfSupportedMoreStep.java | 7 +- ...chSortFactoryExtensionIfSupportedStep.java | 6 +- .../search/sort/dsl/SortFilterStep.java | 2 +- .../engine/search/sort/dsl/SortThenStep.java | 5 +- .../impl/CompositeSortComponentsStepImpl.java | 12 +-- .../dsl/impl/DistanceSortOptionsStepImpl.java | 32 +++---- .../dsl/impl/FieldSortOptionsStepImpl.java | 32 +++---- .../dsl/impl/ScoreSortOptionsStepImpl.java | 10 +-- .../impl/SearchSortFactoryExtensionStep.java | 24 +++--- .../dsl/impl/WithParametersSortFinalStep.java | 4 +- .../dsl/spi/AbstractSearchSortFactory.java | 43 +++++----- .../sort/dsl/spi/AbstractSortThenStep.java | 12 +-- .../sort/dsl/spi/SearchSortDslContext.java | 30 ++++--- .../sort/dsl/spi/StaticSortThenStep.java | 4 +- .../ElasticsearchExtensionIT.java | 18 ++-- .../ElasticsearchShardsFailedExceptionIT.java | 2 +- .../ElasticsearchBoolSearchPredicateIT.java | 4 +- .../util/ElasticsearchTckBackendHelper.java | 9 +- .../backend/lucene/LuceneExtensionIT.java | 24 +++--- .../cache/LuceneQueryCacheConfigurerIT.java | 2 +- .../search/LuceneBoolSearchPredicateIT.java | 4 +- .../LuceneFloatingPointInfinitySearchIT.java | 2 +- .../LuceneSearchTopDocsMergeFieldSortIT.java | 4 +- .../util/LuceneTckBackendHelper.java | 9 +- .../backend/tck/dynamic/FieldTemplateIT.java | 2 +- .../tck/dynamic/ObjectFieldTemplateIT.java | 2 +- .../search/aggregation/AggregationBaseIT.java | 12 +-- .../MetricNumericFieldsAggregationsIT.java | 6 +- .../RangeAggregationSpecificsIT.java | 4 +- .../SingleFieldAggregationBaseIT.java | 10 +-- ...ggregationTypeCheckingAndConversionIT.java | 4 +- .../TermsAggregationSpecificsIT.java | 2 +- .../bool/BooleanSortAndRangePredicateIT.java | 4 +- ...bstractBaseQueryStringPredicateBaseIT.java | 86 +++++++++---------- ...ctBaseQueryStringPredicateSpecificsIT.java | 2 +- .../AbstractPredicateArgumentCheckingIT.java | 4 +- ...stractPredicateConfigurableAnalysisIT.java | 4 +- ...AbstractPredicateFieldInObjectFieldIT.java | 6 +- .../AbstractPredicateFieldScoreIT.java | 24 +++--- .../AbstractPredicateInObjectFieldIT.java | 4 +- .../AbstractPredicateInvalidFieldIT.java | 8 +- .../AbstractPredicateMultiFieldIT.java | 6 +- .../AbstractPredicateScaleCheckingIT.java | 2 +- .../predicate/AbstractPredicateScoreIT.java | 8 +- .../AbstractPredicateSearchableIT.java | 6 +- .../AbstractPredicateSimpleAnalysisIT.java | 2 +- .../AbstractPredicateSingleFieldIT.java | 4 +- ...tPredicateTypeCheckingAndConversionIT.java | 34 ++++---- ...ctPredicateTypeCheckingNoConversionIT.java | 4 +- .../AbstractPredicateUnsupportedTypeIT.java | 4 +- .../search/predicate/AndPredicateBaseIT.java | 16 ++-- .../search/predicate/BoolPredicateBaseIT.java | 8 +- .../predicate/BoolPredicateSpecificsIT.java | 4 +- .../predicate/ExistsPredicateBaseIT.java | 24 +++--- .../ExistsPredicateObjectsBaseIT.java | 13 +-- .../ExistsPredicateObjectsSpecificsIT.java | 8 +- .../search/predicate/KnnPredicateBaseIT.java | 28 +++--- .../predicate/KnnPredicateSpecificsIT.java | 20 ++--- .../predicate/MatchAllPredicateBaseIT.java | 10 +-- .../MatchAllPredicateSpecificsIT.java | 4 +- .../predicate/MatchIdPredicateBaseIT.java | 10 +-- .../MatchIdPredicateSpecificsIT.java | 2 +- .../predicate/MatchPredicateBaseIT.java | 52 +++++------ .../predicate/MatchPredicateSpecificsIT.java | 6 +- .../predicate/NamedPredicateBaseIT.java | 14 +-- ...medPredicateMultiIndexCompatibilityIT.java | 2 +- .../predicate/NestedPredicateLegacyIT.java | 2 +- .../predicate/NestedPredicateSpecificsIT.java | 2 +- .../search/predicate/NotPredicateBaseIT.java | 8 +- .../predicate/NotPredicateSpecificsIT.java | 2 +- .../search/predicate/OrPredicateBaseIT.java | 16 ++-- .../predicate/PhrasePredicateBaseIT.java | 46 +++++----- .../PredicateDefinitionContextIT.java | 2 +- .../predicate/PrefixPredicateBaseIT.java | 38 ++++---- .../predicate/QueryStringPredicateBaseIT.java | 2 +- .../QueryStringPredicateSpecificsIT.java | 2 +- .../predicate/RangePredicateBaseIT.java | 50 +++++------ .../predicate/RegexpPredicateBaseIT.java | 38 ++++---- .../search/predicate/SearchPredicateIT.java | 32 +++---- .../SimpleQueryStringPredicateBaseIT.java | 2 +- ...SimpleQueryStringPredicateSpecificsIT.java | 2 +- ...atialWithinBoundingBoxPredicateBaseIT.java | 38 ++++---- .../SpatialWithinCirclePredicateBaseIT.java | 40 ++++----- .../SpatialWithinPolygonPredicateBaseIT.java | 38 ++++---- .../predicate/TermsPredicateBaseIT.java | 50 +++++------ .../predicate/WildcardPredicateBaseIT.java | 38 ++++---- .../AbstractCompositeProjectionFromAsIT.java | 24 +++--- ...ctDistanceProjectionMultiValuedBaseIT.java | 8 +- ...tDistanceProjectionSingleValuedBaseIT.java | 10 +-- .../AbstractEntityProjectionIT.java | 20 ++--- .../AbstractEntityReferenceProjectionIT.java | 6 +- ...bstractProjectionInObjectProjectionIT.java | 5 +- .../AbstractProjectionInvalidFieldIT.java | 8 +- .../AbstractProjectionProjectableIT.java | 8 +- .../AbstractProjectionUnsupportedTypesIT.java | 2 +- .../projection/CompositeProjectionBaseIT.java | 4 +- .../projection/DistanceProjectionBaseIT.java | 11 +-- .../DistanceProjectionMultiValuedBaseIT.java | 8 +- ...eProjectionParameterMultiValuedBaseIT.java | 8 +- ...ProjectionParameterSingleValuedBaseIT.java | 10 +-- .../DistanceProjectionSingleValuedBaseIT.java | 10 +-- .../search/projection/EntityProjectionIT.java | 10 +-- .../EntityReferenceProjectionIT.java | 2 +- .../projection/FieldProjectionBaseIT.java | 9 +- .../projection/ObjectProjectionBaseIT.java | 4 +- .../ObjectProjectionSpecificsIT.java | 4 +- .../search/projection/SearchProjectionIT.java | 20 ++--- .../tck/search/query/SearchQueryBaseIT.java | 28 +++--- .../tck/search/query/SearchQueryFetchIT.java | 10 +-- .../query/SearchQueryLoadingOptionsIT.java | 8 +- .../tck/search/query/SearchQueryScrollIT.java | 10 +-- .../SearchQueryScrollResultLoadingIT.java | 7 +- .../tck/search/query/SearchQuerySelectIT.java | 22 +++-- .../search/query/SearchQueryTimeoutIT.java | 4 +- .../sort/AbstractSortInvalidFieldIT.java | 8 +- .../search/sort/AbstractSortSortableIT.java | 8 +- .../sort/AbstractSortUnsupportedTypesIT.java | 2 +- .../tck/search/sort/CompositeSortIT.java | 4 +- .../tck/search/sort/DistanceSortBaseIT.java | 6 +- .../sort/DistanceSortDynamicFieldIT.java | 6 +- .../DistanceSortFilteringSpecificsIT.java | 4 +- .../search/sort/DistanceSortSpecificsIT.java | 12 +-- ...stanceSortTypeCheckingAndConversionIT.java | 4 +- .../tck/search/sort/FieldSortBaseIT.java | 6 +- .../search/sort/FieldSortDynamicFieldIT.java | 4 +- .../sort/FieldSortFilteringSpecificsIT.java | 4 +- .../tck/search/sort/FieldSortSpecificsIT.java | 29 ++++--- .../FieldSortTypeCheckingAndConversionIT.java | 6 +- .../backend/tck/search/sort/SearchSortIT.java | 50 +++++------ .../RangeAggregationDescriptor.java | 11 +-- .../TermsAggregationDescriptor.java | 10 +-- .../expectations/AggregationScenario.java | 8 +- ...tedSingleFieldAggregationExpectations.java | 2 +- .../testsupport/util/TckBackendHelper.java | 8 +- .../RealBackendDatabaseMultitenancyIT.java | 2 +- .../orm/dynamicmap/DynamicMapBaseIT.java | 2 +- .../mapper/orm/mapping/SearchMappingIT.java | 6 +- .../mapper/orm/search/SearchQueryBaseIT.java | 10 +-- .../AbstractSearchQueryEntityLoadingIT.java | 2 +- .../mapper/pojo/mapping/SearchMappingIT.java | 6 +- ...tomConstructorMappingAnnotationBaseIT.java | 2 +- ...ethodParameterMappingAnnotationBaseIT.java | 2 +- .../AbstractProjectionConstructorIT.java | 2 +- ...jectionConstructorProjectionBindingIT.java | 6 +- .../AbstractSearchQueryEntityLoadingIT.java | 2 +- .../pojo/smoke/AnnotationMappingSmokeIT.java | 2 +- .../smoke/ProgrammaticMappingSmokeIT.java | 2 +- ...ationStandalonePojoSearchScopeAdapter.java | 16 ++-- ...ionStandalonePojoSearchSessionAdapter.java | 2 +- .../orm/mapping/impl/HibernateOrmMapping.java | 33 +++---- .../search/mapper/orm/scope/SearchScope.java | 11 +-- .../mapper/orm/scope/SearchScopeProvider.java | 20 +++-- .../orm/scope/impl/SearchScopeImpl.java | 22 +++-- .../mapper/orm/session/SearchSession.java | 32 ++++++- .../session/impl/DelegatingSearchSession.java | 29 +++++-- .../impl/HibernateOrmSearchSession.java | 41 +++++---- ...bernateOrmSearchSessionMappingContext.java | 4 +- .../mapper/orm/spi/BatchMappingContext.java | 6 +- .../mapping/impl/PojoIndexedTypeManager.java | 4 +- .../mapping/impl/PojoMappingDelegateImpl.java | 8 +- .../pojo/mapping/spi/PojoMappingDelegate.java | 11 ++- .../impl/PojoDefaultMassIndexer.java | 4 +- .../PojoMassIndexingBatchCoordinator.java | 4 +- .../scope/impl/PojoScopeDelegateImpl.java | 20 ++--- .../impl/PojoScopeIndexedTypeContext.java | 4 +- .../pojo/scope/spi/PojoScopeDelegate.java | 13 +-- .../DocumentReferenceProjectionBinder.java | 2 +- .../builtin/EntityProjectionBinder.java | 2 +- .../EntityReferenceProjectionBinder.java | 2 +- .../builtin/HighlightProjectionBinder.java | 2 +- .../binding/builtin/IdProjectionBinder.java | 2 +- .../builtin/ScoreProjectionBinder.java | 2 +- .../PojoConstructorProjectionDefinition.java | 2 +- .../mapping/impl/StandalonePojoMapping.java | 26 +++--- .../pojo/standalone/scope/SearchScope.java | 10 +-- .../standalone/scope/SearchScopeProvider.java | 12 ++- .../scope/impl/SearchScopeImpl.java | 16 ++-- .../standalone/session/SearchSession.java | 27 +++++- .../impl/StandalonePojoSearchSession.java | 20 +++-- ...dalonePojoSearchSessionMappingContext.java | 4 +- .../impl/StubSearchAggregationFactory.java | 13 +-- .../common/impl/StubSearchIndexScope.java | 14 +-- .../dsl/impl/StubSearchPredicateFactory.java | 8 +- .../predicate/impl/StubSearchPredicate.java | 2 +- .../dsl/impl/StubSearchProjectionFactory.java | 7 +- .../sort/dsl/impl/StubSearchSortFactory.java | 12 +-- .../mapper/stub/GenericStubMappingScope.java | 22 ++--- .../mapper/stub/StubMappedIndex.java | 10 +-- .../mapper/stub/StubMappingScope.java | 4 +- ...tractConnectedMultiFieldsQueryBuilder.java | 6 +- .../query/dsl/impl/BooleanQueryBuilder.java | 4 +- .../query/dsl/impl/ConnectedAllContext.java | 4 +- ...ConnectedMultiFieldsMatchQueryBuilder.java | 2 +- ...onnectedMultiFieldsPhraseQueryBuilder.java | 2 +- ...ConnectedMultiFieldsRangeQueryBuilder.java | 2 +- ...tiFieldsSimpleQueryStringQueryBuilder.java | 6 +- ...nectedMultiFieldsWildcardQueryBuilder.java | 2 +- .../impl/ConnectedSpatialQueryBuilder.java | 2 +- .../query/dsl/impl/DiscreteFacetRequest.java | 4 +- .../query/dsl/impl/FacetingRequestImpl.java | 2 +- .../impl/MinimumShouldMatchContextImpl.java | 4 +- .../query/dsl/impl/QueryCustomizer.java | 6 +- .../query/dsl/impl/RangeFacetRequest.java | 6 +- .../query/dsl/sort/impl/SortFieldStates.java | 12 +-- .../query/engine/impl/FacetManagerImpl.java | 7 +- .../search/query/engine/impl/HSQueryImpl.java | 6 +- .../engine/spi/V5MigrationSearchSession.java | 2 +- .../scope/spi/V5MigrationSearchScope.java | 8 +- .../search/impl/FullTextSessionImpl.java | 2 +- .../V5MigrationOrmSearchScopeAdapter.java | 18 ++-- 377 files changed, 2245 insertions(+), 1948 deletions(-) diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/ElasticsearchExtension.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/ElasticsearchExtension.java index 3e9e938100a..e7b04f5ddf3 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/ElasticsearchExtension.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/ElasticsearchExtension.java @@ -60,21 +60,23 @@ * * @see #get() */ -public final class ElasticsearchExtension - implements SearchQueryDslExtension, R, E, LOS>, +public final class ElasticsearchExtension + implements SearchQueryDslExtension, R, E, LOS>, SearchQueryExtension, H>, - SearchPredicateFactoryExtension, - SearchSortFactoryExtension, - SearchProjectionFactoryExtension, R, E>, - SearchAggregationFactoryExtension, + SearchPredicateFactoryExtension>, + SearchSortFactoryExtension>, + SearchProjectionFactoryExtension, R, E>, + SearchAggregationFactoryExtension>, IndexFieldTypeFactoryExtension, SchemaExportExtension { - private static final ElasticsearchExtension INSTANCE = new ElasticsearchExtension<>(); + private static final ElasticsearchExtension INSTANCE = + new ElasticsearchExtension<>(); /** * Get the extension with generic parameters automatically set as appropriate for the context in which it's used. * + * @param Scope root type. * @param The type of query hits. * Users should not have to care about this, as the parameter will automatically take the appropriate value when calling * {@code .extension( ElasticsearchExtension.get() )}. @@ -90,8 +92,8 @@ public final class ElasticsearchExtension * @return The extension. */ @SuppressWarnings("unchecked") // The instance works for any H, R, E and LOS - public static ElasticsearchExtension get() { - return (ElasticsearchExtension) INSTANCE; + public static ElasticsearchExtension get() { + return (ElasticsearchExtension) INSTANCE; } private ElasticsearchExtension() { @@ -102,8 +104,8 @@ private ElasticsearchExtension() { * {@inheritDoc} */ @Override - public Optional> extendOptional( - SearchQuerySelectStep original, + public Optional> extendOptional( + SearchQuerySelectStep original, SearchQueryIndexScope scope, BackendSessionContext sessionContext, SearchLoadingContextBuilder loadingContextBuilder) { @@ -135,9 +137,9 @@ public Optional> extendOptional(SearchQuery origi * {@inheritDoc} */ @Override - public Optional extendOptional(SearchPredicateFactory original) { + public Optional> extendOptional(SearchPredicateFactory original) { if ( original instanceof ElasticsearchSearchPredicateFactory ) { - return Optional.of( (ElasticsearchSearchPredicateFactory) original ); + return Optional.of( (ElasticsearchSearchPredicateFactory) original ); } else { return Optional.empty(); @@ -148,10 +150,10 @@ public Optional extendOptional(SearchPredic * {@inheritDoc} */ @Override - public Optional extendOptional( - SearchSortFactory original) { + public Optional> extendOptional( + SearchSortFactory original) { if ( original instanceof ElasticsearchSearchSortFactory ) { - return Optional.of( (ElasticsearchSearchSortFactory) original ); + return Optional.of( (ElasticsearchSearchSortFactory) original ); } else { return Optional.empty(); @@ -162,9 +164,9 @@ public Optional extendOptional( * {@inheritDoc} */ @Override - public Optional> extendOptional(SearchProjectionFactory original) { + public Optional> extendOptional(SearchProjectionFactory original) { if ( original instanceof ElasticsearchSearchProjectionFactory ) { - return Optional.of( (ElasticsearchSearchProjectionFactory) original ); + return Optional.of( (ElasticsearchSearchProjectionFactory) original ); } else { return Optional.empty(); @@ -175,10 +177,10 @@ public Optional> extendOptional(Searc * {@inheritDoc} */ @Override - public Optional extendOptional( - SearchAggregationFactory original) { + public Optional> extendOptional( + SearchAggregationFactory original) { if ( original instanceof ElasticsearchSearchAggregationFactory ) { - return Optional.of( (ElasticsearchSearchAggregationFactory) original ); + return Optional.of( (ElasticsearchSearchAggregationFactory) original ); } else { return Optional.empty(); diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/scope/model/impl/ElasticsearchSearchIndexScopeImpl.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/scope/model/impl/ElasticsearchSearchIndexScopeImpl.java index cd294b43fbc..06790ce68d3 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/scope/model/impl/ElasticsearchSearchIndexScopeImpl.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/scope/model/impl/ElasticsearchSearchIndexScopeImpl.java @@ -171,24 +171,25 @@ public

ElasticsearchSearchQueryBuilder

select(BackendSessionContext sessi } @Override - public ElasticsearchSearchPredicateFactory predicateFactory() { - return new ElasticsearchSearchPredicateFactoryImpl( SearchPredicateDslContext.root( this ) ); + public ElasticsearchSearchPredicateFactory predicateFactory() { + return new ElasticsearchSearchPredicateFactoryImpl( SearchPredicateDslContext.root( this ) ); } @Override - public ElasticsearchSearchSortFactory sortFactory() { - return new ElasticsearchSearchSortFactoryImpl( SearchSortDslContext + public ElasticsearchSearchSortFactory sortFactory() { + return new ElasticsearchSearchSortFactoryImpl( SearchSortDslContext .root( this, ElasticsearchSearchSortFactoryImpl::new, predicateFactory() ) ); } @Override - public ElasticsearchSearchProjectionFactory projectionFactory() { + public ElasticsearchSearchProjectionFactory projectionFactory() { return new ElasticsearchSearchProjectionFactoryImpl<>( SearchProjectionDslContext.root( this ) ); } @Override - public ElasticsearchSearchAggregationFactory aggregationFactory() { - return new ElasticsearchSearchAggregationFactoryImpl( SearchAggregationDslContext.root( this, predicateFactory() ) ); + public ElasticsearchSearchAggregationFactory aggregationFactory() { + return new ElasticsearchSearchAggregationFactoryImpl( + SearchAggregationDslContext.root( this, predicateFactory() ) ); } @Override diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/ElasticsearchSearchAggregationFactory.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/ElasticsearchSearchAggregationFactory.java index 7b9f1f5cc83..15c04e6258d 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/ElasticsearchSearchAggregationFactory.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/ElasticsearchSearchAggregationFactory.java @@ -10,8 +10,11 @@ import com.google.gson.JsonObject; -public interface ElasticsearchSearchAggregationFactory - extends ExtendedSearchAggregationFactory { +public interface ElasticsearchSearchAggregationFactory + extends + ExtendedSearchAggregationFactory, + ElasticsearchSearchPredicateFactory> { /** * Create an aggregation from JSON. diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/impl/ElasticsearchSearchAggregationFactoryImpl.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/impl/ElasticsearchSearchAggregationFactoryImpl.java index 69d42d1ef1e..633662fcc28 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/impl/ElasticsearchSearchAggregationFactoryImpl.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/impl/ElasticsearchSearchAggregationFactoryImpl.java @@ -13,22 +13,24 @@ import com.google.gson.JsonObject; -public class ElasticsearchSearchAggregationFactoryImpl +public class ElasticsearchSearchAggregationFactoryImpl extends AbstractSearchAggregationFactory< - ElasticsearchSearchAggregationFactory, + SR, + ElasticsearchSearchAggregationFactory, ElasticsearchSearchAggregationIndexScope, - ElasticsearchSearchPredicateFactory> - implements ElasticsearchSearchAggregationFactory { + ElasticsearchSearchPredicateFactory> + implements ElasticsearchSearchAggregationFactory { public ElasticsearchSearchAggregationFactoryImpl( - SearchAggregationDslContext, - ElasticsearchSearchPredicateFactory> dslContext) { + SearchAggregationDslContext, + ElasticsearchSearchPredicateFactory> dslContext) { super( dslContext ); } @Override - public ElasticsearchSearchAggregationFactory withRoot(String objectFieldPath) { - return new ElasticsearchSearchAggregationFactoryImpl( dslContext.rescope( + public ElasticsearchSearchAggregationFactory withRoot(String objectFieldPath) { + return new ElasticsearchSearchAggregationFactoryImpl( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/ElasticsearchSearchPredicateFactory.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/ElasticsearchSearchPredicateFactory.java index f63904b2aab..e7566795856 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/ElasticsearchSearchPredicateFactory.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/ElasticsearchSearchPredicateFactory.java @@ -11,9 +11,11 @@ /** * A factory for search predicates with some Elasticsearch-specific methods. + * + * @param Scope root type. */ -public interface ElasticsearchSearchPredicateFactory - extends ExtendedSearchPredicateFactory { +public interface ElasticsearchSearchPredicateFactory + extends ExtendedSearchPredicateFactory> { /** * Create a predicate from JSON. diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/impl/ElasticsearchSearchPredicateFactoryImpl.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/impl/ElasticsearchSearchPredicateFactoryImpl.java index 4d17c8d8ffa..b4b5f77bd1e 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/impl/ElasticsearchSearchPredicateFactoryImpl.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/impl/ElasticsearchSearchPredicateFactoryImpl.java @@ -13,11 +13,12 @@ import com.google.gson.JsonObject; -public class ElasticsearchSearchPredicateFactoryImpl +public class ElasticsearchSearchPredicateFactoryImpl extends AbstractSearchPredicateFactory< - ElasticsearchSearchPredicateFactory, + SR, + ElasticsearchSearchPredicateFactory, ElasticsearchSearchPredicateIndexScope> - implements ElasticsearchSearchPredicateFactory { + implements ElasticsearchSearchPredicateFactory { public ElasticsearchSearchPredicateFactoryImpl( SearchPredicateDslContext> dslContext) { @@ -25,8 +26,8 @@ public ElasticsearchSearchPredicateFactoryImpl( } @Override - public ElasticsearchSearchPredicateFactory withRoot(String objectFieldPath) { - return new ElasticsearchSearchPredicateFactoryImpl( dslContext.rescope( + public ElasticsearchSearchPredicateFactory withRoot(String objectFieldPath) { + return new ElasticsearchSearchPredicateFactoryImpl( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/ElasticsearchNamedPredicate.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/ElasticsearchNamedPredicate.java index b04d15db028..b024823eac4 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/ElasticsearchNamedPredicate.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/ElasticsearchNamedPredicate.java @@ -71,7 +71,7 @@ private static class Builder extends AbstractBuilder implements NamedPredicateBu private final PredicateDefinition definition; private final String predicateName; private final ElasticsearchSearchIndexCompositeNodeContext field; - private SearchPredicateFactory factory; + private SearchPredicateFactory factory; private final Map params = new LinkedHashMap<>(); Builder(PredicateDefinition definition, String predicateName, @@ -84,7 +84,7 @@ private static class Builder extends AbstractBuilder implements NamedPredicateBu } @Override - public void factory(SearchPredicateFactory factory) { + public void factory(SearchPredicateFactory factory) { this.factory = factory; } @@ -95,8 +95,9 @@ public void param(String name, Object value) { @Override public SearchPredicate build() { - NamedValuesBasedPredicateDefinitionContext ctx = new NamedValuesBasedPredicateDefinitionContext( factory, params, - name -> QueryLog.INSTANCE.paramNotDefined( name, predicateName, field.eventContext() ) ); + NamedValuesBasedPredicateDefinitionContext ctx = + new NamedValuesBasedPredicateDefinitionContext<>( factory, params, + name -> QueryLog.INSTANCE.paramNotDefined( name, predicateName, field.eventContext() ) ); ElasticsearchSearchPredicate providedPredicate = ElasticsearchSearchPredicate.from( scope, definition.create( ctx ) ); diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/projection/dsl/ElasticsearchSearchProjectionFactory.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/projection/dsl/ElasticsearchSearchProjectionFactory.java index 6ce8fa1adb0..f6485bfacbf 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/projection/dsl/ElasticsearchSearchProjectionFactory.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/projection/dsl/ElasticsearchSearchProjectionFactory.java @@ -13,12 +13,13 @@ /** * A factory for search projections with some Elasticsearch-specific methods. * + * @param Scope root type. * @param The type of entity references. * @param The type of entities. * @see SearchProjectionFactory */ -public interface ElasticsearchSearchProjectionFactory - extends ExtendedSearchProjectionFactory, R, E> { +public interface ElasticsearchSearchProjectionFactory + extends ExtendedSearchProjectionFactory, R, E> { /** * Project to a {@link JsonObject} representing the document as stored in Elasticsearch. diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/projection/dsl/impl/ElasticsearchSearchProjectionFactoryImpl.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/projection/dsl/impl/ElasticsearchSearchProjectionFactoryImpl.java index 6cdb9bf8b0c..44c61c9aa07 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/projection/dsl/impl/ElasticsearchSearchProjectionFactoryImpl.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/projection/dsl/impl/ElasticsearchSearchProjectionFactoryImpl.java @@ -13,13 +13,14 @@ import com.google.gson.JsonObject; -public class ElasticsearchSearchProjectionFactoryImpl +public class ElasticsearchSearchProjectionFactoryImpl extends AbstractSearchProjectionFactory< - ElasticsearchSearchProjectionFactory, + SR, + ElasticsearchSearchProjectionFactory, ElasticsearchSearchProjectionIndexScope, R, E> - implements ElasticsearchSearchProjectionFactory { + implements ElasticsearchSearchProjectionFactory { public ElasticsearchSearchProjectionFactoryImpl( SearchProjectionDslContext> dslContext) { @@ -27,7 +28,7 @@ public ElasticsearchSearchProjectionFactoryImpl( } @Override - public ElasticsearchSearchProjectionFactory withRoot(String objectFieldPath) { + public ElasticsearchSearchProjectionFactory withRoot(String objectFieldPath) { return new ElasticsearchSearchProjectionFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQueryOptionsStep.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQueryOptionsStep.java index e52d435374c..1b84e94fd42 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQueryOptionsStep.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQueryOptionsStep.java @@ -12,13 +12,14 @@ import org.hibernate.search.engine.search.query.dsl.SearchQueryOptionsStep; import org.hibernate.search.util.common.annotation.Incubating; -public interface ElasticsearchSearchQueryOptionsStep +public interface ElasticsearchSearchQueryOptionsStep extends SearchQueryOptionsStep< - ElasticsearchSearchQueryOptionsStep, + SR, + ElasticsearchSearchQueryOptionsStep, H, LOS, - ElasticsearchSearchSortFactory, - ElasticsearchSearchAggregationFactory>, + ElasticsearchSearchSortFactory, + ElasticsearchSearchAggregationFactory>, ElasticsearchSearchFetchable { /** @@ -34,7 +35,7 @@ public interface ElasticsearchSearchQueryOptionsStep * @return {@code this}, for method chaining. */ @Incubating - ElasticsearchSearchQueryOptionsStep requestTransformer(ElasticsearchSearchRequestTransformer transformer); + ElasticsearchSearchQueryOptionsStep requestTransformer(ElasticsearchSearchRequestTransformer transformer); @Override ElasticsearchSearchQuery toQuery(); diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQuerySelectStep.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQuerySelectStep.java index 5677913b4de..d90bba0a8dd 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQuerySelectStep.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQuerySelectStep.java @@ -13,34 +13,35 @@ import org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; -public interface ElasticsearchSearchQuerySelectStep +public interface ElasticsearchSearchQuerySelectStep extends SearchQuerySelectStep< - ElasticsearchSearchQueryOptionsStep, + SR, + ElasticsearchSearchQueryOptionsStep, R, E, LOS, - ElasticsearchSearchProjectionFactory, - ElasticsearchSearchPredicateFactory>, - ElasticsearchSearchQueryWhereStep { + ElasticsearchSearchProjectionFactory, + ElasticsearchSearchPredicateFactory>, + ElasticsearchSearchQueryWhereStep { @Override - ElasticsearchSearchQueryWhereStep selectEntity(); + ElasticsearchSearchQueryWhereStep selectEntity(); @Override - ElasticsearchSearchQueryWhereStep selectEntityReference(); + ElasticsearchSearchQueryWhereStep selectEntityReference(); @Override -

ElasticsearchSearchQueryWhereStep select(Class

objectClass); +

ElasticsearchSearchQueryWhereStep select(Class

objectClass); @Override -

ElasticsearchSearchQueryWhereStep select( - Function, +

ElasticsearchSearchQueryWhereStep select( + Function, ? extends ProjectionFinalStep

> projectionContributor); @Override -

ElasticsearchSearchQueryWhereStep select(SearchProjection

projection); +

ElasticsearchSearchQueryWhereStep select(SearchProjection

projection); @Override - ElasticsearchSearchQueryWhereStep, LOS> select(SearchProjection... projections); + ElasticsearchSearchQueryWhereStep, LOS> select(SearchProjection... projections); } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQueryWhereStep.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQueryWhereStep.java index 1c6af20379d..531cbb4ce6b 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQueryWhereStep.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/ElasticsearchSearchQueryWhereStep.java @@ -7,7 +7,12 @@ import org.hibernate.search.backend.elasticsearch.search.predicate.dsl.ElasticsearchSearchPredicateFactory; import org.hibernate.search.engine.search.query.dsl.SearchQueryWhereStep; -public interface ElasticsearchSearchQueryWhereStep - extends SearchQueryWhereStep, H, LOS, ElasticsearchSearchPredicateFactory> { +public interface ElasticsearchSearchQueryWhereStep + extends + SearchQueryWhereStep, + H, + LOS, + ElasticsearchSearchPredicateFactory> { } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/impl/ElasticsearchSearchQueryOptionsStepImpl.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/impl/ElasticsearchSearchQueryOptionsStepImpl.java index 4ebf50685c9..6f346506453 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/impl/ElasticsearchSearchQueryOptionsStepImpl.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/dsl/impl/ElasticsearchSearchQueryOptionsStepImpl.java @@ -19,18 +19,19 @@ import org.hibernate.search.engine.search.loading.spi.SearchLoadingContextBuilder; import org.hibernate.search.engine.search.query.dsl.spi.AbstractExtendedSearchQueryOptionsStep; -class ElasticsearchSearchQueryOptionsStepImpl +class ElasticsearchSearchQueryOptionsStepImpl extends AbstractExtendedSearchQueryOptionsStep< - ElasticsearchSearchQueryOptionsStep, + SR, + ElasticsearchSearchQueryOptionsStep, H, ElasticsearchSearchResult, ElasticsearchSearchScroll, LOS, - ElasticsearchSearchPredicateFactory, - ElasticsearchSearchSortFactory, - ElasticsearchSearchAggregationFactory, + ElasticsearchSearchPredicateFactory, + ElasticsearchSearchSortFactory, + ElasticsearchSearchAggregationFactory, ElasticsearchSearchQueryIndexScope> - implements ElasticsearchSearchQueryWhereStep, ElasticsearchSearchQueryOptionsStep { + implements ElasticsearchSearchQueryWhereStep, ElasticsearchSearchQueryOptionsStep { private final ElasticsearchSearchQueryBuilder searchQueryBuilder; @@ -42,7 +43,8 @@ class ElasticsearchSearchQueryOptionsStepImpl } @Override - public ElasticsearchSearchQueryOptionsStep requestTransformer(ElasticsearchSearchRequestTransformer transformer) { + public ElasticsearchSearchQueryOptionsStep requestTransformer( + ElasticsearchSearchRequestTransformer transformer) { searchQueryBuilder.requestTransformer( transformer ); return thisAsS(); } @@ -53,22 +55,22 @@ public ElasticsearchSearchQuery toQuery() { } @Override - protected ElasticsearchSearchQueryOptionsStepImpl thisAsS() { + protected ElasticsearchSearchQueryOptionsStepImpl thisAsS() { return this; } @Override - protected ElasticsearchSearchPredicateFactory predicateFactory() { + protected ElasticsearchSearchPredicateFactory predicateFactory() { return scope.predicateFactory(); } @Override - protected ElasticsearchSearchSortFactory sortFactory() { + protected ElasticsearchSearchSortFactory sortFactory() { return scope.sortFactory(); } @Override - protected ElasticsearchSearchAggregationFactory aggregationFactory() { + protected ElasticsearchSearchAggregationFactory aggregationFactory() { return scope.aggregationFactory(); } 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 af452ffb0d2..74f3cf34327 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 @@ -27,15 +27,16 @@ import org.hibernate.search.engine.search.query.dsl.spi.AbstractSearchQuerySelectStep; import org.hibernate.search.engine.search.query.spi.SearchQueryIndexScope; -public class ElasticsearchSearchQuerySelectStepImpl +public class ElasticsearchSearchQuerySelectStepImpl extends AbstractSearchQuerySelectStep< - ElasticsearchSearchQueryOptionsStep, + SR, + ElasticsearchSearchQueryOptionsStep, R, E, LOS, - ElasticsearchSearchProjectionFactory, - ElasticsearchSearchPredicateFactory> - implements ElasticsearchSearchQuerySelectStep { + ElasticsearchSearchProjectionFactory, + ElasticsearchSearchPredicateFactory> + implements ElasticsearchSearchQuerySelectStep { private final ElasticsearchSearchQueryIndexScope scope; private final BackendSessionContext sessionContext; @@ -50,57 +51,57 @@ public ElasticsearchSearchQuerySelectStepImpl(ElasticsearchSearchQueryIndexScope } @Override - public ElasticsearchSearchQueryWhereStep selectEntity() { - return select( scope.projectionFactory().entity().toProjection() ); + public ElasticsearchSearchQueryWhereStep selectEntity() { + return select( scope.projectionFactory().entity().toProjection() ); } @Override - public ElasticsearchSearchQueryWhereStep selectEntityReference() { + public ElasticsearchSearchQueryWhereStep selectEntityReference() { return select( scope.projectionBuilders().entityReference() ); } @Override - public

ElasticsearchSearchQueryWhereStep select(Class

objectClass) { + public

ElasticsearchSearchQueryWhereStep select(Class

objectClass) { return select( scope.projectionFactory().composite().as( objectClass ).toProjection() ); } @Override - public

ElasticsearchSearchQueryWhereStep select( - Function, + public

ElasticsearchSearchQueryWhereStep select( + Function, ? extends ProjectionFinalStep

> projectionContributor) { SearchProjection

projection = projectionContributor.apply( scope.projectionFactory() ).toProjection(); return select( projection ); } @Override - public

ElasticsearchSearchQueryWhereStep select(SearchProjection

projection) { + public

ElasticsearchSearchQueryWhereStep select(SearchProjection

projection) { ElasticsearchSearchQueryBuilder

builder = scope.select( sessionContext, loadingContextBuilder, projection ); return new ElasticsearchSearchQueryOptionsStepImpl<>( scope, builder, loadingContextBuilder ); } @Override - public ElasticsearchSearchQueryWhereStep, LOS> select(SearchProjection... projections) { + public ElasticsearchSearchQueryWhereStep, LOS> select(SearchProjection... projections) { return select( scope.projectionBuilders().composite() .build( projections, ProjectionCompositor.fromList( projections.length ), ProjectionCollector.nullable() ) ); } @Override - public ElasticsearchSearchQueryOptionsStep where(SearchPredicate predicate) { + public ElasticsearchSearchQueryOptionsStep where(SearchPredicate predicate) { return selectEntity().where( predicate ); } @Override - public ElasticsearchSearchQueryOptionsStep where( - Function predicateContributor) { + public ElasticsearchSearchQueryOptionsStep where( + Function, ? extends PredicateFinalStep> predicateContributor) { return selectEntity().where( predicateContributor ); } @Override - public ElasticsearchSearchQueryOptionsStep where( - BiConsumer> predicateContributor) { + public ElasticsearchSearchQueryOptionsStep where( + BiConsumer, + ? super SimpleBooleanPredicateClausesCollector> predicateContributor) { return selectEntity().where( predicateContributor ); } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/impl/ElasticsearchSearchQueryIndexScope.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/impl/ElasticsearchSearchQueryIndexScope.java index f68f4412cc1..feed3352cd5 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/impl/ElasticsearchSearchQueryIndexScope.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/query/impl/ElasticsearchSearchQueryIndexScope.java @@ -27,15 +27,15 @@

ElasticsearchSearchQueryBuilder

select(BackendSessionContext sessionConte SearchLoadingContextBuilder loadingContextBuilder, SearchProjection

projection); @Override - ElasticsearchSearchPredicateFactory predicateFactory(); + ElasticsearchSearchPredicateFactory predicateFactory(); @Override - ElasticsearchSearchSortFactory sortFactory(); + ElasticsearchSearchSortFactory sortFactory(); @Override - ElasticsearchSearchProjectionFactory projectionFactory(); + ElasticsearchSearchProjectionFactory projectionFactory(); @Override - ElasticsearchSearchAggregationFactory aggregationFactory(); + ElasticsearchSearchAggregationFactory aggregationFactory(); } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/ElasticsearchSearchSortFactory.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/ElasticsearchSearchSortFactory.java index ae505cb6534..aa4cb7b42ae 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/ElasticsearchSearchSortFactory.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/ElasticsearchSearchSortFactory.java @@ -12,9 +12,10 @@ /** * A factory for search sorts with some Elasticsearch-specific methods. + * @param Scope root type. */ -public interface ElasticsearchSearchSortFactory - extends ExtendedSearchSortFactory { +public interface ElasticsearchSearchSortFactory + extends ExtendedSearchSortFactory, ElasticsearchSearchPredicateFactory> { /** * Order elements according to a JSON sort definition. @@ -25,7 +26,7 @@ public interface ElasticsearchSearchSortFactory * @return A {@link SortThenStep} allowing the retrieval of the sort * or the chaining of other sorts. */ - SortThenStep fromJson(String jsonString); + SortThenStep fromJson(String jsonString); /** * Order elements according to a JSON sort definition. @@ -36,6 +37,6 @@ public interface ElasticsearchSearchSortFactory * @return A {@link SortThenStep} allowing the retrieval of the sort * or the chaining of other sorts. */ - SortThenStep fromJson(JsonObject jsonObject); + SortThenStep fromJson(JsonObject jsonObject); } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/impl/ElasticsearchSearchSortFactoryImpl.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/impl/ElasticsearchSearchSortFactoryImpl.java index b5676f540a4..461291b27d0 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/impl/ElasticsearchSearchSortFactoryImpl.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/impl/ElasticsearchSearchSortFactoryImpl.java @@ -15,36 +15,39 @@ import com.google.gson.JsonObject; -public class ElasticsearchSearchSortFactoryImpl +public class ElasticsearchSearchSortFactoryImpl extends AbstractSearchSortFactory< - ElasticsearchSearchSortFactory, + SR, + ElasticsearchSearchSortFactory, ElasticsearchSearchSortIndexScope, - ElasticsearchSearchPredicateFactory> - implements ElasticsearchSearchSortFactory { + ElasticsearchSearchPredicateFactory> + implements ElasticsearchSearchSortFactory { public ElasticsearchSearchSortFactoryImpl( - SearchSortDslContext, ElasticsearchSearchPredicateFactory> dslContext) { + SearchSortDslContext, + ElasticsearchSearchPredicateFactory> dslContext) { super( dslContext ); } @Override - public ElasticsearchSearchSortFactory withRoot(String objectFieldPath) { - return new ElasticsearchSearchSortFactoryImpl( dslContext.rescope( + public ElasticsearchSearchSortFactory withRoot(String objectFieldPath) { + return new ElasticsearchSearchSortFactoryImpl( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } @Override - public SortThenStep fromJson(JsonObject jsonObject) { + public SortThenStep fromJson(JsonObject jsonObject) { return staticThenStep( dslContext.scope().sortBuilders().fromJson( jsonObject ) ); } @Override - public SortThenStep fromJson(String jsonString) { + public SortThenStep fromJson(String jsonString) { return staticThenStep( dslContext.scope().sortBuilders().fromJson( jsonString ) ); } - private SortThenStep staticThenStep(ElasticsearchSearchSort sort) { - return new StaticSortThenStep( dslContext, sort ); + private SortThenStep staticThenStep(ElasticsearchSearchSort sort) { + return new StaticSortThenStep( dslContext, sort ); } } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/LuceneExtension.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/LuceneExtension.java index 179f112a40f..43a4eb1fecb 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/LuceneExtension.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/LuceneExtension.java @@ -63,22 +63,23 @@ * * @see #get() */ -public final class LuceneExtension - implements SearchQueryDslExtension, R, E, LOS>, +public final class LuceneExtension + implements SearchQueryDslExtension, R, E, LOS>, SearchQueryExtension, H>, - SearchPredicateFactoryExtension, - SearchSortFactoryExtension, - SearchProjectionFactoryExtension, R, E>, - SearchAggregationFactoryExtension, + SearchPredicateFactoryExtension>, + SearchSortFactoryExtension>, + SearchProjectionFactoryExtension, R, E>, + SearchAggregationFactoryExtension>, IndexFieldTypeFactoryExtension, IndexScopeExtension, SchemaExportExtension { - private static final LuceneExtension INSTANCE = new LuceneExtension<>(); + private static final LuceneExtension INSTANCE = new LuceneExtension<>(); /** * Get the extension with generic parameters automatically set as appropriate for the context in which it's used. * + * @param Scope root type. * @param The type of query hits. * Users should not have to care about this, as the parameter will automatically take the appropriate value when calling * {@code .extension( LuceneExtension.get() }. @@ -94,8 +95,8 @@ public final class LuceneExtension * @return The extension. */ @SuppressWarnings("unchecked") // The instance works for any H, R and E - public static LuceneExtension get() { - return (LuceneExtension) INSTANCE; + public static LuceneExtension get() { + return (LuceneExtension) INSTANCE; } private LuceneExtension() { @@ -106,8 +107,8 @@ private LuceneExtension() { * {@inheritDoc} */ @Override - public Optional> extendOptional( - SearchQuerySelectStep original, + public Optional> extendOptional( + SearchQuerySelectStep original, SearchQueryIndexScope scope, BackendSessionContext sessionContext, SearchLoadingContextBuilder loadingContextBuilder) { @@ -139,9 +140,9 @@ public Optional> extendOptional(SearchQuery original, * {@inheritDoc} */ @Override - public Optional extendOptional(SearchPredicateFactory original) { + public Optional> extendOptional(SearchPredicateFactory original) { if ( original instanceof LuceneSearchPredicateFactory ) { - return Optional.of( (LuceneSearchPredicateFactory) original ); + return Optional.of( (LuceneSearchPredicateFactory) original ); } else { return Optional.empty(); @@ -152,10 +153,10 @@ public Optional extendOptional(SearchPredicateFact * {@inheritDoc} */ @Override - public Optional extendOptional( - SearchSortFactory original) { + public Optional> extendOptional( + SearchSortFactory original) { if ( original instanceof LuceneSearchSortFactory ) { - return Optional.of( (LuceneSearchSortFactory) original ); + return Optional.of( (LuceneSearchSortFactory) original ); } else { return Optional.empty(); @@ -166,9 +167,9 @@ public Optional extendOptional( * {@inheritDoc} */ @Override - public Optional> extendOptional(SearchProjectionFactory original) { + public Optional> extendOptional(SearchProjectionFactory original) { if ( original instanceof LuceneSearchProjectionFactory ) { - return Optional.of( (LuceneSearchProjectionFactory) original ); + return Optional.of( (LuceneSearchProjectionFactory) original ); } else { return Optional.empty(); @@ -179,9 +180,9 @@ public Optional> extendOptional(SearchProjec * {@inheritDoc} */ @Override - public Optional extendOptional(SearchAggregationFactory original) { + public Optional> extendOptional(SearchAggregationFactory original) { if ( original instanceof LuceneSearchAggregationFactory ) { - return Optional.of( (LuceneSearchAggregationFactory) original ); + return Optional.of( (LuceneSearchAggregationFactory) original ); } else { return Optional.empty(); diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java index 08770115084..e0e1b54c943 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java @@ -162,24 +162,24 @@ public

LuceneSearchQueryBuilder

select(BackendSessionContext sessionConte } @Override - public LuceneSearchPredicateFactory predicateFactory() { - return new LuceneSearchPredicateFactoryImpl( SearchPredicateDslContext.root( this ) ); + public LuceneSearchPredicateFactory predicateFactory() { + return new LuceneSearchPredicateFactoryImpl<>( SearchPredicateDslContext.root( this ) ); } @Override - public LuceneSearchSortFactory sortFactory() { - return new LuceneSearchSortFactoryImpl( SearchSortDslContext + public LuceneSearchSortFactory sortFactory() { + return new LuceneSearchSortFactoryImpl( SearchSortDslContext .root( this, LuceneSearchSortFactoryImpl::new, predicateFactory() ) ); } @Override - public LuceneSearchProjectionFactory projectionFactory() { + public LuceneSearchProjectionFactory projectionFactory() { return new LuceneSearchProjectionFactoryImpl<>( SearchProjectionDslContext.root( this ) ); } @Override - public LuceneSearchAggregationFactory aggregationFactory() { - return new LuceneSearchAggregationFactoryImpl( SearchAggregationDslContext.root( this, predicateFactory() ) ); + public LuceneSearchAggregationFactory aggregationFactory() { + return new LuceneSearchAggregationFactoryImpl( SearchAggregationDslContext.root( this, predicateFactory() ) ); } @Override diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/LuceneSearchAggregationFactory.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/LuceneSearchAggregationFactory.java index 672d8055ef7..3d7ab6f90bb 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/LuceneSearchAggregationFactory.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/LuceneSearchAggregationFactory.java @@ -7,7 +7,7 @@ import org.hibernate.search.backend.lucene.search.predicate.dsl.LuceneSearchPredicateFactory; import org.hibernate.search.engine.search.aggregation.dsl.ExtendedSearchAggregationFactory; -public interface LuceneSearchAggregationFactory - extends ExtendedSearchAggregationFactory { +public interface LuceneSearchAggregationFactory + extends ExtendedSearchAggregationFactory, LuceneSearchPredicateFactory> { } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java index 88f7d780848..b22685c68a8 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java @@ -10,21 +10,24 @@ import org.hibernate.search.engine.search.aggregation.dsl.spi.AbstractSearchAggregationFactory; import org.hibernate.search.engine.search.aggregation.dsl.spi.SearchAggregationDslContext; -public class LuceneSearchAggregationFactoryImpl +public class LuceneSearchAggregationFactoryImpl extends AbstractSearchAggregationFactory< - LuceneSearchAggregationFactory, + SR, + LuceneSearchAggregationFactory, LuceneSearchAggregationIndexScope, - LuceneSearchPredicateFactory> - implements LuceneSearchAggregationFactory { + LuceneSearchPredicateFactory> + implements LuceneSearchAggregationFactory { public LuceneSearchAggregationFactoryImpl( - SearchAggregationDslContext, LuceneSearchPredicateFactory> dslContext) { + SearchAggregationDslContext, + LuceneSearchPredicateFactory> dslContext) { super( dslContext ); } @Override - public LuceneSearchAggregationFactory withRoot(String objectFieldPath) { - return new LuceneSearchAggregationFactoryImpl( dslContext.rescope( + public LuceneSearchAggregationFactory withRoot(String objectFieldPath) { + return new LuceneSearchAggregationFactoryImpl( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/LuceneSearchPredicateFactory.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/LuceneSearchPredicateFactory.java index 5bfdfc80fad..9fc4d5f8c77 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/LuceneSearchPredicateFactory.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/LuceneSearchPredicateFactory.java @@ -12,7 +12,7 @@ /** * A factory for search predicates with some Lucene-specific methods. */ -public interface LuceneSearchPredicateFactory extends ExtendedSearchPredicateFactory { +public interface LuceneSearchPredicateFactory extends ExtendedSearchPredicateFactory> { /** * Create a predicate from a Lucene {@link Query}. diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java index 121daec55d3..bb73666ba1b 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java @@ -13,19 +13,20 @@ import org.apache.lucene.search.Query; -public class LuceneSearchPredicateFactoryImpl +public class LuceneSearchPredicateFactoryImpl extends AbstractSearchPredicateFactory< - LuceneSearchPredicateFactory, + SR, + LuceneSearchPredicateFactory, LuceneSearchPredicateIndexScope> - implements LuceneSearchPredicateFactory { + implements LuceneSearchPredicateFactory { public LuceneSearchPredicateFactoryImpl(SearchPredicateDslContext> dslContext) { super( dslContext ); } @Override - public LuceneSearchPredicateFactory withRoot(String objectFieldPath) { - return new LuceneSearchPredicateFactoryImpl( dslContext.rescope( + public LuceneSearchPredicateFactory withRoot(String objectFieldPath) { + return new LuceneSearchPredicateFactoryImpl( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/impl/LuceneNamedPredicate.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/impl/LuceneNamedPredicate.java index 789c1fb1b3e..8da0453254e 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/impl/LuceneNamedPredicate.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/impl/LuceneNamedPredicate.java @@ -70,7 +70,7 @@ private static class Builder extends AbstractBuilder implements NamedPredicateBu private final PredicateDefinition definition; private final String predicateName; private final LuceneSearchIndexCompositeNodeContext field; - private SearchPredicateFactory factory; + private SearchPredicateFactory factory; private final Map params = new LinkedHashMap<>(); Builder(PredicateDefinition definition, String predicateName, LuceneSearchIndexScope scope, @@ -82,7 +82,7 @@ private static class Builder extends AbstractBuilder implements NamedPredicateBu } @Override - public void factory(SearchPredicateFactory factory) { + public void factory(SearchPredicateFactory factory) { this.factory = factory; } @@ -93,8 +93,9 @@ public void param(String name, Object value) { @Override public SearchPredicate build() { - NamedValuesBasedPredicateDefinitionContext ctx = new NamedValuesBasedPredicateDefinitionContext( factory, params, - name -> QueryLog.INSTANCE.paramNotDefined( name, predicateName, field.eventContext() ) ); + NamedValuesBasedPredicateDefinitionContext ctx = + new NamedValuesBasedPredicateDefinitionContext<>( factory, params, + name -> QueryLog.INSTANCE.paramNotDefined( name, predicateName, field.eventContext() ) ); LuceneSearchPredicate providedPredicate = LuceneSearchPredicate.from( scope, definition.create( ctx ) ); diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/LuceneSearchProjectionFactory.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/LuceneSearchProjectionFactory.java index abf30741110..94d8717e4c0 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/LuceneSearchProjectionFactory.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/LuceneSearchProjectionFactory.java @@ -15,12 +15,13 @@ /** * A factory for search projections with some Lucene-specific methods. * + * @param Scope root type. * @param The type of entity references. * @param The type of entities. * @see SearchProjectionFactory */ -public interface LuceneSearchProjectionFactory - extends ExtendedSearchProjectionFactory, R, E> { +public interface LuceneSearchProjectionFactory + extends ExtendedSearchProjectionFactory, R, E> { /** * Project to a Lucene {@link Document} containing all the stored fields. diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/impl/LuceneSearchProjectionFactoryImpl.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/impl/LuceneSearchProjectionFactoryImpl.java index daf4eb4bfdd..8b1d8c2d554 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/impl/LuceneSearchProjectionFactoryImpl.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/impl/LuceneSearchProjectionFactoryImpl.java @@ -15,20 +15,21 @@ import org.apache.lucene.document.Document; import org.apache.lucene.search.Explanation; -public class LuceneSearchProjectionFactoryImpl +public class LuceneSearchProjectionFactoryImpl extends AbstractSearchProjectionFactory< - LuceneSearchProjectionFactory, + SR, + LuceneSearchProjectionFactory, LuceneSearchProjectionIndexScope, R, E> - implements LuceneSearchProjectionFactory { + implements LuceneSearchProjectionFactory { public LuceneSearchProjectionFactoryImpl(SearchProjectionDslContext> dslContext) { super( dslContext ); } @Override - public LuceneSearchProjectionFactory withRoot(String objectFieldPath) { + public LuceneSearchProjectionFactory withRoot(String objectFieldPath) { return new LuceneSearchProjectionFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryOptionsStep.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryOptionsStep.java index fca7d25b2f6..df0f94d6d2d 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryOptionsStep.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryOptionsStep.java @@ -10,13 +10,14 @@ import org.hibernate.search.backend.lucene.search.sort.dsl.LuceneSearchSortFactory; import org.hibernate.search.engine.search.query.dsl.SearchQueryOptionsStep; -public interface LuceneSearchQueryOptionsStep +public interface LuceneSearchQueryOptionsStep extends SearchQueryOptionsStep< - LuceneSearchQueryOptionsStep, + SR, + LuceneSearchQueryOptionsStep, H, LOS, - LuceneSearchSortFactory, - LuceneSearchAggregationFactory>, + LuceneSearchSortFactory, + LuceneSearchAggregationFactory>, LuceneSearchFetchable { @Override diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQuerySelectStep.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQuerySelectStep.java index 0c64a658dd4..44d180ae731 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQuerySelectStep.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQuerySelectStep.java @@ -13,33 +13,34 @@ import org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; -public interface LuceneSearchQuerySelectStep +public interface LuceneSearchQuerySelectStep extends SearchQuerySelectStep< - LuceneSearchQueryOptionsStep, + SR, + LuceneSearchQueryOptionsStep, R, E, LOS, - LuceneSearchProjectionFactory, - LuceneSearchPredicateFactory>, - LuceneSearchQueryWhereStep { + LuceneSearchProjectionFactory, + LuceneSearchPredicateFactory>, + LuceneSearchQueryWhereStep { @Override - LuceneSearchQueryWhereStep selectEntity(); + LuceneSearchQueryWhereStep selectEntity(); @Override - LuceneSearchQueryWhereStep selectEntityReference(); + LuceneSearchQueryWhereStep selectEntityReference(); @Override -

LuceneSearchQueryWhereStep select(Class

objectClass); +

LuceneSearchQueryWhereStep select(Class

objectClass); @Override -

LuceneSearchQueryWhereStep select( - Function, ? extends ProjectionFinalStep

> projectionContributor); +

LuceneSearchQueryWhereStep select( + Function, ? extends ProjectionFinalStep

> projectionContributor); @Override -

LuceneSearchQueryWhereStep select(SearchProjection

projection); +

LuceneSearchQueryWhereStep select(SearchProjection

projection); @Override - LuceneSearchQueryWhereStep, LOS> select(SearchProjection... projections); + LuceneSearchQueryWhereStep, LOS> select(SearchProjection... projections); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryWhereStep.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryWhereStep.java index 04aa09d4e43..cfe93fdeb8c 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryWhereStep.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryWhereStep.java @@ -7,7 +7,7 @@ import org.hibernate.search.backend.lucene.search.predicate.dsl.LuceneSearchPredicateFactory; import org.hibernate.search.engine.search.query.dsl.SearchQueryWhereStep; -public interface LuceneSearchQueryWhereStep - extends SearchQueryWhereStep, H, LOS, LuceneSearchPredicateFactory> { +public interface LuceneSearchQueryWhereStep + extends SearchQueryWhereStep, H, LOS, LuceneSearchPredicateFactory> { } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQueryOptionsStepImpl.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQueryOptionsStepImpl.java index b7eec76fa5e..3515b979882 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQueryOptionsStepImpl.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQueryOptionsStepImpl.java @@ -18,18 +18,19 @@ import org.hibernate.search.engine.search.loading.spi.SearchLoadingContextBuilder; import org.hibernate.search.engine.search.query.dsl.spi.AbstractExtendedSearchQueryOptionsStep; -class LuceneSearchQueryOptionsStepImpl +class LuceneSearchQueryOptionsStepImpl extends AbstractExtendedSearchQueryOptionsStep< - LuceneSearchQueryOptionsStep, + SR, + LuceneSearchQueryOptionsStep, H, LuceneSearchResult, LuceneSearchScroll, LOS, - LuceneSearchPredicateFactory, - LuceneSearchSortFactory, - LuceneSearchAggregationFactory, + LuceneSearchPredicateFactory, + LuceneSearchSortFactory, + LuceneSearchAggregationFactory, LuceneSearchQueryIndexScope> - implements LuceneSearchQueryWhereStep, LuceneSearchQueryOptionsStep { + implements LuceneSearchQueryWhereStep, LuceneSearchQueryOptionsStep { private final LuceneSearchQueryBuilder searchQueryBuilder; @@ -46,22 +47,22 @@ public LuceneSearchQuery toQuery() { } @Override - protected LuceneSearchQueryOptionsStepImpl thisAsS() { + protected LuceneSearchQueryOptionsStepImpl thisAsS() { return this; } @Override - protected LuceneSearchPredicateFactory predicateFactory() { + protected LuceneSearchPredicateFactory predicateFactory() { return scope.predicateFactory(); } @Override - protected LuceneSearchSortFactory sortFactory() { + protected LuceneSearchSortFactory sortFactory() { return scope.sortFactory(); } @Override - protected LuceneSearchAggregationFactory aggregationFactory() { + protected LuceneSearchAggregationFactory aggregationFactory() { return scope.aggregationFactory(); } 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 4ed9a537a84..2a1283cb6e3 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 @@ -26,15 +26,16 @@ import org.hibernate.search.engine.search.projection.spi.ProjectionCompositor; import org.hibernate.search.engine.search.query.dsl.spi.AbstractSearchQuerySelectStep; -public class LuceneSearchQuerySelectStepImpl +public class LuceneSearchQuerySelectStepImpl extends AbstractSearchQuerySelectStep< - LuceneSearchQueryOptionsStep, + SR, + LuceneSearchQueryOptionsStep, R, E, LOS, - LuceneSearchProjectionFactory, - LuceneSearchPredicateFactory> - implements LuceneSearchQuerySelectStep { + LuceneSearchProjectionFactory, + LuceneSearchPredicateFactory> + implements LuceneSearchQuerySelectStep { private final LuceneSearchQueryIndexScope scope; private final BackendSessionContext sessionContext; @@ -49,56 +50,56 @@ public LuceneSearchQuerySelectStepImpl(LuceneSearchQueryIndexScope scope, } @Override - public LuceneSearchQueryWhereStep selectEntity() { - return select( scope.projectionFactory().entity().toProjection() ); + public LuceneSearchQueryWhereStep selectEntity() { + return select( scope.projectionFactory().entity().toProjection() ); } @Override - public LuceneSearchQueryWhereStep selectEntityReference() { + public LuceneSearchQueryWhereStep selectEntityReference() { return select( scope.projectionBuilders().entityReference() ); } @Override - public

LuceneSearchQueryWhereStep select(Class

objectClass) { + public

LuceneSearchQueryWhereStep select(Class

objectClass) { return select( scope.projectionFactory().composite().as( objectClass ).toProjection() ); } @Override - public

LuceneSearchQueryWhereStep select( - Function, ? extends ProjectionFinalStep

> projectionContributor) { + public

LuceneSearchQueryWhereStep select( + Function, ? extends ProjectionFinalStep

> projectionContributor) { SearchProjection

projection = projectionContributor.apply( scope.projectionFactory() ).toProjection(); return select( projection ); } @Override - public

LuceneSearchQueryWhereStep select(SearchProjection

projection) { + public

LuceneSearchQueryWhereStep select(SearchProjection

projection) { LuceneSearchQueryBuilder

builder = scope.select( sessionContext, loadingContextBuilder, projection ); return new LuceneSearchQueryOptionsStepImpl<>( scope, builder, loadingContextBuilder ); } @Override - public LuceneSearchQueryWhereStep, LOS> select(SearchProjection... projections) { + public LuceneSearchQueryWhereStep, LOS> select(SearchProjection... projections) { return select( scope.projectionBuilders().composite() .build( projections, ProjectionCompositor.fromList( projections.length ), ProjectionCollector.nullable() ) ); } @Override - public LuceneSearchQueryOptionsStep where(SearchPredicate predicate) { + public LuceneSearchQueryOptionsStep where(SearchPredicate predicate) { return selectEntity().where( predicate ); } @Override - public LuceneSearchQueryOptionsStep where( - Function predicateContributor) { + public LuceneSearchQueryOptionsStep where( + Function, ? extends PredicateFinalStep> predicateContributor) { return selectEntity().where( predicateContributor ); } @Override - public LuceneSearchQueryOptionsStep where( - BiConsumer> predicateContributor) { + public LuceneSearchQueryOptionsStep where( + BiConsumer, + ? super SimpleBooleanPredicateClausesCollector> predicateContributor) { return selectEntity().where( predicateContributor ); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/impl/LuceneSearchQueryIndexScope.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/impl/LuceneSearchQueryIndexScope.java index e9568937880..026703216b8 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/impl/LuceneSearchQueryIndexScope.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/impl/LuceneSearchQueryIndexScope.java @@ -36,16 +36,16 @@

LuceneSearchQueryBuilder

select(BackendSessionContext sessionContext, SearchLoadingContextBuilder loadingContextBuilder, SearchProjection

projection); @Override - LuceneSearchPredicateFactory predicateFactory(); + LuceneSearchPredicateFactory predicateFactory(); @Override - LuceneSearchSortFactory sortFactory(); + LuceneSearchSortFactory sortFactory(); @Override - LuceneSearchProjectionFactory projectionFactory(); + LuceneSearchProjectionFactory projectionFactory(); @Override - LuceneSearchAggregationFactory aggregationFactory(); + LuceneSearchAggregationFactory aggregationFactory(); Query filterOrNull(String tenantId); diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/LuceneSearchSortFactory.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/LuceneSearchSortFactory.java index 089b619e4c9..452199ba1dd 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/LuceneSearchSortFactory.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/LuceneSearchSortFactory.java @@ -14,8 +14,8 @@ /** * A factory for search sorts with some Lucene-specific methods. */ -public interface LuceneSearchSortFactory - extends ExtendedSearchSortFactory { +public interface LuceneSearchSortFactory + extends ExtendedSearchSortFactory, LuceneSearchPredicateFactory> { /** * Order elements by a given Lucene {@link SortField}. @@ -24,7 +24,7 @@ public interface LuceneSearchSortFactory * @return A {@link SortThenStep} allowing the retrieval of the sort * or the chaining of other sorts. */ - SortThenStep fromLuceneSortField(SortField luceneSortField); + SortThenStep fromLuceneSortField(SortField luceneSortField); /** * Order elements by a given Lucene {@link Sort}. @@ -33,6 +33,6 @@ public interface LuceneSearchSortFactory * @return A {@link SortThenStep} allowing the retrieval of the sort * or the chaining of other sorts. */ - SortThenStep fromLuceneSort(Sort luceneSort); + SortThenStep fromLuceneSort(Sort luceneSort); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java index 4281a1156d6..925879d6e3a 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java @@ -14,32 +14,33 @@ import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; -public class LuceneSearchSortFactoryImpl +public class LuceneSearchSortFactoryImpl extends AbstractSearchSortFactory< - LuceneSearchSortFactory, + SR, + LuceneSearchSortFactory, LuceneSearchSortIndexScope, - LuceneSearchPredicateFactory> - implements LuceneSearchSortFactory { + LuceneSearchPredicateFactory> + implements LuceneSearchSortFactory { public LuceneSearchSortFactoryImpl( - SearchSortDslContext, LuceneSearchPredicateFactory> dslContext) { + SearchSortDslContext, LuceneSearchPredicateFactory> dslContext) { super( dslContext ); } @Override - public LuceneSearchSortFactory withRoot(String objectFieldPath) { - return new LuceneSearchSortFactoryImpl( dslContext.rescope( + public LuceneSearchSortFactory withRoot(String objectFieldPath) { + return new LuceneSearchSortFactoryImpl( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } @Override - public SortThenStep fromLuceneSortField(SortField luceneSortField) { + public SortThenStep fromLuceneSortField(SortField luceneSortField) { return staticThenStep( dslContext.scope().sortBuilders().fromLuceneSortField( luceneSortField ) ); } @Override - public SortThenStep fromLuceneSort(Sort luceneSort) { + public SortThenStep fromLuceneSort(Sort luceneSort) { return staticThenStep( dslContext.scope().sortBuilders().fromLuceneSort( luceneSort ) ); } diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/namedpredicate/SkuIdentifierBinder.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/namedpredicate/SkuIdentifierBinder.java index 9d45be57b0c..da1f2cb468f 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/namedpredicate/SkuIdentifierBinder.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/namedpredicate/SkuIdentifierBinder.java @@ -88,8 +88,8 @@ public void write(DocumentElement target, String skuId, PropertyBridgeWriteConte private static class SkuIdentifierMatchPredicateDefinition implements PredicateDefinition { // <1> @Override - public SearchPredicate create(PredicateDefinitionContext context) { - SearchPredicateFactory f = context.predicate(); // <2> + public SearchPredicate create(PredicateDefinitionContext context) { + SearchPredicateFactory f = context.predicate(); // <2> String pattern = context.params().get( "pattern", String.class ); // <3> diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/constructorparameter/MyFieldProjectionBinder.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/constructorparameter/MyFieldProjectionBinder.java index c465bce7738..b7ecbd508bc 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/constructorparameter/MyFieldProjectionBinder.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/constructorparameter/MyFieldProjectionBinder.java @@ -31,7 +31,7 @@ private MyProjectionDefinition(String fieldName) { } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.field( fieldName, String.class ) // <3> .toProjection(); diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/multi/MyFieldProjectionBinder.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/multi/MyFieldProjectionBinder.java index c11f9ebfe24..b45d0c8f3ad 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/multi/MyFieldProjectionBinder.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/multi/MyFieldProjectionBinder.java @@ -32,7 +32,7 @@ public void bind(ProjectionBindingContext context) { private static class MyProjectionDefinition implements ProjectionDefinition> { // <4> @Override - public SearchProjection> create(SearchProjectionFactory factory, + public SearchProjection> create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.field( "tags", String.class ) .collector( ProjectionCollector.list() ) // <4> diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/param/annotation/MyFieldProjectionBinder.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/param/annotation/MyFieldProjectionBinder.java index 84f89334d30..5c3317e60fb 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/param/annotation/MyFieldProjectionBinder.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/param/annotation/MyFieldProjectionBinder.java @@ -39,7 +39,7 @@ public MyProjectionDefinition(String fieldName) { // <2> } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.field( fieldName, String.class ) // <3> .toProjection(); diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/param/string/MyFieldProjectionBinder.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/param/string/MyFieldProjectionBinder.java index 2ac61df482c..f98e6497247 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/param/string/MyFieldProjectionBinder.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/param/string/MyFieldProjectionBinder.java @@ -32,7 +32,7 @@ public MyProjectionDefinition(String fieldName) { // <2> } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.field( fieldName, String.class ) // <3> .toProjection(); diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/simple/MyFieldProjectionBinder.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/simple/MyFieldProjectionBinder.java index 0260f47e7fb..e8b3cfdecc2 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/simple/MyFieldProjectionBinder.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/simple/MyFieldProjectionBinder.java @@ -29,7 +29,7 @@ public void bind(ProjectionBindingContext context) { // <2> private static class MyProjectionDefinition // <1> implements ProjectionDefinition { // <2> @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.field( "title", String.class ) // <3> .toProjection(); // <4> diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/entrypoints/HibernateOrmEntryPointsIT.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/entrypoints/HibernateOrmEntryPointsIT.java index 8497e988e6f..e1c8df2b9f3 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/entrypoints/HibernateOrmEntryPointsIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/entrypoints/HibernateOrmEntryPointsIT.java @@ -102,12 +102,13 @@ void searchScope_fromSearchMapping() { // end::searchScope-fromSearchMapping[] Search.mapping( theSessionFactory ); // tag::searchScope-fromSearchMapping[] - SearchScope bookScope = searchMapping.scope( Book.class ); // <2> - SearchScope associateAndManagerScope = searchMapping.scope( Arrays.asList( Associate.class, Manager.class ) ); // <3> - SearchScope personScope = searchMapping.scope( Person.class ); // <4> - SearchScope personSubTypesScope = searchMapping.scope( Person.class, + SearchScope bookScope = searchMapping.scope( Book.class ); // <2> + SearchScope associateAndManagerScope = + searchMapping.scope( Arrays.asList( Associate.class, Manager.class ) ); // <3> + SearchScope personScope = searchMapping.scope( Person.class ); // <4> + SearchScope personSubTypesScope = searchMapping.scope( Person.class, Arrays.asList( "Manager", "Associate" ) ); // <5> - SearchScope allScope = searchMapping.scope( Object.class ); // <6> + SearchScope allScope = searchMapping.scope( Object.class ); // <6> // end::searchScope-fromSearchMapping[] assertThat( bookScope.includedTypes() ) .extracting( SearchIndexedEntity::jpaName ) @@ -134,13 +135,13 @@ void searchScope_fromSearchSession() { // end::searchScope-fromSearchSession[] Search.session( theSession ); // tag::searchScope-fromSearchSession[] - SearchScope bookScope = searchSession.scope( Book.class ); // <2> - SearchScope associateAndManagerScope = + SearchScope bookScope = searchSession.scope( Book.class ); // <2> + SearchScope associateAndManagerScope = searchSession.scope( Arrays.asList( Associate.class, Manager.class ) ); // <3> - SearchScope personScope = searchSession.scope( Person.class ); // <4> - SearchScope personSubTypesScope = searchSession.scope( Person.class, + SearchScope personScope = searchSession.scope( Person.class ); // <4> + SearchScope personSubTypesScope = searchSession.scope( Person.class, Arrays.asList( "Manager", "Associate" ) ); // <5> - SearchScope allScope = searchSession.scope( Object.class ); // <6> + SearchScope allScope = searchSession.scope( Object.class ); // <6> // end::searchScope-fromSearchSession[] assertThat( bookScope.includedTypes() ) .extracting( SearchIndexedEntity::jpaName ) diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/gettingstarted/withhsearch/defaultanalysis/GettingStartedDefaultAnalysisIT.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/gettingstarted/withhsearch/defaultanalysis/GettingStartedDefaultAnalysisIT.java index 9372014968a..9ac10fc6ffd 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/gettingstarted/withhsearch/defaultanalysis/GettingStartedDefaultAnalysisIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/gettingstarted/withhsearch/defaultanalysis/GettingStartedDefaultAnalysisIT.java @@ -99,7 +99,7 @@ void test() { // Not shown: get the entity manager and open a transaction SearchSession searchSession = Search.session( entityManager ); // <1> - SearchScope scope = searchSession.scope( Book.class ); // <2> + SearchScope scope = searchSession.scope( Book.class ); // <2> SearchResult result = searchSession.search( scope ) // <3> .where( scope.predicate().match() // <4> diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/pojo/standalone/entrypoints/StandalonePojoEntryPointsIT.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/pojo/standalone/entrypoints/StandalonePojoEntryPointsIT.java index ffa4a9fc55c..97d93a883c6 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/pojo/standalone/entrypoints/StandalonePojoEntryPointsIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/pojo/standalone/entrypoints/StandalonePojoEntryPointsIT.java @@ -114,12 +114,13 @@ void searchSession_withOptions() { @Test void searchScope_fromSearchMapping() { SearchMapping searchMapping = theSearchMapping; - SearchScope bookScope = searchMapping.scope( Book.class ); - SearchScope associateAndManagerScope = searchMapping.scope( Arrays.asList( Associate.class, Manager.class ) ); - SearchScope personScope = searchMapping.scope( Person.class ); - SearchScope personSubTypesScope = searchMapping.scope( Person.class, + SearchScope bookScope = searchMapping.scope( Book.class ); + SearchScope associateAndManagerScope = + searchMapping.scope( Arrays.asList( Associate.class, Manager.class ) ); + SearchScope personScope = searchMapping.scope( Person.class ); + SearchScope personSubTypesScope = searchMapping.scope( Person.class, Arrays.asList( "Manager", "Associate" ) ); - SearchScope allScope = searchMapping.scope( Object.class ); + SearchScope allScope = searchMapping.scope( Object.class ); assertThat( bookScope.includedTypes() ) .extracting( SearchIndexedEntity::name ) .containsExactlyInAnyOrder( "Book" ); @@ -141,13 +142,13 @@ void searchScope_fromSearchMapping() { void searchScope_fromSearchSession() { SearchMapping searchMapping = theSearchMapping; try ( SearchSession searchSession = searchMapping.createSession() ) { - SearchScope bookScope = searchSession.scope( Book.class ); - SearchScope associateAndManagerScope = + SearchScope bookScope = searchSession.scope( Book.class ); + SearchScope associateAndManagerScope = searchSession.scope( Arrays.asList( Associate.class, Manager.class ) ); - SearchScope personScope = searchSession.scope( Person.class ); - SearchScope personSubTypesScope = searchSession.scope( Person.class, + SearchScope personScope = searchSession.scope( Person.class ); + SearchScope personSubTypesScope = searchSession.scope( Person.class, Arrays.asList( "Manager", "Associate" ) ); - SearchScope allScope = searchSession.scope( Object.class ); + SearchScope allScope = searchSession.scope( Object.class ); assertThat( bookScope.includedTypes() ) .extracting( SearchIndexedEntity::name ) .containsExactlyInAnyOrder( "Book" ); diff --git a/documentation/src/test/java/org/hibernate/search/documentation/mapper/pojo/standalone/gettingstarted/withhsearch/defaultanalysis/GettingStartedDefaultAnalysisIT.java b/documentation/src/test/java/org/hibernate/search/documentation/mapper/pojo/standalone/gettingstarted/withhsearch/defaultanalysis/GettingStartedDefaultAnalysisIT.java index 2ea915c665b..5d299f90fcc 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/mapper/pojo/standalone/gettingstarted/withhsearch/defaultanalysis/GettingStartedDefaultAnalysisIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/mapper/pojo/standalone/gettingstarted/withhsearch/defaultanalysis/GettingStartedDefaultAnalysisIT.java @@ -102,7 +102,7 @@ void test() { // tag::searching-objects[] try ( SearchSession session = searchMapping.createSession() ) { // <1> - SearchScope scope = session.scope( Book.class ); // <2> + SearchScope scope = session.scope( Book.class ); // <2> SearchResult result = session.search( scope ) // <3> .select( f -> f.id( Integer.class ) ) // <4> diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/aggregation/AggregationDslIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/aggregation/AggregationDslIT.java index fb1e2ef83a1..8b1dcd7b601 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/aggregation/AggregationDslIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/aggregation/AggregationDslIT.java @@ -85,7 +85,7 @@ void entryPoint() { Search.session( entityManager ); // tag::entryPoint-objects[] - SearchScope scope = searchSession.scope( Book.class ); + SearchScope scope = searchSession.scope( Book.class ); AggregationKey> countsByGenreKey = AggregationKey.of( "countsByGenre" ); 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 57ff3bcde03..b8cb092ad01 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 @@ -114,7 +114,7 @@ void withRoot() { } // tag::withRoot_method[] - private SearchPredicate matchFirstAndLastName(SearchPredicateFactory f, + private SearchPredicate matchFirstAndLastName(SearchPredicateFactory f, String firstName, String lastName) { return f.and( f.match().field( "firstName" ) // <1> 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 382f16f035b..b74f6b0f333 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 @@ -118,7 +118,7 @@ void entryPoint() { Search.session( entityManager ); // tag::entryPoint-objects[] - SearchScope scope = searchSession.scope( Book.class ); + SearchScope scope = searchSession.scope( Book.class ); List result = searchSession.search( scope ) .where( scope.predicate().match().field( "title" ) diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/projection/ProjectionDslIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/projection/ProjectionDslIT.java index 2801f65fc0f..1b822f0bc26 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/projection/ProjectionDslIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/projection/ProjectionDslIT.java @@ -96,7 +96,7 @@ void entryPoint() { Search.session( entityManager ); // tag::entryPoint-objects[] - SearchScope scope = searchSession.scope( Book.class ); + SearchScope scope = searchSession.scope( Book.class ); List result = searchSession.search( scope ) .select( scope.projection().field( "title", String.class ) diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/sort/SortDslIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/sort/SortDslIT.java index 637ef0454c4..dd974590a56 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/sort/SortDslIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/sort/SortDslIT.java @@ -74,7 +74,7 @@ void entryPoint() { Search.session( entityManager ); // tag::entryPoint-objects[] - SearchScope scope = searchSession.scope( Book.class ); + SearchScope scope = searchSession.scope( Book.class ); List result = searchSession.search( scope ) .where( scope.predicate().matchAll().toPredicate() ) diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/mapping/impl/MappedIndexManagerImpl.java b/engine/src/main/java/org/hibernate/search/engine/mapper/mapping/impl/MappedIndexManagerImpl.java index c8291e96b78..64a9cd9bf9c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/mapper/mapping/impl/MappedIndexManagerImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/mapper/mapping/impl/MappedIndexManagerImpl.java @@ -62,14 +62,14 @@ public IndexWorkspace createWorkspace(BackendMappingContext mappingContext, Set< } @Override - public MappedIndexScopeBuilder createScopeBuilder(BackendMappingContext mappingContext) { + public MappedIndexScopeBuilder createScopeBuilder(BackendMappingContext mappingContext) { return new MappedIndexScopeBuilderImpl<>( implementor, mappingContext ); } @Override - public void addTo(MappedIndexScopeBuilder builder) { - ( (MappedIndexScopeBuilderImpl) builder ).add( implementor ); + public void addTo(MappedIndexScopeBuilder builder) { + ( (MappedIndexScopeBuilderImpl) builder ).add( implementor ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/mapping/spi/MappedIndexManager.java b/engine/src/main/java/org/hibernate/search/engine/mapper/mapping/spi/MappedIndexManager.java index 3fc4e464eec..af672c96252 100644 --- a/engine/src/main/java/org/hibernate/search/engine/mapper/mapping/spi/MappedIndexManager.java +++ b/engine/src/main/java/org/hibernate/search/engine/mapper/mapping/spi/MappedIndexManager.java @@ -35,7 +35,7 @@ IndexIndexingPlan createIndexingPlan(BackendSessionContext sessionContext, IndexWorkspace createWorkspace(BackendMappingContext mappingContext, Set tenantId); - MappedIndexScopeBuilder createScopeBuilder(BackendMappingContext mappingContext); + MappedIndexScopeBuilder createScopeBuilder(BackendMappingContext mappingContext); - void addTo(MappedIndexScopeBuilder builder); + void addTo(MappedIndexScopeBuilder builder); } diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java index 6f1513bab3f..f896f9b8ebc 100644 --- a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java +++ b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java @@ -1,8 +1,6 @@ /* - * 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 . + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors */ package org.hibernate.search.engine.mapper.scope; @@ -29,10 +27,11 @@ * or to define the targeted entities/indexes * when passing it to the search session. * + * @param Scope root type. * @param A supertype of all types in this scope. * @param The type of entity reference used by the scope. */ -public interface SearchScope { +public interface SearchScope { /** * Initiate the building of a search predicate. @@ -48,7 +47,7 @@ public interface SearchScope { * @return A predicate factory. * @see SearchPredicateFactory */ - SearchPredicateFactory predicate(); + SearchPredicateFactory predicate(); /** * Initiate the building of a search sort. @@ -65,7 +64,7 @@ public interface SearchScope { * @return A sort factory. * @see SearchSortFactory */ - SearchSortFactory sort(); + SearchSortFactory sort(); /** * Initiate the building of a search projection that will be valid for the indexes in this scope. @@ -81,7 +80,7 @@ public interface SearchScope { * @return A projection factory. * @see SearchProjectionFactory */ - SearchProjectionFactory projection(); + SearchProjectionFactory projection(); /** * Initiate the building of a search aggregation that will be valid for the indexes in this scope. @@ -97,7 +96,7 @@ public interface SearchScope { * @return An aggregation factory. * @see SearchAggregationFactory */ - SearchAggregationFactory aggregation(); + SearchAggregationFactory aggregation(); /** * Initiate the building of a highlighter that will be valid for the indexes in this scope. diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java index e4f40c162f1..a9e26b8b182 100644 --- a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java +++ b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java @@ -1,8 +1,6 @@ /* - * 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 . + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors */ package org.hibernate.search.engine.mapper.scope; @@ -21,11 +19,12 @@ public interface SearchScopeProvider { * indexed entity types among the given class and its subtypes. * * @param clazz A class that must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - default SearchScope scope(Class clazz) { + default SearchScope scope(Class clazz) { return scope( Collections.singleton( clazz ) ); } @@ -35,11 +34,12 @@ default SearchScope scope(Class clazz) { * * @param classes A collection of classes. * Each must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - SearchScope scope(Collection> classes); + SearchScope scope(Collection> classes); /** * Creates a {@link SearchScope} limited to @@ -48,11 +48,12 @@ default SearchScope scope(Class clazz) { * @param expectedSuperType A supertype of all entity types to include in the scope. * @param entityName An entity name. * The referenced entity type must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - default SearchScope scope(Class expectedSuperType, String entityName) { + default SearchScope scope(Class expectedSuperType, String entityName) { return scope( expectedSuperType, Collections.singleton( entityName ) ); } @@ -63,10 +64,11 @@ default SearchScope scope(Class expectedSuperType, String entityNa * @param expectedSuperType A supertype of all indexed entity types to include in the scope. * @param entityNames A collection of entity names. * Each entity type referenced in the collection must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - SearchScope scope(Class expectedSuperType, Collection entityNames); + SearchScope scope(Class expectedSuperType, Collection entityNames); } diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/impl/MappedIndexScopeBuilderImpl.java b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/impl/MappedIndexScopeBuilderImpl.java index 5496f1b6958..9efef954e10 100644 --- a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/impl/MappedIndexScopeBuilderImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/impl/MappedIndexScopeBuilderImpl.java @@ -10,7 +10,7 @@ import org.hibernate.search.engine.mapper.scope.spi.MappedIndexScope; import org.hibernate.search.engine.mapper.scope.spi.MappedIndexScopeBuilder; -public class MappedIndexScopeBuilderImpl implements MappedIndexScopeBuilder { +public class MappedIndexScopeBuilderImpl implements MappedIndexScopeBuilder { private final IndexScopeBuilder delegate; public MappedIndexScopeBuilderImpl(IndexManagerImplementor firstIndexManager, @@ -23,7 +23,7 @@ public void add(IndexManagerImplementor indexManager) { } @Override - public MappedIndexScope build() { + public MappedIndexScope build() { return new MappedIndexScopeImpl<>( delegate.build() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/impl/MappedIndexScopeImpl.java b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/impl/MappedIndexScopeImpl.java index ef8150e3a9e..73666e53d9b 100644 --- a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/impl/MappedIndexScopeImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/impl/MappedIndexScopeImpl.java @@ -17,7 +17,7 @@ import org.hibernate.search.engine.search.query.dsl.impl.DefaultSearchQuerySelectStep; import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory; -class MappedIndexScopeImpl implements MappedIndexScope { +class MappedIndexScopeImpl implements MappedIndexScope { private final IndexScope delegate; @@ -31,29 +31,29 @@ public String toString() { } @Override - public SearchQuerySelectStep, ?> search( + public SearchQuerySelectStep, ?> search( BackendSessionContext sessionContext, SearchLoadingContextBuilder loadingContextBuilder) { return new DefaultSearchQuerySelectStep<>( delegate.searchScope(), sessionContext, loadingContextBuilder ); } @Override - public SearchPredicateFactory predicate() { + public SearchPredicateFactory predicate() { return delegate.searchScope().predicateFactory(); } @Override - public SearchSortFactory sort() { + public SearchSortFactory sort() { return delegate.searchScope().sortFactory(); } @Override - public SearchProjectionFactory projection() { + public SearchProjectionFactory projection() { return delegate.searchScope().projectionFactory(); } @Override - public SearchAggregationFactory aggregation() { + public SearchAggregationFactory aggregation() { return delegate.searchScope().aggregationFactory(); } diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/spi/MappedIndexScope.java b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/spi/MappedIndexScope.java index 3c0d20969b8..c9e85aaf2a0 100644 --- a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/spi/MappedIndexScope.java +++ b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/spi/MappedIndexScope.java @@ -15,6 +15,7 @@ import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory; /** + * @param Scope root type. * @param The type of entity references, i.e. the type of hits returned by * {@link SearchQuerySelectStep#selectEntityReference() reference queries}, * or the type of objects returned for {@link SearchProjectionFactory#entityReference() entity reference projections}. @@ -22,7 +23,7 @@ * {@link SearchQuerySelectStep#selectEntity() entity queries} * or the type of objects returned for {@link SearchProjectionFactory#entity() entity projections}. */ -public interface MappedIndexScope { +public interface MappedIndexScope { /* * IMPLEMENTATION NOTE: we *must* only accept a loading context with the same R/E type parameters as this class, @@ -30,22 +31,22 @@ public interface MappedIndexScope { * will be wrong. * In particular, we cannot accept a LoadingContextBuilder with any T. */ - SearchQuerySelectStep, ?> search( + SearchQuerySelectStep, ?> search( BackendSessionContext sessionContext, SearchLoadingContextBuilder loadingContextBuilder); - SearchPredicateFactory predicate(); + SearchPredicateFactory predicate(); - SearchSortFactory sort(); + SearchSortFactory sort(); /* * IMPLEMENTATION NOTE: we *must* return a factory with the same R/E type arguments as this class, * otherwise some casts in EntityProjectionOptionsStepImpl and EntityReferenceProjectionOptionsStepImpl * will be wrong. */ - SearchProjectionFactory projection(); + SearchProjectionFactory projection(); - SearchAggregationFactory aggregation(); + SearchAggregationFactory aggregation(); SearchHighlighterFactory highlighter(); diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/spi/MappedIndexScopeBuilder.java b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/spi/MappedIndexScopeBuilder.java index 485aa5b0006..415a8c8318f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/spi/MappedIndexScopeBuilder.java +++ b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/spi/MappedIndexScopeBuilder.java @@ -5,8 +5,8 @@ package org.hibernate.search.engine.mapper.scope.spi; -public interface MappedIndexScopeBuilder { +public interface MappedIndexScopeBuilder { - MappedIndexScope build(); + MappedIndexScope build(); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AggregationFilterStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AggregationFilterStep.java index bb7430e7d1d..09fc32d46a6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AggregationFilterStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AggregationFilterStep.java @@ -14,10 +14,11 @@ * The step in an aggregation definition where a filter can be set * to select nested objects from which values will be extracted for this aggregation. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step) * @param The type of factory used to create predicates in {@link #filter(Function)}. */ -public interface AggregationFilterStep { +public interface AggregationFilterStep> { /** * Filter nested objects from which values will be extracted for this aggregation. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java index c01f187cab5..cac2fa772f0 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java @@ -13,10 +13,11 @@ /** * The initial step in an "avg" aggregation definition, where the target field can be set. * + * @param Scope root type. * @param The type of factory used to create predicates in {@link AggregationFilterStep#filter(Function)}. */ @Incubating -public interface AvgAggregationFieldStep { +public interface AvgAggregationFieldStep> { /** * Target the given field in the avg aggregation. @@ -26,7 +27,7 @@ public interface AvgAggregationFieldStep { * @param The type of field values or {@link Double} if a double result is required. * @return The next step. */ - default AvgAggregationOptionsStep field(String fieldPath, Class type) { + default AvgAggregationOptionsStep field(String fieldPath, Class type) { return field( fieldPath, type, ValueModel.MAPPING ); } @@ -40,7 +41,7 @@ default AvgAggregationOptionsStep field(String fieldPath, Class AvgAggregationOptionsStep field(String fieldPath, Class type, + AvgAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationOptionsStep.java index 2bc84984a1c..bfc1d01cab9 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationOptionsStep.java @@ -12,15 +12,17 @@ /** * The final step in a "avg" aggregation definition, where optional parameters can be set. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of factory used to create predicates in {@link #filter(Function)}. * @param The type of the targeted field. The type of result for this aggregation. */ @Incubating public interface AvgAggregationOptionsStep< - S extends AvgAggregationOptionsStep, - PDF extends SearchPredicateFactory, + SR, + S extends AvgAggregationOptionsStep, + PDF extends SearchPredicateFactory, F> - extends AggregationFinalStep, AggregationFilterStep { + extends AggregationFinalStep, AggregationFilterStep { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java index 56d5e1bbd0f..9960e509b5c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java @@ -12,10 +12,11 @@ /** * The initial step in a "count" aggregation definition, where the target field can be set. * + * @param Scope root type. * @param The type of factory used to create predicates in {@link AggregationFilterStep#filter(Function)}. */ @Incubating -public interface CountAggregationFieldStep { +public interface CountAggregationFieldStep> { /** * Target the given field in the count aggregation. @@ -23,6 +24,6 @@ public interface CountAggregationFieldStep { * @param fieldPath The path to the index field to aggregate. * @return The next step. */ - CountAggregationOptionsStep field(String fieldPath); + CountAggregationOptionsStep field(String fieldPath); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationOptionsStep.java index 75bde934f04..9b613d7c239 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationOptionsStep.java @@ -12,13 +12,15 @@ /** * The final step in a "count" aggregation definition, where optional parameters can be set. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of factory used to create predicates in {@link #filter(Function)}. */ @Incubating public interface CountAggregationOptionsStep< - S extends CountAggregationOptionsStep, - PDF extends SearchPredicateFactory> - extends AggregationFinalStep, AggregationFilterStep { + SR, + S extends CountAggregationOptionsStep, + PDF extends SearchPredicateFactory> + extends AggregationFinalStep, AggregationFilterStep { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java index 03a192ff267..7d3bab192d6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java @@ -12,10 +12,11 @@ /** * The initial step in a "count distinct" aggregation definition, where the target field can be set. * + * @param Scope root type. * @param The type of factory used to create predicates in {@link AggregationFilterStep#filter(Function)}. */ @Incubating -public interface CountDistinctAggregationFieldStep { +public interface CountDistinctAggregationFieldStep> { /** * Target the given field in the count distinct aggregation. @@ -23,6 +24,6 @@ public interface CountDistinctAggregationFieldSteppath to the index field to aggregate. * @return The next step. */ - CountDistinctAggregationOptionsStep field(String fieldPath); + CountDistinctAggregationOptionsStep field(String fieldPath); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationOptionsStep.java index 86e1a882681..52744c8be00 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationOptionsStep.java @@ -12,13 +12,15 @@ /** * The final step in a "count distinct" aggregation definition, where optional parameters can be set. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of factory used to create predicates in {@link #filter(Function)}. */ @Incubating public interface CountDistinctAggregationOptionsStep< - S extends CountDistinctAggregationOptionsStep, - PDF extends SearchPredicateFactory> - extends AggregationFinalStep, AggregationFilterStep { + SR, + S extends CountDistinctAggregationOptionsStep, + PDF extends SearchPredicateFactory> + extends AggregationFinalStep, AggregationFilterStep { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/ExtendedSearchAggregationFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/ExtendedSearchAggregationFactory.java index 471a0ba2e7d..87c1385cffe 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/ExtendedSearchAggregationFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/ExtendedSearchAggregationFactory.java @@ -13,41 +13,43 @@ * easily override the self type and predicate factory type for all relevant methods. *

* Warning: Generic parameters of this type are subject to change, - * so this type should not be referenced directtly in user code. + * so this type should not be referenced directly in user code. * + * @param Scope root type. * @param The self type, i.e. the exposed type of this factory. * @param The type of factory used to create predicates in {@link AggregationFilterStep#filter(Function)}. */ public interface ExtendedSearchAggregationFactory< - S extends ExtendedSearchAggregationFactory, - PDF extends SearchPredicateFactory> - extends SearchAggregationFactory { + SR, + S extends ExtendedSearchAggregationFactory, + PDF extends SearchPredicateFactory> + extends SearchAggregationFactory { @Override S withRoot(String objectFieldPath); @Override - RangeAggregationFieldStep range(); + RangeAggregationFieldStep range(); @Override - TermsAggregationFieldStep terms(); + TermsAggregationFieldStep terms(); @Override - SumAggregationFieldStep sum(); + SumAggregationFieldStep sum(); @Override - MinAggregationFieldStep min(); + MinAggregationFieldStep min(); @Override - MaxAggregationFieldStep max(); + MaxAggregationFieldStep max(); @Override - CountAggregationFieldStep count(); + CountAggregationFieldStep count(); @Override - CountDistinctAggregationFieldStep countDistinct(); + CountDistinctAggregationFieldStep countDistinct(); @Override - AvgAggregationFieldStep avg(); + AvgAggregationFieldStep avg(); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java index f53ea4ff24e..ec64558e191 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java @@ -13,10 +13,11 @@ /** * The initial step in a "min" aggregation definition, where the target field can be set. * + * @param Scope root type. * @param The type of factory used to create predicates in {@link AggregationFilterStep#filter(Function)}. */ @Incubating -public interface MaxAggregationFieldStep { +public interface MaxAggregationFieldStep> { /** * Target the given field in the min aggregation. @@ -26,7 +27,7 @@ public interface MaxAggregationFieldStep { * @param The type of field values. * @return The next step. */ - default MaxAggregationOptionsStep field(String fieldPath, Class type) { + default MaxAggregationOptionsStep field(String fieldPath, Class type) { return field( fieldPath, type, ValueModel.MAPPING ); } @@ -40,6 +41,6 @@ default MaxAggregationOptionsStep field(String fieldPath, Class MaxAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel); + MaxAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationOptionsStep.java index 02f3602b1eb..4b6918dd3d2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationOptionsStep.java @@ -12,15 +12,17 @@ /** * The final step in a "max" aggregation definition, where optional parameters can be set. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of factory used to create predicates in {@link #filter(Function)}. * @param The type of the targeted field. The type of result for this aggregation. */ @Incubating public interface MaxAggregationOptionsStep< - S extends MaxAggregationOptionsStep, - PDF extends SearchPredicateFactory, + SR, + S extends MaxAggregationOptionsStep, + PDF extends SearchPredicateFactory, F> - extends AggregationFinalStep, AggregationFilterStep { + extends AggregationFinalStep, AggregationFilterStep { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java index 17dfb0ba747..bcc427aa269 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java @@ -13,10 +13,11 @@ /** * The initial step in a "min" aggregation definition, where the target field can be set. * + * @param Scope root type. * @param The type of factory used to create predicates in {@link AggregationFilterStep#filter(Function)}. */ @Incubating -public interface MinAggregationFieldStep { +public interface MinAggregationFieldStep> { /** * Target the given field in the min aggregation. @@ -26,7 +27,7 @@ public interface MinAggregationFieldStep { * @param The type of field values. * @return The next step. */ - default MinAggregationOptionsStep field(String fieldPath, Class type) { + default MinAggregationOptionsStep field(String fieldPath, Class type) { return field( fieldPath, type, ValueModel.MAPPING ); } @@ -40,6 +41,6 @@ default MinAggregationOptionsStep field(String fieldPath, Class MinAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel); + MinAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationOptionsStep.java index faf15be53ae..65a868f3b32 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationOptionsStep.java @@ -12,15 +12,17 @@ /** * The final step in a "min" aggregation definition, where optional parameters can be set. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of factory used to create predicates in {@link #filter(Function)}. * @param The type of the targeted field. The type of result for this aggregation. */ @Incubating public interface MinAggregationOptionsStep< - S extends MinAggregationOptionsStep, - PDF extends SearchPredicateFactory, + SR, + S extends MinAggregationOptionsStep, + PDF extends SearchPredicateFactory, F> - extends AggregationFinalStep, AggregationFilterStep { + extends AggregationFinalStep, AggregationFilterStep { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java index be53ede4c4d..3cdcf612b27 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java @@ -12,9 +12,10 @@ /** * The initial step in a "range" aggregation definition, where the target field can be set. * + * @param Scope root type. * @param The type of factory used to create predicates in {@link AggregationFilterStep#filter(Function)}. */ -public interface RangeAggregationFieldStep { +public interface RangeAggregationFieldStep> { /** * Target the given field in the range aggregation. @@ -24,7 +25,7 @@ public interface RangeAggregationFieldStep { * @param The type of field values. * @return The next step. */ - default RangeAggregationRangeStep field(String fieldPath, Class type) { + default RangeAggregationRangeStep field(String fieldPath, Class type) { return field( fieldPath, type, ValueModel.MAPPING ); } @@ -40,7 +41,7 @@ default RangeAggregationRangeStep field(String fieldPath, Class RangeAggregationRangeStep field(String fieldPath, Class type, + default RangeAggregationRangeStep field(String fieldPath, Class type, org.hibernate.search.engine.search.common.ValueConvert convert) { return field( fieldPath, type, org.hibernate.search.engine.search.common.ValueConvert.toValueModel( convert ) ); @@ -56,6 +57,6 @@ default RangeAggregationRangeStep field(String fieldPath, Class RangeAggregationRangeStep field(String fieldPath, Class type, ValueModel valueModel); + RangeAggregationRangeStep field(String fieldPath, Class type, ValueModel valueModel); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationOptionsStep.java index 685fd23c546..2f6cef5c793 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationOptionsStep.java @@ -11,16 +11,18 @@ /** * The final step in a "range" aggregation definition, where optional parameters can be set. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of factory used to create predicates in {@link #filter(Function)}. * @param The type of the targeted field. * @param The type of result for this aggregation. */ public interface RangeAggregationOptionsStep< - S extends RangeAggregationOptionsStep, - PDF extends SearchPredicateFactory, + SR, + S extends RangeAggregationOptionsStep, + PDF extends SearchPredicateFactory, F, A> - extends AggregationFinalStep, AggregationFilterStep { + extends AggregationFinalStep, AggregationFilterStep { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationRangeMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationRangeMoreStep.java index bd3b127f4c0..3e04669fedd 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationRangeMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationRangeMoreStep.java @@ -15,17 +15,19 @@ * (see the superinterface {@link RangeAggregationOptionsStep}), * or more ranges can be added. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of factory used to create predicates in {@link #filter(Function)}. * @param The type of the next step. * @param The type of the targeted field. */ public interface RangeAggregationRangeMoreStep< - S extends RangeAggregationRangeMoreStep, - N extends RangeAggregationOptionsStep, Long>>, - PDF extends SearchPredicateFactory, + SR, + S extends RangeAggregationRangeMoreStep, + N extends RangeAggregationOptionsStep, Long>>, + PDF extends SearchPredicateFactory, F> - extends RangeAggregationOptionsStep, Long>>, - RangeAggregationRangeStep { + extends RangeAggregationOptionsStep, Long>>, + RangeAggregationRangeStep { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationRangeStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationRangeStep.java index 90f63322c27..2bfb337ce9b 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationRangeStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationRangeStep.java @@ -13,13 +13,15 @@ /** * The step in a "range" aggregation definition where the ranges can be set. * + * @param Scope root type. * @param The type of the next step. * @param The type of factory used to create predicates in {@link AggregationFilterStep#filter(Function)}. * @param The type of the targeted field. */ public interface RangeAggregationRangeStep< - N extends RangeAggregationRangeMoreStep, - PDF extends SearchPredicateFactory, + SR, + N extends RangeAggregationRangeMoreStep, + PDF extends SearchPredicateFactory, F> { /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java index 8758c00504f..be5c0cbcc8f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java @@ -27,9 +27,11 @@ * Such a factory can also transform relative paths into absolute paths using {@link #toAbsolutePath(String)}; * this can be useful for native aggregations in particular. * + * @param Scope root type. + * * @author Emmanuel Bernard emmanuel@hibernate.org */ -public interface SearchAggregationFactory { +public interface SearchAggregationFactory { /** * Perform aggregation in range buckets. @@ -44,7 +46,7 @@ public interface SearchAggregationFactory { * * @return The next step. */ - RangeAggregationFieldStep range(); + RangeAggregationFieldStep range(); /** * Perform aggregation in term buckets. @@ -59,7 +61,7 @@ public interface SearchAggregationFactory { * * @return The next step. */ - TermsAggregationFieldStep terms(); + TermsAggregationFieldStep terms(); /** * Perform the sum metric aggregation. @@ -67,7 +69,7 @@ public interface SearchAggregationFactory { * @return The next step. */ @Incubating - SumAggregationFieldStep sum(); + SumAggregationFieldStep sum(); /** * Perform the min metric aggregation. @@ -75,7 +77,7 @@ public interface SearchAggregationFactory { * @return The next step. */ @Incubating - MinAggregationFieldStep min(); + MinAggregationFieldStep min(); /** * Perform the max metric aggregation. @@ -83,7 +85,7 @@ public interface SearchAggregationFactory { * @return The next step. */ @Incubating - MaxAggregationFieldStep max(); + MaxAggregationFieldStep max(); /** * Perform the count metric aggregation. @@ -91,7 +93,7 @@ public interface SearchAggregationFactory { * @return The next step. */ @Incubating - CountAggregationFieldStep count(); + CountAggregationFieldStep count(); /** * Perform the count distinct metric aggregation. @@ -99,7 +101,7 @@ public interface SearchAggregationFactory { * @return The next step. */ @Incubating - CountDistinctAggregationFieldStep countDistinct(); + CountDistinctAggregationFieldStep countDistinct(); /** * Perform the avg metric aggregation. @@ -107,7 +109,7 @@ public interface SearchAggregationFactory { * @return the next step. */ @Incubating - AvgAggregationFieldStep avg(); + AvgAggregationFieldStep avg(); /** * Delegating aggregation that creates the actual aggregation at query create time and provides access to query parameters. @@ -130,7 +132,7 @@ AggregationFinalStep withParameters( * @return The extended factory. * @throws SearchException If the extension cannot be applied (wrong underlying backend, ...). */ - T extension(SearchAggregationFactoryExtension extension); + T extension(SearchAggregationFactoryExtension extension); /** * Create a new aggregation factory whose root for all paths passed to the DSL @@ -142,7 +144,7 @@ AggregationFinalStep withParameters( * @return A new aggregation factory using the given object field as root. */ @Incubating - SearchAggregationFactory withRoot(String objectFieldPath); + SearchAggregationFactory withRoot(String objectFieldPath); /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactoryExtension.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactoryExtension.java index 2797fac943b..c0efcede5cd 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactoryExtension.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactoryExtension.java @@ -14,13 +14,14 @@ * In short, users are only expected to get instances of this type from an API ({@code SomeExtension.get()}) * and pass it to another API. * + * @param Scope root type. * @param The type of extended aggregation factories. Should generally extend * {@link SearchAggregationFactory}. * * @see SearchAggregationFactory#extension(SearchAggregationFactoryExtension) * @see ExtendedSearchAggregationFactory */ -public interface SearchAggregationFactoryExtension { +public interface SearchAggregationFactoryExtension { /** * Attempt to extend a given factory, returning an empty {@link Optional} in case of failure. @@ -31,6 +32,6 @@ public interface SearchAggregationFactoryExtension { * @return An optional containing the extended aggregation factory ({@link T}) in case * of success, or an empty optional otherwise. */ - Optional extendOptional(SearchAggregationFactory original); + Optional extendOptional(SearchAggregationFactory original); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java index ba33242b204..6ec8a9a2cc9 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java @@ -13,10 +13,11 @@ /** * The initial step in a "sum" aggregation definition, where the target field can be set. * + * @param Scope root type. * @param The type of factory used to create predicates in {@link AggregationFilterStep#filter(Function)}. */ @Incubating -public interface SumAggregationFieldStep { +public interface SumAggregationFieldStep> { /** * Target the given field in the sum aggregation. @@ -26,7 +27,7 @@ public interface SumAggregationFieldStep { * @param The type of field values. * @return The next step. */ - default SumAggregationOptionsStep field(String fieldPath, Class type) { + default SumAggregationOptionsStep field(String fieldPath, Class type) { return field( fieldPath, type, ValueModel.MAPPING ); } @@ -40,6 +41,6 @@ default SumAggregationOptionsStep field(String fieldPath, Class SumAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel); + SumAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationOptionsStep.java index 62f7b547c1f..e4a0cb6eba2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationOptionsStep.java @@ -12,15 +12,17 @@ /** * The final step in a "sum" aggregation definition, where optional parameters can be set. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of factory used to create predicates in {@link #filter(Function)}. * @param The type of the targeted field. The type of result for this aggregation. */ @Incubating public interface SumAggregationOptionsStep< - S extends SumAggregationOptionsStep, - PDF extends SearchPredicateFactory, + SR, + S extends SumAggregationOptionsStep, + PDF extends SearchPredicateFactory, F> - extends AggregationFinalStep, AggregationFilterStep { + extends AggregationFinalStep, AggregationFilterStep { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java index 094572bcabf..2e4efd7942a 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java @@ -13,9 +13,10 @@ /** * The initial step in a "terms" aggregation definition, where the target field can be set. * + * @param Scope root type. * @param The type of factory used to create predicates in {@link AggregationFilterStep#filter(Function)}. */ -public interface TermsAggregationFieldStep { +public interface TermsAggregationFieldStep> { /** * Target the given field in the terms aggregation. @@ -25,7 +26,7 @@ public interface TermsAggregationFieldStep { * @param The type of field values. * @return The next step. */ - default TermsAggregationOptionsStep> field(String fieldPath, Class type) { + default TermsAggregationOptionsStep> field(String fieldPath, Class type) { return field( fieldPath, type, ValueModel.MAPPING ); } @@ -41,7 +42,7 @@ default TermsAggregationOptionsStep> field(String fi * @deprecated Use {@link #field(String, Class, ValueModel)} instead. */ @Deprecated(since = "7.2") - default TermsAggregationOptionsStep> field(String fieldPath, Class type, + default TermsAggregationOptionsStep> field(String fieldPath, Class type, org.hibernate.search.engine.search.common.ValueConvert convert) { return field( fieldPath, type, org.hibernate.search.engine.search.common.ValueConvert.toValueModel( convert ) ); @@ -57,7 +58,7 @@ default TermsAggregationOptionsStep> field(String fi * See {@link ValueModel}. * @return The next step. */ - TermsAggregationOptionsStep> field(String fieldPath, Class type, + TermsAggregationOptionsStep> field(String fieldPath, Class type, ValueModel valueModel); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationOptionsStep.java index fb558d40662..22fbf84f1ca 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationOptionsStep.java @@ -17,11 +17,12 @@ * @param The type of result for this aggregation. */ public interface TermsAggregationOptionsStep< - S extends TermsAggregationOptionsStep, - PDF extends SearchPredicateFactory, + SR, + S extends TermsAggregationOptionsStep, + PDF extends SearchPredicateFactory, F, A> - extends AggregationFinalStep, AggregationFilterStep { + extends AggregationFinalStep, AggregationFilterStep { /** * Order buckets by descending document count in the aggregation result. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/AvgAggregationFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/AvgAggregationFieldStepImpl.java index 0bf82205106..e6fef4958f9 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/AvgAggregationFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/AvgAggregationFieldStepImpl.java @@ -13,15 +13,16 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.util.common.impl.Contracts; -public class AvgAggregationFieldStepImpl implements AvgAggregationFieldStep { - private final SearchAggregationDslContext dslContext; +public class AvgAggregationFieldStepImpl> + implements AvgAggregationFieldStep { + private final SearchAggregationDslContext dslContext; - public AvgAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { + public AvgAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { this.dslContext = dslContext; } @Override - public AvgAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel) { + public AvgAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel) { Contracts.assertNotNull( fieldPath, "fieldPath" ); Contracts.assertNotNull( type, "type" ); FieldMetricAggregationBuilder builder = dslContext.scope() diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/AvgAggregationOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/AvgAggregationOptionsStepImpl.java index e6deb06eec2..f3f0107bc70 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/AvgAggregationOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/AvgAggregationOptionsStepImpl.java @@ -14,19 +14,19 @@ import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -class AvgAggregationOptionsStepImpl - implements AvgAggregationOptionsStep, PDF, F> { +class AvgAggregationOptionsStepImpl, F> + implements AvgAggregationOptionsStep, PDF, F> { private final FieldMetricAggregationBuilder builder; - private final SearchAggregationDslContext dslContext; + private final SearchAggregationDslContext dslContext; AvgAggregationOptionsStepImpl(FieldMetricAggregationBuilder builder, - SearchAggregationDslContext dslContext) { + SearchAggregationDslContext dslContext) { this.builder = builder; this.dslContext = dslContext; } @Override - public AvgAggregationOptionsStepImpl filter( + public AvgAggregationOptionsStepImpl filter( Function clauseContributor) { SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); @@ -34,7 +34,7 @@ public AvgAggregationOptionsStepImpl filter( } @Override - public AvgAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { + public AvgAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { builder.filter( searchPredicate ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountAggregationFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountAggregationFieldStepImpl.java index c9e8dc6d957..40ae2f5d268 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountAggregationFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountAggregationFieldStepImpl.java @@ -11,16 +11,16 @@ import org.hibernate.search.engine.search.aggregation.spi.SearchFilterableAggregationBuilder; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -public class CountAggregationFieldStepImpl - implements CountAggregationFieldStep { - private final SearchAggregationDslContext dslContext; +public class CountAggregationFieldStepImpl> + implements CountAggregationFieldStep { + private final SearchAggregationDslContext dslContext; - public CountAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { + public CountAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { this.dslContext = dslContext; } @Override - public CountAggregationOptionsStep field(String fieldPath) { + public CountAggregationOptionsStep field(String fieldPath) { SearchFilterableAggregationBuilder builder = dslContext.scope() .fieldQueryElement( fieldPath, AggregationTypeKeys.COUNT ); return new CountAggregationOptionsStepImpl<>( builder, dslContext ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountAggregationOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountAggregationOptionsStepImpl.java index b901b4ddf70..17c8d374869 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountAggregationOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountAggregationOptionsStepImpl.java @@ -14,26 +14,26 @@ import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -class CountAggregationOptionsStepImpl - implements CountAggregationOptionsStep, PDF> { +class CountAggregationOptionsStepImpl> + implements CountAggregationOptionsStep, PDF> { private final SearchFilterableAggregationBuilder builder; - private final SearchAggregationDslContext dslContext; + private final SearchAggregationDslContext dslContext; CountAggregationOptionsStepImpl(SearchFilterableAggregationBuilder builder, - SearchAggregationDslContext dslContext) { + SearchAggregationDslContext dslContext) { this.builder = builder; this.dslContext = dslContext; } @Override - public CountAggregationOptionsStepImpl filter( + public CountAggregationOptionsStepImpl filter( Function clauseContributor) { SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); return filter( predicate ); } @Override - public CountAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { + public CountAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { builder.filter( searchPredicate ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountDistinctAggregationFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountDistinctAggregationFieldStepImpl.java index 9fd3109d386..239db8baf53 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountDistinctAggregationFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountDistinctAggregationFieldStepImpl.java @@ -11,16 +11,16 @@ import org.hibernate.search.engine.search.aggregation.spi.SearchFilterableAggregationBuilder; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -public class CountDistinctAggregationFieldStepImpl - implements CountDistinctAggregationFieldStep { - private final SearchAggregationDslContext dslContext; +public class CountDistinctAggregationFieldStepImpl> + implements CountDistinctAggregationFieldStep { + private final SearchAggregationDslContext dslContext; - public CountDistinctAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { + public CountDistinctAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { this.dslContext = dslContext; } @Override - public CountDistinctAggregationOptionsStep field(String fieldPath) { + public CountDistinctAggregationOptionsStep field(String fieldPath) { SearchFilterableAggregationBuilder builder = dslContext.scope() .fieldQueryElement( fieldPath, AggregationTypeKeys.COUNT_DISTINCT ); return new CountDistinctAggregationOptionsStepImpl<>( builder, dslContext ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountDistinctAggregationOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountDistinctAggregationOptionsStepImpl.java index c70765f7cd5..9bc23a51cb2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountDistinctAggregationOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/CountDistinctAggregationOptionsStepImpl.java @@ -14,26 +14,26 @@ import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -class CountDistinctAggregationOptionsStepImpl - implements CountDistinctAggregationOptionsStep, PDF> { +class CountDistinctAggregationOptionsStepImpl> + implements CountDistinctAggregationOptionsStep, PDF> { private final SearchFilterableAggregationBuilder builder; - private final SearchAggregationDslContext dslContext; + private final SearchAggregationDslContext dslContext; CountDistinctAggregationOptionsStepImpl(SearchFilterableAggregationBuilder builder, - SearchAggregationDslContext dslContext) { + SearchAggregationDslContext dslContext) { this.builder = builder; this.dslContext = dslContext; } @Override - public CountDistinctAggregationOptionsStepImpl filter( + public CountDistinctAggregationOptionsStepImpl filter( Function clauseContributor) { SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); return filter( predicate ); } @Override - public CountDistinctAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { + public CountDistinctAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { builder.filter( searchPredicate ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MaxAggregationFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MaxAggregationFieldStepImpl.java index 402063425b4..fc960180ff6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MaxAggregationFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MaxAggregationFieldStepImpl.java @@ -13,15 +13,16 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.util.common.impl.Contracts; -public class MaxAggregationFieldStepImpl implements MaxAggregationFieldStep { - private final SearchAggregationDslContext dslContext; +public class MaxAggregationFieldStepImpl> + implements MaxAggregationFieldStep { + private final SearchAggregationDslContext dslContext; - public MaxAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { + public MaxAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { this.dslContext = dslContext; } @Override - public MaxAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel) { + public MaxAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel) { Contracts.assertNotNull( fieldPath, "fieldPath" ); Contracts.assertNotNull( type, "type" ); FieldMetricAggregationBuilder builder = dslContext.scope() diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MaxAggregationOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MaxAggregationOptionsStepImpl.java index 061418467b0..f1b35a74b97 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MaxAggregationOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MaxAggregationOptionsStepImpl.java @@ -14,19 +14,19 @@ import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -class MaxAggregationOptionsStepImpl - implements MaxAggregationOptionsStep, PDF, F> { +class MaxAggregationOptionsStepImpl, F> + implements MaxAggregationOptionsStep, PDF, F> { private final FieldMetricAggregationBuilder builder; - private final SearchAggregationDslContext dslContext; + private final SearchAggregationDslContext dslContext; MaxAggregationOptionsStepImpl(FieldMetricAggregationBuilder builder, - SearchAggregationDslContext dslContext) { + SearchAggregationDslContext dslContext) { this.builder = builder; this.dslContext = dslContext; } @Override - public MaxAggregationOptionsStepImpl filter( + public MaxAggregationOptionsStepImpl filter( Function clauseContributor) { SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); @@ -34,7 +34,7 @@ public MaxAggregationOptionsStepImpl filter( } @Override - public MaxAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { + public MaxAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { builder.filter( searchPredicate ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MinAggregationFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MinAggregationFieldStepImpl.java index efa59e2e7b2..edd21456f76 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MinAggregationFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MinAggregationFieldStepImpl.java @@ -13,15 +13,16 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.util.common.impl.Contracts; -public class MinAggregationFieldStepImpl implements MinAggregationFieldStep { - private final SearchAggregationDslContext dslContext; +public class MinAggregationFieldStepImpl> + implements MinAggregationFieldStep { + private final SearchAggregationDslContext dslContext; - public MinAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { + public MinAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { this.dslContext = dslContext; } @Override - public MinAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel) { + public MinAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel) { Contracts.assertNotNull( fieldPath, "fieldPath" ); Contracts.assertNotNull( type, "type" ); FieldMetricAggregationBuilder builder = dslContext.scope() diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MinAggregationOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MinAggregationOptionsStepImpl.java index 914349e578e..bcbd2a66241 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MinAggregationOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/MinAggregationOptionsStepImpl.java @@ -14,19 +14,19 @@ import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -class MinAggregationOptionsStepImpl - implements MinAggregationOptionsStep, PDF, F> { +class MinAggregationOptionsStepImpl, F> + implements MinAggregationOptionsStep, PDF, F> { private final FieldMetricAggregationBuilder builder; - private final SearchAggregationDslContext dslContext; + private final SearchAggregationDslContext dslContext; MinAggregationOptionsStepImpl(FieldMetricAggregationBuilder builder, - SearchAggregationDslContext dslContext) { + SearchAggregationDslContext dslContext) { this.builder = builder; this.dslContext = dslContext; } @Override - public MinAggregationOptionsStepImpl filter( + public MinAggregationOptionsStepImpl filter( Function clauseContributor) { SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); @@ -34,7 +34,7 @@ public MinAggregationOptionsStepImpl filter( } @Override - public MinAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { + public MinAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { builder.filter( searchPredicate ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/RangeAggregationFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/RangeAggregationFieldStepImpl.java index 235ccc6eba8..f97b7f07088 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/RangeAggregationFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/RangeAggregationFieldStepImpl.java @@ -13,15 +13,16 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.util.common.impl.Contracts; -public class RangeAggregationFieldStepImpl implements RangeAggregationFieldStep { - private final SearchAggregationDslContext dslContext; +public class RangeAggregationFieldStepImpl> + implements RangeAggregationFieldStep { + private final SearchAggregationDslContext dslContext; - public RangeAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { + public RangeAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { this.dslContext = dslContext; } @Override - public RangeAggregationRangeStep field(String fieldPath, Class type, + public RangeAggregationRangeStep field(String fieldPath, Class type, ValueModel valueModel) { Contracts.assertNotNull( fieldPath, "fieldPath" ); Contracts.assertNotNull( type, "type" ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/RangeAggregationRangeStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/RangeAggregationRangeStepImpl.java index b24883857fd..454a6c00ac2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/RangeAggregationRangeStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/RangeAggregationRangeStepImpl.java @@ -19,27 +19,31 @@ import org.hibernate.search.util.common.data.Range; import org.hibernate.search.util.common.impl.Contracts; -class RangeAggregationRangeStepImpl - implements RangeAggregationRangeStep, PDF, F>, - RangeAggregationRangeMoreStep, RangeAggregationRangeStepImpl, PDF, F> { +class RangeAggregationRangeStepImpl, F> + implements RangeAggregationRangeStep, PDF, F>, + RangeAggregationRangeMoreStep, + RangeAggregationRangeStepImpl, + PDF, + F> { private final RangeAggregationBuilder builder; - private final SearchAggregationDslContext dslContext; + private final SearchAggregationDslContext dslContext; RangeAggregationRangeStepImpl(RangeAggregationBuilder builder, - SearchAggregationDslContext dslContext) { + SearchAggregationDslContext dslContext) { this.builder = builder; this.dslContext = dslContext; } @Override - public RangeAggregationRangeStepImpl range(Range range) { + public RangeAggregationRangeStepImpl range(Range range) { Contracts.assertNotNull( range, "range" ); builder.range( range ); return this; } @Override - public RangeAggregationRangeStepImpl ranges(Collection> ranges) { + public RangeAggregationRangeStepImpl ranges(Collection> ranges) { Contracts.assertNotNull( ranges, "ranges" ); for ( Range range : ranges ) { range( range ); @@ -48,7 +52,7 @@ public RangeAggregationRangeStepImpl ranges(Collection filter( + public RangeAggregationRangeStepImpl filter( Function clauseContributor) { SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); @@ -56,7 +60,7 @@ public RangeAggregationRangeStepImpl filter( } @Override - public RangeAggregationRangeStepImpl filter(SearchPredicate searchPredicate) { + public RangeAggregationRangeStepImpl filter(SearchPredicate searchPredicate) { builder.filter( searchPredicate ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/SumAggregationFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/SumAggregationFieldStepImpl.java index 9b6d1aa2de1..18aa188b708 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/SumAggregationFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/SumAggregationFieldStepImpl.java @@ -13,15 +13,16 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.util.common.impl.Contracts; -public class SumAggregationFieldStepImpl implements SumAggregationFieldStep { - private final SearchAggregationDslContext dslContext; +public class SumAggregationFieldStepImpl> + implements SumAggregationFieldStep { + private final SearchAggregationDslContext dslContext; - public SumAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { + public SumAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { this.dslContext = dslContext; } @Override - public SumAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel) { + public SumAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel) { Contracts.assertNotNull( fieldPath, "fieldPath" ); Contracts.assertNotNull( type, "type" ); FieldMetricAggregationBuilder builder = dslContext.scope() diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/SumAggregationOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/SumAggregationOptionsStepImpl.java index 5a660f5220d..7c3ef7bca3e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/SumAggregationOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/SumAggregationOptionsStepImpl.java @@ -14,19 +14,19 @@ import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -class SumAggregationOptionsStepImpl - implements SumAggregationOptionsStep, PDF, F> { +class SumAggregationOptionsStepImpl, F> + implements SumAggregationOptionsStep, PDF, F> { private final FieldMetricAggregationBuilder builder; - private final SearchAggregationDslContext dslContext; + private final SearchAggregationDslContext dslContext; SumAggregationOptionsStepImpl(FieldMetricAggregationBuilder builder, - SearchAggregationDslContext dslContext) { + SearchAggregationDslContext dslContext) { this.builder = builder; this.dslContext = dslContext; } @Override - public SumAggregationOptionsStepImpl filter( + public SumAggregationOptionsStepImpl filter( Function clauseContributor) { SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); @@ -34,7 +34,7 @@ public SumAggregationOptionsStepImpl filter( } @Override - public SumAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { + public SumAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { builder.filter( searchPredicate ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/TermsAggregationFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/TermsAggregationFieldStepImpl.java index 04457e78af5..a0d735b13fa 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/TermsAggregationFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/TermsAggregationFieldStepImpl.java @@ -15,15 +15,16 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.util.common.impl.Contracts; -public class TermsAggregationFieldStepImpl implements TermsAggregationFieldStep { - private final SearchAggregationDslContext dslContext; +public class TermsAggregationFieldStepImpl> + implements TermsAggregationFieldStep { + private final SearchAggregationDslContext dslContext; - public TermsAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { + public TermsAggregationFieldStepImpl(SearchAggregationDslContext dslContext) { this.dslContext = dslContext; } @Override - public TermsAggregationOptionsStep> field(String fieldPath, Class type, + public TermsAggregationOptionsStep> field(String fieldPath, Class type, ValueModel valueModel) { Contracts.assertNotNull( fieldPath, "fieldPath" ); Contracts.assertNotNull( type, "type" ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/TermsAggregationOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/TermsAggregationOptionsStepImpl.java index 6e17df085f0..e0ddea57e2f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/TermsAggregationOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/TermsAggregationOptionsStepImpl.java @@ -16,57 +16,57 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.util.common.impl.Contracts; -class TermsAggregationOptionsStepImpl - implements TermsAggregationOptionsStep, PDF, F, Map> { +class TermsAggregationOptionsStepImpl, F> + implements TermsAggregationOptionsStep, PDF, F, Map> { private final TermsAggregationBuilder builder; - private final SearchAggregationDslContext dslContext; + private final SearchAggregationDslContext dslContext; TermsAggregationOptionsStepImpl(TermsAggregationBuilder builder, - SearchAggregationDslContext dslContext) { + SearchAggregationDslContext dslContext) { this.builder = builder; this.dslContext = dslContext; } @Override - public TermsAggregationOptionsStepImpl orderByCountDescending() { + public TermsAggregationOptionsStepImpl orderByCountDescending() { builder.orderByCountDescending(); return this; } @Override - public TermsAggregationOptionsStepImpl orderByCountAscending() { + public TermsAggregationOptionsStepImpl orderByCountAscending() { builder.orderByCountAscending(); return this; } @Override - public TermsAggregationOptionsStepImpl orderByTermAscending() { + public TermsAggregationOptionsStepImpl orderByTermAscending() { builder.orderByTermAscending(); return this; } @Override - public TermsAggregationOptionsStepImpl orderByTermDescending() { + public TermsAggregationOptionsStepImpl orderByTermDescending() { builder.orderByTermDescending(); return this; } @Override - public TermsAggregationOptionsStepImpl minDocumentCount(int minDocumentCount) { + public TermsAggregationOptionsStepImpl minDocumentCount(int minDocumentCount) { Contracts.assertPositiveOrZero( minDocumentCount, "minDocumentCount" ); builder.minDocumentCount( minDocumentCount ); return this; } @Override - public TermsAggregationOptionsStepImpl maxTermCount(int maxTermCount) { + public TermsAggregationOptionsStepImpl maxTermCount(int maxTermCount) { Contracts.assertStrictlyPositive( maxTermCount, "maxTermCount" ); builder.maxTermCount( maxTermCount ); return this; } @Override - public TermsAggregationOptionsStepImpl filter( + public TermsAggregationOptionsStepImpl filter( Function clauseContributor) { SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); @@ -74,7 +74,7 @@ public TermsAggregationOptionsStepImpl filter( } @Override - public TermsAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { + public TermsAggregationOptionsStepImpl filter(SearchPredicate searchPredicate) { builder.filter( searchPredicate ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/WithParametersAggregationFinalStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/WithParametersAggregationFinalStep.java index 911cb41717a..c6f67dd7e70 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/WithParametersAggregationFinalStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/impl/WithParametersAggregationFinalStep.java @@ -17,7 +17,7 @@ public class WithParametersAggregationFinalStep implements AggregationFinalSt private final WithParametersAggregationBuilder builder; public WithParametersAggregationFinalStep( - SearchAggregationDslContext dslContext, + SearchAggregationDslContext dslContext, Function> aggregationCreator) { builder = dslContext.scope().aggregationBuilders().withParameters(); builder.creator( aggregationCreator ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/spi/AbstractSearchAggregationFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/spi/AbstractSearchAggregationFactory.java index 655225e993d..ad14244c2f6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/spi/AbstractSearchAggregationFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/spi/AbstractSearchAggregationFactory.java @@ -32,53 +32,54 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; public abstract class AbstractSearchAggregationFactory< - S extends ExtendedSearchAggregationFactory, + SR, + S extends ExtendedSearchAggregationFactory, SC extends SearchAggregationIndexScope, - PDF extends SearchPredicateFactory> - implements ExtendedSearchAggregationFactory { + PDF extends SearchPredicateFactory> + implements ExtendedSearchAggregationFactory { - protected final SearchAggregationDslContext dslContext; + protected final SearchAggregationDslContext dslContext; - public AbstractSearchAggregationFactory(SearchAggregationDslContext dslContext) { + public AbstractSearchAggregationFactory(SearchAggregationDslContext dslContext) { this.dslContext = dslContext; } @Override - public RangeAggregationFieldStep range() { + public RangeAggregationFieldStep range() { return new RangeAggregationFieldStepImpl<>( dslContext ); } @Override - public TermsAggregationFieldStep terms() { + public TermsAggregationFieldStep terms() { return new TermsAggregationFieldStepImpl<>( dslContext ); } @Override - public SumAggregationFieldStep sum() { + public SumAggregationFieldStep sum() { return new SumAggregationFieldStepImpl<>( dslContext ); } @Override - public MinAggregationFieldStep min() { + public MinAggregationFieldStep min() { return new MinAggregationFieldStepImpl<>( dslContext ); } @Override - public MaxAggregationFieldStep max() { + public MaxAggregationFieldStep max() { return new MaxAggregationFieldStepImpl<>( dslContext ); } @Override - public CountAggregationFieldStep count() { + public CountAggregationFieldStep count() { return new CountAggregationFieldStepImpl<>( dslContext ); } @Override - public CountDistinctAggregationFieldStep countDistinct() { + public CountDistinctAggregationFieldStep countDistinct() { return new CountDistinctAggregationFieldStepImpl<>( dslContext ); } - public AvgAggregationFieldStep avg() { + public AvgAggregationFieldStep avg() { return new AvgAggregationFieldStepImpl<>( dslContext ); } @@ -89,7 +90,7 @@ public AggregationFinalStep withParameters( } @Override - public T extension(SearchAggregationFactoryExtension extension) { + public T extension(SearchAggregationFactoryExtension extension) { return DslExtensionState.returnIfSupported( extension, extension.extendOptional( this ) ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/spi/SearchAggregationDslContext.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/spi/SearchAggregationDslContext.java index f8b5e2f0c34..aaff67aded2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/spi/SearchAggregationDslContext.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/spi/SearchAggregationDslContext.java @@ -14,13 +14,19 @@ * Represents the current context in the search DSL, * including in particular the search scope and the aggregation builder factory. * + * @param Scope root type. * * @param The type of the backend-specific search scope. * @param The type of factory used to create predicates in {@link FieldSortOptionsStep#filter(Function)}. */ -public class SearchAggregationDslContext, PDF extends SearchPredicateFactory> { +public class SearchAggregationDslContext< + SR, + SC extends SearchAggregationIndexScope, + PDF extends SearchPredicateFactory> { public static < + SR, SC extends SearchAggregationIndexScope, - PDF extends SearchPredicateFactory> SearchAggregationDslContext root(SC scope, PDF predicateFactory) { + PDF extends SearchPredicateFactory> SearchAggregationDslContext root(SC scope, + PDF predicateFactory) { return new SearchAggregationDslContext<>( scope, predicateFactory ); } @@ -44,7 +50,7 @@ public SC scope() { * @param newPredicateFactory The new predicate factory for the new DSL context. * @return A copy of this DSL context with its scope and predicate factory replaced with the given ones. */ - public SearchAggregationDslContext rescope(SC newScope, PDF newPredicateFactory) { + public SearchAggregationDslContext rescope(SC newScope, PDF newPredicateFactory) { return new SearchAggregationDslContext<>( newScope, newPredicateFactory ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/definition/PredicateDefinition.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/definition/PredicateDefinition.java index 6ee6cc84d17..421aee77969 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/definition/PredicateDefinition.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/definition/PredicateDefinition.java @@ -28,6 +28,6 @@ public interface PredicateDefinition { * @param context The context, exposing in particular a {@link SearchPredicateFactory}. * @return The created {@link SearchPredicate}. */ - SearchPredicate create(PredicateDefinitionContext context); + SearchPredicate create(PredicateDefinitionContext context); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/definition/PredicateDefinitionContext.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/definition/PredicateDefinitionContext.java index 302c26bbee5..2992f94043d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/definition/PredicateDefinitionContext.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/definition/PredicateDefinitionContext.java @@ -13,21 +13,22 @@ import org.hibernate.search.util.common.annotation.Incubating; /** - * The context passed to {@link PredicateDefinition#create(PredicateDefinitionContext)}. + * The context passed to {@link PredicateDefinition#create(PredicateDefinitionContext)}. + * @param Scope root type. * @see PredicateDefinition#create(PredicateDefinitionContext) */ @Incubating -public interface PredicateDefinitionContext { +public interface PredicateDefinitionContext { /** * @return A predicate factory. * If the named predicate was registered on an object field, * this factory expects field paths to be provided relative to that same object field. * This factory is only valid in the present context and must not be used after - * {@link PredicateDefinition#create(PredicateDefinitionContext)} returns. + * {@link PredicateDefinition#create(PredicateDefinitionContext)} returns. * @see SearchPredicateFactory */ - SearchPredicateFactory predicate(); + SearchPredicateFactory predicate(); /** * @param name The name of the parameter. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/BooleanPredicateClausesStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/BooleanPredicateClausesStep.java index 11d9a733a05..d02a0613a2c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/BooleanPredicateClausesStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/BooleanPredicateClausesStep.java @@ -9,9 +9,10 @@ *

* Different types of clauses have different effects, see {@link BooleanPredicateOptionsCollector}. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). */ -public interface BooleanPredicateClausesStep> - extends GenericBooleanPredicateClausesStep> { +public interface BooleanPredicateClausesStep> + extends GenericBooleanPredicateClausesStep> { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/BooleanPredicateOptionsCollector.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/BooleanPredicateOptionsCollector.java index 05e3376ec5b..1f2c3c00031 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/BooleanPredicateOptionsCollector.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/BooleanPredicateOptionsCollector.java @@ -60,7 +60,7 @@ * * @param The "self" type (the actual exposed type of this collector). */ -public interface BooleanPredicateOptionsCollector> +public interface BooleanPredicateOptionsCollector> extends CommonMinimumShouldMatchOptionsStep { /** @@ -167,7 +167,7 @@ default S filter(PredicateFinalStep dslFinalStep) { * Should generally be a lambda expression. * @return {@code this}, for method chaining. */ - S must(Function clauseContributor); + S must(Function, ? extends PredicateFinalStep> clauseContributor); /** * Add a "must not" clause to be defined by the given function. @@ -179,7 +179,7 @@ default S filter(PredicateFinalStep dslFinalStep) { * Should generally be a lambda expression. * @return {@code this}, for method chaining. */ - S mustNot(Function clauseContributor); + S mustNot(Function, ? extends PredicateFinalStep> clauseContributor); /** * Add a "should" clause to be defined by the given function. @@ -191,7 +191,7 @@ default S filter(PredicateFinalStep dslFinalStep) { * Should generally be a lambda expression. * @return {@code this}, for method chaining. */ - S should(Function clauseContributor); + S should(Function, ? extends PredicateFinalStep> clauseContributor); /** * Add a "filter" clause to be defined by the given function. @@ -203,7 +203,7 @@ default S filter(PredicateFinalStep dslFinalStep) { * Should generally be a lambda expression. * @return {@code this}, for method chaining. */ - S filter(Function clauseContributor); + S filter(Function, ? extends PredicateFinalStep> clauseContributor); /** * Checks if this predicate contains at least one clause. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExtendedSearchPredicateFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExtendedSearchPredicateFactory.java index 8025129a887..111ee223fc6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExtendedSearchPredicateFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExtendedSearchPredicateFactory.java @@ -11,10 +11,11 @@ * Warning: Generic parameters of this type are subject to change, * so this type should not be referenced directly in user code. * + * @param Scope root type. * @param The self type, i.e. the exposed type of this factory. */ -public interface ExtendedSearchPredicateFactory> - extends SearchPredicateFactory { +public interface ExtendedSearchPredicateFactory> + extends SearchPredicateFactory { @Override S withRoot(String objectFieldPath); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericBooleanPredicateClausesStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericBooleanPredicateClausesStep.java index 5009d2ef75a..e7f6a93e6ee 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericBooleanPredicateClausesStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericBooleanPredicateClausesStep.java @@ -16,13 +16,15 @@ * refer to {@link BooleanPredicateOptionsCollector}, {@link PredicateScoreStep} or {@link PredicateFinalStep} * for meaningful documentation. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this collector). * @param The "collector" type (the type of collector passed to the consumer in {@link #with(Consumer)}. */ public interface GenericBooleanPredicateClausesStep< + SR, S extends C, - C extends BooleanPredicateOptionsCollector> - extends BooleanPredicateOptionsCollector, PredicateScoreStep, PredicateFinalStep { + C extends BooleanPredicateOptionsCollector> + extends BooleanPredicateOptionsCollector, PredicateScoreStep, PredicateFinalStep { @Override S with(Consumer contributor); @@ -60,16 +62,16 @@ default S filter(PredicateFinalStep dslFinalStep) { } @Override - S must(Function clauseContributor); + S must(Function, ? extends PredicateFinalStep> clauseContributor); @Override - S mustNot(Function clauseContributor); + S mustNot(Function, ? extends PredicateFinalStep> clauseContributor); @Override - S should(Function clauseContributor); + S should(Function, ? extends PredicateFinalStep> clauseContributor); @Override - S filter(Function clauseContributor); + S filter(Function, ? extends PredicateFinalStep> clauseContributor); @Override default S minimumShouldMatchNumber(int matchingClausesNumber) { diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericSimpleBooleanPredicateClausesStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericSimpleBooleanPredicateClausesStep.java index 61b5b9fa521..4255dd5e7dc 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericSimpleBooleanPredicateClausesStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/GenericSimpleBooleanPredicateClausesStep.java @@ -15,13 +15,15 @@ *

* See also {@link PredicateScoreStep} or {@link PredicateFinalStep}. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this collector). * @param The "collector" type (the type of collector passed to the consumer in {@link #with(Consumer)}). */ public interface GenericSimpleBooleanPredicateClausesStep< + SR, S extends C, - C extends SimpleBooleanPredicateClausesCollector> - extends SimpleBooleanPredicateClausesCollector, PredicateFinalStep { + C extends SimpleBooleanPredicateClausesCollector> + extends SimpleBooleanPredicateClausesCollector, PredicateFinalStep { @Override default S add(PredicateFinalStep searchPredicate) { return add( searchPredicate.toPredicate() ); @@ -31,7 +33,7 @@ default S add(PredicateFinalStep searchPredicate) { S add(SearchPredicate searchPredicate); @Override - S add(Function clauseContributor); + S add(Function, ? extends PredicateFinalStep> clauseContributor); @Override S with(Consumer contributor); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java index f7cfa918df0..29fbdef261d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java @@ -6,8 +6,9 @@ /** * The initial step in a "knn" predicate definition, where the target field can be set. + * @param Scope root type. */ -public interface KnnPredicateFieldStep { +public interface KnnPredicateFieldStep { /** * Target the given field in the match predicate. @@ -15,5 +16,5 @@ public interface KnnPredicateFieldStep { * @param fieldPath The path to the index field to apply the predicate on. * @return The next step in the knn predicate DSL. */ - KnnPredicateVectorStep field(String fieldPath); + KnnPredicateVectorStep field(String fieldPath); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateOptionsStep.java index 4adeaf19f2a..549672973e0 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateOptionsStep.java @@ -12,23 +12,24 @@ /** * The final step in a "knn" predicate definition, where optional parameters can be set. */ -public interface KnnPredicateOptionsStep - extends PredicateScoreStep, PredicateFinalStep { +public interface KnnPredicateOptionsStep + extends PredicateScoreStep>, PredicateFinalStep { - KnnPredicateOptionsStep filter(SearchPredicate searchPredicate); + KnnPredicateOptionsStep filter(SearchPredicate searchPredicate); - default KnnPredicateOptionsStep filter(PredicateFinalStep searchPredicate) { + default KnnPredicateOptionsStep filter(PredicateFinalStep searchPredicate) { return filter( searchPredicate.toPredicate() ); } - KnnPredicateOptionsStep filter(Function clauseContributor); + KnnPredicateOptionsStep filter( + Function, ? extends PredicateFinalStep> clauseContributor); /** * @param similarity A similarity limit: documents with vectors distance to which, according to the configured similarity function, * is further than this limit will be filtered out from the results. * @return {@code this}, for method chaining. */ - KnnPredicateOptionsStep requiredMinimumSimilarity(float similarity); + KnnPredicateOptionsStep requiredMinimumSimilarity(float similarity); /** * @param score The minimum sore limit: documents with vectors for which the similarity score is lower than the limit @@ -39,6 +40,6 @@ default KnnPredicateOptionsStep filter(PredicateFinalStep searchPredicate) { * @return {@code this}, for method chaining. */ @Incubating - KnnPredicateOptionsStep requiredMinimumScore(float score); + KnnPredicateOptionsStep requiredMinimumScore(float score); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateVectorStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateVectorStep.java index 0143daae32e..17b07582989 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateVectorStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateVectorStep.java @@ -6,18 +6,19 @@ /** * The step in a "knn" predicate definition where the vector to match is defined. + * @param Scope root type. */ -public interface KnnPredicateVectorStep { +public interface KnnPredicateVectorStep { /** * @param vector The vector from which to compute the distance to vectors in the indexed field. * @return The next step in the knn predicate DSL. */ - KnnPredicateOptionsStep matching(byte... vector); + KnnPredicateOptionsStep matching(byte... vector); /** * @param vector The vector from which to compute the distance to vectors in the indexed field. * @return The next step in the knn predicate DSL. */ - KnnPredicateOptionsStep matching(float... vector); + KnnPredicateOptionsStep matching(float... vector); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchAllPredicateOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchAllPredicateOptionsStep.java index faec5e992eb..fa672272cf5 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchAllPredicateOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchAllPredicateOptionsStep.java @@ -13,7 +13,7 @@ * * @param The "self" type (the actual exposed type of this step). */ -public interface MatchAllPredicateOptionsStep> +public interface MatchAllPredicateOptionsStep> extends PredicateFinalStep, PredicateScoreStep { /** @@ -61,6 +61,6 @@ default S except(PredicateFinalStep dslFinalStep) { * Should generally be a lambda expression. * @return {@code this}, for method chaining. */ - S except(Function clauseContributor); + S except(Function, ? extends PredicateFinalStep> clauseContributor); } 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 index 837d019426b..03912dc4ec0 100644 --- 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 @@ -10,8 +10,10 @@ *

* The resulting nested predicate must match all inner clauses, * similarly to an {@link SearchPredicateFactory#and() "and" predicate}. + * + * @param Scope root type. */ -public interface NestedPredicateClausesCollector> - extends SimpleBooleanPredicateClausesCollector { +public interface NestedPredicateClausesCollector> + extends SimpleBooleanPredicateClausesCollector { } 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 355b620bd2c..af61eb2b7de 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 @@ -11,11 +11,12 @@ * The resulting nested predicate must match all inner clauses, * similarly to an {@link SearchPredicateFactory#and() "and" predicate}. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). */ -public interface NestedPredicateClausesStep> - extends GenericSimpleBooleanPredicateClausesStep>, - NestedPredicateClausesCollector> { +public interface NestedPredicateClausesStep> + extends GenericSimpleBooleanPredicateClausesStep>, + 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/NestedPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java index 1879f619afb..add5c97c5bd 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java @@ -9,11 +9,12 @@ /** * The initial step in a "nested" predicate definition, where the target field can be set. * + * @param Scope root type. * @param The type of the next step. * @deprecated Use {@link SearchPredicateFactory#nested(String)} instead. */ @Deprecated(since = "6.2") -public interface NestedPredicateFieldStep> { +public interface NestedPredicateFieldStep> { /** * Set the object field to "nest" on. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateNestStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateNestStep.java index c60d75e7781..42d5927f5e8 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateNestStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateNestStep.java @@ -15,7 +15,7 @@ * @deprecated Use {@link SearchPredicateFactory#nested(String)} instead. */ @Deprecated(since = "6.2") -public interface NestedPredicateNestStep> { +public interface NestedPredicateNestStep> { /** * Set the inner predicate to a previously-built {@link SearchPredicate}. @@ -65,6 +65,6 @@ default N nest(PredicateFinalStep dslFinalStep) { * Should generally be a lambda expression. * @return The next step. */ - N nest(Function predicateContributor); + N nest(Function, ? extends PredicateFinalStep> predicateContributor); } 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 a2ebe3ccfd2..737a501c1b1 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 @@ -32,8 +32,10 @@ *

* Such a factory can also transform relative paths into absolute paths using {@link #toAbsolutePath(String)}; * this can be useful for native predicates in particular. + * + * @param Scope root type. */ -public interface SearchPredicateFactory { +public interface SearchPredicateFactory { /** * Match all documents. @@ -41,7 +43,7 @@ public interface SearchPredicateFactory { * @return The initial step of a DSL where the "match all" predicate can be defined. * @see MatchAllPredicateOptionsStep */ - MatchAllPredicateOptionsStep matchAll(); + MatchAllPredicateOptionsStep matchAll(); /** * Match none of the documents. @@ -65,7 +67,7 @@ public interface SearchPredicateFactory { * @return The initial step of a DSL where the "boolean" predicate can be defined. * @see BooleanPredicateClausesStep */ - BooleanPredicateClausesStep bool(); + BooleanPredicateClausesStep bool(); /** * Match documents if they match a combination of boolean clauses, @@ -80,7 +82,7 @@ public interface SearchPredicateFactory { * @see BooleanPredicateClausesStep#with(Consumer) */ @Deprecated(since = "6.2") - PredicateFinalStep bool(Consumer> clauseContributor); + PredicateFinalStep bool(Consumer> clauseContributor); /** * Match documents if they match all inner clauses. @@ -88,7 +90,7 @@ public interface SearchPredicateFactory { * @return The initial step of a DSL where predicates that must match can be added and options can be set. * @see GenericSimpleBooleanPredicateClausesStep */ - SimpleBooleanPredicateClausesStep and(); + SimpleBooleanPredicateClausesStep and(); /** * Match documents if they match all previously-built {@link SearchPredicate}. @@ -113,7 +115,7 @@ SimpleBooleanPredicateOptionsStep and(PredicateFinalStep firstSearchPredicate * @return The initial step of a DSL where predicates that should match can be added and options can be set. * @see GenericSimpleBooleanPredicateClausesStep */ - SimpleBooleanPredicateClausesStep or(); + SimpleBooleanPredicateClausesStep or(); /** * Match documents if they match any previously-built {@link SearchPredicate}. @@ -224,7 +226,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @deprecated Use {@link #nested(String)} instead. */ @Deprecated(since = "6.2") - NestedPredicateFieldStep nested(); + NestedPredicateFieldStep nested(); /** * Match documents where a {@link ObjectStructure#NESTED nested object} matches inner predicates @@ -237,7 +239,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "nested" predicate can be defined. * @see NestedPredicateFieldStep */ - NestedPredicateClausesStep nested(String objectFieldPath); + NestedPredicateClausesStep nested(String objectFieldPath); /** * Match documents according to a given query string, @@ -307,7 +309,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @see KnnPredicateVectorStep * @see KnnPredicateOptionsStep */ - KnnPredicateFieldStep knn(int k); + KnnPredicateFieldStep knn(int k); /** * Delegating predicate that creates the actual predicate at query create time and provides access to query parameters. @@ -330,7 +332,7 @@ PredicateFinalStep withParameters( * @return The extended factory. * @throws SearchException If the extension cannot be applied (wrong underlying backend, ...). */ - T extension(SearchPredicateFactoryExtension extension); + T extension(SearchPredicateFactoryExtension extension); /** * Create a DSL step allowing multiple attempts to apply extensions one after the other, @@ -341,7 +343,7 @@ PredicateFinalStep withParameters( * * @return A DSL step. */ - SearchPredicateFactoryExtensionIfSupportedStep extension(); + SearchPredicateFactoryExtensionIfSupportedStep extension(); /** * Create a new predicate factory whose root for all paths passed to the DSL @@ -354,7 +356,7 @@ PredicateFinalStep withParameters( * @return A new predicate factory using the given object field as root. */ @Incubating - SearchPredicateFactory withRoot(String objectFieldPath); + SearchPredicateFactory withRoot(String objectFieldPath); /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtension.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtension.java index b5e89395dc5..77ee8c42cd6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtension.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtension.java @@ -20,7 +20,7 @@ * @see SearchPredicateFactory#extension(SearchPredicateFactoryExtension) * @see ExtendedSearchPredicateFactory */ -public interface SearchPredicateFactoryExtension { +public interface SearchPredicateFactoryExtension { /** * Attempt to extend a given factory, returning an empty {@link Optional} in case of failure. @@ -31,6 +31,6 @@ public interface SearchPredicateFactoryExtension { * @return An optional containing the extended search predicate factory ({@link T}) in case * of success, or an empty optional otherwise. */ - Optional extendOptional(SearchPredicateFactory original); + Optional extendOptional(SearchPredicateFactory original); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtensionIfSupportedMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtensionIfSupportedMoreStep.java index 8414a4d58cf..52a14e107b2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtensionIfSupportedMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtensionIfSupportedMoreStep.java @@ -14,8 +14,8 @@ * * @see SearchPredicateFactory#extension() */ -public interface SearchPredicateFactoryExtensionIfSupportedMoreStep - extends SearchPredicateFactoryExtensionIfSupportedStep { +public interface SearchPredicateFactoryExtensionIfSupportedMoreStep + extends SearchPredicateFactoryExtensionIfSupportedStep { /** * If no extension passed to {@link #ifSupported(SearchPredicateFactoryExtension, Function)} @@ -29,7 +29,7 @@ public interface SearchPredicateFactoryExtensionIfSupportedMoreStep * @return The final step in the DSL of the resulting predicate. */ PredicateFinalStep orElse( - Function predicateContributor); + Function, ? extends PredicateFinalStep> predicateContributor); /** * If no extension passed to {@link #ifSupported(SearchPredicateFactoryExtension, Function)} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtensionIfSupportedStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtensionIfSupportedStep.java index 25829b3b36b..ecbc144c4ee 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtensionIfSupportedStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactoryExtensionIfSupportedStep.java @@ -12,7 +12,7 @@ * * @see SearchPredicateFactory#extension() */ -public interface SearchPredicateFactoryExtensionIfSupportedStep { +public interface SearchPredicateFactoryExtensionIfSupportedStep { /** * If the given extension is supported, and none of the previous extensions passed to @@ -31,8 +31,8 @@ public interface SearchPredicateFactoryExtensionIfSupportedStep { * @param The type of the extended factory. * @return The next step. */ - SearchPredicateFactoryExtensionIfSupportedMoreStep ifSupported( - SearchPredicateFactoryExtension extension, + SearchPredicateFactoryExtensionIfSupportedMoreStep ifSupported( + SearchPredicateFactoryExtension extension, Function predicateContributor ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanPredicateClausesCollector.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanPredicateClausesCollector.java index 76c3278cd2e..ff1ffd83bc0 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanPredicateClausesCollector.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanPredicateClausesCollector.java @@ -40,9 +40,10 @@ * * * + * @param Scope root type. * @param The "self" type (the actual exposed type of this collector). */ -public interface SimpleBooleanPredicateClausesCollector> { +public interface SimpleBooleanPredicateClausesCollector> { /** * Adds the specified predicate to the list of clauses. * @@ -68,7 +69,7 @@ public interface SimpleBooleanPredicateClausesCollector clauseContributor); + S add(Function, ? extends PredicateFinalStep> clauseContributor); /** * Delegates setting clauses and options to a given consumer. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanPredicateClausesStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanPredicateClausesStep.java index 7679388f02b..851c06fa514 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanPredicateClausesStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleBooleanPredicateClausesStep.java @@ -9,10 +9,11 @@ * where clauses * can be added and options can be set. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). */ -public interface SimpleBooleanPredicateClausesStep> - extends GenericSimpleBooleanPredicateClausesStep>, +public interface SimpleBooleanPredicateClausesStep> + extends GenericSimpleBooleanPredicateClausesStep>, SimpleBooleanPredicateOptionsStep { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractBooleanPredicateClausesStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractBooleanPredicateClausesStep.java index 27b16ea922e..4f32d54851c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractBooleanPredicateClausesStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractBooleanPredicateClausesStep.java @@ -17,18 +17,18 @@ import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; import org.hibernate.search.engine.search.predicate.spi.BooleanPredicateBuilder; -abstract class AbstractBooleanPredicateClausesStep> +abstract class AbstractBooleanPredicateClausesStep> extends AbstractPredicateFinalStep - implements GenericBooleanPredicateClausesStep { + implements GenericBooleanPredicateClausesStep { - private final SearchPredicateFactory factory; + private final SearchPredicateFactory factory; private final BooleanPredicateBuilder builder; private final MinimumShouldMatchConditionStepImpl minimumShouldMatchStep; public AbstractBooleanPredicateClausesStep(SearchPredicateDslContext dslContext, - SearchPredicateFactory factory) { + SearchPredicateFactory factory) { super( dslContext ); this.factory = factory; this.builder = dslContext.scope().predicateBuilders().bool(); @@ -81,28 +81,28 @@ public S filter(SearchPredicate searchPredicate) { @Override public S must( - Function clauseContributor) { + Function, ? extends PredicateFinalStep> clauseContributor) { must( clauseContributor.apply( factory ) ); return self(); } @Override public S mustNot( - Function clauseContributor) { + Function, ? extends PredicateFinalStep> clauseContributor) { mustNot( clauseContributor.apply( factory ) ); return self(); } @Override public S should( - Function clauseContributor) { + Function, ? extends PredicateFinalStep> clauseContributor) { should( clauseContributor.apply( factory ) ); return self(); } @Override public S filter( - Function clauseContributor) { + Function, ? extends PredicateFinalStep> clauseContributor) { filter( clauseContributor.apply( factory ) ); return self(); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractSimpleBooleanPredicateClausesStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractSimpleBooleanPredicateClausesStep.java index cb39dc012fe..221bb4cb890 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractSimpleBooleanPredicateClausesStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractSimpleBooleanPredicateClausesStep.java @@ -18,10 +18,11 @@ import org.hibernate.search.engine.search.predicate.spi.BooleanPredicateBuilder; public abstract class AbstractSimpleBooleanPredicateClausesStep< + SR, S extends C, - C extends SimpleBooleanPredicateClausesCollector> + C extends SimpleBooleanPredicateClausesCollector> extends AbstractPredicateFinalStep - implements GenericSimpleBooleanPredicateClausesStep { + implements GenericSimpleBooleanPredicateClausesStep { public enum SimpleBooleanPredicateOperator implements BiConsumer { @@ -45,11 +46,11 @@ public void accept(BooleanPredicateBuilder builder, private final BooleanPredicateBuilder builder; - private final SearchPredicateFactory factory; + private final SearchPredicateFactory factory; AbstractSimpleBooleanPredicateClausesStep(SimpleBooleanPredicateOperator operator, SearchPredicateDslContext dslContext, - SearchPredicateFactory factory) { + SearchPredicateFactory factory) { super( dslContext ); this.operator = operator; this.builder = dslContext.scope().predicateBuilders().bool(); @@ -65,7 +66,7 @@ public S add(SearchPredicate searchPredicate) { } @Override - public S add(Function clauseContributor) { + public S add(Function, ? extends PredicateFinalStep> clauseContributor) { return add( clauseContributor.apply( factory ) ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/BooleanPredicateClausesStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/BooleanPredicateClausesStepImpl.java index a7d24c18b90..6dff18442b7 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/BooleanPredicateClausesStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/BooleanPredicateClausesStepImpl.java @@ -9,17 +9,18 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -public final class BooleanPredicateClausesStepImpl - extends AbstractBooleanPredicateClausesStep> - implements BooleanPredicateClausesStep { +public final class BooleanPredicateClausesStepImpl + extends + AbstractBooleanPredicateClausesStep, BooleanPredicateOptionsCollector> + implements BooleanPredicateClausesStep> { public BooleanPredicateClausesStepImpl(SearchPredicateDslContext dslContext, - SearchPredicateFactory factory) { + SearchPredicateFactory factory) { super( dslContext, factory ); } @Override - protected BooleanPredicateClausesStepImpl self() { + protected BooleanPredicateClausesStepImpl self() { return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java index 87e69fa3376..c2f8f1382b5 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java @@ -18,23 +18,23 @@ import org.hibernate.search.engine.search.predicate.spi.KnnPredicateBuilder; import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys; -public class KnnPredicateFieldStepImpl +public class KnnPredicateFieldStepImpl extends AbstractPredicateFinalStep - implements KnnPredicateFieldStep, KnnPredicateVectorStep, KnnPredicateOptionsStep { + implements KnnPredicateFieldStep, KnnPredicateVectorStep, KnnPredicateOptionsStep { - private final SearchPredicateFactory factory; + private final SearchPredicateFactory factory; private final int k; private BooleanPredicateBuilder booleanBuilder; protected KnnPredicateBuilder builder; - public KnnPredicateFieldStepImpl(SearchPredicateFactory factory, SearchPredicateDslContext dslContext, int k) { + public KnnPredicateFieldStepImpl(SearchPredicateFactory factory, SearchPredicateDslContext dslContext, int k) { super( dslContext ); this.factory = factory; this.k = k; } @Override - public KnnPredicateVectorStep field(String fieldPath) { + public KnnPredicateVectorStep field(String fieldPath) { this.builder = dslContext.scope().fieldQueryElement( fieldPath, PredicateTypeKeys.KNN ); this.builder.k( k ); return this; @@ -49,50 +49,50 @@ protected SearchPredicate build() { } @Override - public KnnPredicateOptionsStep filter(SearchPredicate searchPredicate) { + public KnnPredicateOptionsStep filter(SearchPredicate searchPredicate) { this.booleanPredicateBuilder().must( searchPredicate ); return this; } @Override - public KnnPredicateOptionsStep filter( - Function clauseContributor) { + public KnnPredicateOptionsStep filter( + Function, ? extends PredicateFinalStep> clauseContributor) { this.booleanPredicateBuilder().must( clauseContributor.apply( factory ).toPredicate() ); return this; } @Override - public KnnPredicateOptionsStep matching(byte... vector) { + public KnnPredicateOptionsStep matching(byte... vector) { this.builder.vector( vector ); return this; } @Override - public KnnPredicateOptionsStep matching(float... vector) { + public KnnPredicateOptionsStep matching(float... vector) { this.builder.vector( vector ); return this; } @Override - public KnnPredicateOptionsStep requiredMinimumSimilarity(float similarity) { + public KnnPredicateOptionsStep requiredMinimumSimilarity(float similarity) { this.builder.requiredMinimumSimilarity( similarity ); return this; } @Override - public KnnPredicateOptionsStep requiredMinimumScore(float score) { + public KnnPredicateOptionsStep requiredMinimumScore(float score) { this.builder.requiredMinimumScore( score ); return this; } @Override - public KnnPredicateOptionsStep boost(float boost) { + public KnnPredicateOptionsStep boost(float boost) { this.builder.boost( boost ); return this; } @Override - public KnnPredicateOptionsStep constantScore() { + public KnnPredicateOptionsStep constantScore() { this.builder.constantScore(); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchAllPredicateOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchAllPredicateOptionsStepImpl.java index 2adc99a3e4a..8d197471945 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchAllPredicateOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchAllPredicateOptionsStepImpl.java @@ -16,11 +16,11 @@ import org.hibernate.search.engine.search.predicate.spi.MatchAllPredicateBuilder; import org.hibernate.search.engine.search.predicate.spi.SearchPredicateBuilder; -public final class MatchAllPredicateOptionsStepImpl +public final class MatchAllPredicateOptionsStepImpl extends AbstractPredicateFinalStep - implements MatchAllPredicateOptionsStep> { + implements MatchAllPredicateOptionsStep> { - private final SearchPredicateFactory factory; + private final SearchPredicateFactory factory; private final MatchAllPredicateBuilder matchAllBuilder; private MatchAllExceptState exceptState; @@ -28,33 +28,33 @@ public final class MatchAllPredicateOptionsStepImpl private boolean constantScore = false; public MatchAllPredicateOptionsStepImpl(SearchPredicateDslContext dslContext, - SearchPredicateFactory factory) { + SearchPredicateFactory factory) { super( dslContext ); this.factory = factory; this.matchAllBuilder = dslContext.scope().predicateBuilders().matchAll(); } @Override - public MatchAllPredicateOptionsStep boost(float boost) { + public MatchAllPredicateOptionsStep boost(float boost) { this.boost = boost; return this; } @Override - public MatchAllPredicateOptionsStep constantScore() { + public MatchAllPredicateOptionsStep constantScore() { this.constantScore = true; return this; } @Override - public MatchAllPredicateOptionsStep except(SearchPredicate searchPredicate) { + public MatchAllPredicateOptionsStep except(SearchPredicate searchPredicate) { getExceptState().addClause( searchPredicate ); return this; } @Override - public MatchAllPredicateOptionsStep except( - Function clauseContributor) { + public MatchAllPredicateOptionsStep except( + Function, ? extends PredicateFinalStep> clauseContributor) { getExceptState().addClause( clauseContributor ); return this; } @@ -92,7 +92,7 @@ private class MatchAllExceptState { this.booleanBuilder = dslContext.scope().predicateBuilders().bool(); } - void addClause(Function clauseContributor) { + void addClause(Function, ? extends PredicateFinalStep> clauseContributor) { addClause( clauseContributor.apply( factory ).toPredicate() ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NamedPredicateOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NamedPredicateOptionsStepImpl.java index bebc590bb75..5f1737ae9a8 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NamedPredicateOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NamedPredicateOptionsStepImpl.java @@ -20,7 +20,7 @@ public class NamedPredicateOptionsStepImpl private final NamedPredicateBuilder builder; - public NamedPredicateOptionsStepImpl(SearchPredicateFactory predicateFactory, + public NamedPredicateOptionsStepImpl(SearchPredicateFactory predicateFactory, SearchPredicateDslContext dslContext, String fieldPath, String predicateName) { super( dslContext ); SearchIndexScope scope = dslContext.scope(); 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 8e46457a7bb..d0b5b21a019 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 @@ -12,20 +12,23 @@ import org.hibernate.search.engine.search.predicate.spi.NestedPredicateBuilder; import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys; -public final class NestedPredicateClausesStepImpl - extends AbstractSimpleBooleanPredicateClausesStep> - implements NestedPredicateClausesStep { +public final class NestedPredicateClausesStepImpl + extends + AbstractSimpleBooleanPredicateClausesStep, + NestedPredicateClausesCollector> + implements NestedPredicateClausesStep> { private final NestedPredicateBuilder builder; public NestedPredicateClausesStepImpl(SearchPredicateDslContext dslContext, String objectFieldPath, - SearchPredicateFactory factory) { + SearchPredicateFactory factory) { super( SimpleBooleanPredicateOperator.AND, dslContext, factory ); this.builder = dslContext.scope().fieldQueryElement( objectFieldPath, PredicateTypeKeys.NESTED ); } @Override - protected NestedPredicateClausesStepImpl self() { + protected NestedPredicateClausesStepImpl self() { return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NestedPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NestedPredicateFieldStepImpl.java index ff87f7d25c1..5dd3400955d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NestedPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/NestedPredicateFieldStepImpl.java @@ -7,6 +7,8 @@ import java.util.function.Function; import org.hibernate.search.engine.search.predicate.SearchPredicate; +import org.hibernate.search.engine.search.predicate.dsl.NestedPredicateNestStep; +import org.hibernate.search.engine.search.predicate.dsl.NestedPredicateOptionsStep; 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.spi.AbstractPredicateFinalStep; @@ -15,25 +17,27 @@ import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys; @Deprecated(since = "6.2") -public final class NestedPredicateFieldStepImpl +public final class NestedPredicateFieldStepImpl extends AbstractPredicateFinalStep implements org.hibernate.search.engine.search.predicate.dsl.NestedPredicateFieldStep< - org.hibernate.search.engine.search.predicate.dsl.NestedPredicateNestStep>, + SR, + NestedPredicateNestStep>, org.hibernate.search.engine.search.predicate.dsl.NestedPredicateNestStep< - org.hibernate.search.engine.search.predicate.dsl.NestedPredicateOptionsStep>, + SR, + NestedPredicateOptionsStep>, org.hibernate.search.engine.search.predicate.dsl.NestedPredicateOptionsStep< org.hibernate.search.engine.search.predicate.dsl.NestedPredicateOptionsStep> { - private final SearchPredicateFactory factory; + private final SearchPredicateFactory factory; private NestedPredicateBuilder builder; - public NestedPredicateFieldStepImpl(SearchPredicateDslContext dslContext, SearchPredicateFactory factory) { + public NestedPredicateFieldStepImpl(SearchPredicateDslContext dslContext, SearchPredicateFactory factory) { super( dslContext ); this.factory = factory; } @Override - public org.hibernate.search.engine.search.predicate.dsl.NestedPredicateNestStep objectField(String fieldPath) { + public org.hibernate.search.engine.search.predicate.dsl.NestedPredicateNestStep objectField(String fieldPath) { this.builder = dslContext.scope().fieldQueryElement( fieldPath, PredicateTypeKeys.NESTED ); return this; } @@ -47,7 +51,7 @@ public org.hibernate.search.engine.search.predicate.dsl.NestedPredicateOptionsSt @Override public org.hibernate.search.engine.search.predicate.dsl.NestedPredicateOptionsStep nest( - Function predicateContributor) { + Function, ? extends PredicateFinalStep> predicateContributor) { return nest( predicateContributor.apply( factory ) ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SearchPredicateFactoryExtensionStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SearchPredicateFactoryExtensionStep.java index e623cbbe9f2..fcf873285a8 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SearchPredicateFactoryExtensionStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SearchPredicateFactoryExtensionStep.java @@ -13,21 +13,21 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactoryExtensionIfSupportedMoreStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactoryExtensionIfSupportedStep; -public final class SearchPredicateFactoryExtensionStep - implements SearchPredicateFactoryExtensionIfSupportedStep, - SearchPredicateFactoryExtensionIfSupportedMoreStep { +public final class SearchPredicateFactoryExtensionStep + implements SearchPredicateFactoryExtensionIfSupportedStep, + SearchPredicateFactoryExtensionIfSupportedMoreStep { - private final SearchPredicateFactory parent; + private final SearchPredicateFactory parent; private final DslExtensionState state = new DslExtensionState<>(); - public SearchPredicateFactoryExtensionStep(SearchPredicateFactory parent) { + public SearchPredicateFactoryExtensionStep(SearchPredicateFactory parent) { this.parent = parent; } @Override - public SearchPredicateFactoryExtensionIfSupportedMoreStep ifSupported( - SearchPredicateFactoryExtension extension, + public SearchPredicateFactoryExtensionIfSupportedMoreStep ifSupported( + SearchPredicateFactoryExtension extension, Function predicateContributor) { state.ifSupported( extension, extension.extendOptional( parent ), predicateContributor ); return this; @@ -35,7 +35,7 @@ public SearchPredicateFactoryExtensionIfSupportedMoreStep ifSupported( @Override public PredicateFinalStep orElse( - Function predicateContributor) { + Function, ? extends PredicateFinalStep> predicateContributor) { return state.orElse( parent, predicateContributor ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleBooleanPredicateClausesStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleBooleanPredicateClausesStepImpl.java index a10ba13c478..b76482569be 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleBooleanPredicateClausesStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleBooleanPredicateClausesStepImpl.java @@ -11,21 +11,22 @@ import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanPredicateClausesStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -public final class SimpleBooleanPredicateClausesStepImpl +public final class SimpleBooleanPredicateClausesStepImpl extends - AbstractSimpleBooleanPredicateClausesStep> - implements SimpleBooleanPredicateClausesStep { + AbstractSimpleBooleanPredicateClausesStep, + SimpleBooleanPredicateClausesCollector> + implements SimpleBooleanPredicateClausesStep> { public SimpleBooleanPredicateClausesStepImpl(SimpleBooleanPredicateOperator operator, SearchPredicateDslContext dslContext, - SearchPredicateFactory factory) { + SearchPredicateFactory factory) { super( operator, dslContext, factory ); } public SimpleBooleanPredicateClausesStepImpl(SimpleBooleanPredicateOperator operator, SearchPredicateDslContext dslContext, - SearchPredicateFactory factory, + SearchPredicateFactory factory, SearchPredicate firstSearchPredicate, SearchPredicate... otherSearchPredicates) { this( operator, dslContext, factory ); @@ -37,7 +38,7 @@ public SimpleBooleanPredicateClausesStepImpl(SimpleBooleanPredicateOperator oper public SimpleBooleanPredicateClausesStepImpl(SimpleBooleanPredicateOperator operator, SearchPredicateDslContext dslContext, - SearchPredicateFactory factory, + SearchPredicateFactory factory, PredicateFinalStep firstSearchPredicate, PredicateFinalStep... otherSearchPredicates) { this( operator, dslContext, factory ); @@ -48,7 +49,7 @@ public SimpleBooleanPredicateClausesStepImpl(SimpleBooleanPredicateOperator oper } @Override - protected SimpleBooleanPredicateClausesStepImpl self() { + protected SimpleBooleanPredicateClausesStepImpl self() { return this; } } 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 e4794fb1606..32918df6d32 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 @@ -65,9 +65,10 @@ import org.hibernate.search.util.common.impl.Contracts; public abstract class AbstractSearchPredicateFactory< - S extends ExtendedSearchPredicateFactory, + SR, + S extends ExtendedSearchPredicateFactory, SC extends SearchPredicateIndexScope> - implements ExtendedSearchPredicateFactory { + implements ExtendedSearchPredicateFactory { protected final SearchPredicateDslContext dslContext; @@ -76,8 +77,8 @@ public AbstractSearchPredicateFactory(SearchPredicateDslContext dslContext) } @Override - public MatchAllPredicateOptionsStep matchAll() { - return new MatchAllPredicateOptionsStepImpl( dslContext, this ); + public MatchAllPredicateOptionsStep matchAll() { + return new MatchAllPredicateOptionsStepImpl( dslContext, this ); } @Override @@ -91,43 +92,47 @@ public MatchIdPredicateMatchingStep id() { } @Override - public BooleanPredicateClausesStep bool() { - return new BooleanPredicateClausesStepImpl( dslContext, this ); + public BooleanPredicateClausesStep bool() { + return new BooleanPredicateClausesStepImpl( dslContext, this ); } @Override - public SimpleBooleanPredicateClausesStep and() { - return new SimpleBooleanPredicateClausesStepImpl( AND, dslContext, this ); + public SimpleBooleanPredicateClausesStep and() { + return new SimpleBooleanPredicateClausesStepImpl( AND, dslContext, this ); } @Override public SimpleBooleanPredicateOptionsStep and( SearchPredicate firstSearchPredicate, SearchPredicate... otherSearchPredicates) { - return new SimpleBooleanPredicateClausesStepImpl( AND, dslContext, this, firstSearchPredicate, otherSearchPredicates ); + return new SimpleBooleanPredicateClausesStepImpl( AND, dslContext, this, firstSearchPredicate, + otherSearchPredicates ); } @Override public SimpleBooleanPredicateOptionsStep and(PredicateFinalStep firstSearchPredicate, PredicateFinalStep... otherSearchPredicate) { - return new SimpleBooleanPredicateClausesStepImpl( AND, dslContext, this, firstSearchPredicate, otherSearchPredicate ); + return new SimpleBooleanPredicateClausesStepImpl( AND, dslContext, this, firstSearchPredicate, + otherSearchPredicate ); } @Override - public SimpleBooleanPredicateClausesStep or() { - return new SimpleBooleanPredicateClausesStepImpl( OR, dslContext, this ); + public SimpleBooleanPredicateClausesStep or() { + return new SimpleBooleanPredicateClausesStepImpl( OR, dslContext, this ); } @Override public SimpleBooleanPredicateOptionsStep or(SearchPredicate firstSearchPredicate, SearchPredicate... otherSearchPredicate) { - return new SimpleBooleanPredicateClausesStepImpl( OR, dslContext, this, firstSearchPredicate, otherSearchPredicate ); + return new SimpleBooleanPredicateClausesStepImpl( OR, dslContext, this, firstSearchPredicate, + otherSearchPredicate ); } @Override public SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, PredicateFinalStep... otherSearchPredicate) { - return new SimpleBooleanPredicateClausesStepImpl( OR, dslContext, this, firstSearchPredicate, otherSearchPredicate ); + return new SimpleBooleanPredicateClausesStepImpl( OR, dslContext, this, firstSearchPredicate, + otherSearchPredicate ); } @Override @@ -142,8 +147,8 @@ public NotPredicateFinalStep not(PredicateFinalStep searchPredicate) { @Override @SuppressWarnings("deprecation") // javac warns about this method being deprecated, but we have to implement it - public PredicateFinalStep bool(Consumer> clauseContributor) { - BooleanPredicateClausesStep next = bool(); + public PredicateFinalStep bool(Consumer> clauseContributor) { + BooleanPredicateClausesStep next = bool(); clauseContributor.accept( next ); return next; } @@ -185,13 +190,13 @@ public TermsPredicateFieldStep terms() { @Override @Deprecated(since = "6.2") - public org.hibernate.search.engine.search.predicate.dsl.NestedPredicateFieldStep nested() { - return new org.hibernate.search.engine.search.predicate.dsl.impl.NestedPredicateFieldStepImpl( dslContext, this ); + public org.hibernate.search.engine.search.predicate.dsl.NestedPredicateFieldStep nested() { + return new org.hibernate.search.engine.search.predicate.dsl.impl.NestedPredicateFieldStepImpl( dslContext, this ); } @Override - public NestedPredicateClausesStep nested(String objectFieldPath) { - return new NestedPredicateClausesStepImpl( dslContext, objectFieldPath, this ); + public NestedPredicateClausesStep nested(String objectFieldPath) { + return new NestedPredicateClausesStepImpl( dslContext, objectFieldPath, this ); } @Override @@ -232,9 +237,9 @@ public NamedPredicateOptionsStep named(String path) { } @Override - public KnnPredicateFieldStep knn(int k) { + public KnnPredicateFieldStep knn(int k) { Contracts.assertStrictlyPositive( k, "k" ); - return new KnnPredicateFieldStepImpl( this, dslContext, k ); + return new KnnPredicateFieldStepImpl( this, dslContext, k ); } @Override @@ -243,13 +248,13 @@ public PredicateFinalStep withParameters(Function T extension(SearchPredicateFactoryExtension extension) { + public T extension(SearchPredicateFactoryExtension extension) { return DslExtensionState.returnIfSupported( extension, extension.extendOptional( this ) ); } @Override - public SearchPredicateFactoryExtensionIfSupportedStep extension() { - return new SearchPredicateFactoryExtensionStep( this ); + public SearchPredicateFactoryExtensionIfSupportedStep extension() { + return new SearchPredicateFactoryExtensionStep( this ); } @Override diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/spi/NamedPredicateBuilder.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/spi/NamedPredicateBuilder.java index 7a2fcc471be..9fc2c027e3d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/spi/NamedPredicateBuilder.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/spi/NamedPredicateBuilder.java @@ -8,7 +8,7 @@ public interface NamedPredicateBuilder extends SearchPredicateBuilder { - void factory(SearchPredicateFactory factory); + void factory(SearchPredicateFactory factory); void param(String name, Object value); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/spi/NamedValuesBasedPredicateDefinitionContext.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/spi/NamedValuesBasedPredicateDefinitionContext.java index 6e21971f7cf..bf3fd7d8a54 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/spi/NamedValuesBasedPredicateDefinitionContext.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/spi/NamedValuesBasedPredicateDefinitionContext.java @@ -15,19 +15,19 @@ import org.hibernate.search.util.common.annotation.Incubating; @Incubating -public final class NamedValuesBasedPredicateDefinitionContext implements PredicateDefinitionContext { +public final class NamedValuesBasedPredicateDefinitionContext implements PredicateDefinitionContext { - private final SearchPredicateFactory factory; + private final SearchPredicateFactory factory; private final NamedValues parameters; - public NamedValuesBasedPredicateDefinitionContext(SearchPredicateFactory factory, Map params, + public NamedValuesBasedPredicateDefinitionContext(SearchPredicateFactory factory, Map params, Function namedValueMissing) { this.factory = factory; this.parameters = MapNamedValues.fromMap( params, namedValueMissing ); } @Override - public SearchPredicateFactory predicate() { + public SearchPredicateFactory predicate() { return factory; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/ProjectionDefinition.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/ProjectionDefinition.java index d28313c4db7..71f92adedc6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/ProjectionDefinition.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/ProjectionDefinition.java @@ -38,6 +38,6 @@ public interface ProjectionDefinition

{ * @see SearchPredicateFactory * @see ProjectionDefinitionContext */ - SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context); + SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/CompositeProjectionDefinition.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/CompositeProjectionDefinition.java index 5c68f1ec77c..9596b6ed6c5 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/CompositeProjectionDefinition.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/CompositeProjectionDefinition.java @@ -14,12 +14,12 @@ public interface CompositeProjectionDefinition extends ProjectionDefinition, AutoCloseable { @Override - default SearchProjection create(SearchProjectionFactory factory, + default SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return apply( factory, factory.composite(), context ).toProjection(); } - CompositeProjectionValueStep apply(SearchProjectionFactory projectionFactory, + CompositeProjectionValueStep apply(SearchProjectionFactory projectionFactory, CompositeProjectionInnerStep initialStep, ProjectionDefinitionContext context); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/ConstantProjectionDefinition.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/ConstantProjectionDefinition.java index a931329c1a4..a4dc2f194f9 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/ConstantProjectionDefinition.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/ConstantProjectionDefinition.java @@ -91,7 +91,7 @@ public void appendTo(ToStringTreeAppender appender) { } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.constant( value ).toProjection(); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/DistanceProjectionDefinition.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/DistanceProjectionDefinition.java index e1d2b39442b..55a375c104a 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/DistanceProjectionDefinition.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/DistanceProjectionDefinition.java @@ -56,7 +56,7 @@ protected boolean multi() { } @Override - public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.withParameters( params -> factory .distance( fieldPath, params.get( parameterName, GeoPoint.class ) ) .unit( unit ) @@ -78,7 +78,7 @@ protected boolean multi() { } @Override - public SearchProjection> create(SearchProjectionFactory factory, + public SearchProjection> create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.withParameters( params -> factory .distance( fieldPath, params.get( parameterName, GeoPoint.class ) ) @@ -104,7 +104,7 @@ protected boolean multi() { } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.withParameters( params -> factory .distance( fieldPath, params.get( parameterName, GeoPoint.class ) ) diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/FieldProjectionDefinition.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/FieldProjectionDefinition.java index b19befe9fc6..b4279b8b44b 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/FieldProjectionDefinition.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/FieldProjectionDefinition.java @@ -56,7 +56,7 @@ protected boolean multi() { } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.field( fieldPath, fieldType, valueModel ).toProjection(); } @@ -76,7 +76,7 @@ protected boolean multi() { } @Override - public SearchProjection> create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { + public SearchProjection> create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.field( fieldPath, fieldType, valueModel ) .collector( ProjectionCollector.list() ).toProjection(); } @@ -98,7 +98,7 @@ protected boolean multi() { } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.field( fieldPath, fieldType, valueModel ) .collector( collector ).toProjection(); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/ObjectProjectionDefinition.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/ObjectProjectionDefinition.java index 05c57bf3de4..9f462b9053d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/ObjectProjectionDefinition.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/ObjectProjectionDefinition.java @@ -59,7 +59,7 @@ protected boolean multi() { } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return delegate.apply( factory.withRoot( fieldPath ), factory.object( fieldPath ), context ) .toProjection(); @@ -80,7 +80,7 @@ protected boolean multi() { } @Override - public SearchProjection> create(SearchProjectionFactory factory, + public SearchProjection> create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return delegate.apply( factory.withRoot( fieldPath ), factory.object( fieldPath ), context ) .collector( ProjectionCollector.list() ).toProjection(); @@ -103,7 +103,7 @@ protected boolean multi() { } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return delegate.apply( factory.withRoot( fieldPath ), factory.object( fieldPath ), context ) .collector( collector ).toProjection(); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java index 5a8d1d0fceb..77cb53fa767 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java @@ -11,10 +11,11 @@ * Warning: Generic parameters of this type are subject to change, * so this type should not be referenced directly in user code. * + * @param Scope root type. * @param The self type, i.e. the exposed type of this factory. */ -public interface ExtendedSearchProjectionFactory, R, E> - extends SearchProjectionFactory { +public interface ExtendedSearchProjectionFactory, R, E> + extends SearchProjectionFactory { @Override S withRoot(String objectFieldPath); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java index e360e6b6e84..c64952c750c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java @@ -36,12 +36,13 @@ * Such a factory can also transform relative paths into absolute paths using {@link #toAbsolutePath(String)}; * this can be useful for native projections in particular. * + * @param Scope root type. * @param The type of entity references, i.e. the type of objects returned for * {@link #entityReference() entity reference projections}. * @param The type of entities, i.e. the type of objects returned for * {@link #entity() entity projections}. */ -public interface SearchProjectionFactory { +public interface SearchProjectionFactory { /** * Project the match to a {@link DocumentReference}. @@ -440,7 +441,7 @@ ProjectionFinalStep withParameters( * @return The extended factory. * @throws SearchException If the extension cannot be applied (wrong underlying backend, ...). */ - T extension(SearchProjectionFactoryExtension extension); + T extension(SearchProjectionFactoryExtension extension); /** * Create a DSL step allowing multiple attempts to apply extensions one after the other, @@ -455,7 +456,7 @@ ProjectionFinalStep withParameters( * @param The expected projected type. * @return A DSL step. */ - SearchProjectionFactoryExtensionIfSupportedStep extension(); + SearchProjectionFactoryExtensionIfSupportedStep extension(); /** * Create a new projection factory whose root for all paths passed to the DSL @@ -468,7 +469,7 @@ ProjectionFinalStep withParameters( * @return A new projection factory using the given object field as root. */ @Incubating - SearchProjectionFactory withRoot(String objectFieldPath); + SearchProjectionFactory withRoot(String objectFieldPath); /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtension.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtension.java index 319cc94d2a5..4e138f93d0d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtension.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtension.java @@ -22,7 +22,7 @@ * @see SearchProjectionFactory#extension(SearchProjectionFactoryExtension) * @see ExtendedSearchProjectionFactory */ -public interface SearchProjectionFactoryExtension { +public interface SearchProjectionFactoryExtension { /** * Attempt to extend a given factory, returning an empty {@link Optional} in case of failure. @@ -33,6 +33,6 @@ public interface SearchProjectionFactoryExtension { * @return An optional containing the extended projection factory ({@link T}) in case * of success, or an empty optional otherwise. */ - Optional extendOptional(SearchProjectionFactory original); + Optional extendOptional(SearchProjectionFactory original); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtensionIfSupportedMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtensionIfSupportedMoreStep.java index 2a6df8330b0..1d4e2642916 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtensionIfSupportedMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtensionIfSupportedMoreStep.java @@ -12,14 +12,15 @@ * The second and later step when attempting to apply multiple extensions * to a {@link SearchProjectionFactory}. * + * @param Scope root type. * @param The type of entity references in the parent {@link SearchProjectionFactory}. * @param The type of entities in the parent {@link SearchProjectionFactory}. * @param

The resulting projection type. * * @see SearchProjectionFactory#extension() */ -public interface SearchProjectionFactoryExtensionIfSupportedMoreStep - extends SearchProjectionFactoryExtensionIfSupportedStep { +public interface SearchProjectionFactoryExtensionIfSupportedMoreStep + extends SearchProjectionFactoryExtensionIfSupportedStep { /** * If no extension passed to {@link #ifSupported(SearchProjectionFactoryExtension, Function)} @@ -33,7 +34,7 @@ public interface SearchProjectionFactoryExtensionIfSupportedMoreStep * @return The created projection. */ ProjectionFinalStep

orElse( - Function, ? extends ProjectionFinalStep

> projectionContributor); + Function, ? extends ProjectionFinalStep

> projectionContributor); /** * If no extension passed to {@link #ifSupported(SearchProjectionFactoryExtension, Function)} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtensionIfSupportedStep.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtensionIfSupportedStep.java index fb6fbbd336f..a49fe8c9d67 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtensionIfSupportedStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactoryExtensionIfSupportedStep.java @@ -10,13 +10,14 @@ * The initial step when attempting to apply multiple extensions * to a {@link SearchProjectionFactory}. * + * @param Scope root type. * @param The type of entity references in the parent {@link SearchProjectionFactory}. * @param The type of entities in the parent {@link SearchProjectionFactory}. * @param

The resulting projection type. * * @see SearchProjectionFactory#extension() */ -public interface SearchProjectionFactoryExtensionIfSupportedStep { +public interface SearchProjectionFactoryExtensionIfSupportedStep { /** * If the given extension is supported, and none of the previous extensions passed to @@ -35,8 +36,8 @@ public interface SearchProjectionFactoryExtensionIfSupportedStep { * @param The type of the extended factory. * @return {@code this}, for method chaining. */ - SearchProjectionFactoryExtensionIfSupportedMoreStep ifSupported( - SearchProjectionFactoryExtension extension, + SearchProjectionFactoryExtensionIfSupportedMoreStep ifSupported( + SearchProjectionFactoryExtension extension, Function> projectionContributor ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/CompositeProjectionInnerStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/CompositeProjectionInnerStepImpl.java index 284c50f31ea..f0b68ec13d6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/CompositeProjectionInnerStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/CompositeProjectionInnerStepImpl.java @@ -19,15 +19,15 @@ import org.hibernate.search.engine.search.projection.spi.ProjectionTypeKeys; import org.hibernate.search.util.common.impl.Contracts; -public class CompositeProjectionInnerStepImpl implements CompositeProjectionInnerStep { +public class CompositeProjectionInnerStepImpl implements CompositeProjectionInnerStep { private final SearchProjectionDslContext dslContext; - private final SearchProjectionFactory projectionFactory; + private final SearchProjectionFactory projectionFactory; private final CompositeProjectionBuilder builder; private final String objectFieldPath; public CompositeProjectionInnerStepImpl(SearchProjectionDslContext dslContext, - SearchProjectionFactory projectionFactory) { + SearchProjectionFactory projectionFactory) { this.dslContext = dslContext; this.projectionFactory = projectionFactory; this.builder = dslContext.scope().projectionBuilders().composite(); @@ -35,7 +35,7 @@ public CompositeProjectionInnerStepImpl(SearchProjectionDslContext dslContext } public CompositeProjectionInnerStepImpl(SearchProjectionDslContext dslContext, - SearchProjectionFactory projectionFactory, String objectFieldPath) { + SearchProjectionFactory projectionFactory, String objectFieldPath) { this.dslContext = dslContext; this.projectionFactory = projectionFactory; this.builder = dslContext.scope().fieldQueryElement( objectFieldPath, ProjectionTypeKeys.OBJECT ); @@ -44,7 +44,7 @@ public CompositeProjectionInnerStepImpl(SearchProjectionDslContext dslContext @Override public CompositeProjectionValueStep as(Class objectClass) { - SearchProjectionFactory projectionFactoryWithCorrectRoot = objectFieldPath == null + SearchProjectionFactory projectionFactoryWithCorrectRoot = objectFieldPath == null ? projectionFactory : projectionFactory.withRoot( objectFieldPath ); return dslContext.scope().projectionRegistry().composite( objectClass ) diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/EntityProjectionOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/EntityProjectionOptionsStepImpl.java index 9f1d3d732de..bf82ac4d117 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/EntityProjectionOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/EntityProjectionOptionsStepImpl.java @@ -17,15 +17,15 @@ import org.hibernate.search.engine.search.projection.spi.ProjectionMappedTypeContext; import org.hibernate.search.engine.search.projection.spi.SearchProjectionIndexScope; -public final class EntityProjectionOptionsStepImpl - implements EntityProjectionOptionsStep, E> { +public final class EntityProjectionOptionsStepImpl + implements EntityProjectionOptionsStep, E> { private final SearchProjectionIndexScope scope; - private final SearchProjectionFactory projectionFactory; + private final SearchProjectionFactory projectionFactory; private final Class requestedEntityType; public EntityProjectionOptionsStepImpl(SearchProjectionDslContext dslContext, - SearchProjectionFactory projectionFactory, Class requestedEntityType) { + SearchProjectionFactory projectionFactory, Class requestedEntityType) { this.scope = dslContext.scope(); this.projectionFactory = projectionFactory; this.requestedEntityType = requestedEntityType; diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/SearchProjectionFactoryExtensionStep.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/SearchProjectionFactoryExtensionStep.java index 0b9d0322a88..71601a67fd4 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/SearchProjectionFactoryExtensionStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/SearchProjectionFactoryExtensionStep.java @@ -12,21 +12,21 @@ import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactoryExtension; import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactoryExtensionIfSupportedMoreStep; -public final class SearchProjectionFactoryExtensionStep +public final class SearchProjectionFactoryExtensionStep implements - SearchProjectionFactoryExtensionIfSupportedMoreStep { + SearchProjectionFactoryExtensionIfSupportedMoreStep { - private final SearchProjectionFactory parent; + private final SearchProjectionFactory parent; private final DslExtensionState> state = new DslExtensionState<>(); - public SearchProjectionFactoryExtensionStep(SearchProjectionFactory parent) { + public SearchProjectionFactoryExtensionStep(SearchProjectionFactory parent) { this.parent = parent; } @Override - public SearchProjectionFactoryExtensionIfSupportedMoreStep ifSupported( - SearchProjectionFactoryExtension extension, + public SearchProjectionFactoryExtensionIfSupportedMoreStep ifSupported( + SearchProjectionFactoryExtension extension, Function> projectionContributor) { state.ifSupported( extension, extension.extendOptional( parent ), projectionContributor ); return this; @@ -34,7 +34,7 @@ public SearchProjectionFactoryExtensionIfSupportedMoreStep ifSuppor @Override public ProjectionFinalStep

orElse( - Function, ? extends ProjectionFinalStep

> projectionContributor) { + Function, ? extends ProjectionFinalStep

> projectionContributor) { return state.orElse( parent, projectionContributor ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/spi/AbstractSearchProjectionFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/spi/AbstractSearchProjectionFactory.java index 31f365d8576..0defde108b8 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/spi/AbstractSearchProjectionFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/spi/AbstractSearchProjectionFactory.java @@ -42,11 +42,12 @@ import org.hibernate.search.util.common.impl.Contracts; public abstract class AbstractSearchProjectionFactory< - S extends ExtendedSearchProjectionFactory, + SR, + S extends ExtendedSearchProjectionFactory, SC extends SearchProjectionIndexScope, R, E> - implements ExtendedSearchProjectionFactory { + implements ExtendedSearchProjectionFactory { protected final SearchProjectionDslContext dslContext; @@ -106,12 +107,12 @@ public DistanceToFieldProjectionValueStep distance(String fieldPath, @Override public CompositeProjectionInnerStep object(String objectFieldPath) { Contracts.assertNotNull( objectFieldPath, "objectFieldPath" ); - return new CompositeProjectionInnerStepImpl( dslContext, this, objectFieldPath ); + return new CompositeProjectionInnerStepImpl<>( dslContext, this, objectFieldPath ); } @Override public CompositeProjectionInnerStep composite() { - return new CompositeProjectionInnerStepImpl( dslContext, this ); + return new CompositeProjectionInnerStepImpl<>( dslContext, this ); } @Override @@ -132,14 +133,14 @@ public ProjectionFinalStep withParameters( } @Override - public T extension(SearchProjectionFactoryExtension extension) { + public T extension(SearchProjectionFactoryExtension extension) { return DslExtensionState.returnIfSupported( extension, extension.extendOptional( this ) ); } @Override - public SearchProjectionFactoryExtensionIfSupportedStep extension() { + public SearchProjectionFactoryExtensionIfSupportedStep extension() { return new SearchProjectionFactoryExtensionStep<>( this ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryDslExtension.java b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryDslExtension.java index 8299d7fd83e..e9e5b696886 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryDslExtension.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryDslExtension.java @@ -19,6 +19,7 @@ * In short, users are only expected to get instances of this type from an API ({@code SomeExtension.get()}) * and pass it to another API. * + * @param Scope root type. * @param The type of extended steps in the search query definition DSL. Should generally extend * {@link SearchQuerySelectStep}. * @param The reference type. @@ -28,7 +29,7 @@ * @see SearchQuerySelectStep#extension(SearchQueryDslExtension) * @see AbstractSearchQueryOptionsStep */ -public interface SearchQueryDslExtension { +public interface SearchQueryDslExtension { /** * Attempt to extend a given DSL step, returning an empty {@link Optional} in case of failure. @@ -42,7 +43,7 @@ public interface SearchQueryDslExtension { * @return An optional containing the extended search query DSL step ({@link T}) in case * of success, or an empty optional otherwise. */ - Optional extendOptional(SearchQuerySelectStep original, + Optional extendOptional(SearchQuerySelectStep original, SearchQueryIndexScope scope, BackendSessionContext sessionContext, SearchLoadingContextBuilder loadingContextBuilder); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryOptionsStep.java index 47389fb3b23..070a80361f5 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQueryOptionsStep.java @@ -30,6 +30,7 @@ * The final step in a query definition, where optional parameters such as {@link #sort(Function) sorts} can be set, * and where the query can be {@link SearchFetchable executed} or {@link #toQuery() retrieved as an object}. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * May be a subtype of SearchQueryOptionsStep with more exposed methods. * @param The type of hits for the created query. @@ -38,11 +39,12 @@ * @param The type of factory used to create aggregations in {@link #aggregation(AggregationKey, Function)}. */ public interface SearchQueryOptionsStep< - S extends SearchQueryOptionsStep, + SR, + S extends SearchQueryOptionsStep, H, LOS, - SF extends SearchSortFactory, - AF extends SearchAggregationFactory> + SF extends SearchSortFactory, + AF extends SearchAggregationFactory> extends SearchQueryFinalStep, SearchFetchable { /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQuerySelectStep.java b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQuerySelectStep.java index 31690f3d291..e702a214778 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQuerySelectStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/SearchQuerySelectStep.java @@ -23,6 +23,7 @@ * The "SELECT" clause may be omitted by setting the {@link #where(Function) "WHERE" clause} directly, * in which case {@link #selectEntity()} will be assumed. * + * @param Scope root type. * @param The next step if no type of hits is explicitly selected, * i.e. if {@link #where(SearchPredicate)} or {@link #where(Function)} is called directly * without calling {@link #selectEntity()}, or {@link #selectEntityReference()}, {@link #select(SearchProjection)} @@ -38,13 +39,14 @@ * @param The type of factory used to create predicates in {@link #where(Function)}. */ public interface SearchQuerySelectStep< - N extends SearchQueryOptionsStep, + SR, + N extends SearchQueryOptionsStep, R, E, LOS, - PJF extends SearchProjectionFactory, - PDF extends SearchPredicateFactory> - extends SearchQueryWhereStep { + PJF extends SearchProjectionFactory, + PDF extends SearchPredicateFactory> + extends SearchQueryWhereStep { /** * Select the entity was originally indexed @@ -55,7 +57,7 @@ public interface SearchQuerySelectStep< * @return The next step. * @see SearchQueryWhereStep */ - SearchQueryWhereStep selectEntity(); + SearchQueryWhereStep selectEntity(); /** * Select a reference to the entity that was originally indexed @@ -69,7 +71,7 @@ public interface SearchQuerySelectStep< * @return The next step. * @see SearchQueryWhereStep */ - SearchQueryWhereStep selectEntityReference(); + SearchQueryWhereStep selectEntityReference(); /** * Select an object projection @@ -82,7 +84,7 @@ public interface SearchQuerySelectStep< * @return The next step. * @see SearchQueryWhereStep */ -

SearchQueryWhereStep select(Class

objectClass); +

SearchQueryWhereStep select(Class

objectClass); /** * Select a given projection as a representation of the search hit for each matching document. @@ -94,7 +96,7 @@ public interface SearchQuerySelectStep< * @return The next step. * @see SearchQueryWhereStep */ -

SearchQueryWhereStep select( +

SearchQueryWhereStep select( Function> projectionContributor); /** @@ -105,7 +107,7 @@ public interface SearchQuerySelectStep< * @return The next step. * @see SearchQueryWhereStep */ -

SearchQueryWhereStep select(SearchProjection

projection); +

SearchQueryWhereStep select(SearchProjection

projection); /** * Select a list of projections as a representation of the search hit for each matching document. @@ -120,7 +122,7 @@ public interface SearchQuerySelectStep< * @see SearchProjectionFactory#composite(SearchProjection[]) * @see SearchQueryWhereStep */ - SearchQueryWhereStep, LOS, ?> select(SearchProjection... projections); + SearchQueryWhereStep, LOS, ?> select(SearchProjection... projections); /** * Extend the current DSL step with the given extension, @@ -131,6 +133,6 @@ public interface SearchQuerySelectStep< * @return The extended DSL step. * @throws SearchException If the extension cannot be applied (wrong underlying backend, ...). */ - T extension(SearchQueryDslExtension extension); + T extension(SearchQueryDslExtension extension); } 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 7d47b9b9ce6..a4ec5367693 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 @@ -16,16 +16,18 @@ /** * The step in a query definition where the predicate, i.e. the "WHERE" clause, can be set. * + * @param Scope root type. * @param The type of the next step, returned after a predicate is defined. * @param The type of hits for the created query. * @param The type of factory used to create predicates in {@link #where(Function)}. * @param The type of the initial step of the loading options definition DSL accessible through {@link SearchQueryOptionsStep#loading(Consumer)}. */ public interface SearchQueryWhereStep< - N extends SearchQueryOptionsStep, + SR, + N extends SearchQueryOptionsStep, H, LOS, - PDF extends SearchPredicateFactory> { + PDF extends SearchPredicateFactory> { /** * Set the predicate for this query. @@ -52,6 +54,6 @@ public interface SearchQueryWhereStep< * @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/DefaultSearchQueryOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/impl/DefaultSearchQueryOptionsStep.java index 69554a891cb..edb00cb631a 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/impl/DefaultSearchQueryOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/impl/DefaultSearchQueryOptionsStep.java @@ -15,17 +15,23 @@ import org.hibernate.search.engine.search.query.spi.SearchQueryIndexScope; import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory; -final class DefaultSearchQueryOptionsStep +final class DefaultSearchQueryOptionsStep extends AbstractSearchQueryOptionsStep< - DefaultSearchQueryOptionsStep, + SR, + DefaultSearchQueryOptionsStep, H, LOS, - SearchPredicateFactory, - SearchSortFactory, - SearchAggregationFactory, + SearchPredicateFactory, + SearchSortFactory, + SearchAggregationFactory, SearchQueryIndexScope> - implements SearchQueryWhereStep, H, LOS, SearchPredicateFactory>, - SearchQueryOptionsStep, H, LOS, SearchSortFactory, SearchAggregationFactory> { + implements SearchQueryWhereStep, H, LOS, SearchPredicateFactory>, + SearchQueryOptionsStep, + H, + LOS, + SearchSortFactory, + SearchAggregationFactory> { DefaultSearchQueryOptionsStep(SearchQueryIndexScope scope, SearchQueryBuilder searchQueryBuilder, SearchLoadingContextBuilder loadingContextBuilder) { @@ -33,17 +39,17 @@ final class DefaultSearchQueryOptionsStep } @Override - protected SearchPredicateFactory predicateFactory() { + protected SearchPredicateFactory predicateFactory() { return scope.predicateFactory(); } @Override - protected SearchSortFactory sortFactory() { + protected SearchSortFactory sortFactory() { return scope.sortFactory(); } @Override - protected SearchAggregationFactory aggregationFactory() { + protected SearchAggregationFactory aggregationFactory() { return scope.aggregationFactory(); } @@ -53,7 +59,7 @@ protected SearchHighlighterFactory highlighterFactory() { } @Override - protected DefaultSearchQueryOptionsStep thisAsS() { + protected DefaultSearchQueryOptionsStep thisAsS() { return this; } } 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 37ec11663df..408ed73b4cf 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 @@ -25,14 +25,15 @@ import org.hibernate.search.engine.search.query.spi.SearchQueryBuilder; import org.hibernate.search.engine.search.query.spi.SearchQueryIndexScope; -public final class DefaultSearchQuerySelectStep +public final class DefaultSearchQuerySelectStep extends AbstractSearchQuerySelectStep< - SearchQueryOptionsStep, + SR, + SearchQueryOptionsStep, R, E, LOS, - SearchProjectionFactory, - SearchPredicateFactory> { + SearchProjectionFactory, + SearchPredicateFactory> { private final SearchQueryIndexScope scope; private final BackendSessionContext sessionContext; @@ -46,55 +47,55 @@ public DefaultSearchQuerySelectStep(SearchQueryIndexScope scope, BackendSessi } @Override - public DefaultSearchQueryOptionsStep selectEntity() { - return select( scope.projectionFactory().entity().toProjection() ); + public DefaultSearchQueryOptionsStep selectEntity() { + return select( scope.projectionFactory().entity().toProjection() ); } @Override - public DefaultSearchQueryOptionsStep selectEntityReference() { + public DefaultSearchQueryOptionsStep selectEntityReference() { return select( scope.projectionBuilders().entityReference() ); } @Override - public

SearchQueryWhereStep select(Class

objectClass) { + public

SearchQueryWhereStep select(Class

objectClass) { return select( scope.projectionFactory().composite().as( objectClass ).toProjection() ); } @Override - public

DefaultSearchQueryOptionsStep select( - Function, ? extends ProjectionFinalStep

> projectionContributor) { + public

DefaultSearchQueryOptionsStep select( + Function, ? extends ProjectionFinalStep

> projectionContributor) { SearchProjection

projection = projectionContributor.apply( scope.projectionFactory() ).toProjection(); return select( projection ); } @Override - public

DefaultSearchQueryOptionsStep select(SearchProjection

projection) { + public

DefaultSearchQueryOptionsStep select(SearchProjection

projection) { SearchQueryBuilder

builder = scope.select( sessionContext, loadingContextBuilder, projection ); return new DefaultSearchQueryOptionsStep<>( scope, builder, loadingContextBuilder ); } @Override - public DefaultSearchQueryOptionsStep, LOS> select(SearchProjection... projections) { + public DefaultSearchQueryOptionsStep, LOS> select(SearchProjection... projections) { return select( scope.projectionBuilders().composite() .build( projections, ProjectionCompositor.fromList( projections.length ), ProjectionCollector.nullable() ) ); } @Override - public SearchQueryOptionsStep where( - Function predicateContributor) { + public SearchQueryOptionsStep where( + Function, ? extends PredicateFinalStep> predicateContributor) { return selectEntity().where( predicateContributor ); } @Override - public SearchQueryOptionsStep where(SearchPredicate predicate) { + public SearchQueryOptionsStep where(SearchPredicate predicate) { return selectEntity().where( predicate ); } @Override - public SearchQueryOptionsStep where( - BiConsumer> predicateContributor) { + public SearchQueryOptionsStep where( + BiConsumer, + ? super SimpleBooleanPredicateClausesCollector> 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 ed63cb1445d..df04da7b72f 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 @@ -20,73 +20,74 @@ import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; import org.hibernate.search.engine.search.query.dsl.SearchQueryWhereStep; -public abstract class AbstractDelegatingSearchQuerySelectStep +public abstract class AbstractDelegatingSearchQuerySelectStep implements SearchQuerySelectStep< - SearchQueryOptionsStep, + SR, + SearchQueryOptionsStep, R, E, LOS, - SearchProjectionFactory, - SearchPredicateFactory> { + SearchProjectionFactory, + SearchPredicateFactory> { - private final SearchQuerySelectStep delegate; + private final SearchQuerySelectStep delegate; - public AbstractDelegatingSearchQuerySelectStep(SearchQuerySelectStep delegate) { + public AbstractDelegatingSearchQuerySelectStep(SearchQuerySelectStep delegate) { this.delegate = delegate; } @Override - public SearchQueryWhereStep selectEntity() { + public SearchQueryWhereStep selectEntity() { return delegate.selectEntity(); } @Override - public SearchQueryWhereStep selectEntityReference() { + public SearchQueryWhereStep selectEntityReference() { return delegate.selectEntityReference(); } @Override - public

SearchQueryWhereStep select(Class

objectClass) { + public

SearchQueryWhereStep select(Class

objectClass) { return delegate.select( objectClass ); } @Override - public

SearchQueryWhereStep select( - Function, ? extends ProjectionFinalStep

> projectionContributor) { + public

SearchQueryWhereStep select( + Function, ? extends ProjectionFinalStep

> projectionContributor) { return delegate.select( projectionContributor ); } @Override - public

SearchQueryWhereStep select(SearchProjection

projection) { + public

SearchQueryWhereStep select(SearchProjection

projection) { return delegate.select( projection ); } @Override - public SearchQueryWhereStep, LOS, ?> select( + public SearchQueryWhereStep, LOS, ?> select( SearchProjection... projections) { return delegate.select( projections ); } @Override - public SearchQueryOptionsStep where( - Function predicateContributor) { + public SearchQueryOptionsStep where( + Function, ? extends PredicateFinalStep> predicateContributor) { return delegate.where( predicateContributor ); } @Override - public SearchQueryOptionsStep where( - BiConsumer> predicateContributor) { + public SearchQueryOptionsStep where( + BiConsumer, + ? super SimpleBooleanPredicateClausesCollector> predicateContributor) { return delegate.where( predicateContributor ); } @Override - public SearchQueryOptionsStep where(SearchPredicate predicate) { + public SearchQueryOptionsStep where(SearchPredicate predicate) { return delegate.where( predicate ); } @Override - public T extension(SearchQueryDslExtension extension) { + public T extension(SearchQueryDslExtension extension) { return delegate.extension( extension ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractExtendedSearchQueryOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractExtendedSearchQueryOptionsStep.java index 37ee8b2cf3a..47432cc6f1c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractExtendedSearchQueryOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractExtendedSearchQueryOptionsStep.java @@ -16,16 +16,17 @@ import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory; public abstract class AbstractExtendedSearchQueryOptionsStep< - S extends SearchQueryOptionsStep, + SR, + S extends SearchQueryOptionsStep, H, R extends SearchResult, SCR extends SearchScroll, LOS, - PDF extends SearchPredicateFactory, - SF extends SearchSortFactory, - AF extends SearchAggregationFactory, + PDF extends SearchPredicateFactory, + SF extends SearchSortFactory, + AF extends SearchAggregationFactory, SC extends SearchQueryIndexScope> - extends AbstractSearchQueryOptionsStep { + extends AbstractSearchQueryOptionsStep { public AbstractExtendedSearchQueryOptionsStep(SC scope, SearchQueryBuilder searchQueryBuilder, 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 cbd7d215258..f94e8ecab35 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 @@ -37,14 +37,15 @@ import org.hibernate.search.engine.search.sort.dsl.SortFinalStep; public abstract class AbstractSearchQueryOptionsStep< - S extends SearchQueryOptionsStep, + SR, + S extends SearchQueryOptionsStep, H, LOS, - PDF extends SearchPredicateFactory, - SF extends SearchSortFactory, - AF extends SearchAggregationFactory, + PDF extends SearchPredicateFactory, + SF extends SearchSortFactory, + AF extends SearchAggregationFactory, SC extends SearchQueryIndexScope> - implements SearchQueryWhereStep, SearchQueryOptionsStep { + implements SearchQueryWhereStep, SearchQueryOptionsStep { protected final SC scope; private final SearchQueryBuilder searchQueryBuilder; @@ -72,9 +73,9 @@ public S where(Function predicateCont } @Override - public S where(BiConsumer> predicateContributor) { + public S where(BiConsumer> predicateContributor) { PDF factory = predicateFactory(); - SimpleBooleanPredicateClausesStep andStep = factory.and(); + SimpleBooleanPredicateClausesStep andStep = factory.and(); predicateContributor.accept( factory, andStep ); searchQueryBuilder.predicate( andStep.toPredicate() ); return thisAsS(); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractSearchQuerySelectStep.java b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractSearchQuerySelectStep.java index c2a022871ac..3f31b3e6fda 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractSearchQuerySelectStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/query/dsl/spi/AbstractSearchQuerySelectStep.java @@ -15,16 +15,17 @@ import org.hibernate.search.engine.search.query.spi.SearchQueryIndexScope; public abstract class AbstractSearchQuerySelectStep< - N extends SearchQueryOptionsStep, + SR, + N extends SearchQueryOptionsStep, R, E, LOS, - PJF extends SearchProjectionFactory, - PDF extends SearchPredicateFactory> - implements SearchQuerySelectStep { + PJF extends SearchProjectionFactory, + PDF extends SearchPredicateFactory> + implements SearchQuerySelectStep { @Override - public T extension(SearchQueryDslExtension extension) { + public T extension(SearchQueryDslExtension extension) { return DslExtensionState.returnIfSupported( extension, extension.extendOptional( this, scope(), sessionContext(), loadingContextBuilder() ) diff --git a/engine/src/main/java/org/hibernate/search/engine/search/query/spi/SearchQueryIndexScope.java b/engine/src/main/java/org/hibernate/search/engine/search/query/spi/SearchQueryIndexScope.java index f41ddc78bb7..d8f621d3787 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/query/spi/SearchQueryIndexScope.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/query/spi/SearchQueryIndexScope.java @@ -25,13 +25,13 @@ public interface SearchQueryIndexScope>

SearchQueryBuilder

select(BackendSessionContext sessionContext, SearchLoadingContextBuilder loadingContextBuilder, SearchProjection

projection); - SearchPredicateFactory predicateFactory(); + SearchPredicateFactory predicateFactory(); - SearchSortFactory sortFactory(); + SearchSortFactory sortFactory(); - SearchProjectionFactory projectionFactory(); + SearchProjectionFactory projectionFactory(); - SearchAggregationFactory aggregationFactory(); + SearchAggregationFactory aggregationFactory(); SearchHighlighterFactory highlighterFactory(); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java index c3a195700b3..8ac205a416d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java @@ -11,5 +11,5 @@ public interface RootReferenceScope { Class rootReferenceType(); - , P extends SearchScopeProvider> S create(P scopeProvider); + , P extends SearchScopeProvider> S create(P scopeProvider); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java index 7c9373ff233..013e8febc50 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java @@ -4,7 +4,6 @@ */ package org.hibernate.search.engine.search.reference.projection; -import org.hibernate.search.engine.search.common.ValueConvert; import org.hibernate.search.engine.search.common.ValueModel; public interface TypedProjectionFieldReference extends ProjectionFieldReference { diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/CompositeSortComponentsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/CompositeSortComponentsStep.java index e8ca2178a12..30913f336ba 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/CompositeSortComponentsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/CompositeSortComponentsStep.java @@ -13,10 +13,11 @@ * for example when calling {@link SearchSortFactory#composite()}, * but not in "implicit" composite sorts such as when calling {@link SortThenStep#then()}. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). */ -public interface CompositeSortComponentsStep> - extends SortFinalStep, SortThenStep { +public interface CompositeSortComponentsStep> + extends SortFinalStep, SortThenStep { /** * Add an element to the composite sort based on a previously-built {@link SearchSort}. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/DistanceSortOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/DistanceSortOptionsStep.java index fe4f4c87d9a..d69ea09b064 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/DistanceSortOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/DistanceSortOptionsStep.java @@ -11,11 +11,15 @@ /** * The initial and final step in a "distance" sort definition, where optional parameters can be set. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of factory used to create predicates in {@link #filter(Function)}. */ -public interface DistanceSortOptionsStep, PDF extends SearchPredicateFactory> - extends SortFinalStep, SortThenStep, SortOrderStep, SortModeStep, SortFilterStep { +public interface DistanceSortOptionsStep< + SR, + S extends DistanceSortOptionsStep, + PDF extends SearchPredicateFactory> + extends SortFinalStep, SortThenStep, SortOrderStep, SortModeStep, SortFilterStep { /** * Start describing the behavior of this sort when a document doesn't diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java index c7e36c1d3b1..c7f7747d16e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java @@ -16,23 +16,27 @@ * Warning: Generic parameters of this type are subject to change, * so this type should not be referenced directly in user code. * + * @param Scope root type. * @param The self type, i.e. the exposed type of this factory. * @param The type of factory used to create predicates in {@link FieldSortOptionsStep#filter(Function)}. */ -public interface ExtendedSearchSortFactory, PDF extends SearchPredicateFactory> - extends SearchSortFactory { +public interface ExtendedSearchSortFactory< + SR, + S extends ExtendedSearchSortFactory, + PDF extends SearchPredicateFactory> + extends SearchSortFactory { @Override S withRoot(String objectFieldPath); @Override - FieldSortOptionsStep field(String fieldPath); + FieldSortOptionsStep field(String fieldPath); @Override - DistanceSortOptionsStep distance(String fieldPath, GeoPoint location); + DistanceSortOptionsStep distance(String fieldPath, GeoPoint location); @Override - default DistanceSortOptionsStep distance(String fieldPath, double latitude, double longitude) { + default DistanceSortOptionsStep distance(String fieldPath, double latitude, double longitude) { return distance( fieldPath, GeoPoint.of( latitude, longitude ) ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsStep.java index 6636ea47dfb..6563f2a06b6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsStep.java @@ -11,13 +11,14 @@ /** * The initial and final step in a "field" sort definition, where optional parameters can be set. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of factory used to create predicates in {@link #filter(Function)}. * * @author Emmanuel Bernard emmanuel@hibernate.org */ -public interface FieldSortOptionsStep, PDF extends SearchPredicateFactory> - extends SortFinalStep, SortThenStep, SortOrderStep, SortModeStep, SortFilterStep { +public interface FieldSortOptionsStep, PDF extends SearchPredicateFactory> + extends SortFinalStep, SortThenStep, SortOrderStep, SortModeStep, SortFilterStep { /** * Start describing the behavior of this sort when a document doesn't diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ScoreSortOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ScoreSortOptionsStep.java index 8bfb4c2d2e3..58561aa1e6c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ScoreSortOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ScoreSortOptionsStep.java @@ -7,10 +7,11 @@ /** * The initial and final step in a "score" sort definition, where optional parameters can be set. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * * @author Emmanuel Bernard emmanuel@hibernate.org */ -public interface ScoreSortOptionsStep> - extends SortFinalStep, SortThenStep, SortOrderStep { +public interface ScoreSortOptionsStep> + extends SortFinalStep, SortThenStep, SortOrderStep { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java index 7809348c57f..c1abade031f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java @@ -30,9 +30,10 @@ * Such a factory can also transform relative paths into absolute paths using {@link #toAbsolutePath(String)}; * this can be useful for native sorts in particular. * + * @param Scope root type. * @author Emmanuel Bernard emmanuel@hibernate.org */ -public interface SearchSortFactory { +public interface SearchSortFactory { /** * Order elements by their relevance score. @@ -41,14 +42,14 @@ public interface SearchSortFactory { * * @return A DSL step where the "score" sort can be defined in more details. */ - ScoreSortOptionsStep score(); + ScoreSortOptionsStep score(); /** * Order elements by their internal index order. * * @return A DSL step where the "index order" sort can be defined in more details. */ - SortThenStep indexOrder(); + SortThenStep indexOrder(); /** * Order elements by the value of a specific field. @@ -59,7 +60,7 @@ public interface SearchSortFactory { * @return A DSL step where the "field" sort can be defined in more details. * @throws SearchException If the field doesn't exist or cannot be sorted on. */ - FieldSortOptionsStep field(String fieldPath); + FieldSortOptionsStep> field(String fieldPath); /** * Order elements by the distance from the location stored in the specified field to the location specified. @@ -72,7 +73,7 @@ public interface SearchSortFactory { * @return A DSL step where the "distance" sort can be defined in more details. * @throws SearchException If the field type does not constitute a valid location. */ - DistanceSortOptionsStep distance(String fieldPath, GeoPoint location); + DistanceSortOptionsStep> distance(String fieldPath, GeoPoint location); /** * Order elements by the distance from the location stored in the specified field to the location specified. @@ -86,7 +87,7 @@ public interface SearchSortFactory { * @return A DSL step where the "distance" sort can be defined in more details. * @throws SearchException If the field type does not constitute a valid location. */ - default DistanceSortOptionsStep distance(String fieldPath, double latitude, + default DistanceSortOptionsStep> distance(String fieldPath, double latitude, double longitude) { return distance( fieldPath, GeoPoint.of( latitude, longitude ) ); } @@ -101,7 +102,7 @@ public interface SearchSortFactory { * * @return A DSL step where the "composite" sort can be defined in more details. */ - CompositeSortComponentsStep composite(); + CompositeSortComponentsStep composite(); /** * Order by a sort composed of several elements, @@ -124,7 +125,7 @@ public interface SearchSortFactory { * Should generally be a lambda expression. * @return A DSL step where the "composite" sort can be defined in more details. */ - SortThenStep composite(Consumer> elementContributor); + SortThenStep composite(Consumer> elementContributor); /** * Delegating sort that creates the actual sort at query create time and provides access to query parameters. @@ -135,7 +136,7 @@ public interface SearchSortFactory { * @return A final DSL step in a parameterized sort definition. */ @Incubating - SortThenStep withParameters(Function sortCreator); + SortThenStep withParameters(Function sortCreator); /** * Extend the current factory with the given extension, @@ -146,7 +147,7 @@ public interface SearchSortFactory { * @return The extended factory. * @throws SearchException If the extension cannot be applied (wrong underlying backend, ...). */ - T extension(SearchSortFactoryExtension extension); + T extension(SearchSortFactoryExtension extension); /** * Create a DSL step allowing multiple attempts to apply extensions one after the other, @@ -157,7 +158,7 @@ public interface SearchSortFactory { * * @return A DSL step. */ - SearchSortFactoryExtensionIfSupportedStep extension(); + SearchSortFactoryExtensionIfSupportedStep extension(); /** * Create a new sort factory whose root for all paths passed to the DSL @@ -170,7 +171,7 @@ public interface SearchSortFactory { * @return A new sort factory using the given object field as root. */ @Incubating - SearchSortFactory withRoot(String objectFieldPath); + SearchSortFactory withRoot(String objectFieldPath); /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtension.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtension.java index 9e5006d03b5..6f645baf541 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtension.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtension.java @@ -14,13 +14,14 @@ * In short, users are only expected to get instances of this type from an API ({@code SomeExtension.get()}) * and pass it to another API. * + * @param Scope root type. * @param The type of extended sort factories. Should generally extend * {@link SearchSortFactory}. * * @see SearchSortFactory#extension(SearchSortFactoryExtension) * @see ExtendedSearchSortFactory */ -public interface SearchSortFactoryExtension { +public interface SearchSortFactoryExtension { /** * Attempt to extend a given factory, returning an empty {@link Optional} in case of failure. @@ -31,6 +32,6 @@ public interface SearchSortFactoryExtension { * @return An optional containing the extended sort factory ({@link T}) in case * of success, or an empty optional otherwise. */ - Optional extendOptional(SearchSortFactory original); + Optional extendOptional(SearchSortFactory original); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtensionIfSupportedMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtensionIfSupportedMoreStep.java index b98fd77c6dc..0fc49144b22 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtensionIfSupportedMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtensionIfSupportedMoreStep.java @@ -12,9 +12,10 @@ * The second and later step when attempting to apply multiple extensions * to a {@link SearchSortFactory}. * + * @param Scope root type. * @see SearchSortFactory#extension() */ -public interface SearchSortFactoryExtensionIfSupportedMoreStep extends SearchSortFactoryExtensionIfSupportedStep { +public interface SearchSortFactoryExtensionIfSupportedMoreStep extends SearchSortFactoryExtensionIfSupportedStep { /** * If no extension passed to {@link #ifSupported(SearchSortFactoryExtension, Function)} @@ -27,7 +28,7 @@ public interface SearchSortFactoryExtensionIfSupportedMoreStep extends SearchSor * Should generally be a lambda expression. * @return The final step in the DSL of the resulting sort. */ - SortThenStep orElse(Function sortContributor); + SortThenStep orElse(Function, ? extends SortFinalStep> sortContributor); /** * If no extension passed to {@link #ifSupported(SearchSortFactoryExtension, Function)} @@ -37,6 +38,6 @@ public interface SearchSortFactoryExtensionIfSupportedMoreStep extends SearchSor * @return The final step in the DSL of the resulting sort. * @throws SearchException If none of the previously passed extensions was supported. */ - SortThenStep orElseFail(); + SortThenStep orElseFail(); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtensionIfSupportedStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtensionIfSupportedStep.java index 6d661ac8a9b..53a3c3a09b7 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtensionIfSupportedStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactoryExtensionIfSupportedStep.java @@ -12,7 +12,7 @@ * * @see SearchSortFactory#extension() */ -public interface SearchSortFactoryExtensionIfSupportedStep { +public interface SearchSortFactoryExtensionIfSupportedStep { /** * If the given extension is supported, and none of the previous extensions passed to @@ -31,8 +31,8 @@ public interface SearchSortFactoryExtensionIfSupportedStep { * @param The type of the extended factory. * @return {@code this}, for method chaining. */ - SearchSortFactoryExtensionIfSupportedMoreStep ifSupported( - SearchSortFactoryExtension extension, + SearchSortFactoryExtensionIfSupportedMoreStep ifSupported( + SearchSortFactoryExtension extension, Function sortContributor ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SortFilterStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SortFilterStep.java index f557f2b7d29..a3de0e26f88 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SortFilterStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SortFilterStep.java @@ -17,7 +17,7 @@ * @param The "self" type (the actual exposed type of this step) * @param The type of factory used to create predicates in {@link #filter(Function)}. */ -public interface SortFilterStep { +public interface SortFilterStep> { /** * Filter nested objects from which values will be extracted for this sort. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SortThenStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SortThenStep.java index 6a9a923c9e1..ae81a51eca8 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SortThenStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SortThenStep.java @@ -7,15 +7,16 @@ /** * The step in a sort definition where another sort can be chained. * + * @param Scope root type. * @author Emmanuel Bernard emmanuel@hibernate.org */ -public interface SortThenStep extends SortFinalStep { +public interface SortThenStep extends SortFinalStep { /** * Start defining another sort, to be applied after the current one. * * @return The next step. */ - SearchSortFactory then(); + SearchSortFactory then(); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/CompositeSortComponentsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/CompositeSortComponentsStepImpl.java index 1846329969f..4295d5bf163 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/CompositeSortComponentsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/CompositeSortComponentsStepImpl.java @@ -9,23 +9,23 @@ import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory; import org.hibernate.search.engine.search.sort.dsl.spi.SearchSortDslContext; -public final class CompositeSortComponentsStepImpl - implements CompositeSortComponentsStep { +public final class CompositeSortComponentsStepImpl + implements CompositeSortComponentsStep> { - private SearchSortDslContext dslContext; + private SearchSortDslContext dslContext; - public CompositeSortComponentsStepImpl(SearchSortDslContext dslContext) { + public CompositeSortComponentsStepImpl(SearchSortDslContext dslContext) { this.dslContext = dslContext; } @Override - public CompositeSortComponentsStepImpl add(SearchSort searchSort) { + public CompositeSortComponentsStepImpl add(SearchSort searchSort) { dslContext = dslContext.append( searchSort ); return this; } @Override - public SearchSortFactory then() { + public SearchSortFactory then() { return dslContext.then(); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/DistanceSortOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/DistanceSortOptionsStepImpl.java index bcd8b54c612..231220f5dbe 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/DistanceSortOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/DistanceSortOptionsStepImpl.java @@ -20,15 +20,15 @@ import org.hibernate.search.engine.search.sort.spi.SortTypeKeys; import org.hibernate.search.engine.spatial.GeoPoint; -public class DistanceSortOptionsStepImpl - extends AbstractSortThenStep - implements DistanceSortOptionsStep, PDF>, - DistanceSortMissingValueBehaviorStep> { +public class DistanceSortOptionsStepImpl> + extends AbstractSortThenStep + implements DistanceSortOptionsStep, PDF>, + DistanceSortMissingValueBehaviorStep> { private final DistanceSortBuilder builder; - private final SearchSortDslContext dslContext; + private final SearchSortDslContext dslContext; - public DistanceSortOptionsStepImpl(SearchSortDslContext dslContext, + public DistanceSortOptionsStepImpl(SearchSortDslContext dslContext, String fieldPath, GeoPoint center) { super( dslContext ); this.dslContext = dslContext; @@ -37,19 +37,19 @@ public DistanceSortOptionsStepImpl(SearchSortDslContext dslCon } @Override - public DistanceSortOptionsStepImpl order(SortOrder order) { + public DistanceSortOptionsStepImpl order(SortOrder order) { builder.order( order ); return this; } @Override - public DistanceSortOptionsStepImpl mode(SortMode mode) { + public DistanceSortOptionsStepImpl mode(SortMode mode) { builder.mode( mode ); return this; } @Override - public DistanceSortOptionsStepImpl filter( + public DistanceSortOptionsStepImpl filter( Function clauseContributor) { SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); @@ -57,43 +57,43 @@ public DistanceSortOptionsStepImpl filter( } @Override - public DistanceSortOptionsStepImpl filter(SearchPredicate searchPredicate) { + public DistanceSortOptionsStepImpl filter(SearchPredicate searchPredicate) { builder.filter( searchPredicate ); return this; } @Override - public DistanceSortMissingValueBehaviorStep> missing() { + public DistanceSortMissingValueBehaviorStep> missing() { return this; } @Override - public DistanceSortOptionsStepImpl first() { + public DistanceSortOptionsStepImpl first() { builder.missingFirst(); return this; } @Override - public DistanceSortOptionsStepImpl last() { + public DistanceSortOptionsStepImpl last() { builder.missingLast(); return this; } @Override - public DistanceSortOptionsStepImpl highest() { + public DistanceSortOptionsStepImpl highest() { builder.missingHighest(); return this; } @Override - public DistanceSortOptionsStepImpl lowest() { + public DistanceSortOptionsStepImpl lowest() { builder.missingLowest(); return this; } @Override - public DistanceSortOptionsStepImpl use(GeoPoint value) { + public DistanceSortOptionsStepImpl use(GeoPoint value) { builder.missingAs( value ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsStepImpl.java index e0b26fb3b75..b903606df8a 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsStepImpl.java @@ -20,39 +20,39 @@ import org.hibernate.search.engine.search.sort.spi.FieldSortBuilder; import org.hibernate.search.engine.search.sort.spi.SortTypeKeys; -public class FieldSortOptionsStepImpl - extends AbstractSortThenStep - implements FieldSortOptionsStep, PDF>, - FieldSortMissingValueBehaviorStep> { +public class FieldSortOptionsStepImpl> + extends AbstractSortThenStep + implements FieldSortOptionsStep, PDF>, + FieldSortMissingValueBehaviorStep> { - private final SearchSortDslContext dslContext; + private final SearchSortDslContext dslContext; private final FieldSortBuilder builder; - public FieldSortOptionsStepImpl(SearchSortDslContext dslContext, String fieldPath) { + public FieldSortOptionsStepImpl(SearchSortDslContext dslContext, String fieldPath) { super( dslContext ); this.dslContext = dslContext; this.builder = dslContext.scope().fieldQueryElement( fieldPath, SortTypeKeys.FIELD ); } @Override - public FieldSortOptionsStepImpl order(SortOrder order) { + public FieldSortOptionsStepImpl order(SortOrder order) { builder.order( order ); return this; } @Override - public FieldSortOptionsStepImpl mode(SortMode mode) { + public FieldSortOptionsStepImpl mode(SortMode mode) { builder.mode( mode ); return this; } @Override - public FieldSortMissingValueBehaviorStep> missing() { + public FieldSortMissingValueBehaviorStep> missing() { return this; } @Override - public FieldSortOptionsStepImpl filter( + public FieldSortOptionsStepImpl filter( Function clauseContributor) { SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); @@ -60,37 +60,37 @@ public FieldSortOptionsStepImpl filter( } @Override - public FieldSortOptionsStepImpl filter(SearchPredicate searchPredicate) { + public FieldSortOptionsStepImpl filter(SearchPredicate searchPredicate) { builder.filter( searchPredicate ); return this; } @Override - public FieldSortOptionsStepImpl first() { + public FieldSortOptionsStepImpl first() { builder.missingFirst(); return this; } @Override - public FieldSortOptionsStepImpl last() { + public FieldSortOptionsStepImpl last() { builder.missingLast(); return this; } @Override - public FieldSortOptionsStepImpl highest() { + public FieldSortOptionsStepImpl highest() { builder.missingHighest(); return this; } @Override - public FieldSortOptionsStepImpl lowest() { + public FieldSortOptionsStepImpl lowest() { builder.missingLowest(); return this; } @Override - public FieldSortOptionsStepImpl use(Object value, ValueModel valueModel) { + public FieldSortOptionsStepImpl use(Object value, ValueModel valueModel) { builder.missingAs( value, valueModel ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/ScoreSortOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/ScoreSortOptionsStepImpl.java index 37bff677d48..b835ce06b08 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/ScoreSortOptionsStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/ScoreSortOptionsStepImpl.java @@ -11,19 +11,19 @@ import org.hibernate.search.engine.search.sort.dsl.spi.SearchSortDslContext; import org.hibernate.search.engine.search.sort.spi.ScoreSortBuilder; -public final class ScoreSortOptionsStepImpl - extends AbstractSortThenStep - implements ScoreSortOptionsStep { +public final class ScoreSortOptionsStepImpl + extends AbstractSortThenStep + implements ScoreSortOptionsStep> { private final ScoreSortBuilder builder; - public ScoreSortOptionsStepImpl(SearchSortDslContext dslContext) { + public ScoreSortOptionsStepImpl(SearchSortDslContext dslContext) { super( dslContext ); this.builder = dslContext.scope().sortBuilders().score(); } @Override - public ScoreSortOptionsStepImpl order(SortOrder order) { + public ScoreSortOptionsStepImpl order(SortOrder order) { builder.order( order ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/SearchSortFactoryExtensionStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/SearchSortFactoryExtensionStep.java index 145c995f25d..a3d9c8b35d7 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/SearchSortFactoryExtensionStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/SearchSortFactoryExtensionStep.java @@ -15,37 +15,37 @@ import org.hibernate.search.engine.search.sort.dsl.spi.SearchSortDslContext; import org.hibernate.search.engine.search.sort.dsl.spi.StaticSortThenStep; -public final class SearchSortFactoryExtensionStep - implements SearchSortFactoryExtensionIfSupportedMoreStep { +public final class SearchSortFactoryExtensionStep + implements SearchSortFactoryExtensionIfSupportedMoreStep { - private final SearchSortFactory parent; - private final SearchSortDslContext dslContext; + private final SearchSortFactory parent; + private final SearchSortDslContext dslContext; private final DslExtensionState state = new DslExtensionState<>(); - public SearchSortFactoryExtensionStep(SearchSortFactory parent, - SearchSortDslContext dslContext) { + public SearchSortFactoryExtensionStep(SearchSortFactory parent, + SearchSortDslContext dslContext) { this.parent = parent; this.dslContext = dslContext; } @Override - public SearchSortFactoryExtensionIfSupportedMoreStep ifSupported( - SearchSortFactoryExtension extension, + public SearchSortFactoryExtensionIfSupportedMoreStep ifSupported( + SearchSortFactoryExtension extension, Function sortContributor) { state.ifSupported( extension, extension.extendOptional( parent ), sortContributor ); return this; } @Override - public SortThenStep orElse(Function sortContributor) { + public SortThenStep orElse(Function, ? extends SortFinalStep> sortContributor) { SortFinalStep result = state.orElse( parent, sortContributor ); - return new StaticSortThenStep( dslContext, result.toSort() ); + return new StaticSortThenStep( dslContext, result.toSort() ); } @Override - public SortThenStep orElseFail() { + public SortThenStep orElseFail() { SortFinalStep result = state.orElseFail(); - return new StaticSortThenStep( dslContext, result.toSort() ); + return new StaticSortThenStep( dslContext, result.toSort() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/WithParametersSortFinalStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/WithParametersSortFinalStep.java index 46be99aa1b6..ea0ef71ddf7 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/WithParametersSortFinalStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/WithParametersSortFinalStep.java @@ -13,11 +13,11 @@ import org.hibernate.search.engine.search.sort.dsl.spi.SearchSortDslContext; import org.hibernate.search.engine.search.sort.spi.WithParametersSortBuilder; -public class WithParametersSortFinalStep extends AbstractSortThenStep { +public class WithParametersSortFinalStep extends AbstractSortThenStep { private final WithParametersSortBuilder builder; - public WithParametersSortFinalStep(SearchSortDslContext dslContext, + public WithParametersSortFinalStep(SearchSortDslContext dslContext, Function sortCreator) { super( dslContext ); builder = dslContext.scope().sortBuilders().withParameters(); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java index ca1be944720..d794a89eaf1 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java @@ -30,66 +30,67 @@ import org.hibernate.search.engine.spatial.GeoPoint; public abstract class AbstractSearchSortFactory< - S extends ExtendedSearchSortFactory, + SR, + S extends ExtendedSearchSortFactory, SC extends SearchSortIndexScope, - PDF extends SearchPredicateFactory> - implements ExtendedSearchSortFactory { + PDF extends SearchPredicateFactory> + implements ExtendedSearchSortFactory { - protected final SearchSortDslContext dslContext; + protected final SearchSortDslContext dslContext; - public AbstractSearchSortFactory(SearchSortDslContext dslContext) { + public AbstractSearchSortFactory(SearchSortDslContext dslContext) { this.dslContext = dslContext; } @Override - public ScoreSortOptionsStep score() { - return new ScoreSortOptionsStepImpl( dslContext ); + public ScoreSortOptionsStep score() { + return new ScoreSortOptionsStepImpl<>( dslContext ); } @Override - public SortThenStep indexOrder() { + public SortThenStep indexOrder() { return staticThenStep( dslContext.scope().sortBuilders().indexOrder() ); } @Override - public FieldSortOptionsStep field(String fieldPath) { + public FieldSortOptionsStep field(String fieldPath) { return new FieldSortOptionsStepImpl<>( dslContext, fieldPath ); } @Override - public DistanceSortOptionsStep distance(String fieldPath, GeoPoint location) { + public DistanceSortOptionsStep distance(String fieldPath, GeoPoint location) { return new DistanceSortOptionsStepImpl<>( dslContext, fieldPath, location ); } @Override - public CompositeSortComponentsStep composite() { - return new CompositeSortComponentsStepImpl( dslContext ); + public CompositeSortComponentsStep composite() { + return new CompositeSortComponentsStepImpl<>( dslContext ); } @Override - public SortThenStep composite(Consumer> elementContributor) { - CompositeSortComponentsStep next = composite(); + public SortThenStep composite(Consumer> elementContributor) { + CompositeSortComponentsStep next = composite(); elementContributor.accept( next ); return next; } @Override - public SortThenStep withParameters(Function sortCreator) { - return new WithParametersSortFinalStep( dslContext, sortCreator ); + public SortThenStep withParameters(Function sortCreator) { + return new WithParametersSortFinalStep( dslContext, sortCreator ); } @Override - public T extension(SearchSortFactoryExtension extension) { + public T extension(SearchSortFactoryExtension extension) { return DslExtensionState.returnIfSupported( extension, extension.extendOptional( this ) ); } @Override - public SearchSortFactoryExtensionIfSupportedStep extension() { - return new SearchSortFactoryExtensionStep( this, dslContext ); + public SearchSortFactoryExtensionIfSupportedStep extension() { + return new SearchSortFactoryExtensionStep<>( this, dslContext ); } @Override @@ -97,8 +98,8 @@ public final String toAbsolutePath(String relativeFieldPath) { return dslContext.scope().toAbsolutePath( relativeFieldPath ); } - protected final SortThenStep staticThenStep(SearchSort sort) { - return new StaticSortThenStep( dslContext, sort ); + protected final SortThenStep staticThenStep(SearchSort sort) { + return new StaticSortThenStep<>( dslContext, sort ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSortThenStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSortThenStep.java index 96c24a663fb..d0a70bcba9a 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSortThenStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSortThenStep.java @@ -8,17 +8,17 @@ import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory; import org.hibernate.search.engine.search.sort.dsl.SortThenStep; -public abstract class AbstractSortThenStep implements SortThenStep { - private final SearchSortDslContext parentDslContext; +public abstract class AbstractSortThenStep implements SortThenStep { + private final SearchSortDslContext parentDslContext; - private SearchSortDslContext selfDslContext; + private SearchSortDslContext selfDslContext; - public AbstractSortThenStep(SearchSortDslContext parentDslContext) { + public AbstractSortThenStep(SearchSortDslContext parentDslContext) { this.parentDslContext = parentDslContext; } @Override - public final SearchSortFactory then() { + public final SearchSortFactory then() { return selfDslContext().then(); } @@ -27,7 +27,7 @@ public SearchSort toSort() { return selfDslContext().toSort(); } - private SearchSortDslContext selfDslContext() { + private SearchSortDslContext selfDslContext() { /* * Postpone the call of build() as long as possible, * and make sure to only call it once, diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/SearchSortDslContext.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/SearchSortDslContext.java index fa25e26af22..0373b483368 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/SearchSortDslContext.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/SearchSortDslContext.java @@ -19,29 +19,33 @@ * including in particular the search scope, the sort builder factory * and the knowledge of previous sorts chained using {@link SortThenStep#then()}. * + * @param Scope root type. * @param The type of the backend-specific search scope. * @param The type of factory used to create predicates in {@link FieldSortOptionsStep#filter(Function)}. */ -public final class SearchSortDslContext, PDF extends SearchPredicateFactory> { - - public static , PDF extends SearchPredicateFactory> SearchSortDslContext root( - SC scope, - Function, SearchSortFactory> factoryProvider, - PDF predicateFactory) { +public final class SearchSortDslContext, PDF extends SearchPredicateFactory> { + + public static < + SR, + SC extends SearchSortIndexScope, + PDF extends SearchPredicateFactory> SearchSortDslContext root( + SC scope, + Function, SearchSortFactory> factoryProvider, + PDF predicateFactory) { return new SearchSortDslContext<>( scope, factoryProvider, null, null, predicateFactory ); } private final SC scope; - private final Function, SearchSortFactory> factoryProvider; - private final SearchSortDslContext parent; + private final Function, SearchSortFactory> factoryProvider; + private final SearchSortDslContext parent; private final SearchSort sort; private final PDF predicateFactory; private SearchSort compositeSort; private SearchSortDslContext(SC scope, - Function, SearchSortFactory> factoryProvider, - SearchSortDslContext parent, SearchSort sort, + Function, SearchSortFactory> factoryProvider, + SearchSortDslContext parent, SearchSort sort, PDF predicateFactory) { this.scope = scope; this.factoryProvider = factoryProvider; @@ -60,7 +64,7 @@ public SC scope() { /** * @return A new factory to be returned by {@link SortThenStep#then()}. */ - public SearchSortFactory then() { + public SearchSortFactory then() { return factoryProvider.apply( this ); } @@ -69,7 +73,7 @@ public SearchSortFactory then() { * @param newPredicateFactory The new predicate factory for the new DSL context. * @return A copy of this DSL context with its scope and predicate factory replaced with the given ones. */ - public SearchSortDslContext rescope(SC newScope, PDF newPredicateFactory) { + public SearchSortDslContext rescope(SC newScope, PDF newPredicateFactory) { return new SearchSortDslContext<>( newScope, factoryProvider, parent, sort, newPredicateFactory ); } @@ -79,7 +83,7 @@ public SearchSortDslContext rescope(SC newScope, PDF newPredicateFactor * @param sort The sort to add. * @return A new DSL context, with the given builder appended. */ - public SearchSortDslContext append(SearchSort sort) { + public SearchSortDslContext append(SearchSort sort) { return new SearchSortDslContext<>( scope, factoryProvider, this, sort, predicateFactory ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/StaticSortThenStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/StaticSortThenStep.java index 41dc008824c..d0ec18fc2d3 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/StaticSortThenStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/StaticSortThenStep.java @@ -6,10 +6,10 @@ import org.hibernate.search.engine.search.sort.SearchSort; -public final class StaticSortThenStep extends AbstractSortThenStep { +public final class StaticSortThenStep extends AbstractSortThenStep { final SearchSort sort; - public StaticSortThenStep(SearchSortDslContext parentDslContext, SearchSort sort) { + public StaticSortThenStep(SearchSortDslContext parentDslContext, SearchSort sort) { super( parentDslContext ); this.sort = sort; } diff --git a/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/ElasticsearchExtensionIT.java b/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/ElasticsearchExtensionIT.java index 14e879b645a..5b075fb169b 100644 --- a/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/ElasticsearchExtensionIT.java +++ b/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/ElasticsearchExtensionIT.java @@ -108,19 +108,19 @@ void queryContext() { StubMappingScope scope = mainIndex.createScope(); // Put intermediary contexts into variables to check they have the right type - ElasticsearchSearchQuerySelectStep context1 = + ElasticsearchSearchQuerySelectStep context1 = scope.query().extension( ElasticsearchExtension.get() ); - ElasticsearchSearchQueryWhereStep context2 = context1.select( + ElasticsearchSearchQueryWhereStep context2 = context1.select( f -> f.composite() .from( f.documentReference(), f.source() ) // We don't care about the source, it's just to test that the factory context allows ES-specific projection .as( (docRef, source) -> docRef ) ); // Note we can use Elasticsearch-specific predicates immediately - ElasticsearchSearchQueryOptionsStep context3 = + ElasticsearchSearchQueryOptionsStep context3 = context2.where( f -> f.fromJson( "{'match_all': {}}" ) ); // Note we can use Elasticsearch-specific sorts immediately - ElasticsearchSearchQueryOptionsStep context4 = + ElasticsearchSearchQueryOptionsStep context4 = context3.sort( f -> f.fromJson( "{'nativeField_sort1': 'asc'}" ) ); // Put the query and result into variables to check they have the right type @@ -132,16 +132,16 @@ void queryContext() { .hasTotalHitCount( 6 ); // Also check (at compile time) the context type for other asXXX() methods, since we need to override each method explicitly - ElasticsearchSearchQueryWhereStep selectEntityReferenceContext = + ElasticsearchSearchQueryWhereStep selectEntityReferenceContext = scope.query().extension( ElasticsearchExtension.get() ).selectEntityReference(); - ElasticsearchSearchQueryWhereStep selectEntityContext = + ElasticsearchSearchQueryWhereStep selectEntityContext = scope.query().extension( ElasticsearchExtension.get() ).selectEntity(); SearchProjection projection = scope.projection().documentReference().toProjection(); - ElasticsearchSearchQueryWhereStep selectProjectionContext = + ElasticsearchSearchQueryWhereStep selectProjectionContext = scope.query().extension( ElasticsearchExtension.get() ).select( projection ); - ElasticsearchSearchQueryWhereStep, StubLoadingOptionsStep> selectProjectionsContext = + ElasticsearchSearchQueryWhereStep, StubLoadingOptionsStep> selectProjectionsContext = scope.query().extension( ElasticsearchExtension.get() ).select( projection, projection ); - ElasticsearchSearchQueryOptionsStep defaultResultContext = + ElasticsearchSearchQueryOptionsStep defaultResultContext = scope.query().extension( ElasticsearchExtension.get() ) .where( f -> f.fromJson( "{'match_all': {}}" ) ); } diff --git a/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/search/ElasticsearchShardsFailedExceptionIT.java b/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/search/ElasticsearchShardsFailedExceptionIT.java index dd85cf0cac9..03ea46add80 100644 --- a/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/search/ElasticsearchShardsFailedExceptionIT.java +++ b/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/search/ElasticsearchShardsFailedExceptionIT.java @@ -87,7 +87,7 @@ void success() { private SearchQuery createQuery() { StubMappingScope scope = index.createScope( index2 ); - SearchPredicateFactory factory = scope.predicate(); + SearchPredicateFactory factory = scope.predicate(); SearchPredicate predicate = factory.range().field( "field" ).greaterThan( "tex" ).toPredicate(); return scope.query().where( predicate ).toQuery(); diff --git a/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/search/query/ElasticsearchBoolSearchPredicateIT.java b/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/search/query/ElasticsearchBoolSearchPredicateIT.java index 027c63e3672..18e34eb82a4 100644 --- a/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/search/query/ElasticsearchBoolSearchPredicateIT.java +++ b/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/search/query/ElasticsearchBoolSearchPredicateIT.java @@ -32,7 +32,7 @@ void setup() { @Test void resultingQueryOptimization() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertJsonEqualsIgnoringUnknownFields( "{" + @@ -128,7 +128,7 @@ void resultingQueryOptimization() { @Test void resultingQueryOptimizationWithBoost() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertJsonEqualsIgnoringUnknownFields( "{" + diff --git a/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/testsupport/util/ElasticsearchTckBackendHelper.java b/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/testsupport/util/ElasticsearchTckBackendHelper.java index b0704c31a82..4a9afb85433 100644 --- a/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/testsupport/util/ElasticsearchTckBackendHelper.java +++ b/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/testsupport/util/ElasticsearchTckBackendHelper.java @@ -99,7 +99,7 @@ public SearchSetupHelper.SetupContext startSetup(SearchSetupHelper.SetupContext } @Override - public PredicateFinalStep createSlowPredicate(SearchPredicateFactory f) { + public PredicateFinalStep createSlowPredicate(SearchPredicateFactory f) { return f.extension( ElasticsearchExtension.get() ) .fromJson( "{\"script\": {" + " \"script\": \"" @@ -116,9 +116,14 @@ public PredicateFinalStep createSlowPredicate(SearchPredicateFactory f) { @Override public < + SR, R, E, - LOS> SearchQueryDslExtension, R, E, LOS> queryDslExtension() { + LOS> SearchQueryDslExtension, + R, + E, + LOS> queryDslExtension() { return ElasticsearchExtension.get(); } } diff --git a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/LuceneExtensionIT.java b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/LuceneExtensionIT.java index 006f1b671bc..1f6c1a51048 100644 --- a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/LuceneExtensionIT.java +++ b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/LuceneExtensionIT.java @@ -125,19 +125,19 @@ void queryContext() { StubMappingScope scope = mainIndex.createScope(); // Put intermediary contexts into variables to check they have the right type - LuceneSearchQuerySelectStep context1 = + LuceneSearchQuerySelectStep context1 = scope.query().extension( LuceneExtension.get() ); - LuceneSearchQueryWhereStep context2 = context1.select( + LuceneSearchQueryWhereStep context2 = context1.select( f -> f.composite() .from( f.documentReference(), f.document() ) // We don't care about the document, it's just to test that the factory context allows Lucene-specific projection .as( (docRef, document) -> docRef ) ); // Note we can use Lucene-specific predicates immediately - LuceneSearchQueryOptionsStep context3 = + LuceneSearchQueryOptionsStep context3 = context2.where( f -> f.fromLuceneQuery( new MatchAllDocsQuery() ) ); // Note we can use Lucene-specific sorts immediately - LuceneSearchQueryOptionsStep context4 = + LuceneSearchQueryOptionsStep context4 = context3.sort( f -> f.fromLuceneSortField( new SortedSetSortField( "sort1", false ) ) ); // Put the query and result into variables to check they have the right type @@ -149,16 +149,16 @@ void queryContext() { .hasTotalHitCount( 5 ); // Also check (at compile time) the context type for other asXXX() methods, since we need to override each method explicitly - LuceneSearchQueryWhereStep selectEntityReferenceContext = + LuceneSearchQueryWhereStep selectEntityReferenceContext = scope.query().extension( LuceneExtension.get() ).selectEntityReference(); - LuceneSearchQueryWhereStep selectEntityContext = + LuceneSearchQueryWhereStep selectEntityContext = scope.query().extension( LuceneExtension.get() ).selectEntity(); SearchProjection projection = scope.projection().documentReference().toProjection(); - LuceneSearchQueryWhereStep selectProjectionContext = + LuceneSearchQueryWhereStep selectProjectionContext = scope.query().extension( LuceneExtension.get() ).select( projection ); - LuceneSearchQueryWhereStep, ?> selectProjectionsContext = + LuceneSearchQueryWhereStep, ?> selectProjectionsContext = scope.query().extension( LuceneExtension.get() ).select( projection, projection ); - LuceneSearchQueryOptionsStep defaultResultContext = + LuceneSearchQueryOptionsStep defaultResultContext = scope.query().extension( LuceneExtension.get() ) .where( f -> f.fromLuceneQuery( new MatchAllDocsQuery() ) ); } @@ -374,7 +374,7 @@ void predicate_fromLuceneQuery_separatePredicate() { void predicate_fromLuceneQuery_withRoot() { SearchQuery query = mainIndex.query() .where( f -> { - LuceneSearchPredicateFactory f2 = f.extension( LuceneExtension.get() ).withRoot( "flattenedObject" ); + LuceneSearchPredicateFactory f2 = f.extension( LuceneExtension.get() ).withRoot( "flattenedObject" ); return f2.or( f2.fromLuceneQuery( new TermQuery( new Term( f2.toAbsolutePath( "stringInObject" ), "text 2" ) ) ), f2.fromLuceneQuery( IntPoint.newExactQuery( f2.toAbsolutePath( "integerInObject" ), 3 ) ) ); @@ -478,7 +478,7 @@ void sort_fromLuceneSortField_withRoot() { assertThatQuery( mainIndex.query() .where( f -> f.matchAll() ) .sort( f -> { - LuceneSearchSortFactory f2 = f.extension( LuceneExtension.get() ).withRoot( "flattenedObject" ); + LuceneSearchSortFactory f2 = f.extension( LuceneExtension.get() ).withRoot( "flattenedObject" ); return f2.fromLuceneSortField( new SortedSetSortField( f2.toAbsolutePath( "sortInObject" ), false ) ); } ) ) .hasDocRefHitsExactOrder( mainIndex.typeName(), @@ -487,7 +487,7 @@ void sort_fromLuceneSortField_withRoot() { assertThatQuery( mainIndex.query() .where( f -> f.matchAll() ) .sort( f -> { - LuceneSearchSortFactory f2 = f.extension( LuceneExtension.get() ).withRoot( "flattenedObject" ); + LuceneSearchSortFactory f2 = f.extension( LuceneExtension.get() ).withRoot( "flattenedObject" ); return f2.fromLuceneSortField( new SortedSetSortField( f2.toAbsolutePath( "sortInObject" ), true ) ); } ) ) .hasDocRefHitsExactOrder( mainIndex.typeName(), diff --git a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/cache/LuceneQueryCacheConfigurerIT.java b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/cache/LuceneQueryCacheConfigurerIT.java index 2b5bf991c4f..3dde7af3036 100644 --- a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/cache/LuceneQueryCacheConfigurerIT.java +++ b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/cache/LuceneQueryCacheConfigurerIT.java @@ -103,7 +103,7 @@ private void setup(String queryCacheConfigurer, Consumer bi .setup(); } - private SearchQueryOptionsStep matchAllQuery() { + private SearchQueryOptionsStep matchAllQuery() { return index.query() .where( f -> f.matchAll() ); } diff --git a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneBoolSearchPredicateIT.java b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneBoolSearchPredicateIT.java index 32def60e545..6ffbfcbe69f 100644 --- a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneBoolSearchPredicateIT.java +++ b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneBoolSearchPredicateIT.java @@ -55,7 +55,7 @@ void minimumShouldMatch_outOfBounds() { @Test void resultingQueryOptimization() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThat( index.query() .where( f.bool() @@ -93,7 +93,7 @@ void resultingQueryOptimization() { @Test void resultingQueryOptimizationWithBoost() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); // by default Lucene bool query would have a filter on match all assertThat( index.query() diff --git a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneFloatingPointInfinitySearchIT.java b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneFloatingPointInfinitySearchIT.java index a369443af6b..ffdda864ca8 100644 --- a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneFloatingPointInfinitySearchIT.java +++ b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneFloatingPointInfinitySearchIT.java @@ -165,7 +165,7 @@ void double_infinityExcluded() { ); } - private SearchQueryOptionsStep matchAllQuery() { + private SearchQueryOptionsStep matchAllQuery() { return index.createScope().query().where( f -> f.matchAll() ); } diff --git a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneSearchTopDocsMergeFieldSortIT.java b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneSearchTopDocsMergeFieldSortIT.java index 8b8d54b8a15..dab92e88bd1 100644 --- a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneSearchTopDocsMergeFieldSortIT.java +++ b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/search/LuceneSearchTopDocsMergeFieldSortIT.java @@ -204,7 +204,7 @@ private LuceneSearchQuery matchNonEmptySortedByFieldQuery(Dat .toQuery(); } - private FieldSortOptionsStep applySortMode(FieldSortOptionsStep optionsStep, SortMode sortMode) { + private FieldSortOptionsStep applySortMode(FieldSortOptionsStep optionsStep, SortMode sortMode) { if ( sortMode != null ) { return optionsStep.mode( sortMode ); } @@ -213,7 +213,7 @@ private LuceneSearchQuery matchNonEmptySortedByFieldQuery(Dat } } - private FieldSortOptionsStep applyFilter(FieldSortOptionsStep optionsStep, + private FieldSortOptionsStep applyFilter(FieldSortOptionsStep optionsStep, TestedFieldStructure fieldStructure) { if ( fieldStructure.isInNested() ) { return optionsStep.filter( f -> f.match() diff --git a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/testsupport/util/LuceneTckBackendHelper.java b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/testsupport/util/LuceneTckBackendHelper.java index 317b16cfb93..5eb23106231 100644 --- a/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/testsupport/util/LuceneTckBackendHelper.java +++ b/integrationtest/backend/lucene/src/test/java/org/hibernate/search/integrationtest/backend/lucene/testsupport/util/LuceneTckBackendHelper.java @@ -82,16 +82,21 @@ public TckBackendSetupStrategy createRarePeriodicRefreshBackendSetupStrategy( } @Override - public PredicateFinalStep createSlowPredicate(SearchPredicateFactory f) { + public PredicateFinalStep createSlowPredicate(SearchPredicateFactory f) { return f.extension( LuceneExtension.get() ) .fromLuceneQuery( new SlowQuery( 100 ) ); } @Override public < + SR, R, E, - LOS> SearchQueryDslExtension, R, E, LOS> queryDslExtension() { + LOS> SearchQueryDslExtension, + R, + E, + LOS> queryDslExtension() { return LuceneExtension.get(); } } 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 9e11ca36230..14e70ac10f2 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 @@ -268,7 +268,7 @@ void parentTemplate_wrongType(TestedFieldStructure fieldStructure) { } private SearchQuery query( - Function predicateContributor, + Function, ? extends PredicateFinalStep> predicateContributor, TestedFieldStructure fieldStructure) { return index.createScope().query() .where( f -> { 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 8c6b4ad175e..68b03d18a4f 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 @@ -480,7 +480,7 @@ void exists_dynamicObjectField() { } private SearchQuery query( - Function predicateContributor) { + Function, ? extends PredicateFinalStep> predicateContributor) { return index.createScope().query() .where( predicateContributor ) .toQuery(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/AggregationBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/AggregationBaseIT.java index c7bf90a8c4b..102b0658097 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/AggregationBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/AggregationBaseIT.java @@ -149,26 +149,26 @@ private static class ObjectFieldBinding { } } - private static class SupportedExtension implements SearchAggregationFactoryExtension { + private static class SupportedExtension implements SearchAggregationFactoryExtension { @Override - public Optional extendOptional(SearchAggregationFactory original) { + public Optional extendOptional(SearchAggregationFactory original) { assertThat( original ).isNotNull(); return Optional.of( new MyExtendedFactory( original ) ); } } - private static class UnSupportedExtension implements SearchAggregationFactoryExtension { + private static class UnSupportedExtension implements SearchAggregationFactoryExtension { @Override - public Optional extendOptional(SearchAggregationFactory original) { + public Optional extendOptional(SearchAggregationFactory original) { assertThat( original ).isNotNull(); return Optional.empty(); } } private static class MyExtendedFactory { - private final SearchAggregationFactory delegate; + private final SearchAggregationFactory delegate; - MyExtendedFactory(SearchAggregationFactory delegate) { + MyExtendedFactory(SearchAggregationFactory delegate) { this.delegate = delegate; } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/MetricNumericFieldsAggregationsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/MetricNumericFieldsAggregationsIT.java index 735dde12b03..994c6e7eae2 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/MetricNumericFieldsAggregationsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/MetricNumericFieldsAggregationsIT.java @@ -80,7 +80,7 @@ void setup() { @Test void test_filteringResults() { StubMappingScope scope = mainIndex.createScope(); - SearchQueryOptionsStep options = scope.query() + SearchQueryOptionsStep options = scope.query() .where( f -> f.match().field( "style" ).matching( "bla" ) ); SearchQuery query = defineAggregations( options ); @@ -122,7 +122,7 @@ void test_filteringResults() { @Test void test_allResults() { StubMappingScope scope = mainIndex.createScope(); - SearchQueryOptionsStep options = scope.query() + SearchQueryOptionsStep options = scope.query() .where( f -> f.matchAll() ); SearchQuery query = defineAggregations( options ); @@ -162,7 +162,7 @@ void test_allResults() { } private SearchQuery defineAggregations( - SearchQueryOptionsStep options) { + SearchQueryOptionsStep options) { options.aggregation( sumIntegersRaw, f -> f.sum().field( "integer", Object.class, ValueModel.RAW ) ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/RangeAggregationSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/RangeAggregationSpecificsIT.java index 1cc924d123f..e357094c0ce 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/RangeAggregationSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/RangeAggregationSpecificsIT.java @@ -516,7 +516,7 @@ void rangeOverlap_parmeters(FieldTypeDescriptor fieldType, DataSet data AggregationKey, Long>> aggregationKey = AggregationKey.of( AGGREGATION_NAME ); - SearchAggregationFactory af = index.createScope().aggregation(); + SearchAggregationFactory af = index.createScope().aggregation(); var aggregation = af.withParameters( param -> af.range().field( fieldPath, fieldType.getJavaType() ) .range( param.get( "range1", Range.class ) ) @@ -565,7 +565,7 @@ private void assumeNonCanonicalRangesSupported() { ); } - private SearchQueryOptionsStep matchAllQuery() { + private SearchQueryOptionsStep matchAllQuery() { return index.createScope().query().where( f -> f.matchAll() ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/SingleFieldAggregationBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/SingleFieldAggregationBaseIT.java index ffc8a007103..cd46fac7730 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/SingleFieldAggregationBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/SingleFieldAggregationBaseIT.java @@ -258,7 +258,7 @@ void factoryWithRoot(SupportedSingleFieldAggregationExpectations expectations } private void testValidAggregation(AggregationScenario scenario, StubMappingScope scope, - String fieldPath, Function filterOrNull, + String fieldPath, Function, ? extends PredicateFinalStep> filterOrNull, DataSet dataSet) { testValidAggregation( scenario, scope, @@ -269,8 +269,8 @@ private void testValidAggregation(AggregationScenario scenario, StubMappi } private void testValidAggregation(AggregationScenario scenario, StubMappingScope scope, - Function predicateContributor, - BiFunction, AggregationFinalStep> aggregationContributor, + Function, ? extends PredicateFinalStep> predicateContributor, + BiFunction, AggregationScenario, AggregationFinalStep> aggregationContributor, DataSet dataSet) { AggregationKey aggregationKey = AggregationKey.of( AGGREGATION_NAME ); assertThatQuery( @@ -303,12 +303,12 @@ private String getFieldPath(SingleFieldIndexBinding indexBinding, TestedFieldStr return indexBinding.getFieldPath( fieldStructure, fieldType ); } - private Function getFilterOrNull( + private Function, ? extends PredicateFinalStep> getFilterOrNull( SingleFieldIndexBinding binding, TestedFieldStructure fieldStructure) { return getFilterOrNull( binding.getDiscriminatorFieldPath( fieldStructure ), fieldStructure ); } - private Function getFilterOrNull( + private Function, ? extends PredicateFinalStep> getFilterOrNull( String discriminatorPath, TestedFieldStructure fieldStructure) { if ( fieldStructure.isInNested() ) { return pf -> pf.match() diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/SingleFieldAggregationTypeCheckingAndConversionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/SingleFieldAggregationTypeCheckingAndConversionIT.java index 1c733c0a299..d1016e48662 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/SingleFieldAggregationTypeCheckingAndConversionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/SingleFieldAggregationTypeCheckingAndConversionIT.java @@ -766,8 +766,8 @@ private void testValidAggregationWithConverterSetting(AggregationScenario } private void testValidAggregation(AggregationScenario scenario, StubMappingScope scope, - Function predicateContributor, - BiFunction, AggregationFinalStep> aggregationContributor, + Function, ? extends PredicateFinalStep> predicateContributor, + BiFunction, AggregationScenario, AggregationFinalStep> aggregationContributor, DataSet dataSet) { AggregationKey aggregationKey = AggregationKey.of( AGGREGATION_NAME ); assertThatQuery( diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/TermsAggregationSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/TermsAggregationSpecificsIT.java index 15182357f95..a3b9fdeaa50 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/TermsAggregationSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/TermsAggregationSpecificsIT.java @@ -622,7 +622,7 @@ void maxTermCount_veryLarge(FieldTypeDescriptor fieldType, DataSet data ); } - private SearchQueryOptionsStep matchAllQuery() { + private SearchQueryOptionsStep matchAllQuery() { return index.createScope().query().where( f -> f.matchAll() ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/bool/BooleanSortAndRangePredicateIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/bool/BooleanSortAndRangePredicateIT.java index 324334f77fe..98d87cba0e2 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/bool/BooleanSortAndRangePredicateIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/bool/BooleanSortAndRangePredicateIT.java @@ -56,7 +56,7 @@ void setup() { } private SearchQuery sortQuery( - Function sortContributor) { + Function, ? extends SortFinalStep> sortContributor) { StubMappingScope scope = index.createScope(); return scope.query() .where( f -> f.matchAll() ) @@ -64,7 +64,7 @@ private SearchQuery sortQuery( .toQuery(); } - private SearchQuery rangeQuery(Function rangePredicate) { + private SearchQuery rangeQuery(Function, PredicateFinalStep> rangePredicate) { StubMappingScope scope = index.createScope(); return scope.query() .where( rangePredicate ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateBaseIT.java index 5e483f89c26..0b048cc000d 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateBaseIT.java @@ -119,7 +119,7 @@ private static CommonQueryStringPredicateTestValues testValues(FieldTypeDescr class SingleFieldIT extends SingleFieldConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -145,13 +145,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f ).field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet> dataSet) { return f.withParameters( params -> predicate( f ).field( fieldPath ) .matching( params.get( paramName, String.class ) ) ); @@ -163,14 +163,14 @@ protected Map parameterValues(int matchingDocOrdinal, return Map.of( paramName, dataSet.values.matchingArg( matchingDocOrdinal ) ); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class MultiFieldIT extends MultiFieldConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -195,33 +195,33 @@ public static List params() { } @Override - protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f ).field( fieldPath ).field( otherFieldPath ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, + protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f ).fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f ).field( fieldPath ).fields( fieldPaths ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class InObjectFieldIT extends InObjectFieldConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -251,19 +251,19 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f ).field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class AnalysisIT extends AnalysisConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -283,30 +283,30 @@ public AnalysisConfigured() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String matchingParam) { + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String matchingParam) { return predicate( f ).field( fieldPath ).matching( matchingParam ); } @Override - protected PredicateFinalStep predicateWithAnalyzerOverride(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithAnalyzerOverride(SearchPredicateFactory f, String fieldPath, String matchingParam, String analyzerName) { return predicate( f ).field( fieldPath ).matching( matchingParam ).analyzer( analyzerName ); } @Override - protected PredicateFinalStep predicateWithSkipAnalysis(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithSkipAnalysis(SearchPredicateFactory f, String fieldPath, String matchingParam) { return predicate( f ).field( fieldPath ).matching( matchingParam ).skipAnalysis(); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class ScoreIT extends ScoreConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -338,14 +338,14 @@ public void constantScore_fieldLevelBoost(SimpleMappedIndex index, } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f ).field( fieldPath ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f ).fields( fieldPaths ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) @@ -353,7 +353,7 @@ protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return predicate( f ).fields( fieldPaths ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) @@ -361,7 +361,7 @@ protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFac } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return predicate( f ).fields( fieldPaths ) @@ -370,14 +370,14 @@ protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(Se } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f ).field( fieldPath ).boost( fieldBoost ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f ).field( fieldPath ).boost( fieldBoost ) @@ -386,7 +386,7 @@ protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(Search } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return predicate( f ).field( fieldPath ).boost( fieldBoost ) @@ -394,14 +394,14 @@ protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost( .boost( predicateBoost ); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class InvalidFieldIT extends InvalidFieldConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } @@ -421,20 +421,20 @@ protected InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { predicate( f ).field( fieldPath ); } protected abstract String predicateTrait(); - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class UnsupportedTypeIT extends UnsupportedTypeConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } @@ -461,13 +461,13 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { predicate( f ).field( fieldPath ); } protected abstract String predicateTrait(); - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested @@ -475,7 +475,7 @@ class SearchableIT extends SearchableConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } @@ -509,20 +509,20 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { predicate( f ).field( fieldPath ); } protected abstract String predicateTrait(); - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class ArgumentCheckingIT extends ArgumentCheckingConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -544,18 +544,18 @@ public static List params() { } @Override - protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { predicate( f ).field( fieldPath ).matching( null ); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class TypeCheckingNoConversionIT extends TypeCheckingNoConversionConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } @@ -599,13 +599,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f ).field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f ).field( field0Path ).field( field1Path ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); @@ -613,10 +613,10 @@ protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Pa protected abstract String predicateTrait(); - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } - abstract P predicate(SearchPredicateFactory f); + abstract P predicate(SearchPredicateFactory f); protected abstract String predicateTrait(); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateSpecificsIT.java index 6a7112cecb0..cbe1f54f093 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateSpecificsIT.java @@ -505,5 +505,5 @@ private static String escape(String value) { return value; } - abstract P predicate(SearchPredicateFactory f); + abstract P predicate(SearchPredicateFactory f); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateArgumentCheckingIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateArgumentCheckingIT.java index 59a551dd8a6..50954a10e9b 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateArgumentCheckingIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateArgumentCheckingIT.java @@ -23,14 +23,14 @@ public abstract class AbstractPredicateArgumentCheckingIT { @ParameterizedTest(name = "{1}") @MethodSource("params") void nullMatchingParam(SimpleMappedIndex index, FieldTypeDescriptor fieldType) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> tryPredicateWithNullMatchingParam( f, fieldPath( index, fieldType ) ) ) .isInstanceOf( IllegalArgumentException.class ) .hasMessageContainingAll( "must not be null" ); } - protected abstract void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath); + protected abstract void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath); protected String fieldPath(SimpleMappedIndex index, FieldTypeDescriptor fieldType) { return index.binding().field.get( fieldType ).relativeFieldName; diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateConfigurableAnalysisIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateConfigurableAnalysisIT.java index 900edc6e4e8..8163cfc2eaf 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateConfigurableAnalysisIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateConfigurableAnalysisIT.java @@ -178,9 +178,9 @@ void multiIndex_incompatibleAnalyzer_skipAnalysis() { } ); } - protected abstract PredicateFinalStep predicateWithAnalyzerOverride(SearchPredicateFactory f, String fieldPath, + protected abstract PredicateFinalStep predicateWithAnalyzerOverride(SearchPredicateFactory f, String fieldPath, String matchingParam, String analyzerName); - protected abstract PredicateFinalStep predicateWithSkipAnalysis(SearchPredicateFactory f, String fieldPath, + protected abstract PredicateFinalStep predicateWithSkipAnalysis(SearchPredicateFactory f, String fieldPath, String matchingParam); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateFieldInObjectFieldIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateFieldInObjectFieldIT.java index 2e6d79ae35a..bfe1b752b97 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateFieldInObjectFieldIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateFieldInObjectFieldIT.java @@ -81,20 +81,20 @@ void inNamedPredicate_flattened(SimpleMappedIndex mainIndex, @Override @SuppressWarnings("unchecked") - protected final PredicateFinalStep predicate(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, + protected final PredicateFinalStep predicate(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, int matchingDocOrdinal, AbstractPredicateDataSet dataSet) { return predicate( f, objectFieldBinding.absoluteFieldPath( ( (DataSet) dataSet ).fieldType ), matchingDocOrdinal, (DataSet) dataSet ); } - protected final PredicateFinalStep predicateWithRelativePath(SearchPredicateFactory f, + protected final PredicateFinalStep predicateWithRelativePath(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, int matchingDocOrdinal, DataSet dataSet) { return predicate( f, objectFieldBinding.relativeFieldPath( dataSet.fieldType ), matchingDocOrdinal, dataSet ); } - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet); public static final class DataSet> diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateFieldScoreIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateFieldScoreIT.java index e394e5021db..6b5a690b004 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateFieldScoreIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateFieldScoreIT.java @@ -79,7 +79,7 @@ void predicateLevelBoost_fieldLevelBoost(SimpleMappedIndex index, void constantScore_fieldLevelBoost(SimpleMappedIndex index, DataSet dataSet) { assumeConstantScoreSupported(); - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicateWithFieldLevelBoostAndConstantScore( f, field0Path( index, dataSet ), 2.1f, 0, dataSet @@ -130,7 +130,7 @@ void predicateLevelBoost_multiFields(SimpleMappedIndex index, Data @SuppressWarnings("unchecked") @Override - protected final PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected final PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return predicate( f, field0Path( (SimpleMappedIndex) index, (DataSet) dataSet ), matchingDocOrdinal, @@ -140,7 +140,7 @@ f, field0Path( (SimpleMappedIndex) index, (DataSet) dataSet @SuppressWarnings("unchecked") @Override - protected final PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, + protected final PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return predicateWithPredicateLevelBoost( f, new String[] { field0Path( @@ -154,7 +154,7 @@ protected final PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, @SuppressWarnings("unchecked") @Override - protected final PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, + protected final PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return predicateWithConstantScore( f, new String[] { field0Path( (SimpleMappedIndex) index, (DataSet) dataSet ) }, @@ -164,7 +164,7 @@ protected final PredicateFinalStep predicateWithConstantScore(SearchPredicateFac @SuppressWarnings("unchecked") @Override - protected final PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected final PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return predicateWithConstantScoreAndPredicateLevelBoost( f, @@ -173,28 +173,28 @@ protected final PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPred ); } - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet); - protected abstract PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, + protected abstract PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet); - protected abstract PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, + protected abstract PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet); - protected abstract PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected abstract PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet); - protected abstract PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, + protected abstract PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet); - protected abstract PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected abstract PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet dataSet); - protected abstract PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected abstract PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet); private String field0Path(SimpleMappedIndex index, DataSet dataSet) { 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 8f91696d6c0..e2861af2ae2 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 @@ -180,7 +180,7 @@ void multiIndex_missingNestedField_implicit(SimpleMappedIndex main .hasTotalHitCount( 2 ); } - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, int matchingDocOrdinal, AbstractPredicateDataSet dataSet); abstract static class AbstractObjectBinding { @@ -326,7 +326,7 @@ public static class StubPredicateDefinition implements PredicateDefinition { public static final String IMPL_PARAM_NAME = "impl"; @Override - public SearchPredicate create(PredicateDefinitionContext context) { + public SearchPredicate create(PredicateDefinitionContext context) { PredicateDefinition impl = context.params().get( IMPL_PARAM_NAME, PredicateDefinition.class ); return impl.create( context ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateInvalidFieldIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateInvalidFieldIT.java index 224a25d8b63..7ae74f5a3e7 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateInvalidFieldIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateInvalidFieldIT.java @@ -27,7 +27,7 @@ protected AbstractPredicateInvalidFieldIT(SimpleMappedIndex index) @Test void use_unknownField() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> tryPredicate( f, "unknown_field" ) ) .isInstanceOf( SearchException.class ) @@ -57,7 +57,7 @@ void trait_objectField_flattened() { @Test void use_objectField_nested() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); String fieldPath = index.binding().nested.relativeFieldName; @@ -68,7 +68,7 @@ void use_objectField_nested() { @Test void use_objectField_flattened() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); String fieldPath = index.binding().flattened.relativeFieldName; @@ -77,7 +77,7 @@ void use_objectField_flattened() { .hasMessageContaining( "Cannot use '" + predicateTrait() + "' on field '" + fieldPath + "'" ); } - protected abstract void tryPredicate(SearchPredicateFactory f, String fieldPath); + protected abstract void tryPredicate(SearchPredicateFactory f, String fieldPath); protected abstract String predicateTrait(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateMultiFieldIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateMultiFieldIT.java index db512b3b8fd..b27f0bcc379 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateMultiFieldIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateMultiFieldIT.java @@ -87,14 +87,14 @@ void fieldAndFields(SimpleMappedIndex index, DataSet dataSet } } - protected abstract PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected abstract PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet dataSet); - protected abstract PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, + protected abstract PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet); - protected abstract PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected abstract PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet); private String field0Path(SimpleMappedIndex index, DataSet dataSet) { diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateScaleCheckingIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateScaleCheckingIT.java index 8f86d3f301c..0453be3919f 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateScaleCheckingIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateScaleCheckingIT.java @@ -89,7 +89,7 @@ void multiIndex_withIncompatibleIndex() { ) ); } - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam); + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam); protected abstract String predicateTrait(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateScoreIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateScoreIT.java index a3fd75d949e..b17e70a355f 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateScoreIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateScoreIT.java @@ -77,18 +77,18 @@ void constantScore_predicateLevelBoost(StubMappedIndex index, AbstractPredicateD .hasDocRefHitsExactOrder( index.typeName(), dataSet.docId( 0 ), dataSet.docId( 1 ) ); } - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index); - protected abstract PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, + protected abstract PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index); - protected abstract PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, + protected abstract PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index); - protected abstract PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected abstract PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSearchableIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSearchableIT.java index afca6623a1f..07c3f7ffcd6 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSearchableIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSearchableIT.java @@ -71,7 +71,7 @@ void searchable_no_use(SimpleMappedIndex searchab SimpleMappedIndex searchableYesIndex, SimpleMappedIndex searchableNoIndex, FieldTypeDescriptor fieldType) { - SearchPredicateFactory f = searchableNoIndex.createScope().predicate(); + SearchPredicateFactory f = searchableNoIndex.createScope().predicate(); String fieldPath = searchableNoIndex.binding().field.get( fieldType ).relativeFieldName; @@ -89,7 +89,7 @@ void multiIndex_incompatibleSearchable(SimpleMappedIndex searchableYesIndex, SimpleMappedIndex searchableNoIndex, FieldTypeDescriptor fieldType) { - SearchPredicateFactory f = searchableYesIndex.createScope( searchableNoIndex ).predicate(); + SearchPredicateFactory f = searchableYesIndex.createScope( searchableNoIndex ).predicate(); String fieldPath = searchableYesIndex.binding().field.get( fieldType ).relativeFieldName; @@ -101,7 +101,7 @@ void multiIndex_incompatibleSearchable(SimpleMappedIndex f, String fieldPath, FieldTypeDescriptor fieldType); protected abstract String predicateTrait(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSimpleAnalysisIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSimpleAnalysisIT.java index d0b72ef6ea7..bd407814731 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSimpleAnalysisIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSimpleAnalysisIT.java @@ -107,7 +107,7 @@ void multiIndex_incompatibleAnalyzer_searchAnalyzer() { } ); } - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String matchingParam); + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String matchingParam); public static final class IndexBinding { final SimpleFieldModel analyzedStringField; diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSingleFieldIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSingleFieldIT.java index a10fe8a8963..2b3921b31d0 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSingleFieldIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateSingleFieldIT.java @@ -87,10 +87,10 @@ protected boolean produceMultipleResults() { return false; } - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet); - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet dataSet); protected abstract Map parameterValues(int matchingDocOrdinal, DataSet dataSet, String paramName); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateTypeCheckingAndConversionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateTypeCheckingAndConversionIT.java index 51568c5b532..27f1ff4f8a7 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateTypeCheckingAndConversionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateTypeCheckingAndConversionIT.java @@ -67,7 +67,7 @@ void defaultDslConverter_valueModelDefault_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, defaultDslConverterField0Path( index, dataSet ), invalidTypeParam() ) ) .isInstanceOf( SearchException.class ) .hasMessageContaining( "Unable to convert DSL argument: " ) @@ -102,7 +102,7 @@ void customDslConverter_valueModelDefault_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, customDslConverterField0Path( index, dataSet ), invalidTypeParam() ) ) .isInstanceOf( SearchException.class ) .hasMessageContaining( "Unable to convert DSL argument: " ) @@ -153,7 +153,7 @@ void defaultDslConverter_valueConvertYes_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, defaultDslConverterField0Path( index, dataSet ), invalidTypeParam(), ValueModel.MAPPING ) ) .isInstanceOf( SearchException.class ) @@ -188,7 +188,7 @@ void customDslConverter_valueModelMapping_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, customDslConverterField0Path( index, dataSet ), invalidTypeParam(), ValueModel.MAPPING ) ) .isInstanceOf( SearchException.class ) @@ -209,7 +209,7 @@ void customDslConverter_valueConvertYes_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, customDslConverterField0Path( index, dataSet ), invalidTypeParam(), org.hibernate.search.engine.search.common.ValueConvert.YES ) ) .isInstanceOf( SearchException.class ) @@ -260,7 +260,7 @@ void defaultDslConverter_valueModelIndex_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, defaultDslConverterField0Path( index, dataSet ), invalidTypeParam(), ValueModel.INDEX ) ) .isInstanceOf( SearchException.class ) @@ -281,7 +281,7 @@ void defaultDslConverter_valueConvertNo_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, defaultDslConverterField0Path( index, dataSet ), invalidTypeParam(), org.hibernate.search.engine.search.common.ValueConvert.NO ) ) .isInstanceOf( SearchException.class ) @@ -332,7 +332,7 @@ void customDslConverter_valueModelIndex_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, customDslConverterField0Path( index, dataSet ), invalidTypeParam(), ValueModel.INDEX ) ) .isInstanceOf( SearchException.class ) @@ -353,7 +353,7 @@ void customDslConverter_valueConvertNo_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, customDslConverterField0Path( index, dataSet ), invalidTypeParam(), org.hibernate.search.engine.search.common.ValueConvert.NO ) ) .isInstanceOf( SearchException.class ) @@ -670,7 +670,7 @@ void defaultDslConverter_valueModelString_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, defaultDslConverterField0Path( index, dataSet ), invalidTypeParam(), ValueModel.STRING ) ) .isInstanceOf( SearchException.class ) @@ -705,7 +705,7 @@ void customDslConverter_valueModelString_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, customDslConverterField0Path( index, dataSet ), invalidTypeParam(), ValueModel.STRING ) ) .isInstanceOf( SearchException.class ) @@ -751,7 +751,7 @@ void defaultDslConverter_valueModelRaw_invalidType(SimpleMappedIndex missingFieldIndex, SimpleMappedIndex incompatibleIndex, DataSet dataSet) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> predicate( f, defaultDslConverterField0Path( index, dataSet ), invalidTypeParam(), ValueModel.RAW ) ) .isInstanceOf( SearchException.class ) @@ -763,20 +763,20 @@ void defaultDslConverter_valueModelRaw_invalidType(SimpleMappedIndex f, String fieldPath, P matchingParam); - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, P matchingParam, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, P matchingParam, ValueModel valueModel); - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, P matchingParam, ValueModel valueModel); @Deprecated(since = "test") - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, P matchingParam, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, P matchingParam, org.hibernate.search.engine.search.common.ValueConvert valueConvert); @Deprecated(since = "test") - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, P matchingParam, org.hibernate.search.engine.search.common.ValueConvert valueConvert); protected abstract P invalidTypeParam(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateTypeCheckingNoConversionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateTypeCheckingNoConversionIT.java index 93e2b8f0ef6..3b4458d307a 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateTypeCheckingNoConversionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateTypeCheckingNoConversionIT.java @@ -179,10 +179,10 @@ void multiIndex_withIncompatibleIndex(SimpleMappedIndex index, ) ); } - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet); - protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected abstract PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, int matchingDocOrdinal, DataSet dataSet); protected abstract String predicateTrait(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateUnsupportedTypeIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateUnsupportedTypeIT.java index d3b3f8d95a9..dc3bf88e4b1 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateUnsupportedTypeIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractPredicateUnsupportedTypeIT.java @@ -38,7 +38,7 @@ void trait(SimpleMappedIndex index, FieldTypeDescriptor fiel @ParameterizedTest(name = "{1}") @MethodSource("params") void use(SimpleMappedIndex index, FieldTypeDescriptor fieldType) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); String fieldPath = index.binding().field.get( fieldType ).relativeFieldName; @@ -53,7 +53,7 @@ void use(SimpleMappedIndex index, FieldTypeDescriptor fieldT ) ); } - protected abstract void tryPredicate(SearchPredicateFactory f, String fieldPath); + protected abstract void tryPredicate(SearchPredicateFactory f, String fieldPath); protected abstract String predicateTrait(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AndPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AndPredicateBaseIT.java index 2e1fff20abf..f51d0e0c7ea 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AndPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AndPredicateBaseIT.java @@ -60,13 +60,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.and( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ); } @Override - protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.and( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) @@ -74,14 +74,14 @@ protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int ma } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.and( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) .constantScore(); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.and( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) @@ -117,14 +117,14 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.and() .add( f.id().matching( AddScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ); } @Override - protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.and( f.id().matching( AddScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) @@ -132,7 +132,7 @@ protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int ma } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.and() .add( f.id().matching( AddScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) @@ -140,7 +140,7 @@ protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f } @Override - protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.and() diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/BoolPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/BoolPredicateBaseIT.java index 2d260e82836..bdc34a64745 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/BoolPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/BoolPredicateBaseIT.java @@ -55,13 +55,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.bool().should( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ); } @Override - protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.bool().should( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) @@ -69,14 +69,14 @@ protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int ma } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.bool().should( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) .constantScore(); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.bool().should( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) 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 8e400551c37..5cf3f997ff6 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 @@ -657,7 +657,7 @@ void minimumShouldMatch_multipleConstraints_0ceiling() { @Test void minimumShouldMatch_error_negativeCeiling() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> f.bool().minimumShouldMatch() .ifMoreThan( -1 ).thenRequireNumber( 1 ) ) @@ -674,7 +674,7 @@ void minimumShouldMatch_error_negativeCeiling() { @Test void minimumShouldMatch_error_multipleConflictingCeilings() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> f.bool().minimumShouldMatch() .ifMoreThan( 2 ).thenRequireNumber( -1 ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateBaseIT.java index 0b0f0d41193..b0dbe2a1aed 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateBaseIT.java @@ -131,13 +131,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.exists().field( fieldPath ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet> dataSet) { assumeTrue( false, "Exists predicate does not have parameters" ); throw new AssertionFailure( "shouldn't reach this far" ); @@ -175,26 +175,26 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.exists().field( fieldPath( matchingDocOrdinal, dataSet ) ); } @Override - protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.exists().field( fieldPath( matchingDocOrdinal, dataSet ) ).boost( boost ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.exists().field( fieldPath( matchingDocOrdinal, dataSet ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.exists().field( fieldPath( matchingDocOrdinal, dataSet ) ).constantScore().boost( boost ); @@ -274,7 +274,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { if ( matchingDocOrdinal != 0 ) { throw new IllegalStateException( "This predicate can only match the first document" ); @@ -317,7 +317,7 @@ public void use_objectField_nested() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.exists().field( fieldPath ); } @@ -379,7 +379,7 @@ void searchable_no_use(SimpleMappedIndex searchab } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.exists().field( fieldPath ); } @@ -447,13 +447,13 @@ public void multiIndex_withIncompatibleIndex(SimpleMappedIndex ind } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.exists().field( fieldPath ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, int matchingDocOrdinal, DataSet> dataSet) { throw new org.opentest4j.TestAbortedException( "The 'exists' predicate can only target one field at a time" ); } @@ -491,7 +491,7 @@ public void multiIndex_withIncompatibleIndex() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { return f.exists().field( fieldPath ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateObjectsBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateObjectsBaseIT.java index 3d780e9bd52..616b42d32b2 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateObjectsBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateObjectsBaseIT.java @@ -127,7 +127,7 @@ void factoryWithRoot_flattened(SimpleMappedIndex mainIndex, } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, + protected PredicateFinalStep predicate(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, int matchingDocOrdinal, AbstractPredicateDataSet dataSet) { if ( matchingDocOrdinal != 0 ) { throw new IllegalStateException( "This predicate can only match the first document" ); @@ -135,7 +135,8 @@ protected PredicateFinalStep predicate(SearchPredicateFactory f, ObjectFieldBind return f.exists().field( targetField( objectFieldBinding, ( (DataSet) dataSet ) ).absolutePath ); } - protected PredicateFinalStep predicateWithRelativePath(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, + protected PredicateFinalStep predicateWithRelativePath(SearchPredicateFactory f, + ObjectFieldBinding objectFieldBinding, AbstractPredicateDataSet dataSet) { return f.exists().field( targetField( objectFieldBinding, ( (DataSet) dataSet ) ).relativeName ); } @@ -192,26 +193,26 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.exists().field( fieldPath( matchingDocOrdinal, dataSet ) ); } @Override - protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.exists().field( fieldPath( matchingDocOrdinal, dataSet ) ).boost( boost ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.exists().field( fieldPath( matchingDocOrdinal, dataSet ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.exists().field( fieldPath( matchingDocOrdinal, dataSet ) ).constantScore().boost( boost ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateObjectsSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateObjectsSpecificsIT.java index 33de0bf9924..2771f98e85c 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateObjectsSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/ExistsPredicateObjectsSpecificsIT.java @@ -122,7 +122,7 @@ void nested_multiIndexes_compatibleIndexBinding() { @Test void nested_multiIndexes_incompatibleIndexBinding() { - SearchPredicateFactory f = mainIndex.createScope( incompatibleIndex ).predicate(); + SearchPredicateFactory f = mainIndex.createScope( incompatibleIndex ).predicate(); String fieldPath = "nested"; assertThatThrownBy( () -> f.exists().field( fieldPath ) ) @@ -148,7 +148,7 @@ void nested_multiIndexes_emptyIndexBinding() { @Test void nested_multiIndexes_wrongStructure() { - SearchPredicateFactory f = mainIndex.createScope( invertedIndex ).predicate(); + SearchPredicateFactory f = mainIndex.createScope( invertedIndex ).predicate(); String fieldPath = "nested"; @@ -218,7 +218,7 @@ void flattened_multiIndexes_compatibleIndexBinding() { @Test void flattened_multiIndexes_incompatibleIndexBinding() { - SearchPredicateFactory f = incompatibleIndex.createScope( mainIndex ).predicate(); + SearchPredicateFactory f = incompatibleIndex.createScope( mainIndex ).predicate(); String fieldPath = "flattened"; assertThatThrownBy( () -> f.exists().field( fieldPath ) ) @@ -244,7 +244,7 @@ void flattened_multiIndexes_emptyIndexBinding() { @Test void flattened_multiIndexes_wrongStructure() { - SearchPredicateFactory f = invertedIndex.createScope( mainIndex ).predicate(); + SearchPredicateFactory f = invertedIndex.createScope( mainIndex ).predicate(); String fieldPath = "flattened"; diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/KnnPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/KnnPredicateBaseIT.java index 025b91c9e7a..6f2c1b24b34 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/KnnPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/KnnPredicateBaseIT.java @@ -106,14 +106,14 @@ protected boolean produceMultipleResults() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return knnPredicateOptionsStep( f, fieldPath, matchingDocOrdinal, dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet> dataSet) { return f.withParameters( params -> { Object param = params.get( paramName, dataSet.fieldType.getJavaType() ); @@ -163,7 +163,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return knnPredicateOptionsStep( f, fieldPath, matchingDocOrdinal, dataSet.values.matchingArg( matchingDocOrdinal ) ); @@ -184,7 +184,7 @@ public InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.knn( 1 ).field( fieldPath ).matching( new byte[] { 1 } ); } @@ -216,7 +216,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.knn( 1 ).field( fieldPath ).matching( new byte[] { 1 } ); } @@ -255,7 +255,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { if ( byte[].class.equals( fieldType.getJavaType() ) ) { f.knn( 1 ).field( fieldPath ).matching( new byte[( (VectorFieldTypeDescriptor) fieldType ).vectorSize()] ); @@ -304,46 +304,46 @@ void constantScore_fieldLevelBoost(SimpleMappedIndex index, } @Override - protected KnnPredicateOptionsStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected KnnPredicateOptionsStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return knnPredicateOptionsStep( f, fieldPath, matchingDocOrdinal, dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f, fieldPaths[0], matchingDocOrdinal, dataSet ).constantScore(); } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return predicate( f, fieldPaths[0], matchingDocOrdinal, dataSet ).boost( predicateBoost ); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return predicate( f, fieldPaths[0], matchingDocOrdinal, dataSet ).constantScore().boost( predicateBoost ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f, fieldPath, matchingDocOrdinal, dataSet ).constantScore().boost( fieldBoost ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet> dataSet) { return predicate( f, fieldPath, matchingDocOrdinal, dataSet ).constantScore().constantScore(); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return predicate( f, fieldPath, matchingDocOrdinal, dataSet ).constantScore().boost( fieldBoost ); @@ -354,7 +354,7 @@ private static KnnPredicateTestValues testValues(FieldTypeDescriptor( fieldType ); } - private static KnnPredicateOptionsStep knnPredicateOptionsStep(SearchPredicateFactory f, String fieldPath, + private static KnnPredicateOptionsStep knnPredicateOptionsStep(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, F matchingArg) { if ( matchingArg instanceof byte[] ) { return f.knn( 1 ).field( fieldPath ).matching( ( (byte[]) matchingArg ) ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/KnnPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/KnnPredicateSpecificsIT.java index 99dc34d185d..ad8963f7e52 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/KnnPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/KnnPredicateSpecificsIT.java @@ -209,7 +209,7 @@ public static List params() { @ParameterizedTest(name = "{1}") @MethodSource("params") void wrongVectorValuesType(SimpleMappedIndex index, VectorFieldTypeDescriptor fieldType) { - SearchPredicateFactory f = index.createScope( index ).predicate(); + SearchPredicateFactory f = index.createScope( index ).predicate(); String fieldPath = index.binding().field.get( fieldType ).relativeFieldName; @@ -238,7 +238,7 @@ void wrongVectorLength(SimpleMappedIndex index, VectorFieldTypeDes ); } - protected void tryPredicateWrongType(SearchPredicateFactory f, String fieldPath, + protected void tryPredicateWrongType(SearchPredicateFactory f, String fieldPath, VectorFieldTypeDescriptor fieldType) { if ( fieldType.getJavaType() == byte[].class ) { f.knn( 1 ).field( fieldPath ).matching( 1.0f, 1.0f ); @@ -248,7 +248,7 @@ protected void tryPredicateWrongType(SearchPredicateFactory f, String fieldPath, } } - protected KnnPredicateOptionsStep tryPredicateWrongLength(SearchPredicateFactory f, String fieldPath, + protected KnnPredicateOptionsStep tryPredicateWrongLength(SearchPredicateFactory f, String fieldPath, VectorFieldTypeDescriptor fieldType) { if ( fieldType.getJavaType() == byte[].class ) { return f.knn( 1 ).field( fieldPath ).matching( new byte[fieldType.vectorSize() * 2] ); @@ -328,7 +328,7 @@ void dimension(VectorFieldTypeDescriptor fieldType, SimpleMappedIndex indexDifferentEfConstruction, SimpleMappedIndex indexDifferentM, SimpleMappedIndex indexDifferentSimilarity) { - SearchPredicateFactory f = index.createScope( indexDifferentDimension ).predicate(); + SearchPredicateFactory f = index.createScope( indexDifferentDimension ).predicate(); String fieldPath = index.binding().field.get( fieldType ).relativeFieldName; @@ -351,7 +351,7 @@ void similarity(VectorFieldTypeDescriptor fieldType, SimpleMappedIndex indexDifferentEfConstruction, SimpleMappedIndex indexDifferentM, SimpleMappedIndex indexDifferentSimilarity) { - SearchPredicateFactory f = index.createScope( indexDifferentSimilarity ).predicate(); + SearchPredicateFactory f = index.createScope( indexDifferentSimilarity ).predicate(); String fieldPath = index.binding().field.get( fieldType ).relativeFieldName; @@ -375,7 +375,7 @@ void efConstruction(VectorFieldTypeDescriptor fieldType, SimpleMappedIndex indexDifferentM, SimpleMappedIndex indexDifferentSimilarity) { StubMappingScope scope = index.createScope( indexDifferentEfConstruction ); - SearchPredicateFactory f = scope.predicate(); + SearchPredicateFactory f = scope.predicate(); String fieldPath = index.binding().field.get( fieldType ).relativeFieldName; @@ -399,7 +399,7 @@ void m(VectorFieldTypeDescriptor fieldType, SimpleMappedIndex indexDifferentM, SimpleMappedIndex indexDifferentSimilarity) { StubMappingScope scope = index.createScope( indexDifferentM ); - SearchPredicateFactory f = scope.predicate(); + SearchPredicateFactory f = scope.predicate(); String fieldPath = index.binding().field.get( fieldType ).relativeFieldName; @@ -414,7 +414,7 @@ void m(VectorFieldTypeDescriptor fieldType, ); } - protected KnnPredicateOptionsStep predicate(SearchPredicateFactory f, String fieldPath, + protected KnnPredicateOptionsStep predicate(SearchPredicateFactory f, String fieldPath, VectorFieldTypeDescriptor fieldType) { if ( fieldType.getJavaType() == byte[].class ) { return f.knn( 1 ).field( fieldPath ).matching( (byte) 1, (byte) 1 ); @@ -527,7 +527,7 @@ public static List params() { void similarity(VectorFieldTypeDescriptor fieldType, SimpleMappedIndex index) { StubMappingScope scope = index.createScope(); - SearchPredicateFactory f = scope.predicate(); + SearchPredicateFactory f = scope.predicate(); String fieldPath = index.binding().field.get( fieldType ).relativeFieldName; @@ -537,7 +537,7 @@ void similarity(VectorFieldTypeDescriptor fieldType, .hasSize( 2 ); } - protected KnnPredicateOptionsStep predicate(SearchPredicateFactory f, String fieldPath, + protected KnnPredicateOptionsStep predicate(SearchPredicateFactory f, String fieldPath, VectorFieldTypeDescriptor fieldType) { if ( fieldType.getJavaType() == byte[].class ) { return f.knn( 2 ).field( fieldPath ).matching( (byte) 1, (byte) 0, (byte) 0, (byte) 0 ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchAllPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchAllPredicateBaseIT.java index fb1a1c57d91..f3015962f69 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchAllPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchAllPredicateBaseIT.java @@ -71,7 +71,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, + protected PredicateFinalStep predicate(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, int matchingDocOrdinal, AbstractPredicateDataSet dataSet) { return f.matchAll() .except( f.id().matchingAny( InObjectFieldConfigured.dataSet.docIdsExcept( matchingDocOrdinal ) ) ); @@ -116,13 +116,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.matchAll().except( f.id().matchingAny( ScoreConfigured.dataSet.docIdsExcept( matchingDocOrdinal ) ) ); } @Override - protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.matchAll().except( f.id().matchingAny( ScoreConfigured.dataSet.docIdsExcept( matchingDocOrdinal ) ) ) @@ -130,14 +130,14 @@ protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int ma } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.matchAll().except( f.id().matchingAny( ScoreConfigured.dataSet.docIdsExcept( matchingDocOrdinal ) ) ) .constantScore(); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.matchAll().except( f.id().matchingAny( ScoreConfigured.dataSet.docIdsExcept( matchingDocOrdinal ) ) ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchAllPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchAllPredicateSpecificsIT.java index a9ecbfb2168..6ec8300f736 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchAllPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchAllPredicateSpecificsIT.java @@ -53,7 +53,7 @@ void except() { .where( f -> f.matchAll().except( c2 -> c2.match().field( "string" ).matching( STRING_1 ) ) ) ) .hasDocRefHitsAnyOrder( index.typeName(), DOCUMENT_2, DOCUMENT_3 ); - SearchPredicateFactory f1 = index.createScope().predicate(); + SearchPredicateFactory f1 = index.createScope().predicate(); SearchPredicate searchPredicate = f1.match().field( "string" ).matching( STRING_2 ).toPredicate(); assertThatQuery( index.query() @@ -69,7 +69,7 @@ void multipleExcepts() { .except( f.match().field( "string" ).matching( STRING_2 ) ) ) ) .hasDocRefHitsAnyOrder( index.typeName(), DOCUMENT_3 ); - SearchPredicateFactory f1 = index.createScope().predicate(); + SearchPredicateFactory f1 = index.createScope().predicate(); SearchPredicate searchPredicate1 = f1.match().field( "string" ).matching( STRING_3 ).toPredicate(); SearchPredicate searchPredicate2 = f1.match().field( "string" ).matching( STRING_2 ).toPredicate(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchIdPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchIdPredicateBaseIT.java index b4f07a08fdf..b78d6385576 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchIdPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchIdPredicateBaseIT.java @@ -69,7 +69,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, + protected PredicateFinalStep predicate(SearchPredicateFactory f, ObjectFieldBinding objectFieldBinding, int matchingDocOrdinal, AbstractPredicateDataSet dataSet) { return f.id().matching( InObjectFieldConfigured.dataSet.docId( matchingDocOrdinal ) ); } @@ -105,26 +105,26 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ).boost( boost ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ).constantScore().boost( boost ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchIdPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchIdPredicateSpecificsIT.java index c0f6c63715d..a28c5c4fb41 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchIdPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchIdPredicateSpecificsIT.java @@ -136,7 +136,7 @@ void multiIndex_withCompatibleIdConverterIndexManager_dslConverterEnabled() { @Test void multiIndex_withIncompatibleIdConverterIndex_dslConverterEnabled() { - SearchPredicateFactory f = mainIndex.createScope( incompatibleIdConverterIndex ).predicate(); + SearchPredicateFactory f = mainIndex.createScope( incompatibleIdConverterIndex ).predicate(); assertThatThrownBy( () -> f.id().matching( new Object() /* Value does not matter */ ) ) .isInstanceOf( SearchException.class ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchPredicateBaseIT.java index 8f3550f8a31..3f4704c36f3 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchPredicateBaseIT.java @@ -158,13 +158,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.match().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet> dataSet) { return f.withParameters( params -> f.match().field( fieldPath ) .matching( params.get( paramName, dataSet.fieldType.getJavaType() ), ValueModel.MAPPING ) ); @@ -202,20 +202,20 @@ public static List params() { } @Override - protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.match().field( fieldPath ).field( otherFieldPath ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, + protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return f.match().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return f.match().field( fieldPath ).fields( fieldPaths ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); @@ -252,7 +252,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.match().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @@ -278,18 +278,18 @@ public AnalysisConfigured() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String matchingParam) { + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String matchingParam) { return f.match().field( fieldPath ).matching( matchingParam ); } @Override - protected PredicateFinalStep predicateWithAnalyzerOverride(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithAnalyzerOverride(SearchPredicateFactory f, String fieldPath, String matchingParam, String analyzerName) { return f.match().field( fieldPath ).matching( matchingParam ).analyzer( analyzerName ); } @Override - protected PredicateFinalStep predicateWithSkipAnalysis(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithSkipAnalysis(SearchPredicateFactory f, String fieldPath, String matchingParam) { return f.match().field( fieldPath ).matching( matchingParam ).skipAnalysis(); } @@ -320,14 +320,14 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.match().field( fieldPath ) .matching( ( (DataSet>) dataSet ).values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return f.match().fields( fieldPaths ) .matching( ( (DataSet>) dataSet ).values.matchingArg( matchingDocOrdinal ) ) @@ -335,7 +335,7 @@ protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return f.match().fields( fieldPaths ) .matching( ( (DataSet>) dataSet ).values.matchingArg( matchingDocOrdinal ) ) @@ -343,7 +343,7 @@ protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFac } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return f.match().fields( fieldPaths ) @@ -352,14 +352,14 @@ protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(Se } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet> dataSet) { return f.match().field( fieldPath ).boost( fieldBoost ) .matching( ( (DataSet>) dataSet ).values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet> dataSet) { return f.match().field( fieldPath ).boost( fieldBoost ) .matching( ( (DataSet>) dataSet ).values.matchingArg( matchingDocOrdinal ) ) @@ -367,7 +367,7 @@ protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(Search } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return f.match().field( fieldPath ).boost( fieldBoost ) @@ -390,7 +390,7 @@ public InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.match().field( fieldPath ); } @@ -422,7 +422,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.match().field( fieldPath ); } @@ -461,7 +461,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.match().field( fieldPath ); } @@ -493,7 +493,7 @@ public static List params() { } @Override - protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { f.match().field( fieldPath ).matching( null ); } } @@ -547,32 +547,32 @@ public static List integerIndexParams() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { return f.match().field( fieldPath ).matching( matchingParam ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam, ValueModel valueModel) { return f.match().field( fieldPath ).matching( matchingParam, valueModel ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, Object matchingParam, ValueModel valueModel) { return f.match().field( field0Path ).field( field1Path ).matching( matchingParam, valueModel ); } @Deprecated(since = "test") @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam, org.hibernate.search.engine.search.common.ValueConvert valueConvert) { return f.match().field( fieldPath ).matching( matchingParam, valueConvert ); } @Deprecated(since = "test") @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, Object matchingParam, org.hibernate.search.engine.search.common.ValueConvert valueConvert) { return f.match().field( field0Path ).field( field1Path ).matching( matchingParam, valueConvert ); } @@ -638,7 +638,7 @@ public ScaleCheckingConfigured() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { return f.match().field( fieldPath ).matching( matchingParam ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchPredicateSpecificsIT.java index 2e1d827fad9..700e5f4a0fa 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/MatchPredicateSpecificsIT.java @@ -219,7 +219,7 @@ void multipleFields() { @Test void unsupportedFieldType() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); for ( FieldTypeDescriptor fieldType : unsupportedFieldTypes ) { SimpleFieldModel fieldModel = index.binding().unsupportedTypeFields.get( fieldType ); @@ -257,7 +257,7 @@ void unsupportedFieldType() { @Test void invalidMaxEditDistance() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); String absoluteFieldPath = index.binding().analyzedStringField.relativeFieldName; assertThatThrownBy( () -> f.match().field( absoluteFieldPath ) @@ -275,7 +275,7 @@ void invalidMaxEditDistance() { @Test void invalidPrefixLength() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); String absoluteFieldPath = index.binding().analyzedStringField.relativeFieldName; assertThatThrownBy( () -> f.match().field( absoluteFieldPath ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NamedPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NamedPredicateBaseIT.java index 42361d9d883..65aa01b32dd 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NamedPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NamedPredicateBaseIT.java @@ -122,7 +122,7 @@ void flattened() { @Test void nullPath() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> f.named( null ) ) .isInstanceOf( IllegalArgumentException.class ) .hasMessageContainingAll( "must not be null" ); @@ -130,7 +130,7 @@ void nullPath() { @Test void unknownField() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> f.named( "unknown_field.my-predicate" ) ) .isInstanceOf( SearchException.class ) .hasMessageContainingAll( "Unknown field", "'unknown_field'" ); @@ -138,7 +138,7 @@ void unknownField() { @Test void unknownPredicate_root() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> f.named( "unknown-predicate" ) ) .isInstanceOf( SearchException.class ) .hasMessageContainingAll( "Cannot use 'predicate:named:unknown-predicate' on index schema root" ); @@ -146,7 +146,7 @@ void unknownPredicate_root() { @Test void unknownPredicate_objectField() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> f.named( "nested.unknown-predicate" ) ) .isInstanceOf( SearchException.class ) .hasMessageContainingAll( "Cannot use 'predicate:named:unknown-predicate' on field 'nested'" ); @@ -154,7 +154,7 @@ void unknownPredicate_objectField() { @Test void unknownPredicate_valueField() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> f.named( "field1.unknown-predicate" ) ) .isInstanceOf( SearchException.class ) .hasMessageContainingAll( "Cannot use 'predicate:named:unknown-predicate' on field 'field1'" ); @@ -245,10 +245,10 @@ public TestPredicateDefinition(String field1Name, String field2Name) { } @Override - public SearchPredicate create(PredicateDefinitionContext context) { + public SearchPredicate create(PredicateDefinitionContext context) { String word1 = context.params().get( "value1", String.class ); String word2 = context.params().get( "value2", String.class ); - SearchPredicateFactory f = context.predicate(); + SearchPredicateFactory f = context.predicate(); return f.and( f.match().field( field1Name ).matching( word1 ), f.match().field( field2Name ).matching( word2 ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NamedPredicateMultiIndexCompatibilityIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NamedPredicateMultiIndexCompatibilityIT.java index 3c3729ad8b7..0ecffcea3ca 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NamedPredicateMultiIndexCompatibilityIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NamedPredicateMultiIndexCompatibilityIT.java @@ -191,7 +191,7 @@ public int hashCode() { } @Override - public SearchPredicate create(PredicateDefinitionContext context) { + public SearchPredicate create(PredicateDefinitionContext context) { return context.predicate().match().field( fieldName ) .matching( context.params().get( "value", Object.class ) ) .toPredicate(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NestedPredicateLegacyIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NestedPredicateLegacyIT.java index e589d485386..f248be98cfa 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NestedPredicateLegacyIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NestedPredicateLegacyIT.java @@ -243,7 +243,7 @@ void invalidNestedPath_sibling() { @TestForIssue(jiraKey = "HSEARCH-4173") void multiIndex_missingNestedField() { StubMappingScope scope = mainIndex.createScope( missingFieldIndex ); - SearchPredicateFactory f = scope.predicate(); + SearchPredicateFactory f = scope.predicate(); SearchPredicate nestedPredicate = f.nested().objectField( "nestedObject" ) .nest( f.and( // This is referred to as "condition 1" in the data initialization method 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 7cd026116ba..a8b60498a6f 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 @@ -269,7 +269,7 @@ void invalidNestedPath_sibling() { @TestForIssue(jiraKey = "HSEARCH-4173") void multiIndex_missingNestedField() { StubMappingScope scope = mainIndex.createScope( missingFieldIndex ); - SearchPredicateFactory f = scope.predicate(); + SearchPredicateFactory f = scope.predicate(); SearchPredicate nestedPredicate = f.nested( "nestedObject" ) // This is referred to as "condition 1" in the data initialization method .add( f.nested( "nestedObject.nestedObject" ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NotPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NotPredicateBaseIT.java index 824e4eb55c7..ce40306584e 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NotPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NotPredicateBaseIT.java @@ -57,27 +57,27 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.not( f.id().matchingAny( ( (DataSet) dataSet ).docsExcept( matchingDocOrdinal ) ) ); } @Override - protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, + protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.not( f.id().matchingAny( ( (DataSet) dataSet ).docsExcept( matchingDocOrdinal ) ) ) .boost( boost ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.not( f.id().matchingAny( ( (DataSet) dataSet ).docsExcept( matchingDocOrdinal ) ) ) .constantScore(); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.not( f.id().matchingAny( ( (DataSet) dataSet ).docsExcept( matchingDocOrdinal ) ) ) .constantScore() diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NotPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NotPredicateSpecificsIT.java index 3cf0ce0d050..35cc0bc6862 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NotPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/NotPredicateSpecificsIT.java @@ -92,7 +92,7 @@ void mustWithNotInside() { @Test void manyNestedNot() { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatQuery( index.query() .where( f.bool() diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/OrPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/OrPredicateBaseIT.java index 1c5cc625967..76956aed083 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/OrPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/OrPredicateBaseIT.java @@ -60,13 +60,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.or( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ); } @Override - protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.or( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) @@ -74,14 +74,14 @@ protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int ma } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.or( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) .constantScore(); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.or( f.id().matching( ScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) @@ -117,14 +117,14 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.or() .add( f.id().matching( AddScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ); } @Override - protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.or() @@ -133,7 +133,7 @@ protected PredicateFinalStep predicateWithBoost(SearchPredicateFactory f, int ma } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, int matchingDocOrdinal, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.or() .add( f.id().matching( AddScoreConfigured.dataSet.docId( matchingDocOrdinal ) ) ) @@ -141,7 +141,7 @@ protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f } @Override - protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndBoost(SearchPredicateFactory f, int matchingDocOrdinal, float boost, AbstractPredicateDataSet dataSet, StubMappedIndex index) { return f.or() diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PhrasePredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PhrasePredicateBaseIT.java index bdc1df5103a..ef4f5e3ecb5 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PhrasePredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PhrasePredicateBaseIT.java @@ -143,13 +143,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.phrase().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet dataSet) { return f.withParameters( params -> f.phrase().field( fieldPath ) .matching( params.get( paramName, String.class ) ) ); @@ -187,20 +187,20 @@ public static List params() { } @Override - protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.phrase().field( fieldPath ).field( otherFieldPath ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, + protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.phrase().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.phrase().field( fieldPath ).fields( fieldPaths ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); @@ -236,7 +236,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.phrase().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @@ -274,18 +274,18 @@ public void analyzerOverride_normalizedStringField() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String matchingParam) { + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String matchingParam) { return f.phrase().field( fieldPath ).matching( matchingParam ); } @Override - protected PredicateFinalStep predicateWithAnalyzerOverride(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithAnalyzerOverride(SearchPredicateFactory f, String fieldPath, String matchingParam, String analyzerName) { return f.phrase().field( fieldPath ).matching( matchingParam ).analyzer( analyzerName ); } @Override - protected PredicateFinalStep predicateWithSkipAnalysis(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithSkipAnalysis(SearchPredicateFactory f, String fieldPath, String matchingParam) { return f.phrase().field( fieldPath ).matching( matchingParam ).skipAnalysis(); } @@ -316,27 +316,27 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.phrase().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.phrase().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) .constantScore(); } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.phrase().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) .boost( predicateBoost ); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.phrase().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) @@ -344,21 +344,21 @@ protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(Se } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.phrase().field( fieldPath ).boost( fieldBoost ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.phrase().field( fieldPath ).boost( fieldBoost ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.phrase().field( fieldPath ).boost( fieldBoost ) @@ -380,7 +380,7 @@ public InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.phrase().field( fieldPath ); } @@ -412,7 +412,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.phrase().field( fieldPath ); } @@ -451,7 +451,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.phrase().field( fieldPath ); } @@ -485,7 +485,7 @@ public static List params() { @ParameterizedTest(name = "{1}") @MethodSource("params") void invalidSlop(SimpleMappedIndex index, FieldTypeDescriptor fieldType) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> f.phrase().field( fieldPath( index, fieldType ) ) .matching( "foo" ).slop( -1 ) ) @@ -501,7 +501,7 @@ void invalidSlop(SimpleMappedIndex index, FieldTypeDescriptor f, String fieldPath) { f.phrase().field( fieldPath ).matching( null ); } } @@ -545,13 +545,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.phrase().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, int matchingDocOrdinal, DataSet dataSet) { return f.phrase().field( field0Path ).field( field1Path ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PredicateDefinitionContextIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PredicateDefinitionContextIT.java index e8ced70ea03..7628a381b8a 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PredicateDefinitionContextIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PredicateDefinitionContextIT.java @@ -145,7 +145,7 @@ static ObjectFieldBinding create(IndexSchemaElement parent, String relativeField public static class StubPredicateDefinition implements PredicateDefinition { @Override - public SearchPredicate create(PredicateDefinitionContext context) { + public SearchPredicate create(PredicateDefinitionContext context) { PredicateDefinition impl = context.params().get( "impl", PredicateDefinition.class ); return impl.create( context ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PrefixPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PrefixPredicateBaseIT.java index ade70fea41b..acca3504876 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PrefixPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/PrefixPredicateBaseIT.java @@ -129,13 +129,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.prefix().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet dataSet) { return f.withParameters( params -> f.prefix().field( fieldPath ) .matching( params.get( paramName, String.class ) ) ); @@ -173,20 +173,20 @@ public static List params() { } @Override - protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.prefix().field( fieldPath ).field( otherFieldPath ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, + protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.prefix().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.prefix().field( fieldPath ).fields( fieldPaths ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); @@ -222,7 +222,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.prefix().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @@ -253,27 +253,27 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.prefix().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.prefix().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) .constantScore(); } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.prefix().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) .boost( predicateBoost ); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.prefix().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) @@ -281,21 +281,21 @@ protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(Se } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.prefix().field( fieldPath ).boost( fieldBoost ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.prefix().field( fieldPath ).boost( fieldBoost ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.prefix().field( fieldPath ).boost( fieldBoost ) @@ -317,7 +317,7 @@ protected InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.prefix().field( fieldPath ); } @@ -349,7 +349,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.prefix().field( fieldPath ); } @@ -388,7 +388,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.prefix().field( fieldPath ); } @@ -420,7 +420,7 @@ public static List params() { } @Override - protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { f.prefix().field( fieldPath ).matching( null ); } } @@ -464,13 +464,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.prefix().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, int matchingDocOrdinal, DataSet dataSet) { return f.prefix().field( field0Path ).field( field1Path ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateBaseIT.java index 519521b1ec0..0e0bbc2568d 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateBaseIT.java @@ -13,7 +13,7 @@ class QueryStringPredicateBaseIT extends AbstractBaseQueryStringPredicateBaseIT< //CHECKSTYLE:ON @Override - QueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + QueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return f.queryString(); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateSpecificsIT.java index 5adc4b567c1..1d8704902bd 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateSpecificsIT.java @@ -472,7 +472,7 @@ public static List queryStringSyntax() { } @Override - QueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + QueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return f.queryString(); } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/RangePredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/RangePredicateBaseIT.java index 2fbcb7bbbaf..6755b9c0aed 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/RangePredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/RangePredicateBaseIT.java @@ -160,13 +160,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.range().field( fieldPath ).within( dataSet.values.matchingRange( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet> dataSet) { return f.withParameters( params -> f.range().field( fieldPath ) .within( params.get( paramName, Range.class ) ) ); @@ -204,20 +204,20 @@ public static List params() { } @Override - protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.range().field( fieldPath ).field( otherFieldPath ) .within( dataSet.values.matchingRange( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, + protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return f.range().fields( fieldPaths ).within( dataSet.values.matchingRange( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return f.range().field( fieldPath ).fields( fieldPaths ) .within( dataSet.values.matchingRange( matchingDocOrdinal ) ); @@ -254,7 +254,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.range().field( fieldPath ).within( dataSet.values.matchingRange( matchingDocOrdinal ) ); } @@ -280,7 +280,7 @@ public AnalysisConfigured() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String matchingParam) { + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String matchingParam) { return f.range().field( fieldPath ).within( Range.between( matchingParam, matchingParam ) ); } } @@ -310,26 +310,26 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.range().field( fieldPath ).within( dataSet.values.matchingRange( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return f.range().fields( fieldPaths ).within( dataSet.values.matchingRange( matchingDocOrdinal ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return f.range().fields( fieldPaths ).within( dataSet.values.matchingRange( matchingDocOrdinal ) ) .boost( predicateBoost ); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return f.range().fields( fieldPaths ).within( dataSet.values.matchingRange( matchingDocOrdinal ) ) @@ -337,21 +337,21 @@ protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(Se } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet> dataSet) { return f.range().field( fieldPath ).boost( fieldBoost ) .within( dataSet.values.matchingRange( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet> dataSet) { return f.range().field( fieldPath ).boost( fieldBoost ) .within( dataSet.values.matchingRange( matchingDocOrdinal ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return f.range().field( fieldPath ).boost( fieldBoost ) @@ -373,7 +373,7 @@ public InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.range().field( fieldPath ); } @@ -405,7 +405,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.range().field( fieldPath ); } @@ -444,7 +444,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.range().field( fieldPath ); } @@ -478,7 +478,7 @@ public static List params() { @ParameterizedTest(name = "{1}") @MethodSource("params") void nullBounds(SimpleMappedIndex index, FieldTypeDescriptor fieldType) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> f.range().field( fieldPath( index, fieldType ) ) .within( Range.between( null, null ) ) ) @@ -491,7 +491,7 @@ void nullBounds(SimpleMappedIndex index, FieldTypeDescriptor } @Override - protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { f.range().field( fieldPath ).within( null ); } } @@ -544,32 +544,32 @@ public static List integerIndexParams() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Range rangeParam) { + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Range rangeParam) { return f.range().field( fieldPath ).within( rangeParam ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Range rangeParam, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Range rangeParam, ValueModel valueModel) { return f.range().field( fieldPath ).within( rangeParam, valueModel ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, Range rangeParam, ValueModel valueModel) { return f.range().field( field0Path ).field( field1Path ).within( rangeParam, valueModel ); } @Deprecated(since = "test") @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Range matchingParam, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Range matchingParam, org.hibernate.search.engine.search.common.ValueConvert valueConvert) { return f.range().field( fieldPath ).within( matchingParam, valueConvert ); } @Deprecated(since = "test") @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, Range matchingParam, org.hibernate.search.engine.search.common.ValueConvert valueConvert) { return f.range().field( field0Path ).field( field1Path ).within( matchingParam, valueConvert ); } @@ -654,7 +654,7 @@ public ScaleCheckingConfigured() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { return f.range().field( fieldPath ).within( Range.between( matchingParam, matchingParam ) ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/RegexpPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/RegexpPredicateBaseIT.java index 4e798813779..f2cd0a74c9f 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/RegexpPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/RegexpPredicateBaseIT.java @@ -129,13 +129,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.regexp().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet dataSet) { return f.withParameters( params -> f.regexp().field( fieldPath ) .matching( params.get( paramName, String.class ) ) ); @@ -173,20 +173,20 @@ public static List params() { } @Override - protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.regexp().field( fieldPath ).field( otherFieldPath ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, + protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.regexp().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.regexp().field( fieldPath ).fields( fieldPaths ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); @@ -222,7 +222,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.regexp().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @@ -253,27 +253,27 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.regexp().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.regexp().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) .constantScore(); } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.regexp().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) .boost( predicateBoost ); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.regexp().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) @@ -281,21 +281,21 @@ protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(Se } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.regexp().field( fieldPath ).boost( fieldBoost ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.regexp().field( fieldPath ).boost( fieldBoost ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.regexp().field( fieldPath ).boost( fieldBoost ) @@ -317,7 +317,7 @@ public InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.regexp().field( fieldPath ); } @@ -349,7 +349,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.regexp().field( fieldPath ); } @@ -389,7 +389,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.regexp().field( fieldPath ); } @@ -421,7 +421,7 @@ public static List params() { } @Override - protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { f.regexp().field( fieldPath ).matching( null ); } } @@ -465,13 +465,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.regexp().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, int matchingDocOrdinal, DataSet dataSet) { return f.regexp().field( field0Path ).field( field1Path ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SearchPredicateIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SearchPredicateIT.java index f83c4987a1d..b0d2b34c649 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SearchPredicateIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SearchPredicateIT.java @@ -321,7 +321,7 @@ void extension() { // Mandatory extension, supported query = scope.query() - .where( f -> f.extension( new SupportedExtension() ) + .where( f -> f.extension( new SupportedExtension<>() ) .extendedPredicate( "string", STRING_1 ) ) .toQuery(); @@ -330,7 +330,7 @@ void extension() { // Mandatory extension, unsupported assertThatThrownBy( - () -> scope.predicate().extension( new UnSupportedExtension() ) + () -> scope.predicate().extension( new UnSupportedExtension<>() ) ) .isInstanceOf( SearchException.class ); @@ -338,11 +338,11 @@ void extension() { query = scope.query() .where( f -> f.extension() .ifSupported( - new SupportedExtension(), + new SupportedExtension<>(), extended -> extended.extendedPredicate( "string", STRING_1 ) ) .ifSupported( - new SupportedExtension(), + new SupportedExtension<>(), shouldNotBeCalled() ) .orElseFail() @@ -355,11 +355,11 @@ void extension() { query = scope.query() .where( f -> f.extension() .ifSupported( - new UnSupportedExtension(), + new UnSupportedExtension<>(), shouldNotBeCalled() ) .ifSupported( - new SupportedExtension(), + new SupportedExtension<>(), extended -> extended.extendedPredicate( "string", STRING_1 ) ) .orElse( @@ -374,11 +374,11 @@ void extension() { query = scope.query() .where( f -> f.extension() .ifSupported( - new UnSupportedExtension(), + new UnSupportedExtension<>(), shouldNotBeCalled() ) .ifSupported( - new UnSupportedExtension(), + new UnSupportedExtension<>(), shouldNotBeCalled() ) .orElse( @@ -458,26 +458,26 @@ private static class ObjectFieldBinding { } } - private static class SupportedExtension implements SearchPredicateFactoryExtension { + private static class SupportedExtension implements SearchPredicateFactoryExtension> { @Override - public Optional extendOptional(SearchPredicateFactory original) { + public Optional> extendOptional(SearchPredicateFactory original) { assertThat( original ).isNotNull(); - return Optional.of( new MyExtendedFactory( original ) ); + return Optional.of( new MyExtendedFactory( original ) ); } } - private static class UnSupportedExtension implements SearchPredicateFactoryExtension { + private static class UnSupportedExtension implements SearchPredicateFactoryExtension> { @Override - public Optional extendOptional(SearchPredicateFactory original) { + public Optional> extendOptional(SearchPredicateFactory original) { assertThat( original ).isNotNull(); return Optional.empty(); } } - private static class MyExtendedFactory { - private final SearchPredicateFactory delegate; + private static class MyExtendedFactory { + private final SearchPredicateFactory delegate; - MyExtendedFactory(SearchPredicateFactory delegate) { + MyExtendedFactory(SearchPredicateFactory delegate) { this.delegate = delegate; } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateBaseIT.java index 3a1ae5a61e7..8c2a93075b2 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateBaseIT.java @@ -12,7 +12,7 @@ class SimpleQueryStringPredicateBaseIT extends AbstractBaseQueryStringPredicateBaseIT> { //CHECKSTYLE:ON @Override - SimpleQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + SimpleQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return f.simpleQueryString(); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateSpecificsIT.java index 15de4ea02f9..6d043aad488 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateSpecificsIT.java @@ -413,7 +413,7 @@ public static List simpleQueryStringSyntax() { } @Override - SimpleQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + SimpleQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return f.simpleQueryString(); } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinBoundingBoxPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinBoundingBoxPredicateBaseIT.java index a4dff3d2c55..9275ed07d46 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinBoundingBoxPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinBoundingBoxPredicateBaseIT.java @@ -124,13 +124,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).boundingBox( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet dataSet) { return f.withParameters( params -> f.spatial().within().field( fieldPath ) .boundingBox( params.get( paramName, GeoBoundingBox.class ) ) ); @@ -162,7 +162,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).field( otherFieldPath ) @@ -170,14 +170,14 @@ protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, } @Override - protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, + protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) .boundingBox( MultiFieldConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).fields( fieldPaths ) @@ -210,7 +210,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ) .boundingBox( InObjectFieldConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); @@ -235,28 +235,28 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ) .boundingBox( ScoreConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) .boundingBox( ScoreConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) .boundingBox( ScoreConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ).boost( predicateBoost ); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) @@ -264,14 +264,14 @@ protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(Se } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).boost( fieldBoost ) .boundingBox( ScoreConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).boost( fieldBoost ) @@ -279,7 +279,7 @@ protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(Search } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.spatial().within().field( fieldPath ).boost( fieldBoost ) @@ -301,7 +301,7 @@ public InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.spatial().within().field( fieldPath ) // We need this because the backend is not involved before the call to boundingBox() .boundingBox( 0.0, 0.0, 0.1, 0.1 ); @@ -335,7 +335,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.spatial().within().field( fieldPath ) // We need this because the backend is not involved before the call to boundingBox() .boundingBox( 0.0, 0.0, 0.1, 0.1 ); @@ -370,7 +370,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.spatial().within().field( fieldPath ) // We need this because the backend is not involved before the call to boundingBox() .boundingBox( 0.0, 0.0, 0.1, 0.1 ); @@ -397,7 +397,7 @@ public static List params() { } @Override - protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { f.spatial().within().field( fieldPath ).boundingBox( null ); } } @@ -434,14 +434,14 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ) .boundingBox( TypeCheckingNoConversionConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( field0Path ).field( field1Path ) .boundingBox( TypeCheckingNoConversionConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinCirclePredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinCirclePredicateBaseIT.java index e7c77cff7e5..b97bc87d184 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinCirclePredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinCirclePredicateBaseIT.java @@ -126,7 +126,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ) .circle( SingleFieldConfigured.dataSet.values.matchingCenter( matchingDocOrdinal ), @@ -134,7 +134,7 @@ protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPat } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet dataSet) { return f.withParameters( params -> f.spatial().within().field( fieldPath ) .circle( params.get( paramName + "_center", GeoPoint.class ), @@ -171,7 +171,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).field( otherFieldPath ) .circle( MultiFieldConfigured.dataSet.values.matchingCenter( matchingDocOrdinal ), @@ -179,7 +179,7 @@ protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, } @Override - protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, + protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) .circle( MultiFieldConfigured.dataSet.values.matchingCenter( matchingDocOrdinal ), @@ -187,7 +187,7 @@ protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[ } @Override - protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).fields( fieldPaths ) .circle( MultiFieldConfigured.dataSet.values.matchingCenter( matchingDocOrdinal ), @@ -218,7 +218,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ) .circle( InObjectFieldConfigured.dataSet.values.matchingCenter( matchingDocOrdinal ), @@ -243,7 +243,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ) .circle( ScoreConfigured.dataSet.values.matchingCenter( matchingDocOrdinal ), @@ -251,7 +251,7 @@ protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPat } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) .circle( ScoreConfigured.dataSet.values.matchingCenter( matchingDocOrdinal ), @@ -260,7 +260,7 @@ protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) .circle( ScoreConfigured.dataSet.values.matchingCenter( matchingDocOrdinal ), @@ -269,7 +269,7 @@ protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFac } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) @@ -279,7 +279,7 @@ protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(Se } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).boost( fieldBoost ) .circle( ScoreConfigured.dataSet.values.matchingCenter( matchingDocOrdinal ), @@ -287,7 +287,7 @@ protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).boost( fieldBoost ) @@ -297,7 +297,7 @@ protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(Search } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.spatial().within().field( fieldPath ).boost( fieldBoost ) @@ -321,7 +321,7 @@ public InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.spatial().within().field( fieldPath ) // We need this because the backend is not involved before the call to circle() .circle( GeoPoint.of( 0, 0 ), 1 ); @@ -355,7 +355,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.spatial().within().field( fieldPath ) // We need this because the backend is not involved before the call to circle() .circle( GeoPoint.of( 0, 0 ), 1 ); @@ -390,7 +390,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.spatial().within().field( fieldPath ) // We need this because the backend is not involved before the call to circle() .circle( GeoPoint.of( 0, 0 ), 1 ); @@ -419,7 +419,7 @@ public static List params() { @ParameterizedTest(name = "{1}") @MethodSource("params") void nullUnit(SimpleMappedIndex index, FieldTypeDescriptor fieldType) { - SearchPredicateFactory f = index.createScope().predicate(); + SearchPredicateFactory f = index.createScope().predicate(); assertThatThrownBy( () -> f.spatial().within().field( fieldPath( index, fieldType ) ).circle( 0.0, 0.0, 10.0, null ) ) @@ -428,7 +428,7 @@ void nullUnit(SimpleMappedIndex index, FieldTypeDescriptor f } @Override - protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { f.spatial().within().field( fieldPath ).circle( null, 10.0 ); } } @@ -466,7 +466,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ) .circle( TypeCheckingNoConversionConfigured.dataSet.values.matchingCenter( matchingDocOrdinal ), @@ -474,7 +474,7 @@ protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPat } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( field0Path ).field( field1Path ) .circle( TypeCheckingNoConversionConfigured.dataSet.values.matchingCenter( matchingDocOrdinal ), diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinPolygonPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinPolygonPredicateBaseIT.java index a6cd506ce65..99a0027a361 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinPolygonPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SpatialWithinPolygonPredicateBaseIT.java @@ -128,14 +128,14 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ) .polygon( SingleFieldConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet dataSet) { return f.withParameters( params -> f.spatial().within().field( fieldPath ) .polygon( params.get( paramName, GeoPolygon.class ) ) ); @@ -166,21 +166,21 @@ public static List params() { } @Override - protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).field( otherFieldPath ) .polygon( MultiFieldConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, + protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) .polygon( MultiFieldConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).fields( fieldPaths ) @@ -211,7 +211,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ) .polygon( InObjectFieldConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); @@ -235,28 +235,28 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ) .polygon( ScoreConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) .polygon( ScoreConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) .polygon( ScoreConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ).boost( predicateBoost ); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.spatial().within().fields( fieldPaths ) @@ -265,14 +265,14 @@ protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(Se } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).boost( fieldBoost ) .polygon( ScoreConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ).boost( fieldBoost ) @@ -281,7 +281,7 @@ protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(Search } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.spatial().within().field( fieldPath ).boost( fieldBoost ) @@ -303,7 +303,7 @@ public InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.spatial().within().field( fieldPath ) // We need this because the backend is not involved before the call to polygon() .polygon( unsusedPolygon() ); @@ -337,7 +337,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.spatial().within().field( fieldPath ) // We need this because the backend is not involved before the call to polygon() .polygon( unsusedPolygon() ); @@ -379,7 +379,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.spatial().within().field( fieldPath ) // We need this because the backend is not involved before the call to polygon() .polygon( unsusedPolygon() ); @@ -406,7 +406,7 @@ public static List params() { } @Override - protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { f.spatial().within().field( fieldPath ).polygon( null ); } } @@ -444,14 +444,14 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( fieldPath ) .polygon( TypeCheckingNoConversionConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, int matchingDocOrdinal, DataSet dataSet) { return f.spatial().within().field( field0Path ).field( field1Path ) .polygon( TypeCheckingNoConversionConfigured.dataSet.values.matchingArg( matchingDocOrdinal ) ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/TermsPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/TermsPredicateBaseIT.java index ce6f1cafc69..77f8e3e6eeb 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/TermsPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/TermsPredicateBaseIT.java @@ -157,13 +157,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.terms().field( fieldPath ).matchingAny( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet> dataSet) { return f.withParameters( params -> f.terms().field( fieldPath ) .matchingAny( params.get( paramName, dataSet.fieldType.getJavaType() ) ) ); @@ -202,7 +202,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { assumeTrue( TckConfiguration.get().getBackendFeatures().canPerformTermsQuery( dataSet.fieldType ) @@ -219,7 +219,7 @@ protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPat } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet> dataSet) { return f.withParameters( params -> f.terms().field( fieldPath ) .matchingAny( params.get( paramName, Collection.class ) ) ); @@ -268,20 +268,20 @@ public static List params() { } @Override - protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.terms().field( fieldPath ).field( otherFieldPath ) .matchingAny( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return f.terms().fields( fieldPaths ).matchingAny( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return f.terms().field( fieldPath ).fields( fieldPaths ) .matchingAny( dataSet.values.matchingArg( matchingDocOrdinal ) ); @@ -319,7 +319,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.terms().field( fieldPath ).matchingAny( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @@ -351,27 +351,27 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet> dataSet) { return f.terms().field( fieldPath ).matchingAny( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet> dataSet) { return f.terms().fields( fieldPaths ).matchingAny( dataSet.values.matchingArg( matchingDocOrdinal ) ) .constantScore(); } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return f.terms().fields( fieldPaths ).matchingAny( dataSet.values.matchingArg( matchingDocOrdinal ) ) .boost( predicateBoost ); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return f.terms().fields( fieldPaths ).matchingAny( dataSet.values.matchingArg( matchingDocOrdinal ) ) @@ -379,21 +379,21 @@ protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(Se } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet> dataSet) { return f.terms().field( fieldPath ).boost( fieldBoost ) .matchingAny( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet> dataSet) { return f.terms().field( fieldPath ).boost( fieldBoost ) .matchingAny( dataSet.values.matchingArg( matchingDocOrdinal ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet> dataSet) { return f.terms().field( fieldPath ).boost( fieldBoost ) @@ -415,7 +415,7 @@ protected InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.terms().field( fieldPath ); } @@ -448,7 +448,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.terms().field( fieldPath ); } @@ -487,7 +487,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.terms().field( fieldPath ); } @@ -520,7 +520,7 @@ public static List params() { } @Override - protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { f.terms().field( fieldPath ).matchingAny( null ); } } @@ -576,18 +576,18 @@ public static List integerIndexParams() { @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { return f.terms().field( fieldPath ).matchingAny( matchingParam ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam, ValueModel valueModel) { return f.terms().field( fieldPath ).matchingAny( Collections.singletonList( matchingParam ), valueModel ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, Object matchingParam, ValueModel valueModel) { return f.terms().field( field0Path ).field( field1Path ) .matchingAny( Collections.singletonList( matchingParam ), valueModel ); @@ -595,14 +595,14 @@ protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Pa @Deprecated(since = "test") @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam, org.hibernate.search.engine.search.common.ValueConvert valueConvert) { return f.terms().field( fieldPath ).matchingAny( Collections.singletonList( matchingParam ), valueConvert ); } @Deprecated(since = "test") @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, Object matchingParam, org.hibernate.search.engine.search.common.ValueConvert valueConvert) { return f.terms().field( field0Path ).field( field1Path ) .matchingAny( Collections.singletonList( matchingParam ), valueConvert ); @@ -670,7 +670,7 @@ public ScaleCheckingConfigured() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, Object matchingParam) { return f.terms().field( fieldPath ).matchingAny( matchingParam ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/WildcardPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/WildcardPredicateBaseIT.java index 39147bff129..1ac09290b00 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/WildcardPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/WildcardPredicateBaseIT.java @@ -129,13 +129,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.wildcard().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, String paramName, DataSet dataSet) { return f.withParameters( params -> f.wildcard().field( fieldPath ) .matching( params.get( paramName, String.class ) ) ); @@ -173,20 +173,20 @@ public static List params() { } @Override - protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndField(SearchPredicateFactory f, String fieldPath, String otherFieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.wildcard().field( fieldPath ).field( otherFieldPath ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, + protected PredicateFinalStep predicateOnFields(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.wildcard().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory f, String fieldPath, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.wildcard().field( fieldPath ).fields( fieldPaths ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); @@ -222,7 +222,7 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.wildcard().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @@ -253,27 +253,27 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.wildcard().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithConstantScore(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, DataSet dataSet) { return f.wildcard().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) .constantScore(); } @Override - protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, + protected PredicateFinalStep predicateWithPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.wildcard().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) .boost( predicateBoost ); } @Override - protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(SearchPredicateFactory f, String[] fieldPaths, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.wildcard().fields( fieldPaths ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ) @@ -281,21 +281,21 @@ protected PredicateFinalStep predicateWithConstantScoreAndPredicateLevelBoost(Se } @Override - protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, + protected PredicateFinalStep predicateWithFieldLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.wildcard().field( fieldPath ).boost( fieldBoost ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndConstantScore(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, DataSet dataSet) { return f.wildcard().field( fieldPath ).boost( fieldBoost ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ).constantScore(); } @Override - protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, + protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost(SearchPredicateFactory f, String fieldPath, float fieldBoost, int matchingDocOrdinal, float predicateBoost, DataSet dataSet) { return f.wildcard().field( fieldPath ).boost( fieldBoost ) @@ -317,7 +317,7 @@ protected InvalidFieldConfigured() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.wildcard().field( fieldPath ); } @@ -349,7 +349,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { f.wildcard().field( fieldPath ); } @@ -388,7 +388,7 @@ public static List params() { } @Override - protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryPredicate(SearchPredicateFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.wildcard().field( fieldPath ); } @@ -420,7 +420,7 @@ public static List params() { } @Override - protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { + protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, String fieldPath) { f.wildcard().field( fieldPath ).matching( null ); } } @@ -464,13 +464,13 @@ public static List params() { } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String fieldPath, int matchingDocOrdinal, DataSet dataSet) { return f.wildcard().field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } @Override - protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, + protected PredicateFinalStep predicate(SearchPredicateFactory f, String field0Path, String field1Path, int matchingDocOrdinal, DataSet dataSet) { return f.wildcard().field( field0Path ).field( field1Path ) .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractCompositeProjectionFromAsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractCompositeProjectionFromAsIT.java index 56fa6f2f757..107786d58f9 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractCompositeProjectionFromAsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractCompositeProjectionFromAsIT.java @@ -76,9 +76,9 @@ protected AbstractCompositeProjectionFromAsIT(SimpleMappedIndex index, Abstra this.dataSet = dataSet; } - protected abstract CompositeProjectionInnerStep startProjection(SearchProjectionFactory f); + protected abstract CompositeProjectionInnerStep startProjection(SearchProjectionFactory f); - protected abstract CompositeProjectionInnerStep startProjectionForMulti(SearchProjectionFactory f); + protected abstract CompositeProjectionInnerStep startProjectionForMulti(SearchProjectionFactory f); private abstract class AbstractFromAnyNumberIT { @@ -241,17 +241,17 @@ public void inComposite() { .collect( Collectors.toList() ) ); } - protected CompositeProjectionFromAsStep doFrom(SearchProjectionFactory f, + protected CompositeProjectionFromAsStep doFrom(SearchProjectionFactory f, CompositeProjectionInnerStep step) { return doFrom( f, index.binding().composite(), CompositeBinding::absolutePath, step ); } - protected CompositeProjectionFromAsStep doFromForMulti(SearchProjectionFactory f, + protected CompositeProjectionFromAsStep doFromForMulti(SearchProjectionFactory f, CompositeProjectionInnerStep step) { return doFrom( f, index.binding().compositeForMulti(), CompositeBinding::absolutePath, step ); } - protected abstract CompositeProjectionFromAsStep doFrom(SearchProjectionFactory f, CompositeBinding binding, + protected abstract CompositeProjectionFromAsStep doFrom(SearchProjectionFactory f, CompositeBinding binding, BiFunction, String> pathGetter, CompositeProjectionInnerStep step); @@ -337,17 +337,17 @@ public void as_transformer_sortedSet() { } @Override - protected final S doFrom(SearchProjectionFactory f, CompositeProjectionInnerStep step) { + protected final S doFrom(SearchProjectionFactory f, CompositeProjectionInnerStep step) { return doFrom( f, index.binding().composite(), CompositeBinding::absolutePath, step ); } @Override - protected final S doFromForMulti(SearchProjectionFactory f, CompositeProjectionInnerStep step) { + protected final S doFromForMulti(SearchProjectionFactory f, CompositeProjectionInnerStep step) { return doFrom( f, index.binding().compositeForMulti(), CompositeBinding::absolutePath, step ); } @Override - protected abstract S doFrom(SearchProjectionFactory f, CompositeBinding binding, + protected abstract S doFrom(SearchProjectionFactory f, CompositeBinding binding, BiFunction, String> pathGetter, CompositeProjectionInnerStep step); @@ -369,7 +369,7 @@ protected final Collection> expectedTransformedForMulti() { class From1IT extends AbstractFromSpecificNumberIT, ValueWrapper> { @Override - protected CompositeProjectionFrom1AsStep doFrom(SearchProjectionFactory f, + protected CompositeProjectionFrom1AsStep doFrom(SearchProjectionFactory f, CompositeBinding binding, BiFunction, String> pathGetter, CompositeProjectionInnerStep step) { return step.from( f.field( pathGetter.apply( binding, binding.field1 ), String.class ) ); @@ -395,7 +395,7 @@ protected ValueWrapper expectedTransformed(int docOrdinal, int inDocOrdi class From2IT extends AbstractFromSpecificNumberIT, Pair> { @Override - protected CompositeProjectionFrom2AsStep doFrom(SearchProjectionFactory f, + protected CompositeProjectionFrom2AsStep doFrom(SearchProjectionFactory f, CompositeBinding binding, BiFunction, String> pathGetter, CompositeProjectionInnerStep step) { return step.from( f.field( pathGetter.apply( binding, binding.field1 ), String.class ), @@ -426,7 +426,7 @@ class From3IT extends AbstractFromSpecificNumberIT, Triplet> { @Override - protected CompositeProjectionFrom3AsStep doFrom(SearchProjectionFactory f, + protected CompositeProjectionFrom3AsStep doFrom(SearchProjectionFactory f, CompositeBinding binding, BiFunction, String> pathGetter, CompositeProjectionInnerStep step) { return step.from( f.field( pathGetter.apply( binding, binding.field1 ), String.class ), @@ -459,7 +459,7 @@ protected Triplet expectedTransformed(int docOrdinal, class From4IT extends AbstractFromAnyNumberIT { @Override - protected CompositeProjectionFromAsStep doFrom(SearchProjectionFactory f, + protected CompositeProjectionFromAsStep doFrom(SearchProjectionFactory f, CompositeBinding binding, BiFunction, String> pathGetter, CompositeProjectionInnerStep step) { return step.from( f.field( pathGetter.apply( binding, binding.field1 ), String.class ), diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractDistanceProjectionMultiValuedBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractDistanceProjectionMultiValuedBaseIT.java index 90fb30107fe..e8e75a2a310 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractDistanceProjectionMultiValuedBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractDistanceProjectionMultiValuedBaseIT.java @@ -383,17 +383,17 @@ private static List divideAll(List distances, double denominator return distances.stream().map( v -> v / denominator ).collect( Collectors.toList() ); } - protected abstract void addParameter(SearchQueryOptionsStep query, String parameterName, Object value); + protected abstract void addParameter(SearchQueryOptionsStep query, String parameterName, Object value); protected abstract ProjectionFinalStep> distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, String parameterName); protected abstract ProjectionFinalStep> distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, DistanceUnit unit, String centerParam, String unitParam); - protected abstract SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, + protected abstract SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, String parameterName); private static class DataSet { diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractDistanceProjectionSingleValuedBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractDistanceProjectionSingleValuedBaseIT.java index 0ae726e901e..e5494dab224 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractDistanceProjectionSingleValuedBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractDistanceProjectionSingleValuedBaseIT.java @@ -439,21 +439,21 @@ protected String getFieldPath(TestedFieldStructure fieldStructure) { return mainIndex.binding().getFieldPath( fieldStructure, fieldType ); } - protected abstract void addParameter(SearchQueryOptionsStep query, String parameterName, Object value); + protected abstract void addParameter(SearchQueryOptionsStep query, String parameterName, Object value); protected abstract ProjectionFinalStep distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, String parameterName); protected abstract ProjectionFinalStep> distanceMulti( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, String parameterName); protected abstract ProjectionFinalStep distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, DistanceUnit unit, String centerParam, String unitParam); - protected abstract SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, + protected abstract SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, String parameterName); protected static class DataSet { diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractEntityProjectionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractEntityProjectionIT.java index cd8e74a5495..048d2d54a47 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractEntityProjectionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractEntityProjectionIT.java @@ -85,8 +85,8 @@ protected AbstractEntityProjectionIT(SimpleMappedIndex mainIndex, this.multiIndex4 = multiIndex4; } - public abstract SearchQueryWhereStep select( - SearchQuerySelectStep step); + public abstract SearchQueryWhereStep select( + SearchQuerySelectStep step); @Test @TestForIssue(jiraKey = "HSEARCH-3578") @@ -104,7 +104,7 @@ void entityLoading() { mainIndex.mapping().with() .typeContext( mainIndex.typeName(), mainTypeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); SearchQuery query = select( scope.query() ) .where( f -> f.matchAll() ) @@ -149,7 +149,7 @@ void entityLoading_timeout() { mainIndex.mapping().with() .typeContext( mainIndex.typeName(), mainTypeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); SearchQuery query = select( scope.query() ) .where( f -> f.matchAll() ) @@ -208,7 +208,7 @@ void entityLoading_callGetProjectionHitMapperEveryTime() { mainIndex.mapping().with() .typeContext( mainIndex.typeName(), mainTypeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); SearchQuery query = select( scope.query() ) .where( f -> f.matchAll() ) @@ -254,7 +254,7 @@ void entityLoading_failed_skipHit() { mainIndex.mapping().with() .typeContext( mainIndex.typeName(), mainTypeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); SearchQuery query = select( scope.query() ) .where( f -> f.matchAll() ) @@ -291,7 +291,7 @@ void noLoadingAvailable_noProjectionRegistryEntry_fails() { .typeContext( mainIndex.typeName(), mainTypeContextMock ) .projectionRegistry( projectionRegistryMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); SearchQuery query = select( scope.query( loadingContextMock ) ) .where( f -> f.matchAll() ) @@ -334,7 +334,7 @@ void projectionRegistryFallback_withLoadingAvailable_doesNotCheckProjectionRegis .typeContext( mainIndex.typeName(), mainTypeContextMock ) .projectionRegistry( projectionRegistryMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); expectHitMapping( @@ -383,7 +383,7 @@ void projectionRegistryFallback_noLoadingAvailable_withProjectionRegistryEntry_u .typeContext( mainIndex.typeName(), mainTypeContextMock ) .projectionRegistry( projectionRegistryMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); SearchQuery query = select( scope.query( loadingContextMock ) ) @@ -472,7 +472,7 @@ void projectionRegistryFallback_multiType() { .typeContext( multiIndex4.typeName(), type4ContextMock ) .projectionRegistry( projectionRegistryMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = multiIndex1.createGenericScope( loadingContextMock, multiIndex2, multiIndex3, multiIndex4 ); SearchQuery query = select( scope.query( loadingContextMock ) ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractEntityReferenceProjectionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractEntityReferenceProjectionIT.java index 0194d4e1ee8..877ed796ea2 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractEntityReferenceProjectionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractEntityReferenceProjectionIT.java @@ -47,8 +47,8 @@ protected AbstractEntityReferenceProjectionIT(StubMappedIndex mainIndex) { this.mainIndex = mainIndex; } - public abstract SearchQueryWhereStep select( - SearchQuerySelectStep step); + public abstract SearchQueryWhereStep select( + SearchQuerySelectStep step); @Test void test() { @@ -63,7 +63,7 @@ void test() { mainIndex.mapping().with() .typeContext( mainIndex.typeName(), mainTypeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); SearchQuery referencesQuery = select( scope.query() ) .where( f -> f.matchAll() ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionInObjectProjectionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionInObjectProjectionIT.java index 869554a75e3..e19247c3b55 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionInObjectProjectionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionInObjectProjectionIT.java @@ -1036,10 +1036,11 @@ private String level2MultiValuedFieldPath(SimpleMappedIndex mainIn .multiValuedFieldAbsolutePath( dataSet.fieldType ); } - protected abstract ProjectionFinalStep

singleValuedProjection(SearchProjectionFactory f, String absoluteFieldPath, + protected abstract ProjectionFinalStep

singleValuedProjection(SearchProjectionFactory f, + String absoluteFieldPath, DataSet dataSet); - protected abstract ProjectionFinalStep> multiValuedProjection(SearchProjectionFactory f, + protected abstract ProjectionFinalStep> multiValuedProjection(SearchProjectionFactory f, String absoluteFieldPath, DataSet dataSet); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionInvalidFieldIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionInvalidFieldIT.java index 3c223456bd5..a7842129806 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionInvalidFieldIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionInvalidFieldIT.java @@ -27,7 +27,7 @@ protected AbstractProjectionInvalidFieldIT(SimpleMappedIndex index @Test void use_unknownField() { - SearchProjectionFactory f = index.createScope().projection(); + SearchProjectionFactory f = index.createScope().projection(); assertThatThrownBy( () -> tryProjection( f, "unknown_field" ) ) .isInstanceOf( SearchException.class ) @@ -57,7 +57,7 @@ void trait_objectField_flattened() { @Test void use_objectField_nested() { - SearchProjectionFactory f = index.createScope().projection(); + SearchProjectionFactory f = index.createScope().projection(); String fieldPath = index.binding().nested.relativeFieldName; @@ -68,7 +68,7 @@ void use_objectField_nested() { @Test void use_objectField_flattened() { - SearchProjectionFactory f = index.createScope().projection(); + SearchProjectionFactory f = index.createScope().projection(); String fieldPath = index.binding().flattened.relativeFieldName; @@ -77,7 +77,7 @@ void use_objectField_flattened() { .hasMessageContaining( "Cannot use '" + projectionTrait() + "' on field '" + fieldPath + "'" ); } - protected abstract void tryProjection(SearchProjectionFactory f, String fieldPath); + protected abstract void tryProjection(SearchProjectionFactory f, String fieldPath); protected abstract String projectionTrait(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionProjectableIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionProjectableIT.java index db71d8f2a41..df112886437 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionProjectableIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionProjectableIT.java @@ -91,7 +91,7 @@ void projectable_default_use( "Skipping this test as the backend makes fields projectable by default." ); - SearchProjectionFactory f = projectableDefaultIndex.createScope().projection(); + SearchProjectionFactory f = projectableDefaultIndex.createScope().projection(); String fieldPath = projectableDefaultIndex.binding().field.get( fieldType ).relativeFieldName; @@ -110,7 +110,7 @@ void projectable_no_use( SimpleMappedIndex projectableYesIndex, SimpleMappedIndex projectableNoIndex, FieldTypeDescriptor fieldType) { - SearchProjectionFactory f = projectableNoIndex.createScope().projection(); + SearchProjectionFactory f = projectableNoIndex.createScope().projection(); String fieldPath = projectableNoIndex.binding().field.get( fieldType ).relativeFieldName; @@ -130,7 +130,7 @@ void multiIndex_incompatibleProjectable( SimpleMappedIndex projectableYesIndex, SimpleMappedIndex projectableNoIndex, FieldTypeDescriptor fieldType) { - SearchProjectionFactory f = projectableYesIndex.createScope( projectableNoIndex ).projection(); + SearchProjectionFactory f = projectableYesIndex.createScope( projectableNoIndex ).projection(); String fieldPath = projectableYesIndex.binding().field.get( fieldType ).relativeFieldName; @@ -142,7 +142,7 @@ void multiIndex_incompatibleProjectable( ); } - protected abstract void tryProjection(SearchProjectionFactory f, String fieldPath, + protected abstract void tryProjection(SearchProjectionFactory f, String fieldPath, FieldTypeDescriptor fieldType); protected abstract String projectionTrait(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionUnsupportedTypesIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionUnsupportedTypesIT.java index 8c62cc51a6d..a2987339eb4 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionUnsupportedTypesIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/AbstractProjectionUnsupportedTypesIT.java @@ -50,7 +50,7 @@ void use(SimpleMappedIndex index, FieldTypeDescriptor fieldT ); } - protected abstract void tryProjection(SearchProjectionFactory f, String fieldPath); + protected abstract void tryProjection(SearchProjectionFactory f, String fieldPath); protected abstract String projectionTrait(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/CompositeProjectionBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/CompositeProjectionBaseIT.java index c1a93004d88..bd36653f73e 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/CompositeProjectionBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/CompositeProjectionBaseIT.java @@ -62,12 +62,12 @@ public FromAsConfigured() { } @Override - protected CompositeProjectionInnerStep startProjection(SearchProjectionFactory f) { + protected CompositeProjectionInnerStep startProjection(SearchProjectionFactory f) { return f.composite(); } @Override - protected CompositeProjectionInnerStep startProjectionForMulti(SearchProjectionFactory f) { + protected CompositeProjectionInnerStep startProjectionForMulti(SearchProjectionFactory f) { return f.composite(); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionBaseIT.java index cddafd71461..72cdddd8d0c 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionBaseIT.java @@ -146,13 +146,13 @@ protected RecursiveComparisonConfiguration.Builder configureRecursiveComparison( } @Override - protected ProjectionFinalStep singleValuedProjection(SearchProjectionFactory f, + protected ProjectionFinalStep singleValuedProjection(SearchProjectionFactory f, String absoluteFieldPath, DataSet dataSet) { return f.distance( absoluteFieldPath, dataSet.values.projectionCenterPoint() ); } @Override - protected ProjectionFinalStep> multiValuedProjection(SearchProjectionFactory f, + protected ProjectionFinalStep> multiValuedProjection(SearchProjectionFactory f, String absoluteFieldPath, DataSet dataSet) { return f.distance( absoluteFieldPath, dataSet.values.projectionCenterPoint() ) .collector( ProjectionCollector.list() ); @@ -174,7 +174,7 @@ public InvalidFieldConfigured() { } @Override - protected void tryProjection(SearchProjectionFactory f, String fieldPath) { + protected void tryProjection(SearchProjectionFactory f, String fieldPath) { f.distance( fieldPath, GeoPoint.of( 0.0, 0.0 ) ); } @@ -206,7 +206,7 @@ public static List params() { } @Override - protected void tryProjection(SearchProjectionFactory f, String fieldPath) { + protected void tryProjection(SearchProjectionFactory f, String fieldPath) { f.distance( fieldPath, GeoPoint.of( 0.0, 0.0 ) ); } @@ -245,7 +245,8 @@ public static List params() { } @Override - protected void tryProjection(SearchProjectionFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryProjection(SearchProjectionFactory f, String fieldPath, + FieldTypeDescriptor fieldType) { f.distance( fieldPath, GeoPoint.of( 0.0, 0.0 ) ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionMultiValuedBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionMultiValuedBaseIT.java index ccd492c66de..2eece470973 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionMultiValuedBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionMultiValuedBaseIT.java @@ -20,26 +20,26 @@ class DistanceProjectionMultiValuedBaseIT extends AbstractDistanceProjectionMultiValuedBaseIT { @Override - protected void addParameter(SearchQueryOptionsStep query, String parameterName, Object value) { + protected void addParameter(SearchQueryOptionsStep query, String parameterName, Object value) { // do nothing } @Override protected ProjectionFinalStep> distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, String parameterName) { return projection.distance( path, center ).multi(); } @Override protected ProjectionFinalStep> distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, DistanceUnit unit, String centerParam, String unitParam) { return projection.distance( path, center ).multi().unit( unit ); } @Override - protected SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, + protected SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, String parameterName) { return sort.distance( path, center ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionParameterMultiValuedBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionParameterMultiValuedBaseIT.java index a91578301d2..c43555e8bea 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionParameterMultiValuedBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionParameterMultiValuedBaseIT.java @@ -22,13 +22,13 @@ class DistanceProjectionParameterMultiValuedBaseIT extends AbstractDistanceProjectionMultiValuedBaseIT { @Override - protected void addParameter(SearchQueryOptionsStep query, String parameterName, Object value) { + protected void addParameter(SearchQueryOptionsStep query, String parameterName, Object value) { query.param( parameterName, value ); } @Override protected ProjectionFinalStep> distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, String parameterName) { return projection.withParameters( params -> projection.distance( path, params.get( parameterName, GeoPoint.class ) ) @@ -37,7 +37,7 @@ protected ProjectionFinalStep> distance( @Override protected ProjectionFinalStep> distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, DistanceUnit unit, String centerParam, String unitParam) { return projection.withParameters( params -> projection.distance( path, params.get( centerParam, GeoPoint.class ) ) @@ -46,7 +46,7 @@ protected ProjectionFinalStep> distance( } @Override - protected SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, String parameterName) { + protected SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, String parameterName) { return sort.withParameters( param -> sort.distance( path, param.get( parameterName, GeoPoint.class ) ) ); } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionParameterSingleValuedBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionParameterSingleValuedBaseIT.java index ed0be013f2d..28eb6253634 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionParameterSingleValuedBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionParameterSingleValuedBaseIT.java @@ -21,13 +21,13 @@ class DistanceProjectionParameterSingleValuedBaseIT extends AbstractDistanceProj @Override - protected void addParameter(SearchQueryOptionsStep query, String parameterName, Object value) { + protected void addParameter(SearchQueryOptionsStep query, String parameterName, Object value) { query.param( parameterName, value ); } @Override protected ProjectionFinalStep distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, String parameterName) { return projection.withParameters( params -> projection.distance( path, params.get( parameterName, GeoPoint.class ) ) ); @@ -35,7 +35,7 @@ protected ProjectionFinalStep distance( @Override protected ProjectionFinalStep> distanceMulti( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, String parameterName) { return projection.withParameters( params -> projection.distance( path, params.get( parameterName, GeoPoint.class ) ) @@ -44,7 +44,7 @@ protected ProjectionFinalStep> distanceMulti( @Override protected ProjectionFinalStep distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, DistanceUnit unit, String centerParam, String unitParam) { return projection.withParameters( params -> projection.distance( path, params.get( centerParam, GeoPoint.class ) ) @@ -52,7 +52,7 @@ protected ProjectionFinalStep distance( } @Override - protected SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, String parameterName) { + protected SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, String parameterName) { return sort.withParameters( param -> sort.distance( path, param.get( parameterName, GeoPoint.class ) ) ); } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionSingleValuedBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionSingleValuedBaseIT.java index c879f65a3fd..b53dc8b95dd 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionSingleValuedBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionSingleValuedBaseIT.java @@ -145,33 +145,33 @@ void array(TestedFieldStructure fieldStructure, DataSet dataSet) { } @Override - protected void addParameter(SearchQueryOptionsStep query, String parameterName, Object value) { + protected void addParameter(SearchQueryOptionsStep query, String parameterName, Object value) { // do nothing } @Override protected DistanceToFieldProjectionValueStep distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, String parameterName) { return projection.distance( path, center ); } @Override protected ProjectionFinalStep> distanceMulti( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, String parameterName) { return projection.distance( path, center ).list(); } @Override protected DistanceToFieldProjectionOptionsStep distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, DistanceUnit unit, String centerParam, String unitParam) { return projection.distance( path, center ).unit( unit ); } @Override - protected SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, String parameterName) { + protected SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, String parameterName) { return sort.distance( path, center ); } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/EntityProjectionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/EntityProjectionIT.java index 6d85f087109..86de31d6413 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/EntityProjectionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/EntityProjectionIT.java @@ -80,7 +80,7 @@ static void setup() { } @Override - public SearchQueryWhereStep select(SearchQuerySelectStep step) { + public SearchQueryWhereStep select(SearchQuerySelectStep step) { return step.select( f -> f.entity() ); } @@ -115,7 +115,7 @@ void projectionRegistryFallback_noLoadingAvailable_withProjectionRegistryEntry_i .typeContext( mainIndex.typeName(), mainTypeContextMock ) .projectionRegistry( projectionRegistryMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); IndexBinding binding = mainIndex.binding(); @@ -173,7 +173,7 @@ void expectedType_exact() { mainIndex.mapping().with() .typeContext( mainIndex.typeName(), mainTypeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); SearchQuery query = scope.query().select( f -> f.entity( StubEntity.class ) ) .where( f -> f.matchAll() ) @@ -207,7 +207,7 @@ void expectedType_superType() { mainIndex.mapping().with() .typeContext( mainIndex.typeName(), mainTypeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); SearchQuery query = scope.query().select( f -> f.entity( Object.class ) ) .where( f -> f.matchAll() ) @@ -236,7 +236,7 @@ void expectedType_invalid() { mainIndex.mapping().with() .typeContext( mainIndex.typeName(), mainTypeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); assertThatThrownBy( () -> scope.query().select( f -> f.entity( Integer.class ) ) ) .isInstanceOf( SearchException.class ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/EntityReferenceProjectionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/EntityReferenceProjectionIT.java index 95072e648e5..c8ad319b17d 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/EntityReferenceProjectionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/EntityReferenceProjectionIT.java @@ -34,7 +34,7 @@ static void setup() { } @Override - public SearchQueryWhereStep select(SearchQuerySelectStep step) { + public SearchQueryWhereStep select(SearchQuerySelectStep step) { return step.select( f -> f.entityReference() ); } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/FieldProjectionBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/FieldProjectionBaseIT.java index 3a77ff342da..965deb29670 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/FieldProjectionBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/FieldProjectionBaseIT.java @@ -152,13 +152,13 @@ protected RecursiveComparisonConfiguration.Builder configureRecursiveComparison( } @Override - protected ProjectionFinalStep singleValuedProjection(SearchProjectionFactory f, + protected ProjectionFinalStep singleValuedProjection(SearchProjectionFactory f, String absoluteFieldPath, DataSet> dataSet) { return f.field( absoluteFieldPath, dataSet.fieldType.getJavaType() ); } @Override - protected ProjectionFinalStep> multiValuedProjection(SearchProjectionFactory f, + protected ProjectionFinalStep> multiValuedProjection(SearchProjectionFactory f, String absoluteFieldPath, DataSet> dataSet) { return f.field( absoluteFieldPath, dataSet.fieldType.getJavaType() ).collector( ProjectionCollector.list() ); } @@ -179,7 +179,7 @@ public InvalidFieldConfigured() { } @Override - protected void tryProjection(SearchProjectionFactory f, String fieldPath) { + protected void tryProjection(SearchProjectionFactory f, String fieldPath) { f.field( fieldPath ); } @@ -218,7 +218,8 @@ public static List params() { } @Override - protected void tryProjection(SearchProjectionFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void tryProjection(SearchProjectionFactory f, String fieldPath, + FieldTypeDescriptor fieldType) { f.field( fieldPath ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionBaseIT.java index 59cfafd3127..f53288d57b0 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionBaseIT.java @@ -66,12 +66,12 @@ public FromAsConfigured() { } @Override - protected CompositeProjectionInnerStep startProjection(SearchProjectionFactory f) { + protected CompositeProjectionInnerStep startProjection(SearchProjectionFactory f) { return f.object( index.binding().objectField.relativeName ); } @Override - protected CompositeProjectionInnerStep startProjectionForMulti(SearchProjectionFactory f) { + protected CompositeProjectionInnerStep startProjectionForMulti(SearchProjectionFactory f) { return f.object( index.binding().objectField_multi.relativeName ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionSpecificsIT.java index ac2651743f3..a21c881c49d 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionSpecificsIT.java @@ -110,7 +110,7 @@ void multiValuedObjectField_flattened_unsupported() { TckConfiguration.get().getBackendFeatures().reliesOnNestedDocumentsForMultiValuedObjectProjection(), "This test is only relevant if the backend relies on nested documents to implement object projections on multi-valued fields" ); - SearchProjectionFactory f = index.createScope().projection(); + SearchProjectionFactory f = index.createScope().projection(); assertThatThrownBy( () -> f.object( "flattenedLevel1" ) ) .isInstanceOf( SearchException.class ) .hasMessageContainingAll( "Cannot use 'projection:object' on field 'flattenedLevel1'", @@ -122,7 +122,7 @@ void multiValuedObjectField_flattened_unsupported() { @Test void multiValuedObjectField_singleValuedObjectProjection() { - SearchProjectionFactory f = index.createScope().projection(); + SearchProjectionFactory f = index.createScope().projection(); assertThatThrownBy( () -> f.object( "level1" ) .from( f.field( "level1.field1" ) ) .asList() diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/SearchProjectionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/SearchProjectionIT.java index ef570968304..f84e2b16a7f 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/SearchProjectionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/SearchProjectionIT.java @@ -163,7 +163,7 @@ void references() { mainIndex.mapping().with() .typeContext( mainIndex.typeName(), mainTypeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = mainIndex.createGenericScope( loadingContextMock ); SearchQuery> query; /* @@ -873,28 +873,28 @@ private FieldModel(IndexFieldReference reference, String relativeFieldName, } } - private static class SupportedExtension - implements SearchProjectionFactoryExtension, R, E> { + private static class SupportedExtension + implements SearchProjectionFactoryExtension, R, E> { @Override - public Optional> extendOptional(SearchProjectionFactory original) { + public Optional> extendOptional(SearchProjectionFactory original) { assertThat( original ).isNotNull(); return Optional.of( new MyExtendedFactory<>( original ) ); } } - private static class UnSupportedExtension - implements SearchProjectionFactoryExtension, R, E> { + private static class UnSupportedExtension + implements SearchProjectionFactoryExtension, R, E> { @Override - public Optional> extendOptional(SearchProjectionFactory original) { + public Optional> extendOptional(SearchProjectionFactory original) { assertThat( original ).isNotNull(); return Optional.empty(); } } - private static class MyExtendedFactory { - private final SearchProjectionFactory delegate; + private static class MyExtendedFactory { + private final SearchProjectionFactory delegate; - MyExtendedFactory(SearchProjectionFactory delegate) { + MyExtendedFactory(SearchProjectionFactory delegate) { this.delegate = delegate; } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryBaseIT.java index ab6e4a1e763..03ddb34712d 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryBaseIT.java @@ -14,6 +14,7 @@ import java.time.Duration; import java.time.LocalDate; import java.time.temporal.ChronoUnit; +import java.util.Map; import java.util.Optional; import java.util.concurrent.atomic.AtomicInteger; @@ -205,12 +206,13 @@ void queryParameters_nulls() { void queryParameters_access() { StubMappingScope scope = index.createScope(); AtomicInteger counter = new AtomicInteger( 0 ); + AggregationKey> key = AggregationKey.of( "key" ); scope.query() .select( f -> f.withParameters( params -> assertParameters( params, f, counter ) .field( "string" ) ) ) .where( f -> f.withParameters( ctx -> assertParameters( ctx, f, counter ).matchAll() ) ) .sort( f -> f.withParameters( ctx -> assertParameters( ctx, f, counter ).score() ) ) - .aggregation( AggregationKey.of( "key" ), f -> f.withParameters( + .aggregation( key, f -> f.withParameters( ctx -> assertParameters( ctx, f, counter ).terms().field( "string", String.class ) ) ) .param( "p1", null ) .param( "p2", 1 ) @@ -269,7 +271,7 @@ private static T assertParameters(NamedValues params, T factory, AtomicInteg return factory; } - private SearchQueryOptionsStep matchAllSortedByScoreQuery() { + private SearchQueryOptionsStep matchAllSortedByScoreQuery() { return index.query() .where( f -> f.matchAll() ); } @@ -280,7 +282,7 @@ private static T assertParameters(NamedValues params, T factory, AtomicInteg * because optimizations are possible with MatchAllDocsQuery that would allow Hibernate Search * to return an exact total hit count in constant time, ignoring the total hit count threshold. */ - private SearchQueryOptionsStep matchAllWithConditionSortedByScoreQuery() { + private SearchQueryOptionsStep matchAllWithConditionSortedByScoreQuery() { return index.query() .where( f -> f.exists().field( "string" ) ); } @@ -338,26 +340,26 @@ public Optional> extendOptional(SearchQuery original, } } - private static class SupportedQueryDslExtension + private static class SupportedQueryDslExtension implements - SearchQueryDslExtension, R, E, LOS> { + SearchQueryDslExtension, R, E, LOS> { @Override - public Optional> extendOptional(SearchQuerySelectStep original, + public Optional> extendOptional(SearchQuerySelectStep original, SearchQueryIndexScope scope, BackendSessionContext sessionContext, SearchLoadingContextBuilder loadingContextBuilder) { assertThat( original ).isNotNull(); assertThat( scope ).isNotNull(); assertThat( sessionContext ).isNotNull(); assertThat( loadingContextBuilder ).isNotNull(); - return Optional.of( new MyExtendedDslContext( original.selectEntity() ) ); + return Optional.of( new MyExtendedDslContext( original.selectEntity() ) ); } } - private static class UnSupportedQueryDslExtension + private static class UnSupportedQueryDslExtension implements - SearchQueryDslExtension, R, E, LOS> { + SearchQueryDslExtension, R, E, LOS> { @Override - public Optional> extendOptional(SearchQuerySelectStep original, + public Optional> extendOptional(SearchQuerySelectStep original, SearchQueryIndexScope scope, BackendSessionContext sessionContext, SearchLoadingContextBuilder loadingContextBuilder) { assertThat( original ).isNotNull(); @@ -368,10 +370,10 @@ public Optional> extendOptional(SearchQuerySelectStep { - private final SearchQueryWhereStep delegate; + private static class MyExtendedDslContext { + private final SearchQueryWhereStep delegate; - MyExtendedDslContext(SearchQueryWhereStep delegate) { + MyExtendedDslContext(SearchQueryWhereStep delegate) { this.delegate = delegate; } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryFetchIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryFetchIT.java index 448d7f2ebea..2239dfa3304 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryFetchIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryFetchIT.java @@ -366,33 +366,33 @@ void maxResults_zero() { .hasNoHits(); } - private SearchQueryOptionsStep matchAllQuerySortByField() { + private SearchQueryOptionsStep matchAllQuerySortByField() { StubMappingScope scope = index.createScope(); return scope.query() .where( f -> f.matchAll() ) .sort( f -> f.field( "integer" ).asc() ); } - private SearchQueryOptionsStep matchAllQuerySortByDefault() { + private SearchQueryOptionsStep matchAllQuerySortByDefault() { StubMappingScope scope = index.createScope(); return scope.query().where( f -> f.simpleQueryString().field( "text" ) .matching( "mostimportantword^100 lessimportantword^10 leastimportantword^0.1" ) ); } - private SearchQueryOptionsStep matchFirstHalfQuery() { + private SearchQueryOptionsStep matchFirstHalfQuery() { StubMappingScope scope = index.createScope(); return scope.query() .where( f -> f.range().field( "integer" ).lessThan( DOCUMENT_COUNT / 2 ) ) .sort( f -> f.field( "integer" ).asc() ); } - private SearchQueryOptionsStep matchOneQuery(int id) { + private SearchQueryOptionsStep matchOneQuery(int id) { StubMappingScope scope = index.createScope(); return scope.query() .where( f -> f.match().field( "integer" ).matching( id ) ); } - private SearchQueryOptionsStep matchNoneQuery() { + private SearchQueryOptionsStep matchNoneQuery() { StubMappingScope scope = index.createScope(); return scope.query() .where( f -> f.match().field( "integer" ).matching( DOCUMENT_COUNT + 2 ) ); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryLoadingOptionsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryLoadingOptionsIT.java index 3a9a5bd8a18..ff7657a9fa0 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryLoadingOptionsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryLoadingOptionsIT.java @@ -59,7 +59,7 @@ void defaultResultType() { index.mapping().with() .typeContext( index.typeName(), typeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = index.createGenericScope( loadingContextMock ); scope.query( loadingOptionsStepMock ) .where( f -> f.matchAll() ) @@ -82,7 +82,7 @@ void selectEntity() { index.mapping().with() .typeContext( index.typeName(), typeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = index.createGenericScope( loadingContextMock ); scope.query( loadingOptionsStepMock ) .selectEntity() @@ -104,7 +104,7 @@ void selectEntityReference() { index.mapping().with() .typeContext( index.typeName(), typeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = index.createGenericScope( loadingContextMock ); scope.query( loadingOptionsStepMock ) .selectEntityReference() @@ -129,7 +129,7 @@ void select() { index.mapping().with() .typeContext( index.typeName(), typeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = index.createGenericScope( loadingContextMock ); scope.query( loadingOptionsStepMock ) .select( f -> f.composite( f.entity(), f.field( "string" ) ) ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollIT.java index 7ec3a988f35..da34f7ed55d 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollIT.java @@ -256,7 +256,7 @@ private void checkScrolling(SearchScroll scroll, int document assertThat( scrollResult.hasHits() ).isFalse(); } - private SearchQueryOptionsStep matchAllQuery() { + private SearchQueryOptionsStep matchAllQuery() { return index.query() .where( f -> f.matchAll() ) .sort( f -> f.field( "integer" ).asc() ); @@ -268,23 +268,23 @@ private void checkScrolling(SearchScroll scroll, int document * because optimizations are possible with MatchAllDocsQuery that would allow Hibernate Search * to return an exact total hit count in constant time, ignoring the total hit count threshold. */ - private SearchQueryOptionsStep matchAllWithConditionSortedByScoreQuery() { + private SearchQueryOptionsStep matchAllWithConditionSortedByScoreQuery() { return index.query() .where( f -> f.exists().field( "integer" ) ); } - private SearchQueryOptionsStep matchFirstHalfQuery() { + private SearchQueryOptionsStep matchFirstHalfQuery() { return index.query() .where( f -> f.range().field( "integer" ).lessThan( DOCUMENT_COUNT / 2 ) ) .sort( f -> f.field( "integer" ).asc() ); } - private SearchQueryOptionsStep matchOneQuery(int id) { + private SearchQueryOptionsStep matchOneQuery(int id) { return index.query() .where( f -> f.match().field( "integer" ).matching( id ) ); } - private SearchQueryOptionsStep matchNoneQuery() { + private SearchQueryOptionsStep matchNoneQuery() { return index.query() .where( f -> f.match().field( "integer" ).matching( DOCUMENT_COUNT + 2 ) ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollResultLoadingIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollResultLoadingIT.java index e451bb189db..06c64ae13a1 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollResultLoadingIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryScrollResultLoadingIT.java @@ -75,7 +75,8 @@ void resultLoadingOnScrolling() { index.mapping().with() .typeContext( index.typeName(), typeContextMock ) .run( () -> { - GenericStubMappingScope scope = index.createGenericScope( loadingContextMock ); + GenericStubMappingScope scope = + index.createGenericScope( loadingContextMock ); SearchQuery query = scope.query() .where( f -> f.matchAll() ) .sort( f -> f.field( "integer" ) ) @@ -97,7 +98,7 @@ void resultLoadingOnScrolling_entityLoadingTimeout() { index.mapping().with() .typeContext( index.typeName(), typeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = index.createGenericScope( loadingContextMock ); SearchQuery query = scope.query() .where( f -> f.matchAll() ) @@ -121,7 +122,7 @@ void resultLoadingOnScrolling_softTimeout() { index.mapping().with() .typeContext( index.typeName(), typeContextMock ) .run( () -> { - GenericStubMappingScope scope = + GenericStubMappingScope scope = index.createGenericScope( loadingContextMock ); SearchQuery query = scope.query() .where( f -> f.matchAll() ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQuerySelectIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQuerySelectIT.java index a9208f08ba5..df4e8705a3e 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQuerySelectIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQuerySelectIT.java @@ -74,7 +74,8 @@ public SelectDefaultIT() { } @Override - public SearchQueryWhereStep select(SearchQuerySelectStep step) { + public SearchQueryWhereStep select( + SearchQuerySelectStep step) { return step; } } @@ -88,7 +89,8 @@ public SelectEntityIT() { } @Override - public SearchQueryWhereStep select(SearchQuerySelectStep step) { + public SearchQueryWhereStep select( + SearchQuerySelectStep step) { return step.selectEntity(); } } @@ -100,7 +102,8 @@ public SelectEntityReferenceIT() { } @Override - public SearchQueryWhereStep select(SearchQuerySelectStep step) { + public SearchQueryWhereStep select( + SearchQuerySelectStep step) { return step.selectEntityReference(); } } @@ -118,7 +121,8 @@ public SelectDefaultWithExtensionIT() { } @Override - public SearchQueryWhereStep select(SearchQuerySelectStep step) { + public SearchQueryWhereStep select( + SearchQuerySelectStep step) { return step.extension( TckConfiguration.get().getBackendHelper().queryDslExtension() ); } } @@ -132,8 +136,9 @@ public SelectEntityWithExtensionIT() { } @Override - public SearchQueryWhereStep select(SearchQuerySelectStep step) { - return step.extension( TckConfiguration.get().getBackendHelper().queryDslExtension() ) + public SearchQueryWhereStep select( + SearchQuerySelectStep step) { + return step.extension( TckConfiguration.get().getBackendHelper().queryDslExtension() ) .selectEntity(); } } @@ -145,8 +150,9 @@ public SelectEntityReferenceWithExtensionIT() { } @Override - public SearchQueryWhereStep select(SearchQuerySelectStep step) { - return step.extension( TckConfiguration.get().getBackendHelper().queryDslExtension() ) + public SearchQueryWhereStep select( + SearchQuerySelectStep step) { + return step.extension( TckConfiguration.get().getBackendHelper().queryDslExtension() ) .selectEntityReference(); } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryTimeoutIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryTimeoutIT.java index d4fee636017..9d8250b3332 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryTimeoutIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/query/SearchQueryTimeoutIT.java @@ -198,12 +198,12 @@ void scroll_truncateAfter_fastQuery_largeTimeout() { } } - private SearchQueryOptionsStep startSlowQuery() { + private SearchQueryOptionsStep startSlowQuery() { return index.createScope().query() .where( f -> TckConfiguration.get().getBackendHelper().createSlowPredicate( f ) ); } - private SearchQueryOptionsStep startFastQuery() { + private SearchQueryOptionsStep startFastQuery() { return index.createScope().query() .where( f -> f.match().field( EMPTY_FIELD_NAME ).matching( NON_MATCHING_INTEGER ) ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortInvalidFieldIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortInvalidFieldIT.java index 56b2c806c27..4cd57a099cc 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortInvalidFieldIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortInvalidFieldIT.java @@ -27,7 +27,7 @@ protected AbstractSortInvalidFieldIT(SimpleMappedIndex index) { @Test void use_unknownField() { - SearchSortFactory f = index.createScope().sort(); + SearchSortFactory f = index.createScope().sort(); assertThatThrownBy( () -> trySort( f, "unknown_field" ) ) .isInstanceOf( SearchException.class ) @@ -57,7 +57,7 @@ void trait_objectField_flattened() { @Test void use_objectField_nested() { - SearchSortFactory f = index.createScope().sort(); + SearchSortFactory f = index.createScope().sort(); String fieldPath = index.binding().nested.relativeFieldName; @@ -68,7 +68,7 @@ void use_objectField_nested() { @Test void use_objectField_flattened() { - SearchSortFactory f = index.createScope().sort(); + SearchSortFactory f = index.createScope().sort(); String fieldPath = index.binding().flattened.relativeFieldName; @@ -77,7 +77,7 @@ void use_objectField_flattened() { .hasMessageContaining( "Cannot use '" + sortTrait() + "' on field '" + fieldPath + "'" ); } - protected abstract void trySort(SearchSortFactory f, String fieldPath); + protected abstract void trySort(SearchSortFactory f, String fieldPath); protected abstract String sortTrait(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortSortableIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortSortableIT.java index d761fab54dd..49f85b06644 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortSortableIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortSortableIT.java @@ -75,7 +75,7 @@ void sortable_default_use( SimpleMappedIndex sortableYesIndex, SimpleMappedIndex sortableNoIndex, FieldTypeDescriptor fieldType) { - SearchSortFactory f = sortableDefaultIndex.createScope().sort(); + SearchSortFactory f = sortableDefaultIndex.createScope().sort(); String fieldPath = sortableDefaultIndex.binding().field.get( fieldType ).relativeFieldName; @@ -94,7 +94,7 @@ void sortable_no_use( SimpleMappedIndex sortableYesIndex, SimpleMappedIndex sortableNoIndex, FieldTypeDescriptor fieldType) { - SearchSortFactory f = sortableNoIndex.createScope().sort(); + SearchSortFactory f = sortableNoIndex.createScope().sort(); String fieldPath = sortableNoIndex.binding().field.get( fieldType ).relativeFieldName; @@ -114,7 +114,7 @@ void multiIndex_incompatibleSortable( SimpleMappedIndex sortableYesIndex, SimpleMappedIndex sortableNoIndex, FieldTypeDescriptor fieldType) { - SearchSortFactory f = sortableYesIndex.createScope( sortableNoIndex ).sort(); + SearchSortFactory f = sortableYesIndex.createScope( sortableNoIndex ).sort(); String fieldPath = sortableYesIndex.binding().field.get( fieldType ).relativeFieldName; @@ -126,7 +126,7 @@ void multiIndex_incompatibleSortable( ); } - protected abstract void trySort(SearchSortFactory f, String fieldPath, + protected abstract void trySort(SearchSortFactory f, String fieldPath, FieldTypeDescriptor fieldType); protected abstract String sortTrait(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortUnsupportedTypesIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortUnsupportedTypesIT.java index d4555449b54..a2c90a7a891 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortUnsupportedTypesIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/AbstractSortUnsupportedTypesIT.java @@ -50,7 +50,7 @@ void use(SimpleMappedIndex index, FieldTypeDescriptor fieldT ); } - protected abstract void trySort(SearchSortFactory f, String fieldPath); + protected abstract void trySort(SearchSortFactory f, String fieldPath); protected abstract String sortTrait(); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/CompositeSortIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/CompositeSortIT.java index c96930c4ee8..b544cf686a4 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/CompositeSortIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/CompositeSortIT.java @@ -270,12 +270,12 @@ void then_flattened_nested_filterByPredicate() { } private SearchQuery simpleQuery( - Function sortContributor) { + Function, ? extends SortFinalStep> sortContributor) { return simpleQuery( index.createScope(), sortContributor ); } private SearchQuery simpleQuery(StubMappingScope scope, - Function sortContributor) { + Function, ? extends SortFinalStep> sortContributor) { return scope.query() .where( f -> f.matchAll() ) .sort( sortContributor ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortBaseIT.java index 2b658c953f7..d155c505b2c 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortBaseIT.java @@ -70,7 +70,7 @@ public InvalidFieldConfigured() { } @Override - protected void trySort(SearchSortFactory f, String fieldPath) { + protected void trySort(SearchSortFactory f, String fieldPath) { f.distance( fieldPath, GeoPoint.of( 0.0, 0.0 ) ); } @@ -102,7 +102,7 @@ public static List params() { } @Override - protected void trySort(SearchSortFactory f, String fieldPath) { + protected void trySort(SearchSortFactory f, String fieldPath) { f.distance( fieldPath, GeoPoint.of( 0.0, 0.0 ) ); } @@ -210,7 +210,7 @@ void multiIndex_incompatibleSortable(SimpleMappedIndex fieldType) { + protected void trySort(SearchSortFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.distance( fieldPath, GeoPoint.of( 0.0, 0.0 ) ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortDynamicFieldIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortDynamicFieldIT.java index b51fda3251e..13d5efe80d1 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortDynamicFieldIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortDynamicFieldIT.java @@ -123,17 +123,17 @@ void neverPopulatedParameter() { } private SearchQuery matchNonEmptyQuery( - Function sortContributor) { + Function, ? extends SortFinalStep> sortContributor) { return matchNonEmptyQuery( sortContributor, mainIndex.createScope(), null, null ); } private SearchQuery matchNonEmptyQuery( - Function sortContributor, String parameter, Object value) { + Function, ? extends SortFinalStep> sortContributor, String parameter, Object value) { return matchNonEmptyQuery( sortContributor, mainIndex.createScope(), parameter, value ); } private SearchQuery matchNonEmptyQuery( - Function sortContributor, StubMappingScope scope, + Function, ? extends SortFinalStep> sortContributor, StubMappingScope scope, String parameter, Object value) { if ( parameter == null ) { return scope.query() diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortFilteringSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortFilteringSpecificsIT.java index cd88ea2f749..584582bd829 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortFilteringSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortFilteringSpecificsIT.java @@ -96,12 +96,12 @@ void invalidNestedPath_sibling() { } private SearchQuery matchAllQuery( - Function sortContributor) { + Function, ? extends SortFinalStep> sortContributor) { return matchAllQuery( sortContributor, index.createScope() ); } private SearchQuery matchAllQuery( - Function sortContributor, StubMappingScope scope) { + Function, ? extends SortFinalStep> sortContributor, StubMappingScope scope) { return scope.query() .where( f -> f.matchAll() ) .sort( sortContributor ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortSpecificsIT.java index 2f70f1d29e6..de484d0886a 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortSpecificsIT.java @@ -478,11 +478,11 @@ void factoryWithRoot(TestedFieldStructure fieldStructure, SortMode sortMode, assertThatQuery( index.query() .where( f -> f.matchAll() ) .routing( dataSet.routingKey ) - .sort( ( (Function>) f -> f.withRoot( parentObjectBinding.absolutePath ) + .sort( ( (Function, + DistanceSortOptionsStep>) f -> f.withRoot( parentObjectBinding.absolutePath ) .distance( parentObjectBinding.getRelativeFieldName( fieldStructure, fieldType ), CENTER_POINT ) ) - .andThen( (DistanceSortOptionsStep optionsStep1) -> applySortMode( optionsStep1, sortMode + .andThen( (DistanceSortOptionsStep optionsStep1) -> applySortMode( optionsStep1, sortMode ) ) // Don't call this.applyFilter: we need to use the relative name of the discriminator field. .andThen( optionsStep -> { @@ -550,7 +550,7 @@ private boolean isSum(SortMode sortMode) { } private SearchQuery simpleQuery(DataSet dataSet, - Function> sortContributor, + Function, ? extends DistanceSortOptionsStep> sortContributor, SortMode sortMode, TestedFieldStructure fieldStructure) { return index.query() .where( f -> f.matchAll() ) @@ -560,7 +560,7 @@ private SearchQuery simpleQuery(DataSet dataSet, .toQuery(); } - private DistanceSortOptionsStep applySortMode(DistanceSortOptionsStep optionsStep, SortMode sortMode) { + private DistanceSortOptionsStep applySortMode(DistanceSortOptionsStep optionsStep, SortMode sortMode) { if ( sortMode != null ) { return optionsStep.mode( sortMode ); } @@ -569,7 +569,7 @@ private SearchQuery simpleQuery(DataSet dataSet, } } - private DistanceSortOptionsStep applyFilter(DistanceSortOptionsStep optionsStep, + private DistanceSortOptionsStep applyFilter(DistanceSortOptionsStep optionsStep, TestedFieldStructure fieldStructure) { if ( fieldStructure.isInNested() ) { return optionsStep.filter( f -> f.match() diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortTypeCheckingAndConversionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortTypeCheckingAndConversionIT.java index 6d5209ef1ee..914ef53a04a 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortTypeCheckingAndConversionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/DistanceSortTypeCheckingAndConversionIT.java @@ -208,7 +208,7 @@ void multiIndex_withIncompatibleIndex() { } private SearchQuery matchAllQuery( - Function sortContributor, StubMappingScope scope) { + Function, ? extends SortFinalStep> sortContributor, StubMappingScope scope) { return scope.query() .where( f -> f.matchAll() ) .sort( sortContributor ) @@ -216,7 +216,7 @@ private SearchQuery matchAllQuery( } private SearchQuery matchNonEmptyQuery( - Function sortContributor, StubMappingScope scope) { + Function, ? extends SortFinalStep> sortContributor, StubMappingScope scope) { return scope.query() .where( f -> f.matchAll().except( f.id().matching( EMPTY ) ) ) .sort( sortContributor ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortBaseIT.java index a58796caace..619f047081b 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortBaseIT.java @@ -64,7 +64,7 @@ public InvalidFieldConfigured() { } @Override - protected void trySort(SearchSortFactory f, String fieldPath) { + protected void trySort(SearchSortFactory f, String fieldPath) { f.field( fieldPath ); } @@ -96,7 +96,7 @@ public static List params() { } @Override - protected void trySort(SearchSortFactory f, String fieldPath) { + protected void trySort(SearchSortFactory f, String fieldPath) { f.field( fieldPath ); } @@ -135,7 +135,7 @@ public static List params() { } @Override - protected void trySort(SearchSortFactory f, String fieldPath, FieldTypeDescriptor fieldType) { + protected void trySort(SearchSortFactory f, String fieldPath, FieldTypeDescriptor fieldType) { f.field( fieldPath ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortDynamicFieldIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortDynamicFieldIT.java index e81a3b31c41..dcacf0b2285 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortDynamicFieldIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortDynamicFieldIT.java @@ -114,12 +114,12 @@ void neverPopulated(FieldTypeDescriptor fieldTypeDescriptor) { } private SearchQuery matchNonEmptyQuery( - Function sortContributor) { + Function, ? extends SortFinalStep> sortContributor) { return matchNonEmptyQuery( sortContributor, mainIndex.createScope() ); } private SearchQuery matchNonEmptyQuery( - Function sortContributor, StubMappingScope scope) { + Function, ? extends SortFinalStep> sortContributor, StubMappingScope scope) { return scope.query() .where( f -> f.matchAll().except( f.id().matching( EMPTY ) ) ) .sort( sortContributor ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortFilteringSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortFilteringSpecificsIT.java index f0a33b76a93..29158c1a27c 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortFilteringSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortFilteringSpecificsIT.java @@ -120,12 +120,12 @@ void invalidNestedPath_sibling(FieldTypeDescriptor fieldTypeDescriptor) { } private SearchQuery matchAllQuery( - Function sortContributor) { + Function, ? extends SortFinalStep> sortContributor) { return matchAllQuery( sortContributor, index.createScope() ); } private SearchQuery matchAllQuery( - Function sortContributor, StubMappingScope scope) { + Function, ? extends SortFinalStep> sortContributor, StubMappingScope scope) { return scope.query() .where( f -> f.matchAll() ) .sort( sortContributor ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortSpecificsIT.java index 31aacafec33..b1c6012087d 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortSpecificsIT.java @@ -494,10 +494,10 @@ void factoryWithRoot(TestedFieldStructure fieldStructure, dataSet.emptyDoc1Id, dataSet.emptyDoc2Id, dataSet.emptyDoc3Id, dataSet.emptyDoc4Id ) ) ) ) .routing( dataSet.routingKey ) - .sort( ( (Function>) f -> f.withRoot( parentObjectBinding.absolutePath ) + .sort( ( (Function, + FieldSortOptionsStep>) f -> f.withRoot( parentObjectBinding.absolutePath ) .field( parentObjectBinding.getRelativeFieldName( fieldStructure, fieldType ) ) ) - .andThen( (FieldSortOptionsStep optionsStep1) -> applySortMode( optionsStep1, sortMode ) ) + .andThen( (FieldSortOptionsStep optionsStep1) -> applySortMode( optionsStep1, sortMode ) ) // Don't call this.applyFilter: we need to use the relative name of the discriminator field. .andThen( optionsStep -> { if ( fieldStructure.isInNested() ) { @@ -609,13 +609,14 @@ void missingValue_singleElement(TestedFieldStructure fieldStructure, } private SearchQuery matchNonEmptyQuery(DataSet dataSet, - Function> sortContributor, + Function, ? extends FieldSortOptionsStep> sortContributor, SortMode sortMode, TestedFieldStructure fieldStructure) { return matchNonEmptyQuery( dataSet, sortContributor, index.createScope(), sortMode, fieldStructure ); } private SearchQuery matchNonEmptyQuery(DataSet dataSet, - Function> sortContributor, StubMappingScope scope, + Function, ? extends FieldSortOptionsStep> sortContributor, + StubMappingScope scope, SortMode sortMode, TestedFieldStructure fieldStructure) { return query( dataSet, @@ -631,13 +632,14 @@ private SearchQuery matchNonEmptyQuery(DataSet dataSet, } private SearchQuery matchNonEmptyAndEmpty1Query(DataSet dataSet, - Function> sortContributor, + Function, ? extends FieldSortOptionsStep> sortContributor, SortMode sortMode, TestedFieldStructure fieldStructure) { return matchNonEmptyAndEmpty1Query( dataSet, sortContributor, index.createScope(), sortMode, fieldStructure ); } private SearchQuery matchNonEmptyAndEmpty1Query(DataSet dataSet, - Function> sortContributor, StubMappingScope scope, + Function, ? extends FieldSortOptionsStep> sortContributor, + StubMappingScope scope, SortMode sortMode, TestedFieldStructure fieldStructure) { return query( dataSet, @@ -651,20 +653,21 @@ private SearchQuery matchNonEmptyAndEmpty1Query(DataSet da } private SearchQuery matchAllQuery(DataSet dataSet, - Function> sortContributor, + Function, ? extends FieldSortOptionsStep> sortContributor, SortMode sortMode, TestedFieldStructure fieldStructure) { return matchAllQuery( dataSet, sortContributor, index.createScope(), sortMode, fieldStructure ); } private SearchQuery matchAllQuery(DataSet dataSet, - Function> sortContributor, StubMappingScope scope, + Function, ? extends FieldSortOptionsStep> sortContributor, + StubMappingScope scope, SortMode sortMode, TestedFieldStructure fieldStructure) { return query( dataSet, f -> f.matchAll(), sortContributor, scope, sortMode, fieldStructure ); } private SearchQuery query(DataSet dataSet, - Function predicateContributor, - Function> sortContributor, + Function, ? extends PredicateFinalStep> predicateContributor, + Function, ? extends FieldSortOptionsStep> sortContributor, StubMappingScope scope, SortMode sortMode, TestedFieldStructure fieldStructure) { return scope.query() .where( predicateContributor ) @@ -674,7 +677,7 @@ private SearchQuery query(DataSet dataSet, .toQuery(); } - private FieldSortOptionsStep applySortMode(FieldSortOptionsStep optionsStep, SortMode sortMode) { + private FieldSortOptionsStep applySortMode(FieldSortOptionsStep optionsStep, SortMode sortMode) { if ( sortMode != null ) { return optionsStep.mode( sortMode ); } @@ -683,7 +686,7 @@ private SearchQuery query(DataSet dataSet, } } - private FieldSortOptionsStep applyFilter(FieldSortOptionsStep optionsStep, + private FieldSortOptionsStep applyFilter(FieldSortOptionsStep optionsStep, TestedFieldStructure fieldStructure) { if ( fieldStructure.isInNested() ) { return optionsStep.filter( f -> f.match() diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortTypeCheckingAndConversionIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortTypeCheckingAndConversionIT.java index 293fa051afb..bac73b60be3 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortTypeCheckingAndConversionIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/FieldSortTypeCheckingAndConversionIT.java @@ -531,12 +531,12 @@ void multiIndex_withIncompatibleIndex_dslConverterDisabled(StandardFieldTypeDesc } private SearchQuery matchAllQuery( - Function sortContributor) { + Function, ? extends SortFinalStep> sortContributor) { return matchAllQuery( sortContributor, mainIndex.createScope() ); } private SearchQuery matchAllQuery( - Function sortContributor, StubMappingScope scope) { + Function, ? extends SortFinalStep> sortContributor, StubMappingScope scope) { return scope.query() .where( f -> f.matchAll() ) .sort( sortContributor ) @@ -544,7 +544,7 @@ private SearchQuery matchAllQuery( } private SearchQuery matchNonEmptyQuery( - Function sortContributor, StubMappingScope scope) { + Function, ? extends SortFinalStep> sortContributor, StubMappingScope scope) { return scope.query() .where( f -> f.matchAll().except( f.id().matching( EMPTY ) ) ) .sort( sortContributor ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/SearchSortIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/SearchSortIT.java index af98fe13772..e3c7fe690a0 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/SearchSortIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/sort/SearchSortIT.java @@ -81,7 +81,7 @@ void setup() { } private SearchQuery simpleQuery( - Function sortContributor) { + Function, ? extends SortFinalStep> sortContributor) { StubMappingScope scope = mainIndex.createScope(); return scope.query() .where( f -> f.matchAll() ) @@ -349,19 +349,19 @@ void extension() { // Mandatory extension, supported query = simpleQuery( c -> c - .extension( new SupportedExtension() ).extendedSort( "string" ).missing().last() + .extension( new SupportedExtension<>() ).extendedSort( "string" ).missing().last() ); assertThatQuery( query ) .hasDocRefHitsAnyOrder( mainIndex.typeName(), FIRST_ID, SECOND_ID, THIRD_ID, EMPTY_ID ); query = simpleQuery( b -> b - .extension( new SupportedExtension() ).extendedSort( "string" ).desc().missing().last() + .extension( new SupportedExtension<>() ).extendedSort( "string" ).desc().missing().last() ); assertThatQuery( query ) .hasDocRefHitsAnyOrder( mainIndex.typeName(), THIRD_ID, SECOND_ID, FIRST_ID, EMPTY_ID ); // Mandatory extension, unsupported assertThatThrownBy( - () -> mainIndex.createScope().sort().extension( new UnSupportedExtension() ) + () -> mainIndex.createScope().sort().extension( new UnSupportedExtension<>() ) ) .isInstanceOf( SearchException.class ); @@ -369,11 +369,11 @@ void extension() { query = simpleQuery( b -> b .extension() .ifSupported( - new SupportedExtension(), + new SupportedExtension<>(), c -> c.extendedSort( "string" ).missing().last() ) .ifSupported( - new SupportedExtension(), + new SupportedExtension<>(), ignored -> fail( "This should not be called" ) ) .orElseFail() @@ -383,11 +383,11 @@ void extension() { query = simpleQuery( b -> b .extension() .ifSupported( - new SupportedExtension(), + new SupportedExtension<>(), c -> c.extendedSort( "string" ).desc().missing().last() ) .ifSupported( - new SupportedExtension(), + new SupportedExtension<>(), ignored -> fail( "This should not be called" ) ) .orElseFail() @@ -399,11 +399,11 @@ void extension() { query = simpleQuery( b -> b .extension() .ifSupported( - new UnSupportedExtension(), + new UnSupportedExtension<>(), ignored -> fail( "This should not be called" ) ) .ifSupported( - new SupportedExtension(), + new SupportedExtension<>(), c -> c.extendedSort( "string" ).missing().last() ) .orElse( ignored -> fail( "This should not be called" ) ) @@ -413,11 +413,11 @@ void extension() { query = simpleQuery( b -> b .extension() .ifSupported( - new UnSupportedExtension(), + new UnSupportedExtension<>(), ignored -> fail( "This should not be called" ) ) .ifSupported( - new SupportedExtension(), + new SupportedExtension<>(), c -> c.extendedSort( "string" ).desc().missing().last() ) .orElse( ignored -> fail( "This should not be called" ) ) @@ -429,11 +429,11 @@ void extension() { query = simpleQuery( b -> b .extension() .ifSupported( - new UnSupportedExtension(), + new UnSupportedExtension<>(), ignored -> fail( "This should not be called" ) ) .ifSupported( - new UnSupportedExtension(), + new UnSupportedExtension<>(), ignored -> fail( "This should not be called" ) ) .orElse( @@ -445,11 +445,11 @@ void extension() { query = simpleQuery( b -> b .extension() .ifSupported( - new UnSupportedExtension(), + new UnSupportedExtension<>(), ignored -> fail( "This should not be called" ) ) .ifSupported( - new UnSupportedExtension(), + new UnSupportedExtension<>(), ignored -> fail( "This should not be called" ) ) .orElse( @@ -554,30 +554,30 @@ private static class ObjectFieldBinding { } } - private static class SupportedExtension implements SearchSortFactoryExtension { + private static class SupportedExtension implements SearchSortFactoryExtension> { @Override - public Optional extendOptional(SearchSortFactory original) { + public Optional> extendOptional(SearchSortFactory original) { assertThat( original ).isNotNull(); - return Optional.of( new MyExtendedFactory( original ) ); + return Optional.of( new MyExtendedFactory<>( original ) ); } } - private static class UnSupportedExtension implements SearchSortFactoryExtension { + private static class UnSupportedExtension implements SearchSortFactoryExtension> { @Override - public Optional extendOptional(SearchSortFactory original) { + public Optional> extendOptional(SearchSortFactory original) { assertThat( original ).isNotNull(); return Optional.empty(); } } - private static class MyExtendedFactory { - private final SearchSortFactory delegate; + private static class MyExtendedFactory { + private final SearchSortFactory delegate; - MyExtendedFactory(SearchSortFactory delegate) { + MyExtendedFactory(SearchSortFactory delegate) { this.delegate = delegate; } - public FieldSortOptionsStep extendedSort(String absoluteFieldPath) { + public FieldSortOptionsStep> extendedSort(String absoluteFieldPath) { return delegate.field( absoluteFieldPath ); } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/RangeAggregationDescriptor.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/RangeAggregationDescriptor.java index 9ef7686be69..fb1ce8d3ca5 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/RangeAggregationDescriptor.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/RangeAggregationDescriptor.java @@ -137,10 +137,10 @@ private AggregationScenario, Long>> doCreate(Map, Long return new AggregationScenario, Long>>() { @Override - public AggregationFinalStep, Long>> setup(SearchAggregationFactory factory, + public AggregationFinalStep, Long>> setup(SearchAggregationFactory factory, String fieldPath, - Function filterOrNull) { - RangeAggregationOptionsStep, Long>> optionsStep = + Function, ? extends PredicateFinalStep> filterOrNull) { + RangeAggregationOptionsStep, Long>> optionsStep = factory.range().field( fieldPath, helper.getJavaClass() ) .range( helper.create( ascendingValues.get( 0 ) ), helper.create( ascendingValues.get( 2 ) ) ) @@ -157,7 +157,8 @@ public AggregationFinalStep, Long>> setup(SearchAggregationFactory } @Override - public AggregationFinalStep, Long>> setupWithConverterSetting(SearchAggregationFactory factory, + public AggregationFinalStep, Long>> setupWithConverterSetting( + SearchAggregationFactory factory, String fieldPath, ValueModel valueModel) { return factory.range().field( fieldPath, helper.getJavaClass(), valueModel ) .range( helper.create( ascendingValues.get( 0 ) ), @@ -198,7 +199,7 @@ public String aggregationName() { } @Override - public void trySetup(SearchAggregationFactory factory, String fieldPath) { + public void trySetup(SearchAggregationFactory factory, String fieldPath) { factory.range().field( fieldPath, typeDescriptor.getJavaType() ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/TermsAggregationDescriptor.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/TermsAggregationDescriptor.java index 7268cf83749..75f6770c132 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/TermsAggregationDescriptor.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/TermsAggregationDescriptor.java @@ -137,9 +137,9 @@ private AggregationScenario> doCreate(Map expectedResu TypeAssertionHelper helper) { return new AggregationScenario>() { @Override - public AggregationFinalStep> setup(SearchAggregationFactory factory, String fieldPath, - Function filterOrNull) { - TermsAggregationOptionsStep> optionsStep = + public AggregationFinalStep> setup(SearchAggregationFactory factory, String fieldPath, + Function, ? extends PredicateFinalStep> filterOrNull) { + TermsAggregationOptionsStep> optionsStep = factory.terms().field( fieldPath, helper.getJavaClass() ); if ( filterOrNull == null ) { return optionsStep; @@ -150,7 +150,7 @@ public AggregationFinalStep> setup(SearchAggregationFactory factory } @Override - public AggregationFinalStep> setupWithConverterSetting(SearchAggregationFactory factory, + public AggregationFinalStep> setupWithConverterSetting(SearchAggregationFactory factory, String fieldPath, ValueModel valueModel) { return factory.terms().field( fieldPath, helper.getJavaClass(), valueModel ); } @@ -199,7 +199,7 @@ public String aggregationName() { } @Override - public void trySetup(SearchAggregationFactory factory, String fieldPath) { + public void trySetup(SearchAggregationFactory factory, String fieldPath) { factory.terms().field( fieldPath, typeDescriptor.getJavaType() ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/expectations/AggregationScenario.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/expectations/AggregationScenario.java index 2c28a0485c0..fa576fcca96 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/expectations/AggregationScenario.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/expectations/AggregationScenario.java @@ -14,14 +14,14 @@ public interface AggregationScenario { - default AggregationFinalStep setup(SearchAggregationFactory factory, String fieldPath) { + default AggregationFinalStep setup(SearchAggregationFactory factory, String fieldPath) { return setup( factory, fieldPath, null ); } - AggregationFinalStep setup(SearchAggregationFactory factory, String fieldPath, - Function filterOrNull); + AggregationFinalStep setup(SearchAggregationFactory factory, String fieldPath, + Function, ? extends PredicateFinalStep> filterOrNull); - AggregationFinalStep setupWithConverterSetting(SearchAggregationFactory factory, String fieldPath, + AggregationFinalStep setupWithConverterSetting(SearchAggregationFactory factory, String fieldPath, ValueModel valueModel); void check(A aggregationResult); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/expectations/UnsupportedSingleFieldAggregationExpectations.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/expectations/UnsupportedSingleFieldAggregationExpectations.java index fd3eda673a7..42dbd2a487d 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/expectations/UnsupportedSingleFieldAggregationExpectations.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/expectations/UnsupportedSingleFieldAggregationExpectations.java @@ -10,6 +10,6 @@ public interface UnsupportedSingleFieldAggregationExpectations { String aggregationName(); - void trySetup(SearchAggregationFactory factory, String fieldPath); + void trySetup(SearchAggregationFactory factory, String fieldPath); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/util/TckBackendHelper.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/util/TckBackendHelper.java index 928f00764aa..a235272b817 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/util/TckBackendHelper.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/util/TckBackendHelper.java @@ -44,8 +44,12 @@ public interface TckBackendHelper { * @param f A {@link SearchPredicateFactory} * @return A slow predicate, i.e. a predicate whose execution will take more than 10 milliseconds per document. */ - PredicateFinalStep createSlowPredicate(SearchPredicateFactory f); + PredicateFinalStep createSlowPredicate(SearchPredicateFactory f); - SearchQueryDslExtension, R, E, LOS> queryDslExtension(); + SearchQueryDslExtension, + R, + E, + LOS> queryDslExtension(); } diff --git a/integrationtest/mapper/orm-realbackend/src/test/java/org/hibernate/search/integrationtest/mapper/orm/realbackend/multitenant/RealBackendDatabaseMultitenancyIT.java b/integrationtest/mapper/orm-realbackend/src/test/java/org/hibernate/search/integrationtest/mapper/orm/realbackend/multitenant/RealBackendDatabaseMultitenancyIT.java index 23fbc21def1..2cf8f21be10 100644 --- a/integrationtest/mapper/orm-realbackend/src/test/java/org/hibernate/search/integrationtest/mapper/orm/realbackend/multitenant/RealBackendDatabaseMultitenancyIT.java +++ b/integrationtest/mapper/orm-realbackend/src/test/java/org/hibernate/search/integrationtest/mapper/orm/realbackend/multitenant/RealBackendDatabaseMultitenancyIT.java @@ -206,7 +206,7 @@ private void checkMultitenancy(SessionFactory sessionFactory, BiConsumer scope = searchMapping.scope( Object.class ); + SearchScope scope = searchMapping.scope( Object.class ); // aws-serverless does not support purge, so we'll just drop the entire index here: scope.schemaManager().dropAndCreate(); diff --git a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/dynamicmap/DynamicMapBaseIT.java b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/dynamicmap/DynamicMapBaseIT.java index d7d7bdec35a..54ee079bd74 100644 --- a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/dynamicmap/DynamicMapBaseIT.java +++ b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/dynamicmap/DynamicMapBaseIT.java @@ -258,7 +258,7 @@ void massIndexing(boolean jpaCompliance) { with( sessionFactory ).runNoTransaction( session -> { SearchSession searchSession = Search.session( session ); - SearchScope scope = searchSession.scope( Map.class, entityTypeName ); + SearchScope scope = searchSession.scope( Map.class, entityTypeName ); backendMock.expectIndexScaleWorks( INDEX1_NAME ) .purge() diff --git a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/mapping/SearchMappingIT.java b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/mapping/SearchMappingIT.java index 47cffb49b16..0a270ab8ae2 100644 --- a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/mapping/SearchMappingIT.java +++ b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/mapping/SearchMappingIT.java @@ -180,7 +180,7 @@ void allIndexedEntities() { @Test @TestForIssue(jiraKey = "HSEARCH-3994") void scope_indexedEntities() { - SearchScope objectScope = mapping.scope( Object.class ); + SearchScope objectScope = mapping.scope( Object.class ); Set> objectEntities = objectScope.includedTypes(); assertThat( objectEntities ) .extracting( SearchIndexedEntity::jpaName ) @@ -189,7 +189,7 @@ void scope_indexedEntities() { Pet.JPA_ENTITY_NAME ); - SearchScope personScope = mapping.scope( Person.class ); + SearchScope personScope = mapping.scope( Person.class ); Set> personEntities = personScope.includedTypes(); assertThat( personEntities ) .extracting( SearchIndexedEntity::jpaName ) @@ -197,7 +197,7 @@ void scope_indexedEntities() { Person.JPA_ENTITY_NAME ); - SearchScope petScope = mapping.scope( Pet.class ); + SearchScope petScope = mapping.scope( Pet.class ); Set> petEntities = petScope.includedTypes(); assertThat( petEntities ) .extracting( SearchIndexedEntity::jpaName ) diff --git a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/search/SearchQueryBaseIT.java b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/search/SearchQueryBaseIT.java index f731dc3a816..00bde969b45 100644 --- a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/search/SearchQueryBaseIT.java +++ b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/search/SearchQueryBaseIT.java @@ -407,7 +407,7 @@ void select_searchProjection_single() { with( sessionFactory ).runInTransaction( session -> { SearchSession searchSession = Search.session( session ); - SearchScope scope = searchSession.scope( Book.class ); + SearchScope scope = searchSession.scope( Book.class ); SearchQuery query = searchSession.search( scope ) .select( @@ -439,7 +439,7 @@ void select_searchProjection_multiple() { with( sessionFactory ).runInTransaction( session -> { SearchSession searchSession = Search.session( session ); - SearchScope scope = searchSession.scope( Book.class ); + SearchScope scope = searchSession.scope( Book.class ); SearchQuery> query = searchSession.search( scope ) .select( @@ -599,7 +599,7 @@ void select_compositeAndLoading() { @TestForIssue(jiraKey = "HSEARCH-3671") void componentsFromMappingWithoutSession() { SearchMapping mapping = Search.mapping( sessionFactory ); - SearchScope scope = mapping.scope( Book.class ); + SearchScope scope = mapping.scope( Book.class ); /* * The backend is a stub, so these components are stub too: @@ -656,7 +656,7 @@ void select_searchProjection_entityReference() { with( sessionFactory ).runInTransaction( session -> { SearchSession searchSession = Search.session( session ); - SearchScope scope = searchSession.scope( Book.class ); + SearchScope scope = searchSession.scope( Book.class ); SearchQuery query = searchSession.search( scope ) .select( f -> f.entityReference() ) @@ -687,7 +687,7 @@ void select_searchProjection_entityReference_deprecatedEntityReferenceType() { with( sessionFactory ).runInTransaction( session -> { SearchSession searchSession = Search.session( session ); - SearchScope scope = searchSession.scope( Book.class ); + SearchScope scope = searchSession.scope( Book.class ); SearchQuery query = searchSession.search( scope ) .select( f -> f.entityReference() ) diff --git a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/search/loading/AbstractSearchQueryEntityLoadingIT.java b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/search/loading/AbstractSearchQueryEntityLoadingIT.java index d71bf1a2f2d..e4ce5fdbfca 100644 --- a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/search/loading/AbstractSearchQueryEntityLoadingIT.java +++ b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/search/loading/AbstractSearchQueryEntityLoadingIT.java @@ -66,7 +66,7 @@ protected final void testLoading( SearchSession searchSession = Search.session( session ); - SearchQueryOptionsStep optionsStep = searchSession.search( targetClasses ) + SearchQueryOptionsStep optionsStep = searchSession.search( targetClasses ) .where( f -> f.matchAll() ) .loading( loadingOptionsContributor ); diff --git a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/SearchMappingIT.java b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/SearchMappingIT.java index b3436529e68..8f1d3cd6667 100644 --- a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/SearchMappingIT.java +++ b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/SearchMappingIT.java @@ -174,7 +174,7 @@ void allIndexedEntities() { @Test @TestForIssue(jiraKey = "HSEARCH-3994") void scope_indexedEntities() { - SearchScope objectScope = mapping.scope( Object.class ); + SearchScope objectScope = mapping.scope( Object.class ); Set> objectEntities = objectScope.includedTypes(); assertThat( objectEntities ) .extracting( SearchIndexedEntity::name ) @@ -183,7 +183,7 @@ void scope_indexedEntities() { Pet.ENTITY_NAME ); - SearchScope personScope = mapping.scope( Person.class ); + SearchScope personScope = mapping.scope( Person.class ); Set> personEntities = personScope.includedTypes(); assertThat( personEntities ) .extracting( SearchIndexedEntity::name ) @@ -191,7 +191,7 @@ void scope_indexedEntities() { Person.ENTITY_NAME ); - SearchScope petScope = mapping.scope( Pet.class ); + SearchScope petScope = mapping.scope( Pet.class ); Set> petEntities = petScope.includedTypes(); assertThat( petEntities ) .extracting( SearchIndexedEntity::name ) diff --git a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/annotation/processing/CustomConstructorMappingAnnotationBaseIT.java b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/annotation/processing/CustomConstructorMappingAnnotationBaseIT.java index 8e6bbdf9c93..98f746246a8 100644 --- a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/annotation/processing/CustomConstructorMappingAnnotationBaseIT.java +++ b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/annotation/processing/CustomConstructorMappingAnnotationBaseIT.java @@ -83,7 +83,7 @@ class IndexedEntity { backendMock.expectSearchProjection( INDEX_NAME, b -> { - SearchProjectionFactory f = mapping.scope( IndexedEntity.class ).projection(); + SearchProjectionFactory f = mapping.scope( IndexedEntity.class ).projection(); b.projection( f.composite() .from( f.field( "text", String.class ) diff --git a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/annotation/processing/CustomMethodParameterMappingAnnotationBaseIT.java b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/annotation/processing/CustomMethodParameterMappingAnnotationBaseIT.java index 2327ccfacd8..f92563ca95c 100644 --- a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/annotation/processing/CustomMethodParameterMappingAnnotationBaseIT.java +++ b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/annotation/processing/CustomMethodParameterMappingAnnotationBaseIT.java @@ -85,7 +85,7 @@ class IndexedEntity { backendMock.expectSearchProjection( INDEX_NAME, b -> { - SearchProjectionFactory f = mapping.scope( IndexedEntity.class ).projection(); + SearchProjectionFactory f = mapping.scope( IndexedEntity.class ).projection(); b.projection( f.composite() .from( f.field( "myText", String.class ) diff --git a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/definition/AbstractProjectionConstructorIT.java b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/definition/AbstractProjectionConstructorIT.java index 3b950483c2e..8c888b6c237 100644 --- a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/definition/AbstractProjectionConstructorIT.java +++ b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/definition/AbstractProjectionConstructorIT.java @@ -50,7 +50,7 @@ protected final

void testSuccessfulRootProjectionExecutionOnly(SearchMapping protected final

void testSuccessfulRootProjection(SearchMapping mapping, Class indexedType, Class

projectionType, List rawProjectionResults, - Function, ProjectionFinalStep> expectedProjection, + Function, ProjectionFinalStep> expectedProjection, List

expectedProjectionResults) { try ( SearchSession session = createSession( mapping ) ) { backendMock.expectSearchProjection( diff --git a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/definition/ProjectionConstructorProjectionBindingIT.java b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/definition/ProjectionConstructorProjectionBindingIT.java index 8e908f908eb..8aaf8e0a892 100644 --- a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/definition/ProjectionConstructorProjectionBindingIT.java +++ b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/mapping/definition/ProjectionConstructorProjectionBindingIT.java @@ -71,7 +71,7 @@ class IndexedEntity { backendMock.expectSearchProjection( INDEX_NAME, b -> { - SearchProjectionFactory f = mapping.scope( IndexedEntity.class ).projection(); + SearchProjectionFactory f = mapping.scope( IndexedEntity.class ).projection(); b.projection( f.composite() .from( f.field( "myText", String.class ) @@ -170,7 +170,7 @@ class IndexedEntity { backendMock.expectSearchProjection( INDEX_NAME, b -> { - SearchProjectionFactory f = mapping.scope( IndexedEntity.class ).projection(); + SearchProjectionFactory f = mapping.scope( IndexedEntity.class ).projection(); b.projection( f.composite() .from( f.field( "myText", String.class ) @@ -308,7 +308,7 @@ class IndexedEntity { backendMock.expectSearchProjection( INDEX_NAME, b -> { - SearchProjectionFactory f = mapping.scope( IndexedEntity.class ).projection(); + SearchProjectionFactory f = mapping.scope( IndexedEntity.class ).projection(); b.projection( f.composite() .from( f.field( "myText", String.class ) diff --git a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/search/loading/AbstractSearchQueryEntityLoadingIT.java b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/search/loading/AbstractSearchQueryEntityLoadingIT.java index 5a883f894ef..7661082e204 100644 --- a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/search/loading/AbstractSearchQueryEntityLoadingIT.java +++ b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/search/loading/AbstractSearchQueryEntityLoadingIT.java @@ -50,7 +50,7 @@ protected final void testLoading( try ( SearchSession searchSession = mapping().createSessionWithOptions() .loading( o -> o.context( StubLoadingContext.class, loadingContext ) ) .build() ) { - SearchQueryOptionsStep optionsStep = searchSession.search( targetClasses ) + SearchQueryOptionsStep optionsStep = searchSession.search( targetClasses ) .where( f -> f.matchAll() ); SearchQuery query = optionsStep diff --git a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/smoke/AnnotationMappingSmokeIT.java b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/smoke/AnnotationMappingSmokeIT.java index 3a60fb47905..9b977baa9e3 100644 --- a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/smoke/AnnotationMappingSmokeIT.java +++ b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/smoke/AnnotationMappingSmokeIT.java @@ -407,7 +407,7 @@ void search_singleElementProjection() { @Test void search_multipleElementsProjection() { - SearchScope scope = mapping.scope( + SearchScope scope = mapping.scope( Arrays.asList( IndexedEntity.class, YetAnotherIndexedEntity.class ) ); diff --git a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/smoke/ProgrammaticMappingSmokeIT.java b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/smoke/ProgrammaticMappingSmokeIT.java index f1bb3cc7852..b3d33b6aaef 100644 --- a/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/smoke/ProgrammaticMappingSmokeIT.java +++ b/integrationtest/mapper/pojo-base/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/smoke/ProgrammaticMappingSmokeIT.java @@ -460,7 +460,7 @@ void search_singleElementProjection() { @Test void search_multipleElementsProjection() { - SearchScope scope = mapping.scope( + SearchScope scope = mapping.scope( Arrays.asList( IndexedEntity.class, YetAnotherIndexedEntity.class ) ); diff --git a/integrationtest/v5migrationhelper/engine/src/test/java/org/hibernate/search/testsupport/migration/V5MigrationStandalonePojoSearchScopeAdapter.java b/integrationtest/v5migrationhelper/engine/src/test/java/org/hibernate/search/testsupport/migration/V5MigrationStandalonePojoSearchScopeAdapter.java index a7934f8fd5c..0f1d58f8e5d 100644 --- a/integrationtest/v5migrationhelper/engine/src/test/java/org/hibernate/search/testsupport/migration/V5MigrationStandalonePojoSearchScopeAdapter.java +++ b/integrationtest/v5migrationhelper/engine/src/test/java/org/hibernate/search/testsupport/migration/V5MigrationStandalonePojoSearchScopeAdapter.java @@ -20,9 +20,9 @@ public class V5MigrationStandalonePojoSearchScopeAdapter implements V5MigrationSearchScope { - private final SearchScope delegate; + private final SearchScope delegate; - public V5MigrationStandalonePojoSearchScopeAdapter(SearchScope delegate) { + public V5MigrationStandalonePojoSearchScopeAdapter(SearchScope delegate) { this.delegate = delegate; } @@ -37,23 +37,23 @@ public Set indexManagers() { } @Override - public SearchPredicateFactory predicate() { + public SearchPredicateFactory predicate() { return delegate.predicate(); } @Override - public SearchSortFactory sort() { + public SearchSortFactory sort() { return delegate.sort(); } @Override - public SearchProjectionFactory projection() { + public SearchProjectionFactory projection() { return delegate.projection(); } @Override public SearchProjection idProjection() { - SearchProjectionFactory factory = delegate.projection(); + SearchProjectionFactory factory = delegate.projection(); // Not using factory.id() because that one throws an exception if IDs have inconsistent types. return factory.composite().from( factory.entityReference() ) .as( EntityReference::id ).toProjection(); @@ -61,13 +61,13 @@ public SearchProjection idProjection() { @Override public SearchProjection> objectClassProjection() { - SearchProjectionFactory factory = delegate.projection(); + SearchProjectionFactory factory = delegate.projection(); return factory.composite().from( factory.entityReference() ) .as( EntityReference::type ).toProjection(); } @Override - public SearchAggregationFactory aggregation() { + public SearchAggregationFactory aggregation() { return delegate.aggregation(); } diff --git a/integrationtest/v5migrationhelper/engine/src/test/java/org/hibernate/search/testsupport/migration/V5MigrationStandalonePojoSearchSessionAdapter.java b/integrationtest/v5migrationhelper/engine/src/test/java/org/hibernate/search/testsupport/migration/V5MigrationStandalonePojoSearchSessionAdapter.java index 4877479e849..beb8894b31d 100644 --- a/integrationtest/v5migrationhelper/engine/src/test/java/org/hibernate/search/testsupport/migration/V5MigrationStandalonePojoSearchSessionAdapter.java +++ b/integrationtest/v5migrationhelper/engine/src/test/java/org/hibernate/search/testsupport/migration/V5MigrationStandalonePojoSearchSessionAdapter.java @@ -18,7 +18,7 @@ public V5MigrationStandalonePojoSearchSessionAdapter(SearchSession delegate) { } @Override - public SearchQuerySelectStep search(V5MigrationSearchScope scope) { + public SearchQuerySelectStep search(V5MigrationSearchScope scope) { return delegate.search( ( (V5MigrationStandalonePojoSearchScopeAdapter) scope ).toSearchScope() ); } } diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMapping.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMapping.java index d8abd020830..9a9e16a0dbe 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMapping.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMapping.java @@ -30,6 +30,7 @@ import org.hibernate.search.mapper.orm.automaticindexing.spi.AutomaticIndexingMappingContext; import org.hibernate.search.mapper.orm.automaticindexing.spi.AutomaticIndexingQueueEventProcessingPlan; import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.common.EntityReference; import org.hibernate.search.mapper.orm.common.impl.HibernateOrmUtils; import org.hibernate.search.mapper.orm.coordination.common.spi.CoordinationStrategy; import org.hibernate.search.mapper.orm.entity.SearchIndexedEntity; @@ -180,12 +181,12 @@ public CompletableFuture start(MappingStartContext context) { this ); - Optional> scopeOptional = createAllScope(); + Optional> scopeOptional = createAllScope(); if ( !scopeOptional.isPresent() ) { // No indexed type return CompletableFuture.completedFuture( null ); } - SearchScopeImpl scope = scopeOptional.get(); + SearchScopeImpl scope = scopeOptional.get(); this.tenancyConfiguration = TenancyConfiguration.create( context.beanResolver(), delegate().tenancyMode(), @@ -201,7 +202,7 @@ public CompletableFuture start(MappingStartContext context) { @Override public CompletableFuture preStop(MappingPreStopContext context) { - Optional> scope = createAllScope(); + Optional> scope = createAllScope(); if ( !scope.isPresent() ) { // No indexed type return CompletableFuture.completedFuture( null ); @@ -227,22 +228,22 @@ public BackendMappingHints hints() { } @Override - public SearchScopeImpl scope(Class clazz) { + public SearchScopeImpl scope(Class clazz) { return scope( Collections.singleton( clazz ) ); } @Override - public SearchScopeImpl scope(Class expectedSuperType, String entityName) { + public SearchScopeImpl scope(Class expectedSuperType, String entityName) { return scope( expectedSuperType, Collections.singleton( entityName ) ); } @Override - public SearchScopeImpl scope(Collection> classes) { + public SearchScopeImpl scope(Collection> classes) { return createScope( classes ); } @Override - public SearchScopeImpl scope(Class expectedSuperType, Collection entityNames) { + public SearchScopeImpl scope(Class expectedSuperType, Collection entityNames) { return createScope( expectedSuperType, entityNames ); } @@ -411,8 +412,9 @@ public HibernateOrmTypeContextContainer typeContextProvider() { } @Override - public SearchScopeImpl createScope(Collection> classes) { - PojoScopeDelegate SearchScopeImpl createScope(Collection> classes) { + PojoScopeDelegate> scopeDelegate = delegate().createPojoScopeForClasses( @@ -422,12 +424,13 @@ public SearchScopeImpl createScope(Collection( this, tenancyConfiguration, scopeDelegate ); + return new SearchScopeImpl( this, tenancyConfiguration, scopeDelegate ); } @Override - public SearchScopeImpl createScope(Class expectedSuperType, Collection entityNames) { - PojoScopeDelegate SearchScopeImpl createScope(Class expectedSuperType, Collection entityNames) { + PojoScopeDelegate> scopeDelegate = delegate().createPojoScopeForEntityNames( @@ -437,7 +440,7 @@ public SearchScopeImpl createScope(Class expectedSuperType, Collection ); // Explicit type parameter is necessary here for ECJ (Eclipse compiler) - return new SearchScopeImpl( this, tenancyConfiguration, scopeDelegate ); + return new SearchScopeImpl( this, tenancyConfiguration, scopeDelegate ); } @Override @@ -462,8 +465,8 @@ private SearchIntegration searchIntegration() { return integrationHandle.getOrFail(); } - private Optional> createAllScope() { - return delegate().> createAllScope() { + return delegate().>createPojoAllScope( this, typeContextContainer::indexedForExactType diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java index 3b0105ea4c5..b8fc987f43d 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java @@ -18,6 +18,7 @@ import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; import org.hibernate.search.engine.search.query.dsl.SearchQueryWhereStep; import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory; +import org.hibernate.search.mapper.orm.common.EntityReference; import org.hibernate.search.mapper.orm.entity.SearchIndexedEntity; import org.hibernate.search.mapper.orm.massindexing.MassIndexer; import org.hibernate.search.mapper.orm.schema.management.SearchSchemaManager; @@ -37,7 +38,7 @@ * @param A supertype of all types in this scope. */ @SuppressWarnings("deprecation") -public interface SearchScope extends org.hibernate.search.engine.mapper.scope.SearchScope { +public interface SearchScope extends org.hibernate.search.engine.mapper.scope.SearchScope { /** * Initiate the building of a search predicate. @@ -53,7 +54,7 @@ public interface SearchScope extends org.hibernate.search.engine.mapper.scope * @return A predicate factory. * @see SearchPredicateFactory */ - SearchPredicateFactory predicate(); + SearchPredicateFactory predicate(); /** * Initiate the building of a search sort. @@ -70,7 +71,7 @@ public interface SearchScope extends org.hibernate.search.engine.mapper.scope * @return A sort factory. * @see SearchSortFactory */ - SearchSortFactory sort(); + SearchSortFactory sort(); /** * Initiate the building of a search projection that will be valid for the indexes in this scope. @@ -87,7 +88,7 @@ public interface SearchScope extends org.hibernate.search.engine.mapper.scope * @see SearchProjectionFactory */ @SuppressWarnings("deprecation") - SearchProjectionFactory projection(); + SearchProjectionFactory projection(); /** * Initiate the building of a search aggregation that will be valid for the indexes in this scope. @@ -103,7 +104,7 @@ public interface SearchScope extends org.hibernate.search.engine.mapper.scope * @return An aggregation factory. * @see SearchAggregationFactory */ - SearchAggregationFactory aggregation(); + SearchAggregationFactory aggregation(); /** * Create a {@link SearchSchemaManager} for the indexes mapped to types in this scope, or to any of their sub-types. diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java index 90a4d95aac8..78ac7463419 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java @@ -7,8 +7,6 @@ import java.util.Collection; import java.util.Collections; -import org.hibernate.search.engine.common.EntityReference; - import jakarta.persistence.Entity; /** @@ -17,19 +15,22 @@ * @see org.hibernate.search.mapper.orm.mapping.SearchMapping * @see org.hibernate.search.mapper.orm.session.SearchSession */ -@SuppressWarnings( "deprecation" ) -public interface SearchScopeProvider extends org.hibernate.search.engine.mapper.scope.SearchScopeProvider{ +@SuppressWarnings("deprecation") +public interface SearchScopeProvider + extends + org.hibernate.search.engine.mapper.scope.SearchScopeProvider { /** * Creates a {@link SearchScope} limited to * indexed entity types among the given class and its subtypes. * * @param clazz A class that must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - default SearchScope scope(Class clazz) { + default SearchScope scope(Class clazz) { return scope( Collections.singleton( clazz ) ); } @@ -39,11 +40,12 @@ default SearchScope scope(Class clazz) { * * @param classes A collection of classes. * Each must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - SearchScope scope(Collection> classes); + SearchScope scope(Collection> classes); /** * Creates a {@link SearchScope} limited to @@ -52,11 +54,12 @@ default SearchScope scope(Class clazz) { * @param expectedSuperType A supertype of all entity types to include in the scope. * @param entityName An entity name. See {@link Entity#name()}. * The referenced entity type must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - default SearchScope scope(Class expectedSuperType, String entityName) { + default SearchScope scope(Class expectedSuperType, String entityName) { return scope( expectedSuperType, Collections.singleton( entityName ) ); } @@ -67,10 +70,11 @@ default SearchScope scope(Class expectedSuperType, String entityName) * @param expectedSuperType A supertype of all indexed entity types to include in the scope. * @param entityNames A collection of entity names. See {@link Entity#name()}. * Each entity type referenced in the collection must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - SearchScope scope(Class expectedSuperType, Collection entityNames); + SearchScope scope(Class expectedSuperType, Collection entityNames); } diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/impl/SearchScopeImpl.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/impl/SearchScopeImpl.java index 8bdb6012a51..a5be04c066c 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/impl/SearchScopeImpl.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/impl/SearchScopeImpl.java @@ -17,6 +17,7 @@ import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory; +import org.hibernate.search.mapper.orm.common.EntityReference; import org.hibernate.search.mapper.orm.entity.SearchIndexedEntity; import org.hibernate.search.mapper.orm.loading.impl.HibernateOrmSelectionLoadingContext; import org.hibernate.search.mapper.orm.massindexing.MassIndexer; @@ -36,17 +37,19 @@ import org.hibernate.search.mapper.pojo.work.spi.PojoScopeWorkspace; @SuppressWarnings("deprecation") -public class SearchScopeImpl implements SearchScope, BatchScopeContext { +public class SearchScopeImpl implements SearchScope, BatchScopeContext { private final HibernateOrmScopeMappingContext mappingContext; private final TenancyConfiguration tenancyConfiguration; - private final PojoScopeDelegate> delegate; public SearchScopeImpl(HibernateOrmScopeMappingContext mappingContext, TenancyConfiguration tenancyConfiguration, - PojoScopeDelegate> delegate) { this.mappingContext = mappingContext; @@ -54,8 +57,9 @@ public SearchScopeImpl(HibernateOrmScopeMappingContext mappingContext, this.delegate = delegate; } - public SearchQuerySelectStep predicate() { return delegate.predicate(); } @Override - public SearchSortFactory sort() { + public SearchSortFactory sort() { return delegate.sort(); } @Override - public SearchProjectionFactory projection() { + public SearchProjectionFactory projection() { return delegate.projection(); } @Override - public SearchAggregationFactory aggregation() { + public SearchAggregationFactory aggregation() { return delegate.aggregation(); } diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/SearchSession.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/SearchSession.java index a441d39df3e..9519f20fc48 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/SearchSession.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/SearchSession.java @@ -12,6 +12,7 @@ import org.hibernate.Session; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; +import org.hibernate.search.engine.search.reference.RootReferenceScope; import org.hibernate.search.mapper.orm.mapping.SearchMapping; import org.hibernate.search.mapper.orm.massindexing.MassIndexer; import org.hibernate.search.mapper.orm.schema.management.SearchSchemaManager; @@ -44,7 +45,8 @@ public interface SearchSession extends SearchScopeProvider { * @see SearchQuerySelectStep */ @SuppressWarnings("deprecation") - default SearchQuerySelectStep SearchQuerySelectStep SearchQuerySelectStep SearchQuerySelectStep SearchQuerySelectStep SearchQuerySelectStep search(SearchScope scope); + + /** + * Initiate the building of a search query. + *

+ * The query will target the indexes in the given scope. + * + * @param scope A scope representing all indexed types that will be targeted by the search query. + * @param A supertype of all types in the given scope. + * @return The initial step of a DSL where the search query can be defined. + * @see SearchQuerySelectStep + */ + @SuppressWarnings("deprecation") + @Incubating + SearchQuerySelectStep search(SearchScope scope); + ?> search(RootReferenceScope scope); /** * Create a {@link SearchSchemaManager} for all indexes. diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/DelegatingSearchSession.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/DelegatingSearchSession.java index f9483bfb842..74809a63975 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/DelegatingSearchSession.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/DelegatingSearchSession.java @@ -12,6 +12,7 @@ import org.hibernate.Session; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; +import org.hibernate.search.engine.search.reference.RootReferenceScope; import org.hibernate.search.mapper.orm.common.impl.HibernateOrmUtils; import org.hibernate.search.mapper.orm.massindexing.MassIndexer; import org.hibernate.search.mapper.orm.schema.management.SearchSchemaManager; @@ -42,7 +43,8 @@ public DelegatingSearchSession(Supplier SearchQuerySelectStep SearchQuerySelectStep SearchQuerySelectStep SearchQuerySelectStep search( - SearchScope scope) { + ?> search(SearchScope scope) { + return getDelegate().search( scope ); + } + + @Override + @SuppressWarnings("deprecation") + public < + SR, + T> SearchQuerySelectStep search( + RootReferenceScope scope) { return getDelegate().search( scope ); } @@ -80,12 +97,12 @@ public MassIndexer massIndexer(Collection> classes) { } @Override - public SearchScope scope(Collection> classes) { + public SearchScope scope(Collection> classes) { return getDelegate().scope( classes ); } @Override - public SearchScope scope(Class expectedSuperType, Collection entityNames) { + public SearchScope scope(Class expectedSuperType, Collection entityNames) { return getDelegate().scope( expectedSuperType, entityNames ); } diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java index 59c2a8d7380..17a8617a9d8 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java @@ -19,8 +19,10 @@ import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.search.engine.backend.common.spi.EntityReferenceFactory; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; +import org.hibernate.search.engine.search.reference.RootReferenceScope; import org.hibernate.search.mapper.orm.automaticindexing.session.impl.DelegatingAutomaticIndexingSynchronizationStrategy; import org.hibernate.search.mapper.orm.automaticindexing.spi.AutomaticIndexingEventSendingSessionContext; +import org.hibernate.search.mapper.orm.common.EntityReference; import org.hibernate.search.mapper.orm.loading.impl.HibernateOrmSelectionLoadingContext; import org.hibernate.search.mapper.orm.logging.impl.ConfigurationLog; import org.hibernate.search.mapper.orm.logging.impl.OrmMiscLog; @@ -135,34 +137,31 @@ public PojoIndexer createIndexer() { } @Override - public SearchQuerySelectStep search( - Collection> classes) { + public SearchQuerySelectStep search( + Collection> classes) { return search( scope( classes ) ); } @Override - public SearchQuerySelectStep search( - SearchScope scope) { - return search( (SearchScopeImpl) scope ); + public SearchQuerySelectStep search( + SearchScope scope) { + return search( (SearchScopeImpl) scope ); } - public SearchQuerySelectStep SearchQuerySelectStep search( + RootReferenceScope scope) { + SearchScope scope1 = scope.create( this ); + return search( (SearchScopeImpl) scope1 ); + } + + private SearchQuerySelectStep search( - SearchScopeImpl scope) { + ?> search(SearchScopeImpl scope) { return scope.search( this, loadingContextBuilder() ); } @@ -182,13 +181,13 @@ public MassIndexer massIndexer(Collection> classes) { } @Override - public SearchScopeImpl scope(Collection> classes) { + public SearchScopeImpl scope(Collection> classes) { checkOpen(); return mappingContext.createScope( classes ); } @Override - public SearchScope scope(Class expectedSuperType, Collection entityNames) { + public SearchScope scope(Class expectedSuperType, Collection entityNames) { checkOpen(); return mappingContext.createScope( expectedSuperType, entityNames ); } diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSessionMappingContext.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSessionMappingContext.java index 2501e24f8d3..20c9bea9839 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSessionMappingContext.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSessionMappingContext.java @@ -20,9 +20,9 @@ public interface HibernateOrmSearchSessionMappingContext @Override FailureHandler failureHandler(); - SearchScopeImpl createScope(Collection> types); + SearchScopeImpl createScope(Collection> types); - SearchScopeImpl createScope(Class expectedSuperType, Collection entityNames); + SearchScopeImpl createScope(Class expectedSuperType, Collection entityNames); HibernateOrmSearchSession.Builder createSessionBuilder( SessionImplementor sessionImplementor); diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/spi/BatchMappingContext.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/spi/BatchMappingContext.java index 3e00c6e5498..b3453a2c1da 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/spi/BatchMappingContext.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/spi/BatchMappingContext.java @@ -17,11 +17,11 @@ public interface BatchMappingContext { BatchSessionContext sessionContext(EntityManager entityManager); - BatchScopeContext scope(Class expectedSuperType); + BatchScopeContext scope(Class expectedSuperType); - BatchScopeContext scope(Class expectedSuperType, String entityName); + BatchScopeContext scope(Class expectedSuperType, String entityName); - BatchScopeContext scope(Collection> classes); + BatchScopeContext scope(Collection> classes); TenancyConfiguration tenancyConfiguration(); diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoIndexedTypeManager.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoIndexedTypeManager.java index 46a1651bd05..00c350f95e6 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoIndexedTypeManager.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoIndexedTypeManager.java @@ -129,12 +129,12 @@ public IndexIndexingPlan createIndexingPlan(PojoWorkSessionContext sessionContex } @Override - public MappedIndexScopeBuilder createScopeBuilder(BackendMappingContext mappingContext) { + public MappedIndexScopeBuilder createScopeBuilder(BackendMappingContext mappingContext) { return indexManager.createScopeBuilder( mappingContext ); } @Override - public void addTo(MappedIndexScopeBuilder builder) { + public void addTo(MappedIndexScopeBuilder builder) { indexManager.addTo( builder ); } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoMappingDelegateImpl.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoMappingDelegateImpl.java index 269b7bc3ca6..9801a829703 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoMappingDelegateImpl.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/impl/PojoMappingDelegateImpl.java @@ -108,7 +108,7 @@ public PojoEntityReferenceFactory createEntityReferenceFactory(PojoEntityReferen } @Override - public PojoScopeDelegate createPojoScopeForClasses( + public PojoScopeDelegate createPojoScopeForClasses( PojoScopeMappingContext mappingContext, Collection> classes, PojoScopeTypeExtendedContextProvider indexedTypeExtendedContextProvider) { @@ -125,7 +125,7 @@ public PojoScopeDelegate createPojoSc @Override @SuppressWarnings("unchecked") // The cast is checked through reflection - public PojoScopeDelegate createPojoScopeForEntityNames( + public PojoScopeDelegate createPojoScopeForEntityNames( PojoScopeMappingContext mappingContext, Class expectedSuperType, Collection entityNames, PojoScopeTypeExtendedContextProvider indexedTypeExtendedContextProvider) { if ( entityNames.isEmpty() ) { @@ -148,7 +148,7 @@ public PojoScopeDelegate createPojoSc @Override @Deprecated(since = "7.1") - public PojoScopeDelegate createPojoScope( + public PojoScopeDelegate createPojoScope( PojoScopeMappingContext mappingContext, Collection> targetedTypes, PojoScopeTypeExtendedContextProvider indexedTypeExtendedContextProvider) { @@ -164,7 +164,7 @@ public PojoScopeDelegate createPojoSc } @Override - public Optional> createPojoAllScope( + public Optional> createPojoAllScope( PojoScopeMappingContext mappingContext, PojoScopeTypeExtendedContextProvider indexedTypeExtendedContextProvider) { if ( typeManagers.allIndexed().isEmpty() ) { diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/spi/PojoMappingDelegate.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/spi/PojoMappingDelegate.java index 9c63fc01c31..60e3650b050 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/spi/PojoMappingDelegate.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/spi/PojoMappingDelegate.java @@ -61,11 +61,12 @@ public interface PojoMappingDelegate extends AutoCloseable { * @param indexedTypeExtendedContextProvider A provider of extended, mapper-specific type contexts. * that will be made available through {@link PojoScopeDelegate#includedIndexedTypes()}. * @return A {@link PojoScopeDelegate} + * @param Scope root type. * @param The type of entity references. * @param A supertype of all indexed entity types to include in the scope. * @param The type of extended, mapper-specific type contexts. */ - PojoScopeDelegate createPojoScopeForClasses( + PojoScopeDelegate createPojoScopeForClasses( PojoScopeMappingContext mappingContext, Collection> classes, PojoScopeTypeExtendedContextProvider indexedTypeExtendedContextProvider); @@ -81,11 +82,12 @@ PojoScopeDelegate createPojoScopeForC * @param indexedTypeExtendedContextProvider A provider of extended, mapper-specific type contexts. * that will be made available through {@link PojoScopeDelegate#includedIndexedTypes()}. * @return A {@link PojoScopeDelegate} + * @param Scope root type. * @param The type of entity references. * @param A supertype of all indexed entity types to include in the scope. * @param The type of extended, mapper-specific type contexts. */ - PojoScopeDelegate createPojoScopeForEntityNames( + PojoScopeDelegate createPojoScopeForEntityNames( PojoScopeMappingContext mappingContext, Class expectedSuperType, Collection entityNames, PojoScopeTypeExtendedContextProvider indexedTypeExtendedContextProvider); @@ -100,6 +102,7 @@ PojoScopeDelegate createPojoScopeForE * @param indexedTypeExtendedContextProvider A provider of extended, mapper-specific type contexts. * that will be made available through {@link PojoScopeDelegate#includedIndexedTypes()}. * @return A {@link PojoScopeDelegate} + * @param Scope root type. * @param The type of entity references. * @param A supertype of all indexed entity types to include in the scope. * @param The type of extended, mapper-specific type contexts. @@ -110,12 +113,12 @@ PojoScopeDelegate createPojoScopeForE * instead. */ @Deprecated(since = "7.1") - PojoScopeDelegate createPojoScope( + PojoScopeDelegate createPojoScope( PojoScopeMappingContext mappingContext, Collection> targetedTypes, PojoScopeTypeExtendedContextProvider indexedTypeExtendedContextProvider); - Optional> createPojoAllScope( + Optional> createPojoAllScope( PojoScopeMappingContext mappingContext, PojoScopeTypeExtendedContextProvider indexedTypeExtendedContextProvider); diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoDefaultMassIndexer.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoDefaultMassIndexer.java index 31ff678a55c..5b7195f9443 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoDefaultMassIndexer.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoDefaultMassIndexer.java @@ -48,7 +48,7 @@ public void afterExecution(Context context) { private final PojoMassIndexingTypeContextProvider typeContextProvider; private final Set> targetedIndexedTypes; private final PojoScopeSchemaManager scopeSchemaManager; - private final PojoScopeDelegate pojoScopeDelegate; + private final PojoScopeDelegate pojoScopeDelegate; // default settings defined here: private int typesToIndexInParallel = 1; @@ -69,7 +69,7 @@ public PojoDefaultMassIndexer(PojoMassIndexingContext massIndexingContext, PojoMassIndexingTypeContextProvider typeContextProvider, Set> targetedIndexedTypes, PojoScopeSchemaManager scopeSchemaManager, - PojoScopeDelegate pojoScopeDelegate) { + PojoScopeDelegate pojoScopeDelegate) { this.massIndexingContext = massIndexingContext; this.mappingContext = mappingContext; this.typeContextProvider = typeContextProvider; diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchCoordinator.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchCoordinator.java index 7e33c4bdea7..d1ae137a51e 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchCoordinator.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/massindexing/impl/PojoMassIndexingBatchCoordinator.java @@ -43,7 +43,7 @@ public class PojoMassIndexingBatchCoordinator extends PojoMassIndexingFailureHan private final PojoMassIndexingContext massIndexingContext; private final PojoScopeSchemaManager scopeSchemaManager; - private final PojoScopeDelegate pojoScopeDelegate; + private final PojoScopeDelegate pojoScopeDelegate; private final int typesToIndexInParallel; private final int documentBuilderThreads; private final Boolean mergeSegmentsOnFinish; @@ -61,7 +61,7 @@ public PojoMassIndexingBatchCoordinator(PojoMassIndexingMappingContext mappingCo List> typeGroupsToIndex, PojoMassIndexingContext massIndexingContext, PojoScopeSchemaManager scopeSchemaManager, - PojoScopeDelegate pojoScopeDelegate, + PojoScopeDelegate pojoScopeDelegate, MassIndexingEnvironment environment, int typesToIndexInParallel, int documentBuilderThreads, Boolean mergeSegmentsOnFinish, boolean dropAndCreateSchemaOnStart, Boolean purgeAtStart, Boolean mergeSegmentsAfterPurge) { diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeDelegateImpl.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeDelegateImpl.java index b06d502e807..959c136d21c 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeDelegateImpl.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeDelegateImpl.java @@ -39,9 +39,9 @@ import org.hibernate.search.mapper.pojo.work.impl.PojoScopeWorkspaceImpl; import org.hibernate.search.mapper.pojo.work.spi.PojoScopeWorkspace; -public final class PojoScopeDelegateImpl implements PojoScopeDelegate { +public final class PojoScopeDelegateImpl implements PojoScopeDelegate { - public static PojoScopeDelegate create( + public static PojoScopeDelegate create( PojoScopeMappingContext mappingContext, PojoScopeTypeContextProvider typeContextProvider, Set> targetedTypeContexts, @@ -62,7 +62,7 @@ public static PojoScopeDelegate creat private final PojoScopeTypeContextProvider indexedTypeContextProvider; private final Set> targetedTypeContexts; private final Set targetedTypeExtendedContexts; - private MappedIndexScope delegate; + private MappedIndexScope delegate; private PojoScopeDelegateImpl(PojoScopeMappingContext mappingContext, PojoScopeTypeContextProvider indexedTypeContextProvider, @@ -80,7 +80,7 @@ public Set includedIndexedTypes() { } @Override - public SearchQuerySelectStep, ?> search( + public SearchQuerySelectStep, ?> search( PojoScopeSessionContext sessionContext, PojoSelectionLoadingContextBuilder loadingContextBuilder) { Map> targetTypesByEntityName = new LinkedHashMap<>(); @@ -93,22 +93,22 @@ public Set includedIndexedTypes() { } @Override - public SearchPredicateFactory predicate() { + public SearchPredicateFactory predicate() { return getIndexScope().predicate(); } @Override - public SearchSortFactory sort() { + public SearchSortFactory sort() { return getIndexScope().sort(); } @Override - public SearchProjectionFactory projection() { + public SearchProjectionFactory projection() { return getIndexScope().projection(); } @Override - public SearchAggregationFactory aggregation() { + public SearchAggregationFactory aggregation() { return getIndexScope().aggregation(); } @@ -143,10 +143,10 @@ public T extension(IndexScopeExtension extension) { return getIndexScope().extension( extension ); } - private MappedIndexScope getIndexScope() { + private MappedIndexScope getIndexScope() { if ( delegate == null ) { Iterator> iterator = targetedTypeContexts.iterator(); - MappedIndexScopeBuilder builder = iterator.next().createScopeBuilder( mappingContext ); + MappedIndexScopeBuilder builder = iterator.next().createScopeBuilder( mappingContext ); while ( iterator.hasNext() ) { iterator.next().addTo( builder ); } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeIndexedTypeContext.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeIndexedTypeContext.java index 3dbfe9c4ec5..af0c0567094 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeIndexedTypeContext.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/impl/PojoScopeIndexedTypeContext.java @@ -19,8 +19,8 @@ public interface PojoScopeIndexedTypeContext extends PojoWorkIndexedTypeContext, PojoSchemaManagementIndexedTypeContext, PojoSearchLoadingIndexedTypeContext, PojoMassIndexingIndexedTypeContext { - MappedIndexScopeBuilder createScopeBuilder(BackendMappingContext mappingContext); + MappedIndexScopeBuilder createScopeBuilder(BackendMappingContext mappingContext); - void addTo(MappedIndexScopeBuilder builder); + void addTo(MappedIndexScopeBuilder builder); } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/spi/PojoScopeDelegate.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/spi/PojoScopeDelegate.java index 1f495299586..965e4266776 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/spi/PojoScopeDelegate.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/scope/spi/PojoScopeDelegate.java @@ -21,6 +21,7 @@ import org.hibernate.search.mapper.pojo.work.spi.PojoScopeWorkspace; /** + * @param Scope root type. * @param The type of entity references, i.e. the type of hits returned by * {@link SearchQuerySelectStep#selectEntityReference()} reference queries}, * @param The type of loaded entities, i.e. the type of hits returned by @@ -30,21 +31,21 @@ * {@link #includedIndexedTypes()}. * or the type of objects returned for {@link SearchProjectionFactory#entity() entity projections}. */ -public interface PojoScopeDelegate { +public interface PojoScopeDelegate { Set includedIndexedTypes(); - SearchQuerySelectStep, ?> search( + SearchQuerySelectStep, ?> search( PojoScopeSessionContext sessionContext, PojoSelectionLoadingContextBuilder loadingContextBuilder); - SearchPredicateFactory predicate(); + SearchPredicateFactory predicate(); - SearchSortFactory sort(); + SearchSortFactory sort(); - SearchProjectionFactory projection(); + SearchProjectionFactory projection(); - SearchAggregationFactory aggregation(); + SearchAggregationFactory aggregation(); SearchHighlighterFactory highlighter(); diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/DocumentReferenceProjectionBinder.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/DocumentReferenceProjectionBinder.java index 3ba6d1daa92..1d6fa628dad 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/DocumentReferenceProjectionBinder.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/DocumentReferenceProjectionBinder.java @@ -49,7 +49,7 @@ protected String type() { } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.documentReference().toProjection(); } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/EntityProjectionBinder.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/EntityProjectionBinder.java index 95c9aa234f6..b664f6d6242 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/EntityProjectionBinder.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/EntityProjectionBinder.java @@ -63,7 +63,7 @@ public void appendTo(ToStringTreeAppender appender) { } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.entity( requestedEntityType ).toProjection(); } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/EntityReferenceProjectionBinder.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/EntityReferenceProjectionBinder.java index 632c83942c9..917113f43ab 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/EntityReferenceProjectionBinder.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/EntityReferenceProjectionBinder.java @@ -53,7 +53,7 @@ protected String type() { // Mappers are required to have their entity reference type extend EntityReference. // The generic parameter R in SearchProjectionFactory is only there for backwards compatibility. @SuppressWarnings("unchecked") - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return (SearchProjection) factory.entityReference().toProjection(); } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/HighlightProjectionBinder.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/HighlightProjectionBinder.java index 7b2b7067d31..dd398050521 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/HighlightProjectionBinder.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/HighlightProjectionBinder.java @@ -121,7 +121,7 @@ protected String type() { } @Override - public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.highlight( fieldPath ) .highlighter( highlighterName ) .collector( collector ) diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/IdProjectionBinder.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/IdProjectionBinder.java index 9020a190b6b..f2c9eedf6cd 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/IdProjectionBinder.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/IdProjectionBinder.java @@ -63,7 +63,7 @@ public void appendTo(ToStringTreeAppender appender) { } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.id( requestedIdentifierType ).toProjection(); } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/ScoreProjectionBinder.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/ScoreProjectionBinder.java index d42e76280aa..268e3bff516 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/ScoreProjectionBinder.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/binding/builtin/ScoreProjectionBinder.java @@ -47,7 +47,7 @@ protected String type() { } @Override - public SearchProjection create(SearchProjectionFactory factory, + public SearchProjection create(SearchProjectionFactory factory, ProjectionDefinitionContext context) { return factory.score().toProjection(); } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/impl/PojoConstructorProjectionDefinition.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/impl/PojoConstructorProjectionDefinition.java index 5c5e77057dd..752d18a3299 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/impl/PojoConstructorProjectionDefinition.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/search/definition/impl/PojoConstructorProjectionDefinition.java @@ -63,7 +63,7 @@ public void close() { } @Override - public CompositeProjectionValueStep apply(SearchProjectionFactory projectionFactory, + public CompositeProjectionValueStep apply(SearchProjectionFactory projectionFactory, CompositeProjectionInnerStep initialStep, ProjectionDefinitionContext context) { int i = -1; try { diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMapping.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMapping.java index 65cc599f684..4ede3c28d34 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMapping.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMapping.java @@ -70,12 +70,12 @@ public CompletableFuture start(MappingStartContext context) { configuredIndexingPlanSynchronizationStrategyHolder.start( context ); - Optional> scopeOptional = createAllScope(); + Optional> scopeOptional = createAllScope(); if ( !scopeOptional.isPresent() ) { // No indexed type return CompletableFuture.completedFuture( null ); } - SearchScopeImpl scope = scopeOptional.get(); + SearchScopeImpl scope = scopeOptional.get(); // Schema management PojoScopeSchemaManager schemaManager = scope.schemaManagerDelegate(); @@ -88,7 +88,7 @@ public CompletableFuture start(MappingStartContext context) { @Override public CompletableFuture preStop(MappingPreStopContext context) { - Optional> scope = createAllScope(); + Optional> scope = createAllScope(); if ( !scope.isPresent() ) { // No indexed type return CompletableFuture.completedFuture( null ); @@ -130,12 +130,12 @@ public MassIndexingDefaultCleanOperation massIndexingDefaultCleanOperation() { } @Override - public SearchScope scope(Collection> targetedTypes) { + public SearchScope scope(Collection> targetedTypes) { return createScope( targetedTypes ); } @Override - public SearchScope scope(Class expectedSuperType, Collection entityNames) { + public SearchScope scope(Class expectedSuperType, Collection entityNames) { return createScope( expectedSuperType, entityNames ); } @@ -155,8 +155,8 @@ public SearchSessionBuilder createSessionWithOptions() { } @Override - public SearchScopeImpl createScope(Collection> classes) { - PojoScopeDelegate> scopeDelegate = + public SearchScopeImpl createScope(Collection> classes) { + PojoScopeDelegate> scopeDelegate = delegate().createPojoScopeForClasses( this, classes, @@ -164,12 +164,12 @@ public SearchScopeImpl createScope(Collection( this, tenancyConfiguration, scopeDelegate ); + return new SearchScopeImpl( this, tenancyConfiguration, scopeDelegate ); } @Override - public SearchScopeImpl createScope(Class expectedSuperType, Collection entityNames) { - PojoScopeDelegate> scopeDelegate = + public SearchScopeImpl createScope(Class expectedSuperType, Collection entityNames) { + PojoScopeDelegate> scopeDelegate = delegate().createPojoScopeForEntityNames( this, expectedSuperType, entityNames, @@ -177,7 +177,7 @@ public SearchScopeImpl createScope(Class expectedSuperType, Collection ); // Explicit type parameter is necessary here for ECJ (Eclipse compiler) - return new SearchScopeImpl( this, tenancyConfiguration, scopeDelegate ); + return new SearchScopeImpl( this, tenancyConfiguration, scopeDelegate ); } @Override @@ -235,9 +235,9 @@ private SearchIntegration searchIntegration() { return integrationHandle.getOrFail(); } - private Optional> createAllScope() { + private Optional> createAllScope() { return delegate() - .>createPojoAllScope( + .>createPojoAllScope( this, typeContextContainer::indexedForExactType ) diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java index 6ef339e69b0..f339e099f47 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScope.java @@ -40,7 +40,7 @@ * @param A supertype of all types in this scope. */ @Incubating -public interface SearchScope extends org.hibernate.search.engine.mapper.scope.SearchScope { +public interface SearchScope extends org.hibernate.search.engine.mapper.scope.SearchScope { /** * Initiate the building of a search predicate. @@ -56,7 +56,7 @@ public interface SearchScope extends org.hibernate.search.engine.mapper.scope * @return A predicate factory. * @see SearchPredicateFactory */ - SearchPredicateFactory predicate(); + SearchPredicateFactory predicate(); /** * Initiate the building of a search sort. @@ -72,7 +72,7 @@ public interface SearchScope extends org.hibernate.search.engine.mapper.scope * @return A sort factory. * @see SearchSortFactory */ - SearchSortFactory sort(); + SearchSortFactory sort(); /** * Initiate the building of a search projection that will be valid for the indexes in this scope. @@ -88,7 +88,7 @@ public interface SearchScope extends org.hibernate.search.engine.mapper.scope * @return A projection factory. * @see SearchProjectionFactory */ - SearchProjectionFactory projection(); + SearchProjectionFactory projection(); /** * Initiate the building of a search aggregation that will be valid for the indexes in this scope. @@ -104,7 +104,7 @@ public interface SearchScope extends org.hibernate.search.engine.mapper.scope * @return An aggregation factory. * @see SearchAggregationFactory */ - SearchAggregationFactory aggregation(); + SearchAggregationFactory aggregation(); /** * Initiate the building of a highlighter that will be valid for the indexes in this scope. diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java index 0ee57b9e93a..bbfcc43cad3 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java @@ -25,11 +25,12 @@ public interface SearchScopeProvider extends org.hibernate.search.engine.mapper. * indexed entity types among the given class and its subtypes. * * @param clazz A class that must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - default SearchScope scope(Class clazz) { + default SearchScope scope(Class clazz) { return scope( Collections.singleton( clazz ) ); } @@ -39,11 +40,12 @@ default SearchScope scope(Class clazz) { * * @param classes A collection of classes. * Each must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - SearchScope scope(Collection> classes); + SearchScope scope(Collection> classes); /** * Creates a {@link SearchScope} limited to @@ -52,11 +54,12 @@ default SearchScope scope(Class clazz) { * @param expectedSuperType A supertype of all entity types to include in the scope. * @param entityName An entity name. See {@link SearchEntity#name()}. * The referenced entity type must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - default SearchScope scope(Class expectedSuperType, String entityName) { + default SearchScope scope(Class expectedSuperType, String entityName) { return scope( expectedSuperType, Collections.singleton( entityName ) ); } @@ -67,10 +70,11 @@ default SearchScope scope(Class expectedSuperType, String entityName) * @param expectedSuperType A supertype of all indexed entity types to include in the scope. * @param entityNames A collection of entity names. See {@link SearchEntity#name()}. * Each entity type referenced in the collection must be an indexed entity type or a supertype of such type. + * @param Scope root type. * @param A supertype of all indexed entity types to include in the scope. * @return The created scope. * @see SearchScope */ - SearchScope scope(Class expectedSuperType, Collection entityNames); + SearchScope scope(Class expectedSuperType, Collection entityNames); } diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/SearchScopeImpl.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/SearchScopeImpl.java index 5c063c48f4f..50936324a8e 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/SearchScopeImpl.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/impl/SearchScopeImpl.java @@ -34,37 +34,37 @@ import org.hibernate.search.mapper.pojo.standalone.work.SearchWorkspace; import org.hibernate.search.mapper.pojo.standalone.work.impl.SearchWorkspaceImpl; -public class SearchScopeImpl implements SearchScope { +public class SearchScopeImpl implements SearchScope { private final StandalonePojoScopeMappingContext mappingContext; - private final PojoScopeDelegate> delegate; + private final PojoScopeDelegate> delegate; private final TenancyConfiguration tenancyConfiguration; public SearchScopeImpl(StandalonePojoScopeMappingContext mappingContext, TenancyConfiguration tenancyConfiguration, - PojoScopeDelegate> delegate) { + PojoScopeDelegate> delegate) { this.mappingContext = mappingContext; this.tenancyConfiguration = tenancyConfiguration; this.delegate = delegate; } @Override - public SearchPredicateFactory predicate() { + public SearchPredicateFactory predicate() { return delegate.predicate(); } @Override - public SearchSortFactory sort() { + public SearchSortFactory sort() { return delegate.sort(); } @Override - public SearchProjectionFactory projection() { + public SearchProjectionFactory projection() { return delegate.projection(); } @Override - public SearchAggregationFactory aggregation() { + public SearchAggregationFactory aggregation() { return delegate.aggregation(); } @@ -104,7 +104,7 @@ public T extension(IndexScopeExtension extension) { return delegate.extension( extension ); } - public SearchQuerySelectStep search(PojoScopeSessionContext sessionContext, + public SearchQuerySelectStep search(PojoScopeSessionContext sessionContext, PojoSelectionLoadingContextBuilder loadingContextBuilder) { return delegate.search( sessionContext, loadingContextBuilder ); } diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/SearchSession.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/SearchSession.java index 8794e43aa21..b21620c1843 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/SearchSession.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/SearchSession.java @@ -10,6 +10,7 @@ import org.hibernate.search.engine.common.EntityReference; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; +import org.hibernate.search.engine.search.reference.RootReferenceScope; import org.hibernate.search.mapper.pojo.standalone.massindexing.MassIndexer; import org.hibernate.search.mapper.pojo.standalone.schema.management.SearchSchemaManager; import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; @@ -87,7 +88,7 @@ default MassIndexer massIndexer(Class... classes) { * @return The initial step of a DSL where the search query can be defined. * @see SearchQuerySelectStep */ - default SearchQuerySelectStep search(Class clazz) { + default SearchQuerySelectStep search(Class clazz) { return search( Collections.singleton( clazz ) ); } @@ -103,7 +104,7 @@ default MassIndexer massIndexer(Class... classes) { * @return The initial step of a DSL where the search query can be defined. * @see SearchQuerySelectStep */ - SearchQuerySelectStep search(Collection> classes); + SearchQuerySelectStep search(Collection> classes); /** * Initiate the building of a search query. @@ -115,7 +116,27 @@ default MassIndexer massIndexer(Class... classes) { * @return The initial step of a DSL where the search query can be defined. * @see SearchQuerySelectStep */ - SearchQuerySelectStep search(SearchScope scope); + SearchQuerySelectStep search(SearchScope scope); + + /** + * Initiate the building of a search query. + *

+ * The query will target the indexes in the given scope. + * + * @param scope A scope representing all indexed types that will be targeted by the search query. + * @param Scope root type. + * @param A supertype of all types in the given scope. + * @return The initial step of a DSL where the search query can be defined. + * @see SearchQuerySelectStep + */ + @Incubating + SearchQuerySelectStep search(RootReferenceScope scope); /** * Create a {@link SearchSchemaManager} for all indexes. diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java index f255483d6ea..c688e575414 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java @@ -11,6 +11,7 @@ import org.hibernate.search.engine.common.EntityReference; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; +import org.hibernate.search.engine.search.reference.RootReferenceScope; import org.hibernate.search.mapper.pojo.loading.spi.PojoSelectionLoadingContext; import org.hibernate.search.mapper.pojo.model.spi.PojoRuntimeIntrospector; import org.hibernate.search.mapper.pojo.session.spi.AbstractPojoSearchSession; @@ -127,13 +128,20 @@ public PojoRuntimeIntrospector runtimeIntrospector() { } @Override - public SearchQuerySelectStep search(Collection> classes) { + public SearchQuerySelectStep search( + Collection> classes) { return search( scope( classes ) ); } @Override - public SearchQuerySelectStep search(SearchScope scope) { - return search( (SearchScopeImpl) scope ); + public SearchQuerySelectStep search(SearchScope scope) { + return search( (SearchScopeImpl) scope ); + } + + @Override + public SearchQuerySelectStep search(RootReferenceScope referenceScope) { + SearchScopeImpl scope = referenceScope.create( this ); + return search( scope ); } @Override @@ -147,12 +155,12 @@ public SearchWorkspace workspace(Collection> classes) { } @Override - public SearchScopeImpl scope(Collection> types) { + public SearchScopeImpl scope(Collection> types) { return mappingContext.createScope( types ); } @Override - public SearchScopeImpl scope(Class expectedSuperType, Collection entityNames) { + public SearchScopeImpl scope(Class expectedSuperType, Collection entityNames) { return mappingContext.createScope( expectedSuperType, entityNames ); } @@ -200,7 +208,7 @@ public StandalonePojoSearchSessionMappingContext mappingContext() { return mappingContext; } - private SearchQuerySelectStep search(SearchScopeImpl scope) { + private SearchQuerySelectStep search(SearchScopeImpl scope) { return scope.search( this, loadingContextBuilder() ); } diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSessionMappingContext.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSessionMappingContext.java index 67ff85c2516..1f561640457 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSessionMappingContext.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSessionMappingContext.java @@ -16,9 +16,9 @@ public interface StandalonePojoSearchSessionMappingContext extends PojoSearchSessionMappingContext, StandalonePojoScopeMappingContext, StandalonePojoMassIndexingMappingContext { - SearchScopeImpl createScope(Collection> types); + SearchScopeImpl createScope(Collection> types); - SearchScopeImpl createScope(Class expectedSuperType, Collection entityNames); + SearchScopeImpl createScope(Class expectedSuperType, Collection entityNames); TenancyConfiguration tenancyConfiguration(); } diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/aggregation/dsl/impl/StubSearchAggregationFactory.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/aggregation/dsl/impl/StubSearchAggregationFactory.java index 12c163ef229..131741c960c 100644 --- a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/aggregation/dsl/impl/StubSearchAggregationFactory.java +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/aggregation/dsl/impl/StubSearchAggregationFactory.java @@ -9,17 +9,20 @@ import org.hibernate.search.engine.search.aggregation.spi.SearchAggregationIndexScope; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -public class StubSearchAggregationFactory +public class StubSearchAggregationFactory extends - AbstractSearchAggregationFactory, SearchPredicateFactory> { + AbstractSearchAggregationFactory, + SearchAggregationIndexScope, + SearchPredicateFactory> { public StubSearchAggregationFactory( - SearchAggregationDslContext, SearchPredicateFactory> dslContext) { + SearchAggregationDslContext, SearchPredicateFactory> dslContext) { super( dslContext ); } @Override - public StubSearchAggregationFactory withRoot(String objectFieldPath) { - return new StubSearchAggregationFactory( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), + public StubSearchAggregationFactory withRoot(String objectFieldPath) { + return new StubSearchAggregationFactory<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } } diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/common/impl/StubSearchIndexScope.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/common/impl/StubSearchIndexScope.java index c1a44de7403..03a5a388393 100644 --- a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/common/impl/StubSearchIndexScope.java +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/common/impl/StubSearchIndexScope.java @@ -108,23 +108,23 @@ public

SearchQueryBuilder

select(BackendSessionContext sessionContext, } @Override - public SearchPredicateFactory predicateFactory() { - return new StubSearchPredicateFactory( SearchPredicateDslContext.root( this ) ); + public SearchPredicateFactory predicateFactory() { + return new StubSearchPredicateFactory<>( SearchPredicateDslContext.root( this ) ); } @Override - public SearchSortFactory sortFactory() { - return new StubSearchSortFactory( SearchSortDslContext.root( this, StubSearchSortFactory::new, predicateFactory() ) ); + public SearchSortFactory sortFactory() { + return new StubSearchSortFactory<>( SearchSortDslContext.root( this, StubSearchSortFactory::new, predicateFactory() ) ); } @Override - public SearchProjectionFactory projectionFactory() { + public SearchProjectionFactory projectionFactory() { return new StubSearchProjectionFactory<>( SearchProjectionDslContext.root( this ) ); } @Override - public SearchAggregationFactory aggregationFactory() { - return new StubSearchAggregationFactory( SearchAggregationDslContext.root( this, predicateFactory() ) ); + public SearchAggregationFactory aggregationFactory() { + return new StubSearchAggregationFactory( SearchAggregationDslContext.root( this, predicateFactory() ) ); } @Override diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/predicate/dsl/impl/StubSearchPredicateFactory.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/predicate/dsl/impl/StubSearchPredicateFactory.java index 62ee7125dfc..bc390495502 100644 --- a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/predicate/dsl/impl/StubSearchPredicateFactory.java +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/predicate/dsl/impl/StubSearchPredicateFactory.java @@ -8,15 +8,15 @@ import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; import org.hibernate.search.engine.search.predicate.spi.SearchPredicateIndexScope; -public class StubSearchPredicateFactory - extends AbstractSearchPredicateFactory> { +public class StubSearchPredicateFactory + extends AbstractSearchPredicateFactory, SearchPredicateIndexScope> { public StubSearchPredicateFactory( SearchPredicateDslContext> dslContext) { super( dslContext ); } @Override - public StubSearchPredicateFactory withRoot(String objectFieldPath) { - return new StubSearchPredicateFactory( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); + public StubSearchPredicateFactory withRoot(String objectFieldPath) { + return new StubSearchPredicateFactory<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); } } diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/predicate/impl/StubSearchPredicate.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/predicate/impl/StubSearchPredicate.java index f7c55d26124..b3306c03f97 100644 --- a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/predicate/impl/StubSearchPredicate.java +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/predicate/impl/StubSearchPredicate.java @@ -296,7 +296,7 @@ public void nested(SearchPredicate nestedPredicate) { } @Override - public void factory(SearchPredicateFactory factory) { + public void factory(SearchPredicateFactory factory) { // No-op, just simulates a call on this object } diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/dsl/impl/StubSearchProjectionFactory.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/dsl/impl/StubSearchProjectionFactory.java index 3bf23351676..17b012f3cba 100644 --- a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/dsl/impl/StubSearchProjectionFactory.java +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/projection/dsl/impl/StubSearchProjectionFactory.java @@ -8,14 +8,15 @@ import org.hibernate.search.engine.search.projection.dsl.spi.SearchProjectionDslContext; import org.hibernate.search.engine.search.projection.spi.SearchProjectionIndexScope; -public class StubSearchProjectionFactory - extends AbstractSearchProjectionFactory, SearchProjectionIndexScope, R, E> { +public class StubSearchProjectionFactory + extends + AbstractSearchProjectionFactory, SearchProjectionIndexScope, R, E> { public StubSearchProjectionFactory(SearchProjectionDslContext> dslContext) { super( dslContext ); } @Override - public StubSearchProjectionFactory withRoot(String objectFieldPath) { + public StubSearchProjectionFactory withRoot(String objectFieldPath) { return new StubSearchProjectionFactory<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); } } diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/sort/dsl/impl/StubSearchSortFactory.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/sort/dsl/impl/StubSearchSortFactory.java index bd1f47d603f..02f3db7fa94 100644 --- a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/sort/dsl/impl/StubSearchSortFactory.java +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/sort/dsl/impl/StubSearchSortFactory.java @@ -9,15 +9,17 @@ import org.hibernate.search.engine.search.sort.dsl.spi.SearchSortDslContext; import org.hibernate.search.engine.search.sort.spi.SearchSortIndexScope; -public class StubSearchSortFactory - extends AbstractSearchSortFactory, SearchPredicateFactory> { - public StubSearchSortFactory(SearchSortDslContext, SearchPredicateFactory> dslContext) { +public class StubSearchSortFactory + extends + AbstractSearchSortFactory, SearchSortIndexScope, SearchPredicateFactory> { + public StubSearchSortFactory( + SearchSortDslContext, SearchPredicateFactory> dslContext) { super( dslContext ); } @Override - public StubSearchSortFactory withRoot(String objectFieldPath) { - return new StubSearchSortFactory( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), + public StubSearchSortFactory withRoot(String objectFieldPath) { + return new StubSearchSortFactory<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } } diff --git a/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/GenericStubMappingScope.java b/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/GenericStubMappingScope.java index b624b60013f..87da050e8d7 100644 --- a/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/GenericStubMappingScope.java +++ b/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/GenericStubMappingScope.java @@ -19,32 +19,32 @@ * A wrapper around {@link MappedIndexScope} providing some syntactic sugar, * such as methods that do not force to provide a session context. */ -public class GenericStubMappingScope { +public class GenericStubMappingScope { private final StubMapping mapping; - private final MappedIndexScope delegate; + private final MappedIndexScope delegate; private final SearchLoadingContext loadingContext; - GenericStubMappingScope(StubMapping mapping, MappedIndexScope delegate, + GenericStubMappingScope(StubMapping mapping, MappedIndexScope delegate, SearchLoadingContext loadingContext) { this.mapping = mapping; this.delegate = delegate; this.loadingContext = loadingContext; } - public SearchQuerySelectStep query() { + public SearchQuerySelectStep query() { return query( mapping.session() ); } - public SearchQuerySelectStep query(StubSession sessionContext) { + public SearchQuerySelectStep query(StubSession sessionContext) { return query( sessionContext, new StubLoadingOptionsStep() ); } - public SearchQuerySelectStep query(LOS loadingOptionsStep) { + public SearchQuerySelectStep query(LOS loadingOptionsStep) { return query( mapping.session(), loadingOptionsStep ); } - public SearchQuerySelectStep query(StubSession sessionContext, + public SearchQuerySelectStep query(StubSession sessionContext, LOS loadingOptionsStep) { SearchLoadingContextBuilder loadingContextBuilder = new SearchLoadingContextBuilder() { @Override @@ -60,19 +60,19 @@ public SearchLoadingContext build() { return delegate.search( sessionContext, loadingContextBuilder ); } - public SearchPredicateFactory predicate() { + public SearchPredicateFactory predicate() { return delegate.predicate(); } - public SearchSortFactory sort() { + public SearchSortFactory sort() { return delegate.sort(); } - public SearchProjectionFactory projection() { + public SearchProjectionFactory projection() { return delegate.projection(); } - public SearchAggregationFactory aggregation() { + public SearchAggregationFactory aggregation() { return delegate.aggregation(); } diff --git a/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/StubMappedIndex.java b/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/StubMappedIndex.java index 5bb74c50260..4e29b7f6274 100644 --- a/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/StubMappedIndex.java +++ b/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/StubMappedIndex.java @@ -195,7 +195,7 @@ public IndexWorkspace createWorkspace(String tenantId) { /** * @return {@code createScope().query()}. */ - public SearchQuerySelectStep query() { + public SearchQuerySelectStep query() { return createScope().query(); } @@ -203,7 +203,7 @@ public IndexWorkspace createWorkspace(String tenantId) { * @return A scope containing this index only. */ public StubMappingScope createScope() { - MappedIndexScopeBuilder builder = + MappedIndexScopeBuilder builder = delegate().createScopeBuilder( mapping ); return new StubMappingScope( mapping, builder.build() ); } @@ -212,7 +212,7 @@ public StubMappingScope createScope() { * @return A scope containing this index and the given other indexes. */ public StubMappingScope createScope(StubMappedIndex... others) { - MappedIndexScopeBuilder builder = + MappedIndexScopeBuilder builder = delegate().createScopeBuilder( mapping ); for ( StubMappedIndex other : others ) { other.delegate().addTo( builder ); @@ -223,14 +223,14 @@ public StubMappingScope createScope(StubMappedIndex... others) { /** * @return A scope containing this index and the given other indexes. */ - public GenericStubMappingScope createGenericScope( + public GenericStubMappingScope createGenericScope( SearchLoadingContext loadingContext, StubMappedIndex... others) { if ( ( (StubMappingImpl) mapping ).fixture.typeContexts == null ) { throw new AssertionFailure( "When testing loading with a \"generic\" scope," + " you must also set custom type contexts with consistent types." + " Use mapping.with().typeContext(...).run(...)." ); } - MappedIndexScopeBuilder builder = delegate().createScopeBuilder( mapping ); + MappedIndexScopeBuilder builder = delegate().createScopeBuilder( mapping ); for ( StubMappedIndex other : others ) { other.delegate().addTo( builder ); } diff --git a/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/StubMappingScope.java b/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/StubMappingScope.java index 1ab021f7e73..4925a4db525 100644 --- a/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/StubMappingScope.java +++ b/util/internal/integrationtest/mapper/stub/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/stub/StubMappingScope.java @@ -14,9 +14,9 @@ *

* This is a simpler version of {@link GenericStubMappingScope} that allows user to skip the generic parameters. */ -public class StubMappingScope extends GenericStubMappingScope { +public class StubMappingScope extends GenericStubMappingScope { - StubMappingScope(StubMapping mapping, MappedIndexScope delegate) { + StubMappingScope(StubMapping mapping, MappedIndexScope delegate) { super( mapping, delegate, new StubSearchLoadingContext() ); } } diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/AbstractConnectedMultiFieldsQueryBuilder.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/AbstractConnectedMultiFieldsQueryBuilder.java index 59fb8154d1d..b707a85dfbb 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/AbstractConnectedMultiFieldsQueryBuilder.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/AbstractConnectedMultiFieldsQueryBuilder.java @@ -34,7 +34,7 @@ public final Query createQuery() { } private SearchPredicate createPredicate() { - SearchPredicateFactory factory = queryContext.getScope().predicate(); + SearchPredicateFactory factory = queryContext.getScope().predicate(); if ( fieldsContext.size() == 1 ) { F finalStep = createPredicate( factory, fieldsContext.getFirst() ); queryCustomizer.applyScoreOptions( finalStep ); @@ -42,7 +42,7 @@ private SearchPredicate createPredicate() { return queryCustomizer.applyFilter( factory, predicate ); } else { - BooleanPredicateClausesStep boolStep = factory.bool().with( b -> { + BooleanPredicateClausesStep boolStep = factory.bool().with( b -> { for ( FieldContext fieldContext : fieldsContext ) { b.should( createPredicate( factory, fieldContext ) ); } @@ -53,5 +53,5 @@ private SearchPredicate createPredicate() { } } - protected abstract F createPredicate(SearchPredicateFactory factory, FieldContext fieldContext); + protected abstract F createPredicate(SearchPredicateFactory factory, FieldContext fieldContext); } diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/BooleanQueryBuilder.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/BooleanQueryBuilder.java index 970e738b930..e869769d795 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/BooleanQueryBuilder.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/BooleanQueryBuilder.java @@ -119,8 +119,8 @@ private SearchPredicate createPredicate() { throw log.booleanQueryWithoutClauses(); } - SearchPredicateFactory factory = queryContext.getScope().predicate(); - BooleanPredicateClausesStep step = factory.bool(); + SearchPredicateFactory factory = queryContext.getScope().predicate(); + BooleanPredicateClausesStep step = factory.bool(); for ( BooleanClause clause : clauses ) { SearchPredicate predicate = factory.extension( LuceneExtension.get() ) .fromLuceneQuery( clause.getQuery() ).toPredicate(); diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedAllContext.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedAllContext.java index 1f98f6fb90e..f1ee2168335 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedAllContext.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedAllContext.java @@ -38,9 +38,9 @@ public Query createQuery() { } private SearchPredicate createPredicate() { - SearchPredicateFactory factory = queryContext.getScope().predicate(); + SearchPredicateFactory factory = queryContext.getScope().predicate(); - MatchAllPredicateOptionsStep optionsStep = factory.matchAll(); + MatchAllPredicateOptionsStep optionsStep = factory.matchAll(); for ( Query query : except ) { optionsStep = optionsStep.except( factory.extension( LuceneExtension.get() ).fromLuceneQuery( query ) ); diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsMatchQueryBuilder.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsMatchQueryBuilder.java index f06b4354dca..3008e505dce 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsMatchQueryBuilder.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsMatchQueryBuilder.java @@ -27,7 +27,7 @@ public ConnectedMultiFieldsMatchQueryBuilder(QueryBuildingContext queryContext, } @Override - protected MatchPredicateOptionsStep createPredicate(SearchPredicateFactory factory, FieldContext fieldContext) { + protected MatchPredicateOptionsStep createPredicate(SearchPredicateFactory factory, FieldContext fieldContext) { MatchPredicateOptionsStep optionsStep = fieldContext.applyBoost( factory.match().field( fieldContext.getField() ) ) .matching( value, fieldContext.getValueModel() ); diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsPhraseQueryBuilder.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsPhraseQueryBuilder.java index 4601ecdce49..bb8ad9eb30c 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsPhraseQueryBuilder.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsPhraseQueryBuilder.java @@ -24,7 +24,7 @@ public ConnectedMultiFieldsPhraseQueryBuilder(QueryBuildingContext queryContext, } @Override - protected PhrasePredicateOptionsStep createPredicate(SearchPredicateFactory factory, FieldContext fieldContext) { + protected PhrasePredicateOptionsStep createPredicate(SearchPredicateFactory factory, FieldContext fieldContext) { PhrasePredicateOptionsStep optionsStep = fieldContext.applyBoost( factory.phrase().field( fieldContext.getField() ) ) .matching( phraseContext.getSentence() ); diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsRangeQueryBuilder.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsRangeQueryBuilder.java index c5d996cf905..24162a53758 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsRangeQueryBuilder.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsRangeQueryBuilder.java @@ -45,7 +45,7 @@ else if ( rangeContext.getTo() != null ) { } @Override - protected RangePredicateOptionsStep createPredicate(SearchPredicateFactory factory, FieldContext fieldContext) { + protected RangePredicateOptionsStep createPredicate(SearchPredicateFactory factory, FieldContext fieldContext) { return fieldContext.applyBoost( factory.range().field( fieldContext.getField() ) ) .within( Range.between( diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsSimpleQueryStringQueryBuilder.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsSimpleQueryStringQueryBuilder.java index f6f64322ec0..425082583d9 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsSimpleQueryStringQueryBuilder.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsSimpleQueryStringQueryBuilder.java @@ -53,10 +53,10 @@ public Query createQuery() { } private SearchPredicate createPredicate() { - SearchPredicateFactory factory = queryContext.getScope().predicate(); + SearchPredicateFactory factory = queryContext.getScope().predicate(); - SimpleQueryStringPredicateFieldStep fieldStep = factory.simpleQueryString(); - SimpleQueryStringPredicateFieldMoreStep fieldMoreStep = null; + SimpleQueryStringPredicateFieldStep fieldStep = factory.simpleQueryString(); + SimpleQueryStringPredicateFieldMoreStep fieldMoreStep = null; for ( FieldContext fieldContext : fieldsContext ) { fieldMoreStep = fieldContext.applyBoost( fieldStep.field( fieldContext.getField() ) ); } diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsWildcardQueryBuilder.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsWildcardQueryBuilder.java index 13e435d6f38..0c8c447c916 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsWildcardQueryBuilder.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsWildcardQueryBuilder.java @@ -25,7 +25,7 @@ public ConnectedMultiFieldsWildcardQueryBuilder(QueryBuildingContext queryContex } @Override - protected WildcardPredicateOptionsStep createPredicate(SearchPredicateFactory factory, FieldContext fieldContext) { + protected WildcardPredicateOptionsStep createPredicate(SearchPredicateFactory factory, FieldContext fieldContext) { return fieldContext.applyBoost( factory.wildcard().field( fieldContext.getField() ) ) .matching( value.toString() ); } diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedSpatialQueryBuilder.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedSpatialQueryBuilder.java index 06e74c0be31..7214c739608 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedSpatialQueryBuilder.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedSpatialQueryBuilder.java @@ -35,7 +35,7 @@ public Query createQuery() { } private SearchPredicate createPredicate() { - SearchPredicateFactory factory = queryContext.getScope().predicate(); + SearchPredicateFactory factory = queryContext.getScope().predicate(); SpatialWithinPredicateOptionsStep optionsStep = factory.spatial().within() .field( spatialContext.getCoordinatesField() ) diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/DiscreteFacetRequest.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/DiscreteFacetRequest.java index fd4ea55c680..77cabb7870d 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/DiscreteFacetRequest.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/DiscreteFacetRequest.java @@ -25,8 +25,8 @@ public class DiscreteFacetRequest extends FacetingRequestImpl> } @Override - public AggregationFinalStep> requestAggregation(SearchAggregationFactory factory) { - TermsAggregationOptionsStep> optionsStep = factory + public AggregationFinalStep> requestAggregation(SearchAggregationFactory factory) { + TermsAggregationOptionsStep> optionsStep = factory .terms().field( getFieldName(), Object.class ); if ( maxNumberOfFacets >= 0 ) { optionsStep = optionsStep.maxTermCount( maxNumberOfFacets ); diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/FacetingRequestImpl.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/FacetingRequestImpl.java index 3eeb410f89c..5d0be0c6a0e 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/FacetingRequestImpl.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/FacetingRequestImpl.java @@ -90,7 +90,7 @@ public void setMaxNumberOfFacets(int maxNumberOfFacets) { this.maxNumberOfFacets = maxNumberOfFacets; } - public abstract AggregationFinalStep requestAggregation(SearchAggregationFactory factory); + public abstract AggregationFinalStep requestAggregation(SearchAggregationFactory factory); public abstract List toFacets(A aggregation); diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/MinimumShouldMatchContextImpl.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/MinimumShouldMatchContextImpl.java index 25429861da6..2e7beeb1e40 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/MinimumShouldMatchContextImpl.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/MinimumShouldMatchContextImpl.java @@ -28,7 +28,7 @@ public void requirePercent(int matchingClausesPercent) { ); } - void applyMinimum(BooleanPredicateClausesStep step) { + void applyMinimum(BooleanPredicateClausesStep step) { if ( minimumShouldMatchConstraint != null ) { minimumShouldMatchConstraint.apply( step ); } @@ -50,7 +50,7 @@ private static final class MinimumShouldMatchConstraint { this.matchingClausesPercent = matchingClausesPercent; } - void apply(BooleanPredicateClausesStep step) { + void apply(BooleanPredicateClausesStep step) { if ( matchingClausesNumber != null ) { step.minimumShouldMatchNumber( matchingClausesNumber ); } diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/QueryCustomizer.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/QueryCustomizer.java index ce842463f29..2411e3c0e84 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/QueryCustomizer.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/QueryCustomizer.java @@ -55,16 +55,16 @@ public void applyScoreOptions(PredicateScoreStep step) { } } - public SearchPredicate applyFilter(SearchPredicateFactory factory, SearchPredicate predicate) { + public SearchPredicate applyFilter(SearchPredicateFactory factory, SearchPredicate predicate) { if ( filter == null ) { return predicate; } - BooleanPredicateClausesStep step = factory.bool().must( predicate ); + BooleanPredicateClausesStep step = factory.bool().must( predicate ); applyFilter( factory, step ); return step.toPredicate(); } - public void applyFilter(SearchPredicateFactory factory, BooleanPredicateOptionsCollector collector) { + public void applyFilter(SearchPredicateFactory factory, BooleanPredicateOptionsCollector collector) { if ( filter == null ) { return; } diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/RangeFacetRequest.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/RangeFacetRequest.java index 0500afe2b6d..e1147862a7a 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/RangeFacetRequest.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/RangeFacetRequest.java @@ -32,10 +32,10 @@ public class RangeFacetRequest extends FacetingRequestImpl, Long } @Override - public AggregationFinalStep, Long>> requestAggregation(SearchAggregationFactory factory) { - RangeAggregationRangeStep rangeStep = factory + public AggregationFinalStep, Long>> requestAggregation(SearchAggregationFactory factory) { + RangeAggregationRangeStep rangeStep = factory .range().field( getFieldName(), getFacetValueType() ); - RangeAggregationRangeMoreStep rangeMoreStep = null; + RangeAggregationRangeMoreStep rangeMoreStep = null; for ( FacetRange facetRange : facetRangeList ) { rangeMoreStep = rangeStep.range( facetRange.range() ); rangeStep = rangeMoreStep; diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/sort/impl/SortFieldStates.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/sort/impl/SortFieldStates.java index de96eb6958a..9bada435ca0 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/sort/impl/SortFieldStates.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/sort/impl/SortFieldStates.java @@ -36,8 +36,8 @@ public class SortFieldStates { private static final Object MISSING_VALUE_LAST = new Object(); private static final Object MISSING_VALUE_FIRST = new Object(); - private final SearchSortFactory factory; - private final CompositeSortComponentsStep delegate; + private final SearchSortFactory factory; + private final CompositeSortComponentsStep delegate; private Type currentType; private String currentName; @@ -92,7 +92,7 @@ public void closeSortField() { .fromLuceneSortField( currentSortFieldNativeSortDescription ).toSort(); } else if ( currentType == Type.SCORE ) { - ScoreSortOptionsStep optionsStep = factory.score(); + ScoreSortOptionsStep optionsStep = factory.score(); applyOrder( optionsStep ); sort = optionsStep.toSort(); } @@ -110,12 +110,12 @@ else if ( coordinates != null || currentLatitude != null ) { else { center = GeoPoint.of( currentLatitude, currentLongitude ); } - DistanceSortOptionsStep optionsStep = factory.distance( currentName, center ); + DistanceSortOptionsStep optionsStep = factory.distance( currentName, center ); applyOrder( optionsStep ); sort = optionsStep.toSort(); } else { - FieldSortOptionsStep optionsStep = factory.field( currentName ); + FieldSortOptionsStep optionsStep = factory.field( currentName ); applyOrder( optionsStep ); applyMissing( optionsStep ); sort = optionsStep.toSort(); @@ -130,7 +130,7 @@ private void applyOrder(SortOrderStep step) { } } - private void applyMissing(FieldSortOptionsStep step) { + private void applyMissing(FieldSortOptionsStep step) { if ( currentMissingValue == null ) { return; } diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/impl/FacetManagerImpl.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/impl/FacetManagerImpl.java index 12d2d7dd432..ad7d3d6aa9e 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/impl/FacetManagerImpl.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/impl/FacetManagerImpl.java @@ -78,7 +78,8 @@ public List getFacets(String facetingName) { return facets; } - SearchQueryOptionsStep contributeAggregations(SearchQueryOptionsStep optionsStep) { + SearchQueryOptionsStep contributeAggregations( + SearchQueryOptionsStep optionsStep) { if ( !hasFacets() ) { return optionsStep; } @@ -103,8 +104,8 @@ private boolean hasFacets() { return facetRequests != null && !facetRequests.isEmpty(); } - private SearchQueryOptionsStep requestAggregation( - SearchQueryOptionsStep optionsStep, + private SearchQueryOptionsStep requestAggregation( + SearchQueryOptionsStep optionsStep, FacetingRequestImpl facetRequest) { return optionsStep.aggregation( facetRequest.getKey(), facetRequest::requestAggregation ); } diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/impl/HSQueryImpl.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/impl/HSQueryImpl.java index bd3680af0e7..b370a6ce67b 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/impl/HSQueryImpl.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/impl/HSQueryImpl.java @@ -225,7 +225,7 @@ private SearchQuery createSearchQuery() { if ( sort == null ) { sort = scope.sort().score().toSort(); } - SearchQueryOptionsStep optionsStep = session.search( scope ) + SearchQueryOptionsStep optionsStep = session.search( scope ) .select( projection ) .where( predicate ) .sort( sort ); @@ -247,7 +247,7 @@ private SearchQuery createSearchQuery() { } private SearchProjection createCompositeProjection() { - SearchProjectionFactory factory = scope.projection(); + SearchProjectionFactory factory = scope.projection(); if ( projectedFields == null || projectedFields.length == 0 ) { // No tuple, so we ignore the tupleTransformer (Search 5 behavior) @@ -271,7 +271,7 @@ private SearchProjection createCompositeProjection() { } private SearchProjection createProjection(String field) { - SearchProjectionFactory factory = scope.projection(); + SearchProjectionFactory factory = scope.projection(); if ( field == null ) { // Hack to return null when a null field name is requested, // which is what Search 5 used to do... diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/spi/V5MigrationSearchSession.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/spi/V5MigrationSearchSession.java index 9d0786fd272..3129f386468 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/spi/V5MigrationSearchSession.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/engine/spi/V5MigrationSearchSession.java @@ -17,6 +17,6 @@ @Deprecated public interface V5MigrationSearchSession { - SearchQuerySelectStep search(V5MigrationSearchScope scope); + SearchQuerySelectStep search(V5MigrationSearchScope scope); } diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/scope/spi/V5MigrationSearchScope.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/scope/spi/V5MigrationSearchScope.java index 1d5154bf3b9..21eb23a2413 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/scope/spi/V5MigrationSearchScope.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/scope/spi/V5MigrationSearchScope.java @@ -23,16 +23,16 @@ public interface V5MigrationSearchScope { Set indexManagers(); - SearchPredicateFactory predicate(); + SearchPredicateFactory predicate(); - SearchSortFactory sort(); + SearchSortFactory sort(); - SearchProjectionFactory projection(); + SearchProjectionFactory projection(); SearchProjection idProjection(); SearchProjection> objectClassProjection(); - SearchAggregationFactory aggregation(); + SearchAggregationFactory aggregation(); } diff --git a/v5migrationhelper/orm/src/main/java/org/hibernate/search/impl/FullTextSessionImpl.java b/v5migrationhelper/orm/src/main/java/org/hibernate/search/impl/FullTextSessionImpl.java index 4380e090c69..d4433863345 100644 --- a/v5migrationhelper/orm/src/main/java/org/hibernate/search/impl/FullTextSessionImpl.java +++ b/v5migrationhelper/orm/src/main/java/org/hibernate/search/impl/FullTextSessionImpl.java @@ -148,7 +148,7 @@ else if ( type.equals( FullTextSession.class ) ) { } @Override - public SearchQuerySelectStep search(V5MigrationSearchScope scope) { + public SearchQuerySelectStep search(V5MigrationSearchScope scope) { SearchSession searchSession = searchSession(); return searchSession.search( ( (V5MigrationOrmSearchScopeAdapter) scope ).toSearchScope() ); } diff --git a/v5migrationhelper/orm/src/main/java/org/hibernate/search/scope/impl/V5MigrationOrmSearchScopeAdapter.java b/v5migrationhelper/orm/src/main/java/org/hibernate/search/scope/impl/V5MigrationOrmSearchScopeAdapter.java index bd46ff4b5e3..ebde28d1a89 100644 --- a/v5migrationhelper/orm/src/main/java/org/hibernate/search/scope/impl/V5MigrationOrmSearchScopeAdapter.java +++ b/v5migrationhelper/orm/src/main/java/org/hibernate/search/scope/impl/V5MigrationOrmSearchScopeAdapter.java @@ -20,9 +20,9 @@ public class V5MigrationOrmSearchScopeAdapter implements V5MigrationSearchScope { - private final SearchScope delegate; + private final SearchScope delegate; - public V5MigrationOrmSearchScopeAdapter(SearchScope delegate) { + public V5MigrationOrmSearchScopeAdapter(SearchScope delegate) { this.delegate = delegate; } @@ -37,23 +37,23 @@ public Set indexManagers() { } @Override - public SearchPredicateFactory predicate() { + public SearchPredicateFactory predicate() { return delegate.predicate(); } @Override - public SearchSortFactory sort() { + public SearchSortFactory sort() { return delegate.sort(); } @Override - public SearchProjectionFactory projection() { + public SearchProjectionFactory projection() { return delegate.projection(); } @Override public SearchProjection idProjection() { - SearchProjectionFactory factory = delegate.projection(); + SearchProjectionFactory factory = delegate.projection(); // Not using factory.id() because that one throws an exception if IDs have inconsistent types. return factory.composite().from( factory.entityReference() ) .as( EntityReference::id ).toProjection(); @@ -61,17 +61,17 @@ public SearchProjection idProjection() { @Override public SearchProjection> objectClassProjection() { - SearchProjectionFactory factory = delegate.projection(); + SearchProjectionFactory factory = delegate.projection(); return factory.composite().from( factory.entityReference() ) .as( EntityReference::type ).toProjection(); } @Override - public SearchAggregationFactory aggregation() { + public SearchAggregationFactory aggregation() { return delegate.aggregation(); } - public SearchScope toSearchScope() { + public SearchScope toSearchScope() { return delegate; } } From 2ce90590d5b1858f832f99129197b1fa7d6a760e Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 9 May 2024 17:48:57 +0200 Subject: [PATCH 04/25] HSEARCH-3319 Add references to the DSL --- ...mmonQueryStringPredicateFieldMoreStep.java | 55 +++- .../CommonQueryStringPredicateFieldStep.java | 58 +++- .../dsl/ExistsPredicateFieldStep.java | 16 +- .../predicate/dsl/KnnPredicateFieldStep.java | 4 + .../dsl/KnnPredicateVectorGenericStep.java | 17 + .../MatchPredicateFieldMoreGenericStep.java | 54 ++++ .../dsl/MatchPredicateFieldMoreStep.java | 32 +- .../dsl/MatchPredicateFieldStep.java | 43 ++- .../MatchPredicateMatchingGenericStep.java | 24 ++ .../dsl/MatchPredicateMatchingStep.java | 5 +- .../dsl/NestedPredicateFieldStep.java | 14 + .../dsl/PhrasePredicateFieldMoreStep.java | 51 ++- .../dsl/PhrasePredicateFieldStep.java | 56 +++- .../dsl/PrefixPredicateFieldMoreStep.java | 52 ++- .../dsl/PrefixPredicateFieldStep.java | 52 ++- .../QueryStringPredicateFieldMoreStep.java | 8 +- .../dsl/QueryStringPredicateFieldStep.java | 6 +- .../RangePredicateFieldMoreGenericStep.java | 58 ++++ .../dsl/RangePredicateFieldMoreStep.java | 8 +- .../dsl/RangePredicateFieldStep.java | 45 ++- .../RangePredicateMatchingGenericStep.java | 158 +++++++++ .../dsl/RangePredicateMatchingStep.java | 3 +- .../dsl/RegexpPredicateFieldMoreStep.java | 53 ++- .../dsl/RegexpPredicateFieldStep.java | 52 ++- .../predicate/dsl/SearchPredicateFactory.java | 37 ++- ...mpleQueryStringPredicateFieldMoreStep.java | 8 +- .../SimpleQueryStringPredicateFieldStep.java | 8 +- .../dsl/TermsPredicateFieldMoreStep.java | 51 ++- .../dsl/TermsPredicateFieldStep.java | 50 ++- .../dsl/WildcardPredicateFieldMoreStep.java | 52 ++- .../dsl/WildcardPredicateFieldStep.java | 51 ++- .../AbstractMatchPredicateFieldMoreStep.java | 306 ++++++++++++++++++ .../AbstractRangePredicateFieldMoreStep.java | 286 ++++++++++++++++ .../impl/ExistsPredicateFieldStepImpl.java | 4 +- .../dsl/impl/KnnPredicateFieldStepImpl.java | 27 +- .../impl/MatchPredicateFieldMoreStepImpl.java | 165 ---------- .../dsl/impl/MatchPredicateFieldStepImpl.java | 19 +- .../PhrasePredicateFieldMoreStepImpl.java | 36 +-- .../impl/PhrasePredicateFieldStepImpl.java | 11 +- .../PrefixPredicateFieldMoreStepImpl.java | 24 +- .../impl/PrefixPredicateFieldStepImpl.java | 12 +- ...QueryStringPredicateFieldMoreStepImpl.java | 10 +- .../QueryStringPredicateFieldStepImpl.java | 8 +- .../impl/RangePredicateFieldMoreStepImpl.java | 136 -------- .../dsl/impl/RangePredicateFieldStepImpl.java | 24 +- .../RegexpPredicateFieldMoreStepImpl.java | 28 +- .../impl/RegexpPredicateFieldStepImpl.java | 12 +- ...QueryStringPredicateFieldMoreStepImpl.java | 11 +- ...mpleQueryStringPredicateFieldStepImpl.java | 8 +- .../impl/TermsPredicateFieldMoreStepImpl.java | 26 +- .../dsl/impl/TermsPredicateFieldStepImpl.java | 11 +- .../WildcardPredicateFieldMoreStepImpl.java | 24 +- .../impl/WildcardPredicateFieldStepImpl.java | 12 +- .../spi/AbstractSearchPredicateFactory.java | 60 ++-- .../dsl/ExtendedSearchProjectionFactory.java | 7 + .../dsl/SearchProjectionFactory.java | 76 +++++ .../PrefixPredicateFieldReference.java | 2 +- .../RegexpPredicateFieldReference.java | 2 +- .../TermsPredicateFieldReference.java | 2 +- .../WildcardPredicateFieldReference.java | 2 +- .../sort/dsl/ExtendedSearchSortFactory.java | 18 ++ ...ldSortMissingValueBehaviorGenericStep.java | 68 ++++ .../FieldSortMissingValueBehaviorStep.java | 42 +-- .../sort/dsl/FieldSortOptionsGenericStep.java | 36 +++ .../search/sort/dsl/FieldSortOptionsStep.java | 10 +- .../search/sort/dsl/SearchSortFactory.java | 66 ++++ .../impl/FieldSortOptionsGenericStepImpl.java | 112 +++++++ .../dsl/spi/AbstractSearchSortFactory.java | 9 + .../MetricTemporalFieldsAggregationsIT.java | 6 +- ...bstractBaseQueryStringPredicateBaseIT.java | 42 +-- ...ctBaseQueryStringPredicateSpecificsIT.java | 2 +- .../predicate/QueryStringPredicateBaseIT.java | 4 +- .../QueryStringPredicateSpecificsIT.java | 5 +- .../SimpleQueryStringPredicateBaseIT.java | 5 +- ...SimpleQueryStringPredicateSpecificsIT.java | 4 +- ...rojectionMultiValuedAccumulatorBaseIT.java | 8 +- .../ObjectProjectionSpecificsIT.java | 2 +- .../MetricAggregationsTestCase.java | 2 +- ...tiFieldsSimpleQueryStringQueryBuilder.java | 4 +- 79 files changed, 2343 insertions(+), 634 deletions(-) create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateVectorGenericStep.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldMoreGenericStep.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateMatchingGenericStep.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldMoreGenericStep.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateMatchingGenericStep.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractMatchPredicateFieldMoreStep.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractRangePredicateFieldMoreStep.java delete mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldMoreStepImpl.java delete mode 100644 engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldMoreStepImpl.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortMissingValueBehaviorGenericStep.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsGenericStep.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldMoreStep.java index 6e73e55b8ef..b00f8c1bbfc 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldMoreStep.java @@ -4,18 +4,25 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.TypedPredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The step in a query string predicate definition, where the query string to match can be set * (see the superinterface {@link CommonQueryStringPredicateMatchingStep}), * or optional parameters for the last targeted field(s) can be set, * or more target fields can be added. * + * @param Scope root type. + * @param Type of the field references. * @param The "self" type (the actual exposed type of this step). * @param The type of the next step. */ public interface CommonQueryStringPredicateFieldMoreStep< - S extends CommonQueryStringPredicateFieldMoreStep, - N extends CommonQueryStringPredicateOptionsStep> + SR, + S extends CommonQueryStringPredicateFieldMoreStep, + N extends CommonQueryStringPredicateOptionsStep, + FR extends TypedPredicateFieldReference> extends CommonQueryStringPredicateMatchingStep, MultiFieldPredicateFieldBoostStep { /** @@ -52,4 +59,48 @@ default S field(String fieldPath) { */ S fields(String... fieldPaths); + /** + * Target the given field in the query string predicate, + * as an alternative to the already-targeted fields. + *

+ * Only text fields are supported. + *

+ * See {@link CommonQueryStringPredicateFieldStep#field(String)} for more information on targeted fields. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + * + * @see CommonQueryStringPredicateFieldStep#field(String) + */ + @Incubating + @SuppressWarnings("unchecked") + default S field(FR field) { + return fields( field ); + } + + /** + * Target the given fields in the query string predicate, + * as an alternative to the already-targeted fields. + *

+ * Only text fields are supported. + *

+ * See {@link CommonQueryStringPredicateFieldStep#fields(String...)} for more information on targeted fields. + * + * @param fields The field reference representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see CommonQueryStringPredicateFieldStep#fields(String...) + */ + @Incubating + @SuppressWarnings("unchecked") + default S fields(FR... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldStep.java index 52fd912eb7d..d9c5e5e4892 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldStep.java @@ -4,12 +4,20 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.TypedPredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The initial step in a query string predicate definition, where the target field can be set. * + * @param Scope root type. + * @param Type of the field references. * @param The type of the next step. */ -public interface CommonQueryStringPredicateFieldStep> { +public interface CommonQueryStringPredicateFieldStep< + SR, + N extends CommonQueryStringPredicateFieldMoreStep, + FR extends TypedPredicateFieldReference> { /** * Target the given field in the query string predicate. @@ -49,4 +57,52 @@ default N field(String fieldPath) { */ N fields(String... fieldPaths); + + /** + * Target the given field in the query string predicate. + *

+ * Only text fields are supported. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + @Incubating + @SuppressWarnings("unchecked") + default N field(FR field) { + return fields( field ); + } + + /** + * Target the given fields in the query string predicate. + *

+ * Only text fields are supported. + *

+ * Equivalent to {@link #field(String)} followed by multiple calls to + * {@link #field(String)}, + * the only difference being that calls to {@link CommonQueryStringPredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fields The field reference representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(String) + */ + @Incubating + @SuppressWarnings("unchecked") + default N fields(FR... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java index 69c17053f55..5ede5750b5a 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java @@ -4,13 +4,15 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; /** * The initial step in an "exists" predicate definition, where the target field can be set. * * @param The type of the next step. */ -public interface ExistsPredicateFieldStep> { +public interface ExistsPredicateFieldStep> { /** * Target the given field in the "exists" predicate. @@ -21,4 +23,16 @@ public interface ExistsPredicateFieldSteppath to the index field + * to apply the predicate on. + * @return The next step. + */ + @Incubating + default N field(ExistsPredicateFieldReference field) { + return field( field.absolutePath() ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java index 29fbdef261d..b27e930d077 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java @@ -4,6 +4,8 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.KnnPredicateFieldReference; + /** * The initial step in a "knn" predicate definition, where the target field can be set. * @param Scope root type. @@ -17,4 +19,6 @@ public interface KnnPredicateFieldStep { * @return The next step in the knn predicate DSL. */ KnnPredicateVectorStep field(String fieldPath); + + KnnPredicateVectorGenericStep field(KnnPredicateFieldReference field); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateVectorGenericStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateVectorGenericStep.java new file mode 100644 index 00000000000..812ab0720ea --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateVectorGenericStep.java @@ -0,0 +1,17 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.predicate.dsl; + +/** + * The step in a "knn" predicate definition where the vector to match is defined. + */ +public interface KnnPredicateVectorGenericStep { + /** + * @param vector The vector from which to compute the distance to vectors in the indexed field. + * @return The next step in the knn predicate DSL. + */ + KnnPredicateOptionsStep matching(T vector); + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldMoreGenericStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldMoreGenericStep.java new file mode 100644 index 00000000000..a9eb4cba625 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldMoreGenericStep.java @@ -0,0 +1,54 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.predicate.dsl; + +/** + * The step in a "match" predicate definition where the value to match can be set + * (see the superinterface {@link MatchPredicateMatchingStep}), + * or optional parameters for the last targeted field(s) can be set, + * or more target fields can be added. + * + * @param The "self" type (the actual exposed type of this step). + * @param The type of the next step. + * @param The type of the match value. + * @param The type representing the fields. + */ +public interface MatchPredicateFieldMoreGenericStep< + S extends MatchPredicateFieldMoreGenericStep, + N extends MatchPredicateOptionsStep, + T, + V> + extends MatchPredicateMatchingGenericStep, MultiFieldPredicateFieldBoostStep { + + /** + * Target the given field in the match predicate, + * as an alternative to the already-targeted fields. + *

+ * See {@link MatchPredicateFieldStep#field(String)} for more information about targeting fields. + * + * @param field The field with a path to the index field + * to apply the predicate on. + * @return The next step. + * + * @see MatchPredicateFieldStep#field(String) + */ + S field(V field); + + /** + * Target the given fields in the match predicate, + * as an alternative to the already-targeted fields. + *

+ * See {@link MatchPredicateFieldStep#fields(String...)} for more information about targeting fields. + * + * @param fieldPaths The fields with paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see MatchPredicateFieldStep#fields(String...) + */ + @SuppressWarnings("unchecked") + S fields(V... fieldPaths); + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldMoreStep.java index 5cb30f8cf02..2a39bc8efdc 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldMoreStep.java @@ -16,36 +16,6 @@ public interface MatchPredicateFieldMoreStep< S extends MatchPredicateFieldMoreStep, N extends MatchPredicateOptionsStep> - extends MatchPredicateMatchingStep, MultiFieldPredicateFieldBoostStep { - - /** - * Target the given field in the match predicate, - * as an alternative to the already-targeted fields. - *

- * See {@link MatchPredicateFieldStep#field(String)} for more information about targeting fields. - * - * @param fieldPath The path to the index field - * to apply the predicate on. - * @return The next step. - * - * @see MatchPredicateFieldStep#field(String) - */ - default S field(String fieldPath) { - return fields( fieldPath ); - } - - /** - * Target the given fields in the match predicate, - * as an alternative to the already-targeted fields. - *

- * See {@link MatchPredicateFieldStep#fields(String...)} for more information about targeting fields. - * - * @param fieldPaths The paths to the index fields - * to apply the predicate on. - * @return The next step. - * - * @see MatchPredicateFieldStep#fields(String...) - */ - S fields(String... fieldPaths); + extends MatchPredicateMatchingStep, MatchPredicateFieldMoreGenericStep { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java index 850b39660f0..8639df440ab 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java @@ -4,11 +4,12 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference; /** * The initial step in a "match" predicate definition, where the target field can be set. */ -public interface MatchPredicateFieldStep> { +public interface MatchPredicateFieldStep> { /** * Target the given field in the match predicate. @@ -31,7 +32,7 @@ default N field(String fieldPath) { * Target the given fields in the match predicate. *

* Equivalent to {@link #field(String)} followed by multiple calls to - * {@link MatchPredicateFieldMoreStep#field(String)}, + * {@link MatchPredicateFieldMoreStep#field(Object)}, * the only difference being that calls to {@link MatchPredicateFieldMoreStep#boost(float)} * and other field-specific settings on the returned step will only need to be done once * and will apply to all the fields passed to this method. @@ -43,4 +44,42 @@ default N field(String fieldPath) { * @see #field(String) */ N fields(String... fieldPaths); + + /** + * Target the given field in the match predicate. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param fieldReference The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + @SuppressWarnings("unchecked") + default MatchPredicateFieldMoreGenericStep> field( + MatchPredicateFieldReference fieldReference) { + return fields( fieldReference ); + } + + /** + * Target the given fields in the match predicate. + *

+ * Equivalent to {@link #field(String)} followed by multiple calls to + * {@link MatchPredicateFieldMoreStep#field(Object)}, + * the only difference being that calls to {@link MatchPredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fieldReferences The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(MatchPredicateFieldReference) + */ + @SuppressWarnings("unchecked") + MatchPredicateFieldMoreGenericStep> fields( + MatchPredicateFieldReference... fieldReferences); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateMatchingGenericStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateMatchingGenericStep.java new file mode 100644 index 00000000000..85fd9369099 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateMatchingGenericStep.java @@ -0,0 +1,24 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.predicate.dsl; + +/** + * The step in a "match" predicate definition where the value to match can be set. + * + * @param The type of the next step. + * @param The type of the match value. + */ +public interface MatchPredicateMatchingGenericStep, T> { + + /** + * Require at least one of the targeted fields to match the given value. + * + * @param value The value to match. + * The signature of this method defines this parameter as an {@code T}, + * but a specific type is expected depending on the targeted field. + * @return The next step. + */ + N matching(T value); +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateMatchingStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateMatchingStep.java index a3adb3d19b1..d95fee848d2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateMatchingStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateMatchingStep.java @@ -11,7 +11,8 @@ * * @param The type of the next step. */ -public interface MatchPredicateMatchingStep> { +public interface MatchPredicateMatchingStep> + extends MatchPredicateMatchingGenericStep { /** * Require at least one of the targeted fields to match the given value. @@ -20,7 +21,7 @@ public interface MatchPredicateMatchingStep + * The selected field must have a {@link ObjectStructure#NESTED nested structure} in the targeted indexes. + * + * @param field The field reference representing a path to the object field + * to apply the predicate on. + * @return The next step. + */ + default N objectField(NestedPredicateFieldReference field) { + return objectField( field.absolutePath() ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java index 2900ec671e6..cade7bc50eb 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java @@ -4,17 +4,22 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The step in a "phrase" predicate definition where the phrase to match can be set * (see the superinterface {@link PhrasePredicateMatchingStep}), * or optional parameters for the last targeted field(s) can be set, * or more target fields can be added. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of the next step. */ public interface PhrasePredicateFieldMoreStep< - S extends PhrasePredicateFieldMoreStep, + SR, + S extends PhrasePredicateFieldMoreStep, N extends PhrasePredicateOptionsStep> extends PhrasePredicateMatchingStep, MultiFieldPredicateFieldBoostStep { @@ -52,4 +57,48 @@ default S field(String fieldPath) { */ S fields(String... fieldPaths); + /** + * Target the given field in the phrase predicate, + * as an alternative to the already-targeted fields. + *

+ * Only text fields are supported. + *

+ * See {@link PhrasePredicateFieldStep#field(PhrasePredicateFieldReference)} for more information on targeted fields. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + * + * @see PhrasePredicateFieldStep#field(PhrasePredicateFieldReference) + */ + @Incubating + @SuppressWarnings("unchecked") + default S field(PhrasePredicateFieldReference field) { + return fields( field ); + } + + /** + * Target the given fields in the phrase predicate, + * as an alternative to the already-targeted fields. + *

+ * Only text fields are supported. + *

+ * See {@link PhrasePredicateFieldStep#fields(PhrasePredicateFieldReference...)} for more information on targeted fields. + * + * @param fields The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see PhrasePredicateFieldStep#fields(PhrasePredicateFieldReference...) + */ + @Incubating + @SuppressWarnings("unchecked") + default S fields(PhrasePredicateFieldReference... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java index 41570281a00..db7a8dd5507 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java @@ -4,12 +4,16 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The initial step in a "phrase" predicate definition, where the target field can be set. * + * @param Scope root type. * @param The type of the next step. */ -public interface PhrasePredicateFieldStep> { +public interface PhrasePredicateFieldStep> { /** * Target the given field in the phrase predicate. @@ -49,4 +53,54 @@ default N field(String fieldPath) { */ N fields(String... fieldPaths); + /** + * Target the given field in the phrase predicate. + *

+ * Only text fields are supported. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + * + * @see PhrasePredicateFieldStep#field(PhrasePredicateFieldReference) + */ + @Incubating + @SuppressWarnings("unchecked") + default N field(PhrasePredicateFieldReference field) { + return fields( field ); + } + + /** + * Target the given fields in the phrase predicate. + *

+ * Only text fields are supported. + *

+ * Equivalent to {@link #field(PhrasePredicateFieldReference)} followed by multiple calls to + * {@link PhrasePredicateFieldMoreStep#field(PhrasePredicateFieldReference)}, + * the only difference being that calls to {@link PhrasePredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fields The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see PhrasePredicateFieldStep#fields(PhrasePredicateFieldReference...) + */ + @Incubating + @SuppressWarnings("unchecked") + default N fields(PhrasePredicateFieldReference... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldMoreStep.java index 4a202649111..61b768afea0 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldMoreStep.java @@ -4,6 +4,9 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The step in a "prefix" predicate definition where the pattern to match can be set * (see the superinterface {@link PrefixPredicateMatchingStep}), @@ -14,7 +17,8 @@ * @param The type of the next step. */ public interface PrefixPredicateFieldMoreStep< - S extends PrefixPredicateFieldMoreStep, + SR, + S extends PrefixPredicateFieldMoreStep, N extends PrefixPredicateOptionsStep> extends PrefixPredicateMatchingStep, MultiFieldPredicateFieldBoostStep { @@ -52,4 +56,50 @@ default S field(String fieldPath) { */ S fields(String... fieldPaths); + /** + * Target the given field in the prefix predicate. + *

+ * Only text fields are supported. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + @Incubating + default S field(PrefixPredicateFieldReference field) { + return fields( field.absolutePath() ); + } + + /** + * Target the given fields in the prefix predicate. + *

+ * Only text fields are supported. + *

+ * Equivalent to {@link #field(String)} followed by multiple calls to + * {@link PrefixPredicateFieldMoreStep#field(String)}, + * the only difference being that calls to {@link PrefixPredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fields The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(String) + */ + @Incubating + @SuppressWarnings("unchecked") + default S fields(PrefixPredicateFieldReference... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldStep.java index 46117c8e1e8..51ebb51618e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldStep.java @@ -4,12 +4,15 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The initial step in a "prefix" predicate definition, where the target field can be set. * * @param The type of the next step. */ -public interface PrefixPredicateFieldStep> { +public interface PrefixPredicateFieldStep> { /** * Target the given field in the prefix predicate. @@ -49,4 +52,51 @@ default N field(String fieldPath) { */ N fields(String... fieldPaths); + /** + * Target the given field in the prefix predicate. + *

+ * Only text fields are supported. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + @Incubating + default N field(PrefixPredicateFieldReference field) { + return fields( field.absolutePath() ); + } + + /** + * Target the given fields in the prefix predicate. + *

+ * Only text fields are supported. + *

+ * Equivalent to {@link #field(String)} followed by multiple calls to + * {@link PrefixPredicateFieldMoreStep#field(String)}, + * the only difference being that calls to {@link PrefixPredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fields The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(String) + */ + @Incubating + @SuppressWarnings("unchecked") + default N fields(PrefixPredicateFieldReference... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/QueryStringPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/QueryStringPredicateFieldMoreStep.java index 7f367799cde..7fae417fd8a 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/QueryStringPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/QueryStringPredicateFieldMoreStep.java @@ -4,18 +4,22 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference; + /** * The step in a "query string" predicate definition where the query string to match can be set * (see the superinterface {@link QueryStringPredicateMatchingStep}), * or optional parameters for the last targeted field(s) can be set, * or more target fields can be added. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of the next step. */ public interface QueryStringPredicateFieldMoreStep< - S extends QueryStringPredicateFieldMoreStep, + SR, + S extends QueryStringPredicateFieldMoreStep, N extends QueryStringPredicateOptionsStep> - extends CommonQueryStringPredicateFieldMoreStep { + extends CommonQueryStringPredicateFieldMoreStep> { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/QueryStringPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/QueryStringPredicateFieldStep.java index 1a8c2c33bf5..77ef68d7b41 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/QueryStringPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/QueryStringPredicateFieldStep.java @@ -4,12 +4,14 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference; + /** * The initial step in a "query string" predicate definition, where the target field can be set. * * @param The type of the next step. */ -public interface QueryStringPredicateFieldStep> - extends CommonQueryStringPredicateFieldStep { +public interface QueryStringPredicateFieldStep> + extends CommonQueryStringPredicateFieldStep> { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldMoreGenericStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldMoreGenericStep.java new file mode 100644 index 00000000000..c111f1f7427 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldMoreGenericStep.java @@ -0,0 +1,58 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.predicate.dsl; + +import org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference; + +/** + * The step in a "range" predicate definition where the limits of the range to match can be set + * (see the superinterface {@link RangePredicateMatchingStep}), + * or optional parameters for the last targeted field(s) can be set, + * or more target fields can be added. + * + * @param Scope root type. + * @param The "self" type (the actual exposed type of this step). + * @param The type of the next step. + * @param The type representing the fields. + * @param The type of the boundary values. + */ +public interface RangePredicateFieldMoreGenericStep< + SR, + S extends RangePredicateFieldMoreGenericStep, + N extends RangePredicateOptionsStep, + V, + T> + extends RangePredicateMatchingGenericStep, MultiFieldPredicateFieldBoostStep { + + /** + * Target the given field in the range predicate, + * as an alternative to the already-targeted fields. + *

+ * See {@link RangePredicateFieldStep#field(RangePredicateFieldReference)} for more information about targeting fields. + * + * @param field The field with a path to the index field + * to apply the predicate on. + * @return The next step. + * + * @see RangePredicateFieldStep#field(RangePredicateFieldReference) + */ + S field(V field); + + /** + * Target the given fields in the range predicate, + * as an alternative to the already-targeted fields. + *

+ * See {@link RangePredicateFieldStep#fields(RangePredicateFieldReference...)} for more information about targeting fields. + * + * @param fields The fields with paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see RangePredicateFieldStep#fields(RangePredicateFieldReference...) + */ + @SuppressWarnings("unchecked") + S fields(V... fields); + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldMoreStep.java index 79ec56a578b..ae031f65861 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldMoreStep.java @@ -10,13 +10,16 @@ * or optional parameters for the last targeted field(s) can be set, * or more target fields can be added. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of the next step. */ public interface RangePredicateFieldMoreStep< - S extends RangePredicateFieldMoreStep, + SR, + S extends RangePredicateFieldMoreStep, N extends RangePredicateOptionsStep> - extends RangePredicateMatchingStep, MultiFieldPredicateFieldBoostStep { + extends RangePredicateFieldMoreGenericStep, + RangePredicateMatchingStep { /** * Target the given field in the range predicate, @@ -47,5 +50,4 @@ default S field(String fieldPath) { * @see RangePredicateFieldStep#fields(String...) */ S fields(String... fieldPaths); - } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java index 172db4486a6..cadc68e99da 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java @@ -4,13 +4,17 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference; /** * The initial step in a "range" predicate definition, where the target field can be set. * + * @param Scope root type. * @param The type of the next step. */ -public interface RangePredicateFieldStep> { +public interface RangePredicateFieldStep< + SR, + N extends RangePredicateFieldMoreStep> { /** * Target the given field in the range predicate. @@ -45,4 +49,43 @@ default N field(String fieldPath) { * @see #field(String) */ N fields(String... fieldPaths); + + /** + * Target the given field in the range predicate. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + @SuppressWarnings("unchecked") + default RangePredicateFieldMoreGenericStep, T> field( + RangePredicateFieldReference field) { + return fields( field ); + } + + /** + * Target the given fields in the range predicate. + *

+ * Equivalent to {@link #field(RangePredicateFieldReference)} followed by multiple calls to + * {@link RangePredicateFieldMoreGenericStep#field(Object)}, + * the only difference being that calls to {@link RangePredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fields The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(RangePredicateFieldReference) + */ + @SuppressWarnings("unchecked") + RangePredicateFieldMoreGenericStep, T> fields( + RangePredicateFieldReference... fields); + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateMatchingGenericStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateMatchingGenericStep.java new file mode 100644 index 00000000000..0871b937f26 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateMatchingGenericStep.java @@ -0,0 +1,158 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.predicate.dsl; + +import java.util.Arrays; +import java.util.Collection; + +import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.util.common.data.Range; +import org.hibernate.search.util.common.data.RangeBoundInclusion; + +/** + * The step in a "range" predicate definition where the range to match can be set. + * + * @param The type of the next step. + * @param The type of the boundary values. + */ +public interface RangePredicateMatchingGenericStep> { + + /** + * Require at least one of the targeted fields to be in the range + * defined by the given bounds. + * + * @param lowerBound The lower bound of the range. {@code null} means {@code -Infinity} (no lower bound). + * The signature of this method defines this parameter as an {@link Object}, + * but a specific type is expected depending on the targeted field. + * @param upperBound The upper bound of the range. {@code null} means {@code +Infinity} (no upper bound). + * The signature of this method defines this parameter as an {@link Object}, + * but a specific type is expected depending on the targeted field. + * @return The next step. + */ + default N between(T lowerBound, T upperBound) { + return within( Range.between( lowerBound, upperBound ) ); + } + + /** + * Require at least one of the targeted fields to be in the range + * defined by the given bounds. + * + * @param lowerBound The lower bound of the range. {@code null} means {@code -Infinity} (no lower bound). + * The signature of this method defines this parameter as an {@link Object}, + * but a specific type is expected depending on the targeted field. + * @param lowerBoundInclusion Whether the lower bound is included in the range or excluded. + * @param upperBound The upper bound of the range. {@code null} means {@code +Infinity} (no upper bound). + * The signature of this method defines this parameter as an {@link Object}, + * but a specific type is expected depending on the targeted field. + * @param upperBoundInclusion Whether the upper bound is included in the range or excluded. + * @return The next step. + */ + default N between(T lowerBound, RangeBoundInclusion lowerBoundInclusion, + T upperBound, RangeBoundInclusion upperBoundInclusion) { + return within( Range.between( lowerBound, lowerBoundInclusion, upperBound, upperBoundInclusion ) ); + } + + /** + * Require at least one of the targeted fields to be "greater than or equal to" the given value, + * with no limit as to how high it can be. + * + * @param lowerBoundValue The lower bound of the range, included. Must not be null. + * The signature of this method defines this parameter as an {@link Object}, + * but a specific type is expected depending on the targeted field. + * @return The next step. + */ + default N atLeast(T lowerBoundValue) { + return within( Range.atLeast( lowerBoundValue ) ); + } + + /** + * Require at least one of the targeted fields to be "strictly greater than" the given value, + * with no limit as to how high it can be. + * + * @param lowerBoundValue The lower bound of the range, excluded. Must not be null. + * The signature of this method defines this parameter as an {@link Object}, + * but a specific type is expected depending on the targeted field. + * @return The next step. + */ + default N greaterThan(T lowerBoundValue) { + return within( Range.greaterThan( lowerBoundValue ) ); + } + + /** + * Require at least one of the targeted fields to be "lesser than or equal to" the given value, + * with no limit as to how low it can be. + * + * @param upperBoundValue The upper bound of the range, included. Must not be null. + * The signature of this method defines this parameter as an {@link Object}, + * but a specific type is expected depending on the targeted field. + * @return The next step. + */ + default N atMost(T upperBoundValue) { + return within( Range.atMost( upperBoundValue ) ); + } + + /** + * Require at least one of the targeted fields to be "lesser than" the given value, + * with no limit as to how low it can be. + * + * @param upperBoundValue The upper bound of the range, excluded. Must not be null. + * The signature of this method defines this parameter as an {@link Object}, + * but a specific type is expected depending on the targeted field. + * @return The next step. + */ + default N lessThan(T upperBoundValue) { + return within( Range.lessThan( upperBoundValue ) ); + } + + /** + * Require at least one of the targeted fields to be in the given range. + * + * @param range The range to match. + * The signature of this method defines this parameter as a range with bounds of any type, + * but a specific type is expected depending on the targeted field. + * @return The next step. + */ + N within(Range range); + + /** + * Require at least one of the targeted fields to be in any of the given ranges. + * + * @param ranges The ranges to match. + * The signature of this method defines this parameter as a range with bounds of any type, + * but a specific type is expected depending on the targeted field. + * See {@link ValueModel#MAPPING} for more information. + * @return The next step. + */ + default N withinAny(Range... ranges) { + return withinAny( Arrays.asList( ranges ) ); + } + + /** + * Require at least one of the targeted fields to be in any of the given ranges. + * + * @param ranges The ranges to match. + * The signature of this method defines this parameter as a range with bounds of any type, + * but a specific type is expected depending on the targeted field. + * See {@link ValueModel#MAPPING} for more information. + * @return The next step. + */ + default N withinAny(Collection> ranges) { + return withinAny( ranges, ValueModel.MAPPING ); + } + + /** + * Require at least one of the targeted fields to be in any of the given ranges. + * + * @param ranges The ranges to match. + * The signature of this method defines this parameter as a range with bounds of any type, + * but a specific type is expected depending on the targeted field and on the {@code valueModel} parameter. + * See {@link ValueModel} for more information. + * @param valueModel The model value, determines how the range bounds should be converted + * before Hibernate Search attempts to interpret them as a field value. + * See {@link ValueModel} for more information. + * @return The next step. + */ + N withinAny(Collection> ranges, ValueModel valueModel); +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateMatchingStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateMatchingStep.java index f2714a20cbc..6036c77b2b0 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateMatchingStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateMatchingStep.java @@ -16,7 +16,8 @@ * * @param The type of the next step. */ -public interface RangePredicateMatchingStep> { +public interface RangePredicateMatchingStep> + extends RangePredicateMatchingGenericStep { /** * Require at least one of the targeted fields to be in the range diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldMoreStep.java index 311c9707200..1b97600d04e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldMoreStep.java @@ -4,6 +4,9 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The step in a "regexp" predicate definition where the pattern to match can be set * (see the superinterface {@link RegexpPredicateMatchingStep}), @@ -14,7 +17,8 @@ * @param The type of the next step. */ public interface RegexpPredicateFieldMoreStep< - S extends RegexpPredicateFieldMoreStep, + SR, + S extends RegexpPredicateFieldMoreStep, N extends RegexpPredicateOptionsStep> extends RegexpPredicateMatchingStep, MultiFieldPredicateFieldBoostStep { @@ -52,4 +56,51 @@ default S field(String fieldPath) { */ S fields(String... fieldPaths); + /** + * Target the given field in the regexp predicate. + *

+ * Only text fields are supported. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + @Incubating + default S field(RegexpPredicateFieldReference field) { + return fields( field.absolutePath() ); + } + + /** + * Target the given fields in the regexp predicate. + *

+ * Only text fields are supported. + *

+ * Equivalent to {@link #field(String)} followed by multiple calls to + * {@link RegexpPredicateFieldMoreStep#field(String)}, + * the only difference being that calls to {@link RegexpPredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fields The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(String) + */ + @Incubating + @SuppressWarnings("unchecked") + default S fields(RegexpPredicateFieldReference... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldStep.java index 613c34cb1b3..2b39db1f0de 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldStep.java @@ -4,12 +4,15 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The initial step in a "regexp" predicate definition, where the target field can be set. * * @param The type of the next step. */ -public interface RegexpPredicateFieldStep> { +public interface RegexpPredicateFieldStep> { /** * Target the given field in the regexp predicate. @@ -49,4 +52,51 @@ default N field(String fieldPath) { */ N fields(String... fieldPaths); + /** + * Target the given field in the regexp predicate. + *

+ * Only text fields are supported. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + @Incubating + default N field(RegexpPredicateFieldReference field) { + return fields( field.absolutePath() ); + } + + /** + * Target the given fields in the regexp predicate. + *

+ * Only text fields are supported. + *

+ * Equivalent to {@link #field(String)} followed by multiple calls to + * {@link RegexpPredicateFieldMoreStep#field(String)}, + * the only difference being that calls to {@link RegexpPredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fields The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(String) + */ + @Incubating + @SuppressWarnings("unchecked") + default N fields(RegexpPredicateFieldReference... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } + } 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 737a501c1b1..38e9004d46a 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 @@ -11,6 +11,7 @@ import org.hibernate.search.engine.search.common.BooleanOperator; import org.hibernate.search.engine.search.common.NamedValues; import org.hibernate.search.engine.search.predicate.SearchPredicate; +import org.hibernate.search.engine.search.reference.predicate.NestedPredicateFieldReference; import org.hibernate.search.util.common.SearchException; import org.hibernate.search.util.common.annotation.Incubating; @@ -163,7 +164,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "match" predicate can be defined. * @see MatchPredicateFieldStep */ - MatchPredicateFieldStep match(); + MatchPredicateFieldStep match(); /** * Match documents where targeted fields have a value within lower and upper bounds. @@ -171,7 +172,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "range" predicate can be defined. * @see RangePredicateFieldStep */ - RangePredicateFieldStep range(); + RangePredicateFieldStep range(); /** * Match documents where targeted fields have a value that contains a given phrase. @@ -179,7 +180,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "phrase" predicate can be defined. * @see PhrasePredicateFieldStep */ - PhrasePredicateFieldStep phrase(); + PhrasePredicateFieldStep phrase(); /** * Match documents where targeted fields contain a term that matches a given pattern, @@ -192,7 +193,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "wildcard" predicate can be defined. * @see WildcardPredicateFieldStep */ - WildcardPredicateFieldStep wildcard(); + WildcardPredicateFieldStep wildcard(); /** * Match documents where targeted fields have a value that starts with a given string. @@ -200,7 +201,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "prefix" predicate can be defined. * @see PrefixPredicateFieldStep */ - PrefixPredicateFieldStep prefix(); + PrefixPredicateFieldStep prefix(); /** * Match documents where targeted fields contain a term that matches a given regular expression. @@ -208,7 +209,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "regexp" predicate can be defined. * @see RegexpPredicateFieldStep */ - RegexpPredicateFieldStep regexp(); + RegexpPredicateFieldStep regexp(); /** * Match documents where targeted fields contain a term that matches some terms of a given series of terms. @@ -216,7 +217,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "terms" predicate can be defined. * @see TermsPredicateFieldStep */ - TermsPredicateFieldStep terms(); + TermsPredicateFieldStep terms(); /** * Match documents where a {@link ObjectStructure#NESTED nested object} matches a given predicate. @@ -241,6 +242,22 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, */ NestedPredicateClausesStep nested(String objectFieldPath); + /** + * 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 field The field reference representing a path to the object field + * to apply the predicate on. + * @return The initial step of a DSL where the "nested" predicate can be defined. + * @see NestedPredicateFieldStep + */ + default NestedPredicateClausesStep nested(NestedPredicateFieldReference field) { + return nested( field.absolutePath() ); + } + /** * Match documents according to a given query string, * with a simple query language adapted to end users. @@ -253,7 +270,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "simple query string" predicate can be defined. * @see SimpleQueryStringPredicateFieldStep */ - SimpleQueryStringPredicateFieldStep simpleQueryString(); + SimpleQueryStringPredicateFieldStep simpleQueryString(); /** * Match documents according to a given query string, @@ -267,7 +284,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "query string" predicate can be defined. * @see QueryStringPredicateFieldStep */ - QueryStringPredicateFieldStep queryString(); + QueryStringPredicateFieldStep queryString(); /** * Match documents where a given field exists. @@ -277,7 +294,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "exists" predicate can be defined. * @see ExistsPredicateFieldStep */ - ExistsPredicateFieldStep exists(); + ExistsPredicateFieldStep exists(); /** * Access the different types of spatial predicates. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleQueryStringPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleQueryStringPredicateFieldMoreStep.java index c4e2ffa46d1..3110c2d13d3 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleQueryStringPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleQueryStringPredicateFieldMoreStep.java @@ -4,18 +4,22 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference; + /** * The step in a "simple query string" predicate definition where the query string to match can be set * (see the superinterface {@link SimpleQueryStringPredicateMatchingStep}), * or optional parameters for the last targeted field(s) can be set, * or more target fields can be added. * + * @param Scope root type. * @param The "self" type (the actual exposed type of this step). * @param The type of the next step. */ public interface SimpleQueryStringPredicateFieldMoreStep< - S extends SimpleQueryStringPredicateFieldMoreStep, + SR, + S extends SimpleQueryStringPredicateFieldMoreStep, N extends SimpleQueryStringPredicateOptionsStep> - extends CommonQueryStringPredicateFieldMoreStep { + extends CommonQueryStringPredicateFieldMoreStep> { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleQueryStringPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleQueryStringPredicateFieldStep.java index 51aee41ee8a..84acbf8d20d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleQueryStringPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SimpleQueryStringPredicateFieldStep.java @@ -4,13 +4,15 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference; + /** * The initial step in a "simple query string" predicate definition, where the target field can be set. * + * @param Scope root type. * @param The type of the next step. */ -public interface SimpleQueryStringPredicateFieldStep> - extends CommonQueryStringPredicateFieldStep { - +public interface SimpleQueryStringPredicateFieldStep> + extends CommonQueryStringPredicateFieldStep> { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldMoreStep.java index 256e89d6326..a02f2950b10 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldMoreStep.java @@ -4,6 +4,9 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The step in a "terms" predicate definition where the terms to match can be set * (see the superinterface {@link TermsPredicateMatchingStep}), @@ -14,7 +17,8 @@ * @param The type of the next step. */ public interface TermsPredicateFieldMoreStep< - S extends TermsPredicateFieldMoreStep, + SR, + S extends TermsPredicateFieldMoreStep, N extends TermsPredicateOptionsStep> extends TermsPredicateMatchingStep, MultiFieldPredicateFieldBoostStep { @@ -52,4 +56,49 @@ default S field(String fieldPath) { */ S fields(String... fieldPaths); + /** + * Target the given field in the terms predicate. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + @Incubating + default S field(TermsPredicateFieldReference field) { + return fields( field.absolutePath() ); + } + + /** + * Target the given fields in the terms predicate. + *

+ * Only text fields are supported. + *

+ * Equivalent to {@link #field(String)} followed by multiple calls to + * {@link TermsPredicateFieldMoreStep#field(String)}, + * the only difference being that calls to {@link TermsPredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fields The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(String) + */ + @Incubating + @SuppressWarnings("unchecked") + default S fields(TermsPredicateFieldReference... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldStep.java index 08296895867..028b8779f7d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldStep.java @@ -4,12 +4,15 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The initial step in a "terms" predicate definition, where the target field can be set. * * @param The type of the next step. */ -public interface TermsPredicateFieldStep> { +public interface TermsPredicateFieldStep> { /** * Target the given field in the terms predicate. @@ -47,4 +50,49 @@ default N field(String fieldPath) { */ N fields(String... fieldPaths); + /** + * Target the given field in the terms predicate. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + @Incubating + default N field(TermsPredicateFieldReference field) { + return fields( field.absolutePath() ); + } + + /** + * Target the given fields in the terms predicate. + *

+ * Only text fields are supported. + *

+ * Equivalent to {@link #field(String)} followed by multiple calls to + * {@link TermsPredicateFieldMoreStep#field(String)}, + * the only difference being that calls to {@link TermsPredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fields The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(String) + */ + @Incubating + @SuppressWarnings("unchecked") + default N fields(TermsPredicateFieldReference... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldMoreStep.java index 90189a64018..59120eaa0c1 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldMoreStep.java @@ -4,6 +4,9 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The step in a "wildcard" predicate definition where the pattern to match can be set * (see the superinterface {@link WildcardPredicateMatchingStep}), @@ -14,7 +17,8 @@ * @param The type of the next step. */ public interface WildcardPredicateFieldMoreStep< - S extends WildcardPredicateFieldMoreStep, + SR, + S extends WildcardPredicateFieldMoreStep, N extends WildcardPredicateOptionsStep> extends WildcardPredicateMatchingStep, MultiFieldPredicateFieldBoostStep { @@ -52,4 +56,50 @@ default S field(String fieldPath) { */ S fields(String... fieldPaths); + /** + * Target the given field in the wildcard predicate. + *

+ * Only text fields are supported. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + default S field(WildcardPredicateFieldReference field) { + return fields( field.absolutePath() ); + } + + /** + * Target the given fields in the wildcard predicate. + *

+ * Only text fields are supported. + *

+ * Equivalent to {@link #field(String)} followed by multiple calls to + * {@link WildcardPredicateFieldMoreStep#field(String)}, + * the only difference being that calls to {@link WildcardPredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fields The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(String) + */ + @Incubating + @SuppressWarnings("unchecked") + default S fields(WildcardPredicateFieldReference... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldStep.java index a951617e3d0..b1d2605793f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldStep.java @@ -4,12 +4,15 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + /** * The initial step in a "wildcard" predicate definition, where the target field can be set. * * @param The type of the next step. */ -public interface WildcardPredicateFieldStep> { +public interface WildcardPredicateFieldStep> { /** * Target the given field in the wildcard predicate. @@ -49,4 +52,50 @@ default N field(String fieldPath) { */ N fields(String... fieldPaths); + /** + * Target the given field in the wildcard predicate. + *

+ * Only text fields are supported. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + *

+ * When targeting multiple fields, those fields must have compatible types. + * Please refer to the reference documentation for more information. + * + * @param field The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + default N field(WildcardPredicateFieldReference field) { + return fields( field.absolutePath() ); + } + + /** + * Target the given fields in the wildcard predicate. + *

+ * Only text fields are supported. + *

+ * Equivalent to {@link #field(String)} followed by multiple calls to + * {@link WildcardPredicateFieldMoreStep#field(String)}, + * the only difference being that calls to {@link WildcardPredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fields The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(String) + */ + @Incubating + @SuppressWarnings("unchecked") + default N fields(WildcardPredicateFieldReference... fields) { + String[] paths = new String[fields.length]; + for ( int i = 0; i < fields.length; i++ ) { + paths[i] = fields[i].absolutePath(); + } + return fields( paths ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractMatchPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractMatchPredicateFieldMoreStep.java new file mode 100644 index 00000000000..a07a1286440 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractMatchPredicateFieldMoreStep.java @@ -0,0 +1,306 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.predicate.dsl.impl; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import org.hibernate.search.engine.logging.impl.QueryLog; +import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.engine.search.common.spi.SearchIndexScope; +import org.hibernate.search.engine.search.predicate.SearchPredicate; +import org.hibernate.search.engine.search.predicate.dsl.MatchPredicateFieldMoreGenericStep; +import org.hibernate.search.engine.search.predicate.dsl.MatchPredicateFieldMoreStep; +import org.hibernate.search.engine.search.predicate.dsl.MatchPredicateOptionsStep; +import org.hibernate.search.engine.search.predicate.dsl.MinimumShouldMatchConditionStep; +import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; +import org.hibernate.search.engine.search.predicate.spi.MatchPredicateBuilder; +import org.hibernate.search.engine.search.predicate.spi.MinimumShouldMatchBuilder; +import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys; +import org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference; +import org.hibernate.search.util.common.impl.Contracts; + +abstract class AbstractMatchPredicateFieldMoreStep< + CS extends AbstractMatchPredicateFieldMoreStep.GenericCommonState, + S extends AbstractMatchPredicateFieldMoreStep, + T, + V> + implements AbstractBooleanMultiFieldPredicateCommonState.FieldSetState { + + protected final CS commonState; + + protected final Map predicateBuilders = new LinkedHashMap<>(); + + private Float fieldSetBoost; + + public static MatchPredicateFieldMoreStep create( + SearchPredicateDslContext dslContext, String[] fields) { + return new MatchPredicateFieldMoreStepString( + dslContext, + Arrays.asList( fields ) + ); + } + + public static MatchPredicateFieldMoreGenericStep> create( + SearchPredicateDslContext dslContext, MatchPredicateFieldReference[] fields) { + return new MatchPredicateFieldMoreStepFieldReference<>( + dslContext, + Arrays.asList( fields ) + ); + } + + protected AbstractMatchPredicateFieldMoreStep(CS commonState, List fieldPaths) { + this.commonState = commonState; + this.commonState.add( thisAsS() ); + SearchIndexScope scope = commonState.scope(); + for ( V fieldPath : fieldPaths ) { + predicateBuilders.put( fieldPath, scope.fieldQueryElement( fieldPath( fieldPath ), PredicateTypeKeys.MATCH ) ); + } + } + + protected abstract S thisAsS(); + + protected abstract String fieldPath(V field); + + public S boost(float boost) { + this.fieldSetBoost = boost; + return thisAsS(); + } + + @Override + public void contributePredicates(Consumer collector) { + for ( MatchPredicateBuilder predicateBuilder : predicateBuilders.values() ) { + // Perform last-minute changes, since it's the last call that will be made on this field set state + commonState.applyBoostAndConstantScore( fieldSetBoost, predicateBuilder ); + + collector.accept( predicateBuilder.build() ); + } + } + + private static class MatchPredicateFieldMoreStepString + extends + AbstractMatchPredicateFieldMoreStep + implements + MatchPredicateFieldMoreStep { + + MatchPredicateFieldMoreStepString(SearchPredicateDslContext dslContext, List fieldPaths) { + super( new CommonState( dslContext ), fieldPaths ); + } + + private MatchPredicateFieldMoreStepString(CommonState commonState, List fieldPaths) { + super( commonState, fieldPaths ); + } + + @Override + protected MatchPredicateFieldMoreStepString thisAsS() { + return this; + } + + @Override + protected String fieldPath(String field) { + return field; + } + + @Override + public MatchPredicateFieldMoreStepString field(String field) { + return new MatchPredicateFieldMoreStepString( commonState, Arrays.asList( field ) ); + } + + @Override + public MatchPredicateFieldMoreStepString fields(String... fieldPaths) { + return new MatchPredicateFieldMoreStepString( commonState, Arrays.asList( fieldPaths ) ); + } + + @Override + public CommonState matching(Object value, ValueModel valueModel) { + return commonState.matching( value, valueModel ); + } + + + private static class CommonState extends GenericCommonState { + + CommonState(SearchPredicateDslContext dslContext) { + super( dslContext ); + } + + CommonState matching(Object value, ValueModel valueModel) { + Contracts.assertNotNull( value, "value" ); + Contracts.assertNotNull( valueModel, "valueModel" ); + + for ( MatchPredicateFieldMoreStepString fieldSetState : getFieldSetStates() ) { + for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders.values() ) { + predicateBuilder.value( value, valueModel ); + } + } + return this; + } + + } + } + + private static class MatchPredicateFieldMoreStepFieldReference + extends + AbstractMatchPredicateFieldMoreStep, + MatchPredicateFieldMoreStepFieldReference, + T, + MatchPredicateFieldReference> + implements + MatchPredicateFieldMoreGenericStep, + MatchPredicateFieldMoreStepFieldReference.CommonState, + T, + MatchPredicateFieldReference> { + + MatchPredicateFieldMoreStepFieldReference(SearchPredicateDslContext dslContext, + List> fieldPaths) { + super( new CommonState<>( dslContext ), fieldPaths ); + } + + private MatchPredicateFieldMoreStepFieldReference(CommonState commonState, + List> fieldPaths) { + super( commonState, fieldPaths ); + } + + @Override + public MatchPredicateFieldMoreStepFieldReference field(MatchPredicateFieldReference field) { + return new MatchPredicateFieldMoreStepFieldReference<>( commonState, Collections.singletonList( field ) ); + } + + @Override + @SuppressWarnings("unchecked") + public MatchPredicateFieldMoreStepFieldReference fields(MatchPredicateFieldReference... fieldPaths) { + return new MatchPredicateFieldMoreStepFieldReference<>( commonState, Arrays.asList( fieldPaths ) ); + } + + @Override + public CommonState matching(T value) { + return commonState.matching( value ); + } + + @Override + protected MatchPredicateFieldMoreStepFieldReference thisAsS() { + return this; + } + + @Override + protected String fieldPath(MatchPredicateFieldReference field) { + return field.absolutePath(); + } + + private static class CommonState + extends + GenericCommonState, MatchPredicateFieldMoreStepFieldReference> { + CommonState(SearchPredicateDslContext dslContext) { + super( dslContext ); + } + + CommonState matching(T value) { + Contracts.assertNotNull( value, "value" ); + + for ( MatchPredicateFieldMoreStepFieldReference fieldSetState : getFieldSetStates() ) { + for ( Map.Entry, + MatchPredicateBuilder> entry : fieldSetState.predicateBuilders + .entrySet() ) { + entry.getValue().value( value, entry.getKey().valueModel() ); + } + } + return this; + } + } + } + + static class GenericCommonState> + extends AbstractBooleanMultiFieldPredicateCommonState, S> + implements MatchPredicateOptionsStep> { + + private final MinimumShouldMatchConditionStepImpl> minimumShouldMatchStep; + + GenericCommonState(SearchPredicateDslContext dslContext) { + super( dslContext ); + minimumShouldMatchStep = new MinimumShouldMatchConditionStepImpl<>( new MatchMinimumShouldMatchBuilder(), this ); + } + + @Override + public GenericCommonState fuzzy(int maxEditDistance, int exactPrefixLength) { + if ( maxEditDistance < 0 || 2 < maxEditDistance ) { + throw QueryLog.INSTANCE.invalidFuzzyMaximumEditDistance( maxEditDistance ); + } + if ( exactPrefixLength < 0 ) { + throw QueryLog.INSTANCE.invalidExactPrefixLength( exactPrefixLength ); + } + + for ( AbstractMatchPredicateFieldMoreStep fieldSetState : getFieldSetStates() ) { + for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders.values() ) { + predicateBuilder.fuzzy( maxEditDistance, exactPrefixLength ); + } + } + return this; + } + + @Override + public GenericCommonState analyzer(String analyzerName) { + for ( AbstractMatchPredicateFieldMoreStep fieldSetState : getFieldSetStates() ) { + for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders.values() ) { + predicateBuilder.analyzer( analyzerName ); + } + } + return this; + } + + @Override + public GenericCommonState skipAnalysis() { + for ( AbstractMatchPredicateFieldMoreStep fieldSetState : getFieldSetStates() ) { + for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders.values() ) { + predicateBuilder.skipAnalysis(); + } + } + return this; + } + + @Override + protected GenericCommonState thisAsS() { + return this; + } + + @Override + public MinimumShouldMatchConditionStep> minimumShouldMatch() { + return minimumShouldMatchStep; + } + + @Override + public GenericCommonState minimumShouldMatch( + Consumer> constraintContributor) { + constraintContributor.accept( minimumShouldMatchStep ); + return this; + } + + private class MatchMinimumShouldMatchBuilder implements MinimumShouldMatchBuilder { + @Override + public void minimumShouldMatchNumber(int ignoreConstraintCeiling, int matchingClausesNumber) { + for ( AbstractMatchPredicateFieldMoreStep fieldSetState : getFieldSetStates() ) { + for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders.values() ) { + predicateBuilder.minimumShouldMatchNumber( ignoreConstraintCeiling, matchingClausesNumber ); + } + } + } + + @Override + public void minimumShouldMatchPercent(int ignoreConstraintCeiling, int matchingClausesPercent) { + for ( AbstractMatchPredicateFieldMoreStep fieldSetState : getFieldSetStates() ) { + for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders.values() ) { + predicateBuilder.minimumShouldMatchPercent( ignoreConstraintCeiling, matchingClausesPercent ); + } + } + } + } + } + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractRangePredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractRangePredicateFieldMoreStep.java new file mode 100644 index 00000000000..36c6e50ac23 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractRangePredicateFieldMoreStep.java @@ -0,0 +1,286 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.predicate.dsl.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.hibernate.search.engine.logging.impl.QueryLog; +import org.hibernate.search.engine.reporting.spi.EventContexts; +import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.engine.search.predicate.SearchPredicate; +import org.hibernate.search.engine.search.predicate.dsl.RangePredicateFieldMoreGenericStep; +import org.hibernate.search.engine.search.predicate.dsl.RangePredicateFieldMoreStep; +import org.hibernate.search.engine.search.predicate.dsl.RangePredicateOptionsStep; +import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; +import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys; +import org.hibernate.search.engine.search.predicate.spi.RangePredicateBuilder; +import org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference; +import org.hibernate.search.util.common.data.Range; +import org.hibernate.search.util.common.impl.Contracts; +import org.hibernate.search.util.common.reporting.EventContext; + +abstract class AbstractRangePredicateFieldMoreStep< + SR, + CS extends AbstractRangePredicateFieldMoreStep.GenericCommonState, + S extends AbstractRangePredicateFieldMoreStep, + T, + V> + implements + AbstractBooleanMultiFieldPredicateCommonState.FieldSetState { + + protected final CS commonState; + + private final List fields; + private final List predicateBuilders = new ArrayList<>(); + + private Float fieldSetBoost; + + public static RangePredicateFieldMoreStepString create( + SearchPredicateDslContext dslContext, String[] fields) { + return new RangePredicateFieldMoreStepString<>( + dslContext, + Arrays.asList( fields ) + ); + } + + public static RangePredicateFieldMoreStepReference create( + SearchPredicateDslContext dslContext, RangePredicateFieldReference[] fields) { + return new RangePredicateFieldMoreStepReference<>( + dslContext, + Arrays.asList( fields ) + ); + } + + private AbstractRangePredicateFieldMoreStep(CS commonState, List fields) { + this.commonState = commonState; + this.commonState.add( this ); + this.fields = fields; + for ( V field : fields ) { + // only check that the range predicate can be applied to the requested field: + commonState.scope().fieldQueryElement( fieldPath( field ), PredicateTypeKeys.RANGE ); + } + } + + protected abstract String fieldPath(V field); + + protected abstract S thisAsS(); + + public S boost(float boost) { + this.fieldSetBoost = boost; + return thisAsS(); + } + + @Override + public void contributePredicates(Consumer collector) { + for ( RangePredicateBuilder predicateBuilder : predicateBuilders ) { + // Perform last-minute changes, since it's the last call that will be made on this field set state + commonState.applyBoostAndConstantScore( fieldSetBoost, predicateBuilder ); + + collector.accept( predicateBuilder.build() ); + } + } + + private static class RangePredicateFieldMoreStepString + extends + AbstractRangePredicateFieldMoreStep, + RangePredicateFieldMoreStepString, + Object, + String> + implements + RangePredicateFieldMoreStep, + RangePredicateFieldMoreStepString.CommonState> { + + private RangePredicateFieldMoreStepString(SearchPredicateDslContext dslContext, List fields) { + this( new CommonState<>( dslContext ), fields ); + } + + private RangePredicateFieldMoreStepString(CommonState commonState, List fields) { + super( commonState, fields ); + } + + @Override + protected String fieldPath(String field) { + return field; + } + + @Override + protected RangePredicateFieldMoreStepString thisAsS() { + return this; + } + + @Override + public RangePredicateFieldMoreStepString fields(String... fieldPaths) { + return new RangePredicateFieldMoreStepString<>( commonState, Arrays.asList( fieldPaths ) ); + } + + @Override + public CommonState within(Range range, ValueModel convert) { + Contracts.assertNotNull( range, "range" ); + Contracts.assertNotNull( convert, "convert" ); + return (CommonState) commonState.within( range, v -> convert ); + } + + @Override + public CommonState withinAny(Collection> ranges, ValueModel valueModel) { + Contracts.assertNotNull( ranges, "ranges" ); + Contracts.assertNotNull( valueModel, "convert" ); + return (CommonState) commonState.withinAny( ranges, v -> valueModel ); + } + + public static class CommonState + extends GenericCommonState> { + CommonState(SearchPredicateDslContext dslContext) { + super( dslContext ); + } + + @Override + protected String fieldPath(String field) { + return field; + } + } + } + + private static class RangePredicateFieldMoreStepReference + extends + AbstractRangePredicateFieldMoreStep, + RangePredicateFieldMoreStepReference, + T, + RangePredicateFieldReference> + implements + RangePredicateFieldMoreGenericStep, + RangePredicateFieldMoreStepReference.CommonState, + RangePredicateFieldReference, + T> { + + private RangePredicateFieldMoreStepReference(SearchPredicateDslContext dslContext, + List> fields) { + this( new CommonState<>( dslContext ), fields ); + } + + private RangePredicateFieldMoreStepReference(CommonState commonState, + List> fields) { + super( commonState, fields ); + } + + @Override + protected String fieldPath(RangePredicateFieldReference field) { + return field.absolutePath(); + } + + @Override + protected RangePredicateFieldMoreStepReference thisAsS() { + return this; + } + + @Override + public RangePredicateFieldMoreStepReference field(RangePredicateFieldReference field) { + return new RangePredicateFieldMoreStepReference<>( commonState, List.of( field ) ); + } + + @Override + @SuppressWarnings("unchecked") + public RangePredicateFieldMoreStepReference fields(RangePredicateFieldReference... fields) { + return new RangePredicateFieldMoreStepReference<>( commonState, Arrays.asList( fields ) ); + } + + @Override + public CommonState within(Range range) { + return (CommonState) commonState.within( range, RangePredicateFieldReference::valueModel ); + } + + @Override + public CommonState withinAny(Collection> ranges, ValueModel valueModel) { + return (CommonState) commonState.withinAny( ranges, RangePredicateFieldReference::valueModel ); + } + + + public static class CommonState + extends + GenericCommonState, RangePredicateFieldMoreStepReference> { + CommonState(SearchPredicateDslContext dslContext) { + super( dslContext ); + } + + @Override + protected String fieldPath(RangePredicateFieldReference field) { + return field.absolutePath(); + } + } + } + + abstract static class GenericCommonState> + extends + AbstractBooleanMultiFieldPredicateCommonState, + AbstractRangePredicateFieldMoreStep> + implements RangePredicateOptionsStep> { + + GenericCommonState(SearchPredicateDslContext dslContext) { + super( dslContext ); + } + + @Override + protected GenericCommonState thisAsS() { + return this; + } + + protected abstract String fieldPath(V field); + + GenericCommonState within(Range range, Function valueModelFunction) { + + if ( range.lowerBoundValue().isEmpty() && range.upperBoundValue().isEmpty() ) { + throw QueryLog.INSTANCE.rangePredicateCannotMatchNullValue( getEventContext() ); + } + for ( var fieldSetState : getFieldSetStates() ) { + for ( V field : fieldSetState.fields ) { + ValueModel valueModel = valueModelFunction.apply( field ); + RangePredicateBuilder builder = scope().fieldQueryElement( fieldPath( field ), PredicateTypeKeys.RANGE ); + builder.within( range, valueModel, valueModel ); + fieldSetState.predicateBuilders.add( builder ); + } + } + return this; + } + + public GenericCommonState withinAny(Collection> ranges, + Function valueModelFunction) { + for ( var fieldSetState : getFieldSetStates() ) { + for ( V field : fieldSetState.fields ) { + for ( var range : ranges ) { + Contracts.assertNotNull( range, "range" ); + if ( range.lowerBoundValue().isEmpty() && range.upperBoundValue().isEmpty() ) { + throw QueryLog.INSTANCE.rangePredicateCannotMatchNullValue( getEventContext() ); + } + ValueModel valueModel = valueModelFunction.apply( field ); + RangePredicateBuilder builder = + scope().fieldQueryElement( fieldPath( field ), PredicateTypeKeys.RANGE ); + builder.within( range, valueModel, valueModel ); + fieldSetState.predicateBuilders.add( builder ); + } + } + } + + return this; + } + + protected final EventContext getEventContext() { + return EventContexts.fromIndexFieldAbsolutePaths( + getFieldSetStates().stream().flatMap( f -> f.fields.stream() ) + .map( this::fieldPath ) + .collect( Collectors.toList() ) + ); + } + } + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/ExistsPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/ExistsPredicateFieldStepImpl.java index 2e5978506ab..74726e4d611 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/ExistsPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/ExistsPredicateFieldStepImpl.java @@ -12,9 +12,9 @@ import org.hibernate.search.engine.search.predicate.spi.ExistsPredicateBuilder; import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys; -public final class ExistsPredicateFieldStepImpl +public final class ExistsPredicateFieldStepImpl extends AbstractPredicateFinalStep - implements ExistsPredicateFieldStep>, + implements ExistsPredicateFieldStep>, ExistsPredicateOptionsStep> { private ExistsPredicateBuilder builder; diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java index c2f8f1382b5..431a5e96eee 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java @@ -9,6 +9,7 @@ import org.hibernate.search.engine.search.predicate.SearchPredicate; import org.hibernate.search.engine.search.predicate.dsl.KnnPredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.KnnPredicateOptionsStep; +import org.hibernate.search.engine.search.predicate.dsl.KnnPredicateVectorGenericStep; import org.hibernate.search.engine.search.predicate.dsl.KnnPredicateVectorStep; import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; @@ -17,6 +18,7 @@ import org.hibernate.search.engine.search.predicate.spi.BooleanPredicateBuilder; import org.hibernate.search.engine.search.predicate.spi.KnnPredicateBuilder; import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys; +import org.hibernate.search.engine.search.reference.predicate.KnnPredicateFieldReference; public class KnnPredicateFieldStepImpl extends AbstractPredicateFinalStep @@ -41,11 +43,9 @@ public KnnPredicateVectorStep field(String fieldPath) { } @Override - protected SearchPredicate build() { - if ( this.booleanBuilder != null ) { - builder.filter( booleanBuilder.build() ); - } - return builder.build(); + public KnnPredicateVectorGenericStep field(KnnPredicateFieldReference field) { + this.field( field.absolutePath() ); + return new KnnPredicateVectorGenericStepImpl<>(); } @Override @@ -97,6 +97,14 @@ public KnnPredicateOptionsStep constantScore() { return this; } + @Override + protected SearchPredicate build() { + if ( this.booleanBuilder != null ) { + builder.filter( booleanBuilder.build() ); + } + return builder.build(); + } + private BooleanPredicateBuilder booleanPredicateBuilder() { if ( this.booleanBuilder == null ) { this.booleanBuilder = dslContext.scope().predicateBuilders().bool(); @@ -104,4 +112,13 @@ private BooleanPredicateBuilder booleanPredicateBuilder() { return this.booleanBuilder; } + private class KnnPredicateVectorGenericStepImpl implements KnnPredicateVectorGenericStep { + + @Override + public KnnPredicateOptionsStep matching(T vector) { + KnnPredicateFieldStepImpl.this.builder.vector( vector ); + return KnnPredicateFieldStepImpl.this; + } + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldMoreStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldMoreStepImpl.java deleted file mode 100644 index d2fc523a672..00000000000 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldMoreStepImpl.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.engine.search.predicate.dsl.impl; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; - -import org.hibernate.search.engine.logging.impl.QueryLog; -import org.hibernate.search.engine.search.common.ValueModel; -import org.hibernate.search.engine.search.common.spi.SearchIndexScope; -import org.hibernate.search.engine.search.predicate.SearchPredicate; -import org.hibernate.search.engine.search.predicate.dsl.MatchPredicateFieldMoreStep; -import org.hibernate.search.engine.search.predicate.dsl.MatchPredicateOptionsStep; -import org.hibernate.search.engine.search.predicate.dsl.MinimumShouldMatchConditionStep; -import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -import org.hibernate.search.engine.search.predicate.spi.MatchPredicateBuilder; -import org.hibernate.search.engine.search.predicate.spi.MinimumShouldMatchBuilder; -import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys; -import org.hibernate.search.util.common.impl.Contracts; - -class MatchPredicateFieldMoreStepImpl - implements MatchPredicateFieldMoreStep>, - AbstractBooleanMultiFieldPredicateCommonState.FieldSetState { - - private final CommonState commonState; - - private final List predicateBuilders = new ArrayList<>(); - - private Float fieldSetBoost; - - MatchPredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { - this.commonState = commonState; - this.commonState.add( this ); - SearchIndexScope scope = commonState.scope(); - for ( String fieldPath : fieldPaths ) { - predicateBuilders.add( scope.fieldQueryElement( fieldPath, PredicateTypeKeys.MATCH ) ); - } - } - - @Override - public MatchPredicateFieldMoreStepImpl fields(String... fieldPaths) { - return new MatchPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); - } - - @Override - public MatchPredicateFieldMoreStepImpl boost(float boost) { - this.fieldSetBoost = boost; - return this; - } - - @Override - public MatchPredicateOptionsStep matching(Object value, ValueModel valueModel) { - return commonState.matching( value, valueModel ); - } - - @Override - public void contributePredicates(Consumer collector) { - for ( MatchPredicateBuilder predicateBuilder : predicateBuilders ) { - // Perform last-minute changes, since it's the last call that will be made on this field set state - commonState.applyBoostAndConstantScore( fieldSetBoost, predicateBuilder ); - - collector.accept( predicateBuilder.build() ); - } - } - - static class CommonState extends AbstractBooleanMultiFieldPredicateCommonState - implements MatchPredicateOptionsStep { - private final MinimumShouldMatchConditionStepImpl minimumShouldMatchStep; - - CommonState(SearchPredicateDslContext dslContext) { - super( dslContext ); - minimumShouldMatchStep = new MinimumShouldMatchConditionStepImpl<>( new MatchMinimumShouldMatchBuilder(), this ); - } - - MatchPredicateOptionsStep matching(Object value, ValueModel valueModel) { - Contracts.assertNotNull( value, "value" ); - Contracts.assertNotNull( valueModel, "valueModel" ); - - for ( MatchPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { - for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { - predicateBuilder.value( value, valueModel ); - } - } - return this; - } - - @Override - public CommonState fuzzy(int maxEditDistance, int exactPrefixLength) { - if ( maxEditDistance < 0 || 2 < maxEditDistance ) { - throw QueryLog.INSTANCE.invalidFuzzyMaximumEditDistance( maxEditDistance ); - } - if ( exactPrefixLength < 0 ) { - throw QueryLog.INSTANCE.invalidExactPrefixLength( exactPrefixLength ); - } - - for ( MatchPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { - for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { - predicateBuilder.fuzzy( maxEditDistance, exactPrefixLength ); - } - } - return this; - } - - @Override - public CommonState analyzer(String analyzerName) { - for ( MatchPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { - for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { - predicateBuilder.analyzer( analyzerName ); - } - } - return this; - } - - @Override - public CommonState skipAnalysis() { - for ( MatchPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { - for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { - predicateBuilder.skipAnalysis(); - } - } - return this; - } - - @Override - protected CommonState thisAsS() { - return this; - } - - @Override - public MinimumShouldMatchConditionStep minimumShouldMatch() { - return minimumShouldMatchStep; - } - - @Override - public CommonState minimumShouldMatch(Consumer> constraintContributor) { - constraintContributor.accept( minimumShouldMatchStep ); - return this; - } - - private class MatchMinimumShouldMatchBuilder implements MinimumShouldMatchBuilder { - @Override - public void minimumShouldMatchNumber(int ignoreConstraintCeiling, int matchingClausesNumber) { - for ( MatchPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { - for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { - predicateBuilder.minimumShouldMatchNumber( ignoreConstraintCeiling, matchingClausesNumber ); - } - } - } - - @Override - public void minimumShouldMatchPercent(int ignoreConstraintCeiling, int matchingClausesPercent) { - for ( MatchPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { - for ( MatchPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { - predicateBuilder.minimumShouldMatchPercent( ignoreConstraintCeiling, matchingClausesPercent ); - } - } - } - } - } - -} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldStepImpl.java index b1945823a2d..0e83e9e9987 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldStepImpl.java @@ -4,22 +4,29 @@ */ package org.hibernate.search.engine.search.predicate.dsl.impl; -import java.util.Arrays; - +import org.hibernate.search.engine.search.predicate.dsl.MatchPredicateFieldMoreGenericStep; import org.hibernate.search.engine.search.predicate.dsl.MatchPredicateFieldMoreStep; import org.hibernate.search.engine.search.predicate.dsl.MatchPredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; +import org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference; -public final class MatchPredicateFieldStepImpl implements MatchPredicateFieldStep> { +public final class MatchPredicateFieldStepImpl implements MatchPredicateFieldStep> { - private final MatchPredicateFieldMoreStepImpl.CommonState commonState; + private final SearchPredicateDslContext dslContext; public MatchPredicateFieldStepImpl(SearchPredicateDslContext dslContext) { - this.commonState = new MatchPredicateFieldMoreStepImpl.CommonState( dslContext ); + this.dslContext = dslContext; } @Override public MatchPredicateFieldMoreStep fields(String... fieldPaths) { - return new MatchPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + return AbstractMatchPredicateFieldMoreStep.create( dslContext, fieldPaths ); + } + + @Override + @SuppressWarnings("unchecked") + public MatchPredicateFieldMoreGenericStep> fields( + MatchPredicateFieldReference... fields) { + return AbstractMatchPredicateFieldMoreStep.create( dslContext, fields ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PhrasePredicateFieldMoreStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PhrasePredicateFieldMoreStepImpl.java index 0e9dfdec126..07cc4e3e6cc 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PhrasePredicateFieldMoreStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PhrasePredicateFieldMoreStepImpl.java @@ -19,17 +19,17 @@ import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys; import org.hibernate.search.util.common.impl.Contracts; -class PhrasePredicateFieldMoreStepImpl - implements PhrasePredicateFieldMoreStep>, +class PhrasePredicateFieldMoreStepImpl + implements PhrasePredicateFieldMoreStep, PhrasePredicateOptionsStep>, AbstractBooleanMultiFieldPredicateCommonState.FieldSetState { - private final CommonState commonState; + private final CommonState commonState; private final List predicateBuilders = new ArrayList<>(); private Float fieldSetBoost; - PhrasePredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { + PhrasePredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { this.commonState = commonState; this.commonState.add( this ); SearchIndexScope scope = commonState.scope(); @@ -39,12 +39,12 @@ class PhrasePredicateFieldMoreStepImpl } @Override - public PhrasePredicateFieldMoreStepImpl fields(String... fieldPaths) { - return new PhrasePredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public PhrasePredicateFieldMoreStepImpl fields(String... fieldPaths) { + return new PhrasePredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); } @Override - public PhrasePredicateFieldMoreStepImpl boost(float boost) { + public PhrasePredicateFieldMoreStepImpl boost(float boost) { this.fieldSetBoost = boost; return this; } @@ -64,9 +64,9 @@ public void contributePredicates(Consumer collector) { } } - static class CommonState - extends AbstractBooleanMultiFieldPredicateCommonState - implements PhrasePredicateOptionsStep { + static class CommonState + extends AbstractBooleanMultiFieldPredicateCommonState, PhrasePredicateFieldMoreStepImpl> + implements PhrasePredicateOptionsStep> { CommonState(SearchPredicateDslContext dslContext) { super( dslContext ); @@ -74,7 +74,7 @@ static class CommonState private PhrasePredicateOptionsStep matching(String phrase) { Contracts.assertNotNull( phrase, "phrase" ); - for ( PhrasePredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + for ( PhrasePredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { for ( PhrasePredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { predicateBuilder.phrase( phrase ); } @@ -83,12 +83,12 @@ private PhrasePredicateOptionsStep matching(String phrase) { } @Override - public CommonState slop(int slop) { + public CommonState slop(int slop) { if ( slop < 0 ) { throw QueryLog.INSTANCE.invalidPhrasePredicateSlop( slop ); } - for ( PhrasePredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + for ( PhrasePredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { for ( PhrasePredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { predicateBuilder.slop( slop ); } @@ -97,8 +97,8 @@ public CommonState slop(int slop) { } @Override - public CommonState analyzer(String analyzerName) { - for ( PhrasePredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + public CommonState analyzer(String analyzerName) { + for ( PhrasePredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { for ( PhrasePredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { predicateBuilder.analyzer( analyzerName ); } @@ -107,8 +107,8 @@ public CommonState analyzer(String analyzerName) { } @Override - public CommonState skipAnalysis() { - for ( PhrasePredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + public CommonState skipAnalysis() { + for ( PhrasePredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { for ( PhrasePredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { predicateBuilder.skipAnalysis(); } @@ -117,7 +117,7 @@ public CommonState skipAnalysis() { } @Override - protected CommonState thisAsS() { + protected CommonState thisAsS() { return this; } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PhrasePredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PhrasePredicateFieldStepImpl.java index 06017fa11d5..a01354b134e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PhrasePredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PhrasePredicateFieldStepImpl.java @@ -10,16 +10,17 @@ import org.hibernate.search.engine.search.predicate.dsl.PhrasePredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -public final class PhrasePredicateFieldStepImpl implements PhrasePredicateFieldStep> { +public final class PhrasePredicateFieldStepImpl + implements PhrasePredicateFieldStep> { - private final PhrasePredicateFieldMoreStepImpl.CommonState commonState; + private final PhrasePredicateFieldMoreStepImpl.CommonState commonState; public PhrasePredicateFieldStepImpl(SearchPredicateDslContext dslContext) { - this.commonState = new PhrasePredicateFieldMoreStepImpl.CommonState( dslContext ); + this.commonState = new PhrasePredicateFieldMoreStepImpl.CommonState( dslContext ); } @Override - public PhrasePredicateFieldMoreStep fields(String... fieldPaths) { - return new PhrasePredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public PhrasePredicateFieldMoreStep fields(String... fieldPaths) { + return new PhrasePredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PrefixPredicateFieldMoreStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PrefixPredicateFieldMoreStepImpl.java index 3314e1665ae..046183a0303 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PrefixPredicateFieldMoreStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PrefixPredicateFieldMoreStepImpl.java @@ -18,17 +18,17 @@ import org.hibernate.search.engine.search.predicate.spi.PrefixPredicateBuilder; import org.hibernate.search.util.common.impl.Contracts; -class PrefixPredicateFieldMoreStepImpl - implements PrefixPredicateFieldMoreStep>, +class PrefixPredicateFieldMoreStepImpl + implements PrefixPredicateFieldMoreStep, PrefixPredicateOptionsStep>, AbstractBooleanMultiFieldPredicateCommonState.FieldSetState { - private final CommonState commonState; + private final CommonState commonState; private final List predicateBuilders = new ArrayList<>(); private Float fieldSetBoost; - PrefixPredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { + PrefixPredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { this.commonState = commonState; this.commonState.add( this ); SearchIndexScope scope = commonState.scope(); @@ -38,12 +38,12 @@ class PrefixPredicateFieldMoreStepImpl } @Override - public PrefixPredicateFieldMoreStepImpl fields(String... fieldPaths) { - return new PrefixPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public PrefixPredicateFieldMoreStepImpl fields(String... fieldPaths) { + return new PrefixPredicateFieldMoreStepImpl<>( commonState, Arrays.asList( fieldPaths ) ); } @Override - public PrefixPredicateFieldMoreStepImpl boost(float boost) { + public PrefixPredicateFieldMoreStepImpl boost(float boost) { this.fieldSetBoost = boost; return this; } @@ -63,9 +63,9 @@ public void contributePredicates(Consumer collector) { } } - static class CommonState - extends AbstractBooleanMultiFieldPredicateCommonState - implements PrefixPredicateOptionsStep { + static class CommonState + extends AbstractBooleanMultiFieldPredicateCommonState, PrefixPredicateFieldMoreStepImpl> + implements PrefixPredicateOptionsStep> { CommonState(SearchPredicateDslContext dslContext) { super( dslContext ); @@ -73,7 +73,7 @@ static class CommonState private PrefixPredicateOptionsStep matching(String prefix) { Contracts.assertNotNull( prefix, "prefix" ); - for ( PrefixPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + for ( PrefixPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { for ( PrefixPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { predicateBuilder.prefix( prefix ); } @@ -82,7 +82,7 @@ private PrefixPredicateOptionsStep matching(String prefix) { } @Override - protected CommonState thisAsS() { + protected CommonState thisAsS() { return this; } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PrefixPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PrefixPredicateFieldStepImpl.java index cd4920e34c4..a29b86ad4d3 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PrefixPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/PrefixPredicateFieldStepImpl.java @@ -10,17 +10,17 @@ import org.hibernate.search.engine.search.predicate.dsl.PrefixPredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -public final class PrefixPredicateFieldStepImpl - implements PrefixPredicateFieldStep> { +public final class PrefixPredicateFieldStepImpl + implements PrefixPredicateFieldStep> { - private final PrefixPredicateFieldMoreStepImpl.CommonState commonState; + private final PrefixPredicateFieldMoreStepImpl.CommonState commonState; public PrefixPredicateFieldStepImpl(SearchPredicateDslContext dslContext) { - this.commonState = new PrefixPredicateFieldMoreStepImpl.CommonState( dslContext ); + this.commonState = new PrefixPredicateFieldMoreStepImpl.CommonState<>( dslContext ); } @Override - public PrefixPredicateFieldMoreStep fields(String... fieldPaths) { - return new PrefixPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public PrefixPredicateFieldMoreStep fields(String... fieldPaths) { + return new PrefixPredicateFieldMoreStepImpl<>( commonState, Arrays.asList( fieldPaths ) ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/QueryStringPredicateFieldMoreStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/QueryStringPredicateFieldMoreStepImpl.java index f72cde7368c..090a37e3e77 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/QueryStringPredicateFieldMoreStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/QueryStringPredicateFieldMoreStepImpl.java @@ -18,9 +18,9 @@ import org.hibernate.search.engine.search.predicate.spi.CommonQueryStringPredicateBuilder; import org.hibernate.search.engine.search.predicate.spi.QueryStringPredicateBuilder; -class QueryStringPredicateFieldMoreStepImpl +class QueryStringPredicateFieldMoreStepImpl implements - QueryStringPredicateFieldMoreStep> { + QueryStringPredicateFieldMoreStep, QueryStringPredicateOptionsStep> { private final CommonState commonState; @@ -34,12 +34,12 @@ class QueryStringPredicateFieldMoreStepImpl } @Override - public QueryStringPredicateFieldMoreStepImpl fields(String... fieldPaths) { - return new QueryStringPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public QueryStringPredicateFieldMoreStepImpl fields(String... fieldPaths) { + return new QueryStringPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); } @Override - public QueryStringPredicateFieldMoreStepImpl boost(float boost) { + public QueryStringPredicateFieldMoreStepImpl boost(float boost) { fieldStates.forEach( c -> c.boost( boost ) ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/QueryStringPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/QueryStringPredicateFieldStepImpl.java index 1cf0c3529a9..ceca81dd808 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/QueryStringPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/QueryStringPredicateFieldStepImpl.java @@ -10,8 +10,8 @@ import org.hibernate.search.engine.search.predicate.dsl.QueryStringPredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -public final class QueryStringPredicateFieldStepImpl - implements QueryStringPredicateFieldStep> { +public final class QueryStringPredicateFieldStepImpl + implements QueryStringPredicateFieldStep> { private final QueryStringPredicateFieldMoreStepImpl.CommonState commonState; @@ -20,7 +20,7 @@ public QueryStringPredicateFieldStepImpl(SearchPredicateDslContext dslContext } @Override - public QueryStringPredicateFieldMoreStep fields(String... fieldPaths) { - return new QueryStringPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public QueryStringPredicateFieldMoreStep fields(String... fieldPaths) { + return new QueryStringPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldMoreStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldMoreStepImpl.java deleted file mode 100644 index 1659202e553..00000000000 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldMoreStepImpl.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.engine.search.predicate.dsl.impl; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.function.Consumer; -import java.util.stream.Collectors; - -import org.hibernate.search.engine.logging.impl.QueryLog; -import org.hibernate.search.engine.reporting.spi.EventContexts; -import org.hibernate.search.engine.search.common.ValueModel; -import org.hibernate.search.engine.search.predicate.SearchPredicate; -import org.hibernate.search.engine.search.predicate.dsl.RangePredicateFieldMoreStep; -import org.hibernate.search.engine.search.predicate.dsl.RangePredicateOptionsStep; -import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys; -import org.hibernate.search.engine.search.predicate.spi.RangePredicateBuilder; -import org.hibernate.search.util.common.data.Range; -import org.hibernate.search.util.common.impl.Contracts; -import org.hibernate.search.util.common.reporting.EventContext; - -class RangePredicateFieldMoreStepImpl - implements RangePredicateFieldMoreStep>, - AbstractBooleanMultiFieldPredicateCommonState.FieldSetState { - - private final CommonState commonState; - - private final List fieldPaths; - private final List predicateBuilders = new ArrayList<>(); - - private Float fieldSetBoost; - - RangePredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { - this.commonState = commonState; - this.commonState.add( this ); - this.fieldPaths = fieldPaths; - for ( String path : fieldPaths ) { - // only check that the range predicate can be applied to the requested field: - commonState.scope().fieldQueryElement( path, PredicateTypeKeys.RANGE ); - } - } - - @Override - public RangePredicateFieldMoreStepImpl fields(String... fieldPaths) { - return new RangePredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); - } - - @Override - public RangePredicateFieldMoreStepImpl boost(float boost) { - this.fieldSetBoost = boost; - return this; - } - - @Override - public RangePredicateOptionsStep within(Range range, ValueModel valueModel) { - return commonState.within( range, valueModel, valueModel ); - } - - @Override - public RangePredicateOptionsStep withinAny(Collection> ranges, ValueModel valueModel) { - return commonState.withinAny( ranges, valueModel ); - } - - @Override - public void contributePredicates(Consumer collector) { - for ( RangePredicateBuilder predicateBuilder : predicateBuilders ) { - // Perform last-minute changes, since it's the last call that will be made on this field set state - commonState.applyBoostAndConstantScore( fieldSetBoost, predicateBuilder ); - - collector.accept( predicateBuilder.build() ); - } - } - - static class CommonState - extends AbstractBooleanMultiFieldPredicateCommonState - implements RangePredicateOptionsStep { - - CommonState(SearchPredicateDslContext dslContext) { - super( dslContext ); - } - - CommonState within(Range range, ValueModel lowerBoundModel, ValueModel upperBoundModel) { - Contracts.assertNotNull( range, "range" ); - Contracts.assertNotNull( lowerBoundModel, "lowerBoundModel" ); - Contracts.assertNotNull( upperBoundModel, "upperBoundModel" ); - if ( range.lowerBoundValue().isEmpty() && range.upperBoundValue().isEmpty() ) { - throw QueryLog.INSTANCE.rangePredicateCannotMatchNullValue( getEventContext() ); - } - for ( RangePredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { - for ( String path : fieldSetState.fieldPaths ) { - RangePredicateBuilder builder = scope().fieldQueryElement( path, PredicateTypeKeys.RANGE ); - builder.within( range, lowerBoundModel, upperBoundModel ); - fieldSetState.predicateBuilders.add( builder ); - } - } - return this; - } - - public CommonState withinAny(Collection> ranges, ValueModel valueModel) { - Contracts.assertNotNull( valueModel, "valueModel" ); - for ( RangePredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { - for ( String path : fieldSetState.fieldPaths ) { - for ( var range : ranges ) { - Contracts.assertNotNull( range, "range" ); - if ( range.lowerBoundValue().isEmpty() && range.upperBoundValue().isEmpty() ) { - throw QueryLog.INSTANCE.rangePredicateCannotMatchNullValue( getEventContext() ); - } - RangePredicateBuilder builder = scope().fieldQueryElement( path, PredicateTypeKeys.RANGE ); - builder.within( range, valueModel, valueModel ); - fieldSetState.predicateBuilders.add( builder ); - } - } - } - - return this; - } - - @Override - protected CommonState thisAsS() { - return this; - } - - protected final EventContext getEventContext() { - return EventContexts.fromIndexFieldAbsolutePaths( - getFieldSetStates().stream().flatMap( f -> f.fieldPaths.stream() ) - .collect( Collectors.toList() ) - ); - } - } - -} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldStepImpl.java index e496d495184..eb752a5b15d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldStepImpl.java @@ -4,22 +4,32 @@ */ package org.hibernate.search.engine.search.predicate.dsl.impl; -import java.util.Arrays; - +import org.hibernate.search.engine.search.predicate.dsl.RangePredicateFieldMoreGenericStep; import org.hibernate.search.engine.search.predicate.dsl.RangePredicateFieldMoreStep; import org.hibernate.search.engine.search.predicate.dsl.RangePredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; +import org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference; -public final class RangePredicateFieldStepImpl implements RangePredicateFieldStep> { +public final class RangePredicateFieldStepImpl + implements + RangePredicateFieldStep> { - private final RangePredicateFieldMoreStepImpl.CommonState commonState; + private final SearchPredicateDslContext dslContext; public RangePredicateFieldStepImpl(SearchPredicateDslContext dslContext) { - this.commonState = new RangePredicateFieldMoreStepImpl.CommonState( dslContext ); + this.dslContext = dslContext; } @Override - public RangePredicateFieldMoreStep fields(String... fieldPaths) { - return new RangePredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public RangePredicateFieldMoreStep fields(String... fieldPaths) { + return AbstractRangePredicateFieldMoreStep.create( dslContext, fieldPaths ); } + + @Override + @SuppressWarnings("unchecked") + public RangePredicateFieldMoreGenericStep, T> fields( + RangePredicateFieldReference... fields) { + return AbstractRangePredicateFieldMoreStep.create( dslContext, fields ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RegexpPredicateFieldMoreStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RegexpPredicateFieldMoreStepImpl.java index 0ac97b007f7..b3cda42a1f3 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RegexpPredicateFieldMoreStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RegexpPredicateFieldMoreStepImpl.java @@ -20,17 +20,17 @@ import org.hibernate.search.engine.search.predicate.spi.RegexpPredicateBuilder; import org.hibernate.search.util.common.impl.Contracts; -class RegexpPredicateFieldMoreStepImpl - implements RegexpPredicateFieldMoreStep>, +class RegexpPredicateFieldMoreStepImpl + implements RegexpPredicateFieldMoreStep, RegexpPredicateOptionsStep>, AbstractBooleanMultiFieldPredicateCommonState.FieldSetState { - private final CommonState commonState; + private final CommonState commonState; private final List predicateBuilders = new ArrayList<>(); private Float fieldSetBoost; - RegexpPredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { + RegexpPredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { this.commonState = commonState; this.commonState.add( this ); SearchIndexScope scope = commonState.scope(); @@ -40,12 +40,12 @@ class RegexpPredicateFieldMoreStepImpl } @Override - public RegexpPredicateFieldMoreStepImpl fields(String... fieldPaths) { - return new RegexpPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public RegexpPredicateFieldMoreStepImpl fields(String... fieldPaths) { + return new RegexpPredicateFieldMoreStepImpl<>( commonState, Arrays.asList( fieldPaths ) ); } @Override - public RegexpPredicateFieldMoreStepImpl boost(float boost) { + public RegexpPredicateFieldMoreStepImpl boost(float boost) { this.fieldSetBoost = boost; return this; } @@ -65,9 +65,9 @@ public void contributePredicates(Consumer collector) { } } - static class CommonState - extends AbstractBooleanMultiFieldPredicateCommonState - implements RegexpPredicateOptionsStep { + static class CommonState + extends AbstractBooleanMultiFieldPredicateCommonState, RegexpPredicateFieldMoreStepImpl> + implements RegexpPredicateOptionsStep> { CommonState(SearchPredicateDslContext dslContext) { super( dslContext ); @@ -75,7 +75,7 @@ static class CommonState private RegexpPredicateOptionsStep matching(String regexpPattern) { Contracts.assertNotNull( regexpPattern, "regexpPattern" ); - for ( RegexpPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + for ( RegexpPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { for ( RegexpPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { predicateBuilder.pattern( regexpPattern ); } @@ -84,13 +84,13 @@ private RegexpPredicateOptionsStep matching(String regexpPattern) { } @Override - protected CommonState thisAsS() { + protected CommonState thisAsS() { return this; } @Override - public CommonState flags(Set flags) { - for ( RegexpPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + public CommonState flags(Set flags) { + for ( RegexpPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { for ( RegexpPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { predicateBuilder.flags( flags ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RegexpPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RegexpPredicateFieldStepImpl.java index 9143ab5bf9e..48cd7bc5db1 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RegexpPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RegexpPredicateFieldStepImpl.java @@ -10,17 +10,17 @@ import org.hibernate.search.engine.search.predicate.dsl.RegexpPredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -public final class RegexpPredicateFieldStepImpl - implements RegexpPredicateFieldStep> { +public final class RegexpPredicateFieldStepImpl + implements RegexpPredicateFieldStep> { - private final RegexpPredicateFieldMoreStepImpl.CommonState commonState; + private final RegexpPredicateFieldMoreStepImpl.CommonState commonState; public RegexpPredicateFieldStepImpl(SearchPredicateDslContext dslContext) { - this.commonState = new RegexpPredicateFieldMoreStepImpl.CommonState( dslContext ); + this.commonState = new RegexpPredicateFieldMoreStepImpl.CommonState<>( dslContext ); } @Override - public RegexpPredicateFieldMoreStep fields(String... fieldPaths) { - return new RegexpPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public RegexpPredicateFieldMoreStep fields(String... fieldPaths) { + return new RegexpPredicateFieldMoreStepImpl<>( commonState, Arrays.asList( fieldPaths ) ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleQueryStringPredicateFieldMoreStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleQueryStringPredicateFieldMoreStepImpl.java index 55975fc119b..c6eecec9084 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleQueryStringPredicateFieldMoreStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleQueryStringPredicateFieldMoreStepImpl.java @@ -16,9 +16,10 @@ import org.hibernate.search.engine.search.predicate.spi.CommonQueryStringPredicateBuilder; import org.hibernate.search.engine.search.predicate.spi.SimpleQueryStringPredicateBuilder; -class SimpleQueryStringPredicateFieldMoreStepImpl +class SimpleQueryStringPredicateFieldMoreStepImpl implements SimpleQueryStringPredicateFieldMoreStep< - SimpleQueryStringPredicateFieldMoreStepImpl, + SR, + SimpleQueryStringPredicateFieldMoreStepImpl, SimpleQueryStringPredicateOptionsStep> { private final CommonState commonState; @@ -33,12 +34,12 @@ class SimpleQueryStringPredicateFieldMoreStepImpl } @Override - public SimpleQueryStringPredicateFieldMoreStepImpl fields(String... fieldPaths) { - return new SimpleQueryStringPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public SimpleQueryStringPredicateFieldMoreStepImpl fields(String... fieldPaths) { + return new SimpleQueryStringPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); } @Override - public SimpleQueryStringPredicateFieldMoreStepImpl boost(float boost) { + public SimpleQueryStringPredicateFieldMoreStepImpl boost(float boost) { fieldStates.forEach( c -> c.boost( boost ) ); return this; } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleQueryStringPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleQueryStringPredicateFieldStepImpl.java index fa403ac0737..ca5a8e19e7c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleQueryStringPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SimpleQueryStringPredicateFieldStepImpl.java @@ -10,8 +10,8 @@ import org.hibernate.search.engine.search.predicate.dsl.SimpleQueryStringPredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -public final class SimpleQueryStringPredicateFieldStepImpl - implements SimpleQueryStringPredicateFieldStep> { +public final class SimpleQueryStringPredicateFieldStepImpl + implements SimpleQueryStringPredicateFieldStep> { private final SimpleQueryStringPredicateFieldMoreStepImpl.CommonState commonState; @@ -20,7 +20,7 @@ public SimpleQueryStringPredicateFieldStepImpl(SearchPredicateDslContext dslC } @Override - public SimpleQueryStringPredicateFieldMoreStep fields(String... fieldPaths) { - return new SimpleQueryStringPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public SimpleQueryStringPredicateFieldMoreStep fields(String... fieldPaths) { + return new SimpleQueryStringPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/TermsPredicateFieldMoreStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/TermsPredicateFieldMoreStepImpl.java index 50d25eaf088..c0fd0443a61 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/TermsPredicateFieldMoreStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/TermsPredicateFieldMoreStepImpl.java @@ -20,17 +20,17 @@ import org.hibernate.search.engine.search.predicate.spi.TermsPredicateBuilder; import org.hibernate.search.util.common.impl.Contracts; -class TermsPredicateFieldMoreStepImpl - implements TermsPredicateFieldMoreStep>, +class TermsPredicateFieldMoreStepImpl + implements TermsPredicateFieldMoreStep, TermsPredicateOptionsStep>, AbstractBooleanMultiFieldPredicateCommonState.FieldSetState { - private final CommonState commonState; + private final CommonState commonState; private final List predicateBuilders = new ArrayList<>(); private Float fieldSetBoost; - TermsPredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { + TermsPredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { this.commonState = commonState; this.commonState.add( this ); SearchIndexScope scope = commonState.scope(); @@ -40,12 +40,12 @@ class TermsPredicateFieldMoreStepImpl } @Override - public TermsPredicateFieldMoreStepImpl fields(String... fieldPaths) { - return new TermsPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public TermsPredicateFieldMoreStepImpl fields(String... fieldPaths) { + return new TermsPredicateFieldMoreStepImpl<>( commonState, Arrays.asList( fieldPaths ) ); } @Override - public TermsPredicateFieldMoreStepImpl boost(float boost) { + public TermsPredicateFieldMoreStepImpl boost(float boost) { this.fieldSetBoost = boost; return this; } @@ -70,9 +70,9 @@ public void contributePredicates(Consumer collector) { } } - static class CommonState - extends AbstractBooleanMultiFieldPredicateCommonState - implements TermsPredicateOptionsStep { + static class CommonState + extends AbstractBooleanMultiFieldPredicateCommonState, TermsPredicateFieldMoreStepImpl> + implements TermsPredicateOptionsStep> { CommonState(SearchPredicateDslContext dslContext) { super( dslContext ); @@ -82,7 +82,7 @@ private TermsPredicateOptionsStep matchingAny(Collection terms, ValueModel Contracts.assertNotNullNorEmpty( terms, "terms" ); Contracts.assertNotNull( valueModel, "valueModel" ); - for ( TermsPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + for ( TermsPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { for ( TermsPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { predicateBuilder.matchingAny( terms, valueModel ); } @@ -94,7 +94,7 @@ private TermsPredicateOptionsStep matchingAll(Collection terms, ValueModel Contracts.assertNotNullNorEmpty( terms, "terms" ); Contracts.assertNotNull( valueModel, "valueModel" ); - for ( TermsPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + for ( TermsPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { for ( TermsPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { predicateBuilder.matchingAll( terms, valueModel ); } @@ -103,7 +103,7 @@ private TermsPredicateOptionsStep matchingAll(Collection terms, ValueModel } @Override - protected CommonState thisAsS() { + protected CommonState thisAsS() { return this; } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/TermsPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/TermsPredicateFieldStepImpl.java index f0f25647db4..99da4d3b6ac 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/TermsPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/TermsPredicateFieldStepImpl.java @@ -10,16 +10,17 @@ import org.hibernate.search.engine.search.predicate.dsl.TermsPredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -public final class TermsPredicateFieldStepImpl implements TermsPredicateFieldStep> { +public final class TermsPredicateFieldStepImpl + implements TermsPredicateFieldStep> { - private final TermsPredicateFieldMoreStepImpl.CommonState commonState; + private final TermsPredicateFieldMoreStepImpl.CommonState commonState; public TermsPredicateFieldStepImpl(SearchPredicateDslContext dslContext) { - this.commonState = new TermsPredicateFieldMoreStepImpl.CommonState( dslContext ); + this.commonState = new TermsPredicateFieldMoreStepImpl.CommonState<>( dslContext ); } @Override - public TermsPredicateFieldMoreStep fields(String... fieldPaths) { - return new TermsPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public TermsPredicateFieldMoreStep fields(String... fieldPaths) { + return new TermsPredicateFieldMoreStepImpl<>( commonState, Arrays.asList( fieldPaths ) ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/WildcardPredicateFieldMoreStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/WildcardPredicateFieldMoreStepImpl.java index 6418cc07a7d..8c28fee9d88 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/WildcardPredicateFieldMoreStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/WildcardPredicateFieldMoreStepImpl.java @@ -18,17 +18,17 @@ import org.hibernate.search.engine.search.predicate.spi.WildcardPredicateBuilder; import org.hibernate.search.util.common.impl.Contracts; -class WildcardPredicateFieldMoreStepImpl - implements WildcardPredicateFieldMoreStep>, +class WildcardPredicateFieldMoreStepImpl + implements WildcardPredicateFieldMoreStep, WildcardPredicateOptionsStep>, AbstractBooleanMultiFieldPredicateCommonState.FieldSetState { - private final CommonState commonState; + private final CommonState commonState; private final List predicateBuilders = new ArrayList<>(); private Float fieldSetBoost; - WildcardPredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { + WildcardPredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { this.commonState = commonState; this.commonState.add( this ); SearchIndexScope scope = commonState.scope(); @@ -38,12 +38,12 @@ class WildcardPredicateFieldMoreStepImpl } @Override - public WildcardPredicateFieldMoreStepImpl fields(String... fieldPaths) { - return new WildcardPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public WildcardPredicateFieldMoreStepImpl fields(String... fieldPaths) { + return new WildcardPredicateFieldMoreStepImpl<>( commonState, Arrays.asList( fieldPaths ) ); } @Override - public WildcardPredicateFieldMoreStepImpl boost(float boost) { + public WildcardPredicateFieldMoreStepImpl boost(float boost) { this.fieldSetBoost = boost; return this; } @@ -63,9 +63,9 @@ public void contributePredicates(Consumer collector) { } } - static class CommonState - extends AbstractBooleanMultiFieldPredicateCommonState - implements WildcardPredicateOptionsStep { + static class CommonState + extends AbstractBooleanMultiFieldPredicateCommonState, WildcardPredicateFieldMoreStepImpl> + implements WildcardPredicateOptionsStep> { CommonState(SearchPredicateDslContext dslContext) { super( dslContext ); @@ -73,7 +73,7 @@ static class CommonState private WildcardPredicateOptionsStep matching(String wildcardPattern) { Contracts.assertNotNull( wildcardPattern, "wildcardPattern" ); - for ( WildcardPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + for ( WildcardPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { for ( WildcardPredicateBuilder predicateBuilder : fieldSetState.predicateBuilders ) { predicateBuilder.pattern( wildcardPattern ); } @@ -82,7 +82,7 @@ private WildcardPredicateOptionsStep matching(String wildcardPattern) { } @Override - protected CommonState thisAsS() { + protected CommonState thisAsS() { return this; } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/WildcardPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/WildcardPredicateFieldStepImpl.java index 240f95414f6..23d6c2b2719 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/WildcardPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/WildcardPredicateFieldStepImpl.java @@ -10,17 +10,17 @@ import org.hibernate.search.engine.search.predicate.dsl.WildcardPredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -public final class WildcardPredicateFieldStepImpl - implements WildcardPredicateFieldStep> { +public final class WildcardPredicateFieldStepImpl + implements WildcardPredicateFieldStep> { - private final WildcardPredicateFieldMoreStepImpl.CommonState commonState; + private final WildcardPredicateFieldMoreStepImpl.CommonState commonState; public WildcardPredicateFieldStepImpl(SearchPredicateDslContext dslContext) { - this.commonState = new WildcardPredicateFieldMoreStepImpl.CommonState( dslContext ); + this.commonState = new WildcardPredicateFieldMoreStepImpl.CommonState<>( dslContext ); } @Override - public WildcardPredicateFieldMoreStep fields(String... fieldPaths) { - return new WildcardPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public WildcardPredicateFieldMoreStep fields(String... fieldPaths) { + return new WildcardPredicateFieldMoreStepImpl<>( commonState, Arrays.asList( fieldPaths ) ); } } 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 32918df6d32..e77e2b52d0b 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 @@ -78,7 +78,7 @@ public AbstractSearchPredicateFactory(SearchPredicateDslContext dslContext) @Override public MatchAllPredicateOptionsStep matchAll() { - return new MatchAllPredicateOptionsStepImpl( dslContext, this ); + return new MatchAllPredicateOptionsStepImpl<>( dslContext, this ); } @Override @@ -93,45 +93,45 @@ public MatchIdPredicateMatchingStep id() { @Override public BooleanPredicateClausesStep bool() { - return new BooleanPredicateClausesStepImpl( dslContext, this ); + return new BooleanPredicateClausesStepImpl<>( dslContext, this ); } @Override public SimpleBooleanPredicateClausesStep and() { - return new SimpleBooleanPredicateClausesStepImpl( AND, dslContext, this ); + return new SimpleBooleanPredicateClausesStepImpl<>( AND, dslContext, this ); } @Override public SimpleBooleanPredicateOptionsStep and( SearchPredicate firstSearchPredicate, SearchPredicate... otherSearchPredicates) { - return new SimpleBooleanPredicateClausesStepImpl( AND, dslContext, this, firstSearchPredicate, + return new SimpleBooleanPredicateClausesStepImpl<>( AND, dslContext, this, firstSearchPredicate, otherSearchPredicates ); } @Override public SimpleBooleanPredicateOptionsStep and(PredicateFinalStep firstSearchPredicate, PredicateFinalStep... otherSearchPredicate) { - return new SimpleBooleanPredicateClausesStepImpl( AND, dslContext, this, firstSearchPredicate, + return new SimpleBooleanPredicateClausesStepImpl<>( AND, dslContext, this, firstSearchPredicate, otherSearchPredicate ); } @Override public SimpleBooleanPredicateClausesStep or() { - return new SimpleBooleanPredicateClausesStepImpl( OR, dslContext, this ); + return new SimpleBooleanPredicateClausesStepImpl<>( OR, dslContext, this ); } @Override public SimpleBooleanPredicateOptionsStep or(SearchPredicate firstSearchPredicate, SearchPredicate... otherSearchPredicate) { - return new SimpleBooleanPredicateClausesStepImpl( OR, dslContext, this, firstSearchPredicate, + return new SimpleBooleanPredicateClausesStepImpl<>( OR, dslContext, this, firstSearchPredicate, otherSearchPredicate ); } @Override public SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, PredicateFinalStep... otherSearchPredicate) { - return new SimpleBooleanPredicateClausesStepImpl( OR, dslContext, this, firstSearchPredicate, + return new SimpleBooleanPredicateClausesStepImpl<>( OR, dslContext, this, firstSearchPredicate, otherSearchPredicate ); } @@ -154,64 +154,64 @@ public PredicateFinalStep bool(Consumer match() { - return new MatchPredicateFieldStepImpl( dslContext ); + public MatchPredicateFieldStep match() { + return new MatchPredicateFieldStepImpl<>( dslContext ); } @Override - public RangePredicateFieldStep range() { - return new RangePredicateFieldStepImpl( dslContext ); + public RangePredicateFieldStep range() { + return new RangePredicateFieldStepImpl<>( dslContext ); } @Override - public PhrasePredicateFieldStep phrase() { - return new PhrasePredicateFieldStepImpl( dslContext ); + public PhrasePredicateFieldStep phrase() { + return new PhrasePredicateFieldStepImpl<>( dslContext ); } @Override - public WildcardPredicateFieldStep wildcard() { - return new WildcardPredicateFieldStepImpl( dslContext ); + public WildcardPredicateFieldStep wildcard() { + return new WildcardPredicateFieldStepImpl<>( dslContext ); } @Override - public PrefixPredicateFieldStep prefix() { - return new PrefixPredicateFieldStepImpl( dslContext ); + public PrefixPredicateFieldStep prefix() { + return new PrefixPredicateFieldStepImpl<>( dslContext ); } @Override - public RegexpPredicateFieldStep regexp() { - return new RegexpPredicateFieldStepImpl( dslContext ); + public RegexpPredicateFieldStep regexp() { + return new RegexpPredicateFieldStepImpl<>( dslContext ); } @Override - public TermsPredicateFieldStep terms() { - return new TermsPredicateFieldStepImpl( dslContext ); + public TermsPredicateFieldStep terms() { + return new TermsPredicateFieldStepImpl<>( dslContext ); } @Override @Deprecated(since = "6.2") public org.hibernate.search.engine.search.predicate.dsl.NestedPredicateFieldStep nested() { - return new org.hibernate.search.engine.search.predicate.dsl.impl.NestedPredicateFieldStepImpl( dslContext, this ); + return new org.hibernate.search.engine.search.predicate.dsl.impl.NestedPredicateFieldStepImpl<>( dslContext, this ); } @Override public NestedPredicateClausesStep nested(String objectFieldPath) { - return new NestedPredicateClausesStepImpl( dslContext, objectFieldPath, this ); + return new NestedPredicateClausesStepImpl<>( dslContext, objectFieldPath, this ); } @Override - public SimpleQueryStringPredicateFieldStep simpleQueryString() { - return new SimpleQueryStringPredicateFieldStepImpl( dslContext ); + public SimpleQueryStringPredicateFieldStep simpleQueryString() { + return new SimpleQueryStringPredicateFieldStepImpl<>( dslContext ); } @Override - public QueryStringPredicateFieldStep queryString() { - return new QueryStringPredicateFieldStepImpl( dslContext ); + public QueryStringPredicateFieldStep queryString() { + return new QueryStringPredicateFieldStepImpl<>( dslContext ); } @Override - public ExistsPredicateFieldStep exists() { - return new ExistsPredicateFieldStepImpl( dslContext ); + public ExistsPredicateFieldStep exists() { + return new ExistsPredicateFieldStepImpl<>( dslContext ); } @Override diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java index 77cb53fa767..93be4ba9969 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java @@ -4,6 +4,8 @@ */ package org.hibernate.search.engine.search.projection.dsl; +import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; + /** * A base interface for subtypes of {@link SearchProjectionFactory} allowing to * easily override the self type for all relevant methods. @@ -20,4 +22,9 @@ public interface ExtendedSearchProjectionFactory objectFieldReference) { + return withRoot( objectFieldReference.absolutePath() ); + } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java index c64952c750c..73428b5b19f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java @@ -14,6 +14,10 @@ import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.projection.ProjectionCollector; import org.hibernate.search.engine.search.projection.SearchProjection; +import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; +import org.hibernate.search.engine.search.reference.projection.DistanceProjectionFieldReference; +import org.hibernate.search.engine.search.reference.projection.FieldProjectionFieldReference; +import org.hibernate.search.engine.search.reference.projection.HighlightProjectionFieldReference; import org.hibernate.search.engine.spatial.GeoPoint; import org.hibernate.search.util.common.SearchException; import org.hibernate.search.util.common.annotation.Incubating; @@ -193,6 +197,18 @@ default FieldProjectionValueStep field(String fieldPath, */ FieldProjectionValueStep field(String fieldPath, ValueModel valueModel); + /** + * Project to the value of a field in the indexed document. + * + * @param fieldReference The reference representing the path to the index field whose value will be extracted. + * @param The resulting type of the projection. + * @return A DSL step where the "field" projection can be defined in more details. + */ + @Incubating + default FieldProjectionValueStep field(FieldProjectionFieldReference fieldReference) { + return field( fieldReference.absolutePath(), fieldReference.projectionType(), fieldReference.valueModel() ); + } + /** * Project on the score of the hit. * @@ -210,6 +226,20 @@ default FieldProjectionValueStep field(String fieldPath, */ DistanceToFieldProjectionValueStep distance(String fieldPath, GeoPoint center); + /** + * Project on the distance from the center to a {@link GeoPoint} field. + * + * @param fieldReference The reference representing the path to the index field containing the location + * to compute the distance from. + * @param center The center to compute the distance from. + * @return A DSL step where the "distance" projection can be defined in more details. + */ + @Incubating + default DistanceToFieldProjectionValueStep distance(DistanceProjectionFieldReference fieldReference, + GeoPoint center) { + return distance( fieldReference.absolutePath(), center ); + } + /** * Starts the definition of an object projection, * which will yield one value per object in a given object field, @@ -227,6 +257,26 @@ default FieldProjectionValueStep field(String fieldPath, */ CompositeProjectionInnerStep object(String objectFieldPath); + /** + * Starts the definition of an object projection, + * which will yield one value per object in a given object field, + * the value being the result of combining multiple given projections + * (usually on fields within the object field). + *

+ * Compared to the basic {@link #composite() composite projection}, + * an object projection is bound to a specific object field, + * and thus it yields zero, one or many values, as many as there are objects in the targeted object field. + * Therefore, you must take care of calling {@link CompositeProjectionValueStep#multi()} + * if the object field is multi-valued. + * + * @param objectFieldReference The reference representing the path to the object field whose object(s) will be extracted. + * @return A DSL step where the "composite" projection can be defined in more details. + */ + @Incubating + default CompositeProjectionInnerStep object(ObjectFieldReference objectFieldReference) { + return object( objectFieldReference.absolutePath() ); + } + /** * Starts the definition of a composite projection, * which will combine multiple given projections. @@ -471,6 +521,21 @@ ProjectionFinalStep withParameters( @Incubating SearchProjectionFactory withRoot(String objectFieldPath); + /** + * Create a new projection factory whose root for all paths passed to the DSL + * will be the given object field. + *

+ * This is used to call reusable methods that can apply the same projection + * on different object fields that have same structure (same sub-fields). + * + * @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root. + * @return A new projection factory using the given object field as root. + */ + @Incubating + default SearchProjectionFactory withRoot(ObjectFieldReference objectFieldReference) { + return withRoot( objectFieldReference.absolutePath() ); + } + /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. * @return The absolute path of the field, for use in native projections for example. @@ -487,4 +552,15 @@ ProjectionFinalStep withParameters( */ @Incubating HighlightProjectionOptionsStep highlight(String fieldPath); + + /** + * Project to highlights, i.e. sequences of text that matched the query, extracted from the given field's value. + * + * @param fieldReference The reference representing the path to the index field whose highlights will be extracted. + * @return A DSL step where the "highlight" projection can be defined in more details. + */ + @Incubating + default HighlightProjectionOptionsStep highlight(HighlightProjectionFieldReference fieldReference) { + return highlight( fieldReference.absolutePath() ); + } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java index 7f755ea6e02..27ba63af8ff 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java @@ -4,5 +4,5 @@ */ package org.hibernate.search.engine.search.reference.predicate; -public interface PrefixPredicateFieldReference extends TypedPredicateFieldReference { +public interface PrefixPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java index d113b50a25e..93012be9e5f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java @@ -4,5 +4,5 @@ */ package org.hibernate.search.engine.search.reference.predicate; -public interface RegexpPredicateFieldReference extends TypedPredicateFieldReference { +public interface RegexpPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java index 91deefa1342..596ab19939a 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java @@ -4,5 +4,5 @@ */ package org.hibernate.search.engine.search.reference.predicate; -public interface TermsPredicateFieldReference extends TypedPredicateFieldReference { +public interface TermsPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java index 226252be60f..c21aaadf675 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java @@ -4,5 +4,5 @@ */ package org.hibernate.search.engine.search.reference.predicate; -public interface WildcardPredicateFieldReference extends TypedPredicateFieldReference { +public interface WildcardPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java index c7f7747d16e..3ecbfe48c98 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java @@ -7,6 +7,8 @@ import java.util.function.Function; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; +import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; import org.hibernate.search.engine.spatial.GeoPoint; /** @@ -29,6 +31,11 @@ public interface ExtendedSearchSortFactory< @Override S withRoot(String objectFieldPath); + @Override + default S withRoot(ObjectFieldReference objectFieldReference) { + return withRoot( objectFieldReference.absolutePath() ); + } + @Override FieldSortOptionsStep field(String fieldPath); @@ -39,4 +46,15 @@ public interface ExtendedSearchSortFactory< default DistanceSortOptionsStep distance(String fieldPath, double latitude, double longitude) { return distance( fieldPath, GeoPoint.of( latitude, longitude ) ); } + + @Override + default DistanceSortOptionsStep distance(FieldSortFieldReference fieldReference, GeoPoint location) { + return distance( fieldReference.absolutePath(), location ); + } + + @Override + default DistanceSortOptionsStep distance(FieldSortFieldReference fieldReference, double latitude, + double longitude) { + return distance( fieldReference, GeoPoint.of( latitude, longitude ) ); + } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortMissingValueBehaviorGenericStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortMissingValueBehaviorGenericStep.java new file mode 100644 index 00000000000..62804eaee0e --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortMissingValueBehaviorGenericStep.java @@ -0,0 +1,68 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.sort.dsl; + +import org.hibernate.search.util.common.SearchException; + +/** + * The step in a sort definition where the behavior on missing values can be set. + * + * @param The type of the missing value to use. + * @param The type of the next step (returned by {@link FieldSortMissingValueBehaviorGenericStep#first()}, for example). + * + * @author Emmanuel Bernard emmanuel@hibernate.org + */ +public interface FieldSortMissingValueBehaviorGenericStep { + + /** + * Put documents with missing values last in the sorting. + * + *

This instruction is independent of whether the sort is being ascending + * or descending. + * + * @return The next step. + */ + N last(); + + /** + * Put documents with missing values first in the sorting. + * + *

This instruction is independent of whether the sort is being ascending + * or descending. + * + * @return The next step. + */ + N first(); + + /** + * Give documents with missing values the highest value when sorting. + *

+ * This puts documents with missing values last when using ascending order, + * or first when using descending order. + * + * @return The next step. + */ + N highest(); + + /** + * Give documents with missing values the lowest value when sorting. + *

+ * This puts documents with missing values first when using ascending order, + * or last when using descending order. + * + * @return The next step. + */ + N lowest(); + + /** + * When documents are missing a value on the sort field, use the given value instead. + * + * @param value The value to use as a default when a document is missing a value on the sort field. + * @return The next step. + * @throws SearchException If the field is not numeric. + */ + N use(T value); + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortMissingValueBehaviorStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortMissingValueBehaviorStep.java index a6c0b3c43c8..67a0be27b71 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortMissingValueBehaviorStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortMissingValueBehaviorStep.java @@ -14,47 +14,7 @@ * * @author Emmanuel Bernard emmanuel@hibernate.org */ -public interface FieldSortMissingValueBehaviorStep { - - /** - * Put documents with missing values last in the sorting. - * - *

This instruction is independent of whether the sort is being ascending - * or descending. - * - * @return The next step. - */ - N last(); - - /** - * Put documents with missing values first in the sorting. - * - *

This instruction is independent of whether the sort is being ascending - * or descending. - * - * @return The next step. - */ - N first(); - - /** - * Give documents with missing values the highest value when sorting. - *

- * This puts documents with missing values last when using ascending order, - * or first when using descending order. - * - * @return The next step. - */ - N highest(); - - /** - * Give documents with missing values the lowest value when sorting. - *

- * This puts documents with missing values first when using ascending order, - * or last when using descending order. - * - * @return The next step. - */ - N lowest(); +public interface FieldSortMissingValueBehaviorStep extends FieldSortMissingValueBehaviorGenericStep { /** * When documents are missing a value on the sort field, use the given value instead. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsGenericStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsGenericStep.java new file mode 100644 index 00000000000..a08a980aeaa --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsGenericStep.java @@ -0,0 +1,36 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.sort.dsl; + +import java.util.function.Function; + +import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; + +/** + * The initial and final step in a "field" sort definition, where optional parameters can be set. + * + * @param Scope root type. + * @param The "self" type (the actual exposed type of this step). + * @param The type of factory used to create predicates in {@link #filter(Function)}. + * + * @author Emmanuel Bernard emmanuel@hibernate.org + */ +public interface FieldSortOptionsGenericStep< + SR, + T, + S extends FieldSortOptionsGenericStep, + N extends FieldSortMissingValueBehaviorGenericStep, + PDF extends SearchPredicateFactory> + extends SortFinalStep, SortThenStep, SortOrderStep, SortModeStep, SortFilterStep { + + /** + * Start describing the behavior of this sort when a document doesn't + * have any value for the targeted field. + * + * @return The next step. + */ + N missing(); + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsStep.java index 6563f2a06b6..b4824133993 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/FieldSortOptionsStep.java @@ -18,14 +18,6 @@ * @author Emmanuel Bernard emmanuel@hibernate.org */ public interface FieldSortOptionsStep, PDF extends SearchPredicateFactory> - extends SortFinalStep, SortThenStep, SortOrderStep, SortModeStep, SortFilterStep { - - /** - * Start describing the behavior of this sort when a document doesn't - * have any value for the targeted field. - * - * @return The next step. - */ - FieldSortMissingValueBehaviorStep missing(); + extends FieldSortOptionsGenericStep, PDF> { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java index c1abade031f..153d28e5691 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java @@ -9,6 +9,8 @@ import org.hibernate.search.engine.search.common.NamedValues; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; +import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; import org.hibernate.search.engine.spatial.GeoPoint; import org.hibernate.search.util.common.SearchException; import org.hibernate.search.util.common.annotation.Incubating; @@ -62,6 +64,19 @@ public interface SearchSortFactory { */ FieldSortOptionsStep> field(String fieldPath); + /** + * Order elements by the value of a specific field. + *

+ * The default order is ascending. + * + * @param fieldReference The reference representing the path to the index field to sort by. + * @return A DSL step where the "field" sort can be defined in more details. + * @throws SearchException If the field doesn't exist or cannot be sorted on. + */ + @Incubating + FieldSortOptionsGenericStep> field( + FieldSortFieldReference fieldReference); + /** * Order elements by the distance from the location stored in the specified field to the location specified. *

@@ -75,6 +90,23 @@ public interface SearchSortFactory { */ DistanceSortOptionsStep> distance(String fieldPath, GeoPoint location); + /** + * Order elements by the distance from the location stored in the specified field to the location specified. + *

+ * The default order is ascending. + * + * @param fieldReference The reference representing the path to the index field + * containing the location to compute the distance from. + * @param location The location to which we want to compute the distance. + * @return A DSL step where the "distance" sort can be defined in more details. + * @throws SearchException If the field type does not constitute a valid location. + */ + @Incubating + default DistanceSortOptionsStep> distance( + FieldSortFieldReference fieldReference, GeoPoint location) { + return distance( fieldReference.absolutePath(), location ); + } + /** * Order elements by the distance from the location stored in the specified field to the location specified. *

@@ -92,6 +124,25 @@ public interface SearchSortFactory { return distance( fieldPath, GeoPoint.of( latitude, longitude ) ); } + /** + * Order elements by the distance from the location stored in the specified field to the location specified. + *

+ * The default order is ascending. + * + * @param fieldReference The reference representing the path to the index field + * containing the location to compute the distance from. + * @param latitude The latitude of the location to which we want to compute the distance. + * @param longitude The longitude of the location to which we want to compute the distance. + * @return A DSL step where the "distance" sort can be defined in more details. + * @throws SearchException If the field type does not constitute a valid location. + */ + @Incubating + default DistanceSortOptionsStep> distance( + FieldSortFieldReference fieldReference, double latitude, + double longitude) { + return distance( fieldReference, GeoPoint.of( latitude, longitude ) ); + } + /** * Order by a sort composed of several elements. *

@@ -173,6 +224,21 @@ public interface SearchSortFactory { @Incubating SearchSortFactory withRoot(String objectFieldPath); + /** + * Create a new sort factory whose root for all paths passed to the DSL + * will be the given object field. + *

+ * This is used to call reusable methods that can apply the same sort + * on different object fields that have same structure (same sub-fields). + * + * @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root. + * @return A new sort factory using the given object field as root. + */ + @Incubating + default SearchSortFactory withRoot(ObjectFieldReference objectFieldReference) { + return withRoot( objectFieldReference.absolutePath() ); + } + /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. * @return The absolute path of the field, for use in native sorts for example. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java new file mode 100644 index 00000000000..8ee6b0aac41 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java @@ -0,0 +1,112 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.sort.dsl.impl; + +import java.util.function.Function; + +import org.hibernate.search.engine.search.common.SortMode; +import org.hibernate.search.engine.search.common.ValueModel; +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.reference.sort.FieldSortFieldReference; +import org.hibernate.search.engine.search.sort.SearchSort; +import org.hibernate.search.engine.search.sort.dsl.FieldSortMissingValueBehaviorGenericStep; +import org.hibernate.search.engine.search.sort.dsl.FieldSortOptionsGenericStep; +import org.hibernate.search.engine.search.sort.dsl.SortOrder; +import org.hibernate.search.engine.search.sort.dsl.spi.AbstractSortThenStep; +import org.hibernate.search.engine.search.sort.dsl.spi.SearchSortDslContext; +import org.hibernate.search.engine.search.sort.spi.FieldSortBuilder; +import org.hibernate.search.engine.search.sort.spi.SortTypeKeys; + +public class FieldSortOptionsGenericStepImpl> + extends AbstractSortThenStep + implements + FieldSortOptionsGenericStep, + FieldSortOptionsGenericStepImpl, + PDF>, + FieldSortMissingValueBehaviorGenericStep> { + + private final SearchSortDslContext dslContext; + private final FieldSortBuilder builder; + private final ValueModel valueModel; + + public FieldSortOptionsGenericStepImpl(SearchSortDslContext dslContext, + FieldSortFieldReference fieldReference) { + super( dslContext ); + this.dslContext = dslContext; + this.builder = dslContext.scope().fieldQueryElement( fieldReference.absolutePath(), SortTypeKeys.FIELD ); + this.valueModel = fieldReference.valueModel(); + } + + @Override + public FieldSortOptionsGenericStepImpl order(SortOrder order) { + builder.order( order ); + return this; + } + + @Override + public FieldSortOptionsGenericStepImpl mode(SortMode mode) { + builder.mode( mode ); + return this; + } + + @Override + public FieldSortOptionsGenericStepImpl missing() { + return this; + } + + @Override + public FieldSortOptionsGenericStepImpl filter( + Function clauseContributor) { + SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); + + return filter( predicate ); + } + + @Override + public FieldSortOptionsGenericStepImpl filter(SearchPredicate searchPredicate) { + builder.filter( searchPredicate ); + return this; + } + + @Override + public FieldSortOptionsGenericStepImpl first() { + builder.missingFirst(); + return this; + } + + @Override + public FieldSortOptionsGenericStepImpl last() { + builder.missingLast(); + return this; + } + + @Override + public FieldSortOptionsGenericStepImpl highest() { + builder.missingHighest(); + return this; + } + + @Override + public FieldSortOptionsGenericStepImpl lowest() { + builder.missingLowest(); + return this; + } + + @Override + public FieldSortOptionsGenericStepImpl use(T value) { + builder.missingAs( value, valueModel ); + return this; + } + + @Override + protected SearchSort build() { + return builder.build(); + } + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java index d794a89eaf1..728fc24ac51 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java @@ -10,10 +10,12 @@ import org.hibernate.search.engine.common.dsl.spi.DslExtensionState; import org.hibernate.search.engine.search.common.NamedValues; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; import org.hibernate.search.engine.search.sort.SearchSort; import org.hibernate.search.engine.search.sort.dsl.CompositeSortComponentsStep; import org.hibernate.search.engine.search.sort.dsl.DistanceSortOptionsStep; import org.hibernate.search.engine.search.sort.dsl.ExtendedSearchSortFactory; +import org.hibernate.search.engine.search.sort.dsl.FieldSortOptionsGenericStep; import org.hibernate.search.engine.search.sort.dsl.FieldSortOptionsStep; import org.hibernate.search.engine.search.sort.dsl.ScoreSortOptionsStep; import org.hibernate.search.engine.search.sort.dsl.SearchSortFactoryExtension; @@ -22,6 +24,7 @@ import org.hibernate.search.engine.search.sort.dsl.SortThenStep; import org.hibernate.search.engine.search.sort.dsl.impl.CompositeSortComponentsStepImpl; import org.hibernate.search.engine.search.sort.dsl.impl.DistanceSortOptionsStepImpl; +import org.hibernate.search.engine.search.sort.dsl.impl.FieldSortOptionsGenericStepImpl; import org.hibernate.search.engine.search.sort.dsl.impl.FieldSortOptionsStepImpl; import org.hibernate.search.engine.search.sort.dsl.impl.ScoreSortOptionsStepImpl; import org.hibernate.search.engine.search.sort.dsl.impl.SearchSortFactoryExtensionStep; @@ -57,6 +60,12 @@ public SortThenStep indexOrder() { return new FieldSortOptionsStepImpl<>( dslContext, fieldPath ); } + @Override + public FieldSortOptionsGenericStep> field( + FieldSortFieldReference fieldReference) { + return new FieldSortOptionsGenericStepImpl<>( dslContext, fieldReference ); + } + @Override public DistanceSortOptionsStep distance(String fieldPath, GeoPoint location) { return new DistanceSortOptionsStepImpl<>( diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/MetricTemporalFieldsAggregationsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/MetricTemporalFieldsAggregationsIT.java index 8d0870808c8..090edb93a82 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/MetricTemporalFieldsAggregationsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/aggregation/MetricTemporalFieldsAggregationsIT.java @@ -62,7 +62,7 @@ void setup() { @Test void test_filteringResults() { StubMappingScope scope = mainIndex.createScope(); - SearchQueryOptionsStep options = scope.query() + SearchQueryOptionsStep options = scope.query() .where( f -> f.match().field( "style" ).matching( "bla" ) ); SearchQuery query = defineAggregations( options ); @@ -86,7 +86,7 @@ void test_filteringResults() { @Test void test_allResults() { StubMappingScope scope = mainIndex.createScope(); - SearchQueryOptionsStep options = scope.query() + SearchQueryOptionsStep options = scope.query() .where( f -> f.matchAll() ); SearchQuery query = defineAggregations( options ); @@ -108,7 +108,7 @@ void test_allResults() { } private SearchQuery defineAggregations( - SearchQueryOptionsStep options) { + SearchQueryOptionsStep options) { return options .aggregation( sumDates, f -> f.sum().field( "date", LocalDate.class ) ) .aggregation( sumConverted, f -> f.sum().field( "converted", String.class ) ) diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateBaseIT.java index 0b048cc000d..62806462fd8 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateBaseIT.java @@ -26,7 +26,7 @@ //CHECKSTYLE:OFF HideUtilityClassConstructor ignore the rule since it is a class with nested test classes. // cannot make a private constructor. -abstract class AbstractBaseQueryStringPredicateBaseIT

> { +abstract class AbstractBaseQueryStringPredicateBaseIT

> { //CHECKSTYLE:ON private static final List< @@ -119,7 +119,7 @@ private static CommonQueryStringPredicateTestValues testValues(FieldTypeDescr class SingleFieldIT extends SingleFieldConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -163,14 +163,14 @@ protected Map parameterValues(int matchingDocOrdinal, return Map.of( paramName, dataSet.values.matchingArg( matchingDocOrdinal ) ); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class MultiFieldIT extends MultiFieldConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -214,14 +214,14 @@ protected PredicateFinalStep predicateOnFieldAndFields(SearchPredicateFactory .matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class InObjectFieldIT extends InObjectFieldConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -256,14 +256,14 @@ protected PredicateFinalStep predicate(SearchPredicateFactory f, String field return predicate( f ).field( fieldPath ).matching( dataSet.values.matchingArg( matchingDocOrdinal ) ); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class AnalysisIT extends AnalysisConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -299,14 +299,14 @@ protected PredicateFinalStep predicateWithSkipAnalysis(SearchPredicateFactory return predicate( f ).field( fieldPath ).matching( matchingParam ).skipAnalysis(); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class ScoreIT extends ScoreConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -394,14 +394,14 @@ protected PredicateFinalStep predicateWithFieldLevelBoostAndPredicateLevelBoost( .boost( predicateBoost ); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class InvalidFieldIT extends InvalidFieldConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } @@ -427,14 +427,14 @@ protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { protected abstract String predicateTrait(); - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class UnsupportedTypeIT extends UnsupportedTypeConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } @@ -467,7 +467,7 @@ protected void tryPredicate(SearchPredicateFactory f, String fieldPath) { protected abstract String predicateTrait(); - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested @@ -475,7 +475,7 @@ class SearchableIT extends SearchableConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } @@ -515,14 +515,14 @@ protected void tryPredicate(SearchPredicateFactory f, String fieldPath, Field protected abstract String predicateTrait(); - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class ArgumentCheckingIT extends ArgumentCheckingConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } } @@ -548,14 +548,14 @@ protected void tryPredicateWithNullMatchingParam(SearchPredicateFactory f, St predicate( f ).field( fieldPath ).matching( null ); } - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } @Nested class TypeCheckingNoConversionIT extends TypeCheckingNoConversionConfigured { // JDK 11 does not allow static fields in non-static inner class and JUnit does not allow running @Nested tests in static inner classes... @Override - CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return AbstractBaseQueryStringPredicateBaseIT.this.predicate( f ); } @@ -613,7 +613,7 @@ protected PredicateFinalStep predicate(SearchPredicateFactory f, String field protected abstract String predicateTrait(); - abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); + abstract CommonQueryStringPredicateFieldStep predicate(SearchPredicateFactory f); } abstract P predicate(SearchPredicateFactory f); diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateSpecificsIT.java index cbe1f54f093..b68c6c0a57e 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/AbstractBaseQueryStringPredicateSpecificsIT.java @@ -44,7 +44,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -abstract class AbstractBaseQueryStringPredicateSpecificsIT

> { +abstract class AbstractBaseQueryStringPredicateSpecificsIT

> { protected static final String DOCUMENT_1 = "document1"; protected static final String DOCUMENT_2 = "document2"; diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateBaseIT.java index 0e0bbc2568d..411d9bb69e5 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateBaseIT.java @@ -9,11 +9,11 @@ //CHECKSTYLE:OFF HideUtilityClassConstructor ignore the rule since it is a class with nested test classes. // cannot make a private constructor. -class QueryStringPredicateBaseIT extends AbstractBaseQueryStringPredicateBaseIT> { +class QueryStringPredicateBaseIT extends AbstractBaseQueryStringPredicateBaseIT> { //CHECKSTYLE:ON @Override - QueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + QueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return f.queryString(); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateSpecificsIT.java index 1d8704902bd..86b3c6a6c00 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/QueryStringPredicateSpecificsIT.java @@ -32,7 +32,8 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -class QueryStringPredicateSpecificsIT extends AbstractBaseQueryStringPredicateSpecificsIT> { +class QueryStringPredicateSpecificsIT + extends AbstractBaseQueryStringPredicateSpecificsIT> { @ParameterizedTest @MethodSource("rewriteMethodOptions") @@ -472,7 +473,7 @@ public static List queryStringSyntax() { } @Override - QueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + QueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return f.queryString(); } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateBaseIT.java index 8c2a93075b2..5d53822afe7 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateBaseIT.java @@ -9,10 +9,11 @@ //CHECKSTYLE:OFF HideUtilityClassConstructor ignore the rule since it is a class with nested test classes. // cannot make a private constructor. -class SimpleQueryStringPredicateBaseIT extends AbstractBaseQueryStringPredicateBaseIT> { +class SimpleQueryStringPredicateBaseIT + extends AbstractBaseQueryStringPredicateBaseIT> { //CHECKSTYLE:ON @Override - SimpleQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + SimpleQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return f.simpleQueryString(); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateSpecificsIT.java index 6d043aad488..49e5e1a1cb2 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/predicate/SimpleQueryStringPredicateSpecificsIT.java @@ -35,7 +35,7 @@ import org.junit.jupiter.params.provider.MethodSource; class SimpleQueryStringPredicateSpecificsIT - extends AbstractBaseQueryStringPredicateSpecificsIT> { + extends AbstractBaseQueryStringPredicateSpecificsIT> { @Test @TestForIssue(jiraKey = "HSEARCH-2678") @@ -413,7 +413,7 @@ public static List simpleQueryStringSyntax() { } @Override - SimpleQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { + SimpleQueryStringPredicateFieldStep predicate(SearchPredicateFactory f) { return f.simpleQueryString(); } } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionMultiValuedAccumulatorBaseIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionMultiValuedAccumulatorBaseIT.java index b1f05619d73..9eebb96c335 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionMultiValuedAccumulatorBaseIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/DistanceProjectionMultiValuedAccumulatorBaseIT.java @@ -20,26 +20,26 @@ class DistanceProjectionMultiValuedAccumulatorBaseIT extends AbstractDistanceProjectionMultiValuedBaseIT { @Override - protected void addParameter(SearchQueryOptionsStep query, String parameterName, Object value) { + protected void addParameter(SearchQueryOptionsStep query, String parameterName, Object value) { // do nothing } @Override protected ProjectionFinalStep> distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, String parameterName) { return projection.distance( path, center ).collector( ProjectionCollector.list() ); } @Override protected ProjectionFinalStep> distance( - SearchProjectionFactory projection, String path, GeoPoint center, + SearchProjectionFactory projection, String path, GeoPoint center, DistanceUnit unit, String centerParam, String unitParam) { return projection.distance( path, center ).collector( ProjectionCollector.list() ).unit( unit ); } @Override - protected SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, + protected SortFinalStep sort(SearchSortFactory sort, String path, GeoPoint center, String parameterName) { return sort.distance( path, center ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionSpecificsIT.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionSpecificsIT.java index a21c881c49d..42f6f34fba9 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionSpecificsIT.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/search/projection/ObjectProjectionSpecificsIT.java @@ -43,7 +43,7 @@ static void setup() { @Test void nullFieldPath() { - assertThatThrownBy( () -> index.createScope().projection().object( null ) ) + assertThatThrownBy( () -> index.createScope().projection().object( (String) null ) ) .isInstanceOf( IllegalArgumentException.class ) .hasMessageContaining( "'objectFieldPath' must not be null" ); } diff --git a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/MetricAggregationsTestCase.java b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/MetricAggregationsTestCase.java index 700a122c48d..58dcf4ee8a6 100644 --- a/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/MetricAggregationsTestCase.java +++ b/integrationtest/backend/tck/src/main/java/org/hibernate/search/integrationtest/backend/tck/testsupport/operations/MetricAggregationsTestCase.java @@ -75,7 +75,7 @@ public Result testMetricsAggregation(StubMappingScope scope, SingleFieldI TestedFieldStructure.of( IndexFieldLocation.ROOT, IndexFieldValueCardinality.SINGLE_VALUED ), typeDescriptor ); Class javaClass = typeAssertionHelper.getJavaClass(); - SearchQueryOptionsStep step = scope.query() + SearchQueryOptionsStep step = scope.query() .where( SearchPredicateFactory::matchAll ) .aggregation( result.minKey, f -> f.min().field( fieldPath, javaClass, valueModel ) ) .aggregation( result.maxKey, f -> f.max().field( fieldPath, javaClass, valueModel ) ) diff --git a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsSimpleQueryStringQueryBuilder.java b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsSimpleQueryStringQueryBuilder.java index 425082583d9..04ceaf3dd57 100644 --- a/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsSimpleQueryStringQueryBuilder.java +++ b/v5migrationhelper/engine/src/main/java/org/hibernate/search/query/dsl/impl/ConnectedMultiFieldsSimpleQueryStringQueryBuilder.java @@ -55,8 +55,8 @@ public Query createQuery() { private SearchPredicate createPredicate() { SearchPredicateFactory factory = queryContext.getScope().predicate(); - SimpleQueryStringPredicateFieldStep fieldStep = factory.simpleQueryString(); - SimpleQueryStringPredicateFieldMoreStep fieldMoreStep = null; + SimpleQueryStringPredicateFieldStep fieldStep = factory.simpleQueryString(); + SimpleQueryStringPredicateFieldMoreStep fieldMoreStep = null; for ( FieldContext fieldContext : fieldsContext ) { fieldMoreStep = fieldContext.applyBoost( fieldStep.field( fieldContext.getField() ) ); } From 11e72d8f78ceb8526dc675cc8a448e538dc6fedd Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 9 May 2024 18:25:39 +0200 Subject: [PATCH 05/25] HSEARCH-3319 Simple test --- .../search/predicate/FieldReferenceIT.java | 449 ++++++++++++++++++ 1 file changed, 449 insertions(+) create mode 100644 documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java new file mode 100644 index 00000000000..e594f8b2366 --- /dev/null +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java @@ -0,0 +1,449 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.documentation.search.predicate; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.util.Arrays; +import java.util.function.Consumer; + +import jakarta.persistence.Entity; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Id; + +import org.hibernate.search.documentation.testsupport.BackendConfigurations; +import org.hibernate.search.documentation.testsupport.DocumentationSetupHelper; +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.engine.common.EntityReference; +import org.hibernate.search.engine.mapper.scope.SearchScopeProvider; +import org.hibernate.search.engine.search.common.ValueConvert; +import org.hibernate.search.engine.search.predicate.SearchPredicate; +import org.hibernate.search.engine.search.reference.RootReferenceScope; +import org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference; +import org.hibernate.search.engine.search.reference.projection.FieldProjectionFieldReference; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class FieldReferenceIT { + + @RegisterExtension + public DocumentationSetupHelper setupHelper = DocumentationSetupHelper.withSingleBackend( BackendConfigurations.simple() ); + + private EntityManagerFactory entityManagerFactory; + + @BeforeEach + void setup() { + entityManagerFactory = setupHelper.start().setup( EntityA.class, EntityB.class, EntityC.class, + Entity2A.class, Entity2B.class, Entity2C.class ); + initData(); + } + + @Test + void smoke() { + withinSearchSession( searchSession -> { + assertThat( + searchSession.search( EntityA_.scope ) + .select( f -> f.field( EntityA_.stringA ) ) + .where( f -> f.match().field( EntityA_.stringA ).matching( "a" ) ) + .fetchHits( 20 ) + ).containsOnly( "a" ); + + assertThat( + searchSession.search( EntityC_.scope ) + .select( f -> f.field( EntityC_.stringA ) ) + .where( f -> f.match().field( EntityC_.stringC ).matching( "c" ) ) + .fetchHits( 20 ) + ).containsOnly( "c" ); + + SearchScope scope = EntityB_union_EntityC_.scope.create( searchSession ); + + SearchPredicate searchPredicate = + scope.predicate().match().field( EntityB_union_EntityC_.stringA ).matching( "b" ).toPredicate(); + SearchPredicate searchPredicate2 = + scope.predicate().match().field( EntityB_union_EntityC_.stringB ).matching( "c" ).toPredicate(); + + assertThat( + searchSession.search( scope ) + .select( f -> f.field( EntityB_union_EntityC_.stringA ) ) + .where( searchPredicate ) + .fetchHits( 20 ) + ).containsOnly( "b" ); + + assertThat( + searchSession.search( scope ) + .select( f -> f.field( EntityB_union_EntityC_.stringA ) ) + .where( searchPredicate2 ) + .fetchHits( 20 ) + ).containsOnly( "c" ); + + } ); + } + + @Test + void smoke2() { + withinSearchSession( searchSession -> { + + SearchScope scope = Entity2A_union_Entity2B_.scope.create( searchSession ); + // while path is there, sure, the EntityB isn't in the scope + SearchPredicate searchPredicate = + scope.predicate().match().field( Entity2A_union_Entity2B_.stringA ).matching( "a" ).toPredicate(); + SearchPredicate searchPredicate2 = + scope.predicate().match().field( Entity2A_union_Entity2B_.stringA ).matching( "b" ).toPredicate(); + + assertThat( + searchSession.search( scope ) + // also wrong type here + .select( f -> f.field( Entity2A_union_Entity2B_.stringA ) ) + .where( searchPredicate ) + .fetchHits( 20 ) + ).containsOnly( "a" ); + + assertThat( + searchSession.search( scope ) + .select( f -> f.field( Entity2A_union_Entity2B_.stringA ) ) + .where( searchPredicate2 ) + .fetchHits( 20 ) + ).containsOnly( "b" ); + + } ); + } + + private void initData() { + with( entityManagerFactory ).runInTransaction( entityManager -> { + EntityA a = new EntityA(); + a.id = 1L; + a.stringA = "a"; + + EntityB b = new EntityB(); + b.id = 10L; + b.stringA = "b"; + b.stringB = "b"; + + EntityC c = new EntityC(); + c.id = 100L; + c.stringA = "c"; + c.stringB = "c"; + c.stringC = "c"; + + entityManager.persist( a ); + entityManager.persist( b ); + entityManager.persist( c ); + + Entity2A a2 = new Entity2A(); + a2.id = 2L; + a2.stringA = "a"; + + Entity2B b2 = new Entity2B(); + b2.id = 20L; + b2.stringA = "b"; + b2.stringB = "b"; + + Entity2C c2 = new Entity2C(); + c2.id = 200L; + c2.stringA = "c"; + c2.stringC = "c"; + + entityManager.persist( a2 ); + entityManager.persist( b2 ); + entityManager.persist( c2 ); + } ); + } + + @Indexed + @Entity + public static class EntityA { + @Id + Long id; + + @FullTextField(projectable = Projectable.YES) + String stringA; + + } + + @Entity + public static class EntityB extends EntityA { + + @FullTextField(projectable = Projectable.YES) + String stringB; + + } + + @Entity + public static class EntityC extends EntityB { + + @FullTextField(projectable = Projectable.YES) + String stringC; + + } + + public static class EntityA_ { + public static ValueFieldReference1 stringA; + + public static RootReferenceScope scope; + + static { + stringA = ValueFieldReference1.of( "stringA", EntityA_.class, String.class, String.class, String.class ); + + scope = RootReferenceScopeImpl.of( EntityA_.class, EntityA.class ); + } + } + + public static class EntityB_ { + public static ValueFieldReference1 stringA; + public static ValueFieldReference1 stringB; + + public static RootReferenceScope scope; + + static { + stringA = ValueFieldReference1.of( "stringA", EntityB_.class, String.class, String.class, String.class ); + stringB = ValueFieldReference1.of( "stringB", EntityB_.class, String.class, String.class, String.class ); + + scope = RootReferenceScopeImpl.of( EntityB_.class, EntityB.class ); + } + } + + public static class EntityC_ { + public static ValueFieldReference1 stringA; + public static ValueFieldReference1 stringB; + public static ValueFieldReference1 stringC; + + public static RootReferenceScope scope; + + static { + stringA = ValueFieldReference1.of( "stringA", EntityC_.class, String.class, String.class, String.class ); + stringB = ValueFieldReference1.of( "stringB", EntityC_.class, String.class, String.class, String.class ); + stringC = ValueFieldReference1.of( "stringC", EntityC_.class, String.class, String.class, String.class ); + + scope = RootReferenceScopeImpl.of( EntityC_.class, EntityC.class ); + } + } + + public static class EntityB_union_EntityC_ { + public static ValueFieldReference1 stringA; + public static ValueFieldReference1 stringB; + + public static RootReferenceScope scope; + + static { + stringA = ValueFieldReference1.of( "stringA", EntityB_union_EntityC_.class, String.class, String.class, + String.class ); + stringB = ValueFieldReference1.of( "stringB", EntityB_union_EntityC_.class, String.class, String.class, + String.class ); + + scope = RootReferenceScopeImpl.of( EntityB_union_EntityC_.class, EntityB.class, EntityC.class ); + } + } + + @Entity + @Indexed + public static class Entity2A { + @Id + Long id; + + @FullTextField(projectable = Projectable.YES) + String stringA; + } + + @Entity + @Indexed + public static class Entity2B { + @Id + Long id; + + @FullTextField(projectable = Projectable.YES) + String stringA; + + @FullTextField(projectable = Projectable.YES) + String stringB; + } + + @Entity + @Indexed + public static class Entity2C { + @Id + Long id; + + @FullTextField(projectable = Projectable.YES) + String stringA; + + @FullTextField(projectable = Projectable.YES) + String stringC; + } + + public static class Entity2A_union_Entity2B_ { + public static ValueFieldReference1 stringA; + + public static RootReferenceScope scope; + + static { + stringA = ValueFieldReference1.of( "stringA", Entity2A_union_Entity2B_.class, String.class, String.class, + String.class ); + scope = RootReferenceScopeImpl.of( Entity2A_union_Entity2B_.class, Entity2A.class, Entity2B.class ); + } + } + + public static class Entity2A_ { + public static ValueFieldReference1 stringA; + + public static RootReferenceScope scope; + + static { + stringA = ValueFieldReference1.of( "stringA", Entity2A_.class, String.class, String.class, String.class ); + + scope = RootReferenceScopeImpl.of( Entity2A_.class, Entity2A.class ); + } + } + + public static class Entity2B_ { + public static ValueFieldReference1 stringA; + public static ValueFieldReference1 stringB; + + public static RootReferenceScope scope; + + static { + stringA = ValueFieldReference1.of( "stringA", Entity2B_.class, String.class, String.class, String.class ); + stringB = ValueFieldReference1.of( "stringB", Entity2B_.class, String.class, String.class, String.class ); + + scope = RootReferenceScopeImpl.of( Entity2B_.class, Entity2B.class ); + } + } + + public static class Entity2C_ { + public static ValueFieldReference1 stringA; + public static ValueFieldReference1 stringC; + + public static RootReferenceScope scope; + + static { + stringA = ValueFieldReference1.of( "stringA", Entity2C_.class, String.class, String.class, String.class ); + stringC = ValueFieldReference1.of( "stringC", Entity2C_.class, String.class, String.class, String.class ); + + scope = RootReferenceScopeImpl.of( Entity2C_.class, Entity2C.class ); + } + } + + + public static class ValueFieldReference1 extends TypedFieldReference1 { + + public static ValueFieldReference1 of( + String path, + Class documentReferenceClass, + Class t, + Class v, + Class

p) { + return new ValueFieldReference1<>( path, documentReferenceClass, t, v, p ); + } + + private final TypedFieldReference1 noConverter; + private final TypedFieldReference1 string; + + public ValueFieldReference1(String absolutePath, Class containing, Class inputType, Class indexType, + Class

projectionType) { + super( absolutePath, ValueConvert.YES, containing, inputType, projectionType ); + this.noConverter = new TypedFieldReference1<>( absolutePath, ValueConvert.NO, containing, indexType, indexType ); + this.string = + new TypedFieldReference1<>( absolutePath, ValueConvert.PARSE, containing, String.class, String.class ); + } + + public TypedFieldReference1 noConverter() { + return noConverter; + } + + + public TypedFieldReference1 asString() { + return string; + } + + } + + public static class TypedFieldReference1 + implements FieldProjectionFieldReference, + MatchPredicateFieldReference { + + private final String absolutePath; + private final ValueConvert valueConvert; + private final Class containing; + private final Class input; + private final Class

projection; + + public TypedFieldReference1(String absolutePath, ValueConvert valueConvert, Class containing, Class input, + Class

projection) { + this.absolutePath = absolutePath; + this.valueConvert = valueConvert; + this.containing = containing; + this.input = input; + this.projection = projection; + } + + @Override + public String absolutePath() { + return absolutePath; + } + + @Override + public Class scopeRootType() { + return containing; + } + + @Override + public Class predicateType() { + return input; + } + + @Override + public ValueConvert valueConvert() { + return valueConvert; + } + + @Override + public Class

projectionType() { + return projection; + } + + } + + private static class RootReferenceScopeImpl implements RootReferenceScope { + + private final Class rootReferenceType; + private final Class[] entityClass; + + static RootReferenceScope of(Class rootReferenceType, Class... entityClass) { + return new RootReferenceScopeImpl<>( rootReferenceType, entityClass ); + } + + private RootReferenceScopeImpl(Class rootReferenceType, Class... entityClass) { + this.rootReferenceType = rootReferenceType; + this.entityClass = entityClass; + } + + @Override + public Class rootReferenceType() { + return rootReferenceType; + } + + @Override + public < + ER extends EntityReference, + S extends org.hibernate.search.engine.mapper.scope.SearchScope, + P extends SearchScopeProvider> S create(P scopeProvider) { + return (S) scopeProvider.scope( Arrays.asList( entityClass ) ); + } + } + + private void withinSearchSession(Consumer action) { + with( entityManagerFactory ).runInTransaction( entityManager -> { + SearchSession searchSession = Search.session( entityManager ); + action.accept( searchSession ); + } ); + } +} From b5edf0a285c7148af4a9b8d44a26ffa1343bafa7 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Wed, 15 May 2024 11:13:36 +0200 Subject: [PATCH 06/25] HSEARCH-3319 Address super-type references --- .../search/predicate/FieldReferenceIT.java | 17 +++++------ .../dsl/RangeAggregationFieldStep.java | 12 ++++++++ .../dsl/SearchAggregationFactory.java | 15 ++++++++++ .../dsl/TermsAggregationFieldStep.java | 13 +++++++++ .../dsl/ExistsPredicateFieldStep.java | 2 +- .../predicate/dsl/KnnPredicateFieldStep.java | 2 +- .../dsl/MatchPredicateFieldStep.java | 8 +++--- .../dsl/NestedPredicateFieldStep.java | 2 +- .../dsl/PhrasePredicateFieldMoreStep.java | 4 +-- .../dsl/PhrasePredicateFieldStep.java | 4 +-- .../dsl/RangePredicateFieldStep.java | 8 +++--- .../predicate/dsl/SearchPredicateFactory.java | 18 +++++++++++- .../AbstractMatchPredicateFieldMoreStep.java | 28 +++++++++++-------- .../AbstractRangePredicateFieldMoreStep.java | 26 +++++++++-------- .../dsl/impl/KnnPredicateFieldStepImpl.java | 2 +- .../dsl/impl/MatchPredicateFieldStepImpl.java | 4 +-- .../dsl/impl/RangePredicateFieldStepImpl.java | 4 +-- .../dsl/ExtendedSearchProjectionFactory.java | 2 +- .../dsl/SearchProjectionFactory.java | 11 ++++---- .../sort/dsl/ExtendedSearchSortFactory.java | 7 +++-- .../search/sort/dsl/SearchSortFactory.java | 8 +++--- .../impl/FieldSortOptionsGenericStepImpl.java | 2 +- .../dsl/spi/AbstractSearchSortFactory.java | 2 +- 23 files changed, 134 insertions(+), 67 deletions(-) diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java index e594f8b2366..0e29f4568f2 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java @@ -65,6 +65,13 @@ void smoke() { .fetchHits( 20 ) ).containsOnly( "c" ); + assertThat( + searchSession.search( EntityC_.scope ) + .select( f -> f.field( EntityC_.stringA ) ) + .where( f -> f.match().field( EntityC_.stringA ).matching( "c" ) ) + .fetchHits( 20 ) + ).containsOnly( "c" ); + SearchScope scope = EntityB_union_EntityC_.scope.create( searchSession ); SearchPredicate searchPredicate = @@ -198,30 +205,24 @@ public static class EntityA_ { } } - public static class EntityB_ { - public static ValueFieldReference1 stringA; + public static class EntityB_ extends EntityA_ { public static ValueFieldReference1 stringB; public static RootReferenceScope scope; static { - stringA = ValueFieldReference1.of( "stringA", EntityB_.class, String.class, String.class, String.class ); stringB = ValueFieldReference1.of( "stringB", EntityB_.class, String.class, String.class, String.class ); scope = RootReferenceScopeImpl.of( EntityB_.class, EntityB.class ); } } - public static class EntityC_ { - public static ValueFieldReference1 stringA; - public static ValueFieldReference1 stringB; + public static class EntityC_ extends EntityB_ { public static ValueFieldReference1 stringC; public static RootReferenceScope scope; static { - stringA = ValueFieldReference1.of( "stringA", EntityC_.class, String.class, String.class, String.class ); - stringB = ValueFieldReference1.of( "stringB", EntityC_.class, String.class, String.class, String.class ); stringC = ValueFieldReference1.of( "stringC", EntityC_.class, String.class, String.class, String.class ); scope = RootReferenceScopeImpl.of( EntityC_.class, EntityC.class ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java index 3cdcf612b27..ddc68a404e5 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java @@ -8,6 +8,7 @@ import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.aggregation.RangeAggregationFieldReference; /** * The initial step in a "range" aggregation definition, where the target field can be set. @@ -59,4 +60,15 @@ public interface RangeAggregationFieldStep RangeAggregationRangeStep field(String fieldPath, Class type, ValueModel valueModel); + /** + * Target the given field in the range aggregation. + * + * @param fieldReference The field reference representing a path to the index field to aggregate. + * @param The type of field values. + * @return The next step. + */ + default RangeAggregationRangeStep field(RangeAggregationFieldReference fieldReference) { + return field( fieldReference.absolutePath(), fieldReference.aggregationType(), fieldReference.valueModel() ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java index be5c0cbcc8f..16c5754c1b5 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java @@ -7,6 +7,7 @@ import java.util.function.Function; import org.hibernate.search.engine.search.common.NamedValues; +import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; import org.hibernate.search.util.common.SearchException; import org.hibernate.search.util.common.annotation.Incubating; @@ -146,6 +147,20 @@ AggregationFinalStep withParameters( @Incubating SearchAggregationFactory withRoot(String objectFieldPath); + /** + * Create a new aggregation factory whose root for all paths passed to the DSL + * will be the given object field. + *

+ * See here for more information. + * + * @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root. + * @return A new aggregation factory using the given object field as root. + */ + @Incubating + default SearchAggregationFactory withRoot(ObjectFieldReference objectFieldReference) { + return withRoot( objectFieldReference.absolutePath() ); + } + /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. * @return The absolute path of the field, for use in native aggregations for example. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java index 2e4efd7942a..5aa6ef6bdb0 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java @@ -9,6 +9,7 @@ import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.aggregation.TermsAggregationFieldReference; /** * The initial step in a "terms" aggregation definition, where the target field can be set. @@ -61,4 +62,16 @@ public interface TermsAggregationFieldStep TermsAggregationOptionsStep> field(String fieldPath, Class type, ValueModel valueModel); + /** + * Target the given field in the terms aggregation. + * + * @param fieldReference The field reference representing a path to the index field to aggregate. + * @param The type of field values. + * @return The next step. + */ + default TermsAggregationOptionsStep> field( + TermsAggregationFieldReference fieldReference) { + return field( fieldReference.absolutePath(), fieldReference.aggregationType(), fieldReference.valueModel() ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java index 5ede5750b5a..f04305db1bc 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java @@ -31,7 +31,7 @@ public interface ExistsPredicateFieldStep field) { + default N field(ExistsPredicateFieldReference field) { return field( field.absolutePath() ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java index b27e930d077..992b3c1cb2c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java @@ -20,5 +20,5 @@ public interface KnnPredicateFieldStep { */ KnnPredicateVectorStep field(String fieldPath); - KnnPredicateVectorGenericStep field(KnnPredicateFieldReference field); + KnnPredicateVectorGenericStep field(KnnPredicateFieldReference field); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java index 8639df440ab..270cbda2f1f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java @@ -59,8 +59,8 @@ default N field(String fieldPath) { * @return The next step. */ @SuppressWarnings("unchecked") - default MatchPredicateFieldMoreGenericStep> field( - MatchPredicateFieldReference fieldReference) { + default MatchPredicateFieldMoreGenericStep> field( + MatchPredicateFieldReference fieldReference) { return fields( fieldReference ); } @@ -80,6 +80,6 @@ default N field(String fieldPath) { * @see #field(MatchPredicateFieldReference) */ @SuppressWarnings("unchecked") - MatchPredicateFieldMoreGenericStep> fields( - MatchPredicateFieldReference... fieldReferences); + MatchPredicateFieldMoreGenericStep> fields( + MatchPredicateFieldReference... fieldReferences); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java index 606aa67b3a1..86ee7cb427d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java @@ -36,7 +36,7 @@ public interface NestedPredicateFieldStep field) { + default N objectField(NestedPredicateFieldReference field) { return objectField( field.absolutePath() ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java index cade7bc50eb..25a81dfba9e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java @@ -73,7 +73,7 @@ default S field(String fieldPath) { */ @Incubating @SuppressWarnings("unchecked") - default S field(PhrasePredicateFieldReference field) { + default S field(PhrasePredicateFieldReference field) { return fields( field ); } @@ -93,7 +93,7 @@ default S field(PhrasePredicateFieldReference field) { */ @Incubating @SuppressWarnings("unchecked") - default S fields(PhrasePredicateFieldReference... fields) { + default S fields(PhrasePredicateFieldReference... fields) { String[] paths = new String[fields.length]; for ( int i = 0; i < fields.length; i++ ) { paths[i] = fields[i].absolutePath(); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java index db7a8dd5507..d105409c21e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java @@ -72,7 +72,7 @@ default N field(String fieldPath) { */ @Incubating @SuppressWarnings("unchecked") - default N field(PhrasePredicateFieldReference field) { + default N field(PhrasePredicateFieldReference field) { return fields( field ); } @@ -95,7 +95,7 @@ default N field(PhrasePredicateFieldReference field) { */ @Incubating @SuppressWarnings("unchecked") - default N fields(PhrasePredicateFieldReference... fields) { + default N fields(PhrasePredicateFieldReference... fields) { String[] paths = new String[fields.length]; for ( int i = 0; i < fields.length; i++ ) { paths[i] = fields[i].absolutePath(); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java index cadc68e99da..f9565096bdc 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java @@ -64,8 +64,8 @@ default N field(String fieldPath) { * @return The next step. */ @SuppressWarnings("unchecked") - default RangePredicateFieldMoreGenericStep, T> field( - RangePredicateFieldReference field) { + default RangePredicateFieldMoreGenericStep, T> field( + RangePredicateFieldReference field) { return fields( field ); } @@ -85,7 +85,7 @@ default N field(String fieldPath) { * @see #field(RangePredicateFieldReference) */ @SuppressWarnings("unchecked") - RangePredicateFieldMoreGenericStep, T> fields( - RangePredicateFieldReference... fields); + RangePredicateFieldMoreGenericStep, T> fields( + RangePredicateFieldReference... fields); } 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 38e9004d46a..49464e4392d 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 @@ -11,6 +11,7 @@ import org.hibernate.search.engine.search.common.BooleanOperator; import org.hibernate.search.engine.search.common.NamedValues; import org.hibernate.search.engine.search.predicate.SearchPredicate; +import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; import org.hibernate.search.engine.search.reference.predicate.NestedPredicateFieldReference; import org.hibernate.search.util.common.SearchException; import org.hibernate.search.util.common.annotation.Incubating; @@ -254,7 +255,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where the "nested" predicate can be defined. * @see NestedPredicateFieldStep */ - default NestedPredicateClausesStep nested(NestedPredicateFieldReference field) { + default NestedPredicateClausesStep nested(NestedPredicateFieldReference field) { return nested( field.absolutePath() ); } @@ -375,6 +376,21 @@ PredicateFinalStep withParameters( @Incubating SearchPredicateFactory withRoot(String objectFieldPath); + /** + * Create a new predicate factory whose root for all paths passed to the DSL + * will be the given object field. + *

+ * This is used to call reusable methods that apply the same predicate + * on different object fields that have same structure (same sub-fields). + * + * @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root. + * @return A new predicate factory using the given object field as root. + */ + @Incubating + default SearchPredicateFactory withRoot(ObjectFieldReference objectFieldReference) { + return withRoot( objectFieldReference.absolutePath() ); + } + /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. * @return The absolute path of the field, for use in native predicates for example. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractMatchPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractMatchPredicateFieldMoreStep.java index a07a1286440..4e4ca7e1246 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractMatchPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractMatchPredicateFieldMoreStep.java @@ -47,11 +47,12 @@ abstract class AbstractMatchPredicateFieldMoreStep< ); } - public static MatchPredicateFieldMoreGenericStep> create( - SearchPredicateDslContext dslContext, MatchPredicateFieldReference[] fields) { + public static MatchPredicateFieldMoreGenericStep> create( + SearchPredicateDslContext dslContext, MatchPredicateFieldReference[] fields) { + List> fieldList = Arrays.asList( fields ); return new MatchPredicateFieldMoreStepFieldReference<>( dslContext, - Arrays.asList( fields ) + fieldList ); } @@ -152,31 +153,32 @@ private static class MatchPredicateFieldMoreStepFieldReference AbstractMatchPredicateFieldMoreStep, MatchPredicateFieldMoreStepFieldReference, T, - MatchPredicateFieldReference> + MatchPredicateFieldReference> implements MatchPredicateFieldMoreGenericStep, MatchPredicateFieldMoreStepFieldReference.CommonState, T, - MatchPredicateFieldReference> { + MatchPredicateFieldReference> { MatchPredicateFieldMoreStepFieldReference(SearchPredicateDslContext dslContext, - List> fieldPaths) { + List> fieldPaths) { super( new CommonState<>( dslContext ), fieldPaths ); } private MatchPredicateFieldMoreStepFieldReference(CommonState commonState, - List> fieldPaths) { + List> fieldPaths) { super( commonState, fieldPaths ); } @Override - public MatchPredicateFieldMoreStepFieldReference field(MatchPredicateFieldReference field) { + public MatchPredicateFieldMoreStepFieldReference field(MatchPredicateFieldReference field) { return new MatchPredicateFieldMoreStepFieldReference<>( commonState, Collections.singletonList( field ) ); } @Override @SuppressWarnings("unchecked") - public MatchPredicateFieldMoreStepFieldReference fields(MatchPredicateFieldReference... fieldPaths) { + public MatchPredicateFieldMoreStepFieldReference fields( + MatchPredicateFieldReference... fieldPaths) { return new MatchPredicateFieldMoreStepFieldReference<>( commonState, Arrays.asList( fieldPaths ) ); } @@ -191,13 +193,15 @@ protected MatchPredicateFieldMoreStepFieldReference thisAsS() { } @Override - protected String fieldPath(MatchPredicateFieldReference field) { + protected String fieldPath(MatchPredicateFieldReference field) { return field.absolutePath(); } private static class CommonState extends - GenericCommonState, MatchPredicateFieldMoreStepFieldReference> { + GenericCommonState, + MatchPredicateFieldMoreStepFieldReference> { CommonState(SearchPredicateDslContext dslContext) { super( dslContext ); } @@ -206,7 +210,7 @@ CommonState matching(T value) { Contracts.assertNotNull( value, "value" ); for ( MatchPredicateFieldMoreStepFieldReference fieldSetState : getFieldSetStates() ) { - for ( Map.Entry, + for ( Map.Entry, MatchPredicateBuilder> entry : fieldSetState.predicateBuilders .entrySet() ) { entry.getValue().value( value, entry.getKey().valueModel() ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractRangePredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractRangePredicateFieldMoreStep.java index 36c6e50ac23..9dcaf250c0c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractRangePredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractRangePredicateFieldMoreStep.java @@ -52,10 +52,11 @@ public static RangePredicateFieldMoreStepString create( } public static RangePredicateFieldMoreStepReference create( - SearchPredicateDslContext dslContext, RangePredicateFieldReference[] fields) { + SearchPredicateDslContext dslContext, RangePredicateFieldReference[] fields) { + List> fieldsList = Arrays.asList( fields ); return new RangePredicateFieldMoreStepReference<>( dslContext, - Arrays.asList( fields ) + fieldsList ); } @@ -156,26 +157,26 @@ private static class RangePredicateFieldMoreStepReference RangePredicateFieldMoreStepReference.CommonState, RangePredicateFieldMoreStepReference, T, - RangePredicateFieldReference> + RangePredicateFieldReference> implements RangePredicateFieldMoreGenericStep, RangePredicateFieldMoreStepReference.CommonState, - RangePredicateFieldReference, + RangePredicateFieldReference, T> { private RangePredicateFieldMoreStepReference(SearchPredicateDslContext dslContext, - List> fields) { + List> fields) { this( new CommonState<>( dslContext ), fields ); } private RangePredicateFieldMoreStepReference(CommonState commonState, - List> fields) { + List> fields) { super( commonState, fields ); } @Override - protected String fieldPath(RangePredicateFieldReference field) { + protected String fieldPath(RangePredicateFieldReference field) { return field.absolutePath(); } @@ -185,13 +186,13 @@ protected RangePredicateFieldMoreStepReference thisAsS() { } @Override - public RangePredicateFieldMoreStepReference field(RangePredicateFieldReference field) { + public RangePredicateFieldMoreStepReference field(RangePredicateFieldReference field) { return new RangePredicateFieldMoreStepReference<>( commonState, List.of( field ) ); } @Override @SuppressWarnings("unchecked") - public RangePredicateFieldMoreStepReference fields(RangePredicateFieldReference... fields) { + public RangePredicateFieldMoreStepReference fields(RangePredicateFieldReference... fields) { return new RangePredicateFieldMoreStepReference<>( commonState, Arrays.asList( fields ) ); } @@ -208,13 +209,16 @@ public CommonState withinAny(Collection> ranges, Value public static class CommonState extends - GenericCommonState, RangePredicateFieldMoreStepReference> { + GenericCommonState, + RangePredicateFieldMoreStepReference> { CommonState(SearchPredicateDslContext dslContext) { super( dslContext ); } @Override - protected String fieldPath(RangePredicateFieldReference field) { + protected String fieldPath(RangePredicateFieldReference field) { return field.absolutePath(); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java index 431a5e96eee..2d384905654 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/KnnPredicateFieldStepImpl.java @@ -43,7 +43,7 @@ public KnnPredicateVectorStep field(String fieldPath) { } @Override - public KnnPredicateVectorGenericStep field(KnnPredicateFieldReference field) { + public KnnPredicateVectorGenericStep field(KnnPredicateFieldReference field) { this.field( field.absolutePath() ); return new KnnPredicateVectorGenericStepImpl<>(); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldStepImpl.java index 0e83e9e9987..7d0f999e5db 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/MatchPredicateFieldStepImpl.java @@ -25,8 +25,8 @@ public MatchPredicateFieldStepImpl(SearchPredicateDslContext dslContext) { @Override @SuppressWarnings("unchecked") - public MatchPredicateFieldMoreGenericStep> fields( - MatchPredicateFieldReference... fields) { + public MatchPredicateFieldMoreGenericStep> fields( + MatchPredicateFieldReference... fields) { return AbstractMatchPredicateFieldMoreStep.create( dslContext, fields ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldStepImpl.java index eb752a5b15d..9899e153264 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/RangePredicateFieldStepImpl.java @@ -27,8 +27,8 @@ public RangePredicateFieldStepImpl(SearchPredicateDslContext dslContext) { @Override @SuppressWarnings("unchecked") - public RangePredicateFieldMoreGenericStep, T> fields( - RangePredicateFieldReference... fields) { + public RangePredicateFieldMoreGenericStep, T> fields( + RangePredicateFieldReference... fields) { return AbstractRangePredicateFieldMoreStep.create( dslContext, fields ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java index 93be4ba9969..c22521ee238 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java @@ -24,7 +24,7 @@ public interface ExtendedSearchProjectionFactory objectFieldReference) { + default S withRoot(ObjectFieldReference objectFieldReference) { return withRoot( objectFieldReference.absolutePath() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java index 73428b5b19f..716060c2613 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java @@ -205,7 +205,7 @@ default FieldProjectionValueStep field(String fieldPath, * @return A DSL step where the "field" projection can be defined in more details. */ @Incubating - default FieldProjectionValueStep field(FieldProjectionFieldReference fieldReference) { + default FieldProjectionValueStep field(FieldProjectionFieldReference fieldReference) { return field( fieldReference.absolutePath(), fieldReference.projectionType(), fieldReference.valueModel() ); } @@ -235,7 +235,8 @@ default FieldProjectionValueStep field(FieldProjectionFieldReference distance(DistanceProjectionFieldReference fieldReference, + default DistanceToFieldProjectionValueStep distance( + DistanceProjectionFieldReference fieldReference, GeoPoint center) { return distance( fieldReference.absolutePath(), center ); } @@ -273,7 +274,7 @@ default DistanceToFieldProjectionValueStep distance(DistanceProjectio * @return A DSL step where the "composite" projection can be defined in more details. */ @Incubating - default CompositeProjectionInnerStep object(ObjectFieldReference objectFieldReference) { + default CompositeProjectionInnerStep object(ObjectFieldReference objectFieldReference) { return object( objectFieldReference.absolutePath() ); } @@ -532,7 +533,7 @@ ProjectionFinalStep withParameters( * @return A new projection factory using the given object field as root. */ @Incubating - default SearchProjectionFactory withRoot(ObjectFieldReference objectFieldReference) { + default SearchProjectionFactory withRoot(ObjectFieldReference objectFieldReference) { return withRoot( objectFieldReference.absolutePath() ); } @@ -560,7 +561,7 @@ default SearchProjectionFactory withRoot(ObjectFieldReference obje * @return A DSL step where the "highlight" projection can be defined in more details. */ @Incubating - default HighlightProjectionOptionsStep highlight(HighlightProjectionFieldReference fieldReference) { + default HighlightProjectionOptionsStep highlight(HighlightProjectionFieldReference fieldReference) { return highlight( fieldReference.absolutePath() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java index 3ecbfe48c98..c6517e6a272 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java @@ -32,7 +32,7 @@ public interface ExtendedSearchSortFactory< S withRoot(String objectFieldPath); @Override - default S withRoot(ObjectFieldReference objectFieldReference) { + default S withRoot(ObjectFieldReference objectFieldReference) { return withRoot( objectFieldReference.absolutePath() ); } @@ -48,12 +48,13 @@ default S withRoot(ObjectFieldReference objectFieldReference) { } @Override - default DistanceSortOptionsStep distance(FieldSortFieldReference fieldReference, GeoPoint location) { + default DistanceSortOptionsStep distance(FieldSortFieldReference fieldReference, + GeoPoint location) { return distance( fieldReference.absolutePath(), location ); } @Override - default DistanceSortOptionsStep distance(FieldSortFieldReference fieldReference, double latitude, + default DistanceSortOptionsStep distance(FieldSortFieldReference fieldReference, double latitude, double longitude) { return distance( fieldReference, GeoPoint.of( latitude, longitude ) ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java index 153d28e5691..07855156cba 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java @@ -75,7 +75,7 @@ public interface SearchSortFactory { */ @Incubating FieldSortOptionsGenericStep> field( - FieldSortFieldReference fieldReference); + FieldSortFieldReference fieldReference); /** * Order elements by the distance from the location stored in the specified field to the location specified. @@ -103,7 +103,7 @@ public interface SearchSortFactory { */ @Incubating default DistanceSortOptionsStep> distance( - FieldSortFieldReference fieldReference, GeoPoint location) { + FieldSortFieldReference fieldReference, GeoPoint location) { return distance( fieldReference.absolutePath(), location ); } @@ -138,7 +138,7 @@ public interface SearchSortFactory { */ @Incubating default DistanceSortOptionsStep> distance( - FieldSortFieldReference fieldReference, double latitude, + FieldSortFieldReference fieldReference, double latitude, double longitude) { return distance( fieldReference, GeoPoint.of( latitude, longitude ) ); } @@ -235,7 +235,7 @@ public interface SearchSortFactory { * @return A new sort factory using the given object field as root. */ @Incubating - default SearchSortFactory withRoot(ObjectFieldReference objectFieldReference) { + default SearchSortFactory withRoot(ObjectFieldReference objectFieldReference) { return withRoot( objectFieldReference.absolutePath() ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java index 8ee6b0aac41..d09455472c6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java @@ -36,7 +36,7 @@ public class FieldSortOptionsGenericStepImpl dslContext, - FieldSortFieldReference fieldReference) { + FieldSortFieldReference fieldReference) { super( dslContext ); this.dslContext = dslContext; this.builder = dslContext.scope().fieldQueryElement( fieldReference.absolutePath(), SortTypeKeys.FIELD ); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java index 728fc24ac51..46a191bbfdf 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java @@ -62,7 +62,7 @@ public SortThenStep indexOrder() { @Override public FieldSortOptionsGenericStep> field( - FieldSortFieldReference fieldReference) { + FieldSortFieldReference fieldReference) { return new FieldSortOptionsGenericStepImpl<>( dslContext, fieldReference ); } From 98226f8c35c15eed6e6730e91f93ce0fcfb85ee3 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 16 May 2024 16:05:50 +0200 Subject: [PATCH 07/25] HSEARCH-3319 Use mapper specific root-scope-creators --- .../search/predicate/FieldReferenceIT.java | 33 +++-- .../engine/mapper/scope/SearchScope.java | 127 ------------------ .../mapper/scope/SearchScopeProvider.java | 74 ---------- .../search/reference/RootReferenceScope.java | 7 +- .../scope/HibernateOrmRootReferenceScope.java | 14 ++ .../search/mapper/orm/scope/SearchScope.java | 2 +- .../mapper/orm/scope/SearchScopeProvider.java | 4 +- .../mapper/orm/session/SearchSession.java | 4 +- .../session/impl/DelegatingSearchSession.java | 4 +- .../impl/HibernateOrmSearchSession.java | 7 +- .../pojo/standalone/scope/SearchScope.java | 2 +- .../standalone/scope/SearchScopeProvider.java | 3 +- .../StandalonePojoRootReferenceScope.java | 14 ++ .../standalone/session/SearchSession.java | 4 +- .../impl/StandalonePojoSearchSession.java | 7 +- 15 files changed, 62 insertions(+), 244 deletions(-) delete mode 100644 engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java delete mode 100644 engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java create mode 100644 mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/HibernateOrmRootReferenceScope.java create mode 100644 mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/StandalonePojoRootReferenceScope.java diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java index 0e29f4568f2..74c99cd5bd9 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java @@ -17,15 +17,14 @@ import org.hibernate.search.documentation.testsupport.BackendConfigurations; import org.hibernate.search.documentation.testsupport.DocumentationSetupHelper; import org.hibernate.search.engine.backend.types.Projectable; -import org.hibernate.search.engine.common.EntityReference; -import org.hibernate.search.engine.mapper.scope.SearchScopeProvider; import org.hibernate.search.engine.search.common.ValueConvert; import org.hibernate.search.engine.search.predicate.SearchPredicate; -import org.hibernate.search.engine.search.reference.RootReferenceScope; import org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference; import org.hibernate.search.engine.search.reference.projection.FieldProjectionFieldReference; import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.scope.HibernateOrmRootReferenceScope; import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.scope.SearchScopeProvider; import org.hibernate.search.mapper.orm.session.SearchSession; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; @@ -196,7 +195,7 @@ public static class EntityC extends EntityB { public static class EntityA_ { public static ValueFieldReference1 stringA; - public static RootReferenceScope scope; + public static HibernateOrmRootReferenceScope scope; static { stringA = ValueFieldReference1.of( "stringA", EntityA_.class, String.class, String.class, String.class ); @@ -208,7 +207,7 @@ public static class EntityA_ { public static class EntityB_ extends EntityA_ { public static ValueFieldReference1 stringB; - public static RootReferenceScope scope; + public static HibernateOrmRootReferenceScope scope; static { stringB = ValueFieldReference1.of( "stringB", EntityB_.class, String.class, String.class, String.class ); @@ -220,7 +219,7 @@ public static class EntityB_ extends EntityA_ { public static class EntityC_ extends EntityB_ { public static ValueFieldReference1 stringC; - public static RootReferenceScope scope; + public static HibernateOrmRootReferenceScope scope; static { stringC = ValueFieldReference1.of( "stringC", EntityC_.class, String.class, String.class, String.class ); @@ -233,7 +232,7 @@ public static class EntityB_union_EntityC_ { public static ValueFieldReference1 stringA; public static ValueFieldReference1 stringB; - public static RootReferenceScope scope; + public static HibernateOrmRootReferenceScope scope; static { stringA = ValueFieldReference1.of( "stringA", EntityB_union_EntityC_.class, String.class, String.class, @@ -284,7 +283,7 @@ public static class Entity2C { public static class Entity2A_union_Entity2B_ { public static ValueFieldReference1 stringA; - public static RootReferenceScope scope; + public static HibernateOrmRootReferenceScope scope; static { stringA = ValueFieldReference1.of( "stringA", Entity2A_union_Entity2B_.class, String.class, String.class, @@ -296,7 +295,7 @@ public static class Entity2A_union_Entity2B_ { public static class Entity2A_ { public static ValueFieldReference1 stringA; - public static RootReferenceScope scope; + public static HibernateOrmRootReferenceScope scope; static { stringA = ValueFieldReference1.of( "stringA", Entity2A_.class, String.class, String.class, String.class ); @@ -309,7 +308,7 @@ public static class Entity2B_ { public static ValueFieldReference1 stringA; public static ValueFieldReference1 stringB; - public static RootReferenceScope scope; + public static HibernateOrmRootReferenceScope scope; static { stringA = ValueFieldReference1.of( "stringA", Entity2B_.class, String.class, String.class, String.class ); @@ -323,7 +322,7 @@ public static class Entity2C_ { public static ValueFieldReference1 stringA; public static ValueFieldReference1 stringC; - public static RootReferenceScope scope; + public static HibernateOrmRootReferenceScope scope; static { stringA = ValueFieldReference1.of( "stringA", Entity2C_.class, String.class, String.class, String.class ); @@ -413,12 +412,13 @@ public Class

projectionType() { } - private static class RootReferenceScopeImpl implements RootReferenceScope { + private static class RootReferenceScopeImpl implements HibernateOrmRootReferenceScope { private final Class rootReferenceType; private final Class[] entityClass; - static RootReferenceScope of(Class rootReferenceType, Class... entityClass) { + static HibernateOrmRootReferenceScope of(Class rootReferenceType, + Class... entityClass) { return new RootReferenceScopeImpl<>( rootReferenceType, entityClass ); } @@ -433,11 +433,8 @@ public Class rootReferenceType() { } @Override - public < - ER extends EntityReference, - S extends org.hibernate.search.engine.mapper.scope.SearchScope, - P extends SearchScopeProvider> S create(P scopeProvider) { - return (S) scopeProvider.scope( Arrays.asList( entityClass ) ); + public SearchScope create(SearchScopeProvider scopeProvider) { + return scopeProvider.scope( Arrays.asList( entityClass ) ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java deleted file mode 100644 index f896f9b8ebc..00000000000 --- a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScope.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.engine.mapper.scope; - -import java.util.function.Function; - -import org.hibernate.search.engine.backend.scope.IndexScopeExtension; -import org.hibernate.search.engine.common.EntityReference; -import org.hibernate.search.engine.search.aggregation.AggregationKey; -import org.hibernate.search.engine.search.aggregation.SearchAggregation; -import org.hibernate.search.engine.search.aggregation.dsl.SearchAggregationFactory; -import org.hibernate.search.engine.search.highlighter.dsl.SearchHighlighterFactory; -import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory; -import org.hibernate.search.engine.search.query.dsl.SearchQueryOptionsStep; -import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; -import org.hibernate.search.engine.search.query.dsl.SearchQueryWhereStep; -import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory; -import org.hibernate.search.util.common.SearchException; - -/** - * Represents a set of types and the corresponding indexes. - *

- * The scope can be used for search, to build search-related objects (predicate, sort, projection, aggregation, ...), - * or to define the targeted entities/indexes - * when passing it to the search session. - * - * @param Scope root type. - * @param A supertype of all types in this scope. - * @param The type of entity reference used by the scope. - */ -public interface SearchScope { - - /** - * Initiate the building of a search predicate. - *

- * The predicate will only be valid for search queries - * created using this scope or another scope instance targeting the same indexes. - *

- * Note this method is only necessary if you do not want to use lambda expressions, - * since you can {@link SearchQueryWhereStep#where(Function) define predicates with lambdas} - * within the search query DSL, - * removing the need to create separate objects to represent the predicates. - * - * @return A predicate factory. - * @see SearchPredicateFactory - */ - SearchPredicateFactory predicate(); - - /** - * Initiate the building of a search sort. - *

- * The sort will only be valid for search queries - * created using this scope or another scope instance targeting the same indexes. - * or a wider scope. - *

- * Note this method is only necessary if you do not want to use lambda expressions, - * since you can {@link SearchQueryOptionsStep#sort(Function) define sorts with lambdas} - * within the search query DSL, - * removing the need to create separate objects to represent the sorts. - * - * @return A sort factory. - * @see SearchSortFactory - */ - SearchSortFactory sort(); - - /** - * Initiate the building of a search projection that will be valid for the indexes in this scope. - *

- * The projection will only be valid for search queries - * created using this scope or another scope instance targeting the same indexes. - *

- * Note this method is only necessary if you do not want to use lambda expressions, - * since you can {@link SearchQuerySelectStep#select(Function)} define projections with lambdas} - * within the search query DSL, - * removing the need to create separate objects to represent the projections. - * - * @return A projection factory. - * @see SearchProjectionFactory - */ - SearchProjectionFactory projection(); - - /** - * Initiate the building of a search aggregation that will be valid for the indexes in this scope. - *

- * The aggregation will only be usable in search queries - * created using this scope or another scope instance targeting the same indexes. - *

- * Note this method is only necessary if you do not want to use lambda expressions, - * since you can {@link SearchQueryOptionsStep#aggregation(AggregationKey, SearchAggregation)} define aggregations with lambdas} - * within the search query DSL, - * removing the need to create separate objects to represent the aggregation. - * - * @return An aggregation factory. - * @see SearchAggregationFactory - */ - SearchAggregationFactory aggregation(); - - /** - * Initiate the building of a highlighter that will be valid for the indexes in this scope. - *

- * The highlighter will only be valid for search queries - * created using this scope or another scope instance targeting the same indexes. - *

- * Note this method is only necessary if you do not want to use lambda expressions, - * since you can {@link SearchQueryOptionsStep#highlighter(Function) define highlighters with lambdas} - * within the search query DSL, - * removing the need to create separate objects to represent the projections. - * - * @return A highlighter factory. - */ - SearchHighlighterFactory highlighter(); - - /** - * Extend the current search scope with the given extension, - * resulting in an extended search scope offering backend-specific utilities. - * - * @param extension The extension to apply. - * @param The type of search scope provided by the extension. - * @return The extended search scope. - * @throws SearchException If the extension cannot be applied (wrong underlying technology, ...). - */ - T extension(IndexScopeExtension extension); - -} diff --git a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java b/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java deleted file mode 100644 index a9e26b8b182..00000000000 --- a/engine/src/main/java/org/hibernate/search/engine/mapper/scope/SearchScopeProvider.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.engine.mapper.scope; - -import java.util.Collection; -import java.util.Collections; - -import org.hibernate.search.engine.common.EntityReference; - -/** - * A provider of {@link SearchScope} instances. - */ -public interface SearchScopeProvider { - - /** - * Creates a {@link SearchScope} limited to - * indexed entity types among the given class and its subtypes. - * - * @param clazz A class that must be an indexed entity type or a supertype of such type. - * @param Scope root type. - * @param A supertype of all indexed entity types to include in the scope. - * @return The created scope. - * @see SearchScope - */ - default SearchScope scope(Class clazz) { - return scope( Collections.singleton( clazz ) ); - } - - /** - * Creates a {@link SearchScope} limited to - * indexed entity types among the given classes and their subtypes. - * - * @param classes A collection of classes. - * Each must be an indexed entity type or a supertype of such type. - * @param Scope root type. - * @param A supertype of all indexed entity types to include in the scope. - * @return The created scope. - * @see SearchScope - */ - SearchScope scope(Collection> classes); - - /** - * Creates a {@link SearchScope} limited to - * indexed entity types among the entity with the given name and its subtypes. - * - * @param expectedSuperType A supertype of all entity types to include in the scope. - * @param entityName An entity name. - * The referenced entity type must be an indexed entity type or a supertype of such type. - * @param Scope root type. - * @param A supertype of all indexed entity types to include in the scope. - * @return The created scope. - * @see SearchScope - */ - default SearchScope scope(Class expectedSuperType, String entityName) { - return scope( expectedSuperType, Collections.singleton( entityName ) ); - } - - /** - * Creates a {@link SearchScope} limited to - * indexed entity types among the entities with the given names and their subtypes. - * - * @param expectedSuperType A supertype of all indexed entity types to include in the scope. - * @param entityNames A collection of entity names. - * Each entity type referenced in the collection must be an indexed entity type or a supertype of such type. - * @param Scope root type. - * @param A supertype of all indexed entity types to include in the scope. - * @return The created scope. - * @see SearchScope - */ - SearchScope scope(Class expectedSuperType, Collection entityNames); - -} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java index 8ac205a416d..7ff66964592 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/RootReferenceScope.java @@ -4,12 +4,9 @@ */ package org.hibernate.search.engine.search.reference; -import org.hibernate.search.engine.common.EntityReference; -import org.hibernate.search.engine.mapper.scope.SearchScope; -import org.hibernate.search.engine.mapper.scope.SearchScopeProvider; +import org.hibernate.search.util.common.annotation.Incubating; +@Incubating public interface RootReferenceScope { Class rootReferenceType(); - - , P extends SearchScopeProvider> S create(P scopeProvider); } diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/HibernateOrmRootReferenceScope.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/HibernateOrmRootReferenceScope.java new file mode 100644 index 00000000000..cd89a38c125 --- /dev/null +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/HibernateOrmRootReferenceScope.java @@ -0,0 +1,14 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.mapper.orm.scope; + +import org.hibernate.search.engine.search.reference.RootReferenceScope; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating +public interface HibernateOrmRootReferenceScope extends RootReferenceScope { + + SearchScope create(SearchScopeProvider scopeProvider); +} diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java index b8fc987f43d..2e93934eb4d 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScope.java @@ -38,7 +38,7 @@ * @param A supertype of all types in this scope. */ @SuppressWarnings("deprecation") -public interface SearchScope extends org.hibernate.search.engine.mapper.scope.SearchScope { +public interface SearchScope { /** * Initiate the building of a search predicate. diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java index 78ac7463419..afb23612937 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/SearchScopeProvider.java @@ -16,9 +16,7 @@ * @see org.hibernate.search.mapper.orm.session.SearchSession */ @SuppressWarnings("deprecation") -public interface SearchScopeProvider - extends - org.hibernate.search.engine.mapper.scope.SearchScopeProvider { +public interface SearchScopeProvider { /** * Creates a {@link SearchScope} limited to diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/SearchSession.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/SearchSession.java index 9519f20fc48..f267a859566 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/SearchSession.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/SearchSession.java @@ -12,10 +12,10 @@ import org.hibernate.Session; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; -import org.hibernate.search.engine.search.reference.RootReferenceScope; import org.hibernate.search.mapper.orm.mapping.SearchMapping; import org.hibernate.search.mapper.orm.massindexing.MassIndexer; import org.hibernate.search.mapper.orm.schema.management.SearchSchemaManager; +import org.hibernate.search.mapper.orm.scope.HibernateOrmRootReferenceScope; import org.hibernate.search.mapper.orm.scope.SearchScope; import org.hibernate.search.mapper.orm.scope.SearchScopeProvider; import org.hibernate.search.mapper.orm.search.loading.dsl.SearchLoadingOptionsStep; @@ -113,7 +113,7 @@ public interface SearchSession extends SearchScopeProvider { T, SearchLoadingOptionsStep, ?, - ?> search(RootReferenceScope scope); + ?> search(HibernateOrmRootReferenceScope scope); /** * Create a {@link SearchSchemaManager} for all indexes. diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/DelegatingSearchSession.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/DelegatingSearchSession.java index 74809a63975..0c0853c9c22 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/DelegatingSearchSession.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/DelegatingSearchSession.java @@ -12,10 +12,10 @@ import org.hibernate.Session; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; -import org.hibernate.search.engine.search.reference.RootReferenceScope; import org.hibernate.search.mapper.orm.common.impl.HibernateOrmUtils; import org.hibernate.search.mapper.orm.massindexing.MassIndexer; import org.hibernate.search.mapper.orm.schema.management.SearchSchemaManager; +import org.hibernate.search.mapper.orm.scope.HibernateOrmRootReferenceScope; import org.hibernate.search.mapper.orm.scope.SearchScope; import org.hibernate.search.mapper.orm.search.loading.dsl.SearchLoadingOptionsStep; import org.hibernate.search.mapper.orm.session.SearchSession; @@ -77,7 +77,7 @@ public DelegatingSearchSession(Supplier search( - RootReferenceScope scope) { + HibernateOrmRootReferenceScope scope) { return getDelegate().search( scope ); } diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java index 17a8617a9d8..da39188c20b 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java @@ -19,7 +19,6 @@ import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.search.engine.backend.common.spi.EntityReferenceFactory; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; -import org.hibernate.search.engine.search.reference.RootReferenceScope; import org.hibernate.search.mapper.orm.automaticindexing.session.impl.DelegatingAutomaticIndexingSynchronizationStrategy; import org.hibernate.search.mapper.orm.automaticindexing.spi.AutomaticIndexingEventSendingSessionContext; import org.hibernate.search.mapper.orm.common.EntityReference; @@ -29,6 +28,7 @@ import org.hibernate.search.mapper.orm.massindexing.MassIndexer; import org.hibernate.search.mapper.orm.model.impl.HibernateOrmRuntimeIntrospector; import org.hibernate.search.mapper.orm.schema.management.SearchSchemaManager; +import org.hibernate.search.mapper.orm.scope.HibernateOrmRootReferenceScope; import org.hibernate.search.mapper.orm.scope.SearchScope; import org.hibernate.search.mapper.orm.scope.impl.HibernateOrmScopeSessionContext; import org.hibernate.search.mapper.orm.scope.impl.SearchScopeImpl; @@ -150,9 +150,8 @@ public PojoIndexer createIndexer() { @Override public SearchQuerySelectStep search( - RootReferenceScope scope) { - SearchScope scope1 = scope.create( this ); - return search( (SearchScopeImpl) scope1 ); + HibernateOrmRootReferenceScope scope) { + return search( ( scope.create( this ) ) ); } private SearchQuerySelectStep A supertype of all types in this scope. */ @Incubating -public interface SearchScope extends org.hibernate.search.engine.mapper.scope.SearchScope { +public interface SearchScope { /** * Initiate the building of a search predicate. diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java index bbfcc43cad3..38a737efcf9 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/SearchScopeProvider.java @@ -7,7 +7,6 @@ import java.util.Collection; import java.util.Collections; -import org.hibernate.search.engine.common.EntityReference; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; import org.hibernate.search.util.common.annotation.Incubating; @@ -18,7 +17,7 @@ * @see org.hibernate.search.mapper.pojo.standalone.session.SearchSession */ @Incubating -public interface SearchScopeProvider extends org.hibernate.search.engine.mapper.scope.SearchScopeProvider { +public interface SearchScopeProvider { /** * Creates a {@link SearchScope} limited to diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/StandalonePojoRootReferenceScope.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/StandalonePojoRootReferenceScope.java new file mode 100644 index 00000000000..1f086c4ae28 --- /dev/null +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/StandalonePojoRootReferenceScope.java @@ -0,0 +1,14 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.mapper.pojo.standalone.scope; + +import org.hibernate.search.engine.search.reference.RootReferenceScope; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating +public interface StandalonePojoRootReferenceScope extends RootReferenceScope { + + SearchScope create(SearchScopeProvider scopeProvider); +} diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/SearchSession.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/SearchSession.java index b21620c1843..2b9fc13816e 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/SearchSession.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/SearchSession.java @@ -10,11 +10,11 @@ import org.hibernate.search.engine.common.EntityReference; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; -import org.hibernate.search.engine.search.reference.RootReferenceScope; import org.hibernate.search.mapper.pojo.standalone.massindexing.MassIndexer; import org.hibernate.search.mapper.pojo.standalone.schema.management.SearchSchemaManager; import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; import org.hibernate.search.mapper.pojo.standalone.scope.SearchScopeProvider; +import org.hibernate.search.mapper.pojo.standalone.scope.StandalonePojoRootReferenceScope; import org.hibernate.search.mapper.pojo.standalone.work.SearchIndexer; import org.hibernate.search.mapper.pojo.standalone.work.SearchIndexingPlan; import org.hibernate.search.mapper.pojo.standalone.work.SearchWorkspace; @@ -136,7 +136,7 @@ default MassIndexer massIndexer(Class... classes) { T, ?, ?, - ?> search(RootReferenceScope scope); + ?> search(StandalonePojoRootReferenceScope scope); /** * Create a {@link SearchSchemaManager} for all indexes. diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java index c688e575414..344e0e32919 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java @@ -11,7 +11,6 @@ import org.hibernate.search.engine.common.EntityReference; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; -import org.hibernate.search.engine.search.reference.RootReferenceScope; import org.hibernate.search.mapper.pojo.loading.spi.PojoSelectionLoadingContext; import org.hibernate.search.mapper.pojo.model.spi.PojoRuntimeIntrospector; import org.hibernate.search.mapper.pojo.session.spi.AbstractPojoSearchSession; @@ -26,6 +25,7 @@ import org.hibernate.search.mapper.pojo.standalone.reporting.impl.StandalonePojoMapperHints; import org.hibernate.search.mapper.pojo.standalone.schema.management.SearchSchemaManager; import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.scope.StandalonePojoRootReferenceScope; import org.hibernate.search.mapper.pojo.standalone.scope.impl.SearchScopeImpl; import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; import org.hibernate.search.mapper.pojo.standalone.session.SearchSessionBuilder; @@ -139,8 +139,9 @@ public PojoRuntimeIntrospector runtimeIntrospector() { } @Override - public SearchQuerySelectStep search(RootReferenceScope referenceScope) { - SearchScopeImpl scope = referenceScope.create( this ); + public SearchQuerySelectStep search( + StandalonePojoRootReferenceScope referenceScope) { + SearchScope scope = referenceScope.create( this ); return search( scope ); } From ac09fca143401653689c9220a0afc2ef0a4326b4 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 16 May 2024 16:19:08 +0200 Subject: [PATCH 08/25] HSEARCH-3319 Test: Model properties with interfaces --- .../search/predicate/FieldReferenceIT.java | 212 +++++++++++++++++- 1 file changed, 206 insertions(+), 6 deletions(-) diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java index 74c99cd5bd9..493d385dbaf 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java @@ -10,15 +10,20 @@ import java.util.Arrays; import java.util.function.Consumer; +import jakarta.persistence.Embeddable; import jakarta.persistence.Entity; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; import org.hibernate.search.documentation.testsupport.BackendConfigurations; import org.hibernate.search.documentation.testsupport.DocumentationSetupHelper; import org.hibernate.search.engine.backend.types.Projectable; import org.hibernate.search.engine.search.common.ValueConvert; 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.reference.object.ObjectFieldReference; import org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference; import org.hibernate.search.engine.search.reference.projection.FieldProjectionFieldReference; import org.hibernate.search.mapper.orm.Search; @@ -27,7 +32,9 @@ import org.hibernate.search.mapper.orm.scope.SearchScopeProvider; import org.hibernate.search.mapper.orm.session.SearchSession; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -43,7 +50,9 @@ class FieldReferenceIT { @BeforeEach void setup() { entityManagerFactory = setupHelper.start().setup( EntityA.class, EntityB.class, EntityC.class, - Entity2A.class, Entity2B.class, Entity2C.class ); + Entity2A.class, Entity2B.class, Entity2C.class, + ContainingA.class, ContainingB.class, EmbeddedThing1.class, EmbeddedThing2.class, EmbeddedThing3.class + ); initData(); } @@ -124,6 +133,23 @@ void smoke2() { } ); } + @Test + void smoke3() { + + withinSearchSession( searchSession -> { + + SearchScope scope = ContainingA_.scope.create( searchSession ); + + assertThat( + searchSession.search( scope ) + .select( f -> f.field( ContainingA_.a ) ) + .where( f -> utilMethodForPredicate( f ) ) + .fetchHits( 20 ) + ).containsOnly( "b" ); + + } ); + } + private void initData() { with( entityManagerFactory ).runInTransaction( entityManager -> { EntityA a = new EntityA(); @@ -192,16 +218,18 @@ public static class EntityC extends EntityB { } - public static class EntityA_ { - public static ValueFieldReference1 stringA; - + public static class EntityA_ implements Properties_EntityA_ { public static HibernateOrmRootReferenceScope scope; static { - stringA = ValueFieldReference1.of( "stringA", EntityA_.class, String.class, String.class, String.class ); - scope = RootReferenceScopeImpl.of( EntityA_.class, EntityA.class ); } + + } + + public interface Properties_EntityA_ { + ValueFieldReference1 stringA = + ValueFieldReference1.of( "stringA", EntityA_.class, String.class, String.class, String.class ); } public static class EntityB_ extends EntityA_ { @@ -332,6 +360,178 @@ public static class Entity2C_ { } } + @MappedSuperclass + public static class MappedSuperclassThing { + @Id + Long id; + + @FullTextField(projectable = Projectable.YES) + String a; + } + + @Indexed + @Entity + public static class ContainingA extends MappedSuperclassThing { + @IndexedEmbedded + EmbeddedThing1 e1; + @IndexedEmbedded + EmbeddedThing1 e2; + } + + @Embeddable + public static class EmbeddedThing1 { + @FullTextField + String a; + @FullTextField + String b; + // some other fields + } + + @Embeddable + public static class EmbeddedThing2 { + @FullTextField + String a; + // some other fields maybe different from EmbeddedThing1 + } + + @Entity + @Indexed + public static class ContainingB extends MappedSuperclassThing { + @IndexedEmbedded + EmbeddedThing3 e3; + } + + @Embeddable + public static class EmbeddedThing3 { + @GenericField + Integer a; + // some other fields maybe different from EmbeddedThing1/EmbeddedThing2 + } + + + interface Property_String_a_ { + ValueFieldReference1 a = + ValueFieldReference1.of( "a", Property_String_a_.class, String.class, String.class, String.class ); + } + + interface Property_String_b_ { + ValueFieldReference1 b = + ValueFieldReference1.of( "b", Property_String_b_.class, String.class, String.class, String.class ); + } + + interface Property_Integer_a_ { + ValueFieldReference1 a = + ValueFieldReference1.of( "a", Property_Integer_a_.class, Integer.class, Integer.class, Integer.class ); + } + + public static class MappedSuperclassThing_ implements Property_String_a_ { + + public static HibernateOrmRootReferenceScope scope; + + static { + //a = ValueFieldReference1.of( "a", MappedSuperclassThing_.class, String.class, String.class, String.class ); + + scope = RootReferenceScopeImpl.of( MappedSuperclassThing_.class, MappedSuperclassThing.class ); + } + } + + public static class ContainingA_ extends MappedSuperclassThing_ { + public static e1_.Absolute e1; + public static e2_.Absolute e2; + + public static HibernateOrmRootReferenceScope scope; + + static { + e1 = new e1_.Absolute(); + e2 = new e2_.Absolute(); + + scope = RootReferenceScopeImpl.of( ContainingA_.class, ContainingA.class ); + } + + public static class e1_ implements ObjectFieldReference, Property_String_a_, Property_String_b_ { + + @Override + public String absolutePath() { + return "e1"; + } + + @Override + public Class scopeRootType() { + return ContainingA_.class; + } + + static class Absolute extends e1_ { + public static ValueFieldReference1 a; + public static ValueFieldReference1 b; + + static { + a = ValueFieldReference1.of( "e1.a", ContainingA_.class, String.class, String.class, String.class ); + b = ValueFieldReference1.of( "e1.b", ContainingA_.class, String.class, String.class, String.class ); + } + } + } + + public static class e2_ implements ObjectFieldReference, Property_String_a_, Property_String_b_ { + + @Override + public String absolutePath() { + return "e2"; + } + + @Override + public Class scopeRootType() { + return ContainingA_.class; + } + + static class Absolute extends e2_ { + public static ValueFieldReference1 a; + public static ValueFieldReference1 b; + + static { + a = ValueFieldReference1.of( "e2.a", ContainingA_.class, String.class, String.class, String.class ); + b = ValueFieldReference1.of( "e2.b", ContainingA_.class, String.class, String.class, String.class ); + } + } + } + } + + public static class ContainingB_ extends MappedSuperclassThing_ { + public static e3_.Absolute e3; + + public static HibernateOrmRootReferenceScope scope; + + static { + e3 = new e3_.Absolute(); + + scope = RootReferenceScopeImpl.of( ContainingB_.class, ContainingB.class ); + } + + public static class e3_ implements ObjectFieldReference, Property_Integer_a_ { + + @Override + public String absolutePath() { + return "e3"; + } + + @Override + public Class scopeRootType() { + return ContainingB_.class; + } + + public static class Absolute extends e3_ { + public static ValueFieldReference1 a; + + static { + a = ValueFieldReference1.of( "e3.a", ContainingB_.class, Integer.class, Integer.class, Integer.class ); + } + } + } + } + + public static PredicateFinalStep utilMethodForPredicate(SearchPredicateFactory factory) { + return factory.match().field( Property_String_a_.a ).matching( "a" ); + } + public static class ValueFieldReference1 extends TypedFieldReference1 { From bf6411285677ea88fc3e9dd292a77bdf55b1487f Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Fri, 17 May 2024 18:47:24 +0200 Subject: [PATCH 09/25] HSEARCH-3319 Remove now unnecessary withRoot(Reference) --- .../dsl/SearchAggregationFactory.java | 15 --------------- .../predicate/dsl/SearchPredicateFactory.java | 16 ---------------- .../dsl/ExtendedSearchProjectionFactory.java | 7 ------- .../projection/dsl/SearchProjectionFactory.java | 15 --------------- .../sort/dsl/ExtendedSearchSortFactory.java | 6 ------ .../search/sort/dsl/SearchSortFactory.java | 16 ---------------- 6 files changed, 75 deletions(-) diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java index 16c5754c1b5..be5c0cbcc8f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java @@ -7,7 +7,6 @@ import java.util.function.Function; import org.hibernate.search.engine.search.common.NamedValues; -import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; import org.hibernate.search.util.common.SearchException; import org.hibernate.search.util.common.annotation.Incubating; @@ -147,20 +146,6 @@ AggregationFinalStep withParameters( @Incubating SearchAggregationFactory withRoot(String objectFieldPath); - /** - * Create a new aggregation factory whose root for all paths passed to the DSL - * will be the given object field. - *

- * See here for more information. - * - * @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root. - * @return A new aggregation factory using the given object field as root. - */ - @Incubating - default SearchAggregationFactory withRoot(ObjectFieldReference objectFieldReference) { - return withRoot( objectFieldReference.absolutePath() ); - } - /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. * @return The absolute path of the field, for use in native aggregations for example. 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 49464e4392d..ac6112335c6 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 @@ -11,7 +11,6 @@ import org.hibernate.search.engine.search.common.BooleanOperator; import org.hibernate.search.engine.search.common.NamedValues; import org.hibernate.search.engine.search.predicate.SearchPredicate; -import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; import org.hibernate.search.engine.search.reference.predicate.NestedPredicateFieldReference; import org.hibernate.search.util.common.SearchException; import org.hibernate.search.util.common.annotation.Incubating; @@ -376,21 +375,6 @@ PredicateFinalStep withParameters( @Incubating SearchPredicateFactory withRoot(String objectFieldPath); - /** - * Create a new predicate factory whose root for all paths passed to the DSL - * will be the given object field. - *

- * This is used to call reusable methods that apply the same predicate - * on different object fields that have same structure (same sub-fields). - * - * @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root. - * @return A new predicate factory using the given object field as root. - */ - @Incubating - default SearchPredicateFactory withRoot(ObjectFieldReference objectFieldReference) { - return withRoot( objectFieldReference.absolutePath() ); - } - /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. * @return The absolute path of the field, for use in native predicates for example. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java index c22521ee238..77cb53fa767 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/ExtendedSearchProjectionFactory.java @@ -4,8 +4,6 @@ */ package org.hibernate.search.engine.search.projection.dsl; -import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; - /** * A base interface for subtypes of {@link SearchProjectionFactory} allowing to * easily override the self type for all relevant methods. @@ -22,9 +20,4 @@ public interface ExtendedSearchProjectionFactory objectFieldReference) { - return withRoot( objectFieldReference.absolutePath() ); - } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java index 716060c2613..c8d99b227ae 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java @@ -522,21 +522,6 @@ ProjectionFinalStep withParameters( @Incubating SearchProjectionFactory withRoot(String objectFieldPath); - /** - * Create a new projection factory whose root for all paths passed to the DSL - * will be the given object field. - *

- * This is used to call reusable methods that can apply the same projection - * on different object fields that have same structure (same sub-fields). - * - * @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root. - * @return A new projection factory using the given object field as root. - */ - @Incubating - default SearchProjectionFactory withRoot(ObjectFieldReference objectFieldReference) { - return withRoot( objectFieldReference.absolutePath() ); - } - /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. * @return The absolute path of the field, for use in native projections for example. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java index c6517e6a272..e735859d403 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java @@ -7,7 +7,6 @@ import java.util.function.Function; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; import org.hibernate.search.engine.spatial.GeoPoint; @@ -31,11 +30,6 @@ public interface ExtendedSearchSortFactory< @Override S withRoot(String objectFieldPath); - @Override - default S withRoot(ObjectFieldReference objectFieldReference) { - return withRoot( objectFieldReference.absolutePath() ); - } - @Override FieldSortOptionsStep field(String fieldPath); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java index 07855156cba..fcc01d27170 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java @@ -9,7 +9,6 @@ import org.hibernate.search.engine.search.common.NamedValues; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; import org.hibernate.search.engine.spatial.GeoPoint; import org.hibernate.search.util.common.SearchException; @@ -224,21 +223,6 @@ public interface SearchSortFactory { @Incubating SearchSortFactory withRoot(String objectFieldPath); - /** - * Create a new sort factory whose root for all paths passed to the DSL - * will be the given object field. - *

- * This is used to call reusable methods that can apply the same sort - * on different object fields that have same structure (same sub-fields). - * - * @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root. - * @return A new sort factory using the given object field as root. - */ - @Incubating - default SearchSortFactory withRoot(ObjectFieldReference objectFieldReference) { - return withRoot( objectFieldReference.absolutePath() ); - } - /** * @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory. * @return The absolute path of the field, for use in native sorts for example. From b8aed564ffcaca8d730b502b583548ba782dc8e3 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Fri, 17 May 2024 22:04:00 +0200 Subject: [PATCH 10/25] HSEARCH-3319 Test --- .../search/predicate/FieldReferenceIT.java | 660 ++++++++---------- .../scope/HibernateOrmRootReferenceScope.java | 2 +- .../impl/HibernateOrmSearchSession.java | 2 +- 3 files changed, 302 insertions(+), 362 deletions(-) diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java index 493d385dbaf..19c000d8bd4 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java @@ -7,10 +7,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; -import java.util.Arrays; +import java.util.List; import java.util.function.Consumer; +import jakarta.persistence.DiscriminatorColumn; +import jakarta.persistence.DiscriminatorType; import jakarta.persistence.Embeddable; +import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Id; @@ -19,12 +22,13 @@ import org.hibernate.search.documentation.testsupport.BackendConfigurations; import org.hibernate.search.documentation.testsupport.DocumentationSetupHelper; import org.hibernate.search.engine.backend.types.Projectable; -import org.hibernate.search.engine.search.common.ValueConvert; -import org.hibernate.search.engine.search.predicate.SearchPredicate; +import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.engine.search.reference.object.ObjectFieldReference; +import org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference; import org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference; import org.hibernate.search.engine.search.reference.projection.FieldProjectionFieldReference; import org.hibernate.search.mapper.orm.Search; import org.hibernate.search.mapper.orm.scope.HibernateOrmRootReferenceScope; @@ -49,9 +53,9 @@ class FieldReferenceIT { @BeforeEach void setup() { - entityManagerFactory = setupHelper.start().setup( EntityA.class, EntityB.class, EntityC.class, - Entity2A.class, Entity2B.class, Entity2C.class, - ContainingA.class, ContainingB.class, EmbeddedThing1.class, EmbeddedThing2.class, EmbeddedThing3.class + entityManagerFactory = setupHelper.start().setup( + MappedSuperclassThing.class, ContainingA.class, ContainingB.class, EmbeddedThing1.class, EmbeddedThing2.class, + EmbeddedThing3.class, ContainingASub1.class, ContainingASub2.class ); initData(); } @@ -59,307 +63,128 @@ void setup() { @Test void smoke() { withinSearchSession( searchSession -> { - assertThat( - searchSession.search( EntityA_.scope ) - .select( f -> f.field( EntityA_.stringA ) ) - .where( f -> f.match().field( EntityA_.stringA ).matching( "a" ) ) - .fetchHits( 20 ) - ).containsOnly( "a" ); - assertThat( - searchSession.search( EntityC_.scope ) - .select( f -> f.field( EntityC_.stringA ) ) - .where( f -> f.match().field( EntityC_.stringC ).matching( "c" ) ) - .fetchHits( 20 ) - ).containsOnly( "c" ); + SearchScope scope = ContainingA__.INDEX.scope( searchSession ); assertThat( - searchSession.search( EntityC_.scope ) - .select( f -> f.field( EntityC_.stringA ) ) - .where( f -> f.match().field( EntityC_.stringA ).matching( "c" ) ) + searchSession.search( scope ) + .select( f -> f.field( ContainingA__.INDEX.a ) ) + .where( f -> f.bool() + .should( utilMethodForPredicate( f, ContainingA__.INDEX ) ) + .should( utilMethodForPredicate( f, ContainingA__.INDEX.e1 ) ) + .should( utilMethodForPredicate( f, ContainingA__.INDEX.e2 ) ) + ) .fetchHits( 20 ) - ).containsOnly( "c" ); - - SearchScope scope = EntityB_union_EntityC_.scope.create( searchSession ); - - SearchPredicate searchPredicate = - scope.predicate().match().field( EntityB_union_EntityC_.stringA ).matching( "b" ).toPredicate(); - SearchPredicate searchPredicate2 = - scope.predicate().match().field( EntityB_union_EntityC_.stringB ).matching( "c" ).toPredicate(); + ).containsOnly( "a" ); assertThat( - searchSession.search( scope ) - .select( f -> f.field( EntityB_union_EntityC_.stringA ) ) - .where( searchPredicate ) + searchSession.search( ContainingA__.INDEX ) + .select( f -> f.field( ContainingA__.INDEX.a ) ) + .where( f -> f.match().field( ContainingA__.INDEX.sub1 ).matching( "a1" ) ) .fetchHits( 20 ) - ).containsOnly( "b" ); + ).containsOnly( "a1" ); assertThat( - searchSession.search( scope ) - .select( f -> f.field( EntityB_union_EntityC_.stringA ) ) - .where( searchPredicate2 ) + searchSession.search( ContainingA__.INDEX ) + .select( f -> f.field( ContainingA__.INDEX.a ) ) + .where( f -> utilMethodForPredicateNoProjection( f, ContainingA__.INDEX.e3 ) ) .fetchHits( 20 ) - ).containsOnly( "c" ); + ).containsOnly( "a" ); } ); } - @Test - void smoke2() { - withinSearchSession( searchSession -> { - - SearchScope scope = Entity2A_union_Entity2B_.scope.create( searchSession ); - // while path is there, sure, the EntityB isn't in the scope - SearchPredicate searchPredicate = - scope.predicate().match().field( Entity2A_union_Entity2B_.stringA ).matching( "a" ).toPredicate(); - SearchPredicate searchPredicate2 = - scope.predicate().match().field( Entity2A_union_Entity2B_.stringA ).matching( "b" ).toPredicate(); - assertThat( - searchSession.search( scope ) - // also wrong type here - .select( f -> f.field( Entity2A_union_Entity2B_.stringA ) ) - .where( searchPredicate ) - .fetchHits( 20 ) - ).containsOnly( "a" ); + public static > PredicateFinalStep utilMethodForPredicate( + SearchPredicateFactory factory, ContainingA_e1_e2_Intersection reference) { + return factory.match().field( reference.a() ).matching( "a" ); + } - assertThat( - searchSession.search( scope ) - .select( f -> f.field( Entity2A_union_Entity2B_.stringA ) ) - .where( searchPredicate2 ) - .fetchHits( 20 ) - ).containsOnly( "b" ); - } ); + public static PredicateFinalStep utilMethodForPredicateNoProjection( + SearchPredicateFactory factory, ContainingA_e1_e2_e3_Intersection reference) { + return factory.match().field( reference.a() ).matching( "a" ); } @Test - void smoke3() { - + void smoke2() { withinSearchSession( searchSession -> { - SearchScope scope = ContainingA_.scope.create( searchSession ); + SearchScope scope = searchSession.scope( List.of( ContainingA.class ) ); assertThat( searchSession.search( scope ) - .select( f -> f.field( ContainingA_.a ) ) - .where( f -> utilMethodForPredicate( f ) ) + .select( f -> f.field( "a" ) ) + .where( f -> f.exists().field( "commonSub" ) ) .fetchHits( 20 ) - ).containsOnly( "b" ); + ).containsOnly( "a1", "a2" ); } ); } private void initData() { with( entityManagerFactory ).runInTransaction( entityManager -> { - EntityA a = new EntityA(); + ContainingA a = new ContainingA(); a.id = 1L; - a.stringA = "a"; - - EntityB b = new EntityB(); + a.a = "a"; + a.e1 = new EmbeddedThing1(); + a.e2 = new EmbeddedThing1(); + a.e3 = new EmbeddedThing2(); + a.e1.a = "a"; + a.e1.b = "b"; + + a.e2.a = "a"; + a.e2.b = "b"; + + a.e3.a = "a"; + + // ------------------- + ContainingASub1 a1 = new ContainingASub1(); + a1.id = 2L; + a1.a = "a1"; + a1.e1 = new EmbeddedThing1(); + a1.e2 = new EmbeddedThing1(); + a1.e1.a = "a1"; + a1.e1.b = "b1"; + + a1.e2.a = "a1"; + a1.e2.b = "b1"; + + a1.commonSub = "a1"; + a1.sub1 = "a1"; + + // ------------------- + ContainingASub2 a2 = new ContainingASub2(); + a2.id = 3L; + a2.a = "a2"; + a2.e1 = new EmbeddedThing1(); + a2.e2 = new EmbeddedThing1(); + a2.e1.a = "a2"; + a2.e1.b = "b2"; + + a2.e2.a = "a2"; + a2.e2.b = "b2"; + + a2.commonSub = "a2"; + a2.sub2 = "a2"; + + // ------------------- + ContainingB b = new ContainingB(); b.id = 10L; - b.stringA = "b"; - b.stringB = "b"; + b.a = "b"; + b.e2 = new EmbeddedThing3(); + b.e2.a = -100; + b.e3 = new EmbeddedThing3(); + b.e3.a = -10; - EntityC c = new EntityC(); - c.id = 100L; - c.stringA = "c"; - c.stringB = "c"; - c.stringC = "c"; entityManager.persist( a ); - entityManager.persist( b ); - entityManager.persist( c ); - - Entity2A a2 = new Entity2A(); - a2.id = 2L; - a2.stringA = "a"; - - Entity2B b2 = new Entity2B(); - b2.id = 20L; - b2.stringA = "b"; - b2.stringB = "b"; - - Entity2C c2 = new Entity2C(); - c2.id = 200L; - c2.stringA = "c"; - c2.stringC = "c"; - + entityManager.persist( a1 ); entityManager.persist( a2 ); - entityManager.persist( b2 ); - entityManager.persist( c2 ); + entityManager.persist( b ); } ); } - @Indexed - @Entity - public static class EntityA { - @Id - Long id; - - @FullTextField(projectable = Projectable.YES) - String stringA; - - } - - @Entity - public static class EntityB extends EntityA { - - @FullTextField(projectable = Projectable.YES) - String stringB; - - } - - @Entity - public static class EntityC extends EntityB { - - @FullTextField(projectable = Projectable.YES) - String stringC; - - } - - public static class EntityA_ implements Properties_EntityA_ { - public static HibernateOrmRootReferenceScope scope; - - static { - scope = RootReferenceScopeImpl.of( EntityA_.class, EntityA.class ); - } - - } - - public interface Properties_EntityA_ { - ValueFieldReference1 stringA = - ValueFieldReference1.of( "stringA", EntityA_.class, String.class, String.class, String.class ); - } - - public static class EntityB_ extends EntityA_ { - public static ValueFieldReference1 stringB; - - public static HibernateOrmRootReferenceScope scope; - - static { - stringB = ValueFieldReference1.of( "stringB", EntityB_.class, String.class, String.class, String.class ); - - scope = RootReferenceScopeImpl.of( EntityB_.class, EntityB.class ); - } - } - - public static class EntityC_ extends EntityB_ { - public static ValueFieldReference1 stringC; - - public static HibernateOrmRootReferenceScope scope; - - static { - stringC = ValueFieldReference1.of( "stringC", EntityC_.class, String.class, String.class, String.class ); - - scope = RootReferenceScopeImpl.of( EntityC_.class, EntityC.class ); - } - } - - public static class EntityB_union_EntityC_ { - public static ValueFieldReference1 stringA; - public static ValueFieldReference1 stringB; - - public static HibernateOrmRootReferenceScope scope; - - static { - stringA = ValueFieldReference1.of( "stringA", EntityB_union_EntityC_.class, String.class, String.class, - String.class ); - stringB = ValueFieldReference1.of( "stringB", EntityB_union_EntityC_.class, String.class, String.class, - String.class ); - - scope = RootReferenceScopeImpl.of( EntityB_union_EntityC_.class, EntityB.class, EntityC.class ); - } - } - - @Entity - @Indexed - public static class Entity2A { - @Id - Long id; - - @FullTextField(projectable = Projectable.YES) - String stringA; - } - - @Entity - @Indexed - public static class Entity2B { - @Id - Long id; - - @FullTextField(projectable = Projectable.YES) - String stringA; - - @FullTextField(projectable = Projectable.YES) - String stringB; - } - - @Entity - @Indexed - public static class Entity2C { - @Id - Long id; - - @FullTextField(projectable = Projectable.YES) - String stringA; - - @FullTextField(projectable = Projectable.YES) - String stringC; - } - - public static class Entity2A_union_Entity2B_ { - public static ValueFieldReference1 stringA; - - public static HibernateOrmRootReferenceScope scope; - - static { - stringA = ValueFieldReference1.of( "stringA", Entity2A_union_Entity2B_.class, String.class, String.class, - String.class ); - scope = RootReferenceScopeImpl.of( Entity2A_union_Entity2B_.class, Entity2A.class, Entity2B.class ); - } - } - - public static class Entity2A_ { - public static ValueFieldReference1 stringA; - - public static HibernateOrmRootReferenceScope scope; - - static { - stringA = ValueFieldReference1.of( "stringA", Entity2A_.class, String.class, String.class, String.class ); - - scope = RootReferenceScopeImpl.of( Entity2A_.class, Entity2A.class ); - } - } - - public static class Entity2B_ { - public static ValueFieldReference1 stringA; - public static ValueFieldReference1 stringB; - - public static HibernateOrmRootReferenceScope scope; - - static { - stringA = ValueFieldReference1.of( "stringA", Entity2B_.class, String.class, String.class, String.class ); - stringB = ValueFieldReference1.of( "stringB", Entity2B_.class, String.class, String.class, String.class ); - - scope = RootReferenceScopeImpl.of( Entity2B_.class, Entity2B.class ); - } - } - - public static class Entity2C_ { - public static ValueFieldReference1 stringA; - public static ValueFieldReference1 stringC; - - public static HibernateOrmRootReferenceScope scope; - - static { - stringA = ValueFieldReference1.of( "stringA", Entity2C_.class, String.class, String.class, String.class ); - stringC = ValueFieldReference1.of( "stringC", Entity2C_.class, String.class, String.class, String.class ); - - scope = RootReferenceScopeImpl.of( Entity2C_.class, Entity2C.class ); - } - } - @MappedSuperclass public static class MappedSuperclassThing { @Id @@ -371,18 +196,24 @@ public static class MappedSuperclassThing { @Indexed @Entity + @DiscriminatorColumn(discriminatorType = DiscriminatorType.INTEGER) public static class ContainingA extends MappedSuperclassThing { @IndexedEmbedded + @Embedded EmbeddedThing1 e1; @IndexedEmbedded + @Embedded EmbeddedThing1 e2; + @IndexedEmbedded + @Embedded + EmbeddedThing2 e3; } @Embeddable public static class EmbeddedThing1 { - @FullTextField + @FullTextField(projectable = Projectable.YES) String a; - @FullTextField + @FullTextField(projectable = Projectable.YES) String b; // some other fields } @@ -394,9 +225,27 @@ public static class EmbeddedThing2 { // some other fields maybe different from EmbeddedThing1 } + @Entity + public static class ContainingASub1 extends ContainingA { + @FullTextField(projectable = Projectable.YES) + String sub1; + @FullTextField(projectable = Projectable.YES) + String commonSub; + } + + @Entity + public static class ContainingASub2 extends ContainingA { + @FullTextField(projectable = Projectable.YES) + String sub2; + @FullTextField(projectable = Projectable.YES) + String commonSub; + } + @Entity @Indexed public static class ContainingB extends MappedSuperclassThing { + @IndexedEmbedded + EmbeddedThing3 e2; @IndexedEmbedded EmbeddedThing3 e3; } @@ -409,46 +258,66 @@ public static class EmbeddedThing3 { } - interface Property_String_a_ { - ValueFieldReference1 a = - ValueFieldReference1.of( "a", Property_String_a_.class, String.class, String.class, String.class ); - } + // IMPL_NOTE: note cannot use the EntityClassName_ since ORM picks it up and tries to its thing... + // so we'd need to come up with a different naming strategy... + public static class ContainingA__ + implements HibernateOrmRootReferenceScope, + ContainingA_e1_e2_Intersection { - interface Property_String_b_ { - ValueFieldReference1 b = - ValueFieldReference1.of( "b", Property_String_b_.class, String.class, String.class, String.class ); - } + // IMPL_NOTE: Maybe let's use the INDEX name? + // also I'm thinking we can make it configurable and let the user decide how to call this variable... + public static final ContainingA__ INDEX = new ContainingA__(); - interface Property_Integer_a_ { - ValueFieldReference1 a = - ValueFieldReference1.of( "a", Property_Integer_a_.class, Integer.class, Integer.class, Integer.class ); - } + public final ValueFieldReference1 a; + public final e1_ e1; + public final e2_ e2; + public final e3_ e3; - public static class MappedSuperclassThing_ implements Property_String_a_ { + // ContainingASub1 + public final ValueFieldReference1 sub1; - public static HibernateOrmRootReferenceScope scope; + // ContainingASub2 + public final ValueFieldReference1 sub2; - static { - //a = ValueFieldReference1.of( "a", MappedSuperclassThing_.class, String.class, String.class, String.class ); + public final ValueFieldReference1 commonSub; - scope = RootReferenceScopeImpl.of( MappedSuperclassThing_.class, MappedSuperclassThing.class ); - } - } - public static class ContainingA_ extends MappedSuperclassThing_ { - public static e1_.Absolute e1; - public static e2_.Absolute e2; + public ContainingA__() { + a = ValueFieldReference1.of( "e2.a", ContainingA__.class, String.class, String.class, String.class ); + e1 = new e1_(); + e2 = new e2_(); + e3 = new e3_(); + sub1 = ValueFieldReference1.of( "sub1", ContainingA__.class, String.class, String.class, String.class ); + sub2 = ValueFieldReference1.of( "sub2", ContainingA__.class, String.class, String.class, String.class ); + commonSub = ValueFieldReference1.of( "commonSub", ContainingA__.class, String.class, String.class, String.class ); + } - public static HibernateOrmRootReferenceScope scope; + @Override + public SearchScope scope(SearchScopeProvider scopeProvider) { + return scopeProvider.scope( ContainingA.class ); + } - static { - e1 = new e1_.Absolute(); - e2 = new e2_.Absolute(); + @Override + public Class rootReferenceType() { + return ContainingA__.class; + } - scope = RootReferenceScopeImpl.of( ContainingA_.class, ContainingA.class ); + @Override + public ValueFieldReference1 a() { + return a; } - public static class e1_ implements ObjectFieldReference, Property_String_a_, Property_String_b_ { + public static class e1_ + implements ObjectFieldReference, + ContainingA_e1_e2_Intersection { + + public final ValueFieldReference1 a; + public final ValueFieldReference1 b; + + public e1_() { + a = ValueFieldReference1.of( "e1.a", ContainingA__.class, String.class, String.class, String.class ); + b = ValueFieldReference1.of( "e1.b", ContainingA__.class, String.class, String.class, String.class ); + } @Override public String absolutePath() { @@ -456,22 +325,28 @@ public String absolutePath() { } @Override - public Class scopeRootType() { - return ContainingA_.class; + public Class scopeRootType() { + return ContainingA__.class; } - static class Absolute extends e1_ { - public static ValueFieldReference1 a; - public static ValueFieldReference1 b; - - static { - a = ValueFieldReference1.of( "e1.a", ContainingA_.class, String.class, String.class, String.class ); - b = ValueFieldReference1.of( "e1.b", ContainingA_.class, String.class, String.class, String.class ); - } + @Override + public ValueFieldReference1 a() { + return a; } } - public static class e2_ implements ObjectFieldReference, Property_String_a_, Property_String_b_ { + public static class e2_ + implements ObjectFieldReference, + ContainingA_e1_e2_Intersection, + ContainingA_e1_e2_e3_Intersection { + + public final ValueFieldReference1 a; + public final ValueFieldReference1 b; + + public e2_() { + a = ValueFieldReference1.of( "e2.a", ContainingA__.class, String.class, String.class, String.class ); + b = ValueFieldReference1.of( "e2.b", ContainingA__.class, String.class, String.class, String.class ); + } @Override public String absolutePath() { @@ -479,34 +354,25 @@ public String absolutePath() { } @Override - public Class scopeRootType() { - return ContainingA_.class; + public Class scopeRootType() { + return ContainingA__.class; } - static class Absolute extends e2_ { - public static ValueFieldReference1 a; - public static ValueFieldReference1 b; - - static { - a = ValueFieldReference1.of( "e2.a", ContainingA_.class, String.class, String.class, String.class ); - b = ValueFieldReference1.of( "e2.b", ContainingA_.class, String.class, String.class, String.class ); - } + @Override + public ValueFieldReference1 a() { + return a; } } - } - - public static class ContainingB_ extends MappedSuperclassThing_ { - public static e3_.Absolute e3; - public static HibernateOrmRootReferenceScope scope; + public static class e3_ + implements ObjectFieldReference, + ContainingA_e1_e2_e3_Intersection { - static { - e3 = new e3_.Absolute(); - - scope = RootReferenceScopeImpl.of( ContainingB_.class, ContainingB.class ); - } + public final ValueFieldReference2 a; - public static class e3_ implements ObjectFieldReference, Property_Integer_a_ { + public e3_() { + a = ValueFieldReference2.of( "e3.a", ContainingA__.class, String.class, String.class ); + } @Override public String absolutePath() { @@ -514,24 +380,50 @@ public String absolutePath() { } @Override - public Class scopeRootType() { - return ContainingB_.class; + public Class scopeRootType() { + return ContainingA__.class; } - public static class Absolute extends e3_ { - public static ValueFieldReference1 a; - - static { - a = ValueFieldReference1.of( "e3.a", ContainingB_.class, Integer.class, Integer.class, Integer.class ); - } + @Override + public ValueFieldReference2 a() { + return a; } } } - public static PredicateFinalStep utilMethodForPredicate(SearchPredicateFactory factory) { - return factory.match().field( Property_String_a_.a ).matching( "a" ); + public interface ContainingA_e1_e2_e3_Intersection { + + TraitsIntersection a(); + + interface TraitsIntersection + extends MatchPredicateFieldReference, + ExistsPredicateFieldReference, + QueryStringPredicateFieldReference { + + @Override + default ValueModel valueModel() { + return ValueModel.MAPPING; + } + } } + // the same field with the same traits: + public interface ContainingA_e1_e2_Intersection { + + TraitsIntersection a(); + + interface TraitsIntersection + extends FieldProjectionFieldReference, + MatchPredicateFieldReference, + ExistsPredicateFieldReference, + QueryStringPredicateFieldReference { + + @Override + default ValueModel valueModel() { + return ValueModel.MAPPING; + } + } + } public static class ValueFieldReference1 extends TypedFieldReference1 { @@ -549,10 +441,10 @@ public static ValueFieldReference1 of( public ValueFieldReference1(String absolutePath, Class containing, Class inputType, Class indexType, Class

projectionType) { - super( absolutePath, ValueConvert.YES, containing, inputType, projectionType ); - this.noConverter = new TypedFieldReference1<>( absolutePath, ValueConvert.NO, containing, indexType, indexType ); + super( absolutePath, ValueModel.MAPPING, containing, inputType, projectionType ); + this.noConverter = new TypedFieldReference1<>( absolutePath, ValueModel.INDEX, containing, indexType, indexType ); this.string = - new TypedFieldReference1<>( absolutePath, ValueConvert.PARSE, containing, String.class, String.class ); + new TypedFieldReference1<>( absolutePath, ValueModel.STRING, containing, String.class, String.class ); } public TypedFieldReference1 noConverter() { @@ -568,18 +460,22 @@ public TypedFieldReference1 asString() { public static class TypedFieldReference1 implements FieldProjectionFieldReference, - MatchPredicateFieldReference { + MatchPredicateFieldReference, + ExistsPredicateFieldReference, + QueryStringPredicateFieldReference, + ContainingA_e1_e2_Intersection.TraitsIntersection, + ContainingA_e1_e2_e3_Intersection.TraitsIntersection { private final String absolutePath; - private final ValueConvert valueConvert; + private final ValueModel valueModel; private final Class containing; private final Class input; private final Class

projection; - public TypedFieldReference1(String absolutePath, ValueConvert valueConvert, Class containing, Class input, + public TypedFieldReference1(String absolutePath, ValueModel valueModel, Class containing, Class input, Class

projection) { this.absolutePath = absolutePath; - this.valueConvert = valueConvert; + this.valueModel = valueModel; this.containing = containing; this.input = input; this.projection = projection; @@ -601,8 +497,8 @@ public Class predicateType() { } @Override - public ValueConvert valueConvert() { - return valueConvert; + public ValueModel valueModel() { + return valueModel; } @Override @@ -612,29 +508,73 @@ public Class

projectionType() { } - private static class RootReferenceScopeImpl implements HibernateOrmRootReferenceScope { + public static class ValueFieldReference2 extends TypedFieldReference2 { + + public static ValueFieldReference2 of( + String path, + Class documentReferenceClass, + Class t, + Class v) { + return new ValueFieldReference2<>( path, documentReferenceClass, t, v ); + } - private final Class rootReferenceType; - private final Class[] entityClass; + private final TypedFieldReference2 noConverter; + private final TypedFieldReference2 string; - static HibernateOrmRootReferenceScope of(Class rootReferenceType, - Class... entityClass) { - return new RootReferenceScopeImpl<>( rootReferenceType, entityClass ); + public ValueFieldReference2(String absolutePath, Class containing, Class inputType, Class indexType) { + super( absolutePath, ValueModel.MAPPING, containing, inputType ); + this.noConverter = new TypedFieldReference2<>( absolutePath, ValueModel.INDEX, containing, indexType ); + this.string = + new TypedFieldReference2<>( absolutePath, ValueModel.STRING, containing, String.class ); } - private RootReferenceScopeImpl(Class rootReferenceType, Class... entityClass) { - this.rootReferenceType = rootReferenceType; - this.entityClass = entityClass; + public TypedFieldReference2 noConverter() { + return noConverter; + } + + + public TypedFieldReference2 asString() { + return string; + } + + } + + public static class TypedFieldReference2 + implements MatchPredicateFieldReference, + ExistsPredicateFieldReference, + QueryStringPredicateFieldReference, + ContainingA_e1_e2_e3_Intersection.TraitsIntersection { + + private final String absolutePath; + private final ValueModel valueModel; + private final Class containing; + private final Class input; + + public TypedFieldReference2(String absolutePath, ValueModel valueModel, Class containing, Class input) { + this.absolutePath = absolutePath; + this.valueModel = valueModel; + this.containing = containing; + this.input = input; } @Override - public Class rootReferenceType() { - return rootReferenceType; + public String absolutePath() { + return absolutePath; + } + + @Override + public Class scopeRootType() { + return containing; + } + + @Override + public Class predicateType() { + return input; } @Override - public SearchScope create(SearchScopeProvider scopeProvider) { - return scopeProvider.scope( Arrays.asList( entityClass ) ); + public ValueModel valueModel() { + return valueModel; } } diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/HibernateOrmRootReferenceScope.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/HibernateOrmRootReferenceScope.java index cd89a38c125..d412d8b101e 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/HibernateOrmRootReferenceScope.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/scope/HibernateOrmRootReferenceScope.java @@ -10,5 +10,5 @@ @Incubating public interface HibernateOrmRootReferenceScope extends RootReferenceScope { - SearchScope create(SearchScopeProvider scopeProvider); + SearchScope scope(SearchScopeProvider scopeProvider); } diff --git a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java index da39188c20b..a157b1b2770 100644 --- a/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java +++ b/mapper/orm/src/main/java/org/hibernate/search/mapper/orm/session/impl/HibernateOrmSearchSession.java @@ -151,7 +151,7 @@ public PojoIndexer createIndexer() { @Override public SearchQuerySelectStep search( HibernateOrmRootReferenceScope scope) { - return search( ( scope.create( this ) ) ); + return search( ( scope.scope( this ) ) ); } private SearchQuerySelectStep Date: Mon, 20 May 2024 12:30:30 +0200 Subject: [PATCH 11/25] HSEARCH-3319 Use single impl for field sort options --- .../AbstractFieldSortOptionsGenericStep.java | 197 ++++++++++++++++++ .../impl/FieldSortOptionsGenericStepImpl.java | 112 ---------- .../dsl/impl/FieldSortOptionsStepImpl.java | 103 --------- .../dsl/spi/AbstractSearchSortFactory.java | 9 +- 4 files changed, 201 insertions(+), 220 deletions(-) create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/AbstractFieldSortOptionsGenericStep.java delete mode 100644 engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java delete mode 100644 engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsStepImpl.java diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/AbstractFieldSortOptionsGenericStep.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/AbstractFieldSortOptionsGenericStep.java new file mode 100644 index 00000000000..8146580e184 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/AbstractFieldSortOptionsGenericStep.java @@ -0,0 +1,197 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.sort.dsl.impl; + +import java.util.function.Function; + +import org.hibernate.search.engine.search.common.SortMode; +import org.hibernate.search.engine.search.common.ValueModel; +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.reference.sort.FieldSortFieldReference; +import org.hibernate.search.engine.search.sort.SearchSort; +import org.hibernate.search.engine.search.sort.dsl.FieldSortMissingValueBehaviorGenericStep; +import org.hibernate.search.engine.search.sort.dsl.FieldSortMissingValueBehaviorStep; +import org.hibernate.search.engine.search.sort.dsl.FieldSortOptionsGenericStep; +import org.hibernate.search.engine.search.sort.dsl.FieldSortOptionsStep; +import org.hibernate.search.engine.search.sort.dsl.SortOrder; +import org.hibernate.search.engine.search.sort.dsl.spi.AbstractSortThenStep; +import org.hibernate.search.engine.search.sort.dsl.spi.SearchSortDslContext; +import org.hibernate.search.engine.search.sort.spi.FieldSortBuilder; +import org.hibernate.search.engine.search.sort.spi.SearchSortIndexScope; +import org.hibernate.search.engine.search.sort.spi.SortTypeKeys; + +public abstract class AbstractFieldSortOptionsGenericStep< + SR, + T, + PDF extends SearchPredicateFactory, + S extends AbstractFieldSortOptionsGenericStep, + N extends FieldSortMissingValueBehaviorGenericStep> + extends AbstractSortThenStep + implements + FieldSortOptionsGenericStep { + + + private final SearchSortDslContext dslContext; + protected final FieldSortBuilder builder; + + public AbstractFieldSortOptionsGenericStep(SearchSortDslContext dslContext, + String fieldPath) { + super( dslContext ); + this.dslContext = dslContext; + this.builder = dslContext.scope().fieldQueryElement( fieldPath, SortTypeKeys.FIELD ); + } + + public static < + T, + SR, + SC extends SearchSortIndexScope, + PDF extends SearchPredicateFactory< + SR>> FieldSortOptionsGenericStep> create( + SearchSortDslContext dslContext, + FieldSortFieldReference fieldReference) { + return new FieldReferenceFieldSortOptionsStep<>( dslContext, fieldReference ); + } + + public static < + PDF extends SearchPredicateFactory, + SR, + SC extends SearchSortIndexScope> FieldSortOptionsStep create( + SearchSortDslContext dslContext, String fieldPath) { + return new StringFieldSortOptionsStep<>( dslContext, fieldPath ); + } + + @Override + public S order(SortOrder order) { + builder.order( order ); + return thisAsS(); + } + + @Override + public S mode(SortMode mode) { + builder.mode( mode ); + return thisAsS(); + } + + @Override + public N missing() { + return thisAsN(); + } + + @Override + public S filter( + Function clauseContributor) { + SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); + + return filter( predicate ); + } + + @Override + public S filter(SearchPredicate searchPredicate) { + builder.filter( searchPredicate ); + return thisAsS(); + } + + public S first() { + builder.missingFirst(); + return thisAsS(); + } + + public S last() { + builder.missingLast(); + return thisAsS(); + } + + public S highest() { + builder.missingHighest(); + return thisAsS(); + } + + public S lowest() { + builder.missingLowest(); + return thisAsS(); + } + + + @Override + protected SearchSort build() { + return builder.build(); + } + + protected abstract S thisAsS(); + + protected abstract N thisAsN(); + + + private static class FieldReferenceFieldSortOptionsStep> + extends + AbstractFieldSortOptionsGenericStep, + FieldReferenceFieldSortOptionsStep> + implements FieldSortMissingValueBehaviorGenericStep> { + private final ValueModel valueModel; + + public FieldReferenceFieldSortOptionsStep(SearchSortDslContext dslContext, + FieldSortFieldReference fieldReference) { + super( dslContext, fieldReference.absolutePath() ); + this.valueModel = fieldReference.valueModel(); + } + + @Override + public FieldReferenceFieldSortOptionsStep use(T value) { + builder.missingAs( value, valueModel ); + return this; + } + + @Override + protected FieldReferenceFieldSortOptionsStep thisAsS() { + return this; + } + + @Override + protected FieldReferenceFieldSortOptionsStep thisAsN() { + return this; + } + } + + private static class StringFieldSortOptionsStep> + extends + AbstractFieldSortOptionsGenericStep, + FieldSortMissingValueBehaviorStep>> + implements FieldSortOptionsStep, PDF>, + FieldSortMissingValueBehaviorStep> { + + public StringFieldSortOptionsStep(SearchSortDslContext dslContext, + String fieldPath) { + super( dslContext, fieldPath ); + } + + @Override + public StringFieldSortOptionsStep use(Object value, ValueModel valueModel) { + builder.missingAs( value, valueModel ); + return this; + } + + @Override + protected StringFieldSortOptionsStep thisAsS() { + return this; + } + + @Override + protected StringFieldSortOptionsStep thisAsN() { + return this; + } + } +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java deleted file mode 100644 index d09455472c6..00000000000 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsGenericStepImpl.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.engine.search.sort.dsl.impl; - -import java.util.function.Function; - -import org.hibernate.search.engine.search.common.SortMode; -import org.hibernate.search.engine.search.common.ValueModel; -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.reference.sort.FieldSortFieldReference; -import org.hibernate.search.engine.search.sort.SearchSort; -import org.hibernate.search.engine.search.sort.dsl.FieldSortMissingValueBehaviorGenericStep; -import org.hibernate.search.engine.search.sort.dsl.FieldSortOptionsGenericStep; -import org.hibernate.search.engine.search.sort.dsl.SortOrder; -import org.hibernate.search.engine.search.sort.dsl.spi.AbstractSortThenStep; -import org.hibernate.search.engine.search.sort.dsl.spi.SearchSortDslContext; -import org.hibernate.search.engine.search.sort.spi.FieldSortBuilder; -import org.hibernate.search.engine.search.sort.spi.SortTypeKeys; - -public class FieldSortOptionsGenericStepImpl> - extends AbstractSortThenStep - implements - FieldSortOptionsGenericStep, - FieldSortOptionsGenericStepImpl, - PDF>, - FieldSortMissingValueBehaviorGenericStep> { - - private final SearchSortDslContext dslContext; - private final FieldSortBuilder builder; - private final ValueModel valueModel; - - public FieldSortOptionsGenericStepImpl(SearchSortDslContext dslContext, - FieldSortFieldReference fieldReference) { - super( dslContext ); - this.dslContext = dslContext; - this.builder = dslContext.scope().fieldQueryElement( fieldReference.absolutePath(), SortTypeKeys.FIELD ); - this.valueModel = fieldReference.valueModel(); - } - - @Override - public FieldSortOptionsGenericStepImpl order(SortOrder order) { - builder.order( order ); - return this; - } - - @Override - public FieldSortOptionsGenericStepImpl mode(SortMode mode) { - builder.mode( mode ); - return this; - } - - @Override - public FieldSortOptionsGenericStepImpl missing() { - return this; - } - - @Override - public FieldSortOptionsGenericStepImpl filter( - Function clauseContributor) { - SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); - - return filter( predicate ); - } - - @Override - public FieldSortOptionsGenericStepImpl filter(SearchPredicate searchPredicate) { - builder.filter( searchPredicate ); - return this; - } - - @Override - public FieldSortOptionsGenericStepImpl first() { - builder.missingFirst(); - return this; - } - - @Override - public FieldSortOptionsGenericStepImpl last() { - builder.missingLast(); - return this; - } - - @Override - public FieldSortOptionsGenericStepImpl highest() { - builder.missingHighest(); - return this; - } - - @Override - public FieldSortOptionsGenericStepImpl lowest() { - builder.missingLowest(); - return this; - } - - @Override - public FieldSortOptionsGenericStepImpl use(T value) { - builder.missingAs( value, valueModel ); - return this; - } - - @Override - protected SearchSort build() { - return builder.build(); - } - -} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsStepImpl.java deleted file mode 100644 index b903606df8a..00000000000 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/impl/FieldSortOptionsStepImpl.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.engine.search.sort.dsl.impl; - -import java.util.function.Function; - -import org.hibernate.search.engine.search.common.SortMode; -import org.hibernate.search.engine.search.common.ValueModel; -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.sort.SearchSort; -import org.hibernate.search.engine.search.sort.dsl.FieldSortMissingValueBehaviorStep; -import org.hibernate.search.engine.search.sort.dsl.FieldSortOptionsStep; -import org.hibernate.search.engine.search.sort.dsl.SortOrder; -import org.hibernate.search.engine.search.sort.dsl.spi.AbstractSortThenStep; -import org.hibernate.search.engine.search.sort.dsl.spi.SearchSortDslContext; -import org.hibernate.search.engine.search.sort.spi.FieldSortBuilder; -import org.hibernate.search.engine.search.sort.spi.SortTypeKeys; - -public class FieldSortOptionsStepImpl> - extends AbstractSortThenStep - implements FieldSortOptionsStep, PDF>, - FieldSortMissingValueBehaviorStep> { - - private final SearchSortDslContext dslContext; - private final FieldSortBuilder builder; - - public FieldSortOptionsStepImpl(SearchSortDslContext dslContext, String fieldPath) { - super( dslContext ); - this.dslContext = dslContext; - this.builder = dslContext.scope().fieldQueryElement( fieldPath, SortTypeKeys.FIELD ); - } - - @Override - public FieldSortOptionsStepImpl order(SortOrder order) { - builder.order( order ); - return this; - } - - @Override - public FieldSortOptionsStepImpl mode(SortMode mode) { - builder.mode( mode ); - return this; - } - - @Override - public FieldSortMissingValueBehaviorStep> missing() { - return this; - } - - @Override - public FieldSortOptionsStepImpl filter( - Function clauseContributor) { - SearchPredicate predicate = clauseContributor.apply( dslContext.predicateFactory() ).toPredicate(); - - return filter( predicate ); - } - - @Override - public FieldSortOptionsStepImpl filter(SearchPredicate searchPredicate) { - builder.filter( searchPredicate ); - return this; - } - - @Override - public FieldSortOptionsStepImpl first() { - builder.missingFirst(); - return this; - } - - @Override - public FieldSortOptionsStepImpl last() { - builder.missingLast(); - return this; - } - - @Override - public FieldSortOptionsStepImpl highest() { - builder.missingHighest(); - return this; - } - - @Override - public FieldSortOptionsStepImpl lowest() { - builder.missingLowest(); - return this; - } - - @Override - public FieldSortOptionsStepImpl use(Object value, ValueModel valueModel) { - builder.missingAs( value, valueModel ); - return this; - } - - @Override - protected SearchSort build() { - return builder.build(); - } - -} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java index 46a191bbfdf..3a5d93209b3 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/spi/AbstractSearchSortFactory.java @@ -22,10 +22,9 @@ import org.hibernate.search.engine.search.sort.dsl.SearchSortFactoryExtensionIfSupportedStep; import org.hibernate.search.engine.search.sort.dsl.SortFinalStep; import org.hibernate.search.engine.search.sort.dsl.SortThenStep; +import org.hibernate.search.engine.search.sort.dsl.impl.AbstractFieldSortOptionsGenericStep; import org.hibernate.search.engine.search.sort.dsl.impl.CompositeSortComponentsStepImpl; import org.hibernate.search.engine.search.sort.dsl.impl.DistanceSortOptionsStepImpl; -import org.hibernate.search.engine.search.sort.dsl.impl.FieldSortOptionsGenericStepImpl; -import org.hibernate.search.engine.search.sort.dsl.impl.FieldSortOptionsStepImpl; import org.hibernate.search.engine.search.sort.dsl.impl.ScoreSortOptionsStepImpl; import org.hibernate.search.engine.search.sort.dsl.impl.SearchSortFactoryExtensionStep; import org.hibernate.search.engine.search.sort.dsl.impl.WithParametersSortFinalStep; @@ -57,13 +56,13 @@ public SortThenStep indexOrder() { @Override public FieldSortOptionsStep field(String fieldPath) { - return new FieldSortOptionsStepImpl<>( dslContext, fieldPath ); + return AbstractFieldSortOptionsGenericStep.create( dslContext, fieldPath ); } @Override public FieldSortOptionsGenericStep> field( FieldSortFieldReference fieldReference) { - return new FieldSortOptionsGenericStepImpl<>( dslContext, fieldReference ); + return AbstractFieldSortOptionsGenericStep.create( dslContext, fieldReference ); } @Override @@ -87,7 +86,7 @@ public SortThenStep composite(Consumer withParameters(Function sortCreator) { - return new WithParametersSortFinalStep( dslContext, sortCreator ); + return new WithParametersSortFinalStep<>( dslContext, sortCreator ); } @Override From 4ae94ea3ce1c0e9438398e5078f0d3bb975acaef Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 12 Dec 2024 22:26:08 +0100 Subject: [PATCH 12/25] HSEARCH-3319 Address scope changes in the Lucene - next backend --- .../backend/lucene/LuceneExtension.java | 41 ++++++++++--------- .../impl/LuceneSearchIndexScopeImpl.java | 14 +++---- .../dsl/LuceneSearchAggregationFactory.java | 4 +- .../LuceneSearchAggregationFactoryImpl.java | 17 ++++---- .../dsl/LuceneSearchPredicateFactory.java | 2 +- .../LuceneSearchPredicateFactoryImpl.java | 11 ++--- .../predicate/impl/LuceneNamedPredicate.java | 9 ++-- .../dsl/LuceneSearchProjectionFactory.java | 5 ++- .../LuceneSearchProjectionFactoryImpl.java | 9 ++-- .../dsl/LuceneSearchQueryOptionsStep.java | 9 ++-- .../dsl/LuceneSearchQuerySelectStep.java | 25 +++++------ .../query/dsl/LuceneSearchQueryWhereStep.java | 4 +- .../LuceneSearchQueryOptionsStepImpl.java | 21 +++++----- .../impl/LuceneSearchQuerySelectStepImpl.java | 39 +++++++++--------- .../impl/LuceneSearchQueryIndexScope.java | 8 ++-- .../sort/dsl/LuceneSearchSortFactory.java | 8 ++-- .../dsl/impl/LuceneSearchSortFactoryImpl.java | 19 +++++---- 17 files changed, 129 insertions(+), 116 deletions(-) diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/LuceneExtension.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/LuceneExtension.java index 179f112a40f..43a4eb1fecb 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/LuceneExtension.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/LuceneExtension.java @@ -63,22 +63,23 @@ * * @see #get() */ -public final class LuceneExtension - implements SearchQueryDslExtension, R, E, LOS>, +public final class LuceneExtension + implements SearchQueryDslExtension, R, E, LOS>, SearchQueryExtension, H>, - SearchPredicateFactoryExtension, - SearchSortFactoryExtension, - SearchProjectionFactoryExtension, R, E>, - SearchAggregationFactoryExtension, + SearchPredicateFactoryExtension>, + SearchSortFactoryExtension>, + SearchProjectionFactoryExtension, R, E>, + SearchAggregationFactoryExtension>, IndexFieldTypeFactoryExtension, IndexScopeExtension, SchemaExportExtension { - private static final LuceneExtension INSTANCE = new LuceneExtension<>(); + private static final LuceneExtension INSTANCE = new LuceneExtension<>(); /** * Get the extension with generic parameters automatically set as appropriate for the context in which it's used. * + * @param Scope root type. * @param The type of query hits. * Users should not have to care about this, as the parameter will automatically take the appropriate value when calling * {@code .extension( LuceneExtension.get() }. @@ -94,8 +95,8 @@ public final class LuceneExtension * @return The extension. */ @SuppressWarnings("unchecked") // The instance works for any H, R and E - public static LuceneExtension get() { - return (LuceneExtension) INSTANCE; + public static LuceneExtension get() { + return (LuceneExtension) INSTANCE; } private LuceneExtension() { @@ -106,8 +107,8 @@ private LuceneExtension() { * {@inheritDoc} */ @Override - public Optional> extendOptional( - SearchQuerySelectStep original, + public Optional> extendOptional( + SearchQuerySelectStep original, SearchQueryIndexScope scope, BackendSessionContext sessionContext, SearchLoadingContextBuilder loadingContextBuilder) { @@ -139,9 +140,9 @@ public Optional> extendOptional(SearchQuery original, * {@inheritDoc} */ @Override - public Optional extendOptional(SearchPredicateFactory original) { + public Optional> extendOptional(SearchPredicateFactory original) { if ( original instanceof LuceneSearchPredicateFactory ) { - return Optional.of( (LuceneSearchPredicateFactory) original ); + return Optional.of( (LuceneSearchPredicateFactory) original ); } else { return Optional.empty(); @@ -152,10 +153,10 @@ public Optional extendOptional(SearchPredicateFact * {@inheritDoc} */ @Override - public Optional extendOptional( - SearchSortFactory original) { + public Optional> extendOptional( + SearchSortFactory original) { if ( original instanceof LuceneSearchSortFactory ) { - return Optional.of( (LuceneSearchSortFactory) original ); + return Optional.of( (LuceneSearchSortFactory) original ); } else { return Optional.empty(); @@ -166,9 +167,9 @@ public Optional extendOptional( * {@inheritDoc} */ @Override - public Optional> extendOptional(SearchProjectionFactory original) { + public Optional> extendOptional(SearchProjectionFactory original) { if ( original instanceof LuceneSearchProjectionFactory ) { - return Optional.of( (LuceneSearchProjectionFactory) original ); + return Optional.of( (LuceneSearchProjectionFactory) original ); } else { return Optional.empty(); @@ -179,9 +180,9 @@ public Optional> extendOptional(SearchProjec * {@inheritDoc} */ @Override - public Optional extendOptional(SearchAggregationFactory original) { + public Optional> extendOptional(SearchAggregationFactory original) { if ( original instanceof LuceneSearchAggregationFactory ) { - return Optional.of( (LuceneSearchAggregationFactory) original ); + return Optional.of( (LuceneSearchAggregationFactory) original ); } else { return Optional.empty(); diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java index 08770115084..e0e1b54c943 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java @@ -162,24 +162,24 @@ public

LuceneSearchQueryBuilder

select(BackendSessionContext sessionConte } @Override - public LuceneSearchPredicateFactory predicateFactory() { - return new LuceneSearchPredicateFactoryImpl( SearchPredicateDslContext.root( this ) ); + public LuceneSearchPredicateFactory predicateFactory() { + return new LuceneSearchPredicateFactoryImpl<>( SearchPredicateDslContext.root( this ) ); } @Override - public LuceneSearchSortFactory sortFactory() { - return new LuceneSearchSortFactoryImpl( SearchSortDslContext + public LuceneSearchSortFactory sortFactory() { + return new LuceneSearchSortFactoryImpl( SearchSortDslContext .root( this, LuceneSearchSortFactoryImpl::new, predicateFactory() ) ); } @Override - public LuceneSearchProjectionFactory projectionFactory() { + public LuceneSearchProjectionFactory projectionFactory() { return new LuceneSearchProjectionFactoryImpl<>( SearchProjectionDslContext.root( this ) ); } @Override - public LuceneSearchAggregationFactory aggregationFactory() { - return new LuceneSearchAggregationFactoryImpl( SearchAggregationDslContext.root( this, predicateFactory() ) ); + public LuceneSearchAggregationFactory aggregationFactory() { + return new LuceneSearchAggregationFactoryImpl( SearchAggregationDslContext.root( this, predicateFactory() ) ); } @Override diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/LuceneSearchAggregationFactory.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/LuceneSearchAggregationFactory.java index 672d8055ef7..3d7ab6f90bb 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/LuceneSearchAggregationFactory.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/LuceneSearchAggregationFactory.java @@ -7,7 +7,7 @@ import org.hibernate.search.backend.lucene.search.predicate.dsl.LuceneSearchPredicateFactory; import org.hibernate.search.engine.search.aggregation.dsl.ExtendedSearchAggregationFactory; -public interface LuceneSearchAggregationFactory - extends ExtendedSearchAggregationFactory { +public interface LuceneSearchAggregationFactory + extends ExtendedSearchAggregationFactory, LuceneSearchPredicateFactory> { } diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java index 88f7d780848..b22685c68a8 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java @@ -10,21 +10,24 @@ import org.hibernate.search.engine.search.aggregation.dsl.spi.AbstractSearchAggregationFactory; import org.hibernate.search.engine.search.aggregation.dsl.spi.SearchAggregationDslContext; -public class LuceneSearchAggregationFactoryImpl +public class LuceneSearchAggregationFactoryImpl extends AbstractSearchAggregationFactory< - LuceneSearchAggregationFactory, + SR, + LuceneSearchAggregationFactory, LuceneSearchAggregationIndexScope, - LuceneSearchPredicateFactory> - implements LuceneSearchAggregationFactory { + LuceneSearchPredicateFactory> + implements LuceneSearchAggregationFactory { public LuceneSearchAggregationFactoryImpl( - SearchAggregationDslContext, LuceneSearchPredicateFactory> dslContext) { + SearchAggregationDslContext, + LuceneSearchPredicateFactory> dslContext) { super( dslContext ); } @Override - public LuceneSearchAggregationFactory withRoot(String objectFieldPath) { - return new LuceneSearchAggregationFactoryImpl( dslContext.rescope( + public LuceneSearchAggregationFactory withRoot(String objectFieldPath) { + return new LuceneSearchAggregationFactoryImpl( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/LuceneSearchPredicateFactory.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/LuceneSearchPredicateFactory.java index 5bfdfc80fad..9fc4d5f8c77 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/LuceneSearchPredicateFactory.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/LuceneSearchPredicateFactory.java @@ -12,7 +12,7 @@ /** * A factory for search predicates with some Lucene-specific methods. */ -public interface LuceneSearchPredicateFactory extends ExtendedSearchPredicateFactory { +public interface LuceneSearchPredicateFactory extends ExtendedSearchPredicateFactory> { /** * Create a predicate from a Lucene {@link Query}. diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java index 121daec55d3..bb73666ba1b 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java @@ -13,19 +13,20 @@ import org.apache.lucene.search.Query; -public class LuceneSearchPredicateFactoryImpl +public class LuceneSearchPredicateFactoryImpl extends AbstractSearchPredicateFactory< - LuceneSearchPredicateFactory, + SR, + LuceneSearchPredicateFactory, LuceneSearchPredicateIndexScope> - implements LuceneSearchPredicateFactory { + implements LuceneSearchPredicateFactory { public LuceneSearchPredicateFactoryImpl(SearchPredicateDslContext> dslContext) { super( dslContext ); } @Override - public LuceneSearchPredicateFactory withRoot(String objectFieldPath) { - return new LuceneSearchPredicateFactoryImpl( dslContext.rescope( + public LuceneSearchPredicateFactory withRoot(String objectFieldPath) { + return new LuceneSearchPredicateFactoryImpl( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); } diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/impl/LuceneNamedPredicate.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/impl/LuceneNamedPredicate.java index 789c1fb1b3e..8da0453254e 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/impl/LuceneNamedPredicate.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/impl/LuceneNamedPredicate.java @@ -70,7 +70,7 @@ private static class Builder extends AbstractBuilder implements NamedPredicateBu private final PredicateDefinition definition; private final String predicateName; private final LuceneSearchIndexCompositeNodeContext field; - private SearchPredicateFactory factory; + private SearchPredicateFactory factory; private final Map params = new LinkedHashMap<>(); Builder(PredicateDefinition definition, String predicateName, LuceneSearchIndexScope scope, @@ -82,7 +82,7 @@ private static class Builder extends AbstractBuilder implements NamedPredicateBu } @Override - public void factory(SearchPredicateFactory factory) { + public void factory(SearchPredicateFactory factory) { this.factory = factory; } @@ -93,8 +93,9 @@ public void param(String name, Object value) { @Override public SearchPredicate build() { - NamedValuesBasedPredicateDefinitionContext ctx = new NamedValuesBasedPredicateDefinitionContext( factory, params, - name -> QueryLog.INSTANCE.paramNotDefined( name, predicateName, field.eventContext() ) ); + NamedValuesBasedPredicateDefinitionContext ctx = + new NamedValuesBasedPredicateDefinitionContext<>( factory, params, + name -> QueryLog.INSTANCE.paramNotDefined( name, predicateName, field.eventContext() ) ); LuceneSearchPredicate providedPredicate = LuceneSearchPredicate.from( scope, definition.create( ctx ) ); diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/LuceneSearchProjectionFactory.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/LuceneSearchProjectionFactory.java index abf30741110..94d8717e4c0 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/LuceneSearchProjectionFactory.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/LuceneSearchProjectionFactory.java @@ -15,12 +15,13 @@ /** * A factory for search projections with some Lucene-specific methods. * + * @param Scope root type. * @param The type of entity references. * @param The type of entities. * @see SearchProjectionFactory */ -public interface LuceneSearchProjectionFactory - extends ExtendedSearchProjectionFactory, R, E> { +public interface LuceneSearchProjectionFactory + extends ExtendedSearchProjectionFactory, R, E> { /** * Project to a Lucene {@link Document} containing all the stored fields. diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/impl/LuceneSearchProjectionFactoryImpl.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/impl/LuceneSearchProjectionFactoryImpl.java index daf4eb4bfdd..8b1d8c2d554 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/impl/LuceneSearchProjectionFactoryImpl.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/projection/dsl/impl/LuceneSearchProjectionFactoryImpl.java @@ -15,20 +15,21 @@ import org.apache.lucene.document.Document; import org.apache.lucene.search.Explanation; -public class LuceneSearchProjectionFactoryImpl +public class LuceneSearchProjectionFactoryImpl extends AbstractSearchProjectionFactory< - LuceneSearchProjectionFactory, + SR, + LuceneSearchProjectionFactory, LuceneSearchProjectionIndexScope, R, E> - implements LuceneSearchProjectionFactory { + implements LuceneSearchProjectionFactory { public LuceneSearchProjectionFactoryImpl(SearchProjectionDslContext> dslContext) { super( dslContext ); } @Override - public LuceneSearchProjectionFactory withRoot(String objectFieldPath) { + public LuceneSearchProjectionFactory withRoot(String objectFieldPath) { return new LuceneSearchProjectionFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); } diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryOptionsStep.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryOptionsStep.java index fca7d25b2f6..df0f94d6d2d 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryOptionsStep.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryOptionsStep.java @@ -10,13 +10,14 @@ import org.hibernate.search.backend.lucene.search.sort.dsl.LuceneSearchSortFactory; import org.hibernate.search.engine.search.query.dsl.SearchQueryOptionsStep; -public interface LuceneSearchQueryOptionsStep +public interface LuceneSearchQueryOptionsStep extends SearchQueryOptionsStep< - LuceneSearchQueryOptionsStep, + SR, + LuceneSearchQueryOptionsStep, H, LOS, - LuceneSearchSortFactory, - LuceneSearchAggregationFactory>, + LuceneSearchSortFactory, + LuceneSearchAggregationFactory>, LuceneSearchFetchable { @Override diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQuerySelectStep.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQuerySelectStep.java index 0c64a658dd4..44d180ae731 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQuerySelectStep.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQuerySelectStep.java @@ -13,33 +13,34 @@ import org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep; import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep; -public interface LuceneSearchQuerySelectStep +public interface LuceneSearchQuerySelectStep extends SearchQuerySelectStep< - LuceneSearchQueryOptionsStep, + SR, + LuceneSearchQueryOptionsStep, R, E, LOS, - LuceneSearchProjectionFactory, - LuceneSearchPredicateFactory>, - LuceneSearchQueryWhereStep { + LuceneSearchProjectionFactory, + LuceneSearchPredicateFactory>, + LuceneSearchQueryWhereStep { @Override - LuceneSearchQueryWhereStep selectEntity(); + LuceneSearchQueryWhereStep selectEntity(); @Override - LuceneSearchQueryWhereStep selectEntityReference(); + LuceneSearchQueryWhereStep selectEntityReference(); @Override -

LuceneSearchQueryWhereStep select(Class

objectClass); +

LuceneSearchQueryWhereStep select(Class

objectClass); @Override -

LuceneSearchQueryWhereStep select( - Function, ? extends ProjectionFinalStep

> projectionContributor); +

LuceneSearchQueryWhereStep select( + Function, ? extends ProjectionFinalStep

> projectionContributor); @Override -

LuceneSearchQueryWhereStep select(SearchProjection

projection); +

LuceneSearchQueryWhereStep select(SearchProjection

projection); @Override - LuceneSearchQueryWhereStep, LOS> select(SearchProjection... projections); + LuceneSearchQueryWhereStep, LOS> select(SearchProjection... projections); } diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryWhereStep.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryWhereStep.java index 04aa09d4e43..cfe93fdeb8c 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryWhereStep.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/LuceneSearchQueryWhereStep.java @@ -7,7 +7,7 @@ import org.hibernate.search.backend.lucene.search.predicate.dsl.LuceneSearchPredicateFactory; import org.hibernate.search.engine.search.query.dsl.SearchQueryWhereStep; -public interface LuceneSearchQueryWhereStep - extends SearchQueryWhereStep, H, LOS, LuceneSearchPredicateFactory> { +public interface LuceneSearchQueryWhereStep + extends SearchQueryWhereStep, H, LOS, LuceneSearchPredicateFactory> { } diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQueryOptionsStepImpl.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQueryOptionsStepImpl.java index b7eec76fa5e..3515b979882 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQueryOptionsStepImpl.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQueryOptionsStepImpl.java @@ -18,18 +18,19 @@ import org.hibernate.search.engine.search.loading.spi.SearchLoadingContextBuilder; import org.hibernate.search.engine.search.query.dsl.spi.AbstractExtendedSearchQueryOptionsStep; -class LuceneSearchQueryOptionsStepImpl +class LuceneSearchQueryOptionsStepImpl extends AbstractExtendedSearchQueryOptionsStep< - LuceneSearchQueryOptionsStep, + SR, + LuceneSearchQueryOptionsStep, H, LuceneSearchResult, LuceneSearchScroll, LOS, - LuceneSearchPredicateFactory, - LuceneSearchSortFactory, - LuceneSearchAggregationFactory, + LuceneSearchPredicateFactory, + LuceneSearchSortFactory, + LuceneSearchAggregationFactory, LuceneSearchQueryIndexScope> - implements LuceneSearchQueryWhereStep, LuceneSearchQueryOptionsStep { + implements LuceneSearchQueryWhereStep, LuceneSearchQueryOptionsStep { private final LuceneSearchQueryBuilder searchQueryBuilder; @@ -46,22 +47,22 @@ public LuceneSearchQuery toQuery() { } @Override - protected LuceneSearchQueryOptionsStepImpl thisAsS() { + protected LuceneSearchQueryOptionsStepImpl thisAsS() { return this; } @Override - protected LuceneSearchPredicateFactory predicateFactory() { + protected LuceneSearchPredicateFactory predicateFactory() { return scope.predicateFactory(); } @Override - protected LuceneSearchSortFactory sortFactory() { + protected LuceneSearchSortFactory sortFactory() { return scope.sortFactory(); } @Override - protected LuceneSearchAggregationFactory aggregationFactory() { + protected LuceneSearchAggregationFactory aggregationFactory() { return scope.aggregationFactory(); } diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQuerySelectStepImpl.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQuerySelectStepImpl.java index 4ed9a537a84..2a1283cb6e3 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQuerySelectStepImpl.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/dsl/impl/LuceneSearchQuerySelectStepImpl.java @@ -26,15 +26,16 @@ import org.hibernate.search.engine.search.projection.spi.ProjectionCompositor; import org.hibernate.search.engine.search.query.dsl.spi.AbstractSearchQuerySelectStep; -public class LuceneSearchQuerySelectStepImpl +public class LuceneSearchQuerySelectStepImpl extends AbstractSearchQuerySelectStep< - LuceneSearchQueryOptionsStep, + SR, + LuceneSearchQueryOptionsStep, R, E, LOS, - LuceneSearchProjectionFactory, - LuceneSearchPredicateFactory> - implements LuceneSearchQuerySelectStep { + LuceneSearchProjectionFactory, + LuceneSearchPredicateFactory> + implements LuceneSearchQuerySelectStep { private final LuceneSearchQueryIndexScope scope; private final BackendSessionContext sessionContext; @@ -49,56 +50,56 @@ public LuceneSearchQuerySelectStepImpl(LuceneSearchQueryIndexScope scope, } @Override - public LuceneSearchQueryWhereStep selectEntity() { - return select( scope.projectionFactory().entity().toProjection() ); + public LuceneSearchQueryWhereStep selectEntity() { + return select( scope.projectionFactory().entity().toProjection() ); } @Override - public LuceneSearchQueryWhereStep selectEntityReference() { + public LuceneSearchQueryWhereStep selectEntityReference() { return select( scope.projectionBuilders().entityReference() ); } @Override - public

LuceneSearchQueryWhereStep select(Class

objectClass) { + public

LuceneSearchQueryWhereStep select(Class

objectClass) { return select( scope.projectionFactory().composite().as( objectClass ).toProjection() ); } @Override - public

LuceneSearchQueryWhereStep select( - Function, ? extends ProjectionFinalStep

> projectionContributor) { + public

LuceneSearchQueryWhereStep select( + Function, ? extends ProjectionFinalStep

> projectionContributor) { SearchProjection

projection = projectionContributor.apply( scope.projectionFactory() ).toProjection(); return select( projection ); } @Override - public

LuceneSearchQueryWhereStep select(SearchProjection

projection) { + public

LuceneSearchQueryWhereStep select(SearchProjection

projection) { LuceneSearchQueryBuilder

builder = scope.select( sessionContext, loadingContextBuilder, projection ); return new LuceneSearchQueryOptionsStepImpl<>( scope, builder, loadingContextBuilder ); } @Override - public LuceneSearchQueryWhereStep, LOS> select(SearchProjection... projections) { + public LuceneSearchQueryWhereStep, LOS> select(SearchProjection... projections) { return select( scope.projectionBuilders().composite() .build( projections, ProjectionCompositor.fromList( projections.length ), ProjectionCollector.nullable() ) ); } @Override - public LuceneSearchQueryOptionsStep where(SearchPredicate predicate) { + public LuceneSearchQueryOptionsStep where(SearchPredicate predicate) { return selectEntity().where( predicate ); } @Override - public LuceneSearchQueryOptionsStep where( - Function predicateContributor) { + public LuceneSearchQueryOptionsStep where( + Function, ? extends PredicateFinalStep> predicateContributor) { return selectEntity().where( predicateContributor ); } @Override - public LuceneSearchQueryOptionsStep where( - BiConsumer> predicateContributor) { + public LuceneSearchQueryOptionsStep where( + BiConsumer, + ? super SimpleBooleanPredicateClausesCollector> predicateContributor) { return selectEntity().where( predicateContributor ); } diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/impl/LuceneSearchQueryIndexScope.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/impl/LuceneSearchQueryIndexScope.java index e9568937880..026703216b8 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/impl/LuceneSearchQueryIndexScope.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/impl/LuceneSearchQueryIndexScope.java @@ -36,16 +36,16 @@

LuceneSearchQueryBuilder

select(BackendSessionContext sessionContext, SearchLoadingContextBuilder loadingContextBuilder, SearchProjection

projection); @Override - LuceneSearchPredicateFactory predicateFactory(); + LuceneSearchPredicateFactory predicateFactory(); @Override - LuceneSearchSortFactory sortFactory(); + LuceneSearchSortFactory sortFactory(); @Override - LuceneSearchProjectionFactory projectionFactory(); + LuceneSearchProjectionFactory projectionFactory(); @Override - LuceneSearchAggregationFactory aggregationFactory(); + LuceneSearchAggregationFactory aggregationFactory(); Query filterOrNull(String tenantId); diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/LuceneSearchSortFactory.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/LuceneSearchSortFactory.java index 089b619e4c9..452199ba1dd 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/LuceneSearchSortFactory.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/LuceneSearchSortFactory.java @@ -14,8 +14,8 @@ /** * A factory for search sorts with some Lucene-specific methods. */ -public interface LuceneSearchSortFactory - extends ExtendedSearchSortFactory { +public interface LuceneSearchSortFactory + extends ExtendedSearchSortFactory, LuceneSearchPredicateFactory> { /** * Order elements by a given Lucene {@link SortField}. @@ -24,7 +24,7 @@ public interface LuceneSearchSortFactory * @return A {@link SortThenStep} allowing the retrieval of the sort * or the chaining of other sorts. */ - SortThenStep fromLuceneSortField(SortField luceneSortField); + SortThenStep fromLuceneSortField(SortField luceneSortField); /** * Order elements by a given Lucene {@link Sort}. @@ -33,6 +33,6 @@ public interface LuceneSearchSortFactory * @return A {@link SortThenStep} allowing the retrieval of the sort * or the chaining of other sorts. */ - SortThenStep fromLuceneSort(Sort luceneSort); + SortThenStep fromLuceneSort(Sort luceneSort); } diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java index 4281a1156d6..925879d6e3a 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java @@ -14,32 +14,33 @@ import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; -public class LuceneSearchSortFactoryImpl +public class LuceneSearchSortFactoryImpl extends AbstractSearchSortFactory< - LuceneSearchSortFactory, + SR, + LuceneSearchSortFactory, LuceneSearchSortIndexScope, - LuceneSearchPredicateFactory> - implements LuceneSearchSortFactory { + LuceneSearchPredicateFactory> + implements LuceneSearchSortFactory { public LuceneSearchSortFactoryImpl( - SearchSortDslContext, LuceneSearchPredicateFactory> dslContext) { + SearchSortDslContext, LuceneSearchPredicateFactory> dslContext) { super( dslContext ); } @Override - public LuceneSearchSortFactory withRoot(String objectFieldPath) { - return new LuceneSearchSortFactoryImpl( dslContext.rescope( + public LuceneSearchSortFactory withRoot(String objectFieldPath) { + return new LuceneSearchSortFactoryImpl( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } @Override - public SortThenStep fromLuceneSortField(SortField luceneSortField) { + public SortThenStep fromLuceneSortField(SortField luceneSortField) { return staticThenStep( dslContext.scope().sortBuilders().fromLuceneSortField( luceneSortField ) ); } @Override - public SortThenStep fromLuceneSort(Sort luceneSort) { + public SortThenStep fromLuceneSort(Sort luceneSort) { return staticThenStep( dslContext.scope().sortBuilders().fromLuceneSort( luceneSort ) ); } From c6abe95ca5916e90d632fcb5061a91ff2af24aac Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Mon, 10 Mar 2025 16:40:41 +0100 Subject: [PATCH 13/25] HSEARCH-3319 More field references --- .../dsl/AvgAggregationFieldStep.java | 13 +++ .../dsl/CountAggregationFieldStep.java | 12 ++ .../CountDistinctAggregationFieldStep.java | 11 ++ .../dsl/MaxAggregationFieldStep.java | 13 +++ .../dsl/MinAggregationFieldStep.java | 13 +++ .../dsl/SumAggregationFieldStep.java | 13 +++ .../AvgAggregationFieldReference.java | 8 ++ .../CountAggregationFieldReference.java | 8 ++ ...ountDistinctAggregationFieldReference.java | 8 ++ .../MaxAggregationFieldReference.java | 8 ++ .../MinAggregationFieldReference.java | 8 ++ .../SumAggregationFieldReference.java | 8 ++ .../sort/DistanceSortFieldReference.java | 8 ++ .../reference/spi/TraitReferenceMapping.java | 106 ++++++++++++++++++ .../sort/dsl/ExtendedSearchSortFactory.java | 5 +- .../search/sort/dsl/SearchSortFactory.java | 5 +- .../spi/TraitReferenceMappingTest.java | 49 ++++++++ 17 files changed, 292 insertions(+), 4 deletions(-) create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AvgAggregationFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountAggregationFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountDistinctAggregationFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MaxAggregationFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MinAggregationFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/SumAggregationFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMapping.java create mode 100644 engine/src/test/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMappingTest.java diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java index cac2fa772f0..f3d921826d7 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java @@ -8,6 +8,7 @@ import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.aggregation.AvgAggregationFieldReference; import org.hibernate.search.util.common.annotation.Incubating; /** @@ -44,4 +45,16 @@ public interface AvgAggregationFieldStep AvgAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel); + /** + * Target the given field in the avg aggregation. + * + * @param reference The field reference representing a path to the index field to aggregate. + * @param The type of field values or {@link Double} if a double result is required. + * @return The next step. + */ + @Incubating + default AvgAggregationOptionsStep field(AvgAggregationFieldReference reference) { + return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() ); + } + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java index 9960e509b5c..7f4faa6dfec 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java @@ -7,6 +7,8 @@ import java.util.function.Function; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.aggregation.CountAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference; import org.hibernate.search.util.common.annotation.Incubating; /** @@ -26,4 +28,14 @@ public interface CountAggregationFieldStep field(String fieldPath); + /** + * Target the given field in the avg aggregation. + * + * @param reference The field reference representing a path to the index field to aggregate. + * @return The next step. + */ + @Incubating + default CountAggregationOptionsStep field(CountAggregationFieldReference reference) { + return field( reference.absolutePath() ); + } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java index 7d3bab192d6..f17292ecb4b 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java @@ -7,6 +7,7 @@ import java.util.function.Function; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.aggregation.CountAggregationFieldReference; import org.hibernate.search.util.common.annotation.Incubating; /** @@ -26,4 +27,14 @@ public interface CountDistinctAggregationFieldStep field(String fieldPath); + /** + * Target the given field in the avg aggregation. + * + * @param reference The field reference representing a path to the index field to aggregate. + * @return The next step. + */ + @Incubating + default CountDistinctAggregationOptionsStep field(CountAggregationFieldReference reference) { + return field( reference.absolutePath() ); + } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java index ec64558e191..13c0ca6041f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java @@ -8,6 +8,8 @@ import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.aggregation.AvgAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference; import org.hibernate.search.util.common.annotation.Incubating; /** @@ -43,4 +45,15 @@ public interface MaxAggregationFieldStep MaxAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel); + /** + * Target the given field in the avg aggregation. + * + * @param reference The field reference representing a path to the index field to aggregate. + * @param The type of field values. + * @return The next step. + */ + @Incubating + default MaxAggregationOptionsStep field(MaxAggregationFieldReference reference) { + return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() ); + } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java index bcc427aa269..72b3ed0f360 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java @@ -8,6 +8,8 @@ import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.MinAggregationFieldReference; import org.hibernate.search.util.common.annotation.Incubating; /** @@ -43,4 +45,15 @@ public interface MinAggregationFieldStep MinAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel); + /** + * Target the given field in the avg aggregation. + * + * @param reference The field reference representing a path to the index field to aggregate. + * @param The type of field values. + * @return The next step. + */ + @Incubating + default MinAggregationOptionsStep field(MinAggregationFieldReference reference) { + return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() ); + } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java index 6ec8a9a2cc9..37b20a21e56 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java @@ -8,6 +8,8 @@ import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.SumAggregationFieldReference; import org.hibernate.search.util.common.annotation.Incubating; /** @@ -43,4 +45,15 @@ public interface SumAggregationFieldStep SumAggregationOptionsStep field(String fieldPath, Class type, ValueModel valueModel); + /** + * Target the given field in the avg aggregation. + * + * @param reference The field reference representing a path to the index field to aggregate. + * @param The type of field values. + * @return The next step. + */ + @Incubating + default SumAggregationOptionsStep field(SumAggregationFieldReference reference) { + return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() ); + } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AvgAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AvgAggregationFieldReference.java new file mode 100644 index 00000000000..92b777059fc --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AvgAggregationFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.aggregation; + +public interface AvgAggregationFieldReference extends TypedAggregationFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountAggregationFieldReference.java new file mode 100644 index 00000000000..c9b5afb22a1 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountAggregationFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.aggregation; + +public interface CountAggregationFieldReference extends AggregationFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountDistinctAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountDistinctAggregationFieldReference.java new file mode 100644 index 00000000000..525453642e4 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountDistinctAggregationFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.aggregation; + +public interface CountDistinctAggregationFieldReference extends AggregationFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MaxAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MaxAggregationFieldReference.java new file mode 100644 index 00000000000..df27ede89d7 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MaxAggregationFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.aggregation; + +public interface MaxAggregationFieldReference extends TypedAggregationFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MinAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MinAggregationFieldReference.java new file mode 100644 index 00000000000..bde4800dcd2 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MinAggregationFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.aggregation; + +public interface MinAggregationFieldReference extends TypedAggregationFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/SumAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/SumAggregationFieldReference.java new file mode 100644 index 00000000000..99bca43ef1f --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/SumAggregationFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.aggregation; + +public interface SumAggregationFieldReference extends TypedAggregationFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java new file mode 100644 index 00000000000..7c898906936 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.sort; + +public interface DistanceSortFieldReference extends TypedSortFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMapping.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMapping.java new file mode 100644 index 00000000000..bfe3068a48b --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMapping.java @@ -0,0 +1,106 @@ +package org.hibernate.search.engine.search.reference.spi; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.search.engine.backend.types.IndexFieldTraits; +import org.hibernate.search.engine.search.reference.aggregation.AvgAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.CountAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.CountDistinctAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.MinAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.RangeAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.SumAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.TermsAggregationFieldReference; +import org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.KnnPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.NestedPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.SpatialWithinBoundingBoxPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.SpatialWithinCirclePredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.SpatialWithinPolygonPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference; +import org.hibernate.search.engine.search.reference.projection.DistanceProjectionFieldReference; +import org.hibernate.search.engine.search.reference.projection.FieldProjectionFieldReference; +import org.hibernate.search.engine.search.reference.projection.HighlightProjectionFieldReference; +import org.hibernate.search.engine.search.reference.projection.ObjectProjectionFieldReference; +import org.hibernate.search.engine.search.reference.sort.DistanceSortFieldReference; +import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating +public class TraitReferenceMapping { + private final Map traits; + + private TraitReferenceMapping() { + Map traits = new HashMap<>( backendSpecificTraits() ); + + traits.put( IndexFieldTraits.Predicates.EXISTS, new ReferenceDetails( ExistsPredicateFieldReference.class, "P0" ) ); + traits.put( IndexFieldTraits.Predicates.KNN, new ReferenceDetails( KnnPredicateFieldReference.class, "P1" ) ); + traits.put( IndexFieldTraits.Predicates.MATCH, new ReferenceDetails( MatchPredicateFieldReference.class, "P2" ) ); + traits.put( IndexFieldTraits.Predicates.NESTED, new ReferenceDetails( NestedPredicateFieldReference.class, "P3" ) ); + traits.put( IndexFieldTraits.Predicates.PHRASE, new ReferenceDetails( PhrasePredicateFieldReference.class, "P4" ) ); + traits.put( IndexFieldTraits.Predicates.PREFIX, new ReferenceDetails( PrefixPredicateFieldReference.class, "P5" ) ); + traits.put( IndexFieldTraits.Predicates.RANGE, new ReferenceDetails( RangePredicateFieldReference.class, "P6" ) ); + traits.put( IndexFieldTraits.Predicates.QUERY_STRING, + new ReferenceDetails( QueryStringPredicateFieldReference.class, "P7" ) ); + traits.put( IndexFieldTraits.Predicates.REGEXP, new ReferenceDetails( RegexpPredicateFieldReference.class, "P8" ) ); + traits.put( IndexFieldTraits.Predicates.SIMPLE_QUERY_STRING, + new ReferenceDetails( SimpleQueryStringPredicateFieldReference.class, "P9" ) ); + traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_BOUNDING_BOX, + new ReferenceDetails( SpatialWithinBoundingBoxPredicateFieldReference.class, "P10" ) ); + traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_CIRCLE, + new ReferenceDetails( SpatialWithinCirclePredicateFieldReference.class, "P11" ) ); + traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_POLYGON, + new ReferenceDetails( SpatialWithinPolygonPredicateFieldReference.class, "P12" ) ); + traits.put( IndexFieldTraits.Predicates.TERMS, new ReferenceDetails( TermsPredicateFieldReference.class, "P13" ) ); + traits.put( IndexFieldTraits.Predicates.WILDCARD, + new ReferenceDetails( WildcardPredicateFieldReference.class, "P14" ) ); + + traits.put( IndexFieldTraits.Sorts.DISTANCE, new ReferenceDetails( DistanceSortFieldReference.class, "S0" ) ); + traits.put( IndexFieldTraits.Sorts.FIELD, new ReferenceDetails( FieldSortFieldReference.class, "S1" ) ); + + traits.put( IndexFieldTraits.Projections.DISTANCE, + new ReferenceDetails( DistanceProjectionFieldReference.class, "R0" ) ); + traits.put( IndexFieldTraits.Projections.FIELD, new ReferenceDetails( FieldProjectionFieldReference.class, "R1" ) ); + traits.put( IndexFieldTraits.Projections.HIGHLIGHT, + new ReferenceDetails( HighlightProjectionFieldReference.class, "R2" ) ); + traits.put( IndexFieldTraits.Projections.OBJECT, new ReferenceDetails( ObjectProjectionFieldReference.class, "R3" ) ); + + traits.put( IndexFieldTraits.Aggregations.RANGE, new ReferenceDetails( RangeAggregationFieldReference.class, "A0" ) ); + traits.put( IndexFieldTraits.Aggregations.TERMS, new ReferenceDetails( TermsAggregationFieldReference.class, "A1" ) ); + traits.put( IndexFieldTraits.Aggregations.SUM, new ReferenceDetails( SumAggregationFieldReference.class, "A2" ) ); + traits.put( IndexFieldTraits.Aggregations.MIN, new ReferenceDetails( MinAggregationFieldReference.class, "A3" ) ); + traits.put( IndexFieldTraits.Aggregations.MAX, new ReferenceDetails( MaxAggregationFieldReference.class, "A4" ) ); + traits.put( IndexFieldTraits.Aggregations.COUNT, new ReferenceDetails( CountAggregationFieldReference.class, "A5" ) ); + traits.put( IndexFieldTraits.Aggregations.COUNT_DISTINCT, + new ReferenceDetails( CountDistinctAggregationFieldReference.class, "A6" ) ); + traits.put( IndexFieldTraits.Aggregations.AVG, new ReferenceDetails( AvgAggregationFieldReference.class, "A7" ) ); + + this.traits = Collections.unmodifiableMap( traits ); + } + + protected Map backendSpecificTraits() { + return Map.of(); + } + + public static TraitReferenceMapping instance() { + return new TraitReferenceMapping(); + } + + public ReferenceDetails reference(String traitName) { + return traits.get( traitName ); + } + + public record ReferenceDetails(Class referenceClass, String implementationLabel) { + } + +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java index e735859d403..602bba0bf39 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java @@ -7,6 +7,7 @@ import java.util.function.Function; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.sort.DistanceSortFieldReference; import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; import org.hibernate.search.engine.spatial.GeoPoint; @@ -42,13 +43,13 @@ public interface ExtendedSearchSortFactory< } @Override - default DistanceSortOptionsStep distance(FieldSortFieldReference fieldReference, + default DistanceSortOptionsStep distance(DistanceSortFieldReference fieldReference, GeoPoint location) { return distance( fieldReference.absolutePath(), location ); } @Override - default DistanceSortOptionsStep distance(FieldSortFieldReference fieldReference, double latitude, + default DistanceSortOptionsStep distance(DistanceSortFieldReference fieldReference, double latitude, double longitude) { return distance( fieldReference, GeoPoint.of( latitude, longitude ) ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java index fcc01d27170..0fbdf3444bb 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java @@ -9,6 +9,7 @@ import org.hibernate.search.engine.search.common.NamedValues; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; +import org.hibernate.search.engine.search.reference.sort.DistanceSortFieldReference; import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; import org.hibernate.search.engine.spatial.GeoPoint; import org.hibernate.search.util.common.SearchException; @@ -102,7 +103,7 @@ public interface SearchSortFactory { */ @Incubating default DistanceSortOptionsStep> distance( - FieldSortFieldReference fieldReference, GeoPoint location) { + DistanceSortFieldReference fieldReference, GeoPoint location) { return distance( fieldReference.absolutePath(), location ); } @@ -137,7 +138,7 @@ public interface SearchSortFactory { */ @Incubating default DistanceSortOptionsStep> distance( - FieldSortFieldReference fieldReference, double latitude, + DistanceSortFieldReference fieldReference, double latitude, double longitude) { return distance( fieldReference, GeoPoint.of( latitude, longitude ) ); } diff --git a/engine/src/test/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMappingTest.java b/engine/src/test/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMappingTest.java new file mode 100644 index 00000000000..37956135c27 --- /dev/null +++ b/engine/src/test/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMappingTest.java @@ -0,0 +1,49 @@ +package org.hibernate.search.engine.search.reference.spi; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.fail; + +import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Stream; + +import org.hibernate.search.engine.backend.types.IndexFieldTraits; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class TraitReferenceMappingTest { + + @MethodSource("traitNames") + @ParameterizedTest + void allTraitsPresent(String traitName) { + assertThat( TraitReferenceMapping.instance().reference( traitName ) ) + .isNotNull(); + } + + private static Stream traitNames() { + Set traitNames = new HashSet<>(); + traitNames.addAll( traitNames( IndexFieldTraits.Predicates.class ) ); + traitNames.addAll( traitNames( IndexFieldTraits.Projections.class ) ); + traitNames.addAll( traitNames( IndexFieldTraits.Sorts.class ) ); + traitNames.addAll( traitNames( IndexFieldTraits.Aggregations.class ) ); + return traitNames.stream().map( Arguments::of ); + } + + private static Set traitNames(Class clazz) { + Set traits = new HashSet<>(); + for ( Field field : clazz.getDeclaredFields() ) { + if ( java.lang.reflect.Modifier.isStatic( field.getModifiers() ) ) { + try { + traits.add( (String) field.get( null ) ); + } + catch (IllegalAccessException e) { + fail( "Unexpected exception: " + e ); + } + } + } + return traits; + } +} From 69d7ef3a1130ffa6ecbd5f111d2791565aa6f8e1 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Tue, 14 Jan 2025 11:36:37 +0100 Subject: [PATCH 14/25] HSEARCH-5300 Experiment with the annotation processor to generate the metamodel --- bom/public/pom.xml | 5 + .../build/enforcer/MavenProjectUtils.java | 5 +- build/jqassistant/rules/rules.xml | 2 + build/parents/build/pom.xml | 5 + build/reports/pom.xml | 4 + distribution/pom.xml | 2 + documentation/pom.xml | 5 + .../search/predicate/FieldReferenceIT.java | 2 +- .../types/converter/spi/DslConverter.java | 9 + .../dsl/CountAggregationFieldStep.java | 1 - .../dsl/MaxAggregationFieldStep.java | 1 - .../dsl/MinAggregationFieldStep.java | 1 - .../dsl/SumAggregationFieldStep.java | 1 - .../dsl/SearchProjectionFactory.java | 2 +- .../predicate/PredicateFieldReference.java | 1 + .../DistanceProjectionFieldReference.java | 2 +- .../sort/DistanceSortFieldReference.java | 2 +- .../reference/spi/TraitReferenceMapping.java | 106 ------ .../sort/dsl/ExtendedSearchSortFactory.java | 5 +- .../search/sort/dsl/SearchSortFactory.java | 4 +- ...PojoValueBridgeDocumentValueConverter.java | 4 + .../MappingAnnotationProcessorContext.java | 2 +- ...ractMappingAnnotationProcessorContext.java | 1 + .../impl/AnnotationProcessorProvider.java | 1 + .../impl/IndexedEmbeddedProcessor.java | 1 + .../impl/ObjectProjectionProcessor.java | 1 + .../MappingAnnotationProcessorUtils.java | 4 +- ...stractPojoModelsBootstrapIntrospector.java | 26 +- .../model/spi/PojoBootstrapIntrospector.java | 30 ++ .../StandalonePojoIntegrationBooterImpl.java | 16 +- .../spi/StandalonePojoIntegrationBooter.java | 5 + .../impl/StandalonePojoMappingInitiator.java | 4 +- metamodel/metamodel-processor/pom.xml | 104 ++++++ .../HibernateSearchMetamodelProcessor.java | 59 ++++ ...rnateSearchMetamodelProcessorSettings.java | 42 +++ .../AbstractProcessorAnnotationProcessor.java | 143 ++++++++ ...ractProcessorFieldAnnotationProcessor.java | 66 ++++ ...orNonFullTextFieldAnnotationProcessor.java | 59 ++++ ...essorStandardFieldAnnotationProcessor.java | 45 +++ .../ProcessorAnnotationProcessorContext.java | 24 ++ .../impl/ProcessorDocumentIdProcessor.java | 36 ++ .../impl/ProcessorFulltextFieldProcessor.java | 98 ++++++ .../impl/ProcessorGenericFieldProcessor.java | 40 +++ .../ProcessorGeoPointBindingProcessor.java | 58 ++++ .../ProcessorIndexedEmbeddedProcessor.java | 97 ++++++ .../impl/ProcessorKeywordFieldProcessor.java | 61 ++++ .../impl/ProcessorLatitudeProcessor.java | 32 ++ .../impl/ProcessorLongitudeProcessor.java | 32 ++ .../ProcessorNonStandardFieldProcessor.java | 40 +++ ...sorPropertyMappingAnnotationProcessor.java | 81 +++++ .../ProcessorScaledNumberFieldProcessor.java | 47 +++ ...ocessorTypeMappingAnnotationProcessor.java | 29 ++ ...ProcessorTypePropertyBindingProcessor.java | 90 +++++ .../impl/ProcessorVectorFieldProcessor.java | 143 ++++++++ ...ernateSearchMetamodelProcessorContext.java | 16 + ...xedEntityMetamodelAnnotationProcessor.java | 203 +++++++++++ .../impl/MetamodelAnnotationProcessor.java | 13 + .../processor/impl/ProcessorElementUtils.java | 94 ++++++ .../processor/logging/impl/MappingLog.java | 39 +++ .../processor/logging/impl/ProcessorLog.java | 17 + .../impl/ProcessorIntrospectorContext.java | 63 ++++ ...cessorPojoModelsBootstrapIntrospector.java | 90 +++++ .../impl/BuiltInBridgeResolverTypes.java | 144 ++++++++ .../impl/ProcessorPojoPropertyModel.java | 90 +++++ .../model/impl/ProcessorPojoRawTypeModel.java | 254 ++++++++++++++ .../model/impl/ProcessorTypeOrdering.java | 32 ++ .../metamodel/processor/package-info.java | 1 + .../processor/writer/impl/ClassProperty.java | 27 ++ .../writer/impl/MetamodelClassWriter.java | 314 ++++++++++++++++++ .../writer/impl/MetamodelNamesFormatter.java | 20 ++ .../processor/writer/impl/TraitKind.java | 34 ++ .../writer/impl/TraitReferenceDetails.java | 54 +++ .../writer/impl/TraitReferenceMapping.java | 128 +++++++ .../impl/TypedFieldReferenceDetails.java | 135 ++++++++ .../impl/ValueFieldReferenceDetails.java | 92 +++++ .../javax.annotation.processing.Processor | 1 + .../metamodel/processor/CombineTest.java | 33 ++ ...HibernateSearchMetamodelProcessorTest.java | 121 +++++++ .../processor}/TraitReferenceMappingTest.java | 28 +- .../metamodel/processor/model/ISBN.java | 8 + .../processor/model/MyEmbeddedEntity.java | 18 + .../metamodel/processor/model/MyEnum.java | 12 + .../processor/model/MyIndexedEntity.java | 97 ++++++ .../processor/model/SomeGenerics.java | 22 ++ .../processor/model/SomeRandomType.java | 12 + .../processor/model/SomeRandomTypeBinder.java | 36 ++ pom.xml | 1 + .../common/logging/impl/MessageConstants.java | 3 + 88 files changed, 3781 insertions(+), 157 deletions(-) delete mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMapping.java rename mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/{impl => spi}/MappingAnnotationProcessorUtils.java (97%) create mode 100644 metamodel/metamodel-processor/pom.xml create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorAnnotationProcessorContext.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorPropertyMappingAnnotationProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypeMappingAnnotationProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/HibernateSearchMetamodelProcessorContext.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/MetamodelAnnotationProcessor.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ProcessorElementUtils.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/MappingLog.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/ProcessorLog.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorIntrospectorContext.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/BuiltInBridgeResolverTypes.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoPropertyModel.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorTypeOrdering.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/package-info.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ClassProperty.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelNamesFormatter.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitKind.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetails.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TypedFieldReferenceDetails.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java create mode 100644 metamodel/metamodel-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/CombineTest.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java rename {engine/src/test/java/org/hibernate/search/engine/search/reference/spi => metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor}/TraitReferenceMappingTest.java (53%) create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/ISBN.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEmbeddedEntity.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnum.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeGenerics.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomType.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomTypeBinder.java diff --git a/bom/public/pom.xml b/bom/public/pom.xml index d00f76ebf8c..264a82a1897 100644 --- a/bom/public/pom.xml +++ b/bom/public/pom.xml @@ -92,6 +92,11 @@ hibernate-search-mapper-orm-outbox-polling ${project.version} + + org.hibernate.search + hibernate-search-metamodel-processor + ${project.version} + org.hibernate.search diff --git a/build/enforcer/src/main/java/org/hibernate/search/build/enforcer/MavenProjectUtils.java b/build/enforcer/src/main/java/org/hibernate/search/build/enforcer/MavenProjectUtils.java index ed9eedf21dd..976f431a68a 100644 --- a/build/enforcer/src/main/java/org/hibernate/search/build/enforcer/MavenProjectUtils.java +++ b/build/enforcer/src/main/java/org/hibernate/search/build/enforcer/MavenProjectUtils.java @@ -11,7 +11,8 @@ public class MavenProjectUtils { public static final String HIBERNATE_SEARCH_PARENT_PUBLIC = "hibernate-search-parent-public"; public static final String HIBERNATE_SEARCH_PARENT_PUBLIC_LUCENE_NEXT = "hibernate-search-parent-public-lucene-next"; public static final String HIBERNATE_SEARCH_PARENT_INTEGRATION_TEST = "hibernate-search-parent-integrationtest"; - public static final String HIBERNATE_SEARCH_PARENT_INTEGRATION_TEST_LUCENE_NEXT = "hibernate-search-parent-integrationtest-lucene-next"; + public static final String HIBERNATE_SEARCH_PARENT_INTEGRATION_TEST_LUCENE_NEXT = + "hibernate-search-parent-integrationtest-lucene-next"; public static final String HIBERNATE_SEARCH_PARENT_RELOCATION = "hibernate-search-parent-relocation"; public static final String DEPLOY_SKIP = "deploy.skip"; @@ -35,7 +36,7 @@ public static boolean isAnyParentRelocationParent(MavenProject project) { public static boolean isAnyParentIntegrationTestParent(MavenProject project) { return project.hasParent() && ( HIBERNATE_SEARCH_PARENT_INTEGRATION_TEST.equals( project.getParent().getArtifactId() ) - || HIBERNATE_SEARCH_PARENT_INTEGRATION_TEST_LUCENE_NEXT.equals( project.getParent().getArtifactId() ) + || HIBERNATE_SEARCH_PARENT_INTEGRATION_TEST_LUCENE_NEXT.equals( project.getParent().getArtifactId() ) || isAnyParentIntegrationTestParent( project.getParent() ) ); } diff --git a/build/jqassistant/rules/rules.xml b/build/jqassistant/rules/rules.xml index a9a1ed05db3..d67e23dfe0e 100644 --- a/build/jqassistant/rules/rules.xml +++ b/build/jqassistant/rules/rules.xml @@ -281,6 +281,7 @@ WHEN 'hibernate-search-mapper-orm' THEN 'HibernateOrm' WHEN 'hibernate-search-mapper-orm-outbox-polling' THEN 'OutboxPolling' WHEN 'hibernate-search-mapper-orm-jakarta-batch-jberet' THEN 'JBeret' + WHEN 'hibernate-search-metamodel-processor' THEN 'Processor' ELSE 'UNKNOWN-MODULE-SPECIFIC-KEYWORD-PLEASE-UPDATE-JQASSISTANT-RULES' END RETURN @@ -362,6 +363,7 @@ AND NOT type.name ENDS WITH "ScrollableResultsAdapter" AND NOT type.name ENDS WITH "_$bundle" AND NOT type:SuppressJQAssistant + AND NOT type:e RETURN type, method ]]> diff --git a/build/parents/build/pom.xml b/build/parents/build/pom.xml index 4ef2b7190b6..cd8f310ef6f 100644 --- a/build/parents/build/pom.xml +++ b/build/parents/build/pom.xml @@ -369,6 +369,11 @@ pom ${project.version} + + org.hibernate.search + hibernate-search-metamodel-processor + ${project.version} + diff --git a/build/reports/pom.xml b/build/reports/pom.xml index 7a98e9bd637..0cb49c38f96 100644 --- a/build/reports/pom.xml +++ b/build/reports/pom.xml @@ -74,6 +74,10 @@ org.hibernate.search hibernate-search-mapper-orm-jakarta-batch-jberet + + org.hibernate.search + hibernate-search-metamodel-processor + org.hibernate.search hibernate-search-mapper-orm-batch-jsr352-core diff --git a/distribution/pom.xml b/distribution/pom.xml index c4f31efc815..12df6349743 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -256,6 +256,7 @@ ${basedir}/../mapper/orm-outbox-polling/src/main/java; ${basedir}/../mapper/orm-jakarta-batch/core/src/main/java; ${basedir}/../mapper/orm-jakarta-batch/jberet/src/main/java; + ${basedir}/../metamodel/processor/src/main/java; ${basedir}/../engine/target/generated-sources/annotations; ${basedir}/../util/common/target/generated-sources/annotations; ${basedir}/../mapper/pojo-base/target/generated-sources/annotations; @@ -268,6 +269,7 @@ ${basedir}/../mapper/orm-outbox-polling/target/generated-sources/annotations; ${basedir}/../mapper/orm-jakarta-batch/core/target/generated-sources/annotations; ${basedir}/../mapper/orm-jakarta-batch/jberet/target/generated-sources/annotations; + ${basedir}/../metamodel/processor/target/generated-sources/annotations; true Hibernate Search Packages diff --git a/documentation/pom.xml b/documentation/pom.xml index 251dbc1ad9d..762a91370b5 100644 --- a/documentation/pom.xml +++ b/documentation/pom.xml @@ -62,6 +62,11 @@ hibernate-search-backend-elasticsearch test + + ${project.groupId} + hibernate-search-metamodel-processor + test + ${project.groupId} hibernate-search-util-internal-integrationtest-mapper-orm diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java index 19c000d8bd4..2ee82df3b42 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java @@ -258,7 +258,7 @@ public static class EmbeddedThing3 { } - // IMPL_NOTE: note cannot use the EntityClassName_ since ORM picks it up and tries to its thing... + // IMPL_NOTE: note cannot use the EntityClassName_ since ORM picks it up and tries to do its thing... // so we'd need to come up with a different naming strategy... public static class ContainingA__ implements HibernateOrmRootReferenceScope, diff --git a/engine/src/main/java/org/hibernate/search/engine/backend/types/converter/spi/DslConverter.java b/engine/src/main/java/org/hibernate/search/engine/backend/types/converter/spi/DslConverter.java index a944ca7abad..c89700e5273 100644 --- a/engine/src/main/java/org/hibernate/search/engine/backend/types/converter/spi/DslConverter.java +++ b/engine/src/main/java/org/hibernate/search/engine/backend/types/converter/spi/DslConverter.java @@ -8,6 +8,7 @@ import org.hibernate.search.engine.backend.types.converter.runtime.ToDocumentValueConvertContext; import org.hibernate.search.engine.backend.types.converter.runtime.ToDocumentValueConvertContextExtension; import org.hibernate.search.engine.logging.impl.QueryLog; +import org.hibernate.search.util.common.annotation.Incubating; import org.hibernate.search.util.common.impl.Contracts; import org.hibernate.search.util.common.reporting.spi.EventContextProvider; @@ -99,4 +100,12 @@ public DslConverter withInputType(Class inputTypeCandidate, public boolean isCompatibleWith(DslConverter other) { return delegate.isCompatibleWith( other.delegate ); } + + /** + * @return The document value converter that is backing up this converter. + */ + @Incubating + public ToDocumentValueConverter delegate() { + return delegate; + } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java index 7f4faa6dfec..a8a80ec61f1 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java @@ -8,7 +8,6 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.engine.search.reference.aggregation.CountAggregationFieldReference; -import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference; import org.hibernate.search.util.common.annotation.Incubating; /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java index 13c0ca6041f..f3574ae07b2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java @@ -8,7 +8,6 @@ import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -import org.hibernate.search.engine.search.reference.aggregation.AvgAggregationFieldReference; import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference; import org.hibernate.search.util.common.annotation.Incubating; diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java index 72b3ed0f360..3d9520b0e5e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java @@ -8,7 +8,6 @@ import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference; import org.hibernate.search.engine.search.reference.aggregation.MinAggregationFieldReference; import org.hibernate.search.util.common.annotation.Incubating; diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java index 37b20a21e56..24d0ec4e9e6 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java @@ -8,7 +8,6 @@ import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; -import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference; import org.hibernate.search.engine.search.reference.aggregation.SumAggregationFieldReference; import org.hibernate.search.util.common.annotation.Incubating; diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java index c8d99b227ae..b9da4718190 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java @@ -236,7 +236,7 @@ default FieldProjectionValueStep field(FieldProjectionFieldReference distance( - DistanceProjectionFieldReference fieldReference, + DistanceProjectionFieldReference fieldReference, GeoPoint center) { return distance( fieldReference.absolutePath(), center ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java index 308ce02d85b..18ee62d7ad2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java @@ -6,5 +6,6 @@ import org.hibernate.search.engine.search.reference.FieldReference; + public interface PredicateFieldReference extends FieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java index 45e5e26fc16..5c49f5ed167 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java @@ -4,5 +4,5 @@ */ package org.hibernate.search.engine.search.reference.projection; -public interface DistanceProjectionFieldReference extends TypedProjectionFieldReference { +public interface DistanceProjectionFieldReference extends ProjectionFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java index 7c898906936..1969747be84 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java @@ -4,5 +4,5 @@ */ package org.hibernate.search.engine.search.reference.sort; -public interface DistanceSortFieldReference extends TypedSortFieldReference { +public interface DistanceSortFieldReference extends SortFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMapping.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMapping.java deleted file mode 100644 index bfe3068a48b..00000000000 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMapping.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.hibernate.search.engine.search.reference.spi; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import org.hibernate.search.engine.backend.types.IndexFieldTraits; -import org.hibernate.search.engine.search.reference.aggregation.AvgAggregationFieldReference; -import org.hibernate.search.engine.search.reference.aggregation.CountAggregationFieldReference; -import org.hibernate.search.engine.search.reference.aggregation.CountDistinctAggregationFieldReference; -import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference; -import org.hibernate.search.engine.search.reference.aggregation.MinAggregationFieldReference; -import org.hibernate.search.engine.search.reference.aggregation.RangeAggregationFieldReference; -import org.hibernate.search.engine.search.reference.aggregation.SumAggregationFieldReference; -import org.hibernate.search.engine.search.reference.aggregation.TermsAggregationFieldReference; -import org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.KnnPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.NestedPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.SpatialWithinBoundingBoxPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.SpatialWithinCirclePredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.SpatialWithinPolygonPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference; -import org.hibernate.search.engine.search.reference.projection.DistanceProjectionFieldReference; -import org.hibernate.search.engine.search.reference.projection.FieldProjectionFieldReference; -import org.hibernate.search.engine.search.reference.projection.HighlightProjectionFieldReference; -import org.hibernate.search.engine.search.reference.projection.ObjectProjectionFieldReference; -import org.hibernate.search.engine.search.reference.sort.DistanceSortFieldReference; -import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; -import org.hibernate.search.util.common.annotation.Incubating; - -@Incubating -public class TraitReferenceMapping { - private final Map traits; - - private TraitReferenceMapping() { - Map traits = new HashMap<>( backendSpecificTraits() ); - - traits.put( IndexFieldTraits.Predicates.EXISTS, new ReferenceDetails( ExistsPredicateFieldReference.class, "P0" ) ); - traits.put( IndexFieldTraits.Predicates.KNN, new ReferenceDetails( KnnPredicateFieldReference.class, "P1" ) ); - traits.put( IndexFieldTraits.Predicates.MATCH, new ReferenceDetails( MatchPredicateFieldReference.class, "P2" ) ); - traits.put( IndexFieldTraits.Predicates.NESTED, new ReferenceDetails( NestedPredicateFieldReference.class, "P3" ) ); - traits.put( IndexFieldTraits.Predicates.PHRASE, new ReferenceDetails( PhrasePredicateFieldReference.class, "P4" ) ); - traits.put( IndexFieldTraits.Predicates.PREFIX, new ReferenceDetails( PrefixPredicateFieldReference.class, "P5" ) ); - traits.put( IndexFieldTraits.Predicates.RANGE, new ReferenceDetails( RangePredicateFieldReference.class, "P6" ) ); - traits.put( IndexFieldTraits.Predicates.QUERY_STRING, - new ReferenceDetails( QueryStringPredicateFieldReference.class, "P7" ) ); - traits.put( IndexFieldTraits.Predicates.REGEXP, new ReferenceDetails( RegexpPredicateFieldReference.class, "P8" ) ); - traits.put( IndexFieldTraits.Predicates.SIMPLE_QUERY_STRING, - new ReferenceDetails( SimpleQueryStringPredicateFieldReference.class, "P9" ) ); - traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_BOUNDING_BOX, - new ReferenceDetails( SpatialWithinBoundingBoxPredicateFieldReference.class, "P10" ) ); - traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_CIRCLE, - new ReferenceDetails( SpatialWithinCirclePredicateFieldReference.class, "P11" ) ); - traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_POLYGON, - new ReferenceDetails( SpatialWithinPolygonPredicateFieldReference.class, "P12" ) ); - traits.put( IndexFieldTraits.Predicates.TERMS, new ReferenceDetails( TermsPredicateFieldReference.class, "P13" ) ); - traits.put( IndexFieldTraits.Predicates.WILDCARD, - new ReferenceDetails( WildcardPredicateFieldReference.class, "P14" ) ); - - traits.put( IndexFieldTraits.Sorts.DISTANCE, new ReferenceDetails( DistanceSortFieldReference.class, "S0" ) ); - traits.put( IndexFieldTraits.Sorts.FIELD, new ReferenceDetails( FieldSortFieldReference.class, "S1" ) ); - - traits.put( IndexFieldTraits.Projections.DISTANCE, - new ReferenceDetails( DistanceProjectionFieldReference.class, "R0" ) ); - traits.put( IndexFieldTraits.Projections.FIELD, new ReferenceDetails( FieldProjectionFieldReference.class, "R1" ) ); - traits.put( IndexFieldTraits.Projections.HIGHLIGHT, - new ReferenceDetails( HighlightProjectionFieldReference.class, "R2" ) ); - traits.put( IndexFieldTraits.Projections.OBJECT, new ReferenceDetails( ObjectProjectionFieldReference.class, "R3" ) ); - - traits.put( IndexFieldTraits.Aggregations.RANGE, new ReferenceDetails( RangeAggregationFieldReference.class, "A0" ) ); - traits.put( IndexFieldTraits.Aggregations.TERMS, new ReferenceDetails( TermsAggregationFieldReference.class, "A1" ) ); - traits.put( IndexFieldTraits.Aggregations.SUM, new ReferenceDetails( SumAggregationFieldReference.class, "A2" ) ); - traits.put( IndexFieldTraits.Aggregations.MIN, new ReferenceDetails( MinAggregationFieldReference.class, "A3" ) ); - traits.put( IndexFieldTraits.Aggregations.MAX, new ReferenceDetails( MaxAggregationFieldReference.class, "A4" ) ); - traits.put( IndexFieldTraits.Aggregations.COUNT, new ReferenceDetails( CountAggregationFieldReference.class, "A5" ) ); - traits.put( IndexFieldTraits.Aggregations.COUNT_DISTINCT, - new ReferenceDetails( CountDistinctAggregationFieldReference.class, "A6" ) ); - traits.put( IndexFieldTraits.Aggregations.AVG, new ReferenceDetails( AvgAggregationFieldReference.class, "A7" ) ); - - this.traits = Collections.unmodifiableMap( traits ); - } - - protected Map backendSpecificTraits() { - return Map.of(); - } - - public static TraitReferenceMapping instance() { - return new TraitReferenceMapping(); - } - - public ReferenceDetails reference(String traitName) { - return traits.get( traitName ); - } - - public record ReferenceDetails(Class referenceClass, String implementationLabel) { - } - -} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java index 602bba0bf39..4a67bccce08 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java @@ -8,7 +8,6 @@ import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory; import org.hibernate.search.engine.search.reference.sort.DistanceSortFieldReference; -import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; import org.hibernate.search.engine.spatial.GeoPoint; /** @@ -43,13 +42,13 @@ public interface ExtendedSearchSortFactory< } @Override - default DistanceSortOptionsStep distance(DistanceSortFieldReference fieldReference, + default DistanceSortOptionsStep distance(DistanceSortFieldReference fieldReference, GeoPoint location) { return distance( fieldReference.absolutePath(), location ); } @Override - default DistanceSortOptionsStep distance(DistanceSortFieldReference fieldReference, double latitude, + default DistanceSortOptionsStep distance(DistanceSortFieldReference fieldReference, double latitude, double longitude) { return distance( fieldReference, GeoPoint.of( latitude, longitude ) ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java index 0fbdf3444bb..a9bc2d9cc81 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java @@ -103,7 +103,7 @@ public interface SearchSortFactory { */ @Incubating default DistanceSortOptionsStep> distance( - DistanceSortFieldReference fieldReference, GeoPoint location) { + DistanceSortFieldReference fieldReference, GeoPoint location) { return distance( fieldReference.absolutePath(), location ); } @@ -138,7 +138,7 @@ public interface SearchSortFactory { */ @Incubating default DistanceSortOptionsStep> distance( - DistanceSortFieldReference fieldReference, double latitude, + DistanceSortFieldReference fieldReference, double latitude, double longitude) { return distance( fieldReference, GeoPoint.of( latitude, longitude ) ); } diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/bridge/runtime/impl/PojoValueBridgeDocumentValueConverter.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/bridge/runtime/impl/PojoValueBridgeDocumentValueConverter.java index 189c255d48b..1178c802068 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/bridge/runtime/impl/PojoValueBridgeDocumentValueConverter.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/bridge/runtime/impl/PojoValueBridgeDocumentValueConverter.java @@ -64,6 +64,10 @@ public boolean isCompatibleWith(FromDocumentValueConverter other) { return bridge.isCompatibleWith( castedOther.bridge ); } + public ValueBridge bridge() { + return bridge; + } + private static final class ContextExtension implements ToDocumentValueConvertContextExtension, FromDocumentValueConvertContextExtension { diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/MappingAnnotationProcessorContext.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/MappingAnnotationProcessorContext.java index 553cd3ef31a..58825ce4542 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/MappingAnnotationProcessorContext.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/MappingAnnotationProcessorContext.java @@ -14,7 +14,7 @@ import org.hibernate.search.mapper.pojo.extractor.mapping.annotation.ContainerExtraction; import org.hibernate.search.mapper.pojo.extractor.mapping.programmatic.ContainerExtractorPath; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.ObjectPath; -import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.impl.MappingAnnotationProcessorUtils; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.spi.MappingAnnotationProcessorUtils; import org.hibernate.search.mapper.pojo.model.path.PojoModelPathValueNode; import org.hibernate.search.util.common.SearchException; import org.hibernate.search.util.common.reporting.EventContext; diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/AbstractMappingAnnotationProcessorContext.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/AbstractMappingAnnotationProcessorContext.java index d664a323407..30b51299d94 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/AbstractMappingAnnotationProcessorContext.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/AbstractMappingAnnotationProcessorContext.java @@ -14,6 +14,7 @@ import org.hibernate.search.mapper.pojo.logging.impl.MappingLog; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.ObjectPath; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.MappingAnnotationProcessorContext; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.spi.MappingAnnotationProcessorUtils; import org.hibernate.search.mapper.pojo.model.path.PojoModelPathValueNode; import org.hibernate.search.util.common.reflect.spi.AnnotationHelper; diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/AnnotationProcessorProvider.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/AnnotationProcessorProvider.java index 8b0b59ec003..c0cb6fec3ac 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/AnnotationProcessorProvider.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/AnnotationProcessorProvider.java @@ -26,6 +26,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.TypeMapping; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.TypeMappingAnnotationProcessor; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.TypeMappingAnnotationProcessorRef; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.spi.MappingAnnotationProcessorUtils; import org.hibernate.search.mapper.pojo.reporting.spi.PojoEventContexts; import org.hibernate.search.util.common.AssertionFailure; import org.hibernate.search.util.common.impl.SuppressingCloser; diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/IndexedEmbeddedProcessor.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/IndexedEmbeddedProcessor.java index 6d3ce6d68c7..2ed22415c73 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/IndexedEmbeddedProcessor.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/IndexedEmbeddedProcessor.java @@ -9,6 +9,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.PropertyMappingAnnotationProcessor; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.PropertyMappingAnnotationProcessorContext; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.spi.MappingAnnotationProcessorUtils; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; public class IndexedEmbeddedProcessor implements PropertyMappingAnnotationProcessor { diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/ObjectProjectionProcessor.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/ObjectProjectionProcessor.java index a83911a98fc..5d890831d43 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/ObjectProjectionProcessor.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/ObjectProjectionProcessor.java @@ -8,6 +8,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.annotation.ObjectProjection; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.MethodParameterMappingAnnotationProcessor; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.MethodParameterMappingAnnotationProcessorContext; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.spi.MappingAnnotationProcessorUtils; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.MethodParameterMappingStep; import org.hibernate.search.mapper.pojo.search.definition.binding.builtin.ObjectProjectionBinder; diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/MappingAnnotationProcessorUtils.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/spi/MappingAnnotationProcessorUtils.java similarity index 97% rename from mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/MappingAnnotationProcessorUtils.java rename to mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/spi/MappingAnnotationProcessorUtils.java index 716738ec23a..ca36223ca7e 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/impl/MappingAnnotationProcessorUtils.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/mapping/definition/annotation/processing/spi/MappingAnnotationProcessorUtils.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.impl; +package org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.spi; import java.util.Arrays; import java.util.Collections; @@ -24,8 +24,10 @@ import org.hibernate.search.mapper.pojo.model.path.PojoModelPath; import org.hibernate.search.mapper.pojo.model.path.PojoModelPathValueNode; import org.hibernate.search.util.common.AssertionFailure; +import org.hibernate.search.util.common.annotation.Incubating; import org.hibernate.search.util.common.impl.Contracts; +@Incubating public final class MappingAnnotationProcessorUtils { private MappingAnnotationProcessorUtils() { diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/models/spi/AbstractPojoModelsBootstrapIntrospector.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/models/spi/AbstractPojoModelsBootstrapIntrospector.java index d36aaf06ab7..ac9592cd588 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/models/spi/AbstractPojoModelsBootstrapIntrospector.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/models/spi/AbstractPojoModelsBootstrapIntrospector.java @@ -145,31 +145,7 @@ public Class toClass(ClassDetails xClass) { } private static String noPrefix(MemberDetails details) { - String fullName = details.getName(); - if ( fullName.startsWith( "get" ) ) { - return decapitalize( fullName.substring( "get".length() ) ); - } - if ( fullName.startsWith( "is" ) ) { - return decapitalize( fullName.substring( "is".length() ) ); - } - return fullName; - } - - // See conventions expressed by https://docs.oracle.com/javase/7/docs/api/java/beans/Introspector.html#decapitalize(java.lang.String) - private static String decapitalize(String name) { - if ( name != null && !name.isEmpty() ) { - if ( name.length() > 1 && Character.isUpperCase( name.charAt( 1 ) ) ) { - return name; - } - else { - char[] chars = name.toCharArray(); - chars[0] = Character.toLowerCase( chars[0] ); - return new String( chars ); - } - } - else { - return name; - } + return PojoBootstrapIntrospector.noPrefix( details.getName() ); } private record HibernateSearchClassLoading(ClassResolver delegate) implements ClassLoading { diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/spi/PojoBootstrapIntrospector.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/spi/PojoBootstrapIntrospector.java index 4402030c7b8..397e5284140 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/spi/PojoBootstrapIntrospector.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/spi/PojoBootstrapIntrospector.java @@ -4,6 +4,7 @@ */ package org.hibernate.search.mapper.pojo.model.spi; +import org.hibernate.search.util.common.annotation.Incubating; import org.hibernate.search.util.common.reflect.spi.ValueHandleFactory; /** @@ -38,4 +39,33 @@ default org.hibernate.search.util.common.reflect.spi.ValueReadHandleFactory anno return (org.hibernate.search.util.common.reflect.spi.ValueReadHandleFactory) annotationValueHandleFactory(); } + @Incubating + static String noPrefix(String methodName) { + if ( methodName.startsWith( "get" ) ) { + return decapitalize( methodName.substring( "get".length() ) ); + } + if ( methodName.startsWith( "is" ) ) { + return decapitalize( methodName.substring( "is".length() ) ); + } + // TODO: handle hasXXX ? + return methodName; + } + + // See conventions expressed by https://docs.oracle.com/javase/7/docs/api/java/beans/Introspector.html#decapitalize(java.lang.String) + @Incubating + static String decapitalize(String name) { + if ( name != null && !name.isEmpty() ) { + if ( name.length() > 1 && Character.isUpperCase( name.charAt( 1 ) ) ) { + return name; + } + else { + char[] chars = name.toCharArray(); + chars[0] = Character.toLowerCase( chars[0] ); + return new String( chars ); + } + } + else { + return name; + } + } } diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/bootstrap/impl/StandalonePojoIntegrationBooterImpl.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/bootstrap/impl/StandalonePojoIntegrationBooterImpl.java index 44169e1040f..e671304b29d 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/bootstrap/impl/StandalonePojoIntegrationBooterImpl.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/bootstrap/impl/StandalonePojoIntegrationBooterImpl.java @@ -11,6 +11,7 @@ import java.util.Map; import java.util.Optional; import java.util.function.BiConsumer; +import java.util.function.Function; import org.hibernate.search.engine.cfg.ConfigurationPropertySource; import org.hibernate.search.engine.cfg.spi.AllAwareConfigurationPropertySource; @@ -22,6 +23,7 @@ import org.hibernate.search.engine.common.spi.SearchIntegrationPartialBuildState; import org.hibernate.search.engine.environment.bean.spi.BeanProvider; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.AnnotatedTypeSource; +import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector; import org.hibernate.search.mapper.pojo.standalone.bootstrap.spi.StandalonePojoIntegrationBooter; import org.hibernate.search.mapper.pojo.standalone.bootstrap.spi.StandalonePojoIntegrationBooterBehavior; import org.hibernate.search.mapper.pojo.standalone.cfg.spi.StandalonePojoMapperSpiSettings; @@ -46,12 +48,14 @@ public class StandalonePojoIntegrationBooterImpl implements StandalonePojoIntegr private final List annotatedTypeSources; private final ConfigurationPropertyChecker propertyChecker; private final ValueHandleFactory valueHandleFactory; + private final Function introspectorCustomizer; private final ConfigurationPropertySource propertySource; private StandalonePojoIntegrationBooterImpl(BuilderImpl builder) { annotatedTypeSources = builder.annotatedTypeSources; propertyChecker = ConfigurationPropertyChecker.create(); valueHandleFactory = builder.valueHandleFactory; + introspectorCustomizer = builder.introspectorCustomizer; propertySource = propertyChecker.wrap( AllAwareConfigurationPropertySource.fromMap( builder.properties ) @@ -87,13 +91,14 @@ private StandalonePojoIntegrationPartialBuildState doBootFirstPhase() { try { environment = createEnvironment(); - StandalonePojoBootstrapIntrospector introspector = + PojoBootstrapIntrospector introspector = StandalonePojoBootstrapIntrospector.create( environment.classResolver(), null, valueHandleFactory != null ? valueHandleFactory : ValueHandleFactory.usingMethodHandle( MethodHandles.publicLookup() ) ); + introspector = introspectorCustomizer.apply( introspector ); StandalonePojoMappingKey mappingKey = new StandalonePojoMappingKey(); StandalonePojoMappingInitiator mappingInitiator = new StandalonePojoMappingInitiator( introspector ); for ( AnnotatedTypeSource source : annotatedTypeSources ) { @@ -138,8 +143,9 @@ public StandalonePojoMapping boot() { public static class BuilderImpl implements Builder { private final List annotatedTypeSources = new ArrayList<>(); - private ValueHandleFactory valueHandleFactory; private final Map properties = new HashMap<>(); + private ValueHandleFactory valueHandleFactory; + private Function introspectorCustomizer = Function.identity(); public BuilderImpl() { } @@ -156,6 +162,12 @@ public BuilderImpl valueReadHandleFactory(ValueHandleFactory valueHandleFactory) return this; } + @Override + public Builder introspectorCustomizer(Function customize) { + this.introspectorCustomizer = customize; + return this; + } + @Override public BuilderImpl property(String name, Object value) { properties.put( name, value ); diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/bootstrap/spi/StandalonePojoIntegrationBooter.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/bootstrap/spi/StandalonePojoIntegrationBooter.java index 63b00c827d6..615f2ecbf44 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/bootstrap/spi/StandalonePojoIntegrationBooter.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/bootstrap/spi/StandalonePojoIntegrationBooter.java @@ -6,8 +6,10 @@ import java.util.Map; import java.util.function.BiConsumer; +import java.util.function.Function; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.AnnotatedTypeSource; +import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector; import org.hibernate.search.mapper.pojo.standalone.bootstrap.impl.StandalonePojoIntegrationBooterImpl; import org.hibernate.search.mapper.pojo.standalone.mapping.CloseableSearchMapping; import org.hibernate.search.util.common.annotation.Incubating; @@ -25,6 +27,9 @@ interface Builder { Builder valueReadHandleFactory(ValueHandleFactory valueHandleFactory); + @Incubating + Builder introspectorCustomizer(Function customize); + Builder property(String name, Object value); Builder properties(Map map); diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMappingInitiator.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMappingInitiator.java index 18721ef6f5c..c11377f4fc2 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMappingInitiator.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMappingInitiator.java @@ -17,10 +17,10 @@ import org.hibernate.search.mapper.pojo.mapping.building.spi.PojoMapperDelegate; import org.hibernate.search.mapper.pojo.mapping.building.spi.PojoTypeMetadataContributor; import org.hibernate.search.mapper.pojo.mapping.spi.AbstractPojoMappingInitiator; +import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector; import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; import org.hibernate.search.mapper.pojo.standalone.mapping.StandalonePojoMappingConfigurationContext; import org.hibernate.search.mapper.pojo.standalone.mapping.StandalonePojoMappingConfigurer; -import org.hibernate.search.mapper.pojo.standalone.model.impl.StandalonePojoBootstrapIntrospector; import org.hibernate.search.mapper.pojo.standalone.reporting.impl.StandalonePojoMapperHints; public class StandalonePojoMappingInitiator extends AbstractPojoMappingInitiator @@ -54,7 +54,7 @@ public class StandalonePojoMappingInitiator extends AbstractPojoMappingInitiator .withDefault( StandalonePojoMapperSettings.Defaults.MULTI_TENANCY_ENABLED ) .build(); - public StandalonePojoMappingInitiator(StandalonePojoBootstrapIntrospector introspector) { + public StandalonePojoMappingInitiator(PojoBootstrapIntrospector introspector) { super( introspector, StandalonePojoMapperHints.INSTANCE ); } diff --git a/metamodel/metamodel-processor/pom.xml b/metamodel/metamodel-processor/pom.xml new file mode 100644 index 00000000000..2e3683609ca --- /dev/null +++ b/metamodel/metamodel-processor/pom.xml @@ -0,0 +1,104 @@ + + + 4.0.0 + + org.hibernate.search + hibernate-search-parent-public + 8.0.0-SNAPSHOT + ../../build/parents/public + + hibernate-search-metamodel-processor + + Hibernate Search Metamodel annotation processor + Hibernate Search Metamodel annotation processor + + + + false + org.hibernate.search.metamodel.processor + + + + + + + + org.hibernate.search + hibernate-search-engine + + + org.hibernate.search + hibernate-search-mapper-pojo-base + + + org.hibernate.search + hibernate-search-mapper-pojo-standalone + + + + org.hibernate.search + hibernate-search-backend-lucene + + + + org.hibernate.search + hibernate-search-util-common + + + org.jboss.logging + jboss-logging + + + org.jboss.logging + jboss-logging-annotations + + + + org.junit.jupiter + junit-jupiter + test + + + org.assertj + assertj-core + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + default-compile + + none + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy + generate-test-resources + + copy-dependencies + + + ${project.build.directory}/test-dependencies + true + + + + + + + diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java new file mode 100644 index 00000000000..3b5014d4e94 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java @@ -0,0 +1,59 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor; + +import java.util.List; +import java.util.Set; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.ProcessingEnvironment; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedOptions; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.TypeElement; + +import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; +import org.hibernate.search.metamodel.processor.impl.IndexedEntityMetamodelAnnotationProcessor; +import org.hibernate.search.metamodel.processor.impl.MetamodelAnnotationProcessor; + +// We inspect all annotations and then decide if we can process them, +// this way we can also work with user-defined ones (at some point): +@SupportedAnnotationTypes("*") +// Currently this is more of a placeholder for future config options: +@SupportedOptions({ HibernateSearchMetamodelProcessorSettings.ADD_GENERATED_ANNOTATION }) +@org.hibernate.search.util.common.annotation.impl.SuppressJQAssistant( + reason = "JQAssistant has issue with detecting that getSupportedSourceVersion is an overridden method.") +public class HibernateSearchMetamodelProcessor extends AbstractProcessor { + + private HibernateSearchMetamodelProcessorContext context; + private HibernateSearchMetamodelProcessorSettings.Configuration configuration; + private List processors; + + @Override + public synchronized void init(ProcessingEnvironment processingEnv) { + super.init( processingEnv ); + context = new HibernateSearchMetamodelProcessorContext( processingEnv.getElementUtils(), processingEnv.getTypeUtils(), + processingEnv.getMessager(), processingEnv.getFiler() ); + configuration = new HibernateSearchMetamodelProcessorSettings.Configuration( processingEnv.getOptions() ); + processors = List.of( new IndexedEntityMetamodelAnnotationProcessor( context ) ); + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latestSupported(); + } + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + for ( MetamodelAnnotationProcessor processor : processors ) { + processor.process( roundEnv ); + } + if ( roundEnv.processingOver() ) { + // create metamodel classes + } + return false; + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java new file mode 100644 index 00000000000..29359e2483d --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java @@ -0,0 +1,42 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor; + +import java.util.Map; + +public final class HibernateSearchMetamodelProcessorSettings { + + private HibernateSearchMetamodelProcessorSettings() { + } + + private static final String PREFIX = "org.hibernate.search.metamodel.processor."; + + public static final String ADD_GENERATED_ANNOTATION = PREFIX + Radicals.ADD_GENERATED_ANNOTATION; + + public static class Radicals { + + private Radicals() { + } + + public static final String ADD_GENERATED_ANNOTATION = "add_generated_annotation"; + } + + /** + * Default values for the different settings if no values are given. + */ + public static final class Defaults { + + public static final String ADD_GENERATED_ANNOTATION = Boolean.TRUE.toString(); + + private Defaults() { + } + } + + public record Configuration(boolean addGeneratedAnnotation) { + public Configuration(Map options) { + this( Boolean.parseBoolean( options.getOrDefault( ADD_GENERATED_ANNOTATION, Defaults.ADD_GENERATED_ANNOTATION ) ) ); + } + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java new file mode 100644 index 00000000000..03ddb8b2067 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java @@ -0,0 +1,143 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.hibernate.search.engine.backend.types.IndexFieldType; +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.extractor.mapping.annotation.ContainerExtract; +import org.hibernate.search.mapper.pojo.extractor.mapping.programmatic.ContainerExtractorPath; +import org.hibernate.search.metamodel.processor.logging.impl.MappingLog; +import org.hibernate.search.util.common.AssertionFailure; + +public abstract class AbstractProcessorAnnotationProcessor implements ProcessorPropertyMappingAnnotationProcessor { + + protected static final String[] EMPTY = new String[0]; + + @Override + public final void process(PropertyBindingContext bindingContext, AnnotationMirror annotation, + ProcessorAnnotationProcessorContext context, Element element) { + String annotationName = getAnnotationValueAsString( annotation, "name", "" ); + String resolvedName = annotationName.isEmpty() ? element.getSimpleName().toString() : annotationName; + + // in binders, we only allow IndexFieldReference fields. + if ( element.asType() instanceof DeclaredType dt + && ( (TypeElement) dt.asElement() ).getQualifiedName() + .contentEquals( "org.hibernate.search.engine.backend.document.IndexFieldReference" ) ) { + TypeMirror fieldType = dt.getTypeArguments().get( 0 ); + + configureField( + bindingContext, annotation, + context, element, fieldType + ).ifPresent( step -> { + IndexFieldType configuredField = step.toIndexFieldType(); + bindingContext.indexSchemaElement().field( resolvedName, configuredField ).toReference(); + } ); + } + else { + context.messager().printMessage( Diagnostic.Kind.ERROR, + "Only fields of org.hibernate.search.engine.backend.document.IndexFieldReference type are allowed to be annotated with Hibernate Search annotations in the binder.", + element ); + } + } + + protected abstract Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType); + + protected ContainerExtractorPath toContainerExtractorPath(AnnotationMirror extraction) { + return toContainerExtractorPath( extraction, "DEFAULT" ); + } + + protected ContainerExtractorPath toContainerExtractorPath(AnnotationMirror extraction, String defaultValue) { + if ( extraction == null ) { + return ContainerExtractorPath.defaultExtractors(); + } + else { + ContainerExtract extract = + ContainerExtract.valueOf( getAnnotationValueAsString( extraction, "extraction", defaultValue ) ); + String[] extractors = toStringArray( getAnnotationValue( extraction, "value" ) ); + switch ( extract ) { + case NO: + if ( extractors.length != 0 ) { + throw MappingLog.INSTANCE.cannotReferenceExtractorsWhenExtractionDisabled(); + } + return ContainerExtractorPath.noExtractors(); + case DEFAULT: + if ( extractors.length == 0 ) { + return ContainerExtractorPath.defaultExtractors(); + } + else { + return ContainerExtractorPath.explicitExtractors( Arrays.asList( extractors ) ); + } + default: + throw new AssertionFailure( + "Unexpected " + ContainerExtract.class.getSimpleName() + " value: " + extract + ); + } + } + } + + protected AnnotationMirror getAnnotationProperty(AnnotationMirror annotation, String annotationName) { + AnnotationValue value = getAnnotationValue( annotation, annotationName ); + return (AnnotationMirror) ( value == null ? null : value.getValue() ); + } + + protected String getAnnotationValueAsString(AnnotationMirror annotation, String name, String defaultValue) { + AnnotationValue annotationValue = getAnnotationValue( annotation, name ); + if ( annotationValue == null ) { + return defaultValue; + } + return annotationValue.getValue().toString(); + } + + protected String getAnnotationValueAsString(AnnotationMirror annotation, String name) { + return getAnnotationValueAsString( annotation, name, null ); + } + + protected int getAnnotationValueAsInt(AnnotationMirror annotation, String name, int defaultValue) { + AnnotationValue annotationValue = getAnnotationValue( annotation, name ); + if ( annotationValue == null ) { + return defaultValue; + } + return (int) annotationValue.getValue(); + } + + protected AnnotationValue getAnnotationValue(AnnotationMirror annotation, String name) { + if ( annotation == null ) { + return null; + } + var elementValues = annotation.getElementValues(); + for ( var entry : elementValues.entrySet() ) { + if ( entry.getKey().getSimpleName().contentEquals( name ) ) { + return entry.getValue(); + } + } + return null; + } + + protected String[] toStringArray(AnnotationValue value) { + if ( value == null ) { + return EMPTY; + } + if ( value.getValue() instanceof List list ) { + return list.stream().map( v -> Objects.toString( ( (AnnotationValue) v ).getValue(), null ) ) + .toArray( String[]::new ); + } + return new String[] { Objects.toString( value.getValue(), null ) }; + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java new file mode 100644 index 00000000000..f04f6039b44 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java @@ -0,0 +1,66 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.hibernate.search.mapper.pojo.bridge.ValueBridge; +import org.hibernate.search.mapper.pojo.bridge.runtime.ValueBridgeToIndexedValueContext; +import org.hibernate.search.mapper.pojo.extractor.mapping.programmatic.ContainerExtractorPath; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; + +public abstract class AbstractProcessorFieldAnnotationProcessor extends AbstractProcessorAnnotationProcessor { + + @Override + public final void process(PropertyMappingStep mapping, AnnotationMirror annotation, + Element element, ProcessorAnnotationProcessorContext context) { + String cleanedUpRelativeFieldName = getName( annotation ); + PropertyMappingFieldOptionsStep fieldContext = + initFieldMappingContext( mapping, annotation, cleanedUpRelativeFieldName ); + + AnnotationMirror valueBinder = getValueBinder( annotation ); + if ( valueBinder != null ) { + // TODO: do we also inject fields into a value binder ... ? + context.messager().printMessage( Diagnostic.Kind.WARNING, "Defined value binder " + valueBinder + " is ignored " ); + } + else if ( element.asType().getKind() == TypeKind.DECLARED + && context.types().asElement( element.asType() ).getKind() == ElementKind.ENUM ) { + // if it's an enum, we won't get to the built-in bridge so we just use this stub one instead: + fieldContext.valueBridge( new ProcessorEnumValueBridge( element.asType() ) ); + } + + ContainerExtractorPath extractorPath = toContainerExtractorPath( getExtraction( annotation ) ); + fieldContext.extractors( extractorPath ); + } + + protected String getName(AnnotationMirror annotation) { + return getAnnotationValueAsString( annotation, "name" ); + } + + abstract PropertyMappingFieldOptionsStep initFieldMappingContext(PropertyMappingStep mappingContext, + AnnotationMirror annotation, String fieldName); + + private AnnotationMirror getExtraction(AnnotationMirror annotation) { + return getAnnotationProperty( annotation, "extraction" ); + } + + private AnnotationMirror getValueBinder(AnnotationMirror annotation) { + return getAnnotationProperty( annotation, "valueBinder" ); + } + + public record ProcessorEnumValueBridge(TypeMirror valueType) implements ValueBridge { + + @Override + public String toIndexedValue(Object value, ValueBridgeToIndexedValueContext context) { + return ""; + } + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java new file mode 100644 index 00000000000..febc736687e --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java @@ -0,0 +1,59 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import javax.lang.model.element.AnnotationMirror; + +import org.hibernate.search.engine.backend.types.Aggregable; +import org.hibernate.search.engine.backend.types.Sortable; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.AnnotationDefaultValues; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingNonFullTextFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStandardFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; + +public abstract class AbstractProcessorNonFullTextFieldAnnotationProcessor + extends AbstractProcessorStandardFieldAnnotationProcessor { + @Override + PropertyMappingStandardFieldOptionsStep initStandardFieldMappingContext(PropertyMappingStep mappingContext, + AnnotationMirror annotation, String fieldName) { + PropertyMappingNonFullTextFieldOptionsStep fieldContext = initSortableFieldMappingContext( + mappingContext, annotation, fieldName + ); + + Sortable sortable = getSortable( annotation ); + if ( !Sortable.DEFAULT.equals( sortable ) ) { + fieldContext.sortable( sortable ); + } + + Aggregable aggregable = getAggregable( annotation ); + if ( !Aggregable.DEFAULT.equals( aggregable ) ) { + fieldContext.aggregable( aggregable ); + } + + String indexNullAs = getIndexNullAs( annotation ); + if ( indexNullAs != null && !AnnotationDefaultValues.DO_NOT_INDEX_NULL.equals( indexNullAs ) ) { + fieldContext.indexNullAs( indexNullAs ); + } + + return fieldContext; + } + + abstract PropertyMappingNonFullTextFieldOptionsStep initSortableFieldMappingContext( + PropertyMappingStep mappingContext, + AnnotationMirror annotation, String fieldName); + + protected Sortable getSortable(AnnotationMirror annotation) { + return Sortable.valueOf( getAnnotationValueAsString( annotation, "sortable", "DEFAULT" ) ); + } + + protected Aggregable getAggregable(AnnotationMirror annotation) { + return Aggregable.valueOf( getAnnotationValueAsString( annotation, "aggregable", "DEFAULT" ) ); + } + + protected String getIndexNullAs(AnnotationMirror annotation) { + return getAnnotationValueAsString( annotation, "indexNullAs", AnnotationDefaultValues.DO_NOT_INDEX_NULL ); + } + +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java new file mode 100644 index 00000000000..c311a75beb4 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java @@ -0,0 +1,45 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import javax.lang.model.element.AnnotationMirror; + +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.engine.backend.types.Searchable; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStandardFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; + +public abstract class AbstractProcessorStandardFieldAnnotationProcessor extends AbstractProcessorFieldAnnotationProcessor { + @Override + PropertyMappingStandardFieldOptionsStep initFieldMappingContext(PropertyMappingStep mappingContext, + AnnotationMirror annotation, + String fieldName) { + PropertyMappingStandardFieldOptionsStep fieldContext = initStandardFieldMappingContext( + mappingContext, annotation, fieldName ); + + Projectable projectable = getProjectable( annotation ); + if ( !Projectable.DEFAULT.equals( projectable ) ) { + fieldContext.projectable( projectable ); + } + + Searchable searchable = getSearchable( annotation ); + if ( !Searchable.DEFAULT.equals( searchable ) ) { + fieldContext.searchable( searchable ); + } + + return fieldContext; + } + + protected Searchable getSearchable(AnnotationMirror annotation) { + return Searchable.valueOf( getAnnotationValueAsString( annotation, "searchable", "DEFAULT" ) ); + } + + protected Projectable getProjectable(AnnotationMirror annotation) { + return Projectable.valueOf( getAnnotationValueAsString( annotation, "projectable", "DEFAULT" ) ); + } + + abstract PropertyMappingStandardFieldOptionsStep initStandardFieldMappingContext( + PropertyMappingStep mappingContext, AnnotationMirror annotation, String fieldName); +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorAnnotationProcessorContext.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorAnnotationProcessorContext.java new file mode 100644 index 00000000000..c5ca3f5f3e3 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorAnnotationProcessorContext.java @@ -0,0 +1,24 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.HashSet; +import java.util.Set; + +import javax.annotation.processing.Messager; +import javax.lang.model.element.TypeElement; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; + +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.ProgrammaticMappingConfigurationContext; + +public record ProcessorAnnotationProcessorContext( Elements elements, Types types, Messager messager, + ProgrammaticMappingConfigurationContext programmaticMapping, + Set processedTypes) { + public ProcessorAnnotationProcessorContext(Elements elements, Types types, Messager messager, + ProgrammaticMappingConfigurationContext programmaticMapping) { + this( elements, types, messager, programmaticMapping, new HashSet<>() ); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java new file mode 100644 index 00000000000..035e16f6338 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java @@ -0,0 +1,36 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Map; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.tools.Diagnostic; + +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.bridge.mapping.programmatic.IdentifierBinder; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; + +public class ProcessorDocumentIdProcessor implements ProcessorPropertyMappingAnnotationProcessor { + @Override + public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, + ProcessorAnnotationProcessorContext context) { + IdentifierBinder binder = createIdentifierBinder( annotation, context ); + + mapping.documentId().identifierBinder( binder, Map.of() ); + } + + @Override + public void process(PropertyBindingContext bindingContext, AnnotationMirror annotation, + ProcessorAnnotationProcessorContext context, Element element) { + context.messager().printMessage( Diagnostic.Kind.ERROR, "ID cannot be defined in the binder.", element ); + } + + private IdentifierBinder createIdentifierBinder(AnnotationMirror annotation, ProcessorAnnotationProcessorContext context) { + // The bridge will be auto-detected from the property type + return null; + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java new file mode 100644 index 00000000000..36017780318 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java @@ -0,0 +1,98 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; + +import org.hibernate.search.engine.backend.analysis.AnalyzerNames; +import org.hibernate.search.engine.backend.types.Highlightable; +import org.hibernate.search.engine.backend.types.Norms; +import org.hibernate.search.engine.backend.types.TermVector; +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.engine.backend.types.dsl.StringIndexFieldTypeOptionsStep; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStandardFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; + +public class ProcessorFulltextFieldProcessor extends AbstractProcessorStandardFieldAnnotationProcessor { + @Override + PropertyMappingStandardFieldOptionsStep initStandardFieldMappingContext(PropertyMappingStep mappingContext, + AnnotationMirror annotation, String fieldName) { + var fieldContext = mappingContext.fullTextField( fieldName ); + + String analyzer = getAnnotationValueAsString( annotation, "analyzer", AnalyzerNames.DEFAULT ); + if ( !analyzer.isEmpty() ) { + fieldContext.analyzer( analyzer ); + } + + String searchAnalyzer = getAnnotationValueAsString( annotation, "searchAnalyzer", "" ); + if ( !searchAnalyzer.isEmpty() ) { + fieldContext.searchAnalyzer( searchAnalyzer ); + } + + Norms norms = getNorms( annotation ); + if ( !Norms.DEFAULT.equals( norms ) ) { + fieldContext.norms( norms ); + } + + TermVector termVector = getTermVector( annotation ); + if ( !TermVector.DEFAULT.equals( termVector ) ) { + fieldContext.termVector( termVector ); + } + List highlightable = getHighlightable( annotation ); + if ( !( highlightable.size() == 1 && Highlightable.DEFAULT.equals( highlightable.get( 0 ) ) ) ) { + fieldContext.highlightable( highlightable ); + } + + return fieldContext; + } + + @Override + protected Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { + StringIndexFieldTypeOptionsStep optionsStep = bindingContext.typeFactory().asString() + .analyzer( getAnnotationValueAsString( annotation, "analyzer", AnalyzerNames.DEFAULT ) ) + .projectable( getProjectable( annotation ) ) + .searchable( getSearchable( annotation ) ) + .norms( getNorms( annotation ) ) + .termVector( getTermVector( annotation ) ); + + String searchAnalyzer = getAnnotationValueAsString( annotation, "searchAnalyzer", "" ); + if ( !searchAnalyzer.isEmpty() ) { + optionsStep.searchAnalyzer( searchAnalyzer ); + } + List highlightable = getHighlightable( annotation ); + if ( !( highlightable.size() == 1 && Highlightable.DEFAULT.equals( highlightable.get( 0 ) ) ) ) { + optionsStep.highlightable( highlightable ); + } + return Optional.of( optionsStep ); + } + + protected Norms getNorms(AnnotationMirror annotation) { + return Norms.valueOf( getAnnotationValueAsString( annotation, "norms", "DEFAULT" ) ); + } + + protected TermVector getTermVector(AnnotationMirror annotation) { + return TermVector.valueOf( getAnnotationValueAsString( annotation, "termVector", "DEFAULT" ) ); + } + + protected List getHighlightable(AnnotationMirror annotation) { + AnnotationValue value = getAnnotationValue( annotation, "highlightable" ); + if ( value != null && value.getValue() instanceof List list ) { + return list.stream().map( v -> Objects.toString( ( (AnnotationValue) v ).getValue(), null ) ) + .map( Highlightable::valueOf ) + .collect( Collectors.toList() ); + } + return List.of( Highlightable.DEFAULT ); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java new file mode 100644 index 00000000000..5292825e76f --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingNonFullTextFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; +import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; + +public class ProcessorGenericFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { + @Override + PropertyMappingNonFullTextFieldOptionsStep initSortableFieldMappingContext(PropertyMappingStep mappingContext, + AnnotationMirror annotation, String fieldName) { + return mappingContext.genericField( fieldName ); + } + + @Override + protected Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { + Optional> loadableType = BuiltInBridgeResolverTypes.loadableType( fieldType, context.types() ); + if ( loadableType.isPresent() ) { + var step = bindingContext.typeFactory().as( loadableType.get() ); + return Optional.of( step ); + } + else { + context.messager().printMessage( Diagnostic.Kind.ERROR, "Unexpected property type.", element ); + return Optional.empty(); + } + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java new file mode 100644 index 00000000000..be4da7c4909 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java @@ -0,0 +1,58 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.engine.backend.types.Sortable; +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.bridge.builtin.programmatic.GeoPointBinder; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.TypeMappingStep; + +public class ProcessorGeoPointBindingProcessor extends AbstractProcessorAnnotationProcessor + implements ProcessorTypeMappingAnnotationProcessor { + @Override + public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, + ProcessorAnnotationProcessorContext context) { + mapping.binder( createBinder( annotation ) ); + } + + @Override + public void process(TypeMappingStep mapping, AnnotationMirror annotation, Element element, + ProcessorAnnotationProcessorContext context) { + mapping.binder( createBinder( annotation ) ); + } + + @Override + protected Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { + context.messager().printMessage( Diagnostic.Kind.ERROR, "GeoPointBinding is not allowed within binders.", element ); + return Optional.empty(); + } + + private GeoPointBinder createBinder(AnnotationMirror annotation) { + return GeoPointBinder.create() + .fieldName( getAnnotationValueAsString( annotation, "fieldName", "" ) ) + .markerSet( getAnnotationValueAsString( annotation, "markerSet", "" ) ) + .projectable( getProjectable( annotation ) ) + .sortable( getSortable( annotation ) ); + } + + protected Sortable getSortable(AnnotationMirror annotation) { + return Sortable.valueOf( getAnnotationValueAsString( annotation, "sortable", "DEFAULT" ) ); + } + + protected Projectable getProjectable(AnnotationMirror annotation) { + return Projectable.valueOf( getAnnotationValueAsString( annotation, "projectable", "DEFAULT" ) ); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java new file mode 100644 index 00000000000..b9976ebeae1 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java @@ -0,0 +1,97 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import static org.hibernate.search.metamodel.processor.impl.IndexedEntityMetamodelAnnotationProcessor.processTypeAndProperties; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.hibernate.search.engine.backend.types.ObjectStructure; +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.extractor.mapping.programmatic.ContainerExtractorPath; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.spi.MappingAnnotationProcessorUtils; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; + +public class ProcessorIndexedEmbeddedProcessor extends AbstractProcessorAnnotationProcessor { + + @SuppressWarnings("deprecation") + @Override + public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, + ProcessorAnnotationProcessorContext context) { + String cleanedUpPrefix = getAnnotationValueAsString( annotation, "prefix", null ); + + String cleanedUpName = getAnnotationValueAsString( annotation, "name", null ); + + String[] includePathsArray = toStringArray( getAnnotationValue( annotation, "includePaths" ) ); + String[] excludePathsArray = toStringArray( getAnnotationValue( annotation, "excludePaths" ) ); + + ContainerExtractorPath extractorPath = toContainerExtractorPath( annotation ); + + if ( getAnnotationValue( annotation, "targetType" ) != null ) { + context.messager().printMessage( Diagnostic.Kind.WARNING, + annotation + " defines a targetType, which cannot be processed and will be ignored" ); + } + + ObjectStructure structure = ObjectStructure.valueOf( getAnnotationValueAsString( annotation, "structure", "DEFAULT" ) ); + + AnnotationValue value = getAnnotationValue( annotation, "includeDepth" ); + Integer includeDepth = value == null ? null : (int) value.getValue(); + + value = getAnnotationValue( annotation, "includeEmbeddedObjectId" ); + boolean includeEmbeddedObjectId = value != null && (boolean) value.getValue(); + + mapping.indexedEmbedded( cleanedUpName ) + .extractors( extractorPath ) + .prefix( cleanedUpPrefix ) + .structure( structure ) + .includeDepth( includeDepth ) + .includePaths( MappingAnnotationProcessorUtils.cleanUpPaths( includePathsArray ) ) + .excludePaths( MappingAnnotationProcessorUtils.cleanUpPaths( excludePathsArray ) ) + .includeEmbeddedObjectId( includeEmbeddedObjectId ); + + // so we won't need to care about inverse side and other stuff: + mapping.indexingDependency().reindexOnUpdate( ReindexOnUpdate.NO ); + + collectExtraTypes( element.asType(), context ); + } + + private void collectExtraTypes(TypeMirror type, ProcessorAnnotationProcessorContext context) { + // TODO: add a marker annotation to allow users to simply put some @BlaBlaBla annotation on a type + // we should consider adding through programmaticMapping().type(sometype). + if ( type == null || type.getKind() == TypeKind.NONE ) { + return; + } + TypeElement element = (TypeElement) context.types().asElement( type ); + processTypeAndProperties( + element, + context.programmaticMapping().type( element.getQualifiedName().toString() ), + context + ); + collectExtraTypes( element.getSuperclass(), context ); + if ( type instanceof DeclaredType declaredType ) { + for ( TypeMirror typeArgument : declaredType.getTypeArguments() ) { + collectExtraTypes( typeArgument, context ); + } + } + } + + @Override + protected Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { + context.messager().printMessage( Diagnostic.Kind.ERROR, "IndexedEmbedded are not allowed within binders.", element ); + return Optional.empty(); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java new file mode 100644 index 00000000000..bfaee4110ed --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java @@ -0,0 +1,61 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; + +import org.hibernate.search.engine.backend.types.Norms; +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.engine.backend.types.dsl.StringIndexFieldTypeOptionsStep; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingKeywordFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingNonFullTextFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; + +public class ProcessorKeywordFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { + @Override + PropertyMappingNonFullTextFieldOptionsStep initSortableFieldMappingContext(PropertyMappingStep mappingContext, + AnnotationMirror annotation, String fieldName) { + PropertyMappingKeywordFieldOptionsStep fieldContext = mappingContext.keywordField( fieldName ); + + String normalizer = getAnnotationValueAsString( annotation, "normalizer", "" ); + if ( !normalizer.isEmpty() ) { + fieldContext.normalizer( normalizer ); + } + + Norms norms = getNorms( annotation ); + if ( !Norms.DEFAULT.equals( norms ) ) { + fieldContext.norms( norms ); + } + + return fieldContext; + } + + @Override + protected Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { + StringIndexFieldTypeOptionsStep optionsStep = bindingContext.typeFactory().asString() + .projectable( getProjectable( annotation ) ) + .sortable( getSortable( annotation ) ) + .searchable( getSearchable( annotation ) ) + .aggregable( getAggregable( annotation ) ) + .norms( getNorms( annotation ) ) + .indexNullAs( getIndexNullAs( annotation ) ); + + String normalizer = getAnnotationValueAsString( annotation, "normalizer", "" ); + if ( !normalizer.isEmpty() ) { + optionsStep.normalizer( normalizer ); + } + return Optional.of( optionsStep ); + } + + protected Norms getNorms(AnnotationMirror annotation) { + return Norms.valueOf( getAnnotationValueAsString( annotation, "norms", "DEFAULT" ) ); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java new file mode 100644 index 00000000000..3828a52aa15 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java @@ -0,0 +1,32 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.bridge.builtin.programmatic.GeoPointBinder; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; + +public class ProcessorLatitudeProcessor extends AbstractProcessorAnnotationProcessor { + @Override + public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, + ProcessorAnnotationProcessorContext context) { + mapping.marker( GeoPointBinder.latitude().markerSet( getAnnotationValueAsString( annotation, "markerSet", "" ) ) ); + } + + @Override + protected Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { + context.messager().printMessage( Diagnostic.Kind.ERROR, "Latitude is not allowed within binders.", element ); + return Optional.empty(); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java new file mode 100644 index 00000000000..43d96ef4b38 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java @@ -0,0 +1,32 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.bridge.builtin.programmatic.GeoPointBinder; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; + +public class ProcessorLongitudeProcessor extends AbstractProcessorAnnotationProcessor { + @Override + public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, + ProcessorAnnotationProcessorContext context) { + mapping.marker( GeoPointBinder.longitude().markerSet( getAnnotationValueAsString( annotation, "markerSet", "" ) ) ); + } + + @Override + protected Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { + context.messager().printMessage( Diagnostic.Kind.ERROR, "Longitude is not allowed within binders.", element ); + return Optional.empty(); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java new file mode 100644 index 00000000000..bacbe70e340 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingNonFullTextFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; +import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; + +public class ProcessorNonStandardFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { + @Override + PropertyMappingNonFullTextFieldOptionsStep initSortableFieldMappingContext(PropertyMappingStep mappingContext, + AnnotationMirror annotation, String fieldName) { + return mappingContext.genericField( fieldName ); + } + + @Override + protected Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { + Optional> loadableType = BuiltInBridgeResolverTypes.loadableType( fieldType, context.types() ); + if ( loadableType.isPresent() ) { + var step = bindingContext.typeFactory().as( loadableType.get() ); + return Optional.of( step ); + } + else { + context.messager().printMessage( Diagnostic.Kind.ERROR, "Unexpected property type.", element ); + return Optional.empty(); + } + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorPropertyMappingAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorPropertyMappingAnnotationProcessor.java new file mode 100644 index 00000000000..c83eff8feed --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorPropertyMappingAnnotationProcessor.java @@ -0,0 +1,81 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.Name; +import javax.lang.model.element.TypeElement; + +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; + +public interface ProcessorPropertyMappingAnnotationProcessor { + static boolean documentId(AnnotationMirror annotation) { + return getQualifiedName( annotation ) + .contentEquals( "org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId" ); + } + + static boolean ormId(AnnotationMirror annotation) { + return getQualifiedName( annotation ).contentEquals( "jakarta.persistence.Id" ); + } + + static Optional processor(AnnotationMirror annotation) { + Name qualifiedName = getQualifiedName( annotation ); + if ( qualifiedName.contentEquals( "org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField" ) ) { + return Optional.of( new ProcessorGenericFieldProcessor() ); + } + if ( qualifiedName + .contentEquals( "org.hibernate.search.mapper.pojo.mapping.definition.annotation.NonStandardField" ) ) { + return Optional.of( new ProcessorNonStandardFieldProcessor() ); + } + if ( qualifiedName + .contentEquals( "org.hibernate.search.mapper.pojo.mapping.definition.annotation.ScaledNumberField" ) ) { + return Optional.of( new ProcessorScaledNumberFieldProcessor() ); + } + if ( qualifiedName.contentEquals( "org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField" ) ) { + return Optional.of( new ProcessorKeywordFieldProcessor() ); + } + if ( qualifiedName.contentEquals( "org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField" ) ) { + return Optional.of( new ProcessorFulltextFieldProcessor() ); + } + if ( qualifiedName.contentEquals( "org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField" ) ) { + return Optional.of( new ProcessorVectorFieldProcessor() ); + } + if ( qualifiedName.contentEquals( "org.hibernate.search.mapper.pojo.mapping.definition.annotation.PropertyBinding" ) ) { + return Optional.of( new ProcessorTypePropertyBindingProcessor() ); + } + if ( qualifiedName.contentEquals( "org.hibernate.search.mapper.pojo.mapping.definition.annotation.TypeBinding" ) ) { + return Optional.of( new ProcessorTypePropertyBindingProcessor() ); + } + if ( qualifiedName.contentEquals( "org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded" ) ) { + return Optional.of( new ProcessorIndexedEmbeddedProcessor() ); + } + + if ( qualifiedName.contentEquals( "org.hibernate.search.mapper.pojo.bridge.builtin.annotation.Latitude" ) ) { + return Optional.of( new ProcessorLatitudeProcessor() ); + } + if ( qualifiedName.contentEquals( "org.hibernate.search.mapper.pojo.bridge.builtin.annotation.Longitude" ) ) { + return Optional.of( new ProcessorLongitudeProcessor() ); + } + if ( qualifiedName.contentEquals( "org.hibernate.search.mapper.pojo.bridge.builtin.annotation.GeoPointBinding" ) ) { + return Optional.of( new ProcessorGeoPointBindingProcessor() ); + } + + return Optional.empty(); + } + + private static Name getQualifiedName(AnnotationMirror annotation) { + return ( (TypeElement) annotation.getAnnotationType().asElement() ).getQualifiedName(); + } + + void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, + ProcessorAnnotationProcessorContext context); + + void process(PropertyBindingContext bindingContext, AnnotationMirror annotation, + ProcessorAnnotationProcessorContext context, Element element); +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java new file mode 100644 index 00000000000..8ccae01680b --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java @@ -0,0 +1,47 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.AnnotationDefaultValues; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingNonFullTextFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingScaledNumberFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; +import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; + +public class ProcessorScaledNumberFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { + @Override + PropertyMappingNonFullTextFieldOptionsStep initSortableFieldMappingContext(PropertyMappingStep mappingContext, + AnnotationMirror annotation, String fieldName) { + PropertyMappingScaledNumberFieldOptionsStep fieldContext = mappingContext.scaledNumberField( fieldName ); + int decimalScale = getAnnotationValueAsInt( annotation, "decimalScale", AnnotationDefaultValues.DEFAULT_DECIMAL_SCALE ); + if ( decimalScale != AnnotationDefaultValues.DEFAULT_DECIMAL_SCALE ) { + fieldContext.decimalScale( decimalScale ); + } + return fieldContext; + } + + @Override + protected Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { + Optional> loadableType = BuiltInBridgeResolverTypes.loadableType( fieldType, context.types() ); + if ( loadableType.isPresent() ) { + var step = bindingContext.typeFactory().as( loadableType.get() ); + return Optional.of( step ); + } + else { + context.messager().printMessage( Diagnostic.Kind.ERROR, "Unexpected property type.", element ); + return Optional.empty(); + } + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypeMappingAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypeMappingAnnotationProcessor.java new file mode 100644 index 00000000000..6d5038d3111 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypeMappingAnnotationProcessor.java @@ -0,0 +1,29 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.Name; +import javax.lang.model.element.TypeElement; + +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.TypeMappingStep; + +public interface ProcessorTypeMappingAnnotationProcessor { + static Optional processor(AnnotationMirror annotation) { + Name qualifiedName = ( (TypeElement) annotation.getAnnotationType().asElement() ).getQualifiedName(); + if ( qualifiedName.contentEquals( "org.hibernate.search.mapper.pojo.bridge.builtin.annotation.GeoPointBinding" ) ) { + return Optional.of( new ProcessorGeoPointBindingProcessor() ); + } + + return Optional.empty(); + } + + void process(TypeMappingStep mapping, AnnotationMirror annotation, Element element, + ProcessorAnnotationProcessorContext context); + +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java new file mode 100644 index 00000000000..96058504755 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java @@ -0,0 +1,90 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.hibernate.search.engine.backend.document.DocumentElement; +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.mapper.pojo.bridge.PropertyBridge; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.bridge.mapping.programmatic.PropertyBinder; +import org.hibernate.search.mapper.pojo.bridge.runtime.PropertyBridgeWriteContext; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; + +public class ProcessorTypePropertyBindingProcessor extends AbstractProcessorAnnotationProcessor { + @Override + public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, + ProcessorAnnotationProcessorContext context) { + AnnotationMirror propertyBinder = getAnnotationProperty( annotation, "binder" ); + if ( propertyBinder != null ) { + AnnotationValue type = getAnnotationValue( propertyBinder, "type" ); + if ( type != null ) { + TypeMirror binder = (TypeMirror) type.getValue(); + + mapping.binder( new ProcessorPropertyBinder( context, binder ) ); + } + } + } + + @Override + protected Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { + context.messager().printMessage( Diagnostic.Kind.WARNING, "Property binding within the binder is not supported", + element ); + return Optional.empty(); + } + + private static class ProcessorPropertyBinder implements PropertyBinder { + private final ProcessorAnnotationProcessorContext context; + private final TypeMirror binder; + + public ProcessorPropertyBinder(ProcessorAnnotationProcessorContext context, TypeMirror binder) { + this.context = context; + this.binder = binder; + } + + @Override + public void bind(PropertyBindingContext bindingContext) { + bindingContext.dependencies().useRootOnly(); + + for ( Element member : context.elements() + .getAllMembers( (TypeElement) context.types().asElement( binder ) ) ) { + if ( member.getKind() == ElementKind.FIELD ) { + // we only care about fields in the "injectable binders" (at least for now): + for ( AnnotationMirror annotationMirror : member.getAnnotationMirrors() ) { + ProcessorPropertyMappingAnnotationProcessor.processor( annotationMirror ) + .ifPresent( p -> p.process( + bindingContext, + annotationMirror, + context, + member + ) ); + } + } + } + + bindingContext.bridge( DoNothingPropertyBridge.INSTANCE ); + } + + private static class DoNothingPropertyBridge implements PropertyBridge { + private static final DoNothingPropertyBridge INSTANCE = new DoNothingPropertyBridge(); + + @Override + public void write(DocumentElement target, Object bridgedElement, + PropertyBridgeWriteContext context) { + // do nothing + } + } + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java new file mode 100644 index 00000000000..5423387ea35 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java @@ -0,0 +1,143 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.annotation.processing.impl; + +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.engine.backend.types.Searchable; +import org.hibernate.search.engine.backend.types.VectorSimilarity; +import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; +import org.hibernate.search.engine.backend.types.dsl.VectorFieldTypeOptionsStep; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.extractor.mapping.programmatic.ContainerExtractorPath; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.AnnotationDefaultValues; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingFieldOptionsStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingVectorFieldOptionsStep; +import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; + +public class ProcessorVectorFieldProcessor extends AbstractProcessorFieldAnnotationProcessor { + @Override + PropertyMappingFieldOptionsStep initFieldMappingContext(PropertyMappingStep mappingContext, AnnotationMirror annotation, + String fieldName) { + int dimension = getAnnotationValueAsInt( annotation, "dimension", AnnotationDefaultValues.DEFAULT_DIMENSION ); + PropertyMappingVectorFieldOptionsStep fieldContext = dimension == AnnotationDefaultValues.DEFAULT_DIMENSION + ? mappingContext.vectorField( fieldName ) + : mappingContext.vectorField( dimension, fieldName ); + + int m = getAnnotationValueAsInt( annotation, "m", AnnotationDefaultValues.DEFAULT_M ); + if ( m != AnnotationDefaultValues.DEFAULT_M ) { + fieldContext.m( m ); + } + + int efConstruction = + getAnnotationValueAsInt( annotation, "efConstruction", AnnotationDefaultValues.DEFAULT_EF_CONSTRUCTION ); + if ( efConstruction != AnnotationDefaultValues.DEFAULT_EF_CONSTRUCTION ) { + fieldContext.efConstruction( efConstruction ); + } + + VectorSimilarity vectorSimilarity = getVectorSimilarity( annotation ); + if ( !VectorSimilarity.DEFAULT.equals( vectorSimilarity ) ) { + fieldContext.vectorSimilarity( vectorSimilarity ); + } + Projectable projectable = getProjectable( annotation ); + if ( !Projectable.DEFAULT.equals( projectable ) ) { + fieldContext.projectable( projectable ); + } + + Searchable searchable = getSearchable( annotation ); + if ( !Searchable.DEFAULT.equals( searchable ) ) { + fieldContext.searchable( searchable ); + } + + String indexNullAs = getIndexNullAs( annotation ); + if ( indexNullAs != null && !AnnotationDefaultValues.DO_NOT_INDEX_NULL.equals( indexNullAs ) ) { + fieldContext.indexNullAs( indexNullAs ); + } + + return fieldContext; + } + + @Override + protected Optional> configureField(PropertyBindingContext bindingContext, + AnnotationMirror annotation, + ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { + Class vectorType; + Optional> loadableType = BuiltInBridgeResolverTypes.loadableType( fieldType, context.types() ); + if ( loadableType.isPresent() ) { + vectorType = loadableType.get(); + } + else { + context.messager().printMessage( Diagnostic.Kind.ERROR, "Only float[]/byte[] fields are allowed.", element ); + return Optional.empty(); + } + + VectorFieldTypeOptionsStep optionsStep = bindingContext.typeFactory().asVector( vectorType ) + // it doesn't really matter since we won't be actually using this value anywhere, + // but since it's "optional" let's just keep it simple for now here: + .dimension( 10 ); + + int m = getAnnotationValueAsInt( annotation, "m", AnnotationDefaultValues.DEFAULT_M ); + if ( m != AnnotationDefaultValues.DEFAULT_M ) { + optionsStep.m( m ); + } + + int efConstruction = + getAnnotationValueAsInt( annotation, "efConstruction", AnnotationDefaultValues.DEFAULT_EF_CONSTRUCTION ); + if ( efConstruction != AnnotationDefaultValues.DEFAULT_EF_CONSTRUCTION ) { + optionsStep.efConstruction( efConstruction ); + } + + VectorSimilarity vectorSimilarity = getVectorSimilarity( annotation ); + if ( !VectorSimilarity.DEFAULT.equals( vectorSimilarity ) ) { + optionsStep.vectorSimilarity( vectorSimilarity ); + } + Projectable projectable = getProjectable( annotation ); + if ( !Projectable.DEFAULT.equals( projectable ) ) { + optionsStep.projectable( projectable ); + } + + Searchable searchable = getSearchable( annotation ); + if ( !Searchable.DEFAULT.equals( searchable ) ) { + optionsStep.searchable( searchable ); + } + + //indexNullAs doesn't really influence the model, let's ignore it: + // String indexNullAs = getIndexNullAs( annotation ); + // if ( indexNullAs != null && !AnnotationDefaultValues.DO_NOT_INDEX_NULL.equals( indexNullAs ) ) { + // optionsStep.indexNullAs( indexNullAs ); + // } + return Optional.of( optionsStep ); + } + + protected ContainerExtractorPath toContainerExtractorPath(AnnotationMirror extraction) { + if ( extraction == null ) { + return ContainerExtractorPath.noExtractors(); + } + return toContainerExtractorPath( extraction, "NO" ); + } + + protected VectorSimilarity getVectorSimilarity(AnnotationMirror annotation) { + return VectorSimilarity.valueOf( getAnnotationValueAsString( annotation, "vectorSimilarity", "DEFAULT" ) ); + } + + protected Searchable getSearchable(AnnotationMirror annotation) { + return Searchable.valueOf( getAnnotationValueAsString( annotation, "searchable", "DEFAULT" ) ); + } + + protected Projectable getProjectable(AnnotationMirror annotation) { + return Projectable.valueOf( getAnnotationValueAsString( annotation, "projectable", "DEFAULT" ) ); + } + + protected String getIndexNullAs(AnnotationMirror annotation) { + return getAnnotationValueAsString( annotation, "indexNullAs", AnnotationDefaultValues.DO_NOT_INDEX_NULL ); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/HibernateSearchMetamodelProcessorContext.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/HibernateSearchMetamodelProcessorContext.java new file mode 100644 index 00000000000..86e19bda717 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/HibernateSearchMetamodelProcessorContext.java @@ -0,0 +1,16 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.impl; + + +import javax.annotation.processing.Messager; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; + +public record HibernateSearchMetamodelProcessorContext( Elements elementUtils, Types typeUtils, Messager messager, + javax.annotation.processing.Filer filer) { + + +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java new file mode 100644 index 00000000000..f74b5fac19e --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java @@ -0,0 +1,203 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.impl; + +import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.flattenedAnnotations; +import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.propertyElements; + +import java.io.IOException; +import java.io.Writer; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; + +import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.tools.Diagnostic; +import javax.tools.JavaFileObject; + +import org.hibernate.search.engine.backend.metamodel.IndexObjectFieldDescriptor; +import org.hibernate.search.engine.backend.metamodel.IndexValueFieldDescriptor; +import org.hibernate.search.engine.environment.bean.BeanReference; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.ProgrammaticMappingConfigurationContext; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; +import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.TypeMappingStep; +import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector; +import org.hibernate.search.mapper.pojo.standalone.bootstrap.spi.StandalonePojoIntegrationBooter; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; +import org.hibernate.search.mapper.pojo.standalone.entity.SearchIndexedEntity; +import org.hibernate.search.mapper.pojo.standalone.mapping.CloseableSearchMapping; +import org.hibernate.search.mapper.pojo.standalone.mapping.StandalonePojoMappingConfigurer; +import org.hibernate.search.metamodel.processor.annotation.processing.impl.ProcessorAnnotationProcessorContext; +import org.hibernate.search.metamodel.processor.annotation.processing.impl.ProcessorPropertyMappingAnnotationProcessor; +import org.hibernate.search.metamodel.processor.annotation.processing.impl.ProcessorTypeMappingAnnotationProcessor; +import org.hibernate.search.metamodel.processor.mapping.impl.ProcessorIntrospectorContext; +import org.hibernate.search.metamodel.processor.mapping.impl.ProcessorPojoModelsBootstrapIntrospector; +import org.hibernate.search.metamodel.processor.writer.impl.MetamodelClassWriter; +import org.hibernate.search.metamodel.processor.writer.impl.MetamodelNamesFormatter; + +public class IndexedEntityMetamodelAnnotationProcessor implements MetamodelAnnotationProcessor { + + private static final String ANNOTATION_INDEXED = "org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed"; + private final HibernateSearchMetamodelProcessorContext context; + private final ProcessorIntrospectorContext introspectorContext; + private ProcessorPojoModelsBootstrapIntrospector introspector; + + public IndexedEntityMetamodelAnnotationProcessor(HibernateSearchMetamodelProcessorContext context) { + this.context = context; + this.introspectorContext = new ProcessorIntrospectorContext( context ); + } + + @Override + public void process(RoundEnvironment roundEnv) { + TypeElement indexedAnnotation = context.elementUtils().getTypeElement( ANNOTATION_INDEXED ); + Set indexedEntities = roundEnv.getElementsAnnotatedWith( indexedAnnotation ); + + try ( CloseableSearchMapping searchMapping = StandalonePojoIntegrationBooter.builder() + .introspectorCustomizer( this::wrapIntrospector ) + .property( "hibernate.search.backend.directory.type", "local-heap" ) + .property( + StandalonePojoMapperSettings.MAPPING_CONFIGURER, + BeanReference.ofInstance( (StandalonePojoMappingConfigurer) configurationContext -> { + // disable any discovery by annotations -- that won't work as we do not implement annotations in the pojo model + configurationContext.annotationMapping() + .discoverAnnotatedTypesFromRootMappingAnnotations( false ) + .discoverAnnotationsFromReferencedTypes( false ) + .discoverJandexIndexesFromAddedTypes( false ) + .buildMissingDiscoveredJandexIndexes( false ); + + ProgrammaticMappingConfigurationContext programmaticMapping = + configurationContext.programmaticMapping(); + + ProcessorAnnotationProcessorContext ctx = new ProcessorAnnotationProcessorContext( + context.elementUtils(), + context.typeUtils(), context.messager(), programmaticMapping + ); + introspectorContext.processorAnnotationProcessorContext( ctx ); + + for ( Element el : indexedEntities ) { + if ( el.getKind().isClass() || el.getKind().isInterface() ) { + TypeElement indexedEntityType = (TypeElement) el; + + String typeName = indexedEntityType.getQualifiedName().toString(); + + introspectorContext.typeElementsByName( typeName, indexedEntityType ); + + TypeMappingStep typeMappingContext = programmaticMapping.type( typeName ); + typeMappingContext.indexed().enabled( true ); + typeMappingContext.searchEntity().name( typeName ); + + processTypeAndProperties( indexedEntityType, typeMappingContext, ctx ); + } + else { + // TODO: generate message bundle with JBoss Logging ? + context.messager() + .printMessage( + Diagnostic.Kind.ERROR, + "Unexpected location of the " + indexedAnnotation.getQualifiedName() + + ". Expected to be placed on an indexed type.", + el + ); + } + } + + } ) + ).build() + .boot() ) { + + for ( SearchIndexedEntity entity : searchMapping.allIndexedEntities() ) { + context.messager().printMessage( Diagnostic.Kind.NOTE, entity.name() ); + String packageName = entity.name().substring( 0, entity.name().lastIndexOf( "." ) ); + + MetamodelClassWriter.Builder builder = + new MetamodelClassWriter.Builder( MetamodelNamesFormatter.DEFAULT, packageName, entity.name() ); + + entity.indexManager().descriptor().staticFields() + .forEach( f -> { + if ( f.parent().isRoot() ) { + if ( f.isValueField() ) { + IndexValueFieldDescriptor valueField = f.toValueField(); + builder.addProperty( valueField ); + } + else { + IndexObjectFieldDescriptor objectField = f.toObjectField(); + builder.addProperty( objectField ); + } + } + } ); + try { + JavaFileObject source = context.filer().createSourceFile( builder.fqcn() ); + context.messager().printMessage( Diagnostic.Kind.NOTE, source.toUri().toString() ); + try ( Writer writer = source.openWriter() ) { + writer.append( builder.formatted() ); + } + catch (IOException e) { + throw new RuntimeException( e ); + } + } + catch (IOException e) { + throw new RuntimeException( e ); + } + } + } + + context.messager().printMessage( Diagnostic.Kind.NOTE, "End" ); + } + + public static void processTypeAndProperties(TypeElement typeElement, TypeMappingStep typeMappingContext, + ProcessorAnnotationProcessorContext ctx) { + if ( !ctx.processedTypes().add( typeElement ) ) { + return; + } + + flattenedAnnotations( ctx.types(), typeElement ) + .forEach( annotationMirror -> { + ProcessorTypeMappingAnnotationProcessor.processor( annotationMirror ) + .ifPresent( p -> p.process( + typeMappingContext, + annotationMirror, + typeElement, + ctx + ) ); + } ); + + AtomicReference documentId = new AtomicReference<>(); + AtomicReference ormId = new AtomicReference<>(); + propertyElements( ctx.elements(), typeElement ) + .forEach( element -> { + PropertyMappingStep step = typeMappingContext.property( element.getSimpleName().toString() ); + + flattenedAnnotations( ctx.types(), element ) + .forEach( annotationMirror -> { + if ( ProcessorPropertyMappingAnnotationProcessor.documentId( annotationMirror ) ) { + documentId.set( step ); + } + else if ( ProcessorPropertyMappingAnnotationProcessor.ormId( annotationMirror ) ) { + ormId.set( step ); + } + else { + ProcessorPropertyMappingAnnotationProcessor.processor( annotationMirror ) + .ifPresent( p -> p.process( + step, + annotationMirror, + element, + ctx + ) ); + } + } ); + } ); + if ( documentId.get() != null ) { + documentId.get().documentId(); + } + if ( ormId.get() != null ) { + ormId.get().documentId(); + } + } + + private ProcessorPojoModelsBootstrapIntrospector wrapIntrospector(PojoBootstrapIntrospector introspector) { + this.introspector = new ProcessorPojoModelsBootstrapIntrospector( introspectorContext, introspector ); + return this.introspector; + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/MetamodelAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/MetamodelAnnotationProcessor.java new file mode 100644 index 00000000000..7c7a7021864 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/MetamodelAnnotationProcessor.java @@ -0,0 +1,13 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.impl; + +import javax.annotation.processing.RoundEnvironment; + +public interface MetamodelAnnotationProcessor { + + void process(RoundEnvironment roundEnv); + +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ProcessorElementUtils.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ProcessorElementUtils.java new file mode 100644 index 00000000000..4959b591d24 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ProcessorElementUtils.java @@ -0,0 +1,94 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.impl; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Stream; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; + +public final class ProcessorElementUtils { + + private ProcessorElementUtils() { + } + + public static Stream propertyElements(Elements elementUtils, TypeElement typeElement) { + return elementUtils.getAllMembers( typeElement ) + .stream() + .filter( ProcessorElementUtils::isProperty ); + } + + public static Stream flattenedAnnotations(Types types, Element element) { + return element.getAnnotationMirrors().stream() + .flatMap( a -> ProcessorElementUtils.flattened( types, a ) ); + } + + @SuppressWarnings("unchecked") + private static Stream flattened(Types types, AnnotationMirror annotationMirror) { + for ( Map.Entry entry : annotationMirror.getElementValues() + .entrySet() ) { + if ( entry.getKey().getSimpleName().contentEquals( "value" ) ) { + if ( entry.getKey().getReturnType() instanceof ArrayType arrayType ) { + Optional repeatable = types.asElement( arrayType.getComponentType() ) + .getAnnotationMirrors() + .stream() + .filter( a -> ( (TypeElement) a.getAnnotationType().asElement() ).getQualifiedName() + .contentEquals( "java.lang.annotation.Repeatable" ) ) + .findAny(); + if ( repeatable.isPresent() ) { + TypeMirror returnType = (TypeMirror) repeatable.get().getElementValues().entrySet().iterator().next() + .getValue().getValue(); + TypeMirror annotationType = annotationMirror.getAnnotationType(); + if ( types.isSameType( returnType, annotationType ) ) { + return ( (List) entry.getValue().getValue() ).stream(); + } + } + } + + } + } + return Stream.of( annotationMirror ); + } + + private static boolean isProperty(Element element) { + if ( element.getKind() == ElementKind.METHOD ) { + ExecutableElement executable = (ExecutableElement) element; + return isGetter( executable ); + } + else { + return element.getKind() == ElementKind.FIELD; + } + } + + private static boolean isGetter(ExecutableElement executable) { + if ( !executable.getParameters().isEmpty() ) { + return false; + } + TypeMirror returnType = executable.getReturnType(); + if ( returnType.getKind() == TypeKind.VOID ) { + return false; + } + String name = executable.getSimpleName().toString(); + if ( returnType.getKind() == TypeKind.BOOLEAN + || !returnType.getKind().isPrimitive() + && returnType.toString().equals( "java.lang.Boolean" ) ) { + return name.startsWith( "is" ) || name.startsWith( "has" ); + } + + return name.startsWith( "get" ); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/MappingLog.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/MappingLog.java new file mode 100644 index 00000000000..ae247e2b4ee --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/MappingLog.java @@ -0,0 +1,39 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.logging.impl; + +import static org.hibernate.search.metamodel.processor.logging.impl.ProcessorLog.ID_OFFSET; + +import java.lang.invoke.MethodHandles; + +import org.hibernate.search.util.common.SearchException; +import org.hibernate.search.util.common.logging.CategorizedLogger; +import org.hibernate.search.util.common.logging.impl.LoggerFactory; +import org.hibernate.search.util.common.logging.impl.MessageConstants; + +import org.jboss.logging.annotations.Message; +import org.jboss.logging.annotations.MessageLogger; + +@CategorizedLogger( + category = MappingLog.CATEGORY_NAME, + description = """ + Logs related to creating Hibernate Search mapping. + """ +) +@MessageLogger(projectCode = MessageConstants.PROJECT_CODE) +public interface MappingLog { + String CATEGORY_NAME = "org.hibernate.search.mapping.mapper"; + + MappingLog INSTANCE = LoggerFactory.make( MappingLog.class, CATEGORY_NAME, MethodHandles.lookup() ); + + @Message(id = ID_OFFSET + 1, + value = "Unexpected extractor references:" + + " extractors cannot be defined explicitly when extract = ContainerExtract.NO." + + " Either leave 'extract' to its default value to define extractors explicitly" + + " or leave the 'extractor' list to its default, empty value to disable extraction." + ) + SearchException cannotReferenceExtractorsWhenExtractionDisabled(); + +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/ProcessorLog.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/ProcessorLog.java new file mode 100644 index 00000000000..6f7c58bf573 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/ProcessorLog.java @@ -0,0 +1,17 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.logging.impl; + + +import org.hibernate.search.util.common.logging.impl.MessageConstants; + +import org.jboss.logging.annotations.MessageLogger; +import org.jboss.logging.annotations.ValidIdRange; + +@MessageLogger(projectCode = MessageConstants.PROJECT_CODE) +@ValidIdRange(min = MessageConstants.PROCESSOR_ID_RANGE_MIN, max = MessageConstants.PROCESSOR_ID_RANGE_MAX) +public interface ProcessorLog extends MappingLog { + int ID_OFFSET = MessageConstants.PROCESSOR_ID_RANGE_MIN; +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorIntrospectorContext.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorIntrospectorContext.java new file mode 100644 index 00000000000..2915a619c39 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorIntrospectorContext.java @@ -0,0 +1,63 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.mapping.impl; + +import java.util.Objects; + +import javax.annotation.processing.Messager; +import javax.lang.model.element.TypeElement; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; + +import org.hibernate.search.metamodel.processor.annotation.processing.impl.ProcessorAnnotationProcessorContext; +import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; + +public final class ProcessorIntrospectorContext { + private final HibernateSearchMetamodelProcessorContext processorContext; + + private String typeName; + private TypeElement indexedEntityType; + private ProcessorAnnotationProcessorContext processorAnnotationProcessorContext; + + public ProcessorIntrospectorContext(HibernateSearchMetamodelProcessorContext processorContext) { + this.processorContext = processorContext; + } + + public HibernateSearchMetamodelProcessorContext processorContext() { + return processorContext; + } + + public Elements elementUtils() { + return processorContext().elementUtils(); + } + + public Types typeUtils() { + return processorContext().typeUtils(); + } + + public Messager messager() { + return processorContext().messager(); + } + + public void typeElementsByName(String typeName, TypeElement indexedEntityType) { + this.typeName = typeName; + this.indexedEntityType = indexedEntityType; + } + + public TypeElement typeElementsByName(String typeName) { + if ( Objects.equals( typeName, this.typeName ) ) { + return indexedEntityType; + } + return null; + } + + public void processorAnnotationProcessorContext(ProcessorAnnotationProcessorContext processorAnnotationProcessorContext) { + this.processorAnnotationProcessorContext = processorAnnotationProcessorContext; + } + + public ProcessorAnnotationProcessorContext processorAnnotationProcessorContext() { + return processorAnnotationProcessorContext; + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java new file mode 100644 index 00000000000..1929571034e --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java @@ -0,0 +1,90 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.mapping.impl; + + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import javax.lang.model.element.Name; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; + +import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector; +import org.hibernate.search.mapper.pojo.model.spi.PojoRawTypeModel; +import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; +import org.hibernate.search.metamodel.processor.model.impl.ProcessorPojoRawTypeModel; +import org.hibernate.search.metamodel.processor.model.impl.ProcessorTypeOrdering; +import org.hibernate.search.util.common.reflect.spi.ValueHandleFactory; + +public class ProcessorPojoModelsBootstrapIntrospector implements PojoBootstrapIntrospector { + + private final Map> elementTypeModelCache = new HashMap<>(); + private final Map, PojoRawTypeModel> typeModelCache = new HashMap<>(); + private final ProcessorIntrospectorContext context; + private final PojoBootstrapIntrospector delegate; + private final ProcessorTypeOrdering typeOrdering; + + public ProcessorPojoModelsBootstrapIntrospector(ProcessorIntrospectorContext context, PojoBootstrapIntrospector delegate) { + this.context = context; + this.delegate = delegate; + this.typeOrdering = new ProcessorTypeOrdering( context.processorContext() ); + } + + @Override + public PojoRawTypeModel typeModel(Class clazz) { + return delegate.typeModel( clazz ); + } + + @Override + public PojoRawTypeModel typeModel(String name) { + TypeElement typeElement = context.typeElementsByName( name ); + if ( typeElement == null ) { + try { + typeElement = context.elementUtils().getTypeElement( name ); + } + catch (Exception e) { + throw new IllegalArgumentException( name + " not found", e ); + } + } + return typeModel( typeElement ); + } + + public PojoRawTypeModel typeModel(TypeElement typeElement) { + Name qualifiedName = typeElement.getQualifiedName(); + return elementTypeModelCache.computeIfAbsent( qualifiedName, + k -> { + Optional> loadableType = + BuiltInBridgeResolverTypes.loadableType( typeElement.asType(), context.typeUtils() ); + if ( loadableType.isPresent() ) { + return typeModel( loadableType.get() ); + } + else { + return new ProcessorPojoRawTypeModel<>( typeElement, context.processorContext(), this ); + } + } ); + } + + public PojoRawTypeModel typeModel(TypeMirror typeMirror) { + Optional> loadableType = + BuiltInBridgeResolverTypes.loadableType( typeMirror, context.processorContext().typeUtils() ); + if ( loadableType.isPresent() ) { + return typeModel( loadableType.get() ); + } + else { + return new ProcessorPojoRawTypeModel<>( typeMirror, context.processorContext(), this ); + } + } + + @Override + public ValueHandleFactory annotationValueHandleFactory() { + return delegate.annotationValueHandleFactory(); + } + + public ProcessorTypeOrdering typeOrdering() { + return typeOrdering; + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/BuiltInBridgeResolverTypes.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/BuiltInBridgeResolverTypes.java new file mode 100644 index 00000000000..63b4979d982 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/BuiltInBridgeResolverTypes.java @@ -0,0 +1,144 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model.impl; + +import java.util.Optional; +import java.util.Set; + +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Types; + +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating +public final class BuiltInBridgeResolverTypes { + + private BuiltInBridgeResolverTypes() { + } + + // TODO: need test that types are not missing + private static Set TYPES = Set.of( + "java.lang.String", + "java.lang.Character", + "java.lang.Boolean", + "java.lang.Byte", + "java.lang.Short", + "java.lang.Integer", + "java.lang.Long", + "java.lang.Float", + "java.lang.Double", + + // TODO: handle enums somehow: + // strictSubTypesOf( Enum.class ) + + "java.math.BigInteger", + "java.math.BigDecimal", + + "java.time.LocalDate", + "java.time.Instant", + "java.time.LocalDateTime", + "java.time.LocalTime", + "java.time.ZonedDateTime", + "java.time.Year", + "java.time.YearMonth", + "java.time.MonthDay", + "java.time.OffsetDateTime", + "java.time.OffsetTime", + "java.time.ZoneOffset", + "java.time.ZoneId", + "java.time.Period", + "java.time.Duration", + + "java.util.UUID", + "java.util.Date", + "java.util.Calendar", + + "java.sql.Date", + "java.sql.Timestamp", + "java.sql.Time", + + "java.net.URI", + "java.net.URL", + + // TODO: handle geo pints + // subTypesOf( GeoPoint.class ) + "org.hibernate.search.engine.spatial.GeoPoint" + + // arrays for vector fields: + // primitive types are handled differently + ); + + private static Set CONTAINERS = Set.of( + "java.util.List", + "java.util.Set" + ); + + public static boolean isBuiltInType(String typeName) { + return TYPES.contains( typeName ); + } + + public static boolean isContainer(TypeMirror mirror, Types types) { + if ( mirror == null || mirror.getKind() == TypeKind.NONE ) { + return false; + } + TypeElement element = (TypeElement) types.asElement( mirror ); + if ( CONTAINERS.contains( element.getQualifiedName().toString() ) ) { + return true; + } + if ( isContainer( element.getSuperclass(), types ) ) { + return true; + } + for ( TypeMirror i : element.getInterfaces() ) { + if ( isContainer( i, types ) ) { + return true; + } + } + + return false; + } + + public static Optional> loadableType(TypeMirror propertyType, Types types) { + try { + if ( propertyType instanceof ArrayType arrayType ) { + TypeMirror componentType = arrayType.getComponentType(); + Class componentTypeClass = null; + if ( componentType.getKind().isPrimitive() ) { + switch ( componentType.getKind() ) { + case BOOLEAN -> componentTypeClass = boolean.class; + case BYTE -> componentTypeClass = byte.class; + case SHORT -> componentTypeClass = short.class; + case INT -> componentTypeClass = int.class; + case LONG -> componentTypeClass = long.class; + case CHAR -> componentTypeClass = char.class; + case FLOAT -> componentTypeClass = float.class; + case DOUBLE -> componentTypeClass = double.class; + default -> throw new IllegalStateException( "Unsupported primitive type: " + componentType.getKind() ); + } + } + else if ( isBuiltInType( componentType.toString() ) ) { + componentTypeClass = Class.forName( componentType.toString() ); + } + if ( componentTypeClass != null ) { + return Optional.of( componentTypeClass.arrayType() ); + } + else { + return Optional.empty(); + } + } + + String typeName = propertyType.toString(); + return isBuiltInType( typeName ) + ? Optional.of( Class.forName( typeName ) ) + : Optional.empty(); + } + catch (ClassNotFoundException e) { + // TODO: ... + throw new RuntimeException( e ); + } + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoPropertyModel.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoPropertyModel.java new file mode 100644 index 00000000000..ea92e1e2944 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoPropertyModel.java @@ -0,0 +1,90 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model.impl; + +import java.lang.annotation.Annotation; +import java.util.stream.Stream; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeMirror; + +import org.hibernate.search.mapper.pojo.model.spi.PojoPropertyModel; +import org.hibernate.search.mapper.pojo.model.spi.PojoTypeModel; +import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; +import org.hibernate.search.metamodel.processor.mapping.impl.ProcessorPojoModelsBootstrapIntrospector; +import org.hibernate.search.util.common.reflect.spi.ValueReadHandle; + +public class ProcessorPojoPropertyModel implements PojoPropertyModel { + + private final Element element; + private final HibernateSearchMetamodelProcessorContext context; + private final ProcessorPojoModelsBootstrapIntrospector introspector; + + private final String propertyName; + private final TypeMirror propertyType; + + public ProcessorPojoPropertyModel(VariableElement element, String propertyName, + HibernateSearchMetamodelProcessorContext context, + ProcessorPojoModelsBootstrapIntrospector introspector) { + this.element = element; + this.context = context; + this.introspector = introspector; + + this.propertyName = propertyName; + this.propertyType = element.asType(); + } + + public ProcessorPojoPropertyModel(ExecutableElement element, String propertyName, + HibernateSearchMetamodelProcessorContext context, + ProcessorPojoModelsBootstrapIntrospector introspector) { + this.element = element; + this.context = context; + this.introspector = introspector; + + this.propertyName = propertyName; + this.propertyType = element.getReturnType(); + } + + @Override + public String name() { + return propertyName; + } + + @Override + public Stream annotations() { + throw new UnsupportedOperationException(); + } + + @SuppressWarnings("unchecked") + @Override + public PojoTypeModel typeModel() { + // todo need to handle enums + // need to handle geo point subtypes + // Optional> loadableType = BuiltInBridgeResolverTypes.loadableType( propertyType, context.typeUtils() ); + // if ( loadableType.isPresent() ) { + // return (PojoTypeModel) introspector.typeModel( loadableType.get() ); + // } + // else { + return (PojoTypeModel) introspector.typeModel( propertyType ); + // } + } + + @SuppressWarnings("unchecked") + @Override + public ValueReadHandle handle() { + return (ValueReadHandle) ProcessorValueReadHandle.INSTANCE; + } + + private static class ProcessorValueReadHandle implements ValueReadHandle { + static final ProcessorValueReadHandle INSTANCE = new ProcessorValueReadHandle<>(); + + @Override + public T get(Object thiz) { + throw new UnsupportedOperationException(); + } + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java new file mode 100644 index 00000000000..e6363c08111 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java @@ -0,0 +1,254 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model.impl; + +import static org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector.noPrefix; +import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.propertyElements; + +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.Name; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; + +import org.hibernate.search.engine.mapper.model.spi.MappableTypeModel; +import org.hibernate.search.mapper.pojo.model.spi.PojoCaster; +import org.hibernate.search.mapper.pojo.model.spi.PojoConstructorModel; +import org.hibernate.search.mapper.pojo.model.spi.PojoPropertyModel; +import org.hibernate.search.mapper.pojo.model.spi.PojoRawTypeIdentifier; +import org.hibernate.search.mapper.pojo.model.spi.PojoRawTypeModel; +import org.hibernate.search.mapper.pojo.model.spi.PojoTypeModel; +import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; +import org.hibernate.search.metamodel.processor.mapping.impl.ProcessorPojoModelsBootstrapIntrospector; + +public class ProcessorPojoRawTypeModel implements PojoRawTypeModel { + + private final TypeMirror typeMirror; + private final TypeElement typeElement; + private final HibernateSearchMetamodelProcessorContext context; + private final ProcessorPojoModelsBootstrapIntrospector introspector; + private final Map> propertyModels = new HashMap<>(); + + public ProcessorPojoRawTypeModel(TypeElement typeElement, HibernateSearchMetamodelProcessorContext context, + ProcessorPojoModelsBootstrapIntrospector introspector) { + this( null, typeElement, context, introspector ); + } + + public ProcessorPojoRawTypeModel(TypeMirror typeMirror, HibernateSearchMetamodelProcessorContext context, + ProcessorPojoModelsBootstrapIntrospector introspector) { + this( typeMirror, (TypeElement) context.typeUtils().asElement( typeMirror ), context, introspector ); + } + + private ProcessorPojoRawTypeModel(TypeMirror typeMirror, TypeElement typeElement, + HibernateSearchMetamodelProcessorContext context, ProcessorPojoModelsBootstrapIntrospector introspector) { + this.typeMirror = typeMirror; + this.typeElement = typeElement; + this.context = context; + this.introspector = introspector; + } + + @SuppressWarnings("unchecked") + @Override + public PojoRawTypeIdentifier typeIdentifier() { + if ( typeElement.getKind() == ElementKind.ENUM ) { + return PojoRawTypeIdentifier.of( (Class) EnumStub.class, typeElement.getQualifiedName().toString() ); + } + return PojoRawTypeIdentifier.of( (Class) TypeElement.class, typeElement.getQualifiedName().toString() ); + } + + // TODO: see `isSubTypeOf` if we can remove this dummy enum + private enum EnumStub { + } + + @Override + public boolean isAbstract() { + return typeElement.getModifiers().contains( Modifier.ABSTRACT ); + } + + @Override + public boolean isSubTypeOf(MappableTypeModel otherModel) { + TypeElement otherTypeElement; + if ( otherModel instanceof ProcessorPojoRawTypeModel other ) { + otherTypeElement = other.typeElement; + } + else { + otherTypeElement = context.elementUtils().getTypeElement( otherModel.name() ); + } + //TODO handle enums differently here, doesn't look like it treats SomeEnum as subtype of Enum. + return otherTypeElement != null + && ( context.typeUtils().isSameType( otherTypeElement.asType(), typeElement.asType() ) + || context.typeUtils().isSubtype( typeElement.asType(), otherTypeElement.asType() ) ); + } + + @SuppressWarnings("unchecked") + @Override + public Stream> ascendingSuperTypes() { + return introspector.typeOrdering().ascendingSuperTypes( typeElement ) + .map( e -> (PojoRawTypeModel) introspector.typeModel( e ) ); + } + + @SuppressWarnings("unchecked") + @Override + public Stream> descendingSuperTypes() { + return introspector.typeOrdering().descendingSuperTypes( typeElement ) + .map( e -> (PojoRawTypeModel) introspector.typeModel( e ) ); + } + + @Override + public Stream annotations() { + throw new UnsupportedOperationException(); + } + + @Override + public PojoConstructorModel mainConstructor() { + throw new UnsupportedOperationException(); + } + + @Override + public PojoConstructorModel constructor(Class... parameterTypes) { + throw new UnsupportedOperationException(); + } + + @Override + public Collection> declaredConstructors() { + throw new UnsupportedOperationException(); + } + + @Override + public Collection> declaredProperties() { + return propertyElements( context.elementUtils(), typeElement ) + .map( this::propertyModel ) + .collect( Collectors.toList() ); + } + + @SuppressWarnings("unchecked") + @Override + public PojoTypeModel cast(PojoTypeModel other) { + return (PojoTypeModel) other; + } + + @SuppressWarnings("unchecked") + @Override + public PojoCaster caster() { + return (PojoCaster) ProcessorPojoCaster.INSTANCE; + } + + @Override + public String name() { + return typeElement.getQualifiedName().toString(); + } + + @Override + public PojoPropertyModel property(String propertyName) { + return propertyElements( context.elementUtils(), typeElement ) + .filter( element -> propertyName.equals( propertyName( element ) ) ) + .map( this::propertyModel ) + .findAny() + .orElse( null ); + } + + private ProcessorPojoPropertyModel propertyModel(Element element) { + String propertyName = propertyName( element ); + if ( element.getKind() == ElementKind.FIELD ) { + return propertyModels.computeIfAbsent( propertyName, + k -> new ProcessorPojoPropertyModel<>( (VariableElement) element, propertyName, context, introspector ) ); + } + if ( element.getKind() == ElementKind.METHOD ) { + return propertyModels.computeIfAbsent( propertyName, + k -> new ProcessorPojoPropertyModel<>( (ExecutableElement) element, propertyName, context, introspector ) ); + } + throw new IllegalArgumentException( "Unsupported element kind: " + element.getKind() ); + } + + private static String propertyName(Element element) { + if ( element.getKind() == ElementKind.FIELD ) { + return element.getSimpleName().toString(); + } + if ( element.getKind() == ElementKind.METHOD ) { + return noPrefix( element.getSimpleName().toString() ); + } + throw new IllegalArgumentException( "Unsupported element kind: " + element.getKind() ); + } + + @Override + public Optional> castTo(Class target) { + return Optional.empty(); + } + + @Override + public Optional> typeArgument(Class rawSuperType, int typeParameterIndex) { + if ( typeMirror == null ) { + return Optional.empty(); + } + + TypeElement rawSuperElement = context.elementUtils().getTypeElement( rawSuperType.getName() ); + if ( rawSuperElement == null ) { + return Optional.empty(); + } + + return Optional.ofNullable( + typeArgument( typeMirror, context.typeUtils().erasure( rawSuperElement.asType() ), typeParameterIndex ) ) + .map( introspector::typeModel ); + } + + private TypeMirror typeArgument(TypeMirror current, TypeMirror rawSuperType, int typeParameterIndex) { + if ( current == null || current.getKind() == TypeKind.NONE ) { + return null; + } + if ( current instanceof DeclaredType declaredType ) { + if ( context.typeUtils().isSameType( context.typeUtils().erasure( current ), rawSuperType ) ) { + return declaredType.getTypeArguments().get( typeParameterIndex ); + } + + TypeElement element = (TypeElement) declaredType.asElement(); + for ( TypeMirror mirror : element.getInterfaces() ) { + TypeMirror argument = typeArgument( mirror, rawSuperType, typeParameterIndex ); + if ( argument != null ) { + Name name = context.typeUtils().asElement( argument ).getSimpleName(); + for ( int i = 0; i < element.getTypeParameters().size(); i++ ) { + if ( element.getTypeParameters().get( i ).getSimpleName().equals( name ) ) { + return declaredType.getTypeArguments().get( i ); + } + } + return argument; + } + } + } + return null; + } + + @Override + public Optional> arrayElementType() { + return Optional.empty(); + } + + private static class ProcessorPojoCaster implements PojoCaster { + + static ProcessorPojoCaster INSTANCE = new ProcessorPojoCaster<>(); + + @Override + public T cast(Object object) { + throw new UnsupportedOperationException(); + } + + @Override + public T castOrNull(Object object) { + throw new UnsupportedOperationException(); + } + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorTypeOrdering.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorTypeOrdering.java new file mode 100644 index 00000000000..9a9e0bfc858 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorTypeOrdering.java @@ -0,0 +1,32 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model.impl; + +import java.util.stream.Stream; + +import javax.lang.model.element.TypeElement; + +import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; +import org.hibernate.search.util.common.reflect.spi.AbstractTypeOrdering; + +public class ProcessorTypeOrdering extends AbstractTypeOrdering { + + private final HibernateSearchMetamodelProcessorContext context; + + public ProcessorTypeOrdering(HibernateSearchMetamodelProcessorContext context) { + this.context = context; + } + + @Override + protected TypeElement superClass(TypeElement subType) { + return (TypeElement) context.typeUtils().asElement( subType.getSuperclass() ); + } + + @Override + protected Stream declaredInterfaces(TypeElement subType) { + return subType.getInterfaces().stream() + .map( m -> (TypeElement) context.typeUtils().asElement( m ) ); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/package-info.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/package-info.java new file mode 100644 index 00000000000..5032ffd4ad1 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/package-info.java @@ -0,0 +1 @@ +package org.hibernate.search.metamodel.processor; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ClassProperty.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ClassProperty.java new file mode 100644 index 00000000000..2bcb2ced99b --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ClassProperty.java @@ -0,0 +1,27 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.writer.impl; + +import java.util.Locale; + +public record ClassProperty(String type, String name) implements Comparable { + + public String asParameter() { + return type + " " + name; + } + + public String asSetInConstructor() { + return "this." + name + " = " + name; + } + + public String asGetter() { + return String.format( Locale.ROOT, "public %s %s() { return this.%s; }", type, name, name ); + } + + @Override + public int compareTo(ClassProperty o) { + return name.compareTo( o.name ); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java new file mode 100644 index 00000000000..67baafe5b07 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java @@ -0,0 +1,314 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.writer.impl; + +import java.util.Collection; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.hibernate.search.engine.backend.metamodel.IndexFieldDescriptor; +import org.hibernate.search.engine.backend.metamodel.IndexObjectFieldDescriptor; +import org.hibernate.search.engine.backend.metamodel.IndexValueFieldDescriptor; +import org.hibernate.search.engine.backend.metamodel.IndexValueFieldTypeDescriptor; +import org.hibernate.search.engine.backend.types.converter.spi.DslConverter; +import org.hibernate.search.engine.backend.types.converter.spi.ProjectionConverter; +import org.hibernate.search.engine.search.common.spi.SearchIndexValueFieldTypeContext; +import org.hibernate.search.mapper.pojo.bridge.runtime.impl.PojoValueBridgeDocumentValueConverter; +import org.hibernate.search.metamodel.processor.annotation.processing.impl.AbstractProcessorFieldAnnotationProcessor; + +public class MetamodelClassWriter { + + public static class Builder { + private final TraitReferenceMapping traitReferenceMapping; + private final Map valueFieldReferenceDetails; + private final MetamodelNamesFormatter metamodelNamesFormatter; + + private final String packageName; + private final String className; + private final String scopeTypeName; + private final TreeSet regularProperties; + private final TreeSet objectProperties; + private final int depth; + + public Builder(MetamodelNamesFormatter metamodelNamesFormatter, String packageName, String className) { + this( metamodelNamesFormatter, packageName, className, metamodelClassName( metamodelNamesFormatter, className ), + TraitReferenceMapping.instance(), new TreeMap<>(), 1 ); + } + + private Builder(MetamodelNamesFormatter metamodelNamesFormatter, String packageName, String className, + String scopeTypeName, TraitReferenceMapping traitReferenceMapping, + Map valueFieldReferenceDetails, int depth) { + this.traitReferenceMapping = traitReferenceMapping; + this.valueFieldReferenceDetails = valueFieldReferenceDetails; + this.metamodelNamesFormatter = metamodelNamesFormatter; + + this.packageName = packageName; + this.className = className; + this.scopeTypeName = scopeTypeName; + this.regularProperties = new TreeSet<>(); + this.objectProperties = new TreeSet<>(); + this.depth = depth; + } + + public void addProperty(IndexValueFieldDescriptor valueField) { + IndexValueFieldTypeDescriptor type = valueField.type(); + if ( type instanceof SearchIndexValueFieldTypeContext context ) { + regularProperties.add( new RegularProperty( + valueField.relativeName(), + valueField.absolutePath(), + typeFromDslConverter( context.mappingDslConverter() ), + typeFromProjectionConverter( context.mappingProjectionConverter() ), + typeFromDslConverter( context.indexDslConverter() ), + typeFromDslConverter( context.rawDslConverter() ), + fromTraits( type.traits() ) + ) ); + } + else { + // TODO log message + } + } + + private String typeFromDslConverter(DslConverter converter) { + return typeFromConverter( converter.delegate(), converter.valueType() ); + } + + private String typeFromProjectionConverter(ProjectionConverter converter) { + return typeFromConverter( converter.delegate(), converter.valueType() ); + } + + private String typeFromConverter(Object delegate, Class valueType) { + if ( delegate instanceof PojoValueBridgeDocumentValueConverter pvbdc + && pvbdc.bridge() instanceof AbstractProcessorFieldAnnotationProcessor.ProcessorEnumValueBridge bridge ) { + return bridge.valueType().toString(); + } + return typeToString( valueType ); + } + + public void addProperty(IndexObjectFieldDescriptor objectField) { + String name = objectField.relativeName(); + Builder builder = new Builder( metamodelNamesFormatter, "", metamodelClassName() + name, scopeTypeName, + traitReferenceMapping, valueFieldReferenceDetails, depth + 1 ); + objectProperties.add( new ObjectField( name, objectField.absolutePath(), objectField.type().nested(), builder ) ); + + for ( IndexFieldDescriptor child : objectField.staticChildren() ) { + if ( child.isValueField() ) { + builder.addProperty( child.toValueField() ); + } + else { + builder.addProperty( child.toObjectField() ); + } + } + } + + // todo: remove this once types are correctly collected from type elements instead: + private String typeToString(Class type) { + if ( type.isArray() ) { + return type.getComponentType().getName() + "[]"; + } + else { + return type.getName(); + } + } + + private ValueFieldReferenceDetails fromTraits(Collection traits) { + Set details = new TreeSet<>(); + for ( String trait : traits ) { + details.add( traitReferenceMapping.reference( trait ) ); + } + String key = details.stream().map( TraitReferenceDetails::implementationLabel ).collect( Collectors.joining() ); + + return valueFieldReferenceDetails.computeIfAbsent( key, k -> createValueFieldReferenceDetails( details ) ); + } + + private ValueFieldReferenceDetails createValueFieldReferenceDetails(Set details) { + return new ValueFieldReferenceDetails( TypedFieldReferenceDetails.of( details ) ); + } + + public String formatted() { + String metamodelClassName = metamodelClassName(); + return String.format( Locale.ROOT, + """ + %s + @javax.annotation.processing.Generated(value = "org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor") + public final class %s implements + org.hibernate.search.engine.search.reference.RootReferenceScope<%s, %s> { + + public static final %s %s = new %s(); + + public final %s; + + private %s() { + // simple value field references: + %s + // various object field references: + %s + } + + @Override + public Class<%s> rootReferenceType() { + return %s.class; + } + + %s + + %s + } + """, + packageName.isEmpty() ? "" : "package " + packageName + ";\n", + metamodelClassName, + metamodelClassName, + className, + metamodelClassName, + metamodelNamesFormatter.formatIndexFieldName( metamodelClassName ), + metamodelClassName, + Stream.concat( + regularProperties.stream().map( p -> p.asProperty( metamodelClassName ) ), + objectProperties.stream().map( p -> p.asProperty( metamodelClassName ) ) ) + .collect( Collectors.joining( ";\n\tpublic final " ) ), + metamodelClassName, + regularProperties.stream().map( p -> p.asSetInConstructor( metamodelClassName ) ) + .collect( Collectors.joining( "\n\t\t" ) ), + objectProperties.stream().map( p -> p.asSetInConstructor( metamodelClassName ) ) + .collect( Collectors.joining( "\n\t\t" ) ), + metamodelClassName, + metamodelClassName, + valueFieldReferenceDetails.values().stream() + .map( ValueFieldReferenceDetails::formattedWithTypedField ) + .collect( Collectors.joining( "\n\n" ) ) + .replaceAll( "(?m)^", indent() ), + objectProperties.stream() + .map( f -> f.formatted( scopeTypeName ) ) + .collect( Collectors.joining( "\n\n" ) ) + .replaceAll( "(?m)^", indent() ) + ); + } + + private String indent() { + return "\t".repeat( depth ); + } + + public String metamodelClassName() { + return metamodelClassName( metamodelNamesFormatter, className ); + } + + private static String metamodelClassName(MetamodelNamesFormatter metamodelNamesFormatter, String className) { + String classSimpleName; + if ( className.contains( "." ) ) { + classSimpleName = className.substring( className.lastIndexOf( "." ) + 1 ); + } + else { + classSimpleName = className; + } + return metamodelNamesFormatter.formatMetamodelClassName( classSimpleName ); + } + + public CharSequence fqcn() { + return packageName.isEmpty() ? metamodelClassName() : packageName + "." + metamodelClassName(); + } + } + + private record RegularProperty( String name, + String path, + String inputType, + String outputType, + String indexType, + String rawType, + ValueFieldReferenceDetails valueFieldReference) + implements Comparable { + + @Override + public int compareTo(RegularProperty o) { + return name.compareTo( o.name ); + } + + public String asProperty(String scopeType) { + return valueFieldReference().asType( scopeType, inputType, outputType, indexType, rawType ) + " " + name; + } + + public String asSetInConstructor(String scopeType) { + return "this." + name + " = " + + valueFieldReference.constructorCall( path, scopeType, inputType, outputType, indexType, rawType ); + } + } + + private record ObjectField(String name, String path, boolean nested, Builder builder) implements Comparable { + public String asProperty(String scopeType) { + return builder.metamodelClassName() + " " + name; + } + + public String asSetInConstructor(String scopeType) { + return "this." + name + " = new " + builder.metamodelClassName() + "();"; + } + + public String formatted(String scopeType) { + String metamodelClassName = builder.metamodelClassName(); + return String.format( Locale.ROOT, """ + public static class %s implements %s<%s> { + + public final %s; + + private %s() { + // simple value field references: + %s + // various object field references: + %s + } + + @Override + public String absolutePath() { + return "%s"; + } + + @Override + public Class<%s> scopeRootType() { + return %s.class; + } + + %s + } + """, + metamodelClassName, + objectReferenceClass(), + scopeType, + Stream.concat( + builder.regularProperties.stream().map( p -> p.asProperty( scopeType ) ), + builder.objectProperties.stream().map( p -> p.asProperty( scopeType ) ) ) + .collect( Collectors.joining( ";\n\tpublic final " ) ), + metamodelClassName, + builder.regularProperties.stream().map( p -> p.asSetInConstructor( scopeType ) ) + .collect( Collectors.joining( "\n\t\t" ) ), + builder.objectProperties.stream().map( p -> p.asSetInConstructor( scopeType ) ) + .collect( Collectors.joining( "\n\t\t" ) ), + path, + scopeType, + scopeType, + builder.objectProperties.stream() + .map( f -> f.formatted( builder.scopeTypeName ) ) + .collect( Collectors.joining( "\n\n" ) ) + .replaceAll( "(?m)^", "\t" ) + ); + } + + private String objectReferenceClass() { + if ( nested ) { + return "org.hibernate.search.engine.search.reference.object.NestedFieldReference"; + } + else { + return "org.hibernate.search.engine.search.reference.object.FlattenedFieldReference"; + } + } + + @Override + public int compareTo(ObjectField o) { + return name.compareTo( o.name ); + } + } + +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelNamesFormatter.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelNamesFormatter.java new file mode 100644 index 00000000000..668c545f191 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelNamesFormatter.java @@ -0,0 +1,20 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.writer.impl; + +import java.util.Locale; + +/** + * Defines how a metamodel class name is constructed from the encountered class/property. + */ +public interface MetamodelNamesFormatter { + MetamodelNamesFormatter DEFAULT = v -> String.format( Locale.ROOT, "%s__", v ); + + String formatMetamodelClassName(String className); + + default String formatIndexFieldName(String metamodelClassName) { + return "INDEX"; + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitKind.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitKind.java new file mode 100644 index 00000000000..c38187b9918 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitKind.java @@ -0,0 +1,34 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.writer.impl; + +public enum TraitKind { + + UNTYPED( false, false, false ), + TYPED_INPUT( true, true, false ), + TYPED_OUTPUT( true, false, true ); + + private final boolean requiresValueModel; + private final boolean requiresInputType; + private final boolean requiresOutputType; + + TraitKind(boolean requiresValueModel, boolean requiresInputType, boolean requiresOutputType) { + this.requiresValueModel = requiresValueModel; + this.requiresInputType = requiresInputType; + this.requiresOutputType = requiresOutputType; + } + + public boolean requiresValueModel() { + return requiresValueModel; + } + + public boolean requiresInputType() { + return requiresInputType; + } + + public boolean requiresOutputType() { + return requiresOutputType; + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetails.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetails.java new file mode 100644 index 00000000000..c3bfff1921f --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetails.java @@ -0,0 +1,54 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.writer.impl; + +import java.util.Optional; + +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating +public record TraitReferenceDetails(Class referenceClass, String implementationLabel, TraitKind traitKind, + String extraPropertyName) + implements Comparable { + + public TraitReferenceDetails(Class referenceClass, String implementationLabel, TraitKind traitKind) { + this( referenceClass, implementationLabel, traitKind, null ); + } + + public String asString(String input, String output) { + StringBuilder result = new StringBuilder( referenceClass().getName() ); + result.append( "" ); + return result.toString(); + } + + public Optional formatExtraProperty(String input, String output) { + if ( extraPropertyName == null ) { + return Optional.empty(); + } + StringBuilder result = new StringBuilder( "Class<" ); + if ( traitKind().requiresInputType() ) { + result.append( input ); + } + if ( traitKind().requiresOutputType() ) { + result.append( output ); + } + result.append( ">" ); + return Optional.of( new ClassProperty( result.toString(), extraPropertyName() ) ); + } + + @Override + public int compareTo(TraitReferenceDetails o) { + return implementationLabel().compareTo( o.implementationLabel() ); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java new file mode 100644 index 00000000000..7fe70c8ae24 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java @@ -0,0 +1,128 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.writer.impl; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.search.engine.backend.types.IndexFieldTraits; +import org.hibernate.search.engine.search.reference.aggregation.AvgAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.CountAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.CountDistinctAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.MinAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.RangeAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.SumAggregationFieldReference; +import org.hibernate.search.engine.search.reference.aggregation.TermsAggregationFieldReference; +import org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.KnnPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.NestedPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.SpatialWithinBoundingBoxPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.SpatialWithinCirclePredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.SpatialWithinPolygonPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference; +import org.hibernate.search.engine.search.reference.projection.DistanceProjectionFieldReference; +import org.hibernate.search.engine.search.reference.projection.FieldProjectionFieldReference; +import org.hibernate.search.engine.search.reference.projection.HighlightProjectionFieldReference; +import org.hibernate.search.engine.search.reference.projection.ObjectProjectionFieldReference; +import org.hibernate.search.engine.search.reference.sort.DistanceSortFieldReference; +import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; + +public class TraitReferenceMapping { + private final Map traits; + + private TraitReferenceMapping() { + Map traits = new HashMap<>( backendSpecificTraits() ); + + traits.put( IndexFieldTraits.Predicates.EXISTS, + new TraitReferenceDetails( ExistsPredicateFieldReference.class, "P0", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Predicates.KNN, + new TraitReferenceDetails( KnnPredicateFieldReference.class, "P1", TraitKind.TYPED_INPUT, "predicateType" ) ); + traits.put( IndexFieldTraits.Predicates.MATCH, + new TraitReferenceDetails( MatchPredicateFieldReference.class, "P2", TraitKind.TYPED_INPUT, "predicateType" ) ); + traits.put( IndexFieldTraits.Predicates.NESTED, + new TraitReferenceDetails( NestedPredicateFieldReference.class, "P3", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Predicates.PHRASE, new TraitReferenceDetails( PhrasePredicateFieldReference.class, "P4", + TraitKind.TYPED_INPUT, "predicateType" ) ); + traits.put( IndexFieldTraits.Predicates.PREFIX, + new TraitReferenceDetails( PrefixPredicateFieldReference.class, "P5", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Predicates.RANGE, + new TraitReferenceDetails( RangePredicateFieldReference.class, "P6", TraitKind.TYPED_INPUT, "predicateType" ) ); + traits.put( IndexFieldTraits.Predicates.QUERY_STRING, new TraitReferenceDetails( + QueryStringPredicateFieldReference.class, "P7", TraitKind.TYPED_INPUT, "predicateType" ) ); + traits.put( IndexFieldTraits.Predicates.REGEXP, + new TraitReferenceDetails( RegexpPredicateFieldReference.class, "P8", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Predicates.SIMPLE_QUERY_STRING, new TraitReferenceDetails( + SimpleQueryStringPredicateFieldReference.class, "P9", TraitKind.TYPED_INPUT, "predicateType" ) ); + traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_BOUNDING_BOX, new TraitReferenceDetails( + SpatialWithinBoundingBoxPredicateFieldReference.class, "P10", TraitKind.TYPED_INPUT, "predicateType" ) ); + traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_CIRCLE, new TraitReferenceDetails( + SpatialWithinCirclePredicateFieldReference.class, "P11", TraitKind.TYPED_INPUT, "predicateType" ) ); + traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_POLYGON, new TraitReferenceDetails( + SpatialWithinPolygonPredicateFieldReference.class, "P12", TraitKind.TYPED_INPUT, "predicateType" ) ); + traits.put( IndexFieldTraits.Predicates.TERMS, + new TraitReferenceDetails( TermsPredicateFieldReference.class, "P13", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Predicates.WILDCARD, + new TraitReferenceDetails( WildcardPredicateFieldReference.class, "P14", TraitKind.UNTYPED ) ); + + traits.put( IndexFieldTraits.Sorts.DISTANCE, + new TraitReferenceDetails( DistanceSortFieldReference.class, "S0", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Sorts.FIELD, + new TraitReferenceDetails( FieldSortFieldReference.class, "S1", TraitKind.TYPED_INPUT, "sortType" ) ); + + + traits.put( IndexFieldTraits.Projections.DISTANCE, + new TraitReferenceDetails( DistanceProjectionFieldReference.class, "R0", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Projections.FIELD, new TraitReferenceDetails( FieldProjectionFieldReference.class, "R1", + TraitKind.TYPED_OUTPUT, "projectionType" ) ); + traits.put( IndexFieldTraits.Projections.HIGHLIGHT, + new TraitReferenceDetails( HighlightProjectionFieldReference.class, "R2", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Projections.OBJECT, + new TraitReferenceDetails( ObjectProjectionFieldReference.class, "R3", TraitKind.UNTYPED ) ); + + // TODO, can we really use output for the range agg ? + // if not we should probably consider having different agg types, one that match inputs and other oputputs with different .aggregationType() in them. + traits.put( IndexFieldTraits.Aggregations.RANGE, new TraitReferenceDetails( RangeAggregationFieldReference.class, "A0", + TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + traits.put( IndexFieldTraits.Aggregations.TERMS, new TraitReferenceDetails( TermsAggregationFieldReference.class, "A1", + TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + traits.put( IndexFieldTraits.Aggregations.SUM, new TraitReferenceDetails( SumAggregationFieldReference.class, "A2", + TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + traits.put( IndexFieldTraits.Aggregations.MIN, new TraitReferenceDetails( MinAggregationFieldReference.class, "A3", + TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + traits.put( IndexFieldTraits.Aggregations.MAX, new TraitReferenceDetails( MaxAggregationFieldReference.class, "A4", + TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + traits.put( IndexFieldTraits.Aggregations.COUNT, + new TraitReferenceDetails( CountAggregationFieldReference.class, "A5", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Aggregations.COUNT_DISTINCT, + new TraitReferenceDetails( CountDistinctAggregationFieldReference.class, "A6", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Aggregations.AVG, new TraitReferenceDetails( AvgAggregationFieldReference.class, "A7", + TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + + this.traits = Collections.unmodifiableMap( traits ); + } + + protected Map backendSpecificTraits() { + return Map.of(); + } + + public static TraitReferenceMapping instance() { + return new TraitReferenceMapping(); + } + + public TraitReferenceDetails reference(String traitName) { + return traits.get( traitName ); + } + +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TypedFieldReferenceDetails.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TypedFieldReferenceDetails.java new file mode 100644 index 00000000000..ab58ee7e6bc --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TypedFieldReferenceDetails.java @@ -0,0 +1,135 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.writer.impl; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import java.util.TreeSet; + +import org.hibernate.search.engine.search.common.ValueModel; + +public record TypedFieldReferenceDetails( String name, String identifier, Collection typeVariables, + List properties, Collection implementedInterfaces) { + public static TypedFieldReferenceDetails of(Collection traits) { + StringBuilder name = new StringBuilder(); + Set typeVariables = new LinkedHashSet<>(); + List implementedInterfaces = new ArrayList<>(); + Set properties = new LinkedHashSet<>(); + Set extraProperties = new TreeSet<>(); + + properties.add( new ClassProperty( "java.lang.String", "absolutePath" ) ); + properties.add( new ClassProperty( "java.lang.Class", "scopeRootType" ) ); + + typeVariables.add( "SR" ); + boolean requiresValueModel = false; + boolean requiresInputType = false; + boolean requiresOutputType = false; + for ( TraitReferenceDetails trait : traits ) { + name.append( trait.implementationLabel() ); + implementedInterfaces.add( trait.asString( "I", "O" ) ); + requiresValueModel = requiresValueModel || trait.traitKind().requiresValueModel(); + requiresInputType = requiresInputType || trait.traitKind().requiresInputType(); + requiresOutputType = requiresOutputType || trait.traitKind().requiresOutputType(); + trait.formatExtraProperty( "I", "O" ).ifPresent( extraProperties::add ); + } + if ( requiresValueModel ) { + properties.add( new ClassProperty( ValueModel.class.getName(), "valueModel" ) ); + } + if ( requiresInputType ) { + typeVariables.add( "I" ); + } + if ( requiresOutputType ) { + typeVariables.add( "O" ); + } + List allProperties = new ArrayList<>( properties ); + allProperties.addAll( extraProperties ); + + String formattedName = name.toString(); + return new TypedFieldReferenceDetails( + "TypedFieldReference" + formattedName, + formattedName, typeVariables, allProperties, + implementedInterfaces ); + } + + public String constructorCall(String valueModel, String input, String output) { + StringBuilder result = new StringBuilder( "new " ); + result.append( name() ); + result.append( "<>" ); + constructorCall( result, valueModel, input, output ); + result.append( ";" ); + + return result.toString(); + } + + public String constructorSuperCall(String valueModel, String input, String output) { + StringBuilder result = new StringBuilder( "super" ); + constructorCall( result, valueModel, input, output ); + result.append( ";" ); + + return result.toString(); + } + + public String asType(String input, String output) { + StringBuilder result = new StringBuilder( name() ); + result.append( "" ); + return result.toString(); + } + + private void constructorCall(StringBuilder result, String valueModel, String input, String output) { + result.append( "(absolutePath, scopeRootType" ); + if ( properties().size() > 2 ) { + result.append( ", " ) + .append( valueModel ); + } + for ( int i = 3; i < properties().size(); i++ ) { + ClassProperty prop = properties().get( i ); + if ( prop.type().contains( "" ) ) { + result.append( ", " ) + .append( input ); + } + if ( prop.type().contains( "" ) ) { + result.append( ", " ) + .append( output ); + } + } + result.append( ")" ); + } + + public String formatted() { + return String.format( Locale.ROOT, """ + public static class %s<%s> implements %s { + + private final %s; + + public %s( + %s) { + %s; + } + + %s + } + """, + name, + String.join( ", ", typeVariables ), + String.join( ",\n\t", implementedInterfaces ), + String.join( ";\n\tprivate final ", properties.stream().map( ClassProperty::asParameter ).toList() ), + name, + String.join( ",\n\t\t", properties.stream().map( ClassProperty::asParameter ).toList() ), + String.join( ";\n\t\t", properties.stream().map( ClassProperty::asSetInConstructor ).toList() ), + String.join( "\n\t", properties.stream().map( ClassProperty::asGetter ).toList() ) + ); + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java new file mode 100644 index 00000000000..9624fa59d38 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java @@ -0,0 +1,92 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.writer.impl; + +import java.util.Locale; + +public record ValueFieldReferenceDetails(TypedFieldReferenceDetails typedField) { + + public String formatted() { + // I - dsl type (input) ValueModel.MAPPING + // O - projection type (output) ValueModel.MAPPING + // T - index type, i.e. no converters applied i.e. ValueModel.INDEX + // R - raw type. i.e. ValueModel.RAW + String name = name(); + typedField.asType( "I", "O" ); + String typeIndex = typedField.asType( "T", "T" ); + String typeRaw = typedField.asType( "R", "R" ); + String typeString = typedField.asType( "java.lang.String", "java.lang.String" ); + return String.format( Locale.ROOT, """ + public static class %s extends %s { + + private final %s mapping; + private final %s raw; + private final %s string; + + public %s( + String absolutePath, + Class scopeRootType, + Class inputType, + Class outputType, + Class indexType, + Class rawType + ) { + %s + this.mapping = %s + this.raw = %s + this.string = %s + } + + public %s mapping() { + return mapping; + } + + public %s raw() { + return raw; + } + + public %s string() { + return string; + } + + } + """, + name, + typedField.asType( "I", "O" ), + typeIndex, + typeRaw, + typeString, + name, + typedField.constructorSuperCall( "org.hibernate.search.engine.search.common.ValueModel.MAPPING", "inputType", + "outputType" ), + typedField.constructorCall( "org.hibernate.search.engine.search.common.ValueModel.INDEX", "indexType", + "indexType" ), + typedField.constructorCall( "org.hibernate.search.engine.search.common.ValueModel.RAW", "rawType", "rawType" ), + typedField.constructorCall( "org.hibernate.search.engine.search.common.ValueModel.STRING", + "java.lang.String.class", "java.lang.String.class" ), + typeIndex, + typeRaw, + typeString + ); + } + + public String formattedWithTypedField() { + return formatted() + "\n" + typedField.formatted(); + } + + private String name() { + return "ValueFieldReference" + typedField.identifier(); + } + + public String asType(String scopeType, String inputType, String outputType, String indexType, String rawType) { + return name() + "<" + scopeType + ", " + inputType + ", " + outputType + ", " + indexType + ", " + rawType + ">"; + } + + public String constructorCall(String name, String scopeType, String inputType, String outputType, String indexType, + String rawType) { + return "new " + name() + "<>(\"" + name + "\", " + scopeType + ".class, " + inputType + ".class, " + outputType + + ".class, " + indexType + ".class, " + rawType + ".class);"; + } +} diff --git a/metamodel/metamodel-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/metamodel/metamodel-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 00000000000..ef14b4886c1 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1 @@ +org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/CombineTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/CombineTest.java new file mode 100644 index 00000000000..ec215527b3c --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/CombineTest.java @@ -0,0 +1,33 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor; + +import java.util.List; + +import org.hibernate.search.engine.backend.types.IndexFieldTraits; +import org.hibernate.search.metamodel.processor.writer.impl.TraitReferenceDetails; +import org.hibernate.search.metamodel.processor.writer.impl.TraitReferenceMapping; +import org.hibernate.search.metamodel.processor.writer.impl.TypedFieldReferenceDetails; +import org.hibernate.search.metamodel.processor.writer.impl.ValueFieldReferenceDetails; + +import org.junit.jupiter.api.Test; + +public class CombineTest { + + @Test + void name() { + TraitReferenceMapping instance = TraitReferenceMapping.instance(); + + TraitReferenceDetails match = instance.reference( IndexFieldTraits.Predicates.MATCH ); + //TraitReferenceDetails field = instance.reference( IndexFieldTraits.Projections.FIELD ); + + TypedFieldReferenceDetails details = TypedFieldReferenceDetails.of( List.of( match ) ); + System.err.println( details.formatted() ); + System.err.println( details.constructorCall( "valueModel", "in", "out" ) ); + + System.err.println( new ValueFieldReferenceDetails( details ).formatted() ); + } + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java new file mode 100644 index 00000000000..49c6d4193b9 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java @@ -0,0 +1,121 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor; + +import static org.assertj.core.api.Assertions.fail; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.Set; + +import javax.annotation.processing.Processor; +import javax.tools.DiagnosticCollector; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; +import javax.tools.ToolProvider; + +import org.hibernate.search.metamodel.processor.model.ISBN; +import org.hibernate.search.metamodel.processor.model.MyEmbeddedEntity; +import org.hibernate.search.metamodel.processor.model.MyEnum; +import org.hibernate.search.metamodel.processor.model.MyIndexedEntity; +import org.hibernate.search.metamodel.processor.model.SomeGenerics; +import org.hibernate.search.metamodel.processor.model.SomeRandomType; +import org.hibernate.search.metamodel.processor.model.SomeRandomTypeBinder; + +import org.junit.jupiter.api.Test; + +class HibernateSearchMetamodelProcessorTest { + + private static final Path BASE_DIR; + private static final Path TARGET_DIR; + private static final Path PROCESSOR_OUT_DIR; + + static { + TARGET_DIR = getTargetDir(); + BASE_DIR = TARGET_DIR.getParent(); + PROCESSOR_OUT_DIR = TARGET_DIR.resolve( "processor-generated-test-classes" ); + if ( !Files.exists( PROCESSOR_OUT_DIR ) ) { + try { + Files.createDirectories( PROCESSOR_OUT_DIR ); + } + catch (IOException e) { + fail( "Unable to create test output directory " + PROCESSOR_OUT_DIR ); + } + } + } + + @Test + void smoke() { + DiagnosticCollector diagnostics = new DiagnosticCollector<>(); + + compile( + new HibernateSearchMetamodelProcessor(), diagnostics, + getSourceFile( SomeGenerics.class ), + getSourceFile( MyIndexedEntity.class ), + getSourceFile( MyEmbeddedEntity.class ), + getSourceFile( SomeRandomType.class ), + getSourceFile( SomeRandomTypeBinder.class ), + getSourceFile( ISBN.class ), + getSourceFile( MyEnum.class ) + ); + + diagnostics.getDiagnostics().forEach( System.out::println ); + + } + + public boolean compile(Processor annotationProcessor, DiagnosticCollector diagnostics, + File... sourceFiles) { + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + + StandardJavaFileManager fileManager = compiler.getStandardFileManager( null, null, null ); + Iterable compilationUnits = fileManager.getJavaFileObjects( sourceFiles ); + + try { + fileManager.setLocation( StandardLocation.CLASS_PATH, dependencies() ); + fileManager.setLocation( StandardLocation.CLASS_OUTPUT, List.of( PROCESSOR_OUT_DIR.toFile() ) ); + } + catch (IOException e) { + throw new RuntimeException( e ); + } + + List options = List.of(); + + JavaCompiler.CompilationTask task = compiler.getTask( null, fileManager, diagnostics, options, null, compilationUnits ); + task.setProcessors( List.of( annotationProcessor ) ); + + return task.call(); + } + + private Iterable dependencies() { + return Set.of( + dependency( "hibernate-search-mapper-pojo-base.jar" ), + dependency( "hibernate-search-engine.jar" ) + ); + } + + private File dependency(String name) { + return TARGET_DIR.toAbsolutePath().resolve( "test-dependencies" ).resolve( name ).toFile(); + } + + public File getSourceFile(Class clazz) { + String sourceFileName = clazz.getName().replace( ".", File.separator ) + ".java"; + return BASE_DIR.toAbsolutePath().resolve( "src" ).resolve( "test" ).resolve( "java" ).resolve( sourceFileName ) + .toFile(); + } + + + private static Path getTargetDir() { + // target/test-classes + String targetClassesDir = HibernateSearchMetamodelProcessorTest.class.getProtectionDomain() + .getCodeSource().getLocation().getFile(); + return Path.of( targetClassesDir ).getParent(); + } + +} diff --git a/engine/src/test/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMappingTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/TraitReferenceMappingTest.java similarity index 53% rename from engine/src/test/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMappingTest.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/TraitReferenceMappingTest.java index 37956135c27..692e39c85fa 100644 --- a/engine/src/test/java/org/hibernate/search/engine/search/reference/spi/TraitReferenceMappingTest.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/TraitReferenceMappingTest.java @@ -1,7 +1,11 @@ -package org.hibernate.search.engine.search.reference.spi; +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.fail; +import static org.assertj.core.api.Assertions.fail; import java.lang.reflect.Field; import java.util.HashSet; @@ -9,6 +13,8 @@ import java.util.stream.Stream; import org.hibernate.search.engine.backend.types.IndexFieldTraits; +import org.hibernate.search.metamodel.processor.writer.impl.TraitReferenceDetails; +import org.hibernate.search.metamodel.processor.writer.impl.TraitReferenceMapping; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -18,9 +24,21 @@ class TraitReferenceMappingTest { @MethodSource("traitNames") @ParameterizedTest - void allTraitsPresent(String traitName) { - assertThat( TraitReferenceMapping.instance().reference( traitName ) ) - .isNotNull(); + void smoke(String traitName) { + TraitReferenceDetails reference = TraitReferenceMapping.instance().reference( traitName ); + assertThat( reference ).isNotNull(); + if ( reference.referenceClass().getTypeParameters().length > 1 ) { + assertThat( reference.traitKind().requiresValueModel() ).isTrue(); + assertThat( reference.traitKind().requiresInputType() + || reference.traitKind().requiresOutputType() ).isTrue(); + assertThat( reference.extraPropertyName() ).isNotNull(); + } + else { + assertThat( reference.traitKind().requiresValueModel() ).isFalse(); + assertThat( reference.traitKind().requiresInputType() ).isFalse(); + assertThat( reference.traitKind().requiresOutputType() ).isFalse(); + assertThat( reference.extraPropertyName() ).isNull(); + } } private static Stream traitNames() { diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/ISBN.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/ISBN.java new file mode 100644 index 00000000000..066b1ce0982 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/ISBN.java @@ -0,0 +1,8 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +public record ISBN(String code) { +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEmbeddedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEmbeddedEntity.java new file mode 100644 index 00000000000..db4cb617b8f --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEmbeddedEntity.java @@ -0,0 +1,18 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; + +public class MyEmbeddedEntity { + + @KeywordField + private String keyword; + + @IndexedEmbedded(includeDepth = 3, excludePaths = { "embedded" }) + private MyIndexedEntity child; + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnum.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnum.java new file mode 100644 index 00000000000..8de7866e4f0 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnum.java @@ -0,0 +1,12 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +public enum MyEnum { + A, + B, + C, + D +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java new file mode 100644 index 00000000000..a48896e86ed --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java @@ -0,0 +1,97 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import java.time.LocalDate; +import java.util.List; +import java.util.Set; + +import org.hibernate.search.engine.spatial.GeoPoint; +import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.GeoPointBinding; +import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.Latitude; +import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.Longitude; +import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.PropertyBinderRef; +import org.hibernate.search.mapper.pojo.extractor.builtin.BuiltinContainerExtractors; +import org.hibernate.search.mapper.pojo.extractor.mapping.annotation.ContainerExtraction; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.PropertyBinding; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; + +@Indexed +@GeoPointBinding(fieldName = "placeOfBirth", markerSet = "birth") +@GeoPointBinding(fieldName = "placeOfDeath", markerSet = "death") +public class MyIndexedEntity { + + @DocumentId + private String id; + + @GenericField + private LocalDate date; + + @KeywordField + private String keyword; + + @FullTextField + private String text; + + //@PropertyBinding(binder = @PropertyBinderRef(type = ISBNBinder.class)) + private ISBN isbn; + + @PropertyBinding(binder = @PropertyBinderRef(type = SomeRandomTypeBinder.class)) + private SomeRandomType someRandomType; + + @IndexedEmbedded + private MyEmbeddedEntity embedded; + + @KeywordField + private Set keywords; + + @FullTextField + private SomeGenerics.MyStringList fullTextFields; + + @FullTextField(extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_KEY)) + private SomeGenerics.MyStringStringMap mapKeys; + + @FullTextField(extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_VALUE)) + private SomeGenerics.MyStringStringMap mapValues; + + @GenericField(extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_VALUE)) + private SomeGenerics.MyStringKeyMap dateValues; + + @IndexedEmbedded + private List embeddedList; + + @VectorField(dimension = 15) + private byte[] bytes; + + @VectorField(dimension = 5) + private float[] floats; + + @Latitude(markerSet = "birth") + private Double placeOfBirthLatitude; + + @Longitude(markerSet = "birth") + private Double placeOfBirthLongitude; + + @Latitude(markerSet = "death") + private Double placeOfDeathLatitude; + + @Longitude(markerSet = "death") + private Double placeOfDeathLongitude; + + @KeywordField + private MyEnum myEnum; + + @GenericField + private GeoPoint point; + + private String someString; + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeGenerics.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeGenerics.java new file mode 100644 index 00000000000..fa78bed4754 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeGenerics.java @@ -0,0 +1,22 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import java.util.List; +import java.util.Map; + +public interface SomeGenerics { + + interface MyList extends List {} + + interface MyStringList extends MyList {} + + interface MyMap extends Map {} + + interface MyStringKeyMap extends MyMap {} + + interface MyStringStringMap extends MyStringKeyMap {} + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomType.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomType.java new file mode 100644 index 00000000000..72fd6c27429 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomType.java @@ -0,0 +1,12 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +public class SomeRandomType { + + private String string; + private int integer; + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomTypeBinder.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomTypeBinder.java new file mode 100644 index 00000000000..87c5672345e --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomTypeBinder.java @@ -0,0 +1,36 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.engine.backend.document.IndexFieldReference; +import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.bridge.mapping.programmatic.PropertyBinder; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; + +public class SomeRandomTypeBinder implements PropertyBinder { + + @FullTextField + IndexFieldReference stringSomeRandomTypeBinder; + + @GenericField + IndexFieldReference integerSomeRandomTypeBinder; + + @KeywordField + IndexFieldReference keywordSomeRandomTypeBinder; + + @VectorField(dimension = 15) + private IndexFieldReference bytesSomeRandomTypeBinder; + + @VectorField(dimension = 5) + private IndexFieldReference floatsSomeRandomTypeBinder; + + @Override + public void bind(PropertyBindingContext context) { + // we don't care much about binding here... only about the fields ^ + } +} diff --git a/pom.xml b/pom.xml index f938197e69d..b884efa63f9 100644 --- a/pom.xml +++ b/pom.xml @@ -188,6 +188,7 @@ integrationtest documentation lucene-next + metamodel/metamodel-processor diff --git a/util/common/src/main/java/org/hibernate/search/util/common/logging/impl/MessageConstants.java b/util/common/src/main/java/org/hibernate/search/util/common/logging/impl/MessageConstants.java index c64c7f2fd6f..d792c7a0a48 100644 --- a/util/common/src/main/java/org/hibernate/search/util/common/logging/impl/MessageConstants.java +++ b/util/common/src/main/java/org/hibernate/search/util/common/logging/impl/MessageConstants.java @@ -74,4 +74,7 @@ private MessageConstants() { public static final int UTIL_ID_RANGE_MIN = 900000; public static final int UTIL_ID_RANGE_MAX = 909999; + public static final int PROCESSOR_ID_RANGE_MIN = 1000000; + public static final int PROCESSOR_ID_RANGE_MAX = 1009999; + } From 0beccb86058b1606e34ebf684879321b33cf50e1 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Wed, 19 Mar 2025 10:43:53 +0100 Subject: [PATCH 15/25] HSEARCH-5300 Add integration tests modules for the metamodel processor --- build/parents/build/pom.xml | 5 + build/reports/pom.xml | 4 + integrationtest/metamodel/orm-lucene/pom.xml | 107 ++++++++++++ .../lucene/EntityAsTreeSmokeIT.java | 147 +++++++++++++++++ .../standalone-elasticsearch/pom.xml | 98 +++++++++++ .../lucene/EntityAsTreeSmokeIT.java | 156 ++++++++++++++++++ .../metamodel/standalone-lucene/pom.xml | 98 +++++++++++ .../lucene/EntityAsTreeSmokeIT.java | 156 ++++++++++++++++++ integrationtest/pom.xml | 3 + metamodel/metamodel-processor/pom.xml | 10 +- .../HibernateSearchMetamodelProcessor.java | 2 + ...ractProcessorFieldAnnotationProcessor.java | 6 +- ...xedEntityMetamodelAnnotationProcessor.java | 6 +- .../impl/ProcessorIntrospectorContext.java | 14 +- .../writer/impl/MetamodelClassWriter.java | 10 +- 15 files changed, 800 insertions(+), 22 deletions(-) create mode 100644 integrationtest/metamodel/orm-lucene/pom.xml create mode 100644 integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java create mode 100644 integrationtest/metamodel/standalone-elasticsearch/pom.xml create mode 100644 integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java create mode 100644 integrationtest/metamodel/standalone-lucene/pom.xml create mode 100644 integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java diff --git a/build/parents/build/pom.xml b/build/parents/build/pom.xml index cd8f310ef6f..165890a456f 100644 --- a/build/parents/build/pom.xml +++ b/build/parents/build/pom.xml @@ -716,6 +716,11 @@ hibernate-search-integrationtest-java-modules-pojo-standalone-lucene ${project.version} + + org.hibernate.search + hibernate-search-integrationtest-metamodel-standalone-lucene + ${project.version} + org.hibernate.search hibernate-search-integrationtest-backend-lucene-next diff --git a/build/reports/pom.xml b/build/reports/pom.xml index 0cb49c38f96..dba8ac66a8e 100644 --- a/build/reports/pom.xml +++ b/build/reports/pom.xml @@ -148,6 +148,10 @@ hibernate-search-integrationtest-mapper-orm-jakarta-batch test + + org.hibernate.search + hibernate-search-integrationtest-metamodel-standalone-lucene + org.hibernate.search hibernate-search-documentation diff --git a/integrationtest/metamodel/orm-lucene/pom.xml b/integrationtest/metamodel/orm-lucene/pom.xml new file mode 100644 index 00000000000..69f5156b730 --- /dev/null +++ b/integrationtest/metamodel/orm-lucene/pom.xml @@ -0,0 +1,107 @@ + + 4.0.0 + + org.hibernate.search + hibernate-search-integrationtest + 8.0.0-SNAPSHOT + ../.. + + hibernate-search-integrationtest-metamodel-orm-lucene + + Hibernate Search ITs - Metamodel - ORM mapper with the Lucene backend + Hibernate Search integration tests for metamodel generation with ORM mapper and the Lucene backend + + + + + + + org.hibernate.search + hibernate-search-mapper-orm + test + + + org.hibernate.search + hibernate-search-backend-lucene + test + + + org.hibernate.search + hibernate-search-util-internal-integrationtest-mapper-orm + test + + + org.hibernate.search + hibernate-search-util-internal-integrationtest-backend-lucene + test + + + + ${jdbc.driver.groupId} + ${jdbc.driver.artifactId} + test + + + org.hibernate.search + hibernate-search-metamodel-processor + provided + + + + + + + maven-compiler-plugin + ${version.compiler.plugin} + + + default-testCompile + + false + full + + org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor + + + + org.hibernate.search + hibernate-search-metamodel-processor + ${project.version} + + + org.hibernate.search + hibernate-search-backend-lucene + ${project.version} + + + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + it + + integration-test + verify + + + ${test.lucene.skip} + + lucene + + + + + + + + + diff --git a/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java new file mode 100644 index 00000000000..f37536b4b4c --- /dev/null +++ b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java @@ -0,0 +1,147 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.lucene; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Embeddable; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class EntityAsTreeSmokeIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new LuceneBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( ContainedNonEntity.class, IndexedEntity.class, ContainedEntity.class ) + .setup(); + } + + @Test + void indexAndSearch() { + IndexedEntity indexed1 = new IndexedEntity( "1", "some interesting text" ); + ContainedEntity containedEntity1_1 = new ContainedEntity( "1_1", "some contained entity text" ); + containedEntity1_1.containing = indexed1; + indexed1.containedEntities.add( containedEntity1_1 ); + ContainedNonEntity containedNonEntity1_1 = new ContainedNonEntity( "some contained nonentity text" ); + indexed1.containedNonEntities.add( containedNonEntity1_1 ); + + IndexedEntity indexed2 = new IndexedEntity( "2", "some other text" ); + ContainedEntity containedEntity2_1 = new ContainedEntity( "2_1", "some other text" ); + containedEntity2_1.containing = indexed2; + indexed2.containedEntities.add( containedEntity2_1 ); + ContainedNonEntity containedNonEntity2_1 = new ContainedNonEntity( "some other text" ); + indexed2.containedNonEntities.add( containedNonEntity2_1 ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) + .matching( "entity text" ) ) + .fetchHits( 20 ) ) + .isEmpty(); + } + + with( sessionFactory ).runInTransaction( session -> { + session.persist( indexed1 ); + session.persist( containedEntity1_1 ); + session.persist( indexed2 ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .select( f -> f.id() ) + .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) + .matching( "entity" ) ) + .fetchHits( 20 ) ) + .containsExactlyInAnyOrder( indexed1.id ); + } + } + + @Entity + @Indexed + public static class IndexedEntity { + @Id + public String id; + @FullTextField(projectable = Projectable.YES) + public String text; + @OneToMany(mappedBy = "containing") + @IndexedEmbedded + public List containedEntities = new ArrayList<>(); + @ElementCollection + @IndexedEmbedded + public List containedNonEntities = new ArrayList<>(); + + public IndexedEntity() { + } + + public IndexedEntity(String id, String text) { + this.id = id; + this.text = text; + } + } + + @Entity + public static class ContainedEntity { + // Not setting @DocumentId here because it shouldn't be necessary + @Id + public String id; + @FullTextField + public String text; + @ManyToOne + public IndexedEntity containing; + + public ContainedEntity() { + } + + public ContainedEntity(String id, String text) { + this.id = id; + this.text = text; + } + } + + @Embeddable + public static class ContainedNonEntity { + @FullTextField(projectable = Projectable.YES) + public String text; + + public ContainedNonEntity() { + } + + public ContainedNonEntity(String text) { + this.text = text; + } + } +} diff --git a/integrationtest/metamodel/standalone-elasticsearch/pom.xml b/integrationtest/metamodel/standalone-elasticsearch/pom.xml new file mode 100644 index 00000000000..7ec461ba833 --- /dev/null +++ b/integrationtest/metamodel/standalone-elasticsearch/pom.xml @@ -0,0 +1,98 @@ + + 4.0.0 + + org.hibernate.search + hibernate-search-integrationtest + 8.0.0-SNAPSHOT + ../.. + + hibernate-search-integrationtest-metamodel-standalone-elasticsearch + + Hibernate Search ITs - Metamodel - Standalone with the Elasticsearch backend + Hibernate Search integration tests for metamodel generation with standalone mapper and the Elasticsearch backend + + + + + + + org.hibernate.search + hibernate-search-mapper-pojo-standalone + test + + + org.hibernate.search + hibernate-search-backend-elasticsearch + test + + + org.hibernate.search + hibernate-search-util-internal-integrationtest-mapper-pojo-standalone + test + + + org.hibernate.search + hibernate-search-util-internal-integrationtest-backend-elasticsearch + test + + + org.hibernate.search + hibernate-search-metamodel-processor + provided + + + + + + + maven-compiler-plugin + ${version.compiler.plugin} + + + default-testCompile + + false + full + + org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor + + + + org.hibernate.search + hibernate-search-metamodel-processor + ${project.version} + + + org.hibernate.search + hibernate-search-backend-elasticsearch + ${project.version} + + + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + it + + integration-test + verify + + + ${test.elasticsearch.skip} + + elasticsearch + + + + + + + + + diff --git a/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java new file mode 100644 index 00000000000..c9f284cf8a0 --- /dev/null +++ b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java @@ -0,0 +1,156 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.lucene; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class EntityAsTreeSmokeIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new ElasticsearchBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withAnnotatedTypes( ContainedNonEntity.class, IndexedEntity.class, ContainedEntity.class ) + .withConfiguration( b -> b.programmaticMapping() + .type( IndexedEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( IndexedEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void indexAndSearch() { + IndexedEntity indexed1 = new IndexedEntity( "1", "some interesting text" ); + ContainedEntity containedEntity1_1 = new ContainedEntity( "1_1", "some contained entity text" ); + containedEntity1_1.containing = indexed1; + indexed1.containedEntities.add( containedEntity1_1 ); + ContainedNonEntity containedNonEntity1_1 = new ContainedNonEntity( "some contained nonentity text" ); + indexed1.containedNonEntities.add( containedNonEntity1_1 ); + + IndexedEntity indexed2 = new IndexedEntity( "2", "some other text" ); + ContainedEntity containedEntity2_1 = new ContainedEntity( "2_1", "some other text" ); + containedEntity2_1.containing = indexed2; + indexed2.containedEntities.add( containedEntity2_1 ); + ContainedNonEntity containedNonEntity2_1 = new ContainedNonEntity( "some other text" ); + indexed2.containedNonEntities.add( containedNonEntity2_1 ); + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = session.scope( IndexedEntity.class ); + assertThat( session.search( scope ) + .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) + .matching( "entity text" ) ) + .fetchHits( 20 ) ) + .isEmpty(); + } + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + session.indexingPlan().add( indexed1 ); + session.indexingPlan().add( indexed2 ); + simulatedIndexedEntityDatastore.put( indexed1.id, indexed1 ); + simulatedIndexedEntityDatastore.put( indexed2.id, indexed2 ); + } + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = session.scope( IndexedEntity.class ); + assertThat( session.search( scope ) + .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) + .matching( "entity" ) ) + .fetchHits( 20 ) ) + .containsExactlyInAnyOrder( indexed1 ); + } + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + session.indexingPlan().delete( indexed1 ); + } + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = session.scope( IndexedEntity.class ); + assertThat( session.search( scope ) + .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) + .matching( "entity text" ) ) + .fetchHits( 20 ) ) + .containsExactlyInAnyOrder( indexed2 ); + } + } + + @SearchEntity + @Indexed + public static class IndexedEntity { + @DocumentId + public String id; + @FullTextField(projectable = Projectable.YES) + public String text; + @IndexedEmbedded + public List containedEntities = new ArrayList<>(); + @IndexedEmbedded + public List containedNonEntities = new ArrayList<>(); + + public IndexedEntity(String id, String text) { + this.id = id; + this.text = text; + } + } + + @SearchEntity + public static class ContainedEntity { + // Not setting @DocumentId here because it shouldn't be necessary + public String id; + @FullTextField + public String text; + public IndexedEntity containing; + + public ContainedEntity(String id, String text) { + this.id = id; + this.text = text; + } + } + + public static class ContainedNonEntity { + @FullTextField(projectable = Projectable.YES) + public String text; + + public ContainedNonEntity(String text) { + this.text = text; + } + } +} diff --git a/integrationtest/metamodel/standalone-lucene/pom.xml b/integrationtest/metamodel/standalone-lucene/pom.xml new file mode 100644 index 00000000000..6d6b6aece65 --- /dev/null +++ b/integrationtest/metamodel/standalone-lucene/pom.xml @@ -0,0 +1,98 @@ + + 4.0.0 + + org.hibernate.search + hibernate-search-integrationtest + 8.0.0-SNAPSHOT + ../.. + + hibernate-search-integrationtest-metamodel-standalone-lucene + + Hibernate Search ITs - Metamodel - Standalone with the Lucene backend + Hibernate Search integration tests for metamodel generation with standalone mapper and the Lucene backend + + + + + + + org.hibernate.search + hibernate-search-mapper-pojo-standalone + test + + + org.hibernate.search + hibernate-search-backend-lucene + test + + + org.hibernate.search + hibernate-search-util-internal-integrationtest-mapper-pojo-standalone + test + + + org.hibernate.search + hibernate-search-util-internal-integrationtest-backend-lucene + test + + + org.hibernate.search + hibernate-search-metamodel-processor + provided + + + + + + + maven-compiler-plugin + ${version.compiler.plugin} + + + default-testCompile + + false + full + + org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor + + + + org.hibernate.search + hibernate-search-metamodel-processor + ${project.version} + + + org.hibernate.search + hibernate-search-backend-lucene + ${project.version} + + + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + it + + integration-test + verify + + + ${test.lucene.skip} + + lucene + + + + + + + + + diff --git a/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java new file mode 100644 index 00000000000..b9a95857058 --- /dev/null +++ b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java @@ -0,0 +1,156 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.lucene; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class EntityAsTreeSmokeIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new LuceneBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withAnnotatedTypes( ContainedNonEntity.class, IndexedEntity.class, ContainedEntity.class ) + .withConfiguration( b -> b.programmaticMapping() + .type( IndexedEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( IndexedEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void indexAndSearch() { + IndexedEntity indexed1 = new IndexedEntity( "1", "some interesting text" ); + ContainedEntity containedEntity1_1 = new ContainedEntity( "1_1", "some contained entity text" ); + containedEntity1_1.containing = indexed1; + indexed1.containedEntities.add( containedEntity1_1 ); + ContainedNonEntity containedNonEntity1_1 = new ContainedNonEntity( "some contained nonentity text" ); + indexed1.containedNonEntities.add( containedNonEntity1_1 ); + + IndexedEntity indexed2 = new IndexedEntity( "2", "some other text" ); + ContainedEntity containedEntity2_1 = new ContainedEntity( "2_1", "some other text" ); + containedEntity2_1.containing = indexed2; + indexed2.containedEntities.add( containedEntity2_1 ); + ContainedNonEntity containedNonEntity2_1 = new ContainedNonEntity( "some other text" ); + indexed2.containedNonEntities.add( containedNonEntity2_1 ); + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) + .matching( "entity text" ) ) + .fetchHits( 20 ) ) + .isEmpty(); + } + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + session.indexingPlan().add( indexed1 ); + session.indexingPlan().add( indexed2 ); + simulatedIndexedEntityDatastore.put( indexed1.id, indexed1 ); + simulatedIndexedEntityDatastore.put( indexed2.id, indexed2 ); + } + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) + .matching( "entity" ) ) + .fetchHits( 20 ) ) + .containsExactlyInAnyOrder( indexed1 ); + } + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + session.indexingPlan().delete( indexed1 ); + } + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) + .matching( "entity text" ) ) + .fetchHits( 20 ) ) + .containsExactlyInAnyOrder( indexed2 ); + } + } + + @SearchEntity + @Indexed + public static class IndexedEntity { + @DocumentId + public String id; + @FullTextField(projectable = Projectable.YES) + public String text; + @IndexedEmbedded + public List containedEntities = new ArrayList<>(); + @IndexedEmbedded + public List containedNonEntities = new ArrayList<>(); + + public IndexedEntity(String id, String text) { + this.id = id; + this.text = text; + } + } + + @SearchEntity + public static class ContainedEntity { + // Not setting @DocumentId here because it shouldn't be necessary + public String id; + @FullTextField + public String text; + public IndexedEntity containing; + + public ContainedEntity(String id, String text) { + this.id = id; + this.text = text; + } + } + + public static class ContainedNonEntity { + @FullTextField(projectable = Projectable.YES) + public String text; + + public ContainedNonEntity(String text) { + this.text = text; + } + } +} diff --git a/integrationtest/pom.xml b/integrationtest/pom.xml index 99a5d55803f..4760b6b1986 100644 --- a/integrationtest/pom.xml +++ b/integrationtest/pom.xml @@ -28,6 +28,9 @@ performance v5migrationhelper/engine v5migrationhelper/orm + metamodel/standalone-lucene + metamodel/standalone-elasticsearch + metamodel/orm-lucene diff --git a/metamodel/metamodel-processor/pom.xml b/metamodel/metamodel-processor/pom.xml index 2e3683609ca..08b4daf1853 100644 --- a/metamodel/metamodel-processor/pom.xml +++ b/metamodel/metamodel-processor/pom.xml @@ -37,11 +37,6 @@ hibernate-search-mapper-pojo-standalone - - org.hibernate.search - hibernate-search-backend-lucene - - org.hibernate.search hibernate-search-util-common @@ -55,6 +50,11 @@ jboss-logging-annotations + + org.hibernate.search + hibernate-search-backend-lucene + test + org.junit.jupiter junit-jupiter diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java index 3b5014d4e94..f6d53abdc64 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java @@ -14,6 +14,7 @@ import javax.annotation.processing.SupportedOptions; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; +import javax.tools.Diagnostic; import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; import org.hibernate.search.metamodel.processor.impl.IndexedEntityMetamodelAnnotationProcessor; @@ -48,6 +49,7 @@ public SourceVersion getSupportedSourceVersion() { @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { + context.messager().printMessage( Diagnostic.Kind.NOTE, "Hibernate Search Metamodel Processor started" ); for ( MetamodelAnnotationProcessor processor : processors ) { processor.process( roundEnv ); } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java index f04f6039b44..db4740c59ba 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java @@ -59,8 +59,8 @@ private AnnotationMirror getValueBinder(AnnotationMirror annotation) { public record ProcessorEnumValueBridge(TypeMirror valueType) implements ValueBridge { @Override - public String toIndexedValue(Object value, ValueBridgeToIndexedValueContext context) { - return ""; - } + public String toIndexedValue(Object value, ValueBridgeToIndexedValueContext context) { + return ""; } + } } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java index f74b5fac19e..e0c4888c65f 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java @@ -58,6 +58,9 @@ public void process(RoundEnvironment roundEnv) { try ( CloseableSearchMapping searchMapping = StandalonePojoIntegrationBooter.builder() .introspectorCustomizer( this::wrapIntrospector ) .property( "hibernate.search.backend.directory.type", "local-heap" ) + .property( "hibernate.search.backend.version_check.enabled", "false" ) + .property( "hibernate.search.schema_management.strategy", "none" ) + .property( "hibernate.search.backend.version", "8.17.3" ) .property( StandalonePojoMapperSettings.MAPPING_CONFIGURER, BeanReference.ofInstance( (StandalonePojoMappingConfigurer) configurationContext -> { @@ -109,7 +112,8 @@ public void process(RoundEnvironment roundEnv) { for ( SearchIndexedEntity entity : searchMapping.allIndexedEntities() ) { context.messager().printMessage( Diagnostic.Kind.NOTE, entity.name() ); - String packageName = entity.name().substring( 0, entity.name().lastIndexOf( "." ) ); + TypeElement typeElement = introspectorContext.typeElementsByName( entity.name() ); + String packageName = context.elementUtils().getPackageOf( typeElement ).getQualifiedName().toString(); MetamodelClassWriter.Builder builder = new MetamodelClassWriter.Builder( MetamodelNamesFormatter.DEFAULT, packageName, entity.name() ); diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorIntrospectorContext.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorIntrospectorContext.java index 2915a619c39..b3e0118e4a0 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorIntrospectorContext.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorIntrospectorContext.java @@ -4,7 +4,8 @@ */ package org.hibernate.search.metamodel.processor.mapping.impl; -import java.util.Objects; +import java.util.HashMap; +import java.util.Map; import javax.annotation.processing.Messager; import javax.lang.model.element.TypeElement; @@ -17,8 +18,7 @@ public final class ProcessorIntrospectorContext { private final HibernateSearchMetamodelProcessorContext processorContext; - private String typeName; - private TypeElement indexedEntityType; + private final Map typeElements = new HashMap<>(); private ProcessorAnnotationProcessorContext processorAnnotationProcessorContext; public ProcessorIntrospectorContext(HibernateSearchMetamodelProcessorContext processorContext) { @@ -42,15 +42,11 @@ public Messager messager() { } public void typeElementsByName(String typeName, TypeElement indexedEntityType) { - this.typeName = typeName; - this.indexedEntityType = indexedEntityType; + typeElements.put( typeName, indexedEntityType ); } public TypeElement typeElementsByName(String typeName) { - if ( Objects.equals( typeName, this.typeName ) ) { - return indexedEntityType; - } - return null; + return typeElements.get( typeName ); } public void processorAnnotationProcessorContext(ProcessorAnnotationProcessorContext processorAnnotationProcessorContext) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java index 67baafe5b07..8bf787d3505 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java @@ -38,7 +38,8 @@ public static class Builder { private final int depth; public Builder(MetamodelNamesFormatter metamodelNamesFormatter, String packageName, String className) { - this( metamodelNamesFormatter, packageName, className, metamodelClassName( metamodelNamesFormatter, className ), + this( metamodelNamesFormatter, packageName, className, + metamodelClassName( metamodelNamesFormatter, packageName, className ), TraitReferenceMapping.instance(), new TreeMap<>(), 1 ); } @@ -195,13 +196,14 @@ private String indent() { } public String metamodelClassName() { - return metamodelClassName( metamodelNamesFormatter, className ); + return metamodelClassName( metamodelNamesFormatter, packageName, className ); } - private static String metamodelClassName(MetamodelNamesFormatter metamodelNamesFormatter, String className) { + private static String metamodelClassName(MetamodelNamesFormatter metamodelNamesFormatter, String packageName, + String className) { String classSimpleName; if ( className.contains( "." ) ) { - classSimpleName = className.substring( className.lastIndexOf( "." ) + 1 ); + classSimpleName = className.substring( packageName.length() + 1 ).replace( '.', '_' ); } else { classSimpleName = className; From 8fadd238713c72a55c3cc6c94b0dda5bdcc455fa Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Wed, 19 Mar 2025 22:27:02 +0100 Subject: [PATCH 16/25] HSEARCH-5300 More cleanups and improvements --- build/jqassistant/rules/rules.xml | 2 + build/parents/build/pom.xml | 15 + build/reports/pom.xml | 12 + distribution/pom.xml | 4 +- .../predicate/dsl/SearchPredicateFactory.java | 2 +- .../dsl/SpatialPredicateInitialStep.java | 4 +- .../SpatialWithinPredicateFieldMoreStep.java | 36 +- .../dsl/SpatialWithinPredicateFieldStep.java | 37 +- .../impl/SpatialPredicateInitialStepImpl.java | 6 +- ...atialWithinPredicateFieldMoreStepImpl.java | 41 +- .../SpatialWithinPredicateFieldStepImpl.java | 25 +- .../spi/AbstractSearchPredicateFactory.java | 4 +- ...va => SpatialPredicateFieldReference.java} | 2 +- ...hinBoundingBoxPredicateFieldReference.java | 8 - ...lWithinPolygonPredicateFieldReference.java | 8 - .../metamodel/orm-elasticsearch/pom.xml | 106 +++++ .../orm/elasticsearch/AggregationTypesIT.java | 130 ++++++ .../elasticsearch/EntityAsTreeSmokeIT.java | 153 +++++++ .../orm/elasticsearch/FieldTypesIT.java | 246 ++++++++++ .../orm/elasticsearch/PredicateTypesIT.java | 133 ++++++ .../orm/elasticsearch/ProjectionTypesIT.java | 125 ++++++ .../orm/elasticsearch/SortTypesIT.java | 115 +++++ integrationtest/metamodel/orm-lucene/pom.xml | 1 - .../orm/lucene/AggregationTypesIT.java | 111 +++++ .../lucene/EntityAsTreeSmokeIT.java | 12 +- .../metamodel/orm/lucene/FieldTypesIT.java | 246 ++++++++++ .../orm/lucene/PredicateTypesIT.java | 133 ++++++ .../orm/lucene/ProjectionTypesIT.java | 125 ++++++ .../metamodel/orm/lucene/SortTypesIT.java | 94 ++++ .../standalone-elasticsearch/pom.xml | 1 - .../elasticsearch/AggregationTypesIT.java | 151 +++++++ .../EntityAsTreeSmokeIT.java | 6 +- .../elasticsearch/FieldTypesIT.java | 242 ++++++++++ .../elasticsearch/PredicateTypesIT.java | 150 +++++++ .../elasticsearch/ProjectionTypesIT.java | 140 ++++++ .../standalone/elasticsearch/SortTypesIT.java | 115 +++++ .../metamodel/standalone-lucene/pom.xml | 1 - .../standalone/lucene/AggregationTypesIT.java | 132 ++++++ .../lucene/EntityAsTreeSmokeIT.java | 13 +- .../standalone/lucene/FieldTypesIT.java | 242 ++++++++++ .../standalone/lucene/PredicateTypesIT.java | 150 +++++++ .../standalone/lucene/ProjectionTypesIT.java | 140 ++++++ .../standalone/lucene/SortTypesIT.java | 115 +++++ integrationtest/pom.xml | 1 + .../StandalonePojoRootReferenceScope.java | 2 +- .../impl/StandalonePojoSearchSession.java | 2 +- metamodel/metamodel-processor/pom.xml | 9 + .../HibernateSearchMetamodelProcessor.java | 10 +- ...rnateSearchMetamodelProcessorSettings.java | 40 +- .../AbstractProcessorAnnotationProcessor.java | 18 +- ...ractProcessorFieldAnnotationProcessor.java | 5 +- ...orNonFullTextFieldAnnotationProcessor.java | 2 +- ...essorStandardFieldAnnotationProcessor.java | 2 +- .../impl/ProcessorDocumentIdProcessor.java | 2 +- .../impl/ProcessorFulltextFieldProcessor.java | 23 +- .../impl/ProcessorGenericFieldProcessor.java | 2 +- .../ProcessorGeoPointBindingProcessor.java | 2 +- .../ProcessorIndexedEmbeddedProcessor.java | 6 +- .../impl/ProcessorKeywordFieldProcessor.java | 14 +- .../impl/ProcessorLatitudeProcessor.java | 2 +- .../impl/ProcessorLongitudeProcessor.java | 2 +- .../ProcessorNonStandardFieldProcessor.java | 2 +- .../ProcessorScaledNumberFieldProcessor.java | 7 +- ...ProcessorTypePropertyBindingProcessor.java | 4 +- .../impl/ProcessorVectorFieldProcessor.java | 7 +- ...ernateSearchMetamodelProcessorContext.java | 8 +- ...xedEntityMetamodelAnnotationProcessor.java | 25 +- .../processor/logging/impl/MappingLog.java | 39 -- .../processor/logging/impl/ProcessorLog.java | 17 - ...cessorPojoModelsBootstrapIntrospector.java | 6 +- .../impl/BuiltInBridgeResolverTypes.java | 32 -- .../impl/ProcessorPojoPropertyModel.java | 8 - .../model/impl/ProcessorPojoRawTypeModel.java | 8 +- .../processor/writer/impl/ClassProperty.java | 2 +- .../writer/impl/MetamodelClassWriter.java | 422 ++++++++++-------- .../processor/writer/impl/TraitKind.java | 2 +- .../writer/impl/TraitReferenceDetails.java | 4 +- .../writer/impl/TraitReferenceMapping.java | 18 +- .../impl/TypedFieldReferenceDetails.java | 4 +- .../impl/ValueFieldReferenceDetails.java | 2 +- .../metamodel/processor/CombineTest.java | 33 -- ...eSearchMetamodelProcessorSettingsTest.java | 26 ++ ...HibernateSearchMetamodelProcessorTest.java | 42 +- .../processor/model/FieldTypesEntity.java | 87 ++++ .../processor/model/MyEntityWithBinders.java | 18 + .../processor/model/MyIndexedEntity.java | 3 +- .../impl/TraitReferenceDetailsTest.java | 34 ++ .../impl}/TraitReferenceMappingTest.java | 4 +- 88 files changed, 4066 insertions(+), 476 deletions(-) rename engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/{SpatialWithinCirclePredicateFieldReference.java => SpatialPredicateFieldReference.java} (58%) delete mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinBoundingBoxPredicateFieldReference.java delete mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinPolygonPredicateFieldReference.java create mode 100644 integrationtest/metamodel/orm-elasticsearch/pom.xml create mode 100644 integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/AggregationTypesIT.java create mode 100644 integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/EntityAsTreeSmokeIT.java create mode 100644 integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/FieldTypesIT.java create mode 100644 integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/PredicateTypesIT.java create mode 100644 integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/ProjectionTypesIT.java create mode 100644 integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/SortTypesIT.java create mode 100644 integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/AggregationTypesIT.java rename integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/{standalone => orm}/lucene/EntityAsTreeSmokeIT.java (90%) create mode 100644 integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/FieldTypesIT.java create mode 100644 integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/PredicateTypesIT.java create mode 100644 integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/ProjectionTypesIT.java create mode 100644 integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/SortTypesIT.java create mode 100644 integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/AggregationTypesIT.java rename integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/{lucene => elasticsearch}/EntityAsTreeSmokeIT.java (95%) create mode 100644 integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/FieldTypesIT.java create mode 100644 integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/PredicateTypesIT.java create mode 100644 integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/ProjectionTypesIT.java create mode 100644 integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/SortTypesIT.java create mode 100644 integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/AggregationTypesIT.java create mode 100644 integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/FieldTypesIT.java create mode 100644 integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/PredicateTypesIT.java create mode 100644 integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/ProjectionTypesIT.java create mode 100644 integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/SortTypesIT.java delete mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/MappingLog.java delete mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/ProcessorLog.java delete mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/CombineTest.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettingsTest.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/FieldTypesEntity.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEntityWithBinders.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetailsTest.java rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/{ => writer/impl}/TraitReferenceMappingTest.java (91%) diff --git a/build/jqassistant/rules/rules.xml b/build/jqassistant/rules/rules.xml index d67e23dfe0e..a681202fed5 100644 --- a/build/jqassistant/rules/rules.xml +++ b/build/jqassistant/rules/rules.xml @@ -472,6 +472,7 @@ + Main (non-test) types must not depend on implementation types from other modules. SPIs must be used for such dependencies. @@ -485,6 +486,7 @@ artifact1 <> artifact2 // Exceptions AND NOT artifact2:Util + AND NOT type1:SuppressJQAssistant RETURN artifact1, type1, artifact2, type2 ]]> diff --git a/build/parents/build/pom.xml b/build/parents/build/pom.xml index 165890a456f..7dd72c66e4c 100644 --- a/build/parents/build/pom.xml +++ b/build/parents/build/pom.xml @@ -721,6 +721,21 @@ hibernate-search-integrationtest-metamodel-standalone-lucene ${project.version} + + org.hibernate.search + hibernate-search-integrationtest-metamodel-standalone-elasticsearch + ${project.version} + + + org.hibernate.search + hibernate-search-integrationtest-metamodel-orm-lucene + ${project.version} + + + org.hibernate.search + hibernate-search-integrationtest-metamodel-orm-elasticsearch + ${project.version} + org.hibernate.search hibernate-search-integrationtest-backend-lucene-next diff --git a/build/reports/pom.xml b/build/reports/pom.xml index dba8ac66a8e..63a527eb849 100644 --- a/build/reports/pom.xml +++ b/build/reports/pom.xml @@ -152,6 +152,18 @@ org.hibernate.search hibernate-search-integrationtest-metamodel-standalone-lucene + + org.hibernate.search + hibernate-search-integrationtest-metamodel-standalone-elasticsearch + + + org.hibernate.search + hibernate-search-integrationtest-metamodel-orm-lucene + + + org.hibernate.search + hibernate-search-integrationtest-metamodel-orm-elasticsearch + org.hibernate.search hibernate-search-documentation diff --git a/distribution/pom.xml b/distribution/pom.xml index 12df6349743..8c3ded66ea9 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -256,7 +256,7 @@ ${basedir}/../mapper/orm-outbox-polling/src/main/java; ${basedir}/../mapper/orm-jakarta-batch/core/src/main/java; ${basedir}/../mapper/orm-jakarta-batch/jberet/src/main/java; - ${basedir}/../metamodel/processor/src/main/java; + ${basedir}/../metamodel/metamodel-processor/src/main/java; ${basedir}/../engine/target/generated-sources/annotations; ${basedir}/../util/common/target/generated-sources/annotations; ${basedir}/../mapper/pojo-base/target/generated-sources/annotations; @@ -269,7 +269,7 @@ ${basedir}/../mapper/orm-outbox-polling/target/generated-sources/annotations; ${basedir}/../mapper/orm-jakarta-batch/core/target/generated-sources/annotations; ${basedir}/../mapper/orm-jakarta-batch/jberet/target/generated-sources/annotations; - ${basedir}/../metamodel/processor/target/generated-sources/annotations; + ${basedir}/../metamodel/metamodel-processor/target/generated-sources/annotations; true Hibernate Search Packages 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 ac6112335c6..8285b216a03 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 @@ -302,7 +302,7 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * @return The initial step of a DSL where spatial predicates can be defined. * @see SpatialPredicateInitialStep */ - SpatialPredicateInitialStep spatial(); + SpatialPredicateInitialStep spatial(); /** * Match documents if they match a combination of defined named predicate clauses. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialPredicateInitialStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialPredicateInitialStep.java index a2e8c7586f6..2703155036b 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialPredicateInitialStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialPredicateInitialStep.java @@ -8,7 +8,7 @@ /** * The initial step of all spatial predicate definitions. */ -public interface SpatialPredicateInitialStep { +public interface SpatialPredicateInitialStep { /** * Match documents where targeted fields point to a location within given bounds: @@ -16,6 +16,6 @@ public interface SpatialPredicateInitialStep { * * @return The initial step of a DSL allowing the definition of a "within" predicate. */ - SpatialWithinPredicateFieldStep within(); + SpatialWithinPredicateFieldStep within(); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldMoreStep.java index 28766ba9aab..f595f35cdb3 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldMoreStep.java @@ -4,6 +4,8 @@ */ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.SpatialPredicateFieldReference; + /** * The step in a "within" predicate definition where the area to match can be set * (see the superinterface {@link SpatialWithinPredicateAreaStep}), @@ -14,7 +16,8 @@ * @param The type of the next step. */ public interface SpatialWithinPredicateFieldMoreStep< - S extends SpatialWithinPredicateFieldMoreStep, + SR, + S extends SpatialWithinPredicateFieldMoreStep, N extends SpatialWithinPredicateOptionsStep> extends SpatialWithinPredicateAreaStep, MultiFieldPredicateFieldBoostStep { @@ -49,4 +52,35 @@ default S field(String fieldPath) { */ S fields(String... fieldPaths); + /** + * Target the given field in the "within" predicate, + * as an alternative to the already-targeted fields. + *

+ * See {@link SpatialWithinPredicateFieldStep#field(String)} for more information on targeted fields. + * + * @param fieldReference The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + * + * @see SpatialWithinPredicateFieldStep#field(String) + */ + @SuppressWarnings("unchecked") + default S field(SpatialPredicateFieldReference fieldReference) { + return fields( fieldReference ); + } + + /** + * Target the given fields in the "within" predicate, + * as an alternative to the already-targeted fields. + *

+ * See {@link SpatialWithinPredicateFieldStep#fields(String...)} for more information on targeted fields. + * + * @param fieldReferences The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see SpatialWithinPredicateFieldStep#fields(String...) + */ + @SuppressWarnings("unchecked") + S fields(SpatialPredicateFieldReference... fieldReferences); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldStep.java index a8e9770a954..4f81e8cc23e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldStep.java @@ -5,12 +5,14 @@ package org.hibernate.search.engine.search.predicate.dsl; +import org.hibernate.search.engine.search.reference.predicate.SpatialPredicateFieldReference; + /** * The initial step in a "within" predicate definition, where the target field can be set. * * @param The type of the next step. */ -public interface SpatialWithinPredicateFieldStep> { +public interface SpatialWithinPredicateFieldStep> { /** * Target the given field in the "within" predicate. @@ -43,4 +45,37 @@ default N field(String fieldPath) { */ N fields(String... fieldPaths); + /** + * Target the given field in the "within" predicate. + *

+ * Multiple fields may be targeted by the same predicate: + * the predicate will match if any targeted field matches. + * + * @param fieldReference The field reference representing a path to the index field + * to apply the predicate on. + * @return The next step. + */ + @SuppressWarnings("unchecked") + default N field(SpatialPredicateFieldReference fieldReference) { + return fields( fieldReference ); + } + + /** + * Target the given fields in the "within" predicate. + *

+ * Equivalent to {@link #field(String)} followed by multiple calls to + * {@link RangePredicateFieldMoreStep#field(String)}, + * the only difference being that calls to {@link RangePredicateFieldMoreStep#boost(float)} + * and other field-specific settings on the returned step will only need to be done once + * and will apply to all the fields passed to this method. + * + * @param fieldReferences The field references representing paths to the index fields + * to apply the predicate on. + * @return The next step. + * + * @see #field(String) + */ + @SuppressWarnings("unchecked") + N fields(SpatialPredicateFieldReference... fieldReferences); + } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialPredicateInitialStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialPredicateInitialStepImpl.java index 312ec164be0..ebb8b19a64b 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialPredicateInitialStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialPredicateInitialStepImpl.java @@ -8,7 +8,7 @@ import org.hibernate.search.engine.search.predicate.dsl.SpatialWithinPredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; -public final class SpatialPredicateInitialStepImpl implements SpatialPredicateInitialStep { +public final class SpatialPredicateInitialStepImpl implements SpatialPredicateInitialStep { private final SearchPredicateDslContext dslContext; @@ -17,7 +17,7 @@ public SpatialPredicateInitialStepImpl(SearchPredicateDslContext dslContext) } @Override - public SpatialWithinPredicateFieldStep within() { - return new SpatialWithinPredicateFieldStepImpl( dslContext ); + public SpatialWithinPredicateFieldStep within() { + return new SpatialWithinPredicateFieldStepImpl<>( dslContext ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialWithinPredicateFieldMoreStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialWithinPredicateFieldMoreStepImpl.java index 30e94abacf5..8abdae635fe 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialWithinPredicateFieldMoreStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialWithinPredicateFieldMoreStepImpl.java @@ -19,6 +19,7 @@ import org.hibernate.search.engine.search.predicate.spi.SpatialWithinBoundingBoxPredicateBuilder; import org.hibernate.search.engine.search.predicate.spi.SpatialWithinCirclePredicateBuilder; import org.hibernate.search.engine.search.predicate.spi.SpatialWithinPolygonPredicateBuilder; +import org.hibernate.search.engine.search.reference.predicate.SpatialPredicateFieldReference; import org.hibernate.search.engine.spatial.DistanceUnit; import org.hibernate.search.engine.spatial.GeoBoundingBox; import org.hibernate.search.engine.spatial.GeoPoint; @@ -26,12 +27,14 @@ import org.hibernate.search.util.common.impl.CollectionHelper; import org.hibernate.search.util.common.impl.Contracts; -class SpatialWithinPredicateFieldMoreStepImpl +class SpatialWithinPredicateFieldMoreStepImpl implements - SpatialWithinPredicateFieldMoreStep>, + SpatialWithinPredicateFieldMoreStep, + SpatialWithinPredicateOptionsStep>, AbstractBooleanMultiFieldPredicateCommonState.FieldSetState { - private final CommonState commonState; + private final CommonState commonState; private final List fieldPaths; @@ -39,7 +42,7 @@ class SpatialWithinPredicateFieldMoreStepImpl private Float fieldSetBoost; - SpatialWithinPredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { + SpatialWithinPredicateFieldMoreStepImpl(CommonState commonState, List fieldPaths) { this.commonState = commonState; this.commonState.add( this ); this.fieldPaths = CollectionHelper.toImmutableList( fieldPaths ); @@ -47,12 +50,22 @@ class SpatialWithinPredicateFieldMoreStepImpl } @Override - public SpatialWithinPredicateFieldMoreStepImpl fields(String... fieldPaths) { - return new SpatialWithinPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public SpatialWithinPredicateFieldMoreStepImpl fields(String... fieldPaths) { + return new SpatialWithinPredicateFieldMoreStepImpl<>( commonState, Arrays.asList( fieldPaths ) ); } + @SuppressWarnings("unchecked") @Override - public SpatialWithinPredicateFieldMoreStepImpl boost(float boost) { + public SpatialWithinPredicateFieldMoreStepImpl fields(SpatialPredicateFieldReference... fieldReferences) { + List fieldPaths = new ArrayList<>( fieldReferences.length ); + for ( SpatialPredicateFieldReference fieldReference : fieldReferences ) { + fieldPaths.add( fieldReference.absolutePath() ); + } + return new SpatialWithinPredicateFieldMoreStepImpl<>( commonState, fieldPaths ); + } + + @Override + public SpatialWithinPredicateFieldMoreStepImpl boost(float boost) { this.fieldSetBoost = boost; return this; } @@ -120,16 +133,16 @@ private void generateWithinBoundingBoxQueryBuilders(GeoBoundingBox boundingBox) } } - static class CommonState - extends AbstractBooleanMultiFieldPredicateCommonState - implements SpatialWithinPredicateOptionsStep { + static class CommonState + extends AbstractBooleanMultiFieldPredicateCommonState, SpatialWithinPredicateFieldMoreStepImpl> + implements SpatialWithinPredicateOptionsStep> { CommonState(SearchPredicateDslContext dslContext) { super( dslContext ); } SpatialWithinPredicateOptionsStep circle(GeoPoint center, double radius, DistanceUnit unit) { - for ( SpatialWithinPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + for ( SpatialWithinPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { fieldSetState.generateWithinCircleQueryBuilders( center, radius, unit ); } @@ -137,7 +150,7 @@ SpatialWithinPredicateOptionsStep circle(GeoPoint center, double radius, Dist } SpatialWithinPredicateOptionsStep polygon(GeoPolygon polygon) { - for ( SpatialWithinPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + for ( SpatialWithinPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { fieldSetState.generateWithinPolygonQueryBuilders( polygon ); } @@ -145,7 +158,7 @@ SpatialWithinPredicateOptionsStep polygon(GeoPolygon polygon) { } SpatialWithinPredicateOptionsStep boundingBox(GeoBoundingBox boundingBox) { - for ( SpatialWithinPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { + for ( SpatialWithinPredicateFieldMoreStepImpl fieldSetState : getFieldSetStates() ) { fieldSetState.generateWithinBoundingBoxQueryBuilders( boundingBox ); } @@ -153,7 +166,7 @@ SpatialWithinPredicateOptionsStep boundingBox(GeoBoundingBox boundingBox) { } @Override - protected CommonState thisAsS() { + protected CommonState thisAsS() { return this; } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialWithinPredicateFieldStepImpl.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialWithinPredicateFieldStepImpl.java index 876eb423dcf..7939112dec5 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialWithinPredicateFieldStepImpl.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/SpatialWithinPredicateFieldStepImpl.java @@ -4,23 +4,36 @@ */ package org.hibernate.search.engine.search.predicate.dsl.impl; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import org.hibernate.search.engine.search.predicate.dsl.SpatialWithinPredicateFieldMoreStep; import org.hibernate.search.engine.search.predicate.dsl.SpatialWithinPredicateFieldStep; import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext; +import org.hibernate.search.engine.search.reference.predicate.SpatialPredicateFieldReference; -class SpatialWithinPredicateFieldStepImpl - implements SpatialWithinPredicateFieldStep> { +class SpatialWithinPredicateFieldStepImpl + implements SpatialWithinPredicateFieldStep> { - private final SpatialWithinPredicateFieldMoreStepImpl.CommonState commonState; + private final SpatialWithinPredicateFieldMoreStepImpl.CommonState commonState; SpatialWithinPredicateFieldStepImpl(SearchPredicateDslContext dslContext) { - this.commonState = new SpatialWithinPredicateFieldMoreStepImpl.CommonState( dslContext ); + this.commonState = new SpatialWithinPredicateFieldMoreStepImpl.CommonState<>( dslContext ); } @Override - public SpatialWithinPredicateFieldMoreStep fields(String... fieldPaths) { - return new SpatialWithinPredicateFieldMoreStepImpl( commonState, Arrays.asList( fieldPaths ) ); + public SpatialWithinPredicateFieldMoreStep fields(String... fieldPaths) { + return new SpatialWithinPredicateFieldMoreStepImpl<>( commonState, Arrays.asList( fieldPaths ) ); + } + + @SuppressWarnings("unchecked") + @Override + public SpatialWithinPredicateFieldMoreStep fields(SpatialPredicateFieldReference... fieldReferences) { + List fieldPaths = new ArrayList<>( fieldReferences.length ); + for ( SpatialPredicateFieldReference fieldReference : fieldReferences ) { + fieldPaths.add( fieldReference.absolutePath() ); + } + return new SpatialWithinPredicateFieldMoreStepImpl<>( commonState, fieldPaths ); } } 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 e77e2b52d0b..61d3cec0166 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 @@ -215,8 +215,8 @@ public PredicateFinalStep bool(Consumer spatial() { + return new SpatialPredicateInitialStepImpl<>( dslContext ); } @Override diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinCirclePredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialPredicateFieldReference.java similarity index 58% rename from engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinCirclePredicateFieldReference.java rename to engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialPredicateFieldReference.java index 0409cf6a9ab..6c660b712b2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinCirclePredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialPredicateFieldReference.java @@ -4,5 +4,5 @@ */ package org.hibernate.search.engine.search.reference.predicate; -public interface SpatialWithinCirclePredicateFieldReference extends TypedPredicateFieldReference { +public interface SpatialPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinBoundingBoxPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinBoundingBoxPredicateFieldReference.java deleted file mode 100644 index 4bdf5dd5a82..00000000000 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinBoundingBoxPredicateFieldReference.java +++ /dev/null @@ -1,8 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.engine.search.reference.predicate; - -public interface SpatialWithinBoundingBoxPredicateFieldReference extends TypedPredicateFieldReference { -} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinPolygonPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinPolygonPredicateFieldReference.java deleted file mode 100644 index b8b125bf35c..00000000000 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialWithinPolygonPredicateFieldReference.java +++ /dev/null @@ -1,8 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.engine.search.reference.predicate; - -public interface SpatialWithinPolygonPredicateFieldReference extends TypedPredicateFieldReference { -} diff --git a/integrationtest/metamodel/orm-elasticsearch/pom.xml b/integrationtest/metamodel/orm-elasticsearch/pom.xml new file mode 100644 index 00000000000..b6689917950 --- /dev/null +++ b/integrationtest/metamodel/orm-elasticsearch/pom.xml @@ -0,0 +1,106 @@ + + 4.0.0 + + org.hibernate.search + hibernate-search-integrationtest + 8.0.0-SNAPSHOT + ../.. + + hibernate-search-integrationtest-metamodel-orm-elasticsearch + + Hibernate Search ITs - Metamodel - ORM mapper with the Elasticsearch backend + Hibernate Search integration tests for metamodel generation with ORM mapper and the Elasticsearch backend + + + + + + + org.hibernate.search + hibernate-search-mapper-orm + test + + + org.hibernate.search + hibernate-search-backend-elasticsearch + test + + + org.hibernate.search + hibernate-search-util-internal-integrationtest-mapper-orm + test + + + org.hibernate.search + hibernate-search-util-internal-integrationtest-backend-elasticsearch + test + + + + ${jdbc.driver.groupId} + ${jdbc.driver.artifactId} + test + + + org.hibernate.search + hibernate-search-metamodel-processor + provided + + + + + + + maven-compiler-plugin + ${version.compiler.plugin} + + + default-testCompile + + full + + org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor + + + + org.hibernate.search + hibernate-search-metamodel-processor + ${project.version} + + + org.hibernate.search + hibernate-search-backend-elasticsearch + ${project.version} + + + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + it + + integration-test + verify + + + ${test.elasticsearch.skip} + + elasticsearch + + + + + + + + + diff --git a/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/AggregationTypesIT.java b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/AggregationTypesIT.java new file mode 100644 index 00000000000..eb2c9b66ab2 --- /dev/null +++ b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/AggregationTypesIT.java @@ -0,0 +1,130 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.orm.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.time.LocalDate; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.backend.types.Aggregable; +import org.hibernate.search.engine.search.aggregation.AggregationKey; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class AggregationTypesIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new ElasticsearchBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .setup(); + } + + @Test + void smoke() { + with( sessionFactory ).runInTransaction( session -> { + session.persist( new IndexedEntity( 1L ) ); + session.persist( new IndexedEntity( 2L ) ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + AggregationTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .aggregation( AggregationKey.of( "range" ), + f -> f.terms().field( AggregationTypesIT_IndexedEntity__.INDEX.myText ) ) + + .aggregation( AggregationKey.of( "sum" ), + f -> f.sum().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "count" ), + f -> f.count().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "countDistinct" ), + f -> f.countDistinct().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "min" ), + f -> f.min().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "max" ), + f -> f.max().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "avg" ), + f -> f.avg().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "terms" ), + f -> f.terms().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "range2" ), + f -> f.range().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) + .range( 1, 20 ) + .range( 20, 50 ) ) + + // NOTE: OpenSearch has issues with having this range aggregation with other range ones >_< + // hence we'll test it in the other query: + // .aggregation( AggregationKey.of( "range3" ), + // f -> f.range().field( AggregationTypesIT_IndexedEntity__.INDEX.myDate ) + // .range( LocalDate.of( 1999, 1, 1 ), + // LocalDate.of( 2000, 1, 1 ) ) + // .range( LocalDate.of( 2000, 1, 1 ), + // LocalDate.of( 2010, 1, 1 ) )) + + .fetchHits( 20 ) ) + .hasSize( 2 ); + + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .aggregation( AggregationKey.of( "range3" ), + f -> f.range().field( AggregationTypesIT_IndexedEntity__.INDEX.myDate ) + .range( LocalDate.of( 1999, 1, 1 ), + LocalDate.of( 2000, 1, 1 ) ) + .range( LocalDate.of( 2000, 1, 1 ), + LocalDate.of( 2010, 1, 1 ) ) + ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @Entity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @Id + public Long id; + @KeywordField(aggregable = Aggregable.YES) + public String myText; + @GenericField(aggregable = Aggregable.YES) + public int myNumber; + @GenericField(aggregable = Aggregable.YES) + public LocalDate myDate; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.myText = "text"; + } + } +} diff --git a/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/EntityAsTreeSmokeIT.java b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/EntityAsTreeSmokeIT.java new file mode 100644 index 00000000000..c144be57838 --- /dev/null +++ b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/EntityAsTreeSmokeIT.java @@ -0,0 +1,153 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.orm.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Embeddable; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class EntityAsTreeSmokeIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new ElasticsearchBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( ContainedNonEntity.class, IndexedEntity.class, ContainedEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .setup(); + } + + @Test + void indexAndSearch() { + IndexedEntity indexed1 = new IndexedEntity( "1", "some interesting text" ); + ContainedEntity containedEntity1_1 = new ContainedEntity( "1_1", "some contained entity text" ); + containedEntity1_1.containing = indexed1; + indexed1.containedEntities.add( containedEntity1_1 ); + ContainedNonEntity containedNonEntity1_1 = new ContainedNonEntity( "some contained nonentity text" ); + indexed1.containedNonEntities.add( containedNonEntity1_1 ); + + IndexedEntity indexed2 = new IndexedEntity( "2", "some other text" ); + ContainedEntity containedEntity2_1 = new ContainedEntity( "2_1", "some other text" ); + containedEntity2_1.containing = indexed2; + indexed2.containedEntities.add( containedEntity2_1 ); + ContainedNonEntity containedNonEntity2_1 = new ContainedNonEntity( "some other text" ); + indexed2.containedNonEntities.add( containedNonEntity2_1 ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) + .matching( "entity text" ) ) + .fetchHits( 20 ) ) + .isEmpty(); + } + + with( sessionFactory ).runInTransaction( session -> { + session.persist( indexed1 ); + session.persist( containedEntity1_1 ); + session.persist( indexed2 ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .select( f -> f.id() ) + .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) + .matching( "entity" ) ) + .fetchHits( 20 ) ) + .containsExactlyInAnyOrder( indexed1.id ); + } + } + + @Entity + @Indexed + public static class IndexedEntity { + @Id + public String id; + @FullTextField(projectable = Projectable.YES) + public String text; + @OneToMany(mappedBy = "containing") + @IndexedEmbedded + public List containedEntities = new ArrayList<>(); + @ElementCollection + @IndexedEmbedded + public List containedNonEntities = new ArrayList<>(); + + public IndexedEntity() { + } + + public IndexedEntity(String id, String text) { + this.id = id; + this.text = text; + } + } + + @Entity + public static class ContainedEntity { + // Not setting @DocumentId here because it shouldn't be necessary + @Id + public String id; + @FullTextField + public String text; + @ManyToOne + public IndexedEntity containing; + + public ContainedEntity() { + } + + public ContainedEntity(String id, String text) { + this.id = id; + this.text = text; + } + } + + @Embeddable + public static class ContainedNonEntity { + @FullTextField(projectable = Projectable.YES) + public String text; + + public ContainedNonEntity() { + } + + public ContainedNonEntity(String text) { + this.text = text; + } + } +} diff --git a/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/FieldTypesIT.java b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/FieldTypesIT.java new file mode 100644 index 00000000000..99771017fd0 --- /dev/null +++ b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/FieldTypesIT.java @@ -0,0 +1,246 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.orm.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.MonthDay; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Year; +import java.time.YearMonth; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Transient; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.spatial.GeoPoint; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexingDependency; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.ScaledNumberField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class FieldTypesIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new ElasticsearchBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( FieldTypesEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .setup(); + } + + @Test + void smoke() { + with( sessionFactory ).runInTransaction( session -> { + session.persist( new FieldTypesEntity( 1L ) ); + session.persist( new FieldTypesEntity( 2L ) ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + FieldTypesIT_FieldTypesEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.bool() + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aText ).matching( "text" ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.keywordString ) + .matching( "keywordString" ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.bigDecimal ) + .matching( BigDecimal.TEN ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.bigInteger ) + .matching( BigInteger.ONE ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aBool ).matching( false ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aBoolean ).matching( true ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aByte ).matching( (byte) 1 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aDouble ).matching( 1.0 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aFloat ).matching( 1.0f ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aInt ).matching( 1 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLong ).matching( 10L ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aShort ).matching( (short) 2 ) ) + .should( f.spatial().within().field( FieldTypesIT_FieldTypesEntity__.INDEX.geoPoint ) + .circle( GeoPoint.of( 10.0, 20.0 ), 20.0 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anInstant ) + .matching( Instant.ofEpochMilli( 1000L ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalDate ) + .matching( LocalDate.of( 2000, 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalDateTime ) + .matching( LocalDateTime.of( 2000, 1, 1, 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalTime ) + .matching( LocalTime.of( 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aMonthDay ) + .matching( MonthDay.of( 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anOffsetDateTime ) + .matching( OffsetDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anOffsetTime ) + .matching( OffsetTime.of( LocalTime.of( 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aYear ) + .matching( Year.of( 2000 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aYearMonth ) + .matching( YearMonth.of( 2000, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aZonedDateTime ) + .matching( ZonedDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.knn( 10 ).field( FieldTypesIT_FieldTypesEntity__.INDEX.floatVector ) + .matching( new float[] { 1.0f, 2.0f, 3.0f } ) ) + .should( f.knn( 10 ).field( FieldTypesIT_FieldTypesEntity__.INDEX.byteVector ) + .matching( new byte[] { 1, 2, 3 } ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.myEnum ).matching( MyEnum.B ) ) + ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @Entity(name = "FieldTypesEntity") + @Indexed + public static class FieldTypesEntity { + @Id + public Long id; + @FullTextField + public String aText; + @KeywordField + public String keywordString; + @ScaledNumberField + public BigDecimal bigDecimal; + @ScaledNumberField + public BigInteger bigInteger; + @GenericField + public boolean aBool; + @GenericField + public Boolean aBoolean; + @GenericField + public byte aByte; + @GenericField + public double aDouble; + @GenericField + public float aFloat; + @GenericField + public int aInt; + @GenericField + public long aLong; + @GenericField + public short aShort; + @Transient + @IndexingDependency(reindexOnUpdate = ReindexOnUpdate.NO) + @GenericField + public GeoPoint geoPoint; + @GenericField + public Instant anInstant; + @GenericField + public LocalDate aLocalDate; + @GenericField + public LocalDateTime aLocalDateTime; + @GenericField + public LocalTime aLocalTime; + @GenericField + public MonthDay aMonthDay; + @GenericField + public OffsetDateTime anOffsetDateTime; + @GenericField + public OffsetTime anOffsetTime; + @GenericField + public Year aYear; + @GenericField + public YearMonth aYearMonth; + @GenericField + public ZonedDateTime aZonedDateTime; + + @VectorField(dimension = 3) + public float[] floatVector; + @VectorField(dimension = 3) + public byte[] byteVector; + + @KeywordField + public MyEnum myEnum; + + public FieldTypesEntity() { + } + + public FieldTypesEntity(Long id) { + this.id = id; + this.aText = "text"; + this.keywordString = "keywordString"; + this.bigDecimal = BigDecimal.TEN; + this.bigInteger = BigInteger.ONE; + this.aBool = false; + this.aBoolean = true; + this.aByte = 1; + this.aDouble = 1.0; + this.aFloat = 1.0f; + this.aInt = 1; + this.aLong = 10L; + this.aShort = 2; + this.geoPoint = GeoPoint.of( 10.0, 20.0 ); + this.anInstant = Instant.ofEpochMilli( 1000L ); + this.aLocalDate = LocalDate.of( 2000, 1, 1 ); + this.aLocalDateTime = LocalDateTime.of( 2000, 1, 1, 1, 1 ); + this.aLocalTime = LocalTime.of( 1, 1 ); + this.aMonthDay = MonthDay.of( 1, 1 ); + this.anOffsetDateTime = OffsetDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ); + this.anOffsetTime = OffsetTime.of( LocalTime.of( 1, 1 ), ZoneOffset.UTC ); + this.aYear = Year.of( 2000 ); + this.aYearMonth = YearMonth.of( 2000, 1 ); + this.aZonedDateTime = ZonedDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ); + this.floatVector = new float[] { 1.0f, 2.0f, 3.0f }; + this.byteVector = new byte[] { 1, 2, 3 }; + this.myEnum = MyEnum.B; + } + } + + public enum MyEnum { + A, B, C, D; + } + + @Entity + public static class ContainedEntity { + // Not setting @DocumentId here because it shouldn't be necessary + @Id + public String id; + @FullTextField + public String text; + @ManyToOne + public FieldTypesEntity containing; + + public ContainedEntity() { + } + + public ContainedEntity(String id, String text) { + this.id = id; + this.text = text; + } + } +} diff --git a/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/PredicateTypesIT.java b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/PredicateTypesIT.java new file mode 100644 index 00000000000..0c0a2e46c8b --- /dev/null +++ b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/PredicateTypesIT.java @@ -0,0 +1,133 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.orm.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Transient; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.spatial.GeoPoint; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexingDependency; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class PredicateTypesIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new ElasticsearchBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .setup(); + } + + @Test + void smoke() { + with( sessionFactory ).runInTransaction( session -> { + session.persist( new IndexedEntity( 1L ) ); + session.persist( new IndexedEntity( 2L ) ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + PredicateTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.bool() + .should( f.match().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.range().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).atLeast( "text" ) ) + .should( f.phrase().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.text ) ) + .should( f.wildcard().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "?ext" ) ) + .should( f.regexp().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "?ext" ) ) + .should( f.terms().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matchingAny( "text" ) ) + .should( f.simpleQueryString().field( PredicateTypesIT_IndexedEntity__.INDEX.text ) + .matching( "text" ) ) + .should( f.queryString().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.prefix().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "te" ) ) + + .should( f.spatial().within().field( PredicateTypesIT_IndexedEntity__.INDEX.geoPoint ) + .circle( GeoPoint.of( 10.0, 20.0 ), 20.0 ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.geoPoint ) ) + + .should( f.knn( 10 ).field( PredicateTypesIT_IndexedEntity__.INDEX.floatVector ) + .matching( new float[] { 1.0f, 2.0f, 3.0f } ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.floatVector ) ) + + .should( f.match().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( MyEnum.B ) ) + .should( f.range().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).atLeast( MyEnum.B ) ) + .should( f.phrase().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ) ) + .should( f.wildcard().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "?" ) ) + .should( f.regexp().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( ".+" ) ) + .should( f.terms().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matchingAny( MyEnum.B ) ) + .should( f.simpleQueryString().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ) + .matching( "B" ) ) + .should( f.queryString().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + .should( f.prefix().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @Entity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @Id + public Long id; + @FullTextField + public String text; + @Transient + @IndexingDependency(reindexOnUpdate = ReindexOnUpdate.NO) + @GenericField + public GeoPoint geoPoint; + @VectorField(dimension = 3) + public float[] floatVector; + @KeywordField + public MyEnum myEnum; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.text = "text"; + this.geoPoint = GeoPoint.of( 10.0, 20.0 ); + this.floatVector = new float[] { 1.0f, 2.0f, 3.0f }; + this.myEnum = MyEnum.B; + } + } + + public enum MyEnum { + A, B, C, D; + } + +} diff --git a/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/ProjectionTypesIT.java b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/ProjectionTypesIT.java new file mode 100644 index 00000000000..c23fd86e755 --- /dev/null +++ b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/ProjectionTypesIT.java @@ -0,0 +1,125 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.orm.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.time.LocalDate; +import java.util.HashSet; +import java.util.Set; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class ProjectionTypesIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new ElasticsearchBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class, ContainedEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .setup(); + } + + @Test + void smoke() { + with( sessionFactory ).runInTransaction( session -> { + session.persist( new IndexedEntity( 1L ) ); + session.persist( new IndexedEntity( 2L ) ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + ProjectionTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .select( f -> f.composite() + .from( + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.myText ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.myNumber ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.myDate ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.contained.text ).list() + ).asArray() ) + .where( f -> f.matchAll() ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @Entity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @Id + public Long id; + @KeywordField(projectable = Projectable.YES) + public String myText; + @GenericField(projectable = Projectable.YES) + public int myNumber; + @GenericField(projectable = Projectable.YES) + public LocalDate myDate; + @IndexedEmbedded + @OneToMany(mappedBy = "containing") + public Set contained; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.myText = "text"; + this.myDate = LocalDate.of( 2000, 1, 1 ); + this.contained = new HashSet<>(); + this.contained.add( new ContainedEntity( id + 100, this ) ); + } + } + + @Entity + public static class ContainedEntity { + // Not setting @DocumentId here because it shouldn't be necessary + @Id + public Long id; + @FullTextField(projectable = Projectable.YES) + public String text; + @ManyToOne + public IndexedEntity containing; + + public ContainedEntity() { + } + + public ContainedEntity(Long id, IndexedEntity indexedEntity) { + this.id = id; + this.text = "contained text"; + this.containing = indexedEntity; + } + } +} diff --git a/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/SortTypesIT.java b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/SortTypesIT.java new file mode 100644 index 00000000000..ba31c3936f1 --- /dev/null +++ b/integrationtest/metamodel/orm-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/elasticsearch/SortTypesIT.java @@ -0,0 +1,115 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.orm.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.time.LocalDate; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.backend.types.Sortable; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class SortTypesIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new ElasticsearchBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .setup(); + } + + @Test + void smoke() { + with( sessionFactory ).runInTransaction( session -> { + session.persist( new IndexedEntity( 1L ) ); + session.persist( new IndexedEntity( 2L ) ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + SortTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .sort( f -> f.field( SortTypesIT_IndexedEntity__.INDEX.myNumber ).asc().missing().use( 5 ) ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .sort( f -> f.field( SortTypesIT_IndexedEntity__.INDEX.myDate ).asc().missing() + .use( LocalDate.of( 2000, 1, 1 ) ) ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @Entity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @Id + public Long id; + @KeywordField(sortable = Sortable.YES) + public String myText; + @GenericField(sortable = Sortable.YES) + public int myNumber; + @GenericField(sortable = Sortable.YES) + public LocalDate myDate; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.myText = "text"; + } + } + + @Entity + public static class ContainedEntity { + // Not setting @DocumentId here because it shouldn't be necessary + @Id + public String id; + @FullTextField + public String text; + @ManyToOne + public IndexedEntity containing; + + public ContainedEntity() { + } + + public ContainedEntity(String id, String text) { + this.id = id; + this.text = text; + } + } +} diff --git a/integrationtest/metamodel/orm-lucene/pom.xml b/integrationtest/metamodel/orm-lucene/pom.xml index 69f5156b730..1a554f23bb0 100644 --- a/integrationtest/metamodel/orm-lucene/pom.xml +++ b/integrationtest/metamodel/orm-lucene/pom.xml @@ -61,7 +61,6 @@ default-testCompile - false full org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor diff --git a/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/AggregationTypesIT.java b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/AggregationTypesIT.java new file mode 100644 index 00000000000..48d96300e57 --- /dev/null +++ b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/AggregationTypesIT.java @@ -0,0 +1,111 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.orm.lucene; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.time.LocalDate; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.backend.types.Aggregable; +import org.hibernate.search.engine.search.aggregation.AggregationKey; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class AggregationTypesIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new LuceneBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .setup(); + } + + @Test + void smoke() { + with( sessionFactory ).runInTransaction( session -> { + session.persist( new IndexedEntity( 1L ) ); + session.persist( new IndexedEntity( 2L ) ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + AggregationTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .aggregation( AggregationKey.of( "range" ), + f -> f.terms().field( AggregationTypesIT_IndexedEntity__.INDEX.myText ) ) + + .aggregation( AggregationKey.of( "sum" ), + f -> f.sum().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "count" ), + f -> f.count().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "countDistinct" ), + f -> f.countDistinct().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "min" ), + f -> f.min().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "max" ), + f -> f.max().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "avg" ), + f -> f.avg().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "terms" ), + f -> f.terms().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ) ) + .aggregation( AggregationKey.of( "range2" ), + f -> f.range().field( AggregationTypesIT_IndexedEntity__.INDEX.myNumber ).range( 1, 2 ) ) + + .aggregation( AggregationKey.of( "range3" ), + f -> f.range().field( AggregationTypesIT_IndexedEntity__.INDEX.myDate ).range( LocalDate.MIN, + LocalDate.MAX ) ) + + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @Entity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @Id + public Long id; + @KeywordField(aggregable = Aggregable.YES) + public String myText; + @GenericField(aggregable = Aggregable.YES) + public int myNumber; + @GenericField(aggregable = Aggregable.YES) + public LocalDate myDate; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.myText = "text"; + } + } +} diff --git a/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/EntityAsTreeSmokeIT.java similarity index 90% rename from integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java rename to integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/EntityAsTreeSmokeIT.java index f37536b4b4c..620ccaa55f8 100644 --- a/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java +++ b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/EntityAsTreeSmokeIT.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.integrationtest.metamodel.standalone.lucene; +package org.hibernate.search.integrationtest.metamodel.orm.lucene; import static org.assertj.core.api.Assertions.assertThat; import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; @@ -20,11 +20,13 @@ import org.hibernate.SessionFactory; import org.hibernate.search.engine.backend.types.Projectable; import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; import org.hibernate.search.mapper.orm.scope.SearchScope; import org.hibernate.search.mapper.orm.session.SearchSession; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; @@ -43,6 +45,8 @@ class EntityAsTreeSmokeIT { void setup() { sessionFactory = setupHelper.start() .withAnnotatedTypes( ContainedNonEntity.class, IndexedEntity.class, ContainedEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) .setup(); } @@ -64,7 +68,8 @@ void indexAndSearch() { try ( var s = sessionFactory.openSession() ) { SearchSession session = Search.session( s ); - SearchScope scope = EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + SearchScope scope = + EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); assertThat( session.search( scope ) .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) .matching( "entity text" ) ) @@ -80,7 +85,8 @@ void indexAndSearch() { try ( var s = sessionFactory.openSession() ) { SearchSession session = Search.session( s ); - SearchScope scope = EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + SearchScope scope = + EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); assertThat( session.search( scope ) .select( f -> f.id() ) .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) diff --git a/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/FieldTypesIT.java b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/FieldTypesIT.java new file mode 100644 index 00000000000..b982f17720a --- /dev/null +++ b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/FieldTypesIT.java @@ -0,0 +1,246 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.orm.lucene; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.MonthDay; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Year; +import java.time.YearMonth; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Transient; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.spatial.GeoPoint; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexingDependency; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.ScaledNumberField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class FieldTypesIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new LuceneBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( FieldTypesEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .setup(); + } + + @Test + void smoke() { + with( sessionFactory ).runInTransaction( session -> { + session.persist( new FieldTypesEntity( 1L ) ); + session.persist( new FieldTypesEntity( 2L ) ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + FieldTypesIT_FieldTypesEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.bool() + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aText ).matching( "text" ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.keywordString ) + .matching( "keywordString" ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.bigDecimal ) + .matching( BigDecimal.TEN ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.bigInteger ) + .matching( BigInteger.ONE ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aBool ).matching( false ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aBoolean ).matching( true ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aByte ).matching( (byte) 1 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aDouble ).matching( 1.0 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aFloat ).matching( 1.0f ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aInt ).matching( 1 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLong ).matching( 10L ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aShort ).matching( (short) 2 ) ) + .should( f.spatial().within().field( FieldTypesIT_FieldTypesEntity__.INDEX.geoPoint ) + .circle( GeoPoint.of( 10.0, 20.0 ), 20.0 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anInstant ) + .matching( Instant.ofEpochMilli( 1000L ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalDate ) + .matching( LocalDate.of( 2000, 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalDateTime ) + .matching( LocalDateTime.of( 2000, 1, 1, 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalTime ) + .matching( LocalTime.of( 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aMonthDay ) + .matching( MonthDay.of( 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anOffsetDateTime ) + .matching( OffsetDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anOffsetTime ) + .matching( OffsetTime.of( LocalTime.of( 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aYear ) + .matching( Year.of( 2000 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aYearMonth ) + .matching( YearMonth.of( 2000, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aZonedDateTime ) + .matching( ZonedDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.knn( 10 ).field( FieldTypesIT_FieldTypesEntity__.INDEX.floatVector ) + .matching( new float[] { 1.0f, 2.0f, 3.0f } ) ) + .should( f.knn( 10 ).field( FieldTypesIT_FieldTypesEntity__.INDEX.byteVector ) + .matching( new byte[] { 1, 2, 3 } ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.myEnum ).matching( MyEnum.B ) ) + ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @Entity(name = "FieldTypesEntity") + @Indexed + public static class FieldTypesEntity { + @Id + public Long id; + @FullTextField + public String aText; + @KeywordField + public String keywordString; + @ScaledNumberField + public BigDecimal bigDecimal; + @ScaledNumberField + public BigInteger bigInteger; + @GenericField + public boolean aBool; + @GenericField + public Boolean aBoolean; + @GenericField + public byte aByte; + @GenericField + public double aDouble; + @GenericField + public float aFloat; + @GenericField + public int aInt; + @GenericField + public long aLong; + @GenericField + public short aShort; + @Transient + @IndexingDependency(reindexOnUpdate = ReindexOnUpdate.NO) + @GenericField + public GeoPoint geoPoint; + @GenericField + public Instant anInstant; + @GenericField + public LocalDate aLocalDate; + @GenericField + public LocalDateTime aLocalDateTime; + @GenericField + public LocalTime aLocalTime; + @GenericField + public MonthDay aMonthDay; + @GenericField + public OffsetDateTime anOffsetDateTime; + @GenericField + public OffsetTime anOffsetTime; + @GenericField + public Year aYear; + @GenericField + public YearMonth aYearMonth; + @GenericField + public ZonedDateTime aZonedDateTime; + + @VectorField(dimension = 3) + public float[] floatVector; + @VectorField(dimension = 3) + public byte[] byteVector; + + @KeywordField + public MyEnum myEnum; + + public FieldTypesEntity() { + } + + public FieldTypesEntity(Long id) { + this.id = id; + this.aText = "text"; + this.keywordString = "keywordString"; + this.bigDecimal = BigDecimal.TEN; + this.bigInteger = BigInteger.ONE; + this.aBool = false; + this.aBoolean = true; + this.aByte = 1; + this.aDouble = 1.0; + this.aFloat = 1.0f; + this.aInt = 1; + this.aLong = 10L; + this.aShort = 2; + this.geoPoint = GeoPoint.of( 10.0, 20.0 ); + this.anInstant = Instant.ofEpochMilli( 1000L ); + this.aLocalDate = LocalDate.of( 2000, 1, 1 ); + this.aLocalDateTime = LocalDateTime.of( 2000, 1, 1, 1, 1 ); + this.aLocalTime = LocalTime.of( 1, 1 ); + this.aMonthDay = MonthDay.of( 1, 1 ); + this.anOffsetDateTime = OffsetDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ); + this.anOffsetTime = OffsetTime.of( LocalTime.of( 1, 1 ), ZoneOffset.UTC ); + this.aYear = Year.of( 2000 ); + this.aYearMonth = YearMonth.of( 2000, 1 ); + this.aZonedDateTime = ZonedDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ); + this.floatVector = new float[] { 1.0f, 2.0f, 3.0f }; + this.byteVector = new byte[] { 1, 2, 3 }; + this.myEnum = MyEnum.B; + } + } + + public enum MyEnum { + A, B, C, D; + } + + @Entity + public static class ContainedEntity { + // Not setting @DocumentId here because it shouldn't be necessary + @Id + public String id; + @FullTextField + public String text; + @ManyToOne + public FieldTypesEntity containing; + + public ContainedEntity() { + } + + public ContainedEntity(String id, String text) { + this.id = id; + this.text = text; + } + } +} diff --git a/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/PredicateTypesIT.java b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/PredicateTypesIT.java new file mode 100644 index 00000000000..c4128813987 --- /dev/null +++ b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/PredicateTypesIT.java @@ -0,0 +1,133 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.orm.lucene; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Transient; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.spatial.GeoPoint; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexingDependency; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class PredicateTypesIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new LuceneBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .setup(); + } + + @Test + void smoke() { + with( sessionFactory ).runInTransaction( session -> { + session.persist( new IndexedEntity( 1L ) ); + session.persist( new IndexedEntity( 2L ) ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + PredicateTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.bool() + .should( f.match().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.range().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).atLeast( "text" ) ) + .should( f.phrase().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.text ) ) + .should( f.wildcard().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "?ext" ) ) + .should( f.regexp().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "?ext" ) ) + .should( f.terms().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matchingAny( "text" ) ) + .should( f.simpleQueryString().field( PredicateTypesIT_IndexedEntity__.INDEX.text ) + .matching( "text" ) ) + .should( f.queryString().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.prefix().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "te" ) ) + + .should( f.spatial().within().field( PredicateTypesIT_IndexedEntity__.INDEX.geoPoint ) + .circle( GeoPoint.of( 10.0, 20.0 ), 20.0 ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.geoPoint ) ) + + .should( f.knn( 10 ).field( PredicateTypesIT_IndexedEntity__.INDEX.floatVector ) + .matching( new float[] { 1.0f, 2.0f, 3.0f } ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.floatVector ) ) + + .should( f.match().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( MyEnum.B ) ) + .should( f.range().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).atLeast( MyEnum.B ) ) + .should( f.phrase().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ) ) + .should( f.wildcard().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "?" ) ) + .should( f.regexp().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( ".+" ) ) + .should( f.terms().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matchingAny( MyEnum.B ) ) + .should( f.simpleQueryString().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ) + .matching( "B" ) ) + .should( f.queryString().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + .should( f.prefix().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @Entity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @Id + public Long id; + @FullTextField + public String text; + @Transient + @IndexingDependency(reindexOnUpdate = ReindexOnUpdate.NO) + @GenericField + public GeoPoint geoPoint; + @VectorField(dimension = 3) + public float[] floatVector; + @KeywordField + public MyEnum myEnum; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.text = "text"; + this.geoPoint = GeoPoint.of( 10.0, 20.0 ); + this.floatVector = new float[] { 1.0f, 2.0f, 3.0f }; + this.myEnum = MyEnum.B; + } + } + + public enum MyEnum { + A, B, C, D; + } + +} diff --git a/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/ProjectionTypesIT.java b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/ProjectionTypesIT.java new file mode 100644 index 00000000000..36dbb60db91 --- /dev/null +++ b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/ProjectionTypesIT.java @@ -0,0 +1,125 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.orm.lucene; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.time.LocalDate; +import java.util.HashSet; +import java.util.Set; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class ProjectionTypesIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new LuceneBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class, ContainedEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .setup(); + } + + @Test + void smoke() { + with( sessionFactory ).runInTransaction( session -> { + session.persist( new IndexedEntity( 1L ) ); + session.persist( new IndexedEntity( 2L ) ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + ProjectionTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .select( f -> f.composite() + .from( + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.myText ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.myNumber ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.myDate ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.contained.text ).list() + ).asArray() ) + .where( f -> f.matchAll() ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @Entity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @Id + public Long id; + @KeywordField(projectable = Projectable.YES) + public String myText; + @GenericField(projectable = Projectable.YES) + public int myNumber; + @GenericField(projectable = Projectable.YES) + public LocalDate myDate; + @IndexedEmbedded + @OneToMany(mappedBy = "containing") + public Set contained; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.myText = "text"; + this.myDate = LocalDate.of( 2000, 1, 1 ); + this.contained = new HashSet<>(); + this.contained.add( new ContainedEntity( id + 100, this ) ); + } + } + + @Entity + public static class ContainedEntity { + // Not setting @DocumentId here because it shouldn't be necessary + @Id + public Long id; + @FullTextField(projectable = Projectable.YES) + public String text; + @ManyToOne + public IndexedEntity containing; + + public ContainedEntity() { + } + + public ContainedEntity(Long id, IndexedEntity indexedEntity) { + this.id = id; + this.text = "contained text"; + this.containing = indexedEntity; + } + } +} diff --git a/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/SortTypesIT.java b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/SortTypesIT.java new file mode 100644 index 00000000000..3150847e2a8 --- /dev/null +++ b/integrationtest/metamodel/orm-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/orm/lucene/SortTypesIT.java @@ -0,0 +1,94 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.orm.lucene; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.time.LocalDate; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +import org.hibernate.SessionFactory; +import org.hibernate.search.engine.backend.types.Sortable; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.cfg.HibernateOrmMapperSettings; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class SortTypesIT { + + @RegisterExtension + public OrmSetupHelper setupHelper = OrmSetupHelper.withSingleBackend( new LuceneBackendConfiguration() ); + + private SessionFactory sessionFactory; + + @BeforeEach + void setup() { + sessionFactory = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class ) + .withProperty( HibernateOrmMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .setup(); + } + + @Test + void smoke() { + with( sessionFactory ).runInTransaction( session -> { + session.persist( new IndexedEntity( 1L ) ); + session.persist( new IndexedEntity( 2L ) ); + } ); + + try ( var s = sessionFactory.openSession() ) { + SearchSession session = Search.session( s ); + SearchScope scope = + SortTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .sort( f -> f.field( SortTypesIT_IndexedEntity__.INDEX.myNumber ).asc().missing().use( 5 ) ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .sort( f -> f.field( SortTypesIT_IndexedEntity__.INDEX.myDate ).asc().missing() + .use( LocalDate.of( 2000, 1, 1 ) ) ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @Entity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @Id + public Long id; + @KeywordField(sortable = Sortable.YES) + public String myText; + @GenericField(sortable = Sortable.YES) + public int myNumber; + @GenericField(sortable = Sortable.YES) + public LocalDate myDate; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.myText = "text"; + } + } +} diff --git a/integrationtest/metamodel/standalone-elasticsearch/pom.xml b/integrationtest/metamodel/standalone-elasticsearch/pom.xml index 7ec461ba833..55b9aa970f3 100644 --- a/integrationtest/metamodel/standalone-elasticsearch/pom.xml +++ b/integrationtest/metamodel/standalone-elasticsearch/pom.xml @@ -52,7 +52,6 @@ default-testCompile - false full org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor diff --git a/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/AggregationTypesIT.java b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/AggregationTypesIT.java new file mode 100644 index 00000000000..ecfd826c3c9 --- /dev/null +++ b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/AggregationTypesIT.java @@ -0,0 +1,151 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.search.engine.backend.types.Aggregable; +import org.hibernate.search.engine.search.aggregation.AggregationKey; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class AggregationTypesIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new ElasticsearchBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .withAnnotatedTypes( IndexedEntity.class ) + .withConfiguration( b -> b.programmaticMapping() + .type( IndexedEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( IndexedEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void smoke() { + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + IndexedEntity entity1 = new IndexedEntity( 1L ); + IndexedEntity entity2 = new IndexedEntity( 2L ); + session.indexingPlan().add( entity1 ); + session.indexingPlan().add( entity2 ); + simulatedIndexedEntityDatastore.put( entity1.id, entity1 ); + simulatedIndexedEntityDatastore.put( entity2.id, entity2 ); + } + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = + AggregationTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .aggregation( AggregationKey.of( "range" ), + f -> f.terms().field( AggregationTypesIT_IndexedEntity__.INDEX.text ) ) + + .aggregation( AggregationKey.of( "sum" ), + f -> f.sum().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "count" ), + f -> f.count().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "countDistinct" ), + f -> f.countDistinct().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "min" ), + f -> f.min().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "max" ), + f -> f.max().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "avg" ), + f -> f.avg().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "terms" ), + f -> f.terms().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "range2" ), + f -> f.range().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) + .range( 1, 20 ) + .range( 20, 50 ) ) + + // NOTE: OpenSearch has issues with having this range aggregation with other range ones >_< + // hence we'll test it in the other query: + // .aggregation( AggregationKey.of( "range3" ), + // f -> f.range().field( AggregationTypesIT_IndexedEntity__.INDEX.myDate ) + // .range( LocalDate.of( 1999, 1, 1 ), + // LocalDate.of( 2000, 1, 1 ) ) + // .range( LocalDate.of( 2000, 1, 1 ), + // LocalDate.of( 2010, 1, 1 ) )) + + .fetchHits( 20 ) ) + .hasSize( 2 ); + + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .aggregation( AggregationKey.of( "range3" ), + f -> f.range().field( AggregationTypesIT_IndexedEntity__.INDEX.myDate ) + .range( LocalDate.of( 1999, 1, 1 ), + LocalDate.of( 2000, 1, 1 ) ) + .range( LocalDate.of( 2000, 1, 1 ), + LocalDate.of( 2010, 1, 1 ) ) + ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @SearchEntity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @DocumentId + public Long id; + @KeywordField(aggregable = Aggregable.YES) + public String text; + @GenericField(aggregable = Aggregable.YES) + public int number; + @GenericField(aggregable = Aggregable.YES) + public LocalDate myDate; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.text = "text"; + } + } +} diff --git a/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/EntityAsTreeSmokeIT.java similarity index 95% rename from integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java rename to integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/EntityAsTreeSmokeIT.java index c9f284cf8a0..dce1d70335c 100644 --- a/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java +++ b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/EntityAsTreeSmokeIT.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.integrationtest.metamodel.standalone.lucene; +package org.hibernate.search.integrationtest.metamodel.standalone.elasticsearch; import static org.assertj.core.api.Assertions.assertThat; @@ -19,12 +19,14 @@ import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; @@ -47,6 +49,8 @@ class EntityAsTreeSmokeIT { void setup() { mapping = setupHelper.start() .withAnnotatedTypes( ContainedNonEntity.class, IndexedEntity.class, ContainedEntity.class ) + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) .withConfiguration( b -> b.programmaticMapping() .type( IndexedEntity.class ) .searchEntity() diff --git a/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/FieldTypesIT.java b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/FieldTypesIT.java new file mode 100644 index 00000000000..9929d1235e9 --- /dev/null +++ b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/FieldTypesIT.java @@ -0,0 +1,242 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.MonthDay; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Year; +import java.time.YearMonth; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.search.engine.spatial.GeoPoint; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.ScaledNumberField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class FieldTypesIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new ElasticsearchBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withAnnotatedTypes( FieldTypesEntity.class ) + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .withConfiguration( b -> b.programmaticMapping() + .type( FieldTypesEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( FieldTypesEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void smoke() { + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + FieldTypesEntity entity1 = new FieldTypesEntity( 1L ); + FieldTypesEntity entity2 = new FieldTypesEntity( 2L ); + session.indexingPlan().add( entity1 ); + session.indexingPlan().add( entity2 ); + simulatedIndexedEntityDatastore.put( entity1.id, entity1 ); + simulatedIndexedEntityDatastore.put( entity2.id, entity2 ); + } + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = + FieldTypesIT_FieldTypesEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.bool() + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aText ).matching( "text" ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.keywordString ) + .matching( "keywordString" ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.bigDecimal ) + .matching( BigDecimal.TEN ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.bigInteger ) + .matching( BigInteger.ONE ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aBool ).matching( false ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aBoolean ).matching( true ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aByte ).matching( (byte) 1 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aDouble ).matching( 1.0 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aFloat ).matching( 1.0f ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aInt ).matching( 1 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLong ).matching( 10L ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aShort ).matching( (short) 2 ) ) + .should( f.spatial().within().field( FieldTypesIT_FieldTypesEntity__.INDEX.geoPoint ) + .circle( GeoPoint.of( 10.0, 20.0 ), 20.0 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anInstant ) + .matching( Instant.ofEpochMilli( 1000L ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalDate ) + .matching( LocalDate.of( 2000, 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalDateTime ) + .matching( LocalDateTime.of( 2000, 1, 1, 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalTime ) + .matching( LocalTime.of( 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aMonthDay ) + .matching( MonthDay.of( 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anOffsetDateTime ) + .matching( OffsetDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anOffsetTime ) + .matching( OffsetTime.of( LocalTime.of( 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aYear ) + .matching( Year.of( 2000 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aYearMonth ) + .matching( YearMonth.of( 2000, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aZonedDateTime ) + .matching( ZonedDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.knn( 10 ).field( FieldTypesIT_FieldTypesEntity__.INDEX.floatVector ) + .matching( new float[] { 1.0f, 2.0f, 3.0f } ) ) + .should( f.knn( 10 ).field( FieldTypesIT_FieldTypesEntity__.INDEX.byteVector ) + .matching( new byte[] { 1, 2, 3 } ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.myEnum ).matching( MyEnum.B ) ) + ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @SearchEntity(name = "FieldTypesEntity") + @Indexed + public static class FieldTypesEntity { + @DocumentId + public Long id; + @FullTextField + public String aText; + @KeywordField + public String keywordString; + @ScaledNumberField(decimalScale = 0) + public BigDecimal bigDecimal; + @ScaledNumberField(decimalScale = 0) + public BigInteger bigInteger; + @GenericField + public boolean aBool; + @GenericField + public Boolean aBoolean; + @GenericField + public byte aByte; + @GenericField + public double aDouble; + @GenericField + public float aFloat; + @GenericField + public int aInt; + @GenericField + public long aLong; + @GenericField + public short aShort; + @GenericField + public GeoPoint geoPoint; + @GenericField + public Instant anInstant; + @GenericField + public LocalDate aLocalDate; + @GenericField + public LocalDateTime aLocalDateTime; + @GenericField + public LocalTime aLocalTime; + @GenericField + public MonthDay aMonthDay; + @GenericField + public OffsetDateTime anOffsetDateTime; + @GenericField + public OffsetTime anOffsetTime; + @GenericField + public Year aYear; + @GenericField + public YearMonth aYearMonth; + @GenericField + public ZonedDateTime aZonedDateTime; + + @VectorField(dimension = 3) + public float[] floatVector; + @VectorField(dimension = 3) + public byte[] byteVector; + + @KeywordField + public MyEnum myEnum; + + public FieldTypesEntity() { + } + + public FieldTypesEntity(Long id) { + this.id = id; + this.aText = "text"; + this.keywordString = "keywordString"; + this.bigDecimal = BigDecimal.TEN; + this.bigInteger = BigInteger.ONE; + this.aBool = false; + this.aBoolean = true; + this.aByte = 1; + this.aDouble = 1.0; + this.aFloat = 1.0f; + this.aInt = 1; + this.aLong = 10L; + this.aShort = 2; + this.geoPoint = GeoPoint.of( 10.0, 20.0 ); + this.anInstant = Instant.ofEpochMilli( 1000L ); + this.aLocalDate = LocalDate.of( 2000, 1, 1 ); + this.aLocalDateTime = LocalDateTime.of( 2000, 1, 1, 1, 1 ); + this.aLocalTime = LocalTime.of( 1, 1 ); + this.aMonthDay = MonthDay.of( 1, 1 ); + this.anOffsetDateTime = OffsetDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ); + this.anOffsetTime = OffsetTime.of( LocalTime.of( 1, 1 ), ZoneOffset.UTC ); + this.aYear = Year.of( 2000 ); + this.aYearMonth = YearMonth.of( 2000, 1 ); + this.aZonedDateTime = ZonedDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ); + this.floatVector = new float[] { 1.0f, 2.0f, 3.0f }; + this.byteVector = new byte[] { 1, 2, 3 }; + this.myEnum = MyEnum.B; + } + } + + public enum MyEnum { + A, B, C, D; + } +} diff --git a/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/PredicateTypesIT.java b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/PredicateTypesIT.java new file mode 100644 index 00000000000..4bfceae9178 --- /dev/null +++ b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/PredicateTypesIT.java @@ -0,0 +1,150 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.search.engine.spatial.GeoPoint; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class PredicateTypesIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new ElasticsearchBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class ) + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .withConfiguration( b -> b.programmaticMapping() + .type( IndexedEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( IndexedEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void smoke() { + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + IndexedEntity entity1 = new IndexedEntity( 1L ); + IndexedEntity entity2 = new IndexedEntity( 2L ); + session.indexingPlan().add( entity1 ); + session.indexingPlan().add( entity2 ); + simulatedIndexedEntityDatastore.put( entity1.id, entity1 ); + simulatedIndexedEntityDatastore.put( entity2.id, entity2 ); + } + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = + PredicateTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.bool() + .should( f.match().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.range().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).atLeast( "text" ) ) + .should( f.phrase().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.text ) ) + .should( f.wildcard().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "?ext" ) ) + .should( f.regexp().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "?ext" ) ) + .should( f.terms().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matchingAny( "text" ) ) + .should( f.simpleQueryString().field( PredicateTypesIT_IndexedEntity__.INDEX.text ) + .matching( "text" ) ) + .should( f.queryString().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.prefix().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "te" ) ) + + .should( f.spatial().within().field( PredicateTypesIT_IndexedEntity__.INDEX.geoPoint ) + .circle( GeoPoint.of( 10.0, 20.0 ), 20.0 ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.geoPoint ) ) + + .should( f.knn( 10 ).field( PredicateTypesIT_IndexedEntity__.INDEX.floatVector ) + .matching( new float[] { 1.0f, 2.0f, 3.0f } ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.floatVector ) ) + + .should( f.match().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( MyEnum.B ) ) + .should( f.range().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).atLeast( MyEnum.B ) ) + .should( f.phrase().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ) ) + .should( f.wildcard().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "?" ) ) + .should( f.regexp().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( ".+" ) ) + .should( f.terms().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matchingAny( MyEnum.B ) ) + .should( f.simpleQueryString().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ) + .matching( "B" ) ) + .should( f.queryString().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + .should( f.prefix().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @SearchEntity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @DocumentId + public Long id; + @FullTextField + public String text; + @GenericField + public GeoPoint geoPoint; + @VectorField(dimension = 3) + public float[] floatVector; + @KeywordField + public MyEnum myEnum; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.text = "text"; + this.geoPoint = GeoPoint.of( 10.0, 20.0 ); + this.floatVector = new float[] { 1.0f, 2.0f, 3.0f }; + this.myEnum = MyEnum.B; + } + } + + public enum MyEnum { + A, B, C, D; + } + +} diff --git a/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/ProjectionTypesIT.java b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/ProjectionTypesIT.java new file mode 100644 index 00000000000..79eacd7e98c --- /dev/null +++ b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/ProjectionTypesIT.java @@ -0,0 +1,140 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class ProjectionTypesIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new ElasticsearchBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class, ContainedEntity.class ) + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .withConfiguration( b -> b.programmaticMapping() + .type( IndexedEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( IndexedEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void smoke() { + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + IndexedEntity entity1 = new IndexedEntity( 1L ); + IndexedEntity entity2 = new IndexedEntity( 2L ); + session.indexingPlan().add( entity1 ); + session.indexingPlan().add( entity2 ); + simulatedIndexedEntityDatastore.put( entity1.id, entity1 ); + simulatedIndexedEntityDatastore.put( entity2.id, entity2 ); + } + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = + ProjectionTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .select( f -> f.composite() + .from( + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.text ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.number ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.myDate ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.contained.text ).list() + ).asArray() ) + .where( f -> f.matchAll() ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @SearchEntity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @DocumentId + public Long id; + @KeywordField(projectable = Projectable.YES) + public String text; + @GenericField(projectable = Projectable.YES) + public int number; + @GenericField(projectable = Projectable.YES) + public LocalDate myDate; + @IndexedEmbedded + public Set contained; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.text = "text"; + this.myDate = LocalDate.of( 2000, 1, 1 ); + this.contained = new HashSet<>(); + this.contained.add( new ContainedEntity( id + 100, this ) ); + } + } + + public static class ContainedEntity { + // Not setting @DocumentId here because it shouldn't be necessary + public Long id; + @FullTextField(projectable = Projectable.YES) + public String text; + public IndexedEntity containing; + + public ContainedEntity() { + } + + public ContainedEntity(Long id, IndexedEntity indexedEntity) { + this.id = id; + this.text = "contained text"; + this.containing = indexedEntity; + } + } +} diff --git a/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/SortTypesIT.java b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/SortTypesIT.java new file mode 100644 index 00000000000..ce59ace9c22 --- /dev/null +++ b/integrationtest/metamodel/standalone-elasticsearch/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/elasticsearch/SortTypesIT.java @@ -0,0 +1,115 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.search.engine.backend.types.Sortable; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.elasticsearch.ElasticsearchBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class SortTypesIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new ElasticsearchBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class ) + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .withConfiguration( b -> b.programmaticMapping() + .type( IndexedEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( IndexedEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void smoke() { + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + IndexedEntity entity1 = new IndexedEntity( 1L ); + IndexedEntity entity2 = new IndexedEntity( 2L ); + session.indexingPlan().add( entity1 ); + session.indexingPlan().add( entity2 ); + simulatedIndexedEntityDatastore.put( entity1.id, entity1 ); + simulatedIndexedEntityDatastore.put( entity2.id, entity2 ); + } + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = + SortTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .sort( f -> f.field( SortTypesIT_IndexedEntity__.INDEX.number ).asc().missing().use( 5 ) ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .sort( f -> f.field( SortTypesIT_IndexedEntity__.INDEX.myDate ).asc().missing() + .use( LocalDate.of( 2000, 1, 1 ) ) ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @SearchEntity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @DocumentId + public Long id; + @KeywordField(sortable = Sortable.YES) + public String text; + @GenericField(sortable = Sortable.YES) + public int number; + @GenericField(sortable = Sortable.YES) + public LocalDate myDate; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.text = "text"; + } + } +} diff --git a/integrationtest/metamodel/standalone-lucene/pom.xml b/integrationtest/metamodel/standalone-lucene/pom.xml index 6d6b6aece65..b6d1fb51dc2 100644 --- a/integrationtest/metamodel/standalone-lucene/pom.xml +++ b/integrationtest/metamodel/standalone-lucene/pom.xml @@ -52,7 +52,6 @@ default-testCompile - false full org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor diff --git a/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/AggregationTypesIT.java b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/AggregationTypesIT.java new file mode 100644 index 00000000000..8eefd90c167 --- /dev/null +++ b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/AggregationTypesIT.java @@ -0,0 +1,132 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.lucene; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.search.engine.backend.types.Aggregable; +import org.hibernate.search.engine.search.aggregation.AggregationKey; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class AggregationTypesIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new LuceneBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class ) + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .withConfiguration( b -> b.programmaticMapping() + .type( IndexedEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( IndexedEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void smoke() { + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + IndexedEntity entity1 = new IndexedEntity( 1L ); + IndexedEntity entity2 = new IndexedEntity( 2L ); + session.indexingPlan().add( entity1 ); + session.indexingPlan().add( entity2 ); + simulatedIndexedEntityDatastore.put( entity1.id, entity1 ); + simulatedIndexedEntityDatastore.put( entity2.id, entity2 ); + } + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = + AggregationTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .aggregation( AggregationKey.of( "range" ), + f -> f.terms().field( AggregationTypesIT_IndexedEntity__.INDEX.text ) ) + + .aggregation( AggregationKey.of( "sum" ), + f -> f.sum().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "count" ), + f -> f.count().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "countDistinct" ), + f -> f.countDistinct().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "min" ), + f -> f.min().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "max" ), + f -> f.max().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "avg" ), + f -> f.avg().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "terms" ), + f -> f.terms().field( AggregationTypesIT_IndexedEntity__.INDEX.number ) ) + .aggregation( AggregationKey.of( "range2" ), + f -> f.range().field( AggregationTypesIT_IndexedEntity__.INDEX.number ).range( 1, 2 ) ) + + .aggregation( AggregationKey.of( "range3" ), + f -> f.range().field( AggregationTypesIT_IndexedEntity__.INDEX.myDate ).range( LocalDate.MIN, + LocalDate.MAX ) ) + + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @SearchEntity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @DocumentId + public Long id; + @KeywordField(aggregable = Aggregable.YES) + public String text; + @GenericField(aggregable = Aggregable.YES) + public int number; + @GenericField(aggregable = Aggregable.YES) + public LocalDate myDate; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.text = "text"; + } + } +} diff --git a/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java index b9a95857058..ed8bbbb7d0c 100644 --- a/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java +++ b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/EntityAsTreeSmokeIT.java @@ -19,12 +19,14 @@ import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; @@ -47,6 +49,8 @@ class EntityAsTreeSmokeIT { void setup() { mapping = setupHelper.start() .withAnnotatedTypes( ContainedNonEntity.class, IndexedEntity.class, ContainedEntity.class ) + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) .withConfiguration( b -> b.programmaticMapping() .type( IndexedEntity.class ) .searchEntity() @@ -75,7 +79,8 @@ void indexAndSearch() { indexed2.containedNonEntities.add( containedNonEntity2_1 ); try ( SearchSession session = mapping.createSession() ) { - SearchScope scope = EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + SearchScope scope = + EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); assertThat( session.search( scope ) .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) .matching( "entity text" ) ) @@ -91,7 +96,8 @@ void indexAndSearch() { simulatedIndexedEntityDatastore.put( indexed2.id, indexed2 ); } try ( SearchSession session = mapping.createSession() ) { - SearchScope scope = EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + SearchScope scope = + EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); assertThat( session.search( scope ) .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) .matching( "entity" ) ) @@ -104,7 +110,8 @@ void indexAndSearch() { session.indexingPlan().delete( indexed1 ); } try ( SearchSession session = mapping.createSession() ) { - SearchScope scope = EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); + SearchScope scope = + EntityAsTreeSmokeIT_IndexedEntity__.INDEX.scope( session ); assertThat( session.search( scope ) .where( f -> f.match().field( EntityAsTreeSmokeIT_IndexedEntity__.INDEX.containedEntities.text ) .matching( "entity text" ) ) diff --git a/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/FieldTypesIT.java b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/FieldTypesIT.java new file mode 100644 index 00000000000..9ec2a447b90 --- /dev/null +++ b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/FieldTypesIT.java @@ -0,0 +1,242 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.lucene; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.MonthDay; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Year; +import java.time.YearMonth; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.search.engine.spatial.GeoPoint; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.ScaledNumberField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class FieldTypesIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new LuceneBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withAnnotatedTypes( FieldTypesEntity.class ) + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .withConfiguration( b -> b.programmaticMapping() + .type( FieldTypesEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( FieldTypesEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void smoke() { + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + FieldTypesEntity entity1 = new FieldTypesEntity( 1L ); + FieldTypesEntity entity2 = new FieldTypesEntity( 2L ); + session.indexingPlan().add( entity1 ); + session.indexingPlan().add( entity2 ); + simulatedIndexedEntityDatastore.put( entity1.id, entity1 ); + simulatedIndexedEntityDatastore.put( entity2.id, entity2 ); + } + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = + FieldTypesIT_FieldTypesEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.bool() + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aText ).matching( "text" ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.keywordString ) + .matching( "keywordString" ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.bigDecimal ) + .matching( BigDecimal.TEN ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.bigInteger ) + .matching( BigInteger.ONE ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aBool ).matching( false ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aBoolean ).matching( true ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aByte ).matching( (byte) 1 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aDouble ).matching( 1.0 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aFloat ).matching( 1.0f ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aInt ).matching( 1 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLong ).matching( 10L ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aShort ).matching( (short) 2 ) ) + .should( f.spatial().within().field( FieldTypesIT_FieldTypesEntity__.INDEX.geoPoint ) + .circle( GeoPoint.of( 10.0, 20.0 ), 20.0 ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anInstant ) + .matching( Instant.ofEpochMilli( 1000L ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalDate ) + .matching( LocalDate.of( 2000, 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalDateTime ) + .matching( LocalDateTime.of( 2000, 1, 1, 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aLocalTime ) + .matching( LocalTime.of( 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aMonthDay ) + .matching( MonthDay.of( 1, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anOffsetDateTime ) + .matching( OffsetDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.anOffsetTime ) + .matching( OffsetTime.of( LocalTime.of( 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aYear ) + .matching( Year.of( 2000 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aYearMonth ) + .matching( YearMonth.of( 2000, 1 ) ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.aZonedDateTime ) + .matching( ZonedDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ) ) ) + .should( f.knn( 10 ).field( FieldTypesIT_FieldTypesEntity__.INDEX.floatVector ) + .matching( new float[] { 1.0f, 2.0f, 3.0f } ) ) + .should( f.knn( 10 ).field( FieldTypesIT_FieldTypesEntity__.INDEX.byteVector ) + .matching( new byte[] { 1, 2, 3 } ) ) + .should( f.match().field( FieldTypesIT_FieldTypesEntity__.INDEX.myEnum ).matching( MyEnum.B ) ) + ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @SearchEntity(name = "FieldTypesEntity") + @Indexed + public static class FieldTypesEntity { + @DocumentId + public Long id; + @FullTextField + public String aText; + @KeywordField + public String keywordString; + @ScaledNumberField(decimalScale = 0) + public BigDecimal bigDecimal; + @ScaledNumberField(decimalScale = 0) + public BigInteger bigInteger; + @GenericField + public boolean aBool; + @GenericField + public Boolean aBoolean; + @GenericField + public byte aByte; + @GenericField + public double aDouble; + @GenericField + public float aFloat; + @GenericField + public int aInt; + @GenericField + public long aLong; + @GenericField + public short aShort; + @GenericField + public GeoPoint geoPoint; + @GenericField + public Instant anInstant; + @GenericField + public LocalDate aLocalDate; + @GenericField + public LocalDateTime aLocalDateTime; + @GenericField + public LocalTime aLocalTime; + @GenericField + public MonthDay aMonthDay; + @GenericField + public OffsetDateTime anOffsetDateTime; + @GenericField + public OffsetTime anOffsetTime; + @GenericField + public Year aYear; + @GenericField + public YearMonth aYearMonth; + @GenericField + public ZonedDateTime aZonedDateTime; + + @VectorField(dimension = 3) + public float[] floatVector; + @VectorField(dimension = 3) + public byte[] byteVector; + + @KeywordField + public MyEnum myEnum; + + public FieldTypesEntity() { + } + + public FieldTypesEntity(Long id) { + this.id = id; + this.aText = "text"; + this.keywordString = "keywordString"; + this.bigDecimal = BigDecimal.TEN; + this.bigInteger = BigInteger.ONE; + this.aBool = false; + this.aBoolean = true; + this.aByte = 1; + this.aDouble = 1.0; + this.aFloat = 1.0f; + this.aInt = 1; + this.aLong = 10L; + this.aShort = 2; + this.geoPoint = GeoPoint.of( 10.0, 20.0 ); + this.anInstant = Instant.ofEpochMilli( 1000L ); + this.aLocalDate = LocalDate.of( 2000, 1, 1 ); + this.aLocalDateTime = LocalDateTime.of( 2000, 1, 1, 1, 1 ); + this.aLocalTime = LocalTime.of( 1, 1 ); + this.aMonthDay = MonthDay.of( 1, 1 ); + this.anOffsetDateTime = OffsetDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ); + this.anOffsetTime = OffsetTime.of( LocalTime.of( 1, 1 ), ZoneOffset.UTC ); + this.aYear = Year.of( 2000 ); + this.aYearMonth = YearMonth.of( 2000, 1 ); + this.aZonedDateTime = ZonedDateTime.of( LocalDateTime.of( 2000, 1, 1, 1, 1 ), ZoneOffset.UTC ); + this.floatVector = new float[] { 1.0f, 2.0f, 3.0f }; + this.byteVector = new byte[] { 1, 2, 3 }; + this.myEnum = MyEnum.B; + } + } + + public enum MyEnum { + A, B, C, D; + } +} diff --git a/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/PredicateTypesIT.java b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/PredicateTypesIT.java new file mode 100644 index 00000000000..a648b872807 --- /dev/null +++ b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/PredicateTypesIT.java @@ -0,0 +1,150 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.lucene; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.search.engine.spatial.GeoPoint; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class PredicateTypesIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new LuceneBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class ) + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .withConfiguration( b -> b.programmaticMapping() + .type( IndexedEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( IndexedEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void smoke() { + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + IndexedEntity entity1 = new IndexedEntity( 1L ); + IndexedEntity entity2 = new IndexedEntity( 2L ); + session.indexingPlan().add( entity1 ); + session.indexingPlan().add( entity2 ); + simulatedIndexedEntityDatastore.put( entity1.id, entity1 ); + simulatedIndexedEntityDatastore.put( entity2.id, entity2 ); + } + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = + PredicateTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.bool() + .should( f.match().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.range().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).atLeast( "text" ) ) + .should( f.phrase().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.text ) ) + .should( f.wildcard().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "?ext" ) ) + .should( f.regexp().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "?ext" ) ) + .should( f.terms().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matchingAny( "text" ) ) + .should( f.simpleQueryString().field( PredicateTypesIT_IndexedEntity__.INDEX.text ) + .matching( "text" ) ) + .should( f.queryString().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "text" ) ) + .should( f.prefix().field( PredicateTypesIT_IndexedEntity__.INDEX.text ).matching( "te" ) ) + + .should( f.spatial().within().field( PredicateTypesIT_IndexedEntity__.INDEX.geoPoint ) + .circle( GeoPoint.of( 10.0, 20.0 ), 20.0 ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.geoPoint ) ) + + .should( f.knn( 10 ).field( PredicateTypesIT_IndexedEntity__.INDEX.floatVector ) + .matching( new float[] { 1.0f, 2.0f, 3.0f } ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.floatVector ) ) + + .should( f.match().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( MyEnum.B ) ) + .should( f.range().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).atLeast( MyEnum.B ) ) + .should( f.phrase().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + .should( f.exists().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ) ) + .should( f.wildcard().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "?" ) ) + .should( f.regexp().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( ".+" ) ) + .should( f.terms().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matchingAny( MyEnum.B ) ) + .should( f.simpleQueryString().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ) + .matching( "B" ) ) + .should( f.queryString().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + .should( f.prefix().field( PredicateTypesIT_IndexedEntity__.INDEX.myEnum ).matching( "B" ) ) + ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @SearchEntity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @DocumentId + public Long id; + @FullTextField + public String text; + @GenericField + public GeoPoint geoPoint; + @VectorField(dimension = 3) + public float[] floatVector; + @KeywordField + public MyEnum myEnum; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.text = "text"; + this.geoPoint = GeoPoint.of( 10.0, 20.0 ); + this.floatVector = new float[] { 1.0f, 2.0f, 3.0f }; + this.myEnum = MyEnum.B; + } + } + + public enum MyEnum { + A, B, C, D; + } + +} diff --git a/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/ProjectionTypesIT.java b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/ProjectionTypesIT.java new file mode 100644 index 00000000000..0a887d8e208 --- /dev/null +++ b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/ProjectionTypesIT.java @@ -0,0 +1,140 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.lucene; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class ProjectionTypesIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new LuceneBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class, ContainedEntity.class ) + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .withConfiguration( b -> b.programmaticMapping() + .type( IndexedEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( IndexedEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void smoke() { + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + IndexedEntity entity1 = new IndexedEntity( 1L ); + IndexedEntity entity2 = new IndexedEntity( 2L ); + session.indexingPlan().add( entity1 ); + session.indexingPlan().add( entity2 ); + simulatedIndexedEntityDatastore.put( entity1.id, entity1 ); + simulatedIndexedEntityDatastore.put( entity2.id, entity2 ); + } + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = + ProjectionTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .select( f -> f.composite() + .from( + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.text ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.number ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.myDate ), + f.field( ProjectionTypesIT_IndexedEntity__.INDEX.contained.text ).list() + ).asArray() ) + .where( f -> f.matchAll() ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @SearchEntity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @DocumentId + public Long id; + @KeywordField(projectable = Projectable.YES) + public String text; + @GenericField(projectable = Projectable.YES) + public int number; + @GenericField(projectable = Projectable.YES) + public LocalDate myDate; + @IndexedEmbedded + public Set contained; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.text = "text"; + this.myDate = LocalDate.of( 2000, 1, 1 ); + this.contained = new HashSet<>(); + this.contained.add( new ContainedEntity( id + 100, this ) ); + } + } + + public static class ContainedEntity { + // Not setting @DocumentId here because it shouldn't be necessary + public Long id; + @FullTextField(projectable = Projectable.YES) + public String text; + public IndexedEntity containing; + + public ContainedEntity() { + } + + public ContainedEntity(Long id, IndexedEntity indexedEntity) { + this.id = id; + this.text = "contained text"; + this.containing = indexedEntity; + } + } +} diff --git a/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/SortTypesIT.java b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/SortTypesIT.java new file mode 100644 index 00000000000..cb8709f777d --- /dev/null +++ b/integrationtest/metamodel/standalone-lucene/src/test/java/org/hibernate/search/integrationtest/metamodel/standalone/lucene/SortTypesIT.java @@ -0,0 +1,115 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.integrationtest.metamodel.standalone.lucene; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.invoke.MethodHandles; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.search.engine.backend.types.Sortable; +import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.SearchEntity; +import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings; +import org.hibernate.search.mapper.pojo.standalone.loading.SelectionLoadingStrategy; +import org.hibernate.search.mapper.pojo.standalone.loading.binding.EntityLoadingBinder; +import org.hibernate.search.mapper.pojo.standalone.mapping.SearchMapping; +import org.hibernate.search.mapper.pojo.standalone.scope.SearchScope; +import org.hibernate.search.mapper.pojo.standalone.session.SearchSession; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy; +import org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategyNames; +import org.hibernate.search.util.impl.integrationtest.backend.lucene.LuceneBackendConfiguration; +import org.hibernate.search.util.impl.integrationtest.mapper.pojo.standalone.StandalonePojoMappingSetupHelper; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class SortTypesIT { + + @RegisterExtension + public StandalonePojoMappingSetupHelper setupHelper = + StandalonePojoMappingSetupHelper.withSingleBackend( + MethodHandles.lookup(), new LuceneBackendConfiguration() ); + + private SearchMapping mapping; + + private final Map simulatedIndexedEntityDatastore = new HashMap<>(); + + @BeforeEach + void setup() { + mapping = setupHelper.start() + .withAnnotatedTypes( IndexedEntity.class ) + .withProperty( StandalonePojoMapperSettings.INDEXING_PLAN_SYNCHRONIZATION_STRATEGY, + IndexingPlanSynchronizationStrategyNames.SYNC ) + .withConfiguration( b -> b.programmaticMapping() + .type( IndexedEntity.class ) + .searchEntity() + .loadingBinder( (EntityLoadingBinder) c -> { + c.selectionLoadingStrategy( IndexedEntity.class, + SelectionLoadingStrategy.fromMap( simulatedIndexedEntityDatastore ) ); + } ) ) + .withConfiguration( b -> b.defaultReindexOnUpdate( ReindexOnUpdate.SHALLOW ) ) + .setup(); + } + + @Test + void smoke() { + try ( SearchSession session = mapping.createSessionWithOptions() + .indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() ) + .build() ) { + IndexedEntity entity1 = new IndexedEntity( 1L ); + IndexedEntity entity2 = new IndexedEntity( 2L ); + session.indexingPlan().add( entity1 ); + session.indexingPlan().add( entity2 ); + simulatedIndexedEntityDatastore.put( entity1.id, entity1 ); + simulatedIndexedEntityDatastore.put( entity2.id, entity2 ); + } + + try ( SearchSession session = mapping.createSession() ) { + SearchScope scope = + SortTypesIT_IndexedEntity__.INDEX.scope( session ); + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .sort( f -> f.field( SortTypesIT_IndexedEntity__.INDEX.number ).asc().missing().use( 5 ) ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + + assertThat( session.search( scope ) + .where( f -> f.matchAll() ) + .sort( f -> f.field( SortTypesIT_IndexedEntity__.INDEX.myDate ).asc().missing() + .use( LocalDate.of( 2000, 1, 1 ) ) ) + .fetchHits( 20 ) ) + .hasSize( 2 ); + } + } + + @SearchEntity(name = "IndexedEntity") + @Indexed + public static class IndexedEntity { + @DocumentId + public Long id; + @KeywordField(sortable = Sortable.YES) + public String text; + @GenericField(sortable = Sortable.YES) + public int number; + @GenericField(sortable = Sortable.YES) + public LocalDate myDate; + + public IndexedEntity() { + } + + public IndexedEntity(Long id) { + this.id = id; + this.text = "text"; + } + } +} diff --git a/integrationtest/pom.xml b/integrationtest/pom.xml index 4760b6b1986..f6e42802543 100644 --- a/integrationtest/pom.xml +++ b/integrationtest/pom.xml @@ -31,6 +31,7 @@ metamodel/standalone-lucene metamodel/standalone-elasticsearch metamodel/orm-lucene + metamodel/orm-elasticsearch diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/StandalonePojoRootReferenceScope.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/StandalonePojoRootReferenceScope.java index 1f086c4ae28..0cb9229fb18 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/StandalonePojoRootReferenceScope.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/scope/StandalonePojoRootReferenceScope.java @@ -10,5 +10,5 @@ @Incubating public interface StandalonePojoRootReferenceScope extends RootReferenceScope { - SearchScope create(SearchScopeProvider scopeProvider); + SearchScope scope(SearchScopeProvider scopeProvider); } diff --git a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java index 344e0e32919..2d87ea7d8b7 100644 --- a/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java +++ b/mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/session/impl/StandalonePojoSearchSession.java @@ -141,7 +141,7 @@ public PojoRuntimeIntrospector runtimeIntrospector() { @Override public SearchQuerySelectStep search( StandalonePojoRootReferenceScope referenceScope) { - SearchScope scope = referenceScope.create( this ); + SearchScope scope = referenceScope.scope( this ); return search( scope ); } diff --git a/metamodel/metamodel-processor/pom.xml b/metamodel/metamodel-processor/pom.xml index 08b4daf1853..5997f095772 100644 --- a/metamodel/metamodel-processor/pom.xml +++ b/metamodel/metamodel-processor/pom.xml @@ -99,6 +99,15 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + + ${version.org.elasticsearch.client} + + + diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java index f6d53abdc64..59cdd37a649 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java @@ -14,7 +14,6 @@ import javax.annotation.processing.SupportedOptions; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; -import javax.tools.Diagnostic; import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; import org.hibernate.search.metamodel.processor.impl.IndexedEntityMetamodelAnnotationProcessor; @@ -30,15 +29,14 @@ public class HibernateSearchMetamodelProcessor extends AbstractProcessor { private HibernateSearchMetamodelProcessorContext context; - private HibernateSearchMetamodelProcessorSettings.Configuration configuration; private List processors; @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init( processingEnv ); context = new HibernateSearchMetamodelProcessorContext( processingEnv.getElementUtils(), processingEnv.getTypeUtils(), - processingEnv.getMessager(), processingEnv.getFiler() ); - configuration = new HibernateSearchMetamodelProcessorSettings.Configuration( processingEnv.getOptions() ); + processingEnv.getMessager(), processingEnv.getFiler(), + new HibernateSearchMetamodelProcessorSettings.Configuration( processingEnv.getOptions() ) ); processors = List.of( new IndexedEntityMetamodelAnnotationProcessor( context ) ); } @@ -49,13 +47,9 @@ public SourceVersion getSupportedSourceVersion() { @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { - context.messager().printMessage( Diagnostic.Kind.NOTE, "Hibernate Search Metamodel Processor started" ); for ( MetamodelAnnotationProcessor processor : processors ) { processor.process( roundEnv ); } - if ( roundEnv.processingOver() ) { - // create metamodel classes - } return false; } } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java index 29359e2483d..91fbf8fae82 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java @@ -4,7 +4,12 @@ */ package org.hibernate.search.metamodel.processor; + +import java.io.Serializable; import java.util.Map; +import java.util.Objects; + +import javax.lang.model.util.Elements; public final class HibernateSearchMetamodelProcessorSettings { @@ -14,6 +19,7 @@ private HibernateSearchMetamodelProcessorSettings() { private static final String PREFIX = "org.hibernate.search.metamodel.processor."; public static final String ADD_GENERATED_ANNOTATION = PREFIX + Radicals.ADD_GENERATED_ANNOTATION; + public static final String BACKEND_VERSION = PREFIX + Radicals.BACKEND_VERSION; public static class Radicals { @@ -21,6 +27,7 @@ private Radicals() { } public static final String ADD_GENERATED_ANNOTATION = "add_generated_annotation"; + public static final String BACKEND_VERSION = "backend.version"; } /** @@ -34,9 +41,38 @@ private Defaults() { } } - public record Configuration(boolean addGeneratedAnnotation) { + public record Configuration(boolean addGeneratedAnnotation, String version) implements Serializable { public Configuration(Map options) { - this( Boolean.parseBoolean( options.getOrDefault( ADD_GENERATED_ANNOTATION, Defaults.ADD_GENERATED_ANNOTATION ) ) ); + this( + Boolean.parseBoolean( options.getOrDefault( ADD_GENERATED_ANNOTATION, Defaults.ADD_GENERATED_ANNOTATION ) ), + Objects.toString( options.get( BACKEND_VERSION ), null ) + ); + } + + public String elasticsearchVersion() { + return version == null ? "9.0.0" : version; + } + + public String luceneVersion() { + return version == null ? "9.12.1" : version; + } + + public String backendVersion() { + return isLuceneBackend() ? luceneVersion() : elasticsearchVersion(); + } + + public boolean isOrmMapperPresent(Elements elementUtils) { + return elementUtils.getTypeElement( "org.hibernate.search.mapper.orm.Search" ) != null; + } + + private boolean isLuceneBackend() { + try { + Class.forName( "org.hibernate.search.backend.lucene.LuceneBackend" ); + } + catch (ClassNotFoundException e) { + return false; + } + return true; } } } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java index 03ddb8b2067..5c2984f0e47 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java @@ -22,10 +22,9 @@ import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; import org.hibernate.search.mapper.pojo.extractor.mapping.annotation.ContainerExtract; import org.hibernate.search.mapper.pojo.extractor.mapping.programmatic.ContainerExtractorPath; -import org.hibernate.search.metamodel.processor.logging.impl.MappingLog; import org.hibernate.search.util.common.AssertionFailure; -public abstract class AbstractProcessorAnnotationProcessor implements ProcessorPropertyMappingAnnotationProcessor { +abstract class AbstractProcessorAnnotationProcessor implements ProcessorPropertyMappingAnnotationProcessor { protected static final String[] EMPTY = new String[0]; @@ -59,11 +58,13 @@ public final void process(PropertyBindingContext bindingContext, AnnotationMirro protected abstract Optional> configureField(PropertyBindingContext bindingContext, AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType); - protected ContainerExtractorPath toContainerExtractorPath(AnnotationMirror extraction) { - return toContainerExtractorPath( extraction, "DEFAULT" ); + protected ContainerExtractorPath toContainerExtractorPath(AnnotationMirror extraction, + ProcessorAnnotationProcessorContext context) { + return toContainerExtractorPath( extraction, "DEFAULT", context ); } - protected ContainerExtractorPath toContainerExtractorPath(AnnotationMirror extraction, String defaultValue) { + protected ContainerExtractorPath toContainerExtractorPath(AnnotationMirror extraction, String defaultValue, + ProcessorAnnotationProcessorContext context) { if ( extraction == null ) { return ContainerExtractorPath.defaultExtractors(); } @@ -74,7 +75,12 @@ protected ContainerExtractorPath toContainerExtractorPath(AnnotationMirror extra switch ( extract ) { case NO: if ( extractors.length != 0 ) { - throw MappingLog.INSTANCE.cannotReferenceExtractorsWhenExtractionDisabled(); + context.messager().printMessage( + Diagnostic.Kind.ERROR, "Unexpected extractor references:" + + " extractors cannot be defined explicitly when extract = ContainerExtract.NO." + + " Either leave 'extract' to its default value to define extractors explicitly" + + " or leave the 'extractor' list to its default, empty value to disable extraction." + ); } return ContainerExtractorPath.noExtractors(); case DEFAULT: diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java index db4740c59ba..f47a038d957 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java @@ -29,7 +29,8 @@ public final void process(PropertyMappingStep mapping, AnnotationMirror annotati AnnotationMirror valueBinder = getValueBinder( annotation ); if ( valueBinder != null ) { // TODO: do we also inject fields into a value binder ... ? - context.messager().printMessage( Diagnostic.Kind.WARNING, "Defined value binder " + valueBinder + " is ignored " ); + context.messager().printMessage( Diagnostic.Kind.WARNING, "Defined value binder " + valueBinder + " is ignored ", + element ); } else if ( element.asType().getKind() == TypeKind.DECLARED && context.types().asElement( element.asType() ).getKind() == ElementKind.ENUM ) { @@ -37,7 +38,7 @@ else if ( element.asType().getKind() == TypeKind.DECLARED fieldContext.valueBridge( new ProcessorEnumValueBridge( element.asType() ) ); } - ContainerExtractorPath extractorPath = toContainerExtractorPath( getExtraction( annotation ) ); + ContainerExtractorPath extractorPath = toContainerExtractorPath( getExtraction( annotation ), context ); fieldContext.extractors( extractorPath ); } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java index febc736687e..62bb5df5c6b 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java @@ -13,7 +13,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStandardFieldOptionsStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -public abstract class AbstractProcessorNonFullTextFieldAnnotationProcessor +abstract class AbstractProcessorNonFullTextFieldAnnotationProcessor extends AbstractProcessorStandardFieldAnnotationProcessor { @Override PropertyMappingStandardFieldOptionsStep initStandardFieldMappingContext(PropertyMappingStep mappingContext, diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java index c311a75beb4..3073f1d88cb 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java @@ -11,7 +11,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStandardFieldOptionsStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -public abstract class AbstractProcessorStandardFieldAnnotationProcessor extends AbstractProcessorFieldAnnotationProcessor { +abstract class AbstractProcessorStandardFieldAnnotationProcessor extends AbstractProcessorFieldAnnotationProcessor { @Override PropertyMappingStandardFieldOptionsStep initFieldMappingContext(PropertyMappingStep mappingContext, AnnotationMirror annotation, diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java index 035e16f6338..2cc7008b439 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java @@ -14,7 +14,7 @@ import org.hibernate.search.mapper.pojo.bridge.mapping.programmatic.IdentifierBinder; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -public class ProcessorDocumentIdProcessor implements ProcessorPropertyMappingAnnotationProcessor { +class ProcessorDocumentIdProcessor implements ProcessorPropertyMappingAnnotationProcessor { @Override public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, ProcessorAnnotationProcessorContext context) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java index 36017780318..8a276d5a3e8 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java @@ -24,21 +24,24 @@ import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStandardFieldOptionsStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -public class ProcessorFulltextFieldProcessor extends AbstractProcessorStandardFieldAnnotationProcessor { +class ProcessorFulltextFieldProcessor extends AbstractProcessorStandardFieldAnnotationProcessor { @Override PropertyMappingStandardFieldOptionsStep initStandardFieldMappingContext(PropertyMappingStep mappingContext, AnnotationMirror annotation, String fieldName) { var fieldContext = mappingContext.fullTextField( fieldName ); - String analyzer = getAnnotationValueAsString( annotation, "analyzer", AnalyzerNames.DEFAULT ); - if ( !analyzer.isEmpty() ) { - fieldContext.analyzer( analyzer ); - } - - String searchAnalyzer = getAnnotationValueAsString( annotation, "searchAnalyzer", "" ); - if ( !searchAnalyzer.isEmpty() ) { - fieldContext.searchAnalyzer( searchAnalyzer ); - } + // NOTE: we are skipping reading analyzers on purpose! + // we won't have their configuration while running a processor, and since the analyzer does not influence the search capabilities + // it's relatively safe to just use the default ones instead: + // + // String analyzer = getAnnotationValueAsString( annotation, "analyzer", AnalyzerNames.DEFAULT ); + // String searchAnalyzer = getAnnotationValueAsString( annotation, "searchAnalyzer", "" ); + // if ( !analyzer.isEmpty() ) { + // fieldContext.analyzer( analyzer ); + // } + // if ( !searchAnalyzer.isEmpty() ) { + // fieldContext.searchAnalyzer( searchAnalyzer ); + // } Norms norms = getNorms( annotation ); if ( !Norms.DEFAULT.equals( norms ) ) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java index 5292825e76f..85be08378f6 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java @@ -17,7 +17,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; -public class ProcessorGenericFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { +class ProcessorGenericFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { @Override PropertyMappingNonFullTextFieldOptionsStep initSortableFieldMappingContext(PropertyMappingStep mappingContext, AnnotationMirror annotation, String fieldName) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java index be4da7c4909..944270fe4e4 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java @@ -19,7 +19,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.TypeMappingStep; -public class ProcessorGeoPointBindingProcessor extends AbstractProcessorAnnotationProcessor +class ProcessorGeoPointBindingProcessor extends AbstractProcessorAnnotationProcessor implements ProcessorTypeMappingAnnotationProcessor { @Override public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java index b9976ebeae1..53203c7a0b6 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java @@ -25,7 +25,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.annotation.processing.spi.MappingAnnotationProcessorUtils; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -public class ProcessorIndexedEmbeddedProcessor extends AbstractProcessorAnnotationProcessor { +class ProcessorIndexedEmbeddedProcessor extends AbstractProcessorAnnotationProcessor { @SuppressWarnings("deprecation") @Override @@ -38,7 +38,7 @@ public void process(PropertyMappingStep mapping, AnnotationMirror annotation, El String[] includePathsArray = toStringArray( getAnnotationValue( annotation, "includePaths" ) ); String[] excludePathsArray = toStringArray( getAnnotationValue( annotation, "excludePaths" ) ); - ContainerExtractorPath extractorPath = toContainerExtractorPath( annotation ); + ContainerExtractorPath extractorPath = toContainerExtractorPath( annotation, context ); if ( getAnnotationValue( annotation, "targetType" ) != null ) { context.messager().printMessage( Diagnostic.Kind.WARNING, @@ -69,8 +69,6 @@ public void process(PropertyMappingStep mapping, AnnotationMirror annotation, El } private void collectExtraTypes(TypeMirror type, ProcessorAnnotationProcessorContext context) { - // TODO: add a marker annotation to allow users to simply put some @BlaBlaBla annotation on a type - // we should consider adding through programmaticMapping().type(sometype). if ( type == null || type.getKind() == TypeKind.NONE ) { return; } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java index bfaee4110ed..0c4d15b9089 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java @@ -18,16 +18,20 @@ import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingNonFullTextFieldOptionsStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -public class ProcessorKeywordFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { +class ProcessorKeywordFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { @Override PropertyMappingNonFullTextFieldOptionsStep initSortableFieldMappingContext(PropertyMappingStep mappingContext, AnnotationMirror annotation, String fieldName) { PropertyMappingKeywordFieldOptionsStep fieldContext = mappingContext.keywordField( fieldName ); - String normalizer = getAnnotationValueAsString( annotation, "normalizer", "" ); - if ( !normalizer.isEmpty() ) { - fieldContext.normalizer( normalizer ); - } + // NOTE: we are skipping reading analyzers on purpose! + // we won't have their configuration while running a processor, and since the analyzer does not influence the search capabilities + // it's relatively safe to just use the default ones instead: + // + // String normalizer = getAnnotationValueAsString( annotation, "normalizer", "" ); + // if ( !normalizer.isEmpty() ) { + // fieldContext.normalizer( normalizer ); + // } Norms norms = getNorms( annotation ); if ( !Norms.DEFAULT.equals( norms ) ) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java index 3828a52aa15..6c3813c442d 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java @@ -16,7 +16,7 @@ import org.hibernate.search.mapper.pojo.bridge.builtin.programmatic.GeoPointBinder; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -public class ProcessorLatitudeProcessor extends AbstractProcessorAnnotationProcessor { +class ProcessorLatitudeProcessor extends AbstractProcessorAnnotationProcessor { @Override public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, ProcessorAnnotationProcessorContext context) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java index 43d96ef4b38..88927a97c74 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java @@ -16,7 +16,7 @@ import org.hibernate.search.mapper.pojo.bridge.builtin.programmatic.GeoPointBinder; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -public class ProcessorLongitudeProcessor extends AbstractProcessorAnnotationProcessor { +class ProcessorLongitudeProcessor extends AbstractProcessorAnnotationProcessor { @Override public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, ProcessorAnnotationProcessorContext context) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java index bacbe70e340..195de872efe 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java @@ -17,7 +17,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; -public class ProcessorNonStandardFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { +class ProcessorNonStandardFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { @Override PropertyMappingNonFullTextFieldOptionsStep initSortableFieldMappingContext(PropertyMappingStep mappingContext, AnnotationMirror annotation, String fieldName) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java index 8ccae01680b..cfded3385f7 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java @@ -19,7 +19,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; -public class ProcessorScaledNumberFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { +class ProcessorScaledNumberFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { @Override PropertyMappingNonFullTextFieldOptionsStep initSortableFieldMappingContext(PropertyMappingStep mappingContext, AnnotationMirror annotation, String fieldName) { @@ -28,6 +28,11 @@ PropertyMappingNonFullTextFieldOptionsStep initSortableFieldMappingContext(Pr if ( decimalScale != AnnotationDefaultValues.DEFAULT_DECIMAL_SCALE ) { fieldContext.decimalScale( decimalScale ); } + else { + // it might be that we are looking at the ORM field and in such case the scale may be defined there, + // we don't really care about the scale value: + fieldContext.decimalScale( 0 ); + } return fieldContext; } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java index 96058504755..4fa648abb81 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java @@ -22,7 +22,7 @@ import org.hibernate.search.mapper.pojo.bridge.runtime.PropertyBridgeWriteContext; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -public class ProcessorTypePropertyBindingProcessor extends AbstractProcessorAnnotationProcessor { +class ProcessorTypePropertyBindingProcessor extends AbstractProcessorAnnotationProcessor { @Override public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, ProcessorAnnotationProcessorContext context) { @@ -34,6 +34,8 @@ public void process(PropertyMappingStep mapping, AnnotationMirror annotation, El mapping.binder( new ProcessorPropertyBinder( context, binder ) ); } + context.messager().printMessage( Diagnostic.Kind.WARNING, + "Custom binders are not yet supported by the static metamodel processor and will be ignored.", element ); } } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java index 5423387ea35..ebc64f5b96d 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java @@ -24,7 +24,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingVectorFieldOptionsStep; import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; -public class ProcessorVectorFieldProcessor extends AbstractProcessorFieldAnnotationProcessor { +class ProcessorVectorFieldProcessor extends AbstractProcessorFieldAnnotationProcessor { @Override PropertyMappingFieldOptionsStep initFieldMappingContext(PropertyMappingStep mappingContext, AnnotationMirror annotation, String fieldName) { @@ -118,11 +118,12 @@ protected Optional> configureField(PropertyBindingCon return Optional.of( optionsStep ); } - protected ContainerExtractorPath toContainerExtractorPath(AnnotationMirror extraction) { + protected ContainerExtractorPath toContainerExtractorPath(AnnotationMirror extraction, + ProcessorAnnotationProcessorContext context) { if ( extraction == null ) { return ContainerExtractorPath.noExtractors(); } - return toContainerExtractorPath( extraction, "NO" ); + return toContainerExtractorPath( extraction, "NO", context ); } protected VectorSimilarity getVectorSimilarity(AnnotationMirror annotation) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/HibernateSearchMetamodelProcessorContext.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/HibernateSearchMetamodelProcessorContext.java index 86e19bda717..9a20dbc7001 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/HibernateSearchMetamodelProcessorContext.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/HibernateSearchMetamodelProcessorContext.java @@ -4,13 +4,17 @@ */ package org.hibernate.search.metamodel.processor.impl; - import javax.annotation.processing.Messager; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; +import org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessorSettings.Configuration; + public record HibernateSearchMetamodelProcessorContext( Elements elementUtils, Types typeUtils, Messager messager, - javax.annotation.processing.Filer filer) { + javax.annotation.processing.Filer filer, Configuration configuration) { + public boolean isOrmMapperPresent() { + return configuration.isOrmMapperPresent( elementUtils() ); + } } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java index e0c4888c65f..74c1635471f 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java @@ -43,7 +43,6 @@ public class IndexedEntityMetamodelAnnotationProcessor implements MetamodelAnnot private static final String ANNOTATION_INDEXED = "org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed"; private final HibernateSearchMetamodelProcessorContext context; private final ProcessorIntrospectorContext introspectorContext; - private ProcessorPojoModelsBootstrapIntrospector introspector; public IndexedEntityMetamodelAnnotationProcessor(HibernateSearchMetamodelProcessorContext context) { this.context = context; @@ -60,7 +59,9 @@ public void process(RoundEnvironment roundEnv) { .property( "hibernate.search.backend.directory.type", "local-heap" ) .property( "hibernate.search.backend.version_check.enabled", "false" ) .property( "hibernate.search.schema_management.strategy", "none" ) - .property( "hibernate.search.backend.version", "8.17.3" ) + .property( "hibernate.search.backend.version", context.configuration().backendVersion() ) + .property( "hibernate.search.backend.lucene_version", context.configuration().luceneVersion() ) + .property( "hibernate.search.configuration_property_checking.strategy", "ignore" ) .property( StandalonePojoMapperSettings.MAPPING_CONFIGURER, BeanReference.ofInstance( (StandalonePojoMappingConfigurer) configurationContext -> { @@ -95,7 +96,6 @@ public void process(RoundEnvironment roundEnv) { processTypeAndProperties( indexedEntityType, typeMappingContext, ctx ); } else { - // TODO: generate message bundle with JBoss Logging ? context.messager() .printMessage( Diagnostic.Kind.ERROR, @@ -105,18 +105,19 @@ public void process(RoundEnvironment roundEnv) { ); } } - } ) - ).build() - .boot() ) { + ).build().boot() ) { + + boolean ormMapperPresent = context.isOrmMapperPresent(); for ( SearchIndexedEntity entity : searchMapping.allIndexedEntities() ) { - context.messager().printMessage( Diagnostic.Kind.NOTE, entity.name() ); TypeElement typeElement = introspectorContext.typeElementsByName( entity.name() ); String packageName = context.elementUtils().getPackageOf( typeElement ).getQualifiedName().toString(); - MetamodelClassWriter.Builder builder = - new MetamodelClassWriter.Builder( MetamodelNamesFormatter.DEFAULT, packageName, entity.name() ); + MetamodelClassWriter builder = + new MetamodelClassWriter( ormMapperPresent, context.configuration(), MetamodelNamesFormatter.DEFAULT, + packageName, + entity.name() ); entity.indexManager().descriptor().staticFields() .forEach( f -> { @@ -133,7 +134,6 @@ public void process(RoundEnvironment roundEnv) { } ); try { JavaFileObject source = context.filer().createSourceFile( builder.fqcn() ); - context.messager().printMessage( Diagnostic.Kind.NOTE, source.toUri().toString() ); try ( Writer writer = source.openWriter() ) { writer.append( builder.formatted() ); } @@ -146,8 +146,6 @@ public void process(RoundEnvironment roundEnv) { } } } - - context.messager().printMessage( Diagnostic.Kind.NOTE, "End" ); } public static void processTypeAndProperties(TypeElement typeElement, TypeMappingStep typeMappingContext, @@ -201,7 +199,6 @@ else if ( ProcessorPropertyMappingAnnotationProcessor.ormId( annotationMirror ) } private ProcessorPojoModelsBootstrapIntrospector wrapIntrospector(PojoBootstrapIntrospector introspector) { - this.introspector = new ProcessorPojoModelsBootstrapIntrospector( introspectorContext, introspector ); - return this.introspector; + return new ProcessorPojoModelsBootstrapIntrospector( introspectorContext, introspector ); } } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/MappingLog.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/MappingLog.java deleted file mode 100644 index ae247e2b4ee..00000000000 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/MappingLog.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.metamodel.processor.logging.impl; - -import static org.hibernate.search.metamodel.processor.logging.impl.ProcessorLog.ID_OFFSET; - -import java.lang.invoke.MethodHandles; - -import org.hibernate.search.util.common.SearchException; -import org.hibernate.search.util.common.logging.CategorizedLogger; -import org.hibernate.search.util.common.logging.impl.LoggerFactory; -import org.hibernate.search.util.common.logging.impl.MessageConstants; - -import org.jboss.logging.annotations.Message; -import org.jboss.logging.annotations.MessageLogger; - -@CategorizedLogger( - category = MappingLog.CATEGORY_NAME, - description = """ - Logs related to creating Hibernate Search mapping. - """ -) -@MessageLogger(projectCode = MessageConstants.PROJECT_CODE) -public interface MappingLog { - String CATEGORY_NAME = "org.hibernate.search.mapping.mapper"; - - MappingLog INSTANCE = LoggerFactory.make( MappingLog.class, CATEGORY_NAME, MethodHandles.lookup() ); - - @Message(id = ID_OFFSET + 1, - value = "Unexpected extractor references:" - + " extractors cannot be defined explicitly when extract = ContainerExtract.NO." - + " Either leave 'extract' to its default value to define extractors explicitly" - + " or leave the 'extractor' list to its default, empty value to disable extraction." - ) - SearchException cannotReferenceExtractorsWhenExtractionDisabled(); - -} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/ProcessorLog.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/ProcessorLog.java deleted file mode 100644 index 6f7c58bf573..00000000000 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/logging/impl/ProcessorLog.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.metamodel.processor.logging.impl; - - -import org.hibernate.search.util.common.logging.impl.MessageConstants; - -import org.jboss.logging.annotations.MessageLogger; -import org.jboss.logging.annotations.ValidIdRange; - -@MessageLogger(projectCode = MessageConstants.PROJECT_CODE) -@ValidIdRange(min = MessageConstants.PROCESSOR_ID_RANGE_MIN, max = MessageConstants.PROCESSOR_ID_RANGE_MAX) -public interface ProcessorLog extends MappingLog { - int ID_OFFSET = MessageConstants.PROCESSOR_ID_RANGE_MIN; -} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java index 1929571034e..c04f31ea218 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java @@ -11,6 +11,7 @@ import javax.lang.model.element.Name; import javax.lang.model.element.TypeElement; +import javax.lang.model.type.PrimitiveType; import javax.lang.model.type.TypeMirror; import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector; @@ -23,7 +24,6 @@ public class ProcessorPojoModelsBootstrapIntrospector implements PojoBootstrapIntrospector { private final Map> elementTypeModelCache = new HashMap<>(); - private final Map, PojoRawTypeModel> typeModelCache = new HashMap<>(); private final ProcessorIntrospectorContext context; private final PojoBootstrapIntrospector delegate; private final ProcessorTypeOrdering typeOrdering; @@ -69,6 +69,10 @@ public PojoRawTypeModel typeModel(TypeElement typeElement) { } public PojoRawTypeModel typeModel(TypeMirror typeMirror) { + if ( typeMirror instanceof PrimitiveType primitiveType ) { + // box the primitive so it's easier to deal with them later: + typeMirror = context.typeUtils().boxedClass( primitiveType ).asType(); + } Optional> loadableType = BuiltInBridgeResolverTypes.loadableType( typeMirror, context.processorContext().typeUtils() ); if ( loadableType.isPresent() ) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/BuiltInBridgeResolverTypes.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/BuiltInBridgeResolverTypes.java index 63b4979d982..c890ee1d784 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/BuiltInBridgeResolverTypes.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/BuiltInBridgeResolverTypes.java @@ -7,9 +7,7 @@ import java.util.Optional; import java.util.Set; -import javax.lang.model.element.TypeElement; import javax.lang.model.type.ArrayType; -import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Types; @@ -33,9 +31,6 @@ private BuiltInBridgeResolverTypes() { "java.lang.Float", "java.lang.Double", - // TODO: handle enums somehow: - // strictSubTypesOf( Enum.class ) - "java.math.BigInteger", "java.math.BigDecimal", @@ -65,43 +60,16 @@ private BuiltInBridgeResolverTypes() { "java.net.URI", "java.net.URL", - // TODO: handle geo pints - // subTypesOf( GeoPoint.class ) "org.hibernate.search.engine.spatial.GeoPoint" // arrays for vector fields: // primitive types are handled differently ); - private static Set CONTAINERS = Set.of( - "java.util.List", - "java.util.Set" - ); - public static boolean isBuiltInType(String typeName) { return TYPES.contains( typeName ); } - public static boolean isContainer(TypeMirror mirror, Types types) { - if ( mirror == null || mirror.getKind() == TypeKind.NONE ) { - return false; - } - TypeElement element = (TypeElement) types.asElement( mirror ); - if ( CONTAINERS.contains( element.getQualifiedName().toString() ) ) { - return true; - } - if ( isContainer( element.getSuperclass(), types ) ) { - return true; - } - for ( TypeMirror i : element.getInterfaces() ) { - if ( isContainer( i, types ) ) { - return true; - } - } - - return false; - } - public static Optional> loadableType(TypeMirror propertyType, Types types) { try { if ( propertyType instanceof ArrayType arrayType ) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoPropertyModel.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoPropertyModel.java index ea92e1e2944..12baf8b0491 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoPropertyModel.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoPropertyModel.java @@ -62,15 +62,7 @@ public Stream annotations() { @SuppressWarnings("unchecked") @Override public PojoTypeModel typeModel() { - // todo need to handle enums - // need to handle geo point subtypes - // Optional> loadableType = BuiltInBridgeResolverTypes.loadableType( propertyType, context.typeUtils() ); - // if ( loadableType.isPresent() ) { - // return (PojoTypeModel) introspector.typeModel( loadableType.get() ); - // } - // else { return (PojoTypeModel) introspector.typeModel( propertyType ); - // } } @SuppressWarnings("unchecked") diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java index e6363c08111..5a2124de119 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java @@ -23,6 +23,7 @@ import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.PrimitiveType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; @@ -57,7 +58,12 @@ public ProcessorPojoRawTypeModel(TypeMirror typeMirror, HibernateSearchMetamodel private ProcessorPojoRawTypeModel(TypeMirror typeMirror, TypeElement typeElement, HibernateSearchMetamodelProcessorContext context, ProcessorPojoModelsBootstrapIntrospector introspector) { this.typeMirror = typeMirror; - this.typeElement = typeElement; + if ( typeElement == null && typeMirror instanceof PrimitiveType primitiveType ) { + this.typeElement = context.typeUtils().boxedClass( primitiveType ); + } + else { + this.typeElement = typeElement; + } this.context = context; this.introspector = introspector; } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ClassProperty.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ClassProperty.java index 2bcb2ced99b..99e9d68ec0d 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ClassProperty.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ClassProperty.java @@ -6,7 +6,7 @@ import java.util.Locale; -public record ClassProperty(String type, String name) implements Comparable { +record ClassProperty(String type, String name) implements Comparable { public String asParameter() { return type + " " + name; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java index 8bf787d3505..e89948954b0 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java @@ -4,6 +4,8 @@ */ package org.hibernate.search.metamodel.processor.writer.impl; +import static org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessorSettings.Configuration; + import java.util.Collection; import java.util.Locale; import java.util.Map; @@ -22,198 +24,232 @@ import org.hibernate.search.engine.search.common.spi.SearchIndexValueFieldTypeContext; import org.hibernate.search.mapper.pojo.bridge.runtime.impl.PojoValueBridgeDocumentValueConverter; import org.hibernate.search.metamodel.processor.annotation.processing.impl.AbstractProcessorFieldAnnotationProcessor; +import org.hibernate.search.util.common.annotation.impl.SuppressJQAssistant; +@SuppressJQAssistant(reason = "Need to use an impl clss for the value converter to get to the type element") public class MetamodelClassWriter { + private final TraitReferenceMapping traitReferenceMapping; + private final Map valueFieldReferenceDetails; + private final Configuration configuration; + private final MetamodelNamesFormatter metamodelNamesFormatter; + + private final boolean ormMapperPresent; + private final String packageName; + private final String className; + private final String scopeTypeName; + private final TreeSet regularProperties; + private final TreeSet objectProperties; + private final int depth; + + public MetamodelClassWriter(boolean ormMapperPresent, Configuration configuration, + MetamodelNamesFormatter metamodelNamesFormatter, + String packageName, String className) { + this( ormMapperPresent, configuration, metamodelNamesFormatter, packageName, className, + metamodelClassName( metamodelNamesFormatter, packageName, className ), + TraitReferenceMapping.instance(), new TreeMap<>(), 1 ); + } - public static class Builder { - private final TraitReferenceMapping traitReferenceMapping; - private final Map valueFieldReferenceDetails; - private final MetamodelNamesFormatter metamodelNamesFormatter; - - private final String packageName; - private final String className; - private final String scopeTypeName; - private final TreeSet regularProperties; - private final TreeSet objectProperties; - private final int depth; - - public Builder(MetamodelNamesFormatter metamodelNamesFormatter, String packageName, String className) { - this( metamodelNamesFormatter, packageName, className, - metamodelClassName( metamodelNamesFormatter, packageName, className ), - TraitReferenceMapping.instance(), new TreeMap<>(), 1 ); - } - - private Builder(MetamodelNamesFormatter metamodelNamesFormatter, String packageName, String className, - String scopeTypeName, TraitReferenceMapping traitReferenceMapping, - Map valueFieldReferenceDetails, int depth) { - this.traitReferenceMapping = traitReferenceMapping; - this.valueFieldReferenceDetails = valueFieldReferenceDetails; - this.metamodelNamesFormatter = metamodelNamesFormatter; - - this.packageName = packageName; - this.className = className; - this.scopeTypeName = scopeTypeName; - this.regularProperties = new TreeSet<>(); - this.objectProperties = new TreeSet<>(); - this.depth = depth; - } - - public void addProperty(IndexValueFieldDescriptor valueField) { - IndexValueFieldTypeDescriptor type = valueField.type(); - if ( type instanceof SearchIndexValueFieldTypeContext context ) { - regularProperties.add( new RegularProperty( - valueField.relativeName(), - valueField.absolutePath(), - typeFromDslConverter( context.mappingDslConverter() ), - typeFromProjectionConverter( context.mappingProjectionConverter() ), - typeFromDslConverter( context.indexDslConverter() ), - typeFromDslConverter( context.rawDslConverter() ), - fromTraits( type.traits() ) - ) ); - } - else { - // TODO log message - } - } + private MetamodelClassWriter(boolean ormMapperPresent, Configuration configuration, + MetamodelNamesFormatter metamodelNamesFormatter, + String packageName, String className, + String scopeTypeName, TraitReferenceMapping traitReferenceMapping, + Map valueFieldReferenceDetails, int depth) { + this.traitReferenceMapping = traitReferenceMapping; + this.valueFieldReferenceDetails = valueFieldReferenceDetails; + this.configuration = configuration; + this.metamodelNamesFormatter = metamodelNamesFormatter; + + this.ormMapperPresent = ormMapperPresent; + this.packageName = packageName; + this.className = className; + this.scopeTypeName = scopeTypeName; + this.regularProperties = new TreeSet<>(); + this.objectProperties = new TreeSet<>(); + this.depth = depth; + } - private String typeFromDslConverter(DslConverter converter) { - return typeFromConverter( converter.delegate(), converter.valueType() ); + public void addProperty(IndexValueFieldDescriptor valueField) { + IndexValueFieldTypeDescriptor type = valueField.type(); + if ( type instanceof SearchIndexValueFieldTypeContext context ) { + regularProperties.add( new RegularProperty( + valueField.relativeName(), + valueField.absolutePath(), + typeFromDslConverter( context.mappingDslConverter() ), + typeFromProjectionConverter( context.mappingProjectionConverter() ), + typeFromDslConverter( context.indexDslConverter() ), + typeFromDslConverter( context.rawDslConverter() ), + fromTraits( type.traits() ) + ) ); } + } - private String typeFromProjectionConverter(ProjectionConverter converter) { - return typeFromConverter( converter.delegate(), converter.valueType() ); - } + private String typeFromDslConverter(DslConverter converter) { + return typeFromConverter( converter.delegate(), converter.valueType() ); + } - private String typeFromConverter(Object delegate, Class valueType) { - if ( delegate instanceof PojoValueBridgeDocumentValueConverter pvbdc - && pvbdc.bridge() instanceof AbstractProcessorFieldAnnotationProcessor.ProcessorEnumValueBridge bridge ) { - return bridge.valueType().toString(); - } - return typeToString( valueType ); - } + private String typeFromProjectionConverter(ProjectionConverter converter) { + return typeFromConverter( converter.delegate(), converter.valueType() ); + } - public void addProperty(IndexObjectFieldDescriptor objectField) { - String name = objectField.relativeName(); - Builder builder = new Builder( metamodelNamesFormatter, "", metamodelClassName() + name, scopeTypeName, - traitReferenceMapping, valueFieldReferenceDetails, depth + 1 ); - objectProperties.add( new ObjectField( name, objectField.absolutePath(), objectField.type().nested(), builder ) ); - - for ( IndexFieldDescriptor child : objectField.staticChildren() ) { - if ( child.isValueField() ) { - builder.addProperty( child.toValueField() ); - } - else { - builder.addProperty( child.toObjectField() ); - } - } + private String typeFromConverter(Object delegate, Class valueType) { + if ( delegate instanceof PojoValueBridgeDocumentValueConverter pvbdc + && pvbdc.bridge() instanceof AbstractProcessorFieldAnnotationProcessor.ProcessorEnumValueBridge bridge ) { + return bridge.valueType().toString(); } + return typeToString( valueType ); + } - // todo: remove this once types are correctly collected from type elements instead: - private String typeToString(Class type) { - if ( type.isArray() ) { - return type.getComponentType().getName() + "[]"; + public void addProperty(IndexObjectFieldDescriptor objectField) { + String name = objectField.relativeName(); + MetamodelClassWriter writer = + new MetamodelClassWriter( ormMapperPresent, configuration, metamodelNamesFormatter, "", + metamodelClassName() + name, + scopeTypeName, + traitReferenceMapping, valueFieldReferenceDetails, depth + 1 ); + objectProperties.add( new ObjectField( name, objectField.absolutePath(), objectField.type().nested(), writer ) ); + + for ( IndexFieldDescriptor child : objectField.staticChildren() ) { + if ( child.isValueField() ) { + writer.addProperty( child.toValueField() ); } else { - return type.getName(); + writer.addProperty( child.toObjectField() ); } } + } - private ValueFieldReferenceDetails fromTraits(Collection traits) { - Set details = new TreeSet<>(); - for ( String trait : traits ) { - details.add( traitReferenceMapping.reference( trait ) ); - } - String key = details.stream().map( TraitReferenceDetails::implementationLabel ).collect( Collectors.joining() ); - - return valueFieldReferenceDetails.computeIfAbsent( key, k -> createValueFieldReferenceDetails( details ) ); + private String typeToString(Class type) { + if ( type.isArray() ) { + return type.getComponentType().getName() + "[]"; + } + else { + return type.getName(); } + } - private ValueFieldReferenceDetails createValueFieldReferenceDetails(Set details) { - return new ValueFieldReferenceDetails( TypedFieldReferenceDetails.of( details ) ); + private ValueFieldReferenceDetails fromTraits(Collection traits) { + Set details = new TreeSet<>(); + for ( String trait : traits ) { + details.add( traitReferenceMapping.reference( trait ) ); } + String key = details.stream().map( TraitReferenceDetails::implementationLabel ).collect( Collectors.joining() ); - public String formatted() { - String metamodelClassName = metamodelClassName(); - return String.format( Locale.ROOT, - """ - %s - @javax.annotation.processing.Generated(value = "org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor") - public final class %s implements - org.hibernate.search.engine.search.reference.RootReferenceScope<%s, %s> { + return valueFieldReferenceDetails.computeIfAbsent( key, k -> createValueFieldReferenceDetails( details ) ); + } - public static final %s %s = new %s(); + private ValueFieldReferenceDetails createValueFieldReferenceDetails(Set details) { + return new ValueFieldReferenceDetails( TypedFieldReferenceDetails.of( details ) ); + } - public final %s; + public String formatted() { + String metamodelClassName = metamodelClassName(); + return String.format( + Locale.ROOT, + """ + %s + @javax.annotation.processing.Generated(value = "org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor") + public final class %s implements + %s<%s, %s> { + + public static final %s %s = new %s(); + + public final %s; + + private %s() { + // simple value field references: + %s + // various object field references: + %s + } - private %s() { - // simple value field references: - %s - // various object field references: - %s - } + @Override + public Class<%s> rootReferenceType() { + return %s.class; + } + %s - @Override - public Class<%s> rootReferenceType() { - return %s.class; - } + %s - %s + %s + } + """, + packageName.isEmpty() ? "" : "package " + packageName + ";\n", + metamodelClassName, + scopeInterfaceType(), + metamodelClassName, + className, + metamodelClassName, + metamodelNamesFormatter.formatIndexFieldName( metamodelClassName ), + metamodelClassName, + Stream.concat( + regularProperties.stream().map( p -> p.asProperty( metamodelClassName ) ), + objectProperties.stream().map( p -> p.asProperty( metamodelClassName ) ) + ) + .collect( Collectors.joining( ";\n\tpublic final " ) ), + metamodelClassName, + regularProperties.stream().map( p -> p.asSetInConstructor( metamodelClassName ) ) + .collect( Collectors.joining( "\n\t\t" ) ), + objectProperties.stream().map( p -> p.asSetInConstructor( metamodelClassName ) ) + .collect( Collectors.joining( "\n\t\t" ) ), + metamodelClassName, + metamodelClassName, + scopeMethod( metamodelClassName, className ), + valueFieldReferenceDetails.values().stream() + .map( ValueFieldReferenceDetails::formattedWithTypedField ) + .collect( Collectors.joining( "\n\n" ) ) + .replaceAll( "(?m)^", indent() ), + objectProperties.stream() + .map( f -> f.formatted( scopeTypeName ) ) + .collect( Collectors.joining( "\n\n" ) ) + .replaceAll( "(?m)^", indent() ) + ); + } - %s + private String scopeInterfaceType() { + return ormMapperPresent + ? "org.hibernate.search.mapper.orm.scope.HibernateOrmRootReferenceScope" + : "org.hibernate.search.mapper.pojo.standalone.scope.StandalonePojoRootReferenceScope"; + } + + private String scopeMethod(String metamodelClassName, String entityName) { + return String.format( Locale.ROOT, ormMapperPresent + ? """ + @Override + public org.hibernate.search.mapper.orm.scope.SearchScope<%s, %s> scope(org.hibernate.search.mapper.orm.scope.SearchScopeProvider scopeProvider) { + return scopeProvider.scope( %s.class ); } - """, - packageName.isEmpty() ? "" : "package " + packageName + ";\n", - metamodelClassName, - metamodelClassName, - className, - metamodelClassName, - metamodelNamesFormatter.formatIndexFieldName( metamodelClassName ), - metamodelClassName, - Stream.concat( - regularProperties.stream().map( p -> p.asProperty( metamodelClassName ) ), - objectProperties.stream().map( p -> p.asProperty( metamodelClassName ) ) ) - .collect( Collectors.joining( ";\n\tpublic final " ) ), - metamodelClassName, - regularProperties.stream().map( p -> p.asSetInConstructor( metamodelClassName ) ) - .collect( Collectors.joining( "\n\t\t" ) ), - objectProperties.stream().map( p -> p.asSetInConstructor( metamodelClassName ) ) - .collect( Collectors.joining( "\n\t\t" ) ), - metamodelClassName, - metamodelClassName, - valueFieldReferenceDetails.values().stream() - .map( ValueFieldReferenceDetails::formattedWithTypedField ) - .collect( Collectors.joining( "\n\n" ) ) - .replaceAll( "(?m)^", indent() ), - objectProperties.stream() - .map( f -> f.formatted( scopeTypeName ) ) - .collect( Collectors.joining( "\n\n" ) ) - .replaceAll( "(?m)^", indent() ) - ); - } + """ + : """ + @Override + public org.hibernate.search.mapper.pojo.standalone.scope.SearchScope<%s, %s> scope(org.hibernate.search.mapper.pojo.standalone.scope.SearchScopeProvider scopeProvider) { + return scopeProvider.scope( %s.class ); + } + """, + metamodelClassName, entityName, entityName ); + } - private String indent() { - return "\t".repeat( depth ); - } + private String indent() { + return "\t".repeat( depth ); + } - public String metamodelClassName() { - return metamodelClassName( metamodelNamesFormatter, packageName, className ); - } + public String metamodelClassName() { + return metamodelClassName( metamodelNamesFormatter, packageName, className ); + } - private static String metamodelClassName(MetamodelNamesFormatter metamodelNamesFormatter, String packageName, - String className) { - String classSimpleName; - if ( className.contains( "." ) ) { - classSimpleName = className.substring( packageName.length() + 1 ).replace( '.', '_' ); - } - else { - classSimpleName = className; - } - return metamodelNamesFormatter.formatMetamodelClassName( classSimpleName ); + private static String metamodelClassName(MetamodelNamesFormatter metamodelNamesFormatter, String packageName, + String className) { + String classSimpleName; + if ( className.contains( "." ) ) { + classSimpleName = className.substring( packageName.length() + 1 ).replace( '.', '_' ); } - - public CharSequence fqcn() { - return packageName.isEmpty() ? metamodelClassName() : packageName + "." + metamodelClassName(); + else { + classSimpleName = className; } + return metamodelNamesFormatter.formatMetamodelClassName( classSimpleName ); + } + + public CharSequence fqcn() { + return packageName.isEmpty() ? metamodelClassName() : packageName + "." + metamodelClassName(); } private record RegularProperty( String name, @@ -240,59 +276,62 @@ public String asSetInConstructor(String scopeType) { } } - private record ObjectField(String name, String path, boolean nested, Builder builder) implements Comparable { + private record ObjectField(String name, String path, boolean nested, MetamodelClassWriter writer) + implements Comparable { public String asProperty(String scopeType) { - return builder.metamodelClassName() + " " + name; + return writer.metamodelClassName() + " " + name; } public String asSetInConstructor(String scopeType) { - return "this." + name + " = new " + builder.metamodelClassName() + "();"; + return "this." + name + " = new " + writer.metamodelClassName() + "();"; } public String formatted(String scopeType) { - String metamodelClassName = builder.metamodelClassName(); - return String.format( Locale.ROOT, """ - public static class %s implements %s<%s> { + String metamodelClassName = writer.metamodelClassName(); + return String.format( + Locale.ROOT, """ + public static class %s implements %s<%s> { - public final %s; + public final %s; - private %s() { - // simple value field references: - %s - // various object field references: - %s - } + private %s() { + // simple value field references: + %s + // various object field references: + %s + } - @Override - public String absolutePath() { - return "%s"; - } + @Override + public String absolutePath() { + return "%s"; + } - @Override - public Class<%s> scopeRootType() { - return %s.class; - } + @Override + public Class<%s> scopeRootType() { + return %s.class; + } - %s - } - """, + %s + } + """, metamodelClassName, objectReferenceClass(), scopeType, Stream.concat( - builder.regularProperties.stream().map( p -> p.asProperty( scopeType ) ), - builder.objectProperties.stream().map( p -> p.asProperty( scopeType ) ) ) + writer.regularProperties.stream().map( p -> p.asProperty( scopeType ) ), + writer.objectProperties.stream().map( p -> p.asProperty( scopeType ) ) + ) .collect( Collectors.joining( ";\n\tpublic final " ) ), metamodelClassName, - builder.regularProperties.stream().map( p -> p.asSetInConstructor( scopeType ) ) + writer.regularProperties.stream().map( p -> p.asSetInConstructor( scopeType ) ) .collect( Collectors.joining( "\n\t\t" ) ), - builder.objectProperties.stream().map( p -> p.asSetInConstructor( scopeType ) ) + writer.objectProperties.stream().map( p -> p.asSetInConstructor( scopeType ) ) .collect( Collectors.joining( "\n\t\t" ) ), path, scopeType, scopeType, - builder.objectProperties.stream() - .map( f -> f.formatted( builder.scopeTypeName ) ) + writer.objectProperties.stream() + .map( f -> f.formatted( writer.scopeTypeName ) ) .collect( Collectors.joining( "\n\n" ) ) .replaceAll( "(?m)^", "\t" ) ); @@ -312,5 +351,4 @@ public int compareTo(ObjectField o) { return name.compareTo( o.name ); } } - } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitKind.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitKind.java index c38187b9918..32554e66965 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitKind.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitKind.java @@ -4,7 +4,7 @@ */ package org.hibernate.search.metamodel.processor.writer.impl; -public enum TraitKind { +enum TraitKind { UNTYPED( false, false, false ), TYPED_INPUT( true, true, false ), diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetails.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetails.java index c3bfff1921f..114961f555c 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetails.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetails.java @@ -9,8 +9,8 @@ import org.hibernate.search.util.common.annotation.Incubating; @Incubating -public record TraitReferenceDetails(Class referenceClass, String implementationLabel, TraitKind traitKind, - String extraPropertyName) +record TraitReferenceDetails( Class referenceClass, String implementationLabel, TraitKind traitKind, + String extraPropertyName) implements Comparable { public TraitReferenceDetails(Class referenceClass, String implementationLabel, TraitKind traitKind) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java index 7fe70c8ae24..27aca4e5302 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java @@ -27,9 +27,7 @@ import org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference; import org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference; import org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.SpatialWithinBoundingBoxPredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.SpatialWithinCirclePredicateFieldReference; -import org.hibernate.search.engine.search.reference.predicate.SpatialWithinPolygonPredicateFieldReference; +import org.hibernate.search.engine.search.reference.predicate.SpatialPredicateFieldReference; import org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference; import org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference; import org.hibernate.search.engine.search.reference.projection.DistanceProjectionFieldReference; @@ -39,7 +37,7 @@ import org.hibernate.search.engine.search.reference.sort.DistanceSortFieldReference; import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; -public class TraitReferenceMapping { +class TraitReferenceMapping { private final Map traits; private TraitReferenceMapping() { @@ -65,12 +63,12 @@ private TraitReferenceMapping() { new TraitReferenceDetails( RegexpPredicateFieldReference.class, "P8", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Predicates.SIMPLE_QUERY_STRING, new TraitReferenceDetails( SimpleQueryStringPredicateFieldReference.class, "P9", TraitKind.TYPED_INPUT, "predicateType" ) ); - traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_BOUNDING_BOX, new TraitReferenceDetails( - SpatialWithinBoundingBoxPredicateFieldReference.class, "P10", TraitKind.TYPED_INPUT, "predicateType" ) ); - traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_CIRCLE, new TraitReferenceDetails( - SpatialWithinCirclePredicateFieldReference.class, "P11", TraitKind.TYPED_INPUT, "predicateType" ) ); - traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_POLYGON, new TraitReferenceDetails( - SpatialWithinPolygonPredicateFieldReference.class, "P12", TraitKind.TYPED_INPUT, "predicateType" ) ); + traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_BOUNDING_BOX, + new TraitReferenceDetails( SpatialPredicateFieldReference.class, "P10", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_CIRCLE, + new TraitReferenceDetails( SpatialPredicateFieldReference.class, "P10", TraitKind.UNTYPED ) ); + traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_POLYGON, + new TraitReferenceDetails( SpatialPredicateFieldReference.class, "P10", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Predicates.TERMS, new TraitReferenceDetails( TermsPredicateFieldReference.class, "P13", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Predicates.WILDCARD, diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TypedFieldReferenceDetails.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TypedFieldReferenceDetails.java index ab58ee7e6bc..e47c2f18104 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TypedFieldReferenceDetails.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TypedFieldReferenceDetails.java @@ -14,8 +14,8 @@ import org.hibernate.search.engine.search.common.ValueModel; -public record TypedFieldReferenceDetails( String name, String identifier, Collection typeVariables, - List properties, Collection implementedInterfaces) { +record TypedFieldReferenceDetails( String name, String identifier, Collection typeVariables, + List properties, Collection implementedInterfaces) { public static TypedFieldReferenceDetails of(Collection traits) { StringBuilder name = new StringBuilder(); Set typeVariables = new LinkedHashSet<>(); diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java index 9624fa59d38..1d828ef9492 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java @@ -6,7 +6,7 @@ import java.util.Locale; -public record ValueFieldReferenceDetails(TypedFieldReferenceDetails typedField) { +record ValueFieldReferenceDetails(TypedFieldReferenceDetails typedField) { public String formatted() { // I - dsl type (input) ValueModel.MAPPING diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/CombineTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/CombineTest.java deleted file mode 100644 index ec215527b3c..00000000000 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/CombineTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.metamodel.processor; - -import java.util.List; - -import org.hibernate.search.engine.backend.types.IndexFieldTraits; -import org.hibernate.search.metamodel.processor.writer.impl.TraitReferenceDetails; -import org.hibernate.search.metamodel.processor.writer.impl.TraitReferenceMapping; -import org.hibernate.search.metamodel.processor.writer.impl.TypedFieldReferenceDetails; -import org.hibernate.search.metamodel.processor.writer.impl.ValueFieldReferenceDetails; - -import org.junit.jupiter.api.Test; - -public class CombineTest { - - @Test - void name() { - TraitReferenceMapping instance = TraitReferenceMapping.instance(); - - TraitReferenceDetails match = instance.reference( IndexFieldTraits.Predicates.MATCH ); - //TraitReferenceDetails field = instance.reference( IndexFieldTraits.Projections.FIELD ); - - TypedFieldReferenceDetails details = TypedFieldReferenceDetails.of( List.of( match ) ); - System.err.println( details.formatted() ); - System.err.println( details.constructorCall( "valueModel", "in", "out" ) ); - - System.err.println( new ValueFieldReferenceDetails( details ).formatted() ); - } - -} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettingsTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettingsTest.java new file mode 100644 index 00000000000..9f431c057c7 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettingsTest.java @@ -0,0 +1,26 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Map; + +import org.hibernate.search.backend.lucene.cfg.LuceneBackendSettings; + +import org.junit.jupiter.api.Test; + +class HibernateSearchMetamodelProcessorSettingsTest { + + @Test + void defaultVersionsUpToDate() { + HibernateSearchMetamodelProcessorSettings.Configuration configuration = + new HibernateSearchMetamodelProcessorSettings.Configuration( Map.of() ); + assertThat( configuration.luceneVersion() ) + .isEqualTo( LuceneBackendSettings.Defaults.LUCENE_VERSION.toString() ); + assertThat( configuration.elasticsearchVersion() ) + .isEqualTo( System.getProperty( "org.hibernate.search.integrationtest.backend.elasticsearch.version" ) ); + } +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java index 49c6d4193b9..3899a3a1814 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java @@ -4,16 +4,20 @@ */ package org.hibernate.search.metamodel.processor; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; import java.util.Set; import javax.annotation.processing.Processor; +import javax.tools.Diagnostic; import javax.tools.DiagnosticCollector; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; @@ -21,8 +25,10 @@ import javax.tools.StandardLocation; import javax.tools.ToolProvider; +import org.hibernate.search.metamodel.processor.model.FieldTypesEntity; import org.hibernate.search.metamodel.processor.model.ISBN; import org.hibernate.search.metamodel.processor.model.MyEmbeddedEntity; +import org.hibernate.search.metamodel.processor.model.MyEntityWithBinders; import org.hibernate.search.metamodel.processor.model.MyEnum; import org.hibernate.search.metamodel.processor.model.MyIndexedEntity; import org.hibernate.search.metamodel.processor.model.SomeGenerics; @@ -63,11 +69,29 @@ void smoke() { getSourceFile( SomeRandomType.class ), getSourceFile( SomeRandomTypeBinder.class ), getSourceFile( ISBN.class ), - getSourceFile( MyEnum.class ) + getSourceFile( MyEnum.class ), + getSourceFile( FieldTypesEntity.class ) ); + diagnostics.getDiagnostics().forEach( System.out::println ); + + assertThat( diagnostics.getDiagnostics().stream().map( Diagnostic::getKind ) ) + .doesNotContain( Diagnostic.Kind.ERROR ); + } + @Test + void binderWarning() { + DiagnosticCollector diagnostics = new DiagnosticCollector<>(); + + compile( + new HibernateSearchMetamodelProcessor(), diagnostics, + getSourceFile( MyEntityWithBinders.class ), + getSourceFile( SomeRandomType.class ), + getSourceFile( SomeRandomTypeBinder.class ) + ); diagnostics.getDiagnostics().forEach( System.out::println ); + assertThat( diagnostics.getDiagnostics().stream().map( Diagnostic::getKind ) ) + .contains( Diagnostic.Kind.WARNING ); } public boolean compile(Processor annotationProcessor, DiagnosticCollector diagnostics, @@ -96,6 +120,7 @@ public boolean compile(Processor annotationProcessor, DiagnosticCollector dependencies() { return Set.of( dependency( "hibernate-search-mapper-pojo-base.jar" ), + dependency( "hibernate-search-mapper-pojo-standalone.jar" ), dependency( "hibernate-search-engine.jar" ) ); } @@ -112,10 +137,17 @@ public File getSourceFile(Class clazz) { private static Path getTargetDir() { - // target/test-classes - String targetClassesDir = HibernateSearchMetamodelProcessorTest.class.getProtectionDomain() - .getCodeSource().getLocation().getFile(); - return Path.of( targetClassesDir ).getParent(); + try { + // target/test-classes + var targetClassesDir = HibernateSearchMetamodelProcessorTest.class.getProtectionDomain() + .getCodeSource().getLocation().toURI(); + // use URI to make things work on Win as well: + return Paths.get( targetClassesDir ).getParent(); + } + catch (URISyntaxException e) { + fail( e.getMessage() ); + return null; + } } } diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/FieldTypesEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/FieldTypesEntity.java new file mode 100644 index 00000000000..75bda6899fc --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/FieldTypesEntity.java @@ -0,0 +1,87 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.MonthDay; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Year; +import java.time.YearMonth; +import java.time.ZonedDateTime; + +import org.hibernate.search.engine.spatial.GeoPoint; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.ScaledNumberField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; + +@Indexed +public class FieldTypesEntity { + @DocumentId + public String id; + @FullTextField + public String text; + @KeywordField + public String keywordString; + @ScaledNumberField + public BigDecimal bigDecimal; + @ScaledNumberField + public BigInteger bigInteger; + @GenericField + public boolean bool; + @GenericField + public Boolean boool; + @GenericField + public byte aByte; + @GenericField + public double aDouble; + @GenericField + public float aFloat; + @GenericField + public int aInt; + @GenericField + public long aLong; + @GenericField + public short aShort; + @GenericField + public GeoPoint geoPoint; + @GenericField + public Instant instant; + @GenericField + public LocalDate localDate; + @GenericField + public LocalDateTime localDateTime; + @GenericField + public LocalTime localTime; + @GenericField + public MonthDay monthDay; + @GenericField + public OffsetDateTime offsetDateTime; + @GenericField + public OffsetTime offsetTime; + @GenericField + public Year year; + @GenericField + public YearMonth yearMonth; + @GenericField + public ZonedDateTime zonedDateTime; + + @VectorField(dimension = 128) + public float[] floatVector; + @VectorField(dimension = 128) + public byte[] byteVector; + + @KeywordField + public MyEnum myEnum; +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEntityWithBinders.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEntityWithBinders.java new file mode 100644 index 00000000000..826e1a69b6e --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEntityWithBinders.java @@ -0,0 +1,18 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.PropertyBinderRef; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.PropertyBinding; + +@Indexed +public class MyEntityWithBinders { + @DocumentId + private String id; + @PropertyBinding(binder = @PropertyBinderRef(type = SomeRandomTypeBinder.class)) + private SomeRandomType someRandomType; +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java index a48896e86ed..5795d5bd0a8 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Set; +import org.hibernate.search.engine.backend.types.Projectable; import org.hibernate.search.engine.spatial.GeoPoint; import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.GeoPointBinding; import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.Latitude; @@ -35,7 +36,7 @@ public class MyIndexedEntity { @GenericField private LocalDate date; - @KeywordField + @KeywordField(projectable = Projectable.YES) private String keyword; @FullTextField diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetailsTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetailsTest.java new file mode 100644 index 00000000000..3c48370cb21 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetailsTest.java @@ -0,0 +1,34 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.writer.impl; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.hibernate.search.engine.backend.types.IndexFieldTraits; + +import org.junit.jupiter.api.Test; + +class TraitReferenceDetailsTest { + @Test + void combine() { + TraitReferenceMapping instance = TraitReferenceMapping.instance(); + + TraitReferenceDetails match = instance.reference( IndexFieldTraits.Predicates.MATCH ); + TraitReferenceDetails field = instance.reference( IndexFieldTraits.Projections.FIELD ); + + TypedFieldReferenceDetails details = TypedFieldReferenceDetails.of( List.of( match, field ) ); + String referenceClassText = details.formatted(); + assertThat( referenceClassText ).contains( "TypedFieldReferenceP2R1", + "MatchPredicateFieldReference", "FieldProjectionFieldReference" ); + + assertThat( details.constructorCall( "valueModel", "in", "out" ) ) + .isEqualTo( "new TypedFieldReferenceP2R1<>(absolutePath, scopeRootType, valueModel, in, out);" ); + + assertThat( new ValueFieldReferenceDetails( details ).formatted() ).contains( "ValueFieldReferenceP2R1", + "TypedFieldReferenceP2R1", "mapping", "raw", "string" ); + } +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/TraitReferenceMappingTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMappingTest.java similarity index 91% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/TraitReferenceMappingTest.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMappingTest.java index 692e39c85fa..647d06f1722 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/TraitReferenceMappingTest.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMappingTest.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor; +package org.hibernate.search.metamodel.processor.writer.impl; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -13,8 +13,6 @@ import java.util.stream.Stream; import org.hibernate.search.engine.backend.types.IndexFieldTraits; -import org.hibernate.search.metamodel.processor.writer.impl.TraitReferenceDetails; -import org.hibernate.search.metamodel.processor.writer.impl.TraitReferenceMapping; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; From 7accf745225b6d9e2f2cfa83b8f79f27874748c7 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 17 Apr 2025 18:38:57 +0200 Subject: [PATCH 17/25] HSEARCH-5300 Address various eclipse compiler + Sonar issues --- Jenkinsfile | 2 +- .../ElasticsearchSearchIndexScopeImpl.java | 6 +- ...ticsearchSearchAggregationFactoryImpl.java | 2 +- ...asticsearchSearchPredicateFactoryImpl.java | 2 +- .../ElasticsearchSearchSortFactoryImpl.java | 4 +- .../impl/LuceneSearchIndexScopeImpl.java | 4 +- .../LuceneSearchAggregationFactoryImpl.java | 2 +- .../LuceneSearchPredicateFactoryImpl.java | 2 +- .../dsl/impl/LuceneSearchSortFactoryImpl.java | 2 +- .../loggers/LoggerCategoriesProcessor.java | 10 ++-- build/reports/pom.xml | 45 +++++++++------ .../dsl/RangePredicateMatchingStep.java | 9 +++ .../AbstractRangePredicateFieldMoreStep.java | 7 +-- .../PhrasePredicateFieldMoreStepImpl.java | 2 +- .../impl/PhrasePredicateFieldStepImpl.java | 4 +- ...QueryStringPredicateFieldMoreStepImpl.java | 2 +- .../QueryStringPredicateFieldStepImpl.java | 2 +- ...QueryStringPredicateFieldMoreStepImpl.java | 2 +- ...mpleQueryStringPredicateFieldStepImpl.java | 2 +- .../spi/AbstractSearchPredicateFactory.java | 4 +- .../impl/SearchSortFactoryExtensionStep.java | 4 +- .../predicate/RangePredicateBaseIT.java | 2 + .../search/predicate/SearchPredicateIT.java | 2 +- .../orm/elasticsearch/AggregationTypesIT.java | 2 +- .../orm/elasticsearch/FieldTypesIT.java | 2 +- .../orm/elasticsearch/PredicateTypesIT.java | 2 +- .../orm/elasticsearch/ProjectionTypesIT.java | 2 +- .../orm/elasticsearch/SortTypesIT.java | 2 +- .../orm/lucene/AggregationTypesIT.java | 2 +- .../metamodel/orm/lucene/FieldTypesIT.java | 2 +- .../orm/lucene/PredicateTypesIT.java | 2 +- .../orm/lucene/ProjectionTypesIT.java | 2 +- .../metamodel/orm/lucene/SortTypesIT.java | 2 +- .../elasticsearch/AggregationTypesIT.java | 2 +- .../elasticsearch/FieldTypesIT.java | 2 +- .../elasticsearch/PredicateTypesIT.java | 2 +- .../elasticsearch/ProjectionTypesIT.java | 2 +- .../standalone/elasticsearch/SortTypesIT.java | 2 +- .../standalone/lucene/AggregationTypesIT.java | 2 +- .../standalone/lucene/FieldTypesIT.java | 2 +- .../standalone/lucene/PredicateTypesIT.java | 2 +- .../standalone/lucene/ProjectionTypesIT.java | 2 +- .../standalone/lucene/SortTypesIT.java | 2 +- integrationtest/pom.xml | 17 ++++-- .../impl/LuceneSearchIndexScopeImpl.java | 4 +- .../LuceneSearchAggregationFactoryImpl.java | 2 +- .../LuceneSearchPredicateFactoryImpl.java | 2 +- .../dsl/impl/LuceneSearchSortFactoryImpl.java | 2 +- metamodel/metamodel-processor/pom.xml | 56 ++++++++++++++----- .../HibernateSearchMetamodelProcessor.java | 28 ++++++++-- ...essorStandardFieldAnnotationProcessor.java | 4 +- .../impl/ProcessorVectorFieldProcessor.java | 11 ++-- ...xedEntityMetamodelAnnotationProcessor.java | 16 +++--- .../writer/impl/TraitReferenceMapping.java | 44 ++++++++++----- .../impl/ValueFieldReferenceDetails.java | 4 +- .../common/impl/StubSearchIndexScope.java | 2 +- 56 files changed, 226 insertions(+), 129 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b45c6c00fc7..1d20e44a5df 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -499,7 +499,7 @@ stage('Non-default environments') { // we'd better recompile everything with the same compiler rather than get some strange errors mavenNonDefaultBuild buildEnv, """ \ -DskipTests -DskipITs \ - -P${buildEnv.mavenProfile},!javaModuleITs \ + -P${buildEnv.mavenProfile},!javaModuleITs,!metamodelITs -pl '!:hibernate-search-documentation,!:hibernate-search-reports' \ -Dgib.buildAll=true \ """ } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/scope/model/impl/ElasticsearchSearchIndexScopeImpl.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/scope/model/impl/ElasticsearchSearchIndexScopeImpl.java index 06790ce68d3..385dda24105 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/scope/model/impl/ElasticsearchSearchIndexScopeImpl.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/scope/model/impl/ElasticsearchSearchIndexScopeImpl.java @@ -172,12 +172,12 @@ public

ElasticsearchSearchQueryBuilder

select(BackendSessionContext sessi @Override public ElasticsearchSearchPredicateFactory predicateFactory() { - return new ElasticsearchSearchPredicateFactoryImpl( SearchPredicateDslContext.root( this ) ); + return new ElasticsearchSearchPredicateFactoryImpl<>( SearchPredicateDslContext.root( this ) ); } @Override public ElasticsearchSearchSortFactory sortFactory() { - return new ElasticsearchSearchSortFactoryImpl( SearchSortDslContext + return new ElasticsearchSearchSortFactoryImpl<>( SearchSortDslContext .root( this, ElasticsearchSearchSortFactoryImpl::new, predicateFactory() ) ); } @@ -188,7 +188,7 @@ public ElasticsearchSearchProjectionFactory projectionFacto @Override public ElasticsearchSearchAggregationFactory aggregationFactory() { - return new ElasticsearchSearchAggregationFactoryImpl( + return new ElasticsearchSearchAggregationFactoryImpl<>( SearchAggregationDslContext.root( this, predicateFactory() ) ); } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/impl/ElasticsearchSearchAggregationFactoryImpl.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/impl/ElasticsearchSearchAggregationFactoryImpl.java index 633662fcc28..0a9bd8ed024 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/impl/ElasticsearchSearchAggregationFactoryImpl.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/aggregation/dsl/impl/ElasticsearchSearchAggregationFactoryImpl.java @@ -30,7 +30,7 @@ public ElasticsearchSearchAggregationFactoryImpl( @Override public ElasticsearchSearchAggregationFactory withRoot(String objectFieldPath) { - return new ElasticsearchSearchAggregationFactoryImpl( dslContext.rescope( + return new ElasticsearchSearchAggregationFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/impl/ElasticsearchSearchPredicateFactoryImpl.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/impl/ElasticsearchSearchPredicateFactoryImpl.java index b4b5f77bd1e..3df4026ae94 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/impl/ElasticsearchSearchPredicateFactoryImpl.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/dsl/impl/ElasticsearchSearchPredicateFactoryImpl.java @@ -27,7 +27,7 @@ public ElasticsearchSearchPredicateFactoryImpl( @Override public ElasticsearchSearchPredicateFactory withRoot(String objectFieldPath) { - return new ElasticsearchSearchPredicateFactoryImpl( dslContext.rescope( + return new ElasticsearchSearchPredicateFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); } diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/impl/ElasticsearchSearchSortFactoryImpl.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/impl/ElasticsearchSearchSortFactoryImpl.java index 461291b27d0..55ae9cded84 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/impl/ElasticsearchSearchSortFactoryImpl.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/sort/dsl/impl/ElasticsearchSearchSortFactoryImpl.java @@ -32,7 +32,7 @@ public ElasticsearchSearchSortFactoryImpl( @Override public ElasticsearchSearchSortFactory withRoot(String objectFieldPath) { - return new ElasticsearchSearchSortFactoryImpl( dslContext.rescope( + return new ElasticsearchSearchSortFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } @@ -48,6 +48,6 @@ public SortThenStep fromJson(String jsonString) { } private SortThenStep staticThenStep(ElasticsearchSearchSort sort) { - return new StaticSortThenStep( dslContext, sort ); + return new StaticSortThenStep<>( dslContext, sort ); } } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java index e0e1b54c943..d3a375c0352 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java @@ -168,7 +168,7 @@ public LuceneSearchPredicateFactory predicateFactory() { @Override public LuceneSearchSortFactory sortFactory() { - return new LuceneSearchSortFactoryImpl( SearchSortDslContext + return new LuceneSearchSortFactoryImpl<>( SearchSortDslContext .root( this, LuceneSearchSortFactoryImpl::new, predicateFactory() ) ); } @@ -179,7 +179,7 @@ public LuceneSearchProjectionFactory projectionFactory() { @Override public LuceneSearchAggregationFactory aggregationFactory() { - return new LuceneSearchAggregationFactoryImpl( SearchAggregationDslContext.root( this, predicateFactory() ) ); + return new LuceneSearchAggregationFactoryImpl<>( SearchAggregationDslContext.root( this, predicateFactory() ) ); } @Override diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java index b22685c68a8..d0669962c30 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java @@ -27,7 +27,7 @@ public LuceneSearchAggregationFactoryImpl( @Override public LuceneSearchAggregationFactory withRoot(String objectFieldPath) { - return new LuceneSearchAggregationFactoryImpl( dslContext.rescope( + return new LuceneSearchAggregationFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java index bb73666ba1b..9f3e6c99424 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java @@ -26,7 +26,7 @@ public LuceneSearchPredicateFactoryImpl(SearchPredicateDslContext withRoot(String objectFieldPath) { - return new LuceneSearchPredicateFactoryImpl( dslContext.rescope( + return new LuceneSearchPredicateFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); } diff --git a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java index 925879d6e3a..e23de2f0e99 100644 --- a/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java +++ b/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java @@ -29,7 +29,7 @@ public LuceneSearchSortFactoryImpl( @Override public LuceneSearchSortFactory withRoot(String objectFieldPath) { - return new LuceneSearchSortFactoryImpl( dslContext.rescope( + return new LuceneSearchSortFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } diff --git a/build/config/src/main/java/org/hibernate/search/build/report/loggers/LoggerCategoriesProcessor.java b/build/config/src/main/java/org/hibernate/search/build/report/loggers/LoggerCategoriesProcessor.java index 1a54937ca45..c2fec0f0f38 100644 --- a/build/config/src/main/java/org/hibernate/search/build/report/loggers/LoggerCategoriesProcessor.java +++ b/build/config/src/main/java/org/hibernate/search/build/report/loggers/LoggerCategoriesProcessor.java @@ -54,11 +54,6 @@ public synchronized void init(ProcessingEnvironment processingEnv) { messager = processingEnv.getMessager(); moduleName = processingEnv.getOptions().get( Configuration.MODULE_NAME ); - if ( moduleName == null || moduleName.isBlank() ) { - throw new IllegalArgumentException( - "Module name cannot be null nor blank. Specify the %s annotation processor argument to define the module name" - .formatted( Configuration.MODULE_NAME ) ); - } } @Override @@ -118,6 +113,11 @@ public boolean process(Set annotations, RoundEnvironment writer.write( "# This Hibernate Search module does not use any logging categories.\n" ); } else { + if ( moduleName == null || moduleName.isBlank() ) { + throw new IllegalArgumentException( + "Module name cannot be null nor blank. Specify the %s annotation processor argument to define the module name" + .formatted( Configuration.MODULE_NAME ) ); + } Map data = new LinkedHashMap<>(); data.put( ReportConstants.MODULE_NAME, moduleName ); data.put( ReportConstants.CATEGORIES, toYamlCategories( categories, categoryLevels ) ); diff --git a/build/reports/pom.xml b/build/reports/pom.xml index 63a527eb849..309b3bf2dd5 100644 --- a/build/reports/pom.xml +++ b/build/reports/pom.xml @@ -148,22 +148,6 @@ hibernate-search-integrationtest-mapper-orm-jakarta-batch test - - org.hibernate.search - hibernate-search-integrationtest-metamodel-standalone-lucene - - - org.hibernate.search - hibernate-search-integrationtest-metamodel-standalone-elasticsearch - - - org.hibernate.search - hibernate-search-integrationtest-metamodel-orm-lucene - - - org.hibernate.search - hibernate-search-integrationtest-metamodel-orm-elasticsearch - org.hibernate.search hibernate-search-documentation @@ -295,6 +279,35 @@ + + metamodelITs + + + [17,) + + + + org.hibernate.search + hibernate-search-integrationtest-metamodel-standalone-lucene + test + + + org.hibernate.search + hibernate-search-integrationtest-metamodel-standalone-elasticsearch + test + + + org.hibernate.search + hibernate-search-integrationtest-metamodel-orm-lucene + test + + + org.hibernate.search + hibernate-search-integrationtest-metamodel-orm-elasticsearch + test + + + + [17,) + + + metamodel/standalone-lucene + metamodel/standalone-elasticsearch + metamodel/orm-lucene + metamodel/orm-elasticsearch + + springITs diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java index e0e1b54c943..d3a375c0352 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/scope/model/impl/LuceneSearchIndexScopeImpl.java @@ -168,7 +168,7 @@ public LuceneSearchPredicateFactory predicateFactory() { @Override public LuceneSearchSortFactory sortFactory() { - return new LuceneSearchSortFactoryImpl( SearchSortDslContext + return new LuceneSearchSortFactoryImpl<>( SearchSortDslContext .root( this, LuceneSearchSortFactoryImpl::new, predicateFactory() ) ); } @@ -179,7 +179,7 @@ public LuceneSearchProjectionFactory projectionFactory() { @Override public LuceneSearchAggregationFactory aggregationFactory() { - return new LuceneSearchAggregationFactoryImpl( SearchAggregationDslContext.root( this, predicateFactory() ) ); + return new LuceneSearchAggregationFactoryImpl<>( SearchAggregationDslContext.root( this, predicateFactory() ) ); } @Override diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java index b22685c68a8..d0669962c30 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/aggregation/dsl/impl/LuceneSearchAggregationFactoryImpl.java @@ -27,7 +27,7 @@ public LuceneSearchAggregationFactoryImpl( @Override public LuceneSearchAggregationFactory withRoot(String objectFieldPath) { - return new LuceneSearchAggregationFactoryImpl( dslContext.rescope( + return new LuceneSearchAggregationFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java index bb73666ba1b..9f3e6c99424 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/predicate/dsl/impl/LuceneSearchPredicateFactoryImpl.java @@ -26,7 +26,7 @@ public LuceneSearchPredicateFactoryImpl(SearchPredicateDslContext withRoot(String objectFieldPath) { - return new LuceneSearchPredicateFactoryImpl( dslContext.rescope( + return new LuceneSearchPredicateFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ) ) ); } diff --git a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java index 925879d6e3a..e23de2f0e99 100644 --- a/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java +++ b/lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/sort/dsl/impl/LuceneSearchSortFactoryImpl.java @@ -29,7 +29,7 @@ public LuceneSearchSortFactoryImpl( @Override public LuceneSearchSortFactory withRoot(String objectFieldPath) { - return new LuceneSearchSortFactoryImpl( dslContext.rescope( + return new LuceneSearchSortFactoryImpl<>( dslContext.rescope( dslContext.scope().withRoot( objectFieldPath ), dslContext.predicateFactory().withRoot( objectFieldPath ) ) ); } diff --git a/metamodel/metamodel-processor/pom.xml b/metamodel/metamodel-processor/pom.xml index 5997f095772..c13c4478534 100644 --- a/metamodel/metamodel-processor/pom.xml +++ b/metamodel/metamodel-processor/pom.xml @@ -69,19 +69,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - - - default-compile - - none - - - - - org.apache.maven.plugins maven-dependency-plugin @@ -110,4 +97,47 @@ + + + + compiler-eclipse + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + default-compile + + none + false + + + + default-testCompile + + none + false + + + + noparameters-testCompile + + none + false + + + + + + + + + diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java index 59cdd37a649..20799fb92ab 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java @@ -4,6 +4,9 @@ */ package org.hibernate.search.metamodel.processor; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.List; import java.util.Set; @@ -14,6 +17,7 @@ import javax.annotation.processing.SupportedOptions; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; +import javax.tools.Diagnostic; import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; import org.hibernate.search.metamodel.processor.impl.IndexedEntityMetamodelAnnotationProcessor; @@ -23,7 +27,9 @@ // this way we can also work with user-defined ones (at some point): @SupportedAnnotationTypes("*") // Currently this is more of a placeholder for future config options: -@SupportedOptions({ HibernateSearchMetamodelProcessorSettings.ADD_GENERATED_ANNOTATION }) +@SupportedOptions({ + HibernateSearchMetamodelProcessorSettings.ADD_GENERATED_ANNOTATION, + HibernateSearchMetamodelProcessorSettings.BACKEND_VERSION }) @org.hibernate.search.util.common.annotation.impl.SuppressJQAssistant( reason = "JQAssistant has issue with detecting that getSupportedSourceVersion is an overridden method.") public class HibernateSearchMetamodelProcessor extends AbstractProcessor { @@ -34,9 +40,10 @@ public class HibernateSearchMetamodelProcessor extends AbstractProcessor { @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init( processingEnv ); - context = new HibernateSearchMetamodelProcessorContext( processingEnv.getElementUtils(), processingEnv.getTypeUtils(), - processingEnv.getMessager(), processingEnv.getFiler(), - new HibernateSearchMetamodelProcessorSettings.Configuration( processingEnv.getOptions() ) ); + context = + new HibernateSearchMetamodelProcessorContext( processingEnv.getElementUtils(), processingEnv.getTypeUtils(), + processingEnv.getMessager(), processingEnv.getFiler(), + new HibernateSearchMetamodelProcessorSettings.Configuration( processingEnv.getOptions() ) ); processors = List.of( new IndexedEntityMetamodelAnnotationProcessor( context ) ); } @@ -48,7 +55,18 @@ public SourceVersion getSupportedSourceVersion() { @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { for ( MetamodelAnnotationProcessor processor : processors ) { - processor.process( roundEnv ); + try { + processor.process( roundEnv ); + } + catch (Throwable e) { + try ( var sw = new StringWriter(); var pw = new PrintWriter( sw ) ) { + e.printStackTrace( pw ); + context.messager().printMessage( Diagnostic.Kind.ERROR, sw.toString() ); + } + catch (IOException ex) { + throw new RuntimeException( ex ); + } + } } return false; } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java index 3073f1d88cb..e957950053f 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java @@ -33,11 +33,11 @@ PropertyMappingStandardFieldOptionsStep initFieldMappingContext(PropertyMappi } protected Searchable getSearchable(AnnotationMirror annotation) { - return Searchable.valueOf( getAnnotationValueAsString( annotation, "searchable", "DEFAULT" ) ); + return Searchable.valueOf( getAnnotationValueAsString( annotation, "searchable", Searchable.DEFAULT.name() ) ); } protected Projectable getProjectable(AnnotationMirror annotation) { - return Projectable.valueOf( getAnnotationValueAsString( annotation, "projectable", "DEFAULT" ) ); + return Projectable.valueOf( getAnnotationValueAsString( annotation, "projectable", Projectable.DEFAULT.name() ) ); } abstract PropertyMappingStandardFieldOptionsStep initStandardFieldMappingContext( diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java index ebc64f5b96d..0014214aaa6 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java @@ -17,6 +17,7 @@ import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFinalStep; import org.hibernate.search.engine.backend.types.dsl.VectorFieldTypeOptionsStep; import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; +import org.hibernate.search.mapper.pojo.extractor.mapping.annotation.ContainerExtract; import org.hibernate.search.mapper.pojo.extractor.mapping.programmatic.ContainerExtractorPath; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.AnnotationDefaultValues; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingFieldOptionsStep; @@ -118,24 +119,26 @@ protected Optional> configureField(PropertyBindingCon return Optional.of( optionsStep ); } + @Override protected ContainerExtractorPath toContainerExtractorPath(AnnotationMirror extraction, ProcessorAnnotationProcessorContext context) { if ( extraction == null ) { return ContainerExtractorPath.noExtractors(); } - return toContainerExtractorPath( extraction, "NO", context ); + return toContainerExtractorPath( extraction, ContainerExtract.NO.name(), context ); } protected VectorSimilarity getVectorSimilarity(AnnotationMirror annotation) { - return VectorSimilarity.valueOf( getAnnotationValueAsString( annotation, "vectorSimilarity", "DEFAULT" ) ); + return VectorSimilarity + .valueOf( getAnnotationValueAsString( annotation, "vectorSimilarity", VectorSimilarity.DEFAULT.name() ) ); } protected Searchable getSearchable(AnnotationMirror annotation) { - return Searchable.valueOf( getAnnotationValueAsString( annotation, "searchable", "DEFAULT" ) ); + return Searchable.valueOf( getAnnotationValueAsString( annotation, "searchable", Searchable.DEFAULT.name() ) ); } protected Projectable getProjectable(AnnotationMirror annotation) { - return Projectable.valueOf( getAnnotationValueAsString( annotation, "projectable", "DEFAULT" ) ); + return Projectable.valueOf( getAnnotationValueAsString( annotation, "projectable", Projectable.DEFAULT.name() ) ); } protected String getIndexNullAs(AnnotationMirror annotation) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java index 74c1635471f..a50ed917b75 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java @@ -155,15 +155,13 @@ public static void processTypeAndProperties(TypeElement typeElement, TypeMapping } flattenedAnnotations( ctx.types(), typeElement ) - .forEach( annotationMirror -> { - ProcessorTypeMappingAnnotationProcessor.processor( annotationMirror ) - .ifPresent( p -> p.process( - typeMappingContext, - annotationMirror, - typeElement, - ctx - ) ); - } ); + .forEach( annotationMirror -> ProcessorTypeMappingAnnotationProcessor.processor( annotationMirror ) + .ifPresent( p -> p.process( + typeMappingContext, + annotationMirror, + typeElement, + ctx + ) ) ); AtomicReference documentId = new AtomicReference<>(); AtomicReference ormId = new AtomicReference<>(); diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java index 27aca4e5302..97e87d873e2 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java @@ -38,6 +38,10 @@ import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference; class TraitReferenceMapping { + private static final String EXTRA_PROPERTY_PREDICATE_TYPE = "predicateType"; + private static final String EXTRA_PROPERTY_AGGREGATION_TYPE = "aggregationType"; + private static final String EXTRA_PROPERTY_PROJECTION_TYPE = "projectionType"; + private static final String EXTRA_PROPERTY_SORT_TYPE = "sortType"; private final Map traits; private TraitReferenceMapping() { @@ -46,23 +50,27 @@ private TraitReferenceMapping() { traits.put( IndexFieldTraits.Predicates.EXISTS, new TraitReferenceDetails( ExistsPredicateFieldReference.class, "P0", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Predicates.KNN, - new TraitReferenceDetails( KnnPredicateFieldReference.class, "P1", TraitKind.TYPED_INPUT, "predicateType" ) ); + new TraitReferenceDetails( KnnPredicateFieldReference.class, "P1", TraitKind.TYPED_INPUT, + EXTRA_PROPERTY_PREDICATE_TYPE ) ); traits.put( IndexFieldTraits.Predicates.MATCH, - new TraitReferenceDetails( MatchPredicateFieldReference.class, "P2", TraitKind.TYPED_INPUT, "predicateType" ) ); + new TraitReferenceDetails( MatchPredicateFieldReference.class, "P2", TraitKind.TYPED_INPUT, + EXTRA_PROPERTY_PREDICATE_TYPE ) ); traits.put( IndexFieldTraits.Predicates.NESTED, new TraitReferenceDetails( NestedPredicateFieldReference.class, "P3", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Predicates.PHRASE, new TraitReferenceDetails( PhrasePredicateFieldReference.class, "P4", - TraitKind.TYPED_INPUT, "predicateType" ) ); + TraitKind.TYPED_INPUT, EXTRA_PROPERTY_PREDICATE_TYPE + ) ); traits.put( IndexFieldTraits.Predicates.PREFIX, new TraitReferenceDetails( PrefixPredicateFieldReference.class, "P5", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Predicates.RANGE, - new TraitReferenceDetails( RangePredicateFieldReference.class, "P6", TraitKind.TYPED_INPUT, "predicateType" ) ); + new TraitReferenceDetails( RangePredicateFieldReference.class, "P6", TraitKind.TYPED_INPUT, + EXTRA_PROPERTY_PREDICATE_TYPE ) ); traits.put( IndexFieldTraits.Predicates.QUERY_STRING, new TraitReferenceDetails( - QueryStringPredicateFieldReference.class, "P7", TraitKind.TYPED_INPUT, "predicateType" ) ); + QueryStringPredicateFieldReference.class, "P7", TraitKind.TYPED_INPUT, EXTRA_PROPERTY_PREDICATE_TYPE ) ); traits.put( IndexFieldTraits.Predicates.REGEXP, new TraitReferenceDetails( RegexpPredicateFieldReference.class, "P8", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Predicates.SIMPLE_QUERY_STRING, new TraitReferenceDetails( - SimpleQueryStringPredicateFieldReference.class, "P9", TraitKind.TYPED_INPUT, "predicateType" ) ); + SimpleQueryStringPredicateFieldReference.class, "P9", TraitKind.TYPED_INPUT, EXTRA_PROPERTY_PREDICATE_TYPE ) ); traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_BOUNDING_BOX, new TraitReferenceDetails( SpatialPredicateFieldReference.class, "P10", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_CIRCLE, @@ -77,13 +85,15 @@ private TraitReferenceMapping() { traits.put( IndexFieldTraits.Sorts.DISTANCE, new TraitReferenceDetails( DistanceSortFieldReference.class, "S0", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Sorts.FIELD, - new TraitReferenceDetails( FieldSortFieldReference.class, "S1", TraitKind.TYPED_INPUT, "sortType" ) ); + new TraitReferenceDetails( FieldSortFieldReference.class, "S1", TraitKind.TYPED_INPUT, + EXTRA_PROPERTY_SORT_TYPE ) ); traits.put( IndexFieldTraits.Projections.DISTANCE, new TraitReferenceDetails( DistanceProjectionFieldReference.class, "R0", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Projections.FIELD, new TraitReferenceDetails( FieldProjectionFieldReference.class, "R1", - TraitKind.TYPED_OUTPUT, "projectionType" ) ); + TraitKind.TYPED_OUTPUT, EXTRA_PROPERTY_PROJECTION_TYPE + ) ); traits.put( IndexFieldTraits.Projections.HIGHLIGHT, new TraitReferenceDetails( HighlightProjectionFieldReference.class, "R2", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Projections.OBJECT, @@ -92,21 +102,27 @@ private TraitReferenceMapping() { // TODO, can we really use output for the range agg ? // if not we should probably consider having different agg types, one that match inputs and other oputputs with different .aggregationType() in them. traits.put( IndexFieldTraits.Aggregations.RANGE, new TraitReferenceDetails( RangeAggregationFieldReference.class, "A0", - TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + TraitKind.TYPED_OUTPUT, EXTRA_PROPERTY_AGGREGATION_TYPE + ) ); traits.put( IndexFieldTraits.Aggregations.TERMS, new TraitReferenceDetails( TermsAggregationFieldReference.class, "A1", - TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + TraitKind.TYPED_OUTPUT, EXTRA_PROPERTY_AGGREGATION_TYPE + ) ); traits.put( IndexFieldTraits.Aggregations.SUM, new TraitReferenceDetails( SumAggregationFieldReference.class, "A2", - TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + TraitKind.TYPED_OUTPUT, EXTRA_PROPERTY_AGGREGATION_TYPE + ) ); traits.put( IndexFieldTraits.Aggregations.MIN, new TraitReferenceDetails( MinAggregationFieldReference.class, "A3", - TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + TraitKind.TYPED_OUTPUT, EXTRA_PROPERTY_AGGREGATION_TYPE + ) ); traits.put( IndexFieldTraits.Aggregations.MAX, new TraitReferenceDetails( MaxAggregationFieldReference.class, "A4", - TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + TraitKind.TYPED_OUTPUT, EXTRA_PROPERTY_AGGREGATION_TYPE + ) ); traits.put( IndexFieldTraits.Aggregations.COUNT, new TraitReferenceDetails( CountAggregationFieldReference.class, "A5", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Aggregations.COUNT_DISTINCT, new TraitReferenceDetails( CountDistinctAggregationFieldReference.class, "A6", TraitKind.UNTYPED ) ); traits.put( IndexFieldTraits.Aggregations.AVG, new TraitReferenceDetails( AvgAggregationFieldReference.class, "A7", - TraitKind.TYPED_OUTPUT, "aggregationType" ) ); + TraitKind.TYPED_OUTPUT, EXTRA_PROPERTY_AGGREGATION_TYPE + ) ); this.traits = Collections.unmodifiableMap( traits ); } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java index 1d828ef9492..40533743d13 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java @@ -86,7 +86,7 @@ public String asType(String scopeType, String inputType, String outputType, Stri public String constructorCall(String name, String scopeType, String inputType, String outputType, String indexType, String rawType) { - return "new " + name() + "<>(\"" + name + "\", " + scopeType + ".class, " + inputType + ".class, " + outputType - + ".class, " + indexType + ".class, " + rawType + ".class);"; + return String.format( Locale.ROOT, "new %s<>(\"%s\", %s.class, %s.class, %s.class, %s.class, %s.class);", name(), name, + scopeType, inputType, outputType, indexType, rawType ); } } diff --git a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/common/impl/StubSearchIndexScope.java b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/common/impl/StubSearchIndexScope.java index 03a5a388393..f3209e460f7 100644 --- a/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/common/impl/StubSearchIndexScope.java +++ b/util/internal/integrationtest/common/src/main/java/org/hibernate/search/util/impl/integrationtest/common/stub/backend/search/common/impl/StubSearchIndexScope.java @@ -124,7 +124,7 @@ public SearchProjectionFactory projectionFactory() { @Override public SearchAggregationFactory aggregationFactory() { - return new StubSearchAggregationFactory( SearchAggregationDslContext.root( this, predicateFactory() ) ); + return new StubSearchAggregationFactory<>( SearchAggregationDslContext.root( this, predicateFactory() ) ); } @Override From d52babd60d2e51b1ab5e305db5b6e477be3bebfc Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Wed, 23 Apr 2025 10:28:54 +0200 Subject: [PATCH 18/25] HSEARCH-5300 Start adjusting the migration guide --- documentation/src/main/asciidoc/migration/index.adoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/src/main/asciidoc/migration/index.adoc b/documentation/src/main/asciidoc/migration/index.adoc index e6d5210bacf..afb10cd1b5e 100644 --- a/documentation/src/main/asciidoc/migration/index.adoc +++ b/documentation/src/main/asciidoc/migration/index.adoc @@ -79,7 +79,9 @@ no database schema update is necessary for these tables. [[vectorsize]] === Vector search max dimension -For the Lucene backend, the vector search maximum dimension has been increased from 4096 to 16000. Increasing the vector size, to leverage a different, higher dimension model, implies a larger memory requirement on behalf of the JVM. +For the Lucene backend, the maximum vector dimension has been increased from 4096 to 16000. +Increasing the vector size, to leverage a different, higher dimensional model, implies a larger memory requirement on behalf of the JVM +as well as an increase of the index size. [[configuration]] == Configuration From 786f5f44db44143d09fbb8db971a8491b15fd015 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Wed, 23 Apr 2025 11:42:27 +0200 Subject: [PATCH 19/25] HSEARCH-5300 Add even more @Incubating to various field references --- .../reference/aggregation/AggregationFieldReference.java | 2 ++ .../reference/aggregation/AvgAggregationFieldReference.java | 3 +++ .../reference/aggregation/CountAggregationFieldReference.java | 3 +++ .../aggregation/CountDistinctAggregationFieldReference.java | 3 +++ .../reference/aggregation/MaxAggregationFieldReference.java | 3 +++ .../reference/aggregation/MinAggregationFieldReference.java | 3 +++ .../reference/aggregation/RangeAggregationFieldReference.java | 3 +++ .../reference/aggregation/SumAggregationFieldReference.java | 3 +++ .../reference/aggregation/TermsAggregationFieldReference.java | 3 +++ .../reference/aggregation/TypedAggregationFieldReference.java | 2 ++ .../search/reference/object/FlattenedFieldReference.java | 3 +++ .../engine/search/reference/object/NestedFieldReference.java | 3 +++ .../engine/search/reference/object/ObjectFieldReference.java | 2 ++ .../reference/predicate/ExistsPredicateFieldReference.java | 3 +++ .../search/reference/predicate/KnnPredicateFieldReference.java | 3 +++ .../reference/predicate/MatchPredicateFieldReference.java | 3 +++ .../reference/predicate/NestedPredicateFieldReference.java | 3 +++ .../reference/predicate/PhrasePredicateFieldReference.java | 3 +++ .../search/reference/predicate/PredicateFieldReference.java | 3 ++- .../reference/predicate/PrefixPredicateFieldReference.java | 3 +++ .../predicate/QueryStringPredicateFieldReference.java | 3 +++ .../reference/predicate/RangePredicateFieldReference.java | 3 +++ .../reference/predicate/RegexpPredicateFieldReference.java | 3 +++ .../predicate/SimpleQueryStringPredicateFieldReference.java | 3 +++ .../reference/predicate/SpatialPredicateFieldReference.java | 3 +++ .../reference/predicate/TermsPredicateFieldReference.java | 3 +++ .../reference/predicate/TypedPredicateFieldReference.java | 2 ++ .../reference/predicate/WildcardPredicateFieldReference.java | 3 +++ .../reference/projection/DistanceProjectionFieldReference.java | 3 +++ .../reference/projection/FieldProjectionFieldReference.java | 3 +++ .../projection/HighlightProjectionFieldReference.java | 3 +++ .../reference/projection/ObjectProjectionFieldReference.java | 3 +++ .../search/reference/projection/ProjectionFieldReference.java | 2 ++ .../reference/projection/TypedProjectionFieldReference.java | 2 ++ .../search/reference/sort/DistanceSortFieldReference.java | 3 +++ .../engine/search/reference/sort/FieldSortFieldReference.java | 3 +++ .../engine/search/reference/sort/ScoreSortFieldReference.java | 3 +++ .../engine/search/reference/sort/SortFieldReference.java | 2 ++ .../engine/search/reference/sort/TypedSortFieldReference.java | 2 ++ 39 files changed, 108 insertions(+), 1 deletion(-) diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AggregationFieldReference.java index b1c38aaed4f..e003771087f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AggregationFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AggregationFieldReference.java @@ -5,6 +5,8 @@ package org.hibernate.search.engine.search.reference.aggregation; import org.hibernate.search.engine.search.reference.FieldReference; +import org.hibernate.search.util.common.annotation.Incubating; +@Incubating public interface AggregationFieldReference extends FieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AvgAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AvgAggregationFieldReference.java index 92b777059fc..0b74fc65e1b 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AvgAggregationFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AvgAggregationFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.aggregation; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface AvgAggregationFieldReference extends TypedAggregationFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountAggregationFieldReference.java index c9b5afb22a1..68e64836aab 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountAggregationFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountAggregationFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.aggregation; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface CountAggregationFieldReference extends AggregationFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountDistinctAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountDistinctAggregationFieldReference.java index 525453642e4..34902cc99b2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountDistinctAggregationFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/CountDistinctAggregationFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.aggregation; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface CountDistinctAggregationFieldReference extends AggregationFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MaxAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MaxAggregationFieldReference.java index df27ede89d7..ab4031bc3d1 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MaxAggregationFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MaxAggregationFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.aggregation; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface MaxAggregationFieldReference extends TypedAggregationFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MinAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MinAggregationFieldReference.java index bde4800dcd2..ccc892c1fb9 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MinAggregationFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/MinAggregationFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.aggregation; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface MinAggregationFieldReference extends TypedAggregationFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/RangeAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/RangeAggregationFieldReference.java index 7a5cdfaaf5e..40cf1f9d240 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/RangeAggregationFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/RangeAggregationFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.aggregation; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface RangeAggregationFieldReference extends TypedAggregationFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/SumAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/SumAggregationFieldReference.java index 99bca43ef1f..e23c1db1c58 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/SumAggregationFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/SumAggregationFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.aggregation; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface SumAggregationFieldReference extends TypedAggregationFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TermsAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TermsAggregationFieldReference.java index 061c24ee540..da03b7f2481 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TermsAggregationFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TermsAggregationFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.aggregation; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface TermsAggregationFieldReference extends TypedAggregationFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TypedAggregationFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TypedAggregationFieldReference.java index 96f638f1593..ae7e966dd2c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TypedAggregationFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/TypedAggregationFieldReference.java @@ -5,7 +5,9 @@ package org.hibernate.search.engine.search.reference.aggregation; import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.util.common.annotation.Incubating; +@Incubating public interface TypedAggregationFieldReference extends AggregationFieldReference { Class aggregationType(); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/object/FlattenedFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/FlattenedFieldReference.java index 7379071e118..1166d1f0255 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/object/FlattenedFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/FlattenedFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.object; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface FlattenedFieldReference extends ObjectFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/object/NestedFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/NestedFieldReference.java index 9d7e7fdfb50..2e24420a2e2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/object/NestedFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/NestedFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.object; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface NestedFieldReference extends ObjectFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/object/ObjectFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/ObjectFieldReference.java index 8d6b616e640..75a22ade75c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/object/ObjectFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/object/ObjectFieldReference.java @@ -5,6 +5,8 @@ package org.hibernate.search.engine.search.reference.object; import org.hibernate.search.engine.search.reference.FieldReference; +import org.hibernate.search.util.common.annotation.Incubating; +@Incubating public interface ObjectFieldReference extends FieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/ExistsPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/ExistsPredicateFieldReference.java index 3392b749dcb..7fc880d0371 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/ExistsPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/ExistsPredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface ExistsPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/KnnPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/KnnPredicateFieldReference.java index 8fe308e63d1..c22c86310be 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/KnnPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/KnnPredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface KnnPredicateFieldReference extends TypedPredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/MatchPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/MatchPredicateFieldReference.java index 84d1fef7fa6..b63b576ca65 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/MatchPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/MatchPredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface MatchPredicateFieldReference extends TypedPredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/NestedPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/NestedPredicateFieldReference.java index 94f1aebc193..19d55f819a2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/NestedPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/NestedPredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface NestedPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PhrasePredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PhrasePredicateFieldReference.java index 9f7d1501913..70e16b429cd 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PhrasePredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PhrasePredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface PhrasePredicateFieldReference extends TypedPredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java index 18ee62d7ad2..daa92fed232 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PredicateFieldReference.java @@ -5,7 +5,8 @@ package org.hibernate.search.engine.search.reference.predicate; import org.hibernate.search.engine.search.reference.FieldReference; +import org.hibernate.search.util.common.annotation.Incubating; - +@Incubating public interface PredicateFieldReference extends FieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java index 27ba63af8ff..b5dd3fca63e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/PrefixPredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface PrefixPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/QueryStringPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/QueryStringPredicateFieldReference.java index 9a5dc6afd26..7d1d7ec1894 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/QueryStringPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/QueryStringPredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface QueryStringPredicateFieldReference extends TypedPredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RangePredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RangePredicateFieldReference.java index b2b314aee13..ed142a1f635 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RangePredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RangePredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface RangePredicateFieldReference extends TypedPredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java index 93012be9e5f..7291d09b10f 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/RegexpPredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface RegexpPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SimpleQueryStringPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SimpleQueryStringPredicateFieldReference.java index de6b471a451..3886896ca46 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SimpleQueryStringPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SimpleQueryStringPredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface SimpleQueryStringPredicateFieldReference extends TypedPredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialPredicateFieldReference.java index 6c660b712b2..0f79a49ff55 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/SpatialPredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface SpatialPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java index 596ab19939a..faa44953c16 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TermsPredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface TermsPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TypedPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TypedPredicateFieldReference.java index 1bec47b7a0a..39af1e4749a 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TypedPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/TypedPredicateFieldReference.java @@ -6,7 +6,9 @@ import org.hibernate.search.engine.search.common.ValueModel; import org.hibernate.search.engine.search.reference.FieldReference; +import org.hibernate.search.util.common.annotation.Incubating; +@Incubating public interface TypedPredicateFieldReference extends FieldReference { Class predicateType(); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java index c21aaadf675..75e35f1c5e2 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/WildcardPredicateFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.predicate; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface WildcardPredicateFieldReference extends PredicateFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java index 5c49f5ed167..27fbfd3caaa 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/DistanceProjectionFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.projection; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface DistanceProjectionFieldReference extends ProjectionFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/FieldProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/FieldProjectionFieldReference.java index a0157d25c7b..a0bf18c5929 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/FieldProjectionFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/FieldProjectionFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.projection; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface FieldProjectionFieldReference extends TypedProjectionFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/HighlightProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/HighlightProjectionFieldReference.java index 07a314ff9f6..8abe485066c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/HighlightProjectionFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/HighlightProjectionFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.projection; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface HighlightProjectionFieldReference extends ProjectionFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ObjectProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ObjectProjectionFieldReference.java index 1d4e7e4e4e9..6b6c9a00c30 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ObjectProjectionFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ObjectProjectionFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.projection; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface ObjectProjectionFieldReference extends ProjectionFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ProjectionFieldReference.java index 7cca7f2941f..2bdb588553b 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ProjectionFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/ProjectionFieldReference.java @@ -5,6 +5,8 @@ package org.hibernate.search.engine.search.reference.projection; import org.hibernate.search.engine.search.reference.FieldReference; +import org.hibernate.search.util.common.annotation.Incubating; +@Incubating public interface ProjectionFieldReference extends FieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java index 013e8febc50..d1eb01718ec 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/TypedProjectionFieldReference.java @@ -5,7 +5,9 @@ package org.hibernate.search.engine.search.reference.projection; import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.util.common.annotation.Incubating; +@Incubating public interface TypedProjectionFieldReference extends ProjectionFieldReference { Class projectionType(); diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java index 1969747be84..07f4e7d0c89 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/DistanceSortFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.sort; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface DistanceSortFieldReference extends SortFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/FieldSortFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/FieldSortFieldReference.java index 0a20f240fa7..f69e6c59998 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/FieldSortFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/FieldSortFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.sort; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface FieldSortFieldReference extends TypedSortFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/ScoreSortFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/ScoreSortFieldReference.java index 9300a25b71c..ff997dec1d1 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/ScoreSortFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/ScoreSortFieldReference.java @@ -4,5 +4,8 @@ */ package org.hibernate.search.engine.search.reference.sort; +import org.hibernate.search.util.common.annotation.Incubating; + +@Incubating public interface ScoreSortFieldReference extends TypedSortFieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/SortFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/SortFieldReference.java index 0dcb59996da..ac3ed6b5750 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/SortFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/SortFieldReference.java @@ -5,6 +5,8 @@ package org.hibernate.search.engine.search.reference.sort; import org.hibernate.search.engine.search.reference.FieldReference; +import org.hibernate.search.util.common.annotation.Incubating; +@Incubating public interface SortFieldReference extends FieldReference { } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/TypedSortFieldReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/TypedSortFieldReference.java index 100d39a8c44..bf01bac7a72 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/TypedSortFieldReference.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/TypedSortFieldReference.java @@ -5,7 +5,9 @@ package org.hibernate.search.engine.search.reference.sort; import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.util.common.annotation.Incubating; +@Incubating public interface TypedSortFieldReference extends SortFieldReference { Class sortType(); From c7f6ac3eb92cc62553a2d3a06c0c893c45e11f0c Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Wed, 23 Apr 2025 11:45:10 +0200 Subject: [PATCH 20/25] HSEARCH-5300 Introduce "generic" Any*Reference mostly for simple cases/tests --- .../search/reference/FieldReferences.java | 44 +++++++++++++++++++ .../aggregation/AnyAggregationReference.java | 36 +++++++++++++++ .../predicate/AnyPredicateReference.java | 41 +++++++++++++++++ .../projection/AnyProjectionReference.java | 32 ++++++++++++++ .../reference/sort/AnySortReference.java | 30 +++++++++++++ 5 files changed, 183 insertions(+) create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/FieldReferences.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AnyAggregationReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/AnyPredicateReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/projection/AnyProjectionReference.java create mode 100644 engine/src/main/java/org/hibernate/search/engine/search/reference/sort/AnySortReference.java diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/FieldReferences.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/FieldReferences.java new file mode 100644 index 00000000000..96215d6bc9b --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/FieldReferences.java @@ -0,0 +1,44 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference; + +import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.engine.search.reference.aggregation.AnyAggregationReference; +import org.hibernate.search.engine.search.reference.predicate.AnyPredicateReference; +import org.hibernate.search.engine.search.reference.projection.AnyProjectionReference; +import org.hibernate.search.engine.search.reference.sort.AnySortReference; +import org.hibernate.search.util.common.annotation.Incubating; + +/** + * A set of util methods to create generic field references, mostly for testing purposes or trivial cases where just a few references are required. + *

+ * While it is expected that the generated Hibernate Search static metamodel will contain + * more precise field references that would match the actual field capabilities, these generic references can + * be used by the users if they decide to opt-out of using the generated static metamodel + * and would just want to create a few simple pre-defined references. + */ +@Incubating +public interface FieldReferences { + + static AnySortReference anySortReference(String absolutePath, Class scopeRootType, ValueModel valueModel, + Class sortType) { + return new AnySortReference<>( absolutePath, scopeRootType, valueModel, sortType ); + } + + static AnyProjectionReference anyProjectionReference(String absolutePath, Class scopeRootType, + ValueModel valueModel, Class projectionType) { + return new AnyProjectionReference<>( absolutePath, scopeRootType, valueModel, projectionType ); + } + + static AnyPredicateReference anyPredicateReference(String absolutePath, Class scopeRootType, + ValueModel valueModel, Class predicateType) { + return new AnyPredicateReference<>( absolutePath, scopeRootType, valueModel, predicateType ); + } + + static AnyAggregationReference anyAggregationReference(String absolutePath, Class scopeRootType, + ValueModel valueModel, Class aggregationType) { + return new AnyAggregationReference<>( absolutePath, scopeRootType, valueModel, aggregationType ); + } +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AnyAggregationReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AnyAggregationReference.java new file mode 100644 index 00000000000..0e148348e39 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/aggregation/AnyAggregationReference.java @@ -0,0 +1,36 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.aggregation; + +import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.util.common.annotation.Incubating; + +/** + * A generic aggregated-field reference that can be manually created and passed to any aggregation-DSL methods that require a field reference. + *

+ * While it is expected that the generated Hibernate Search static metamodel will contain + * more precise field references that would match the actual field capabilities, this generic reference can + * be used by the users if they decide to opt-out of using the generated static metamodel + * and would just want to create a few simple pre-defined references. + * + * @param absolutePath The absolut field path. + * @param scopeRootType The class representing the scope root type. + * @param valueModel The model of aggregated values. See {@link ValueModel}. + * @param aggregationType The class representing the type of the aggregated field, as per {@code valueModel}. + * @param Scope root type + * @param The type of the aggregated field. + */ +@Incubating +public record AnyAggregationReference( String absolutePath, Class scopeRootType, ValueModel valueModel, + Class aggregationType) + implements AvgAggregationFieldReference, + CountAggregationFieldReference, + CountDistinctAggregationFieldReference, + MaxAggregationFieldReference, + MinAggregationFieldReference, + RangeAggregationFieldReference, + SumAggregationFieldReference, + TermsAggregationFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/AnyPredicateReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/AnyPredicateReference.java new file mode 100644 index 00000000000..766dc3500d2 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/predicate/AnyPredicateReference.java @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.predicate; + +import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.util.common.annotation.Incubating; + +/** + * A generic predicate-field reference that can be manually created and passed to any predicate-DSL methods that require a field reference. + *

+ * While it is expected that the generated Hibernate Search static metamodel will contain + * more precise field references that would match the actual field capabilities, this generic reference can + * be used by the users if they decide to opt-out of using the generated static metamodel + * and would just want to create a few simple pre-defined references. + * + * @param absolutePath The absolut field path. + * @param scopeRootType The class representing the scope root type. + * @param valueModel The model of values used in the predicate. See {@link ValueModel}. + * @param predicateType The class representing the type of the field used in a predicate, as per {@code valueModel}. + * @param Scope root type + * @param The type of the field used in a predicate. + */ +@Incubating +public record AnyPredicateReference( String absolutePath, Class scopeRootType, ValueModel valueModel, + Class predicateType) + implements ExistsPredicateFieldReference, + KnnPredicateFieldReference, + MatchPredicateFieldReference, + NestedPredicateFieldReference, + PhrasePredicateFieldReference, + PrefixPredicateFieldReference, + QueryStringPredicateFieldReference, + RangePredicateFieldReference, + RegexpPredicateFieldReference, + SimpleQueryStringPredicateFieldReference, + SpatialPredicateFieldReference, + TermsPredicateFieldReference, + WildcardPredicateFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/AnyProjectionReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/AnyProjectionReference.java new file mode 100644 index 00000000000..1b5e6c05646 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/projection/AnyProjectionReference.java @@ -0,0 +1,32 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.projection; + +import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.util.common.annotation.Incubating; + +/** + * A generic projected-field reference that can be manually created and passed to any projection-DSL methods that require a field reference. + *

+ * While it is expected that the generated Hibernate Search static metamodel will contain + * more precise field references that would match the actual field capabilities, this generic reference can + * be used by the users if they decide to opt-out of using the generated static metamodel + * and would just want to create a few simple pre-defined references. + * + * @param absolutePath The absolut field path. + * @param scopeRootType The class representing the scope root type. + * @param valueModel The model of projected values. See {@link ValueModel}. + * @param projectionType The class representing the type of the projected field, as per {@code valueModel}. + * @param Scope root type + * @param The type of the projected field. + */ +@Incubating +public record AnyProjectionReference(String absolutePath, Class scopeRootType, ValueModel valueModel, + Class projectionType) + implements DistanceProjectionFieldReference, + FieldProjectionFieldReference, + HighlightProjectionFieldReference, + ObjectProjectionFieldReference { +} diff --git a/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/AnySortReference.java b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/AnySortReference.java new file mode 100644 index 00000000000..d34dc7ee1a7 --- /dev/null +++ b/engine/src/main/java/org/hibernate/search/engine/search/reference/sort/AnySortReference.java @@ -0,0 +1,30 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.engine.search.reference.sort; + +import org.hibernate.search.engine.search.common.ValueModel; +import org.hibernate.search.util.common.annotation.Incubating; + +/** + * A generic sort-field reference that can be manually created and passed to any sort-DSL methods that require a field reference. + *

+ * While it is expected that the generated Hibernate Search static metamodel will contain + * more precise field references that would match the actual field capabilities, this generic reference can + * be used by the users if they decide to opt-out of using the generated static metamodel + * and would just want to create a few simple pre-defined references. + * + * @param absolutePath The absolut field path. + * @param scopeRootType The class representing the scope root type. + * @param valueModel The model of sort values. See {@link ValueModel}. + * @param sortType The class representing the type of the sorted field, as per {@code valueModel}. + * @param Scope root type + * @param The type of the sorted field. + */ +@Incubating +public record AnySortReference(String absolutePath, Class scopeRootType, ValueModel valueModel, Class sortType) + implements DistanceSortFieldReference, + FieldSortFieldReference, + ScoreSortFieldReference { +} From bb2151daefef74b502518a64b47004b84679b04f Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Wed, 23 Apr 2025 15:16:34 +0200 Subject: [PATCH 21/25] HSEARCH-5300 Mention search DSL changes in the migration guide --- .../src/main/asciidoc/migration/index.adoc | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/documentation/src/main/asciidoc/migration/index.adoc b/documentation/src/main/asciidoc/migration/index.adoc index afb10cd1b5e..2578af3fcef 100644 --- a/documentation/src/main/asciidoc/migration/index.adoc +++ b/documentation/src/main/asciidoc/migration/index.adoc @@ -119,6 +119,37 @@ to be in a more consistent format compared with other logging categories. - Hibernate Search now uses logging categories instead of class names to log messages. See link:https://docs.jboss.org/hibernate/search/{hibernateSearchVersionShort}/reference/en-US/html_single/#logging-categories-aggregated[Appendix B: List of all available logging categories] to find out what categories are available. +- With introduction of the field references (`org.hibernate.search.engine.search.reference.pass:[*]`) most of the Search DSL +interfaces (`org.hibernate.search.engine.search.pass:[*].dsl.pass:[*]`) got an extra type argument `SR` (scope root type). +In simple scenarios where the query is created in one go there will be no code changes required: ++ +[source,java,subs="+attributes"] +---- +List result = searchSession.search( Book.class ) + .where( f -> f.match().field( "title" ).matching( "robot" ) ) + .fetchHits( 20 ); +---- ++ +In scenarios where there's work with the affected Search DSL interfaces is required user can choose between one of the following options: ++ +==== +[source,java,subs="+attributes"] +---- +var scope = searchSession.scope( Book.class ); // <1> +SearchScope scope = searchSession.scope( Book.class ); // <2> +SearchScope scope = searchSession.scope( Book.class ); // <3> +SearchScope scope = searchSession.scope( List.of( Book.class, Magazine.class ) ); // <4> +SearchScope scope = searchSession.scope( Book.class ); // <5> +SearchScope scope = searchSession.scope( Book.class ); // <6> +---- +<1> Use `var` if possible. Otherwise, if you need to pass the DSL interfaces to some other methods as parameters, +consider one of the following options: +<2> Use the `?` wildcard. +<3> Use the same type as your search entity. +<4> Use the common supertype for a scope of multiple search entities. +<5> Use the class generated for the static metamodel of this search entity. +<6> Use any class. +==== [[spi]] == SPI From 1158e1ddbd37fe95f3b03dc9238720d8cd55406f Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 24 Apr 2025 13:41:48 +0200 Subject: [PATCH 22/25] HSEARCH-5300 Add documentation for static metamodel --- .../reference/_static-metamodel-overview.adoc | 68 ++++ .../_static-metamodel-processor.adoc | 116 ++++++ .../public/reference/_static-metamodel.adoc | 17 + .../main/asciidoc/public/reference/index.adoc | 2 + .../search/metamodel/Author.java | 67 ++++ .../search/metamodel/Author__.java | 125 +++++++ .../documentation/search/metamodel/Book.java | 107 ++++++ .../search/metamodel/Book__.java | 338 ++++++++++++++++++ .../documentation/search/metamodel/Genre.java | 12 + .../search/metamodel/MetamodelIT.java | 186 ++++++++++ 10 files changed, 1038 insertions(+) create mode 100644 documentation/src/main/asciidoc/public/reference/_static-metamodel-overview.adoc create mode 100644 documentation/src/main/asciidoc/public/reference/_static-metamodel-processor.adoc create mode 100644 documentation/src/main/asciidoc/public/reference/_static-metamodel.adoc create mode 100644 documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author.java create mode 100644 documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author__.java create mode 100644 documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book.java create mode 100644 documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book__.java create mode 100644 documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Genre.java create mode 100644 documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java diff --git a/documentation/src/main/asciidoc/public/reference/_static-metamodel-overview.adoc b/documentation/src/main/asciidoc/public/reference/_static-metamodel-overview.adoc new file mode 100644 index 00000000000..f7a88b97068 --- /dev/null +++ b/documentation/src/main/asciidoc/public/reference/_static-metamodel-overview.adoc @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Red Hat Inc. and Hibernate Authors +[[static-metamodel-overview]] += Overview of the static metamodel + +include::../components/_incubating-warning.adoc[] + +The static metamodel class describes the index structure. Each indexed entity (index) is represented by a single class +that may contain inner classes describing the embeddables (i.e. nested/flattened objects). These classes contain <> +representing index fields and their search capabilities. + +The name of this root class is constructed from the indexed entity name by adding `pass:[__]` (two underscores) suffix, e.g. `MySearchEntitypass:[__]`. +If the indexed entity is a (static) inner class, then all the owning classes will be part of the name delimited with a `pass:[_]` (single underscore), +e.g. `MyOuterClasspass:[_]MySearchEntitypass:[__]`. +These classes are created in the same package where the search entity they represent is located. + +The root metamodel class that describes the indexed entity has a static field `INDEX` that users can use to interact with the metamodel. +It serves two primary purposes: + +* It simplifies creating the search scope and building search queries for such scope. +* It provides a way to reference index fields when constructing queries. + +NOTE: While the default naming convention was described in this section, +there are plans to provide more flexibility in this area to the users (see https://hibernate.atlassian.net/browse/HSEARCH-5366[HSEARCH-5366]) . + +==== +[source, JAVA, indent=0, subs="+callouts"] +---- +include::{sourcedir}/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java[tags=entryPoint] +---- +<1> Obtain the search session. +<2> Create the search scope over the book index. Using such scope in the <> will automatically +limit acceptable field references to the ones obtained from the `Book__.INDEX` +<3> Use the metamodel to reference the fields when creating the queries. +==== + +[[static-metamodel-processor-field-reference-types]] +== Field reference types + +A field reference type describes the set of search capabilities a particular index field has, in particular, +what kind of projections/aggregations/predicates/sorts are allowed, if any. It does so by implementing a +subset of search traits interfaces defined in `org.hibernate.search.engine.search.reference.pass:[*]`, which in turn allows +performing compile-time checks when building <>. + +==== +[source, JAVA, indent=0, subs="+callouts"] +---- +include::{sourcedir}/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java[tags=compileCheck-pass] +---- +<1> If the title field is projectable then this compiles works fine, +otherwise compilation fails with an error similar to: ++ +---- +error: no suitable method found for field(ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9) +---- ++ +as such field reference (for a filed with `Projectable.NO`) will not implement the required `FieldProjectionFieldReference` interface. +==== + +The field reference also provides a way to quickly switch between <> when necessary. + +==== +[source, JAVA, indent=0, subs="+callouts"] +---- +include::{sourcedir}/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java[tags=valueModel] +---- +<1> Calling `string()` on a field reference is an eqivalent to `.field( "genre" ).matching( , ValueModel.STRING )` +==== diff --git a/documentation/src/main/asciidoc/public/reference/_static-metamodel-processor.adoc b/documentation/src/main/asciidoc/public/reference/_static-metamodel-processor.adoc new file mode 100644 index 00000000000..2ac1aa2ed0b --- /dev/null +++ b/documentation/src/main/asciidoc/public/reference/_static-metamodel-processor.adoc @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Red Hat Inc. and Hibernate Authors +[[static-metamodel-processor]] += Annotation processor + +include::../components/_incubating-warning.adoc[] + +[[static-metamodel-processor-enabling]] +== Enabling the annotation processor + +Hibernate Search provides a dedicated annotation processor to generate the static metamodel classes. +This annotation processor is located in the `org.hibernate.search:hibernate-search-metamodel-processor`. + +The annotation processor has to be added to the build, e.g. for Maven: + +==== +[source,XML,subs="+attributes"] +---- + + maven-compiler-plugin + + + default-compile + + + org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor <1> + + + + org.hibernate.search + hibernate-search-metamodel-processor <2> + + + org.hibernate.search + hibernate-search-backend-lucene <3> + + + + + + +---- + +<1> Provide the fully qualified class name of the annotation processor that generates the metamodel. +<2> Add the `org.hibernate.search:hibernate-search-metamodel-processor` dependency as an annotation processor path for the Maven compiler plugin to be able to actually find the processor. +<3> Add the backend dependency, in this example, the <>, as an annotation processor path. +It is important to include the same backend that the application is using to make sure that the generated metamodel classes reflect all the backend specifics. +For example, backends might have different defaults, resulting in a different set of field traits depending on the backend. + +NOTE: The version of both annotation processor and backend dependencies are skipped in the definition of the annotation paths, as in case the Hibernate Search BOM is imported via dependency management, the compiler plugin will use the managed versions. +This way the generated metamodel classes will be based on the same backend that the application uses. +==== + +[[static-metamodel-processor-configuration]] +== Configuration + +The annotation processor options are passed as the compiler arguments with the `-A` key: + +==== +[source,XML,subs="+attributes"] +---- + + maven-compiler-plugin + + + default-compile + + + -Aorg.hibernate.search.metamodel.processor.generated_annotation.timestamp=false <1> + <2> + + <3> + + + + +---- + +<1> Pass the annotation processor parameters using the `-A` key. +<2> Pass any other compiler arguments required by the build. +<3> Further compiler plugin configuration. +==== + +The following annotation processor configuration properties are available: + +[[static-metamodel-processor-configuration-generated_annotation-add]]`org.hibernate.search.metamodel.processor.generated_annotation.add`:: +Description::: +Whether to add the `@Generated` annotation to the generated static metamodel classes. +Default value::: +`true` + +[[static-metamodel-processor-configuration-generated_annotation-timestamp]]`org.hibernate.search.metamodel.processor.generated_annotation.timestamp`:: +Description::: +Defines whether the `@Generated` annotation includes the `date` attribute. +Having the date attribute will result in non-reproducible builds, as the timestamp will be different for each compilation. +Hence, it is disabled by default. +Default value::: +`false` + +[[static-metamodel-processor-configuration-add_generated_annotation]]`org.hibernate.search.metamodel.processor.backend.version`:: +Description::: +Explicitly define the backend version. By default, the processor will use the latest compatible version of the backend. +This option can be used if the static metamodel is required for an older backend version. +Default value::: +`` + +[[static-metamodel-processor-limitations]] +== Current annotation processor limitations + +While the annotation processor is in its early stages of development, it has a few limitations: + +* Any use of <> will be ignored and should produce a compiler warning. +This means that if the search entities rely on custom binders, fields that those binders produce will be missing from the generated metamodel. +* <> are not supported. +* <> is also unsupported by the annotation processor. +As the annotation processor cannot easily read programmatic mapping definitions, this limitation is here to stay. diff --git a/documentation/src/main/asciidoc/public/reference/_static-metamodel.adoc b/documentation/src/main/asciidoc/public/reference/_static-metamodel.adoc new file mode 100644 index 00000000000..604b80a726f --- /dev/null +++ b/documentation/src/main/asciidoc/public/reference/_static-metamodel.adoc @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Red Hat Inc. and Hibernate Authors +[[static-metamodel]] += Static metamodel + +include::../components/_incubating-warning.adoc[] + +Hibernate Search static metamodel represents the index structure +that provides a type-safe way of creating search queries through the <>. + +:leveloffset: +1 + +include::_static-metamodel-overview.adoc[] + +include::_static-metamodel-processor.adoc[] + +:leveloffset: -1 diff --git a/documentation/src/main/asciidoc/public/reference/index.adoc b/documentation/src/main/asciidoc/public/reference/index.adoc index efbab2c38ab..ca4c5af9a72 100644 --- a/documentation/src/main/asciidoc/public/reference/index.adoc +++ b/documentation/src/main/asciidoc/public/reference/index.adoc @@ -63,6 +63,8 @@ include::_backend-elasticsearch.adoc[] include::_coordination.adoc[] +include::_static-metamodel.adoc[] + include::_integrations.adoc[] include::_limitations.adoc[] diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author.java b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author.java new file mode 100644 index 00000000000..bab09f43dca --- /dev/null +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author.java @@ -0,0 +1,67 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.documentation.search.metamodel; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToMany; + +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; + +@Entity +@Indexed +public class Author { + + @Id + private Integer id; + + @FullTextField(analyzer = "name") + private String firstName; + + @FullTextField(analyzer = "name") + private String lastName; + + @ManyToMany(mappedBy = "authors") + private List books = new ArrayList<>(); + + public Author() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public List getBooks() { + return books; + } + + public void setBooks(List books) { + this.books = books; + } +} diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author__.java b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author__.java new file mode 100644 index 00000000000..c87687519c2 --- /dev/null +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author__.java @@ -0,0 +1,125 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.documentation.search.metamodel; + +/** + * Note: this class was created by an annotation processor and copied to the sources, + * so that we do not run the AP on an entire documentation module. + */ +@javax.annotation.processing.Generated(value = "org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor") +public final class Author__ + implements + org.hibernate.search.mapper.orm.scope.HibernateOrmRootReferenceScope { + + public static final Author__ INDEX = new Author__(); + + public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 firstName; + public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 lastName; + + private Author__() { + // simple value field references: + this.firstName = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "firstName", Author__.class, String.class, + String.class, String.class, String.class ); + this.lastName = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "lastName", Author__.class, String.class, String.class, + String.class, String.class ); + // various object field references: + + } + + @Override + public Class rootReferenceType() { + return Author__.class; + } + + @Override + public org.hibernate.search.mapper.orm.scope.SearchScope scope( + org.hibernate.search.mapper.orm.scope.SearchScopeProvider scopeProvider) { + return scopeProvider.scope( Author.class ); + } + + public static class ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 + extends TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 { + + private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 mapping; + private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 raw; + private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 string; + + public ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9( + String absolutePath, + Class scopeRootType, + Class inputType, + Class outputType, + Class indexType, + Class rawType + ) { + super( absolutePath, scopeRootType, org.hibernate.search.engine.search.common.ValueModel.MAPPING, inputType ); + this.mapping = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.INDEX, indexType ); + this.raw = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.RAW, rawType ); + this.string = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.STRING, String.class ); + } + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 mapping() { + return mapping; + } + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 raw() { + return raw; + } + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 string() { + return string; + } + + } + + public static class TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 + implements org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference { + + private final String absolutePath; + private final Class scopeRootType; + private final org.hibernate.search.engine.search.common.ValueModel valueModel; + private final Class predicateType; + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9( + String absolutePath, + Class scopeRootType, + org.hibernate.search.engine.search.common.ValueModel valueModel, + Class predicateType) { + this.absolutePath = absolutePath; + this.scopeRootType = scopeRootType; + this.valueModel = valueModel; + this.predicateType = predicateType; + } + + public String absolutePath() { + return this.absolutePath; + } + + public Class scopeRootType() { + return this.scopeRootType; + } + + public org.hibernate.search.engine.search.common.ValueModel valueModel() { + return this.valueModel; + } + + public Class predicateType() { + return this.predicateType; + } + } + +} diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book.java b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book.java new file mode 100644 index 00000000000..3dee6047f9a --- /dev/null +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book.java @@ -0,0 +1,107 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.documentation.search.metamodel; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToMany; + +import org.hibernate.search.engine.backend.types.ObjectStructure; +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; + +@Entity +@Indexed +public class Book { + + @Id + private Integer id; + + @FullTextField(analyzer = "english", projectable = Projectable.YES) + @FullTextField(name = "title_autocomplete", analyzer = "autocomplete_indexing") + private String title; + + @FullTextField(analyzer = "english", projectable = Projectable.NO) + private String description; + + @GenericField + private Integer pageCount; + + @KeywordField + private Genre genre; + + @FullTextField(analyzer = "english") + private String comment; + + @ManyToMany + @IndexedEmbedded(structure = ObjectStructure.NESTED) + private List authors = new ArrayList<>(); + + public Book() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getPageCount() { + return pageCount; + } + + public void setPageCount(Integer pageCount) { + this.pageCount = pageCount; + } + + public Genre getGenre() { + return genre; + } + + public void setGenre(Genre genre) { + this.genre = genre; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public List getAuthors() { + return authors; + } + + public void setAuthors(List authors) { + this.authors = authors; + } +} diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book__.java b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book__.java new file mode 100644 index 00000000000..fb8c26dd2bf --- /dev/null +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book__.java @@ -0,0 +1,338 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.documentation.search.metamodel; + +/** + * Note: this class was created by an annotation processor and copied to the sources, + * so that we do not run the AP on an entire documentation module. + */ +@javax.annotation.processing.Generated(value = "org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor") +public final class Book__ + implements + org.hibernate.search.mapper.orm.scope.HibernateOrmRootReferenceScope { + + public static final Book__ INDEX = new Book__(); + + public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 comment; + public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 description; + public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 genre; + public final ValueFieldReferenceP0P13P2P6P7P9 pageCount; + public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 title; + public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 title_autocomplete; + public final Book__authors__ authors; + + private Book__() { + // simple value field references: + this.comment = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "comment", Book__.class, String.class, String.class, + String.class, String.class ); + this.description = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "description", Book__.class, String.class, + String.class, String.class, String.class ); + this.genre = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "genre", Book__.class, Genre.class, Genre.class, + String.class, String.class ); + this.pageCount = new ValueFieldReferenceP0P13P2P6P7P9<>( "pageCount", Book__.class, Integer.class, Integer.class, + Integer.class, Integer.class ); + this.title = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2<>( "title", Book__.class, String.class, String.class, + String.class, String.class ); + this.title_autocomplete = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "title_autocomplete", Book__.class, + String.class, String.class, String.class, String.class ); + // various object field references: + this.authors = new Book__authors__(); + } + + @Override + public Class rootReferenceType() { + return Book__.class; + } + + @Override + public org.hibernate.search.mapper.orm.scope.SearchScope scope( + org.hibernate.search.mapper.orm.scope.SearchScopeProvider scopeProvider) { + return scopeProvider.scope( Book.class ); + } + + public static class ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 + extends TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 { + + private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 mapping; + private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 raw; + private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 string; + + public ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9( + String absolutePath, + Class scopeRootType, + Class inputType, + Class outputType, + Class indexType, + Class rawType + ) { + super( absolutePath, scopeRootType, org.hibernate.search.engine.search.common.ValueModel.MAPPING, inputType ); + this.mapping = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.INDEX, indexType ); + this.raw = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.RAW, rawType ); + this.string = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.STRING, String.class ); + } + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 mapping() { + return mapping; + } + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 raw() { + return raw; + } + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 string() { + return string; + } + + } + + public static class TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 + implements org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference { + + private final String absolutePath; + private final Class scopeRootType; + private final org.hibernate.search.engine.search.common.ValueModel valueModel; + private final Class predicateType; + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9( + String absolutePath, + Class scopeRootType, + org.hibernate.search.engine.search.common.ValueModel valueModel, + Class predicateType) { + this.absolutePath = absolutePath; + this.scopeRootType = scopeRootType; + this.valueModel = valueModel; + this.predicateType = predicateType; + } + + public String absolutePath() { + return this.absolutePath; + } + + public Class scopeRootType() { + return this.scopeRootType; + } + + public org.hibernate.search.engine.search.common.ValueModel valueModel() { + return this.valueModel; + } + + public Class predicateType() { + return this.predicateType; + } + } + + public static class ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 + extends TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 { + + private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 mapping; + private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 raw; + private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 string; + + public ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2( + String absolutePath, + Class scopeRootType, + Class inputType, + Class outputType, + Class indexType, + Class rawType + ) { + super( absolutePath, scopeRootType, org.hibernate.search.engine.search.common.ValueModel.MAPPING, inputType, + outputType ); + this.mapping = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.INDEX, indexType, indexType ); + this.raw = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.RAW, rawType, rawType ); + this.string = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.STRING, String.class, String.class ); + } + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 mapping() { + return mapping; + } + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 raw() { + return raw; + } + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 string() { + return string; + } + + } + + public static class TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 + implements org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference, + org.hibernate.search.engine.search.reference.projection.FieldProjectionFieldReference, + org.hibernate.search.engine.search.reference.projection.HighlightProjectionFieldReference { + + private final String absolutePath; + private final Class scopeRootType; + private final org.hibernate.search.engine.search.common.ValueModel valueModel; + private final Class predicateType; + private final Class projectionType; + + public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2( + String absolutePath, + Class scopeRootType, + org.hibernate.search.engine.search.common.ValueModel valueModel, + Class predicateType, + Class projectionType) { + this.absolutePath = absolutePath; + this.scopeRootType = scopeRootType; + this.valueModel = valueModel; + this.predicateType = predicateType; + this.projectionType = projectionType; + } + + public String absolutePath() { + return this.absolutePath; + } + + public Class scopeRootType() { + return this.scopeRootType; + } + + public org.hibernate.search.engine.search.common.ValueModel valueModel() { + return this.valueModel; + } + + public Class predicateType() { + return this.predicateType; + } + + public Class projectionType() { + return this.projectionType; + } + } + + public static class ValueFieldReferenceP0P13P2P6P7P9 extends TypedFieldReferenceP0P13P2P6P7P9 { + + private final TypedFieldReferenceP0P13P2P6P7P9 mapping; + private final TypedFieldReferenceP0P13P2P6P7P9 raw; + private final TypedFieldReferenceP0P13P2P6P7P9 string; + + public ValueFieldReferenceP0P13P2P6P7P9( + String absolutePath, + Class scopeRootType, + Class inputType, + Class outputType, + Class indexType, + Class rawType + ) { + super( absolutePath, scopeRootType, org.hibernate.search.engine.search.common.ValueModel.MAPPING, inputType ); + this.mapping = new TypedFieldReferenceP0P13P2P6P7P9<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.INDEX, indexType ); + this.raw = new TypedFieldReferenceP0P13P2P6P7P9<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.RAW, rawType ); + this.string = new TypedFieldReferenceP0P13P2P6P7P9<>( absolutePath, scopeRootType, + org.hibernate.search.engine.search.common.ValueModel.STRING, String.class ); + } + + public TypedFieldReferenceP0P13P2P6P7P9 mapping() { + return mapping; + } + + public TypedFieldReferenceP0P13P2P6P7P9 raw() { + return raw; + } + + public TypedFieldReferenceP0P13P2P6P7P9 string() { + return string; + } + + } + + public static class TypedFieldReferenceP0P13P2P6P7P9 + implements org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference, + org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference { + + private final String absolutePath; + private final Class scopeRootType; + private final org.hibernate.search.engine.search.common.ValueModel valueModel; + private final Class predicateType; + + public TypedFieldReferenceP0P13P2P6P7P9( + String absolutePath, + Class scopeRootType, + org.hibernate.search.engine.search.common.ValueModel valueModel, + Class predicateType) { + this.absolutePath = absolutePath; + this.scopeRootType = scopeRootType; + this.valueModel = valueModel; + this.predicateType = predicateType; + } + + public String absolutePath() { + return this.absolutePath; + } + + public Class scopeRootType() { + return this.scopeRootType; + } + + public org.hibernate.search.engine.search.common.ValueModel valueModel() { + return this.valueModel; + } + + public Class predicateType() { + return this.predicateType; + } + } + + + public static class Book__authors__ + implements org.hibernate.search.engine.search.reference.object.NestedFieldReference { + + public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 firstName; + public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 lastName; + + private Book__authors__() { + // simple value field references: + this.firstName = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "authors.firstName", Book__.class, String.class, + String.class, String.class, String.class ); + this.lastName = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "authors.lastName", Book__.class, String.class, + String.class, String.class, String.class ); + // various object field references: + + } + + @Override + public String absolutePath() { + return "authors"; + } + + @Override + public Class scopeRootType() { + return Book__.class; + } + + } + +} diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Genre.java b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Genre.java new file mode 100644 index 00000000000..5e7752bb1f6 --- /dev/null +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Genre.java @@ -0,0 +1,12 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.documentation.search.metamodel; + +public enum Genre { + + SCIENCE_FICTION, + CRIME_FICTION + +} diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java new file mode 100644 index 00000000000..6bc84410c8a --- /dev/null +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java @@ -0,0 +1,186 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.documentation.search.metamodel; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; + +import jakarta.persistence.EntityManagerFactory; + +import org.hibernate.search.documentation.search.predicate.EmbeddableGeoPoint; +import org.hibernate.search.documentation.testsupport.BackendConfigurations; +import org.hibernate.search.documentation.testsupport.DocumentationSetupHelper; +import org.hibernate.search.mapper.orm.Search; +import org.hibernate.search.mapper.orm.scope.SearchScope; +import org.hibernate.search.mapper.orm.session.SearchSession; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class MetamodelIT { + + private static final int ASIMOV_ID = 1; + private static final int MARTINEZ_ID = 2; + + private static final int BOOK1_ID = 1; + private static final int BOOK2_ID = 2; + private static final int BOOK3_ID = 3; + private static final int BOOK4_ID = 4; + + @RegisterExtension + public DocumentationSetupHelper setupHelper = DocumentationSetupHelper.withSingleBackend( BackendConfigurations.simple() ); + + private EntityManagerFactory entityManagerFactory; + + @BeforeEach + void setup() { + entityManagerFactory = setupHelper.start().setup( Book.class, Author.class, EmbeddableGeoPoint.class ); + + DocumentationSetupHelper.SetupContext setupContext = setupHelper.start(); + entityManagerFactory = setupContext.setup( Book.class, Author.class, EmbeddableGeoPoint.class ); + initData(); + } + + @Test + void entryPoint() { + with( entityManagerFactory ).runInTransaction( entityManager -> { + // tag::entryPoint[] + SearchSession searchSession = /* ... */ // <1> + // end::entryPoint[] + Search.session( entityManager ); + // tag::entryPoint[] + SearchScope scope = Book__.INDEX.scope( searchSession ); // <2> + + List hits = searchSession.search( scope ) + .where( f -> f.match() + .field( Book__.INDEX.title ).field( Book__.INDEX.description ) // <3> + .matching( "robot" ) ) + .fetchHits( 20 ); + // end::entryPoint[] + assertThat( hits ) + .extracting( Book::getId ) + .containsExactlyInAnyOrder( BOOK1_ID, BOOK2_ID, BOOK3_ID, BOOK4_ID ); + } ); + } + + @Test + void compileCheck() { + withinSearchSession( searchSession -> { + SearchScope scope = Book__.INDEX.scope( searchSession ); + // tag::compileCheck-pass[] + List titles = searchSession.search( scope ) + .select( f -> f.field( Book__.INDEX.title ) ) // <1> + .where( f -> f.matchAll() ) + .fetchHits( 20 ); + // end::compileCheck-pass[] + assertThat( titles ) + .hasSize( 4 ); + } ); + } + + @Test + void valueModel() { + withinSearchSession( searchSession -> { + SearchScope scope = Book__.INDEX.scope( searchSession ); + // tag::valueModel[] + List hits = searchSession.search( scope ) + .where( f -> f.match() + .field( Book__.INDEX.genre.string() ) // <1> + .matching( "CRIME_FICTION" ) ) // <2> + .fetchHits( 20 ); + // end::valueModel[] + assertThat( hits ) + .extracting( Book::getId ) + .containsExactlyInAnyOrder( BOOK4_ID ); + } ); + } + + private void withinSearchSession(Consumer action) { + with( entityManagerFactory ).runInTransaction( entityManager -> { + SearchSession searchSession = Search.session( entityManager ); + action.accept( searchSession ); + } ); + } + + private void initData() { + with( entityManagerFactory ).runInTransaction( entityManager -> { + Author isaacAsimov = new Author(); + isaacAsimov.setId( ASIMOV_ID ); + isaacAsimov.setFirstName( "Isaac" ); + isaacAsimov.setLastName( "Asimov" ); + + Author aLeeMartinez = new Author(); + aLeeMartinez.setId( MARTINEZ_ID ); + aLeeMartinez.setFirstName( "A. Lee" ); + aLeeMartinez.setLastName( "Martinez" ); + + Book book1 = new Book(); + book1.setId( BOOK1_ID ); + book1.setTitle( "I, Robot" ); + book1.setDescription( "A robot becomes self-aware." ); + book1.setPageCount( 250 ); + book1.setGenre( Genre.SCIENCE_FICTION ); + book1.getAuthors().add( isaacAsimov ); + isaacAsimov.getBooks().add( book1 ); + + Book book2 = new Book(); + book2.setId( BOOK2_ID ); + book2.setTitle( "The Caves of Steel" ); + book2.setDescription( "A robot helps investigate a murder on an extrasolar colony." ); + book2.setPageCount( 206 ); + book2.setGenre( Genre.SCIENCE_FICTION ); + book2.setComment( "Really liked this one!" ); + book2.getAuthors().add( isaacAsimov ); + isaacAsimov.getBooks().add( book2 ); + + Book book3 = new Book(); + book3.setId( BOOK3_ID ); + book3.setTitle( "The Robots of Dawn" ); + book3.setDescription( "A crime story about the first \"roboticide\"." ); + book3.setPageCount( 435 ); + book3.setGenre( Genre.SCIENCE_FICTION ); + book3.getAuthors().add( isaacAsimov ); + isaacAsimov.getBooks().add( book3 ); + + Book book4 = new Book(); + book4.setId( BOOK4_ID ); + book4.setTitle( "The Automatic Detective" ); + book4.setDescription( "A robot cab driver turns PI after the disappearance of a neighboring family." ); + book4.setPageCount( 222 ); + book4.setGenre( Genre.CRIME_FICTION ); + book4.getAuthors().add( aLeeMartinez ); + aLeeMartinez.getBooks().add( book3 ); + + entityManager.persist( isaacAsimov ); + entityManager.persist( aLeeMartinez ); + + entityManager.persist( book1 ); + entityManager.persist( book2 ); + entityManager.persist( book3 ); + entityManager.persist( book4 ); + } ); + } + + private interface MySearchParameters { + Genre getGenreFilter(); + + String getFullTextFilter(); + + Integer getPageCountMaxFilter(); + + List getAuthorFilters(); + } + + private static float[] floats(int dimension, float value) { + float[] bytes = new float[dimension]; + Arrays.fill( bytes, value ); + return bytes; + } +} From 8833515a8cf7f5be57c66479387a677f0138b0b9 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 24 Apr 2025 13:52:34 +0200 Subject: [PATCH 23/25] HSEARCH-5300 Adjust the processor configuration properties --- .../HibernateSearchMetamodelProcessor.java | 3 +- ...rnateSearchMetamodelProcessorSettings.java | 40 ++++++++++++++++--- .../writer/impl/MetamodelClassWriter.java | 3 +- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java index 20799fb92ab..03c3efde3a6 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java @@ -28,7 +28,8 @@ @SupportedAnnotationTypes("*") // Currently this is more of a placeholder for future config options: @SupportedOptions({ - HibernateSearchMetamodelProcessorSettings.ADD_GENERATED_ANNOTATION, + HibernateSearchMetamodelProcessorSettings.GENERATED_ANNOTATION_ADD, + HibernateSearchMetamodelProcessorSettings.GENERATED_ANNOTATION_TIMESTAMP, HibernateSearchMetamodelProcessorSettings.BACKEND_VERSION }) @org.hibernate.search.util.common.annotation.impl.SuppressJQAssistant( reason = "JQAssistant has issue with detecting that getSupportedSourceVersion is an overridden method.") diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java index 91fbf8fae82..d3f3472b040 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java @@ -6,6 +6,11 @@ import java.io.Serializable; +import java.time.Clock; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.Locale; import java.util.Map; import java.util.Objects; @@ -18,7 +23,8 @@ private HibernateSearchMetamodelProcessorSettings() { private static final String PREFIX = "org.hibernate.search.metamodel.processor."; - public static final String ADD_GENERATED_ANNOTATION = PREFIX + Radicals.ADD_GENERATED_ANNOTATION; + public static final String GENERATED_ANNOTATION_ADD = PREFIX + Radicals.GENERATED_ANNOTATION_ADD; + public static final String GENERATED_ANNOTATION_TIMESTAMP = PREFIX + Radicals.GENERATED_ANNOTATION_TIMESTAMP; public static final String BACKEND_VERSION = PREFIX + Radicals.BACKEND_VERSION; public static class Radicals { @@ -26,7 +32,8 @@ public static class Radicals { private Radicals() { } - public static final String ADD_GENERATED_ANNOTATION = "add_generated_annotation"; + public static final String GENERATED_ANNOTATION_ADD = "generated_annotation.add"; + public static final String GENERATED_ANNOTATION_TIMESTAMP = "generated_annotation.timestamp"; public static final String BACKEND_VERSION = "backend.version"; } @@ -35,20 +42,43 @@ private Radicals() { */ public static final class Defaults { - public static final String ADD_GENERATED_ANNOTATION = Boolean.TRUE.toString(); + public static final String GENERATED_ANNOTATION_ADD = Boolean.TRUE.toString(); + public static final String GENERATED_ANNOTATION_TIMESTAMP = Boolean.FALSE.toString(); private Defaults() { } } - public record Configuration(boolean addGeneratedAnnotation, String version) implements Serializable { + public record Configuration(boolean generatedAnnotationAdd, boolean generatedAnnotationTimestamp, String version) + implements Serializable { public Configuration(Map options) { this( - Boolean.parseBoolean( options.getOrDefault( ADD_GENERATED_ANNOTATION, Defaults.ADD_GENERATED_ANNOTATION ) ), + Boolean.parseBoolean( options.getOrDefault( GENERATED_ANNOTATION_ADD, Defaults.GENERATED_ANNOTATION_ADD ) ), + Boolean.parseBoolean( + options.getOrDefault( GENERATED_ANNOTATION_TIMESTAMP, Defaults.GENERATED_ANNOTATION_TIMESTAMP ) ), Objects.toString( options.get( BACKEND_VERSION ), null ) ); } + public String formattedGeneratedAnnotation() { + if ( !generatedAnnotationAdd ) { + return ""; + } + if ( generatedAnnotationTimestamp ) { + return String.format( + Locale.ROOT, "@javax.annotation.processing.Generated(value = \"%s\", date = \"%s\")", + HibernateSearchMetamodelProcessor.class.getName(), + LocalDateTime.now( Clock.systemUTC() ).atOffset( ZoneOffset.UTC ) + .format( DateTimeFormatter.ISO_OFFSET_DATE_TIME ) + ); + } + else { + return String.format( Locale.ROOT, "@javax.annotation.processing.Generated(value = \"%s\")", + HibernateSearchMetamodelProcessor.class.getName() + ); + } + } + public String elasticsearchVersion() { return version == null ? "9.0.0" : version; } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java index e89948954b0..027961a8503 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java @@ -147,7 +147,7 @@ public String formatted() { Locale.ROOT, """ %s - @javax.annotation.processing.Generated(value = "org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor") + %s public final class %s implements %s<%s, %s> { @@ -174,6 +174,7 @@ public final class %s implements } """, packageName.isEmpty() ? "" : "package " + packageName + ";\n", + configuration.formattedGeneratedAnnotation(), metamodelClassName, scopeInterfaceType(), metamodelClassName, From b32c587c0459e2e537ec04fcfe06410348188862 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 24 Apr 2025 21:36:32 +0200 Subject: [PATCH 24/25] HSEARCH-5300 More tests and addressing enum for all (?) scenarios --- .../impl/DefaultIdentifierBindingContext.java | 6 +- .../model/impl/PojoModelValueElement.java | 4 + .../HibernateSearchMetamodelProcessor.java | 15 +- ...ractProcessorFieldAnnotationProcessor.java | 35 ++-- .../ProcessorGeoPointBindingProcessor.java | 4 + .../ProcessorIndexedEmbeddedProcessor.java | 29 +-- .../processor/impl/ExceptionUtils.java | 33 +++ ...xedEntityMetamodelAnnotationProcessor.java | 104 ++++++++-- .../processor/impl/ProcessorElementUtils.java | 43 +++- ...cessorPojoModelsBootstrapIntrospector.java | 8 + .../impl/HibernateSearchProcessorEnum.java | 175 ++++++++++++++++ .../model/impl/ProcessorPojoRawTypeModel.java | 35 ++-- .../writer/impl/MetamodelClassWriter.java | 45 +++-- ...HibernateSearchMetamodelProcessorTest.java | 29 ++- .../processor/model/MyContainedEntity.java | 19 ++ .../processor/model/MyContainingEntity.java | 20 ++ .../processor/model/MyCustomField.java | 43 ++++ .../metamodel/processor/model/MyCustomId.java | 41 ++++ .../model/MyEnumCollectionEntity.java | 22 ++ .../model/MyFieldBinderIndexedEntity.java | 22 ++ .../model/MyFieldBridgeIndexedEntity.java | 20 ++ .../model/MyGeoPointBindingFieldEntity.java | 30 +++ .../model/MyIdBinderIndexedEntity.java | 24 +++ .../model/MyIdBridgeIndexedEntity.java | 22 ++ .../processor/model/MyIndexedEntity.java | 9 + .../model/MyIndexedGetterEntity.java | 188 ++++++++++++++++++ 26 files changed, 909 insertions(+), 116 deletions(-) create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ExceptionUtils.java create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/HibernateSearchProcessorEnum.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainedEntity.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainingEntity.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomField.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomId.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnumCollectionEntity.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBinderIndexedEntity.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBridgeIndexedEntity.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyGeoPointBindingFieldEntity.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBinderIndexedEntity.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBridgeIndexedEntity.java create mode 100644 metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedGetterEntity.java diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/bridge/binding/impl/DefaultIdentifierBindingContext.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/bridge/binding/impl/DefaultIdentifierBindingContext.java index a0c19cf44a6..bf784fb32e2 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/bridge/binding/impl/DefaultIdentifierBindingContext.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/bridge/binding/impl/DefaultIdentifierBindingContext.java @@ -67,7 +67,7 @@ public void bridge(Class expectedValueType, BeanHolder castedExpectedType = (Class) expectedValueType; - this.partialBinding = new PartialBinding<>( castedBridgeHolder, castedExpectedType ); + applyBridge( castedExpectedType, castedBridgeHolder ); } catch (RuntimeException e) { abortBridge( new SuppressingCloser( e ), bridgeHolder ); @@ -75,6 +75,10 @@ public void bridge(Class expectedValueType, BeanHolder expectedValueType, BeanHolder> bridgeHolder) { + this.partialBinding = new PartialBinding<>( bridgeHolder, expectedValueType ); + } + @Override public PojoModelValue bridgedElement() { return bridgedElement; diff --git a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/impl/PojoModelValueElement.java b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/impl/PojoModelValueElement.java index 64db0621313..36a9170e80e 100644 --- a/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/impl/PojoModelValueElement.java +++ b/mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/impl/PojoModelValueElement.java @@ -36,4 +36,8 @@ public boolean isAssignableTo(Class clazz) { public Class rawType() { return typeModel.rawType().typeIdentifier().javaClass(); } + + public PojoTypeModel typeModel() { + return typeModel; + } } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java index 03c3efde3a6..6ea251d42a2 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java @@ -4,9 +4,6 @@ */ package org.hibernate.search.metamodel.processor; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; import java.util.List; import java.util.Set; @@ -17,8 +14,8 @@ import javax.annotation.processing.SupportedOptions; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; -import javax.tools.Diagnostic; +import org.hibernate.search.metamodel.processor.impl.ExceptionUtils; import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; import org.hibernate.search.metamodel.processor.impl.IndexedEntityMetamodelAnnotationProcessor; import org.hibernate.search.metamodel.processor.impl.MetamodelAnnotationProcessor; @@ -59,14 +56,8 @@ public boolean process(Set annotations, RoundEnvironment try { processor.process( roundEnv ); } - catch (Throwable e) { - try ( var sw = new StringWriter(); var pw = new PrintWriter( sw ) ) { - e.printStackTrace( pw ); - context.messager().printMessage( Diagnostic.Kind.ERROR, sw.toString() ); - } - catch (IOException ex) { - throw new RuntimeException( ex ); - } + catch (Exception e) { + ExceptionUtils.logError( context.messager(), e, "Unable to process Hibernate Search metamodel annotations: " ); } } return false; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java index f47a038d957..c7f3d57e270 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java @@ -6,13 +6,8 @@ import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; import javax.tools.Diagnostic; -import org.hibernate.search.mapper.pojo.bridge.ValueBridge; -import org.hibernate.search.mapper.pojo.bridge.runtime.ValueBridgeToIndexedValueContext; import org.hibernate.search.mapper.pojo.extractor.mapping.programmatic.ContainerExtractorPath; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingFieldOptionsStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; @@ -22,22 +17,25 @@ public abstract class AbstractProcessorFieldAnnotationProcessor extends Abstract @Override public final void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, ProcessorAnnotationProcessorContext context) { - String cleanedUpRelativeFieldName = getName( annotation ); - PropertyMappingFieldOptionsStep fieldContext = - initFieldMappingContext( mapping, annotation, cleanedUpRelativeFieldName ); - + // we check for bridges and binders first, to make sure none are defined, + // if any -- we want to stop processing as soon as possible so that field is not added to the index! AnnotationMirror valueBinder = getValueBinder( annotation ); if ( valueBinder != null ) { - // TODO: do we also inject fields into a value binder ... ? context.messager().printMessage( Diagnostic.Kind.WARNING, "Defined value binder " + valueBinder + " is ignored ", element ); + return; } - else if ( element.asType().getKind() == TypeKind.DECLARED - && context.types().asElement( element.asType() ).getKind() == ElementKind.ENUM ) { - // if it's an enum, we won't get to the built-in bridge so we just use this stub one instead: - fieldContext.valueBridge( new ProcessorEnumValueBridge( element.asType() ) ); + AnnotationMirror valueBridge = getValueBridge( annotation ); + if ( valueBridge != null ) { + context.messager().printMessage( Diagnostic.Kind.WARNING, "Defined value bridge " + valueBridge + " is ignored ", + element ); + return; } + String cleanedUpRelativeFieldName = getName( annotation ); + PropertyMappingFieldOptionsStep fieldContext = + initFieldMappingContext( mapping, annotation, cleanedUpRelativeFieldName ); + ContainerExtractorPath extractorPath = toContainerExtractorPath( getExtraction( annotation ), context ); fieldContext.extractors( extractorPath ); } @@ -57,11 +55,8 @@ private AnnotationMirror getValueBinder(AnnotationMirror annotation) { return getAnnotationProperty( annotation, "valueBinder" ); } - public record ProcessorEnumValueBridge(TypeMirror valueType) implements ValueBridge { - - @Override - public String toIndexedValue(Object value, ValueBridgeToIndexedValueContext context) { - return ""; - } + private AnnotationMirror getValueBridge(AnnotationMirror annotation) { + return getAnnotationProperty( annotation, "valueBridge" ); } + } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java index 944270fe4e4..1f456f5b38c 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java @@ -4,6 +4,8 @@ */ package org.hibernate.search.metamodel.processor.annotation.processing.impl; +import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.collectExtraTypes; + import java.util.Optional; import javax.lang.model.element.AnnotationMirror; @@ -25,6 +27,8 @@ class ProcessorGeoPointBindingProcessor extends AbstractProcessorAnnotationProce public void process(PropertyMappingStep mapping, AnnotationMirror annotation, Element element, ProcessorAnnotationProcessorContext context) { mapping.binder( createBinder( annotation ) ); + + collectExtraTypes( element.asType(), context ); } @Override diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java index 53203c7a0b6..6540b284a1e 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java @@ -4,16 +4,13 @@ */ package org.hibernate.search.metamodel.processor.annotation.processing.impl; -import static org.hibernate.search.metamodel.processor.impl.IndexedEntityMetamodelAnnotationProcessor.processTypeAndProperties; +import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.collectExtraTypes; import java.util.Optional; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.tools.Diagnostic; @@ -38,7 +35,7 @@ public void process(PropertyMappingStep mapping, AnnotationMirror annotation, El String[] includePathsArray = toStringArray( getAnnotationValue( annotation, "includePaths" ) ); String[] excludePathsArray = toStringArray( getAnnotationValue( annotation, "excludePaths" ) ); - ContainerExtractorPath extractorPath = toContainerExtractorPath( annotation, context ); + ContainerExtractorPath extractorPath = toContainerExtractorPath( getExtraction( annotation ), context ); if ( getAnnotationValue( annotation, "targetType" ) != null ) { context.messager().printMessage( Diagnostic.Kind.WARNING, @@ -68,28 +65,14 @@ public void process(PropertyMappingStep mapping, AnnotationMirror annotation, El collectExtraTypes( element.asType(), context ); } - private void collectExtraTypes(TypeMirror type, ProcessorAnnotationProcessorContext context) { - if ( type == null || type.getKind() == TypeKind.NONE ) { - return; - } - TypeElement element = (TypeElement) context.types().asElement( type ); - processTypeAndProperties( - element, - context.programmaticMapping().type( element.getQualifiedName().toString() ), - context - ); - collectExtraTypes( element.getSuperclass(), context ); - if ( type instanceof DeclaredType declaredType ) { - for ( TypeMirror typeArgument : declaredType.getTypeArguments() ) { - collectExtraTypes( typeArgument, context ); - } - } - } - @Override protected Optional> configureField(PropertyBindingContext bindingContext, AnnotationMirror annotation, ProcessorAnnotationProcessorContext context, Element element, TypeMirror fieldType) { context.messager().printMessage( Diagnostic.Kind.ERROR, "IndexedEmbedded are not allowed within binders.", element ); return Optional.empty(); } + + private AnnotationMirror getExtraction(AnnotationMirror annotation) { + return getAnnotationProperty( annotation, "extraction" ); + } } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ExceptionUtils.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ExceptionUtils.java new file mode 100644 index 00000000000..0a77fc5d238 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ExceptionUtils.java @@ -0,0 +1,33 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.impl; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; + +import javax.annotation.processing.Messager; +import javax.lang.model.element.Element; +import javax.tools.Diagnostic; + +public final class ExceptionUtils { + + private ExceptionUtils() { + } + + public static void logError(Messager messager, Exception exception, String message) { + logError( messager, exception, message, null ); + } + + public static void logError(Messager messager, Exception exception, String message, Element element) { + try ( var sw = new StringWriter(); var pw = new PrintWriter( sw ) ) { + exception.printStackTrace( pw ); + messager.printMessage( Diagnostic.Kind.ERROR, message + sw, element ); + } + catch (IOException ex) { + throw new RuntimeException( ex ); + } + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java index a50ed917b75..e1d2f0072d3 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java @@ -6,6 +6,7 @@ import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.flattenedAnnotations; import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.propertyElements; +import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.propertyName; import java.io.IOException; import java.io.Writer; @@ -20,7 +21,14 @@ import org.hibernate.search.engine.backend.metamodel.IndexObjectFieldDescriptor; import org.hibernate.search.engine.backend.metamodel.IndexValueFieldDescriptor; +import org.hibernate.search.engine.environment.bean.BeanHolder; import org.hibernate.search.engine.environment.bean.BeanReference; +import org.hibernate.search.mapper.pojo.bridge.IdentifierBridge; +import org.hibernate.search.mapper.pojo.bridge.binding.IdentifierBindingContext; +import org.hibernate.search.mapper.pojo.bridge.binding.impl.DefaultIdentifierBindingContext; +import org.hibernate.search.mapper.pojo.bridge.mapping.programmatic.IdentifierBinder; +import org.hibernate.search.mapper.pojo.bridge.runtime.IdentifierBridgeFromDocumentIdentifierContext; +import org.hibernate.search.mapper.pojo.bridge.runtime.IdentifierBridgeToDocumentIdentifierContext; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.ProgrammaticMappingConfigurationContext; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.TypeMappingStep; @@ -35,8 +43,10 @@ import org.hibernate.search.metamodel.processor.annotation.processing.impl.ProcessorTypeMappingAnnotationProcessor; import org.hibernate.search.metamodel.processor.mapping.impl.ProcessorIntrospectorContext; import org.hibernate.search.metamodel.processor.mapping.impl.ProcessorPojoModelsBootstrapIntrospector; +import org.hibernate.search.metamodel.processor.model.impl.HibernateSearchProcessorEnum; import org.hibernate.search.metamodel.processor.writer.impl.MetamodelClassWriter; import org.hibernate.search.metamodel.processor.writer.impl.MetamodelNamesFormatter; +import org.hibernate.search.util.common.annotation.impl.SuppressJQAssistant; public class IndexedEntityMetamodelAnnotationProcessor implements MetamodelAnnotationProcessor { @@ -72,6 +82,11 @@ public void process(RoundEnvironment roundEnv) { .discoverJandexIndexesFromAddedTypes( false ) .buildMissingDiscoveredJandexIndexes( false ); + configurationContext.bridges() + .subTypesOf( HibernateSearchProcessorEnum.class ) + .valueBinder( HibernateSearchProcessorEnum.BINDER ) + .identifierBinder( HibernateSearchProcessorEnum.BINDER ); + ProgrammaticMappingConfigurationContext programmaticMapping = configurationContext.programmaticMapping(); @@ -167,36 +182,83 @@ public static void processTypeAndProperties(TypeElement typeElement, TypeMapping AtomicReference ormId = new AtomicReference<>(); propertyElements( ctx.elements(), typeElement ) .forEach( element -> { - PropertyMappingStep step = typeMappingContext.property( element.getSimpleName().toString() ); + PropertyMappingStep step = typeMappingContext.property( propertyName( element ) ); - flattenedAnnotations( ctx.types(), element ) - .forEach( annotationMirror -> { - if ( ProcessorPropertyMappingAnnotationProcessor.documentId( annotationMirror ) ) { - documentId.set( step ); - } - else if ( ProcessorPropertyMappingAnnotationProcessor.ormId( annotationMirror ) ) { - ormId.set( step ); - } - else { - ProcessorPropertyMappingAnnotationProcessor.processor( annotationMirror ) - .ifPresent( p -> p.process( - step, - annotationMirror, - element, - ctx - ) ); - } - } ); + try { + flattenedAnnotations( ctx.types(), element ) + .forEach( annotationMirror -> { + if ( ProcessorPropertyMappingAnnotationProcessor.documentId( annotationMirror ) ) { + documentId.set( step ); + } + else if ( ProcessorPropertyMappingAnnotationProcessor.ormId( annotationMirror ) ) { + ormId.set( step ); + } + else { + ProcessorPropertyMappingAnnotationProcessor.processor( annotationMirror ) + .ifPresent( p -> p.process( + step, + annotationMirror, + element, + ctx + ) ); + } + } ); + } + catch (Exception e) { + ExceptionUtils.logError( ctx.messager(), e, + "Unable to process Hibernate Search metamodel annotations: ", element ); + } } ); + PropertyMappingStep docIdStep = null; if ( documentId.get() != null ) { - documentId.get().documentId(); + docIdStep = documentId.get(); } if ( ormId.get() != null ) { - ormId.get().documentId(); + docIdStep = ormId.get(); + } + if ( docIdStep != null ) { + // Users can have custom identifier binders/bridges, but we don't care much about their impl + // and since for now we are ignoring these impls we still want users to be able to generate + // a partial model; without an id that wouldn't be possible... hence: + docIdStep.documentId().identifierBinder( ProcessorIdentifierBinder.INSTANCE ); } } private ProcessorPojoModelsBootstrapIntrospector wrapIntrospector(PojoBootstrapIntrospector introspector) { return new ProcessorPojoModelsBootstrapIntrospector( introspectorContext, introspector ); } + + @SuppressJQAssistant(reason = "Need to cast to an impl type to get access to not-yet exposed method") + private static class ProcessorIdentifierBinder implements IdentifierBinder { + + static ProcessorIdentifierBinder INSTANCE = new ProcessorIdentifierBinder(); + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public void bind(IdentifierBindingContext context) { + if ( context instanceof DefaultIdentifierBindingContext ctx ) { + ctx.applyBridge( Object.class, BeanHolder.of( ProcessorIdentifierBridge.INSTANCE ) ); + } + else { + context.bridge( Object.class, ProcessorIdentifierBridge.INSTANCE ); + } + } + + private static class ProcessorIdentifierBridge implements IdentifierBridge { + + static ProcessorIdentifierBridge INSTANCE = new ProcessorIdentifierBridge(); + + @Override + public String toDocumentIdentifier(Object propertyValue, IdentifierBridgeToDocumentIdentifierContext context) { + return ""; + } + + @Override + public Object fromDocumentIdentifier(String documentIdentifier, + IdentifierBridgeFromDocumentIdentifierContext context) { + return null; + } + } + } + } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ProcessorElementUtils.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ProcessorElementUtils.java index 4959b591d24..d1e987e94a7 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ProcessorElementUtils.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ProcessorElementUtils.java @@ -4,6 +4,9 @@ */ package org.hibernate.search.metamodel.processor.impl; +import static org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector.noPrefix; +import static org.hibernate.search.metamodel.processor.impl.IndexedEntityMetamodelAnnotationProcessor.processTypeAndProperties; + import java.util.List; import java.util.Map; import java.util.Optional; @@ -16,11 +19,15 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.type.ArrayType; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.ExecutableType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; +import org.hibernate.search.metamodel.processor.annotation.processing.impl.ProcessorAnnotationProcessorContext; + public final class ProcessorElementUtils { private ProcessorElementUtils() { @@ -89,6 +96,40 @@ private static boolean isGetter(ExecutableElement executable) { return name.startsWith( "is" ) || name.startsWith( "has" ); } - return name.startsWith( "get" ); + return !"getClass".equals( name ) && name.startsWith( "get" ); + } + + public static String propertyName(Element element) { + if ( element.getKind() == ElementKind.FIELD ) { + return element.getSimpleName().toString(); + } + if ( element.getKind() == ElementKind.METHOD ) { + return noPrefix( element.getSimpleName().toString() ); + } + throw new IllegalArgumentException( "Unsupported element kind: " + element.getKind() ); + } + + public static void collectExtraTypes(TypeMirror type, ProcessorAnnotationProcessorContext context) { + if ( type == null || type.getKind() == TypeKind.NONE ) { + return; + } + if ( type instanceof ExecutableType et ) { + type = et.getReturnType(); + } + TypeElement element = (TypeElement) context.types().asElement( type ); + processTypeAndProperties( + element, + context.programmaticMapping().type( element.getQualifiedName().toString() ), + context + ); + if ( element.getKind() == ElementKind.ENUM ) { + return; + } + collectExtraTypes( element.getSuperclass(), context ); + if ( type instanceof DeclaredType declaredType ) { + for ( TypeMirror typeArgument : declaredType.getTypeArguments() ) { + collectExtraTypes( typeArgument, context ); + } + } } } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java index c04f31ea218..e88b2b69338 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java @@ -17,6 +17,7 @@ import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector; import org.hibernate.search.mapper.pojo.model.spi.PojoRawTypeModel; import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; +import org.hibernate.search.metamodel.processor.model.impl.HibernateSearchProcessorEnum; import org.hibernate.search.metamodel.processor.model.impl.ProcessorPojoRawTypeModel; import org.hibernate.search.metamodel.processor.model.impl.ProcessorTypeOrdering; import org.hibernate.search.util.common.reflect.spi.ValueHandleFactory; @@ -32,10 +33,17 @@ public ProcessorPojoModelsBootstrapIntrospector(ProcessorIntrospectorContext con this.context = context; this.delegate = delegate; this.typeOrdering = new ProcessorTypeOrdering( context.processorContext() ); + + elementTypeModelCache.put( context.elementUtils().getName( HibernateSearchProcessorEnum.class.getName() ), + HibernateSearchProcessorEnum.MODEL ); } @Override + @SuppressWarnings("unchecked") // we checked the type through equals public PojoRawTypeModel typeModel(Class clazz) { + if ( HibernateSearchProcessorEnum.class.equals( clazz ) ) { + return (PojoRawTypeModel) HibernateSearchProcessorEnum.MODEL; + } return delegate.typeModel( clazz ); } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/HibernateSearchProcessorEnum.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/HibernateSearchProcessorEnum.java new file mode 100644 index 00000000000..6b420996325 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/HibernateSearchProcessorEnum.java @@ -0,0 +1,175 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model.impl; + +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import javax.lang.model.element.ElementKind; + +import org.hibernate.search.engine.mapper.model.spi.MappableTypeModel; +import org.hibernate.search.mapper.pojo.bridge.IdentifierBridge; +import org.hibernate.search.mapper.pojo.bridge.ValueBridge; +import org.hibernate.search.mapper.pojo.bridge.binding.IdentifierBindingContext; +import org.hibernate.search.mapper.pojo.bridge.binding.ValueBindingContext; +import org.hibernate.search.mapper.pojo.bridge.mapping.programmatic.IdentifierBinder; +import org.hibernate.search.mapper.pojo.bridge.mapping.programmatic.ValueBinder; +import org.hibernate.search.mapper.pojo.bridge.runtime.IdentifierBridgeFromDocumentIdentifierContext; +import org.hibernate.search.mapper.pojo.bridge.runtime.IdentifierBridgeToDocumentIdentifierContext; +import org.hibernate.search.mapper.pojo.bridge.runtime.ValueBridgeToIndexedValueContext; +import org.hibernate.search.mapper.pojo.model.impl.PojoModelValueElement; +import org.hibernate.search.mapper.pojo.model.spi.PojoCaster; +import org.hibernate.search.mapper.pojo.model.spi.PojoConstructorModel; +import org.hibernate.search.mapper.pojo.model.spi.PojoPropertyModel; +import org.hibernate.search.mapper.pojo.model.spi.PojoRawTypeIdentifier; +import org.hibernate.search.mapper.pojo.model.spi.PojoRawTypeModel; +import org.hibernate.search.mapper.pojo.model.spi.PojoTypeModel; +import org.hibernate.search.util.common.annotation.impl.SuppressJQAssistant; + +public enum HibernateSearchProcessorEnum { + ; + + public static final Binder BINDER = new Binder(); + public static final Model MODEL = new Model(); + + @SuppressJQAssistant(reason = "Need to cast to an impl type to get access to not-yet exposed method") + public static class Binder implements ValueBinder, IdentifierBinder { + + @Override + public void bind(IdentifierBindingContext context) { + if ( context.bridgedElement() instanceof PojoModelValueElement element ) { + if ( element.typeModel() instanceof ProcessorPojoRawTypeModel pr ) { + context.bridge( Object.class, new Bridge( pr.name() ) ); + } + } + } + + @Override + public void bind(ValueBindingContext context) { + if ( context.bridgedElement() instanceof PojoModelValueElement element ) { + if ( element.typeModel() instanceof ProcessorPojoRawTypeModel pr ) { + context.bridge( Object.class, new Bridge( pr.name() ) ); + } + } + } + } + + public static class Model implements PojoRawTypeModel { + + @Override + public PojoRawTypeIdentifier typeIdentifier() { + return PojoRawTypeIdentifier.of( HibernateSearchProcessorEnum.class ); + } + + @Override + public boolean isAbstract() { + return false; + } + + @Override + public boolean isSubTypeOf(MappableTypeModel otherModel) { + if ( otherModel instanceof ProcessorPojoRawTypeModel other ) { + return other.typeElement().getKind() == ElementKind.ENUM; + } + return false; + } + + @Override + public Stream> ascendingSuperTypes() { + return Stream.empty(); + } + + @Override + public Stream> descendingSuperTypes() { + return Stream.empty(); + } + + @Override + public Stream annotations() { + throw new UnsupportedOperationException(); + } + + @Override + public PojoConstructorModel mainConstructor() { + throw new UnsupportedOperationException(); + } + + @Override + public PojoConstructorModel constructor(Class... parameterTypes) { + throw new UnsupportedOperationException(); + } + + @Override + public Collection> declaredConstructors() { + throw new UnsupportedOperationException(); + } + + @Override + public Collection> declaredProperties() { + return List.of(); + } + + @SuppressWarnings("unchecked") + @Override + public PojoTypeModel cast(PojoTypeModel other) { + return (PojoTypeModel) other; + } + + @Override + public PojoCaster caster() { + throw new UnsupportedOperationException(); + } + + @Override + public String name() { + return HibernateSearchProcessorEnum.class.getSimpleName(); + } + + @Override + public PojoPropertyModel property(String propertyName) { + throw new UnsupportedOperationException(); + } + + @Override + public Optional> castTo(Class target) { + return Optional.empty(); + } + + @Override + public Optional> typeArgument(Class rawSuperType, int typeParameterIndex) { + return Optional.empty(); + } + + @Override + public Optional> arrayElementType() { + return Optional.empty(); + } + } + + public record Bridge(String valueType) implements ValueBridge, IdentifierBridge { + + @Override + public String toIndexedValue(Object value, ValueBridgeToIndexedValueContext context) { + return ""; + } + + @Override + public void close() { + } + + @Override + public String toDocumentIdentifier(Object propertyValue, IdentifierBridgeToDocumentIdentifierContext context) { + return ""; + } + + @Override + public Object fromDocumentIdentifier(String documentIdentifier, IdentifierBridgeFromDocumentIdentifierContext context) { + return null; + } + } +} diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java index 5a2124de119..02cccb085ef 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java @@ -4,8 +4,8 @@ */ package org.hibernate.search.metamodel.processor.model.impl; -import static org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector.noPrefix; import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.propertyElements; +import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.propertyName; import java.lang.annotation.Annotation; import java.util.Collection; @@ -72,15 +72,12 @@ private ProcessorPojoRawTypeModel(TypeMirror typeMirror, TypeElement typeElement @Override public PojoRawTypeIdentifier typeIdentifier() { if ( typeElement.getKind() == ElementKind.ENUM ) { - return PojoRawTypeIdentifier.of( (Class) EnumStub.class, typeElement.getQualifiedName().toString() ); + return PojoRawTypeIdentifier.of( (Class) HibernateSearchProcessorEnum.class, + typeElement.getQualifiedName().toString() ); } return PojoRawTypeIdentifier.of( (Class) TypeElement.class, typeElement.getQualifiedName().toString() ); } - // TODO: see `isSubTypeOf` if we can remove this dummy enum - private enum EnumStub { - } - @Override public boolean isAbstract() { return typeElement.getModifiers().contains( Modifier.ABSTRACT ); @@ -88,6 +85,9 @@ public boolean isAbstract() { @Override public boolean isSubTypeOf(MappableTypeModel otherModel) { + if ( HibernateSearchProcessorEnum.MODEL == otherModel && typeElement.getKind() == ElementKind.ENUM ) { + return true; + } TypeElement otherTypeElement; if ( otherModel instanceof ProcessorPojoRawTypeModel other ) { otherTypeElement = other.typeElement; @@ -95,10 +95,11 @@ public boolean isSubTypeOf(MappableTypeModel otherModel) { else { otherTypeElement = context.elementUtils().getTypeElement( otherModel.name() ); } - //TODO handle enums differently here, doesn't look like it treats SomeEnum as subtype of Enum. - return otherTypeElement != null - && ( context.typeUtils().isSameType( otherTypeElement.asType(), typeElement.asType() ) - || context.typeUtils().isSubtype( typeElement.asType(), otherTypeElement.asType() ) ); + if ( otherTypeElement == null ) { + return false; + } + return ( context.typeUtils().isSameType( otherTypeElement.asType(), typeElement.asType() ) + || context.typeUtils().isSubtype( typeElement.asType(), otherTypeElement.asType() ) ); } @SuppressWarnings("unchecked") @@ -168,6 +169,10 @@ public PojoPropertyModel property(String propertyName) { .orElse( null ); } + public TypeElement typeElement() { + return typeElement; + } + private ProcessorPojoPropertyModel propertyModel(Element element) { String propertyName = propertyName( element ); if ( element.getKind() == ElementKind.FIELD ) { @@ -181,16 +186,6 @@ private ProcessorPojoPropertyModel propertyModel(Element element) { throw new IllegalArgumentException( "Unsupported element kind: " + element.getKind() ); } - private static String propertyName(Element element) { - if ( element.getKind() == ElementKind.FIELD ) { - return element.getSimpleName().toString(); - } - if ( element.getKind() == ElementKind.METHOD ) { - return noPrefix( element.getSimpleName().toString() ); - } - throw new IllegalArgumentException( "Unsupported element kind: " + element.getKind() ); - } - @Override public Optional> castTo(Class target) { return Optional.empty(); diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java index 027961a8503..3b72169c2d3 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java @@ -23,7 +23,7 @@ import org.hibernate.search.engine.backend.types.converter.spi.ProjectionConverter; import org.hibernate.search.engine.search.common.spi.SearchIndexValueFieldTypeContext; import org.hibernate.search.mapper.pojo.bridge.runtime.impl.PojoValueBridgeDocumentValueConverter; -import org.hibernate.search.metamodel.processor.annotation.processing.impl.AbstractProcessorFieldAnnotationProcessor; +import org.hibernate.search.metamodel.processor.model.impl.HibernateSearchProcessorEnum; import org.hibernate.search.util.common.annotation.impl.SuppressJQAssistant; @SuppressJQAssistant(reason = "Need to use an impl clss for the value converter to get to the type element") @@ -93,8 +93,8 @@ private String typeFromProjectionConverter(ProjectionConverter converter) private String typeFromConverter(Object delegate, Class valueType) { if ( delegate instanceof PojoValueBridgeDocumentValueConverter pvbdc - && pvbdc.bridge() instanceof AbstractProcessorFieldAnnotationProcessor.ProcessorEnumValueBridge bridge ) { - return bridge.valueType().toString(); + && pvbdc.bridge() instanceof HibernateSearchProcessorEnum.Bridge bridge ) { + return bridge.valueType(); } return typeToString( valueType ); } @@ -153,8 +153,7 @@ public final class %s implements public static final %s %s = new %s(); - public final %s; - + %s private %s() { // simple value field references: %s @@ -182,11 +181,7 @@ public final class %s implements metamodelClassName, metamodelNamesFormatter.formatIndexFieldName( metamodelClassName ), metamodelClassName, - Stream.concat( - regularProperties.stream().map( p -> p.asProperty( metamodelClassName ) ), - objectProperties.stream().map( p -> p.asProperty( metamodelClassName ) ) - ) - .collect( Collectors.joining( ";\n\tpublic final " ) ), + getFieldReferences( metamodelClassName ), metamodelClassName, regularProperties.stream().map( p -> p.asSetInConstructor( metamodelClassName ) ) .collect( Collectors.joining( "\n\t\t" ) ), @@ -206,6 +201,16 @@ public final class %s implements ); } + private String getFieldReferences(String metamodelClassName) { + if ( regularProperties.isEmpty() && objectProperties.isEmpty() ) { + return ""; + } + return Stream.concat( + regularProperties.stream().map( p -> p.asProperty( metamodelClassName ) ), + objectProperties.stream().map( p -> p.asProperty( metamodelClassName ) ) + ).collect( Collectors.joining( ";\n\tpublic final ", "public final ", ";\n" ) ); + } + private String scopeInterfaceType() { return ormMapperPresent ? "org.hibernate.search.mapper.orm.scope.HibernateOrmRootReferenceScope" @@ -293,8 +298,7 @@ public String formatted(String scopeType) { Locale.ROOT, """ public static class %s implements %s<%s> { - public final %s; - + %s private %s() { // simple value field references: %s @@ -318,11 +322,7 @@ public String absolutePath() { metamodelClassName, objectReferenceClass(), scopeType, - Stream.concat( - writer.regularProperties.stream().map( p -> p.asProperty( scopeType ) ), - writer.objectProperties.stream().map( p -> p.asProperty( scopeType ) ) - ) - .collect( Collectors.joining( ";\n\tpublic final " ) ), + getFieldReferences( scopeType ), metamodelClassName, writer.regularProperties.stream().map( p -> p.asSetInConstructor( scopeType ) ) .collect( Collectors.joining( "\n\t\t" ) ), @@ -338,6 +338,17 @@ public String absolutePath() { ); } + private String getFieldReferences(String scopeType) { + if ( writer.regularProperties.isEmpty() && writer.objectProperties.isEmpty() ) { + return ""; + } + return Stream.concat( + writer.regularProperties.stream().map( p -> p.asProperty( scopeType ) ), + writer.objectProperties.stream().map( p -> p.asProperty( scopeType ) ) + ) + .collect( Collectors.joining( ";\n\tpublic final ", "public final ", ";\n" ) ); + } + private String objectReferenceClass() { if ( nested ) { return "org.hibernate.search.engine.search.reference.object.NestedFieldReference"; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java index 3899a3a1814..7b812b5673d 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java @@ -27,10 +27,21 @@ import org.hibernate.search.metamodel.processor.model.FieldTypesEntity; import org.hibernate.search.metamodel.processor.model.ISBN; +import org.hibernate.search.metamodel.processor.model.MyContainedEntity; +import org.hibernate.search.metamodel.processor.model.MyContainingEntity; +import org.hibernate.search.metamodel.processor.model.MyCustomField; +import org.hibernate.search.metamodel.processor.model.MyCustomId; import org.hibernate.search.metamodel.processor.model.MyEmbeddedEntity; import org.hibernate.search.metamodel.processor.model.MyEntityWithBinders; import org.hibernate.search.metamodel.processor.model.MyEnum; +import org.hibernate.search.metamodel.processor.model.MyEnumCollectionEntity; +import org.hibernate.search.metamodel.processor.model.MyFieldBinderIndexedEntity; +import org.hibernate.search.metamodel.processor.model.MyFieldBridgeIndexedEntity; +import org.hibernate.search.metamodel.processor.model.MyGeoPointBindingFieldEntity; +import org.hibernate.search.metamodel.processor.model.MyIdBinderIndexedEntity; +import org.hibernate.search.metamodel.processor.model.MyIdBridgeIndexedEntity; import org.hibernate.search.metamodel.processor.model.MyIndexedEntity; +import org.hibernate.search.metamodel.processor.model.MyIndexedGetterEntity; import org.hibernate.search.metamodel.processor.model.SomeGenerics; import org.hibernate.search.metamodel.processor.model.SomeRandomType; import org.hibernate.search.metamodel.processor.model.SomeRandomTypeBinder; @@ -66,11 +77,27 @@ void smoke() { getSourceFile( SomeGenerics.class ), getSourceFile( MyIndexedEntity.class ), getSourceFile( MyEmbeddedEntity.class ), + getSourceFile( MyIndexedGetterEntity.class ), getSourceFile( SomeRandomType.class ), getSourceFile( SomeRandomTypeBinder.class ), getSourceFile( ISBN.class ), getSourceFile( MyEnum.class ), - getSourceFile( FieldTypesEntity.class ) + getSourceFile( FieldTypesEntity.class ), + + getSourceFile( MyCustomId.class ), + getSourceFile( MyIdBinderIndexedEntity.class ), + getSourceFile( MyIdBridgeIndexedEntity.class ), + + getSourceFile( MyCustomField.class ), + getSourceFile( MyFieldBinderIndexedEntity.class ), + getSourceFile( MyFieldBridgeIndexedEntity.class ), + + getSourceFile( MyContainedEntity.class ), + getSourceFile( MyContainingEntity.class ), + + getSourceFile( MyEnumCollectionEntity.class ), + + getSourceFile( MyGeoPointBindingFieldEntity.class ) ); diagnostics.getDiagnostics().forEach( System.out::println ); diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainedEntity.java new file mode 100644 index 00000000000..41756a59baf --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainedEntity.java @@ -0,0 +1,19 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; + +public class MyContainedEntity { + + @DocumentId + private String id; + + @KeywordField(projectable = Projectable.YES) + private String keyword; + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainingEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainingEntity.java new file mode 100644 index 00000000000..03740bd6a5e --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainingEntity.java @@ -0,0 +1,20 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; + +@Indexed +public class MyContainingEntity { + + @DocumentId + private String id; + + @IndexedEmbedded(includeEmbeddedObjectId = true) + private MyContainedEntity entity; + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomField.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomField.java new file mode 100644 index 00000000000..510d0f0d778 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomField.java @@ -0,0 +1,43 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.mapper.pojo.bridge.ValueBridge; +import org.hibernate.search.mapper.pojo.bridge.binding.ValueBindingContext; +import org.hibernate.search.mapper.pojo.bridge.mapping.programmatic.ValueBinder; +import org.hibernate.search.mapper.pojo.bridge.runtime.ValueBridgeFromIndexedValueContext; +import org.hibernate.search.mapper.pojo.bridge.runtime.ValueBridgeToIndexedValueContext; + +public record MyCustomField(long id, String string) { + + public class MyCustomFieldBinder implements ValueBinder { + + @Override + public void bind(ValueBindingContext context) { + context.bridge( + MyCustomField.class, + new Bridge() + ); + } + + public static class Bridge implements ValueBridge { + + @Override + public String toIndexedValue(MyCustomField value, ValueBridgeToIndexedValueContext context) { + return value.id() + "/" + value.string(); + } + + @Override + public MyCustomField fromIndexedValue(String value, ValueBridgeFromIndexedValueContext context) { + if ( value == null ) { + return null; + } + String[] split = value.split( "/" ); + return new MyCustomField( Long.parseLong( split[0] ), split[1] ); + } + } + } + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomId.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomId.java new file mode 100644 index 00000000000..3aaf9d4bee0 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomId.java @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.mapper.pojo.bridge.IdentifierBridge; +import org.hibernate.search.mapper.pojo.bridge.binding.IdentifierBindingContext; +import org.hibernate.search.mapper.pojo.bridge.mapping.programmatic.IdentifierBinder; +import org.hibernate.search.mapper.pojo.bridge.runtime.IdentifierBridgeFromDocumentIdentifierContext; +import org.hibernate.search.mapper.pojo.bridge.runtime.IdentifierBridgeToDocumentIdentifierContext; + +public record MyCustomId(long id, String string) { + + public class MyCustomIdBinder implements IdentifierBinder { + + @Override + public void bind(IdentifierBindingContext context) { + context.bridge( + MyCustomId.class, + new Bridge() + ); + } + + public static class Bridge implements IdentifierBridge { + @Override + public String toDocumentIdentifier(MyCustomId value, + IdentifierBridgeToDocumentIdentifierContext context) { + return value.id() + "/" + value.string(); + } + + @Override + public MyCustomId fromDocumentIdentifier(String documentIdentifier, + IdentifierBridgeFromDocumentIdentifierContext context) { + String[] split = documentIdentifier.split( "/" ); + return new MyCustomId( Long.parseLong( split[0] ), split[1] ); + } + } + } + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnumCollectionEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnumCollectionEntity.java new file mode 100644 index 00000000000..3c8c0dbe59e --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnumCollectionEntity.java @@ -0,0 +1,22 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import java.util.List; + +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; + +@Indexed +public class MyEnumCollectionEntity { + + @DocumentId + private String id; + + @KeywordField + private List list; + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBinderIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBinderIndexedEntity.java new file mode 100644 index 00000000000..8b1b63d7f76 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBinderIndexedEntity.java @@ -0,0 +1,22 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.ValueBinderRef; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; + +@Indexed +public class MyFieldBinderIndexedEntity { + + @DocumentId + private Long id; + + @KeywordField(valueBinder = @ValueBinderRef(type = MyCustomField.MyCustomFieldBinder.class)) + private MyCustomField field; + + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBridgeIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBridgeIndexedEntity.java new file mode 100644 index 00000000000..1f63dbc5279 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBridgeIndexedEntity.java @@ -0,0 +1,20 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.ValueBridgeRef; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; + +@Indexed +public class MyFieldBridgeIndexedEntity { + + @DocumentId + private Long id; + + @KeywordField(valueBridge = @ValueBridgeRef(type = MyCustomField.MyCustomFieldBinder.Bridge.class)) + private MyCustomField field; +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyGeoPointBindingFieldEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyGeoPointBindingFieldEntity.java new file mode 100644 index 00000000000..73500b2591b --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyGeoPointBindingFieldEntity.java @@ -0,0 +1,30 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.GeoPointBinding; +import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.Latitude; +import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.Longitude; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; + +@Indexed +public class MyGeoPointBindingFieldEntity { + + @DocumentId + private String id; + + @GeoPointBinding + private MyCoordinates placeOfBirth; + + public static class MyCoordinates { + + @Latitude + private Double latitude; + + @Longitude + private Double longitude; + } +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBinderIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBinderIndexedEntity.java new file mode 100644 index 00000000000..f5d96eb181c --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBinderIndexedEntity.java @@ -0,0 +1,24 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.IdentifierBinderRef; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; + +@Indexed +public class MyIdBinderIndexedEntity { + + @DocumentId( + identifierBinder = @IdentifierBinderRef(type = MyCustomId.MyCustomIdBinder.class) + ) + private MyCustomId id; + + @KeywordField + private String string; + + +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBridgeIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBridgeIndexedEntity.java new file mode 100644 index 00000000000..7c19cec7b68 --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBridgeIndexedEntity.java @@ -0,0 +1,22 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.IdentifierBridgeRef; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; + +@Indexed +public class MyIdBridgeIndexedEntity { + + @DocumentId( + identifierBridge = @IdentifierBridgeRef(type = MyCustomId.MyCustomIdBinder.Bridge.class) + ) + private MyCustomId id; + + @KeywordField + private String string; +} diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java index 5795d5bd0a8..a9b96a81258 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java @@ -4,8 +4,11 @@ */ package org.hibernate.search.metamodel.processor.model; +import java.math.BigDecimal; import java.time.LocalDate; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Set; import org.hibernate.search.engine.backend.types.Projectable; @@ -66,6 +69,12 @@ public class MyIndexedEntity { @GenericField(extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_VALUE)) private SomeGenerics.MyStringKeyMap dateValues; + @IndexedEmbedded(extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_KEY)) + private Map someMapKey = new LinkedHashMap<>(); + + @KeywordField(extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_KEY)) + private Map someMapEnumKey = new LinkedHashMap<>(); + @IndexedEmbedded private List embeddedList; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedGetterEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedGetterEntity.java new file mode 100644 index 00000000000..c621aa50e0e --- /dev/null +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedGetterEntity.java @@ -0,0 +1,188 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.search.metamodel.processor.model; + +import java.time.LocalDate; +import java.util.List; +import java.util.Set; + +import org.hibernate.search.engine.backend.types.Projectable; +import org.hibernate.search.engine.spatial.GeoPoint; +import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.GeoPointBinding; +import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.Latitude; +import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.Longitude; +import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.PropertyBinderRef; +import org.hibernate.search.mapper.pojo.extractor.builtin.BuiltinContainerExtractors; +import org.hibernate.search.mapper.pojo.extractor.mapping.annotation.ContainerExtraction; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.PropertyBinding; +import org.hibernate.search.mapper.pojo.mapping.definition.annotation.VectorField; + +@Indexed +@GeoPointBinding(fieldName = "placeOfBirth", markerSet = "birth") +@GeoPointBinding(fieldName = "placeOfDeath", markerSet = "death") +public class MyIndexedGetterEntity { + + private String id; + + private LocalDate date; + + private String keyword; + + private String text; + + private ISBN isbn; + + private SomeRandomType someRandomType; + + private MyEmbeddedEntity embedded; + + private Set keywords; + + private SomeGenerics.MyStringList fullTextFields; + + private SomeGenerics.MyStringStringMap mapKeys; + + private SomeGenerics.MyStringStringMap mapValues; + + private SomeGenerics.MyStringKeyMap dateValues; + + private List embeddedList; + + private byte[] bytes; + + private float[] floats; + + private Double placeOfBirthLatitude; + + private Double placeOfBirthLongitude; + + private Double placeOfDeathLatitude; + + private Double placeOfDeathLongitude; + + private MyEnum myEnum; + + @KeywordField + private MyEnum myfieldEnum; + + private GeoPoint point; + + private String someString; + + @DocumentId + public String getId() { + return id; + } + + @GenericField + public LocalDate getDate() { + return date; + } + + @KeywordField(projectable = Projectable.YES) + public String getKeyword() { + return keyword; + } + + @FullTextField + public String getText() { + return text; + } + + // @PropertyBinding(binder = @PropertyBinderRef(type = ISBNBinder.class)) + public ISBN getIsbn() { + return isbn; + } + + @PropertyBinding(binder = @PropertyBinderRef(type = SomeRandomTypeBinder.class)) + public SomeRandomType getSomeRandomType() { + return someRandomType; + } + + @IndexedEmbedded + public MyEmbeddedEntity getEmbedded() { + return embedded; + } + + @KeywordField + public Set getKeywords() { + return keywords; + } + + @FullTextField + public SomeGenerics.MyStringList getFullTextFields() { + return fullTextFields; + } + + @FullTextField(extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_KEY)) + public SomeGenerics.MyStringStringMap getMapKeys() { + return mapKeys; + } + + @FullTextField(extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_VALUE)) + public SomeGenerics.MyStringStringMap getMapValues() { + return mapValues; + } + + @GenericField(extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_VALUE)) + public SomeGenerics.MyStringKeyMap getDateValues() { + return dateValues; + } + + @IndexedEmbedded + public List getEmbeddedList() { + return embeddedList; + } + + @VectorField(dimension = 15) + public byte[] getBytes() { + return bytes; + } + + @VectorField(dimension = 5) + public float[] getFloats() { + return floats; + } + + @Latitude(markerSet = "birth") + public Double getPlaceOfBirthLatitude() { + return placeOfBirthLatitude; + } + + @Longitude(markerSet = "birth") + public Double getPlaceOfBirthLongitude() { + return placeOfBirthLongitude; + } + + @Latitude(markerSet = "death") + public Double getPlaceOfDeathLatitude() { + return placeOfDeathLatitude; + } + + @Longitude(markerSet = "death") + public Double getPlaceOfDeathLongitude() { + return placeOfDeathLongitude; + } + + @KeywordField + public MyEnum getMyEnum() { + return myEnum; + } + + @GenericField + public GeoPoint getPoint() { + return point; + } + + public String getSomeString() { + return someString; + } +} From 4b6a186f64cd29270c4d88e4fa63693cb0445adb Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Wed, 30 Apr 2025 23:45:23 +0200 Subject: [PATCH 25/25] HSEARCH-5300 Rename package/processor and clean up the docs --- Jenkinsfile | 2 +- bom/public/pom.xml | 2 +- build/jqassistant/rules/rules.xml | 2 +- build/parents/build/pom.xml | 2 +- build/reports/pom.xml | 2 +- documentation/pom.xml | 37 +- .../public/reference/_mapping-inspect.adoc | 12 +- .../reference/_static-metamodel-overview.adoc | 10 +- .../_static-metamodel-processor.adoc | 34 +- .../public/reference/_static-metamodel.adoc | 7 +- .../converter/ProjectionConverterIT.java | 2 +- .../search/metamodel/Author.java | 3 - .../search/metamodel/Author__.java | 125 ------- .../documentation/search/metamodel/Book.java | 3 - .../search/metamodel/Book__.java | 338 ------------------ .../search/metamodel/MetamodelIT.java | 7 +- .../dsl/AvgAggregationFieldStep.java | 6 +- .../dsl/CountAggregationFieldStep.java | 6 +- .../CountDistinctAggregationFieldStep.java | 6 +- .../dsl/MaxAggregationFieldStep.java | 6 +- .../dsl/MinAggregationFieldStep.java | 6 +- .../dsl/RangeAggregationFieldStep.java | 2 +- .../dsl/SearchAggregationFactory.java | 9 + .../dsl/SumAggregationFieldStep.java | 6 +- .../dsl/TermsAggregationFieldStep.java | 2 +- ...mmonQueryStringPredicateFieldMoreStep.java | 16 +- .../CommonQueryStringPredicateFieldStep.java | 16 +- .../dsl/ExistsPredicateFieldStep.java | 6 +- .../dsl/MatchPredicateFieldStep.java | 2 +- .../dsl/NestedPredicateFieldStep.java | 6 +- .../dsl/PhrasePredicateFieldMoreStep.java | 6 +- .../dsl/PhrasePredicateFieldStep.java | 6 +- .../dsl/PrefixPredicateFieldMoreStep.java | 6 +- .../dsl/PrefixPredicateFieldStep.java | 6 +- .../dsl/RangePredicateFieldStep.java | 6 +- .../dsl/RegexpPredicateFieldMoreStep.java | 6 +- .../dsl/RegexpPredicateFieldStep.java | 6 +- .../predicate/dsl/SearchPredicateFactory.java | 15 +- .../SpatialWithinPredicateFieldMoreStep.java | 2 +- .../dsl/SpatialWithinPredicateFieldStep.java | 2 +- .../dsl/TermsPredicateFieldMoreStep.java | 6 +- .../dsl/TermsPredicateFieldStep.java | 6 +- .../dsl/WildcardPredicateFieldMoreStep.java | 6 +- .../dsl/WildcardPredicateFieldStep.java | 6 +- .../dsl/SearchProjectionFactory.java | 9 + .../search/sort/dsl/SearchSortFactory.java | 10 + .../metamodel/orm-elasticsearch/pom.xml | 6 +- integrationtest/metamodel/orm-lucene/pom.xml | 6 +- .../standalone-elasticsearch/pom.xml | 6 +- .../metamodel/standalone-lucene/pom.xml | 6 +- lucene-next/documentation/pom.xml | 35 ++ metamodel/metamodel-processor/pom.xml | 6 +- .../metamodel/processor/package-info.java | 1 - .../HibernateSearchProcessor.java} | 20 +- .../HibernateSearchProcessorSettings.java} | 14 +- .../AbstractProcessorAnnotationProcessor.java | 2 +- ...ractProcessorFieldAnnotationProcessor.java | 2 +- ...orNonFullTextFieldAnnotationProcessor.java | 2 +- ...essorStandardFieldAnnotationProcessor.java | 2 +- .../ProcessorAnnotationProcessorContext.java | 2 +- .../impl/ProcessorDocumentIdProcessor.java | 2 +- .../impl/ProcessorFulltextFieldProcessor.java | 2 +- .../impl/ProcessorGenericFieldProcessor.java | 4 +- .../ProcessorGeoPointBindingProcessor.java | 4 +- .../ProcessorIndexedEmbeddedProcessor.java | 4 +- .../impl/ProcessorKeywordFieldProcessor.java | 2 +- .../impl/ProcessorLatitudeProcessor.java | 2 +- .../impl/ProcessorLongitudeProcessor.java | 2 +- .../ProcessorNonStandardFieldProcessor.java | 4 +- ...sorPropertyMappingAnnotationProcessor.java | 2 +- .../ProcessorScaledNumberFieldProcessor.java | 4 +- ...ocessorTypeMappingAnnotationProcessor.java | 2 +- ...ProcessorTypePropertyBindingProcessor.java | 2 +- .../impl/ProcessorVectorFieldProcessor.java | 4 +- .../processor/impl/ExceptionUtils.java | 5 +- ...ernateSearchMetamodelProcessorContext.java | 4 +- ...xedEntityMetamodelAnnotationProcessor.java | 24 +- .../impl/MetamodelAnnotationProcessor.java | 2 +- .../processor/impl/ProcessorElementUtils.java | 6 +- .../impl/ProcessorIntrospectorContext.java | 6 +- ...cessorPojoModelsBootstrapIntrospector.java | 10 +- .../impl/BuiltInBridgeResolverTypes.java | 2 +- .../impl/HibernateSearchProcessorEnum.java | 3 +- .../impl/ProcessorPojoPropertyModel.java | 6 +- .../model/impl/ProcessorPojoRawTypeModel.java | 10 +- .../model/impl/ProcessorTypeOrdering.java | 4 +- .../search/processor/package-info.java | 1 + .../processor/writer/impl/ClassProperty.java | 2 +- .../writer/impl/MetamodelClassWriter.java | 6 +- .../writer/impl/MetamodelNamesFormatter.java | 2 +- .../processor/writer/impl/TraitKind.java | 2 +- .../writer/impl/TraitReferenceDetails.java | 2 +- .../writer/impl/TraitReferenceMapping.java | 2 +- .../impl/TypedFieldReferenceDetails.java | 2 +- .../impl/ValueFieldReferenceDetails.java | 2 +- .../javax.annotation.processing.Processor | 2 +- .../src/main/resources/logging.properties | 4 + ...HibernateSearchProcessorSettingsTest.java} | 8 +- .../HibernateSearchProcessorTest.java} | 50 +-- .../processor/model/FieldTypesEntity.java | 2 +- .../{metamodel => }/processor/model/ISBN.java | 2 +- .../processor/model/MyContainedEntity.java | 2 +- .../processor/model/MyContainingEntity.java | 2 +- .../processor/model/MyCustomField.java | 2 +- .../processor/model/MyCustomId.java | 2 +- .../processor/model/MyEmbeddedEntity.java | 2 +- .../processor/model/MyEntityWithBinders.java | 2 +- .../processor/model/MyEnum.java | 2 +- .../model/MyEnumCollectionEntity.java | 2 +- .../model/MyFieldBinderIndexedEntity.java | 2 +- .../model/MyFieldBridgeIndexedEntity.java | 2 +- .../model/MyGeoPointBindingFieldEntity.java | 2 +- .../model/MyIdBinderIndexedEntity.java | 2 +- .../model/MyIdBridgeIndexedEntity.java | 2 +- .../processor/model/MyIndexedEntity.java | 2 +- .../model/MyIndexedGetterEntity.java | 2 +- .../processor/model/SomeGenerics.java | 2 +- .../processor/model/SomeRandomType.java | 2 +- .../processor/model/SomeRandomTypeBinder.java | 2 +- .../impl/TraitReferenceDetailsTest.java | 2 +- .../impl/TraitReferenceMappingTest.java | 2 +- 121 files changed, 403 insertions(+), 745 deletions(-) delete mode 100644 documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author__.java delete mode 100644 documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book__.java delete mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/package-info.java rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel/processor/HibernateSearchMetamodelProcessor.java => processor/HibernateSearchProcessor.java} (71%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel/processor/HibernateSearchMetamodelProcessorSettings.java => processor/HibernateSearchProcessorSettings.java} (87%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java (98%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java (96%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java (96%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java (95%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorAnnotationProcessorContext.java (92%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java (94%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java (98%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java (90%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java (93%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java (95%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java (97%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java (94%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java (94%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java (90%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorPropertyMappingAnnotationProcessor.java (98%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java (93%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorTypeMappingAnnotationProcessor.java (92%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java (97%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java (97%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/impl/ExceptionUtils.java (84%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/impl/HibernateSearchMetamodelProcessorContext.java (76%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java (90%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/impl/MetamodelAnnotationProcessor.java (81%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/impl/ProcessorElementUtils.java (94%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/mapping/impl/ProcessorIntrospectorContext.java (85%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java (89%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/model/impl/BuiltInBridgeResolverTypes.java (98%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/model/impl/HibernateSearchProcessorEnum.java (97%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/model/impl/ProcessorPojoPropertyModel.java (90%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/model/impl/ProcessorPojoRawTypeModel.java (94%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/model/impl/ProcessorTypeOrdering.java (84%) create mode 100644 metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/package-info.java rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/writer/impl/ClassProperty.java (90%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/writer/impl/MetamodelClassWriter.java (97%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/writer/impl/MetamodelNamesFormatter.java (88%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/writer/impl/TraitKind.java (92%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/writer/impl/TraitReferenceDetails.java (96%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/writer/impl/TraitReferenceMapping.java (99%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/writer/impl/TypedFieldReferenceDetails.java (98%) rename metamodel/metamodel-processor/src/main/java/org/hibernate/search/{metamodel => }/processor/writer/impl/ValueFieldReferenceDetails.java (97%) create mode 100644 metamodel/metamodel-processor/src/main/resources/logging.properties rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel/processor/HibernateSearchMetamodelProcessorSettingsTest.java => processor/HibernateSearchProcessorSettingsTest.java} (70%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel/processor/HibernateSearchMetamodelProcessorTest.java => processor/HibernateSearchProcessorTest.java} (73%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/FieldTypesEntity.java (97%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/ISBN.java (70%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyContainedEntity.java (89%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyContainingEntity.java (90%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyCustomField.java (95%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyCustomId.java (95%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyEmbeddedEntity.java (88%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyEntityWithBinders.java (91%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyEnum.java (70%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyEnumCollectionEntity.java (89%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyFieldBinderIndexedEntity.java (91%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyFieldBridgeIndexedEntity.java (91%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyGeoPointBindingFieldEntity.java (93%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyIdBinderIndexedEntity.java (92%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyIdBridgeIndexedEntity.java (92%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyIndexedEntity.java (98%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/MyIndexedGetterEntity.java (98%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/SomeGenerics.java (88%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/SomeRandomType.java (75%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/model/SomeRandomTypeBinder.java (95%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/writer/impl/TraitReferenceDetailsTest.java (95%) rename metamodel/metamodel-processor/src/test/java/org/hibernate/search/{metamodel => }/processor/writer/impl/TraitReferenceMappingTest.java (97%) diff --git a/Jenkinsfile b/Jenkinsfile index 1d20e44a5df..0ea49e3db58 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -499,7 +499,7 @@ stage('Non-default environments') { // we'd better recompile everything with the same compiler rather than get some strange errors mavenNonDefaultBuild buildEnv, """ \ -DskipTests -DskipITs \ - -P${buildEnv.mavenProfile},!javaModuleITs,!metamodelITs -pl '!:hibernate-search-documentation,!:hibernate-search-reports' \ + -P${buildEnv.mavenProfile},!javaModuleITs,!metamodelITs -pl '!:hibernate-search-documentation,!:hibernate-search-documentation-lucene-next,!:hibernate-search-reports' \ -Dgib.buildAll=true \ """ } diff --git a/bom/public/pom.xml b/bom/public/pom.xml index 264a82a1897..5682a6ad6ec 100644 --- a/bom/public/pom.xml +++ b/bom/public/pom.xml @@ -94,7 +94,7 @@ org.hibernate.search - hibernate-search-metamodel-processor + hibernate-search-processor ${project.version} diff --git a/build/jqassistant/rules/rules.xml b/build/jqassistant/rules/rules.xml index a681202fed5..9057dfe7ebd 100644 --- a/build/jqassistant/rules/rules.xml +++ b/build/jqassistant/rules/rules.xml @@ -281,7 +281,7 @@ WHEN 'hibernate-search-mapper-orm' THEN 'HibernateOrm' WHEN 'hibernate-search-mapper-orm-outbox-polling' THEN 'OutboxPolling' WHEN 'hibernate-search-mapper-orm-jakarta-batch-jberet' THEN 'JBeret' - WHEN 'hibernate-search-metamodel-processor' THEN 'Processor' + WHEN 'hibernate-search-processor' THEN 'Processor' ELSE 'UNKNOWN-MODULE-SPECIFIC-KEYWORD-PLEASE-UPDATE-JQASSISTANT-RULES' END RETURN diff --git a/build/parents/build/pom.xml b/build/parents/build/pom.xml index 7dd72c66e4c..ea3b8f7660f 100644 --- a/build/parents/build/pom.xml +++ b/build/parents/build/pom.xml @@ -371,7 +371,7 @@ org.hibernate.search - hibernate-search-metamodel-processor + hibernate-search-processor ${project.version} diff --git a/build/reports/pom.xml b/build/reports/pom.xml index 309b3bf2dd5..7ce3ba0ca48 100644 --- a/build/reports/pom.xml +++ b/build/reports/pom.xml @@ -76,7 +76,7 @@ org.hibernate.search - hibernate-search-metamodel-processor + hibernate-search-processor org.hibernate.search diff --git a/documentation/pom.xml b/documentation/pom.xml index 762a91370b5..de945e37157 100644 --- a/documentation/pom.xml +++ b/documentation/pom.xml @@ -64,7 +64,7 @@ ${project.groupId} - hibernate-search-metamodel-processor + hibernate-search-processor test @@ -121,7 +121,42 @@ even though we don't explicitly use it. This is probably a compiler bug, so here we need to work around it. --> false + + org/hibernate/search/documentation/search/metamodel/** + + + + generate-metamodel + test-compile + + testCompile + + + full + + org/hibernate/search/documentation/search/metamodel/** + + + false + + org.hibernate.search.processor.HibernateSearchProcessor + + + + org.hibernate.search + hibernate-search-processor + ${project.version} + + + org.hibernate.search + hibernate-search-backend-elasticsearch + ${project.version} + + + + + org.apache.maven.plugins diff --git a/documentation/src/main/asciidoc/public/reference/_mapping-inspect.adoc b/documentation/src/main/asciidoc/public/reference/_mapping-inspect.adoc index cc2b62a2bd0..c2359afca32 100644 --- a/documentation/src/main/asciidoc/public/reference/_mapping-inspect.adoc +++ b/documentation/src/main/asciidoc/public/reference/_mapping-inspect.adoc @@ -50,9 +50,7 @@ is it searchable, sortable, projectable, what is the expected java class for arguments to the <>, what are the analyzers/normalizer set on this field, ... -<9> Inspect the "traits" of a field type: -each trait represents a predicate/sort/projection/aggregation -that can be used on fields of that type. +<9> Inspect the <> of a field type. <10> Object fields can also be inspected. <11> A collection of all configured analyzers available for the index represented by the descriptor can also be inspected. @@ -64,6 +62,14 @@ available for the index represented by the descriptor can also be inspected. to see if a particular normalizer is available within the index context. ==== +[[mapping-inspect-traits]] +[TIP] +==== +Traits define the set of search capabilities available for the field, +in particular, each trait represents a predicate/sort/projection/aggregation +that can be used on that field. +==== + [TIP] ==== The `Backend` and `IndexManager` can also be used to diff --git a/documentation/src/main/asciidoc/public/reference/_static-metamodel-overview.adoc b/documentation/src/main/asciidoc/public/reference/_static-metamodel-overview.adoc index f7a88b97068..a06b9921952 100644 --- a/documentation/src/main/asciidoc/public/reference/_static-metamodel-overview.adoc +++ b/documentation/src/main/asciidoc/public/reference/_static-metamodel-overview.adoc @@ -6,7 +6,7 @@ include::../components/_incubating-warning.adoc[] The static metamodel class describes the index structure. Each indexed entity (index) is represented by a single class -that may contain inner classes describing the embeddables (i.e. nested/flattened objects). These classes contain <> +that may contain inner classes describing object fields (e.g. from <>). These classes contain <> representing index fields and their search capabilities. The name of this root class is constructed from the indexed entity name by adding `pass:[__]` (two underscores) suffix, e.g. `MySearchEntitypass:[__]`. @@ -14,7 +14,7 @@ If the indexed entity is a (static) inner class, then all the owning classes wil e.g. `MyOuterClasspass:[_]MySearchEntitypass:[__]`. These classes are created in the same package where the search entity they represent is located. -The root metamodel class that describes the indexed entity has a static field `INDEX` that users can use to interact with the metamodel. +The root metamodel class that describes the indexed entity has a static field `INDEX` that you can use to interact with the metamodel. It serves two primary purposes: * It simplifies creating the search scope and building search queries for such scope. @@ -39,7 +39,7 @@ limit acceptable field references to the ones obtained from the `Book__.INDEX` A field reference type describes the set of search capabilities a particular index field has, in particular, what kind of projections/aggregations/predicates/sorts are allowed, if any. It does so by implementing a -subset of search traits interfaces defined in `org.hibernate.search.engine.search.reference.pass:[*]`, which in turn allows +subset of <> interfaces defined in `org.hibernate.search.engine.search.reference.pass:[*]`, which in turn allows performing compile-time checks when building <>. ==== @@ -47,7 +47,7 @@ performing compile-time checks when building <>. ---- include::{sourcedir}/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java[tags=compileCheck-pass] ---- -<1> If the title field is projectable then this compiles works fine, +<1> If the title field is projectable then this compiles fine, otherwise compilation fails with an error similar to: + ---- @@ -64,5 +64,5 @@ The field reference also provides a way to quickly switch between < Calling `string()` on a field reference is an eqivalent to `.field( "genre" ).matching( , ValueModel.STRING )` +<1> Calling `string()` on a field reference is an equivalent to `.field( "genre" ).matching( , ValueModel.STRING )` ==== diff --git a/documentation/src/main/asciidoc/public/reference/_static-metamodel-processor.adoc b/documentation/src/main/asciidoc/public/reference/_static-metamodel-processor.adoc index 2ac1aa2ed0b..4d2d949ea38 100644 --- a/documentation/src/main/asciidoc/public/reference/_static-metamodel-processor.adoc +++ b/documentation/src/main/asciidoc/public/reference/_static-metamodel-processor.adoc @@ -9,7 +9,7 @@ include::../components/_incubating-warning.adoc[] == Enabling the annotation processor Hibernate Search provides a dedicated annotation processor to generate the static metamodel classes. -This annotation processor is located in the `org.hibernate.search:hibernate-search-metamodel-processor`. +This annotation processor is located in the `org.hibernate.search:hibernate-search-processor`. The annotation processor has to be added to the build, e.g. for Maven: @@ -23,12 +23,12 @@ The annotation processor has to be added to the build, e.g. for Maven: default-compile - org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor <1> + org.hibernate.search.processor.HibernateSearchProcessor <1> org.hibernate.search - hibernate-search-metamodel-processor <2> + hibernate-search-processor <2> org.hibernate.search @@ -42,12 +42,13 @@ The annotation processor has to be added to the build, e.g. for Maven: ---- <1> Provide the fully qualified class name of the annotation processor that generates the metamodel. -<2> Add the `org.hibernate.search:hibernate-search-metamodel-processor` dependency as an annotation processor path for the Maven compiler plugin to be able to actually find the processor. -<3> Add the backend dependency, in this example, the <>, as an annotation processor path. +<2> Add the `org.hibernate.search:hibernate-search-processor` dependency to the annotation processor path (a superset of the compile path), so the Java compiler can find the processor. +<3> Add the backend dependency, in this example, the <>, to the annotation processor path. It is important to include the same backend that the application is using to make sure that the generated metamodel classes reflect all the backend specifics. -For example, backends might have different defaults, resulting in a different set of field traits depending on the backend. +For example, backends might have different defaults, resulting in a different set of <> per specific field, depending on the backend. -NOTE: The version of both annotation processor and backend dependencies are skipped in the definition of the annotation paths, as in case the Hibernate Search BOM is imported via dependency management, the compiler plugin will use the managed versions. +NOTE: The version of both annotation processor and backend dependencies can be ommitted in the definition of the annotation paths, +because they are defined in the Hibernate Search BOM, which we recommend you import via dependency management. This way the generated metamodel classes will be based on the same backend that the application uses. ==== @@ -66,7 +67,7 @@ The annotation processor options are passed as the compiler arguments with the ` default-compile - -Aorg.hibernate.search.metamodel.processor.generated_annotation.timestamp=false <1> + -Aorg.hibernate.search.processor.generated_annotation.timestamp=false <1> <2> <3> @@ -83,13 +84,13 @@ The annotation processor options are passed as the compiler arguments with the ` The following annotation processor configuration properties are available: -[[static-metamodel-processor-configuration-generated_annotation-add]]`org.hibernate.search.metamodel.processor.generated_annotation.add`:: +[[static-metamodel-processor-configuration-generated_annotation-add]]`org.hibernate.search.processor.generated_annotation.add`:: Description::: Whether to add the `@Generated` annotation to the generated static metamodel classes. Default value::: `true` -[[static-metamodel-processor-configuration-generated_annotation-timestamp]]`org.hibernate.search.metamodel.processor.generated_annotation.timestamp`:: +[[static-metamodel-processor-configuration-generated_annotation-timestamp]]`org.hibernate.search.processor.generated_annotation.timestamp`:: Description::: Defines whether the `@Generated` annotation includes the `date` attribute. Having the date attribute will result in non-reproducible builds, as the timestamp will be different for each compilation. @@ -97,20 +98,25 @@ Hence, it is disabled by default. Default value::: `false` -[[static-metamodel-processor-configuration-add_generated_annotation]]`org.hibernate.search.metamodel.processor.backend.version`:: +[[static-metamodel-processor-configuration-add_generated_annotation]]`org.hibernate.search.processor.backend.version`:: Description::: Explicitly define the backend version. By default, the processor will use the latest compatible version of the backend. This option can be used if the static metamodel is required for an older backend version. +While this option is mostly for the Elasticsearch backend, +where it translates into <>, +it will also translate into <> if the Lucene backend is used. Default value::: `` [[static-metamodel-processor-limitations]] == Current annotation processor limitations -While the annotation processor is in its early stages of development, it has a few limitations: +While the annotation processor is very much functional and we encourage you to try it, +it is still in the early stages of development, and thus has a few limitations: * Any use of <> will be ignored and should produce a compiler warning. This means that if the search entities rely on custom binders, fields that those binders produce will be missing from the generated metamodel. -* <> are not supported. +* <> are ignored without warning. * <> is also unsupported by the annotation processor. -As the annotation processor cannot easily read programmatic mapping definitions, this limitation is here to stay. +As the annotation processor cannot possibly execute programmatic mapping defined in the code that is being compiled, +this limitation is here to stay. diff --git a/documentation/src/main/asciidoc/public/reference/_static-metamodel.adoc b/documentation/src/main/asciidoc/public/reference/_static-metamodel.adoc index 604b80a726f..949afd3c981 100644 --- a/documentation/src/main/asciidoc/public/reference/_static-metamodel.adoc +++ b/documentation/src/main/asciidoc/public/reference/_static-metamodel.adoc @@ -5,8 +5,11 @@ include::../components/_incubating-warning.adoc[] -Hibernate Search static metamodel represents the index structure -that provides a type-safe way of creating search queries through the <>. +Hibernate Search's static metamodel is a set of generated classes that represents the structure of each entity's index, +thereby allowing to reference index fields in a type-safe way to create search queries through the <>. + +The basic principles are very similar to the link:{hibernateDocUrl}#tooling-modelgen[JPA static metamodel available in Hibernate ORM], +but in the case of Search the metamodel is about indexes rather than entities. :leveloffset: +1 diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/converter/ProjectionConverterIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/converter/ProjectionConverterIT.java index 854f599988e..1a00ea52de4 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/converter/ProjectionConverterIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/converter/ProjectionConverterIT.java @@ -165,7 +165,7 @@ public void setStatus(OrderStatus status) { } } - private enum OrderStatus { + enum OrderStatus { ACKNOWLEDGED, IN_PROGRESS, DELIVERED diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author.java b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author.java index bab09f43dca..e1651611b11 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author.java @@ -30,9 +30,6 @@ public class Author { @ManyToMany(mappedBy = "authors") private List books = new ArrayList<>(); - public Author() { - } - public Integer getId() { return id; } diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author__.java b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author__.java deleted file mode 100644 index c87687519c2..00000000000 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Author__.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.documentation.search.metamodel; - -/** - * Note: this class was created by an annotation processor and copied to the sources, - * so that we do not run the AP on an entire documentation module. - */ -@javax.annotation.processing.Generated(value = "org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor") -public final class Author__ - implements - org.hibernate.search.mapper.orm.scope.HibernateOrmRootReferenceScope { - - public static final Author__ INDEX = new Author__(); - - public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 firstName; - public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 lastName; - - private Author__() { - // simple value field references: - this.firstName = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "firstName", Author__.class, String.class, - String.class, String.class, String.class ); - this.lastName = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "lastName", Author__.class, String.class, String.class, - String.class, String.class ); - // various object field references: - - } - - @Override - public Class rootReferenceType() { - return Author__.class; - } - - @Override - public org.hibernate.search.mapper.orm.scope.SearchScope scope( - org.hibernate.search.mapper.orm.scope.SearchScopeProvider scopeProvider) { - return scopeProvider.scope( Author.class ); - } - - public static class ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 - extends TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 { - - private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 mapping; - private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 raw; - private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 string; - - public ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9( - String absolutePath, - Class scopeRootType, - Class inputType, - Class outputType, - Class indexType, - Class rawType - ) { - super( absolutePath, scopeRootType, org.hibernate.search.engine.search.common.ValueModel.MAPPING, inputType ); - this.mapping = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.INDEX, indexType ); - this.raw = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.RAW, rawType ); - this.string = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.STRING, String.class ); - } - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 mapping() { - return mapping; - } - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 raw() { - return raw; - } - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 string() { - return string; - } - - } - - public static class TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 - implements org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference { - - private final String absolutePath; - private final Class scopeRootType; - private final org.hibernate.search.engine.search.common.ValueModel valueModel; - private final Class predicateType; - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9( - String absolutePath, - Class scopeRootType, - org.hibernate.search.engine.search.common.ValueModel valueModel, - Class predicateType) { - this.absolutePath = absolutePath; - this.scopeRootType = scopeRootType; - this.valueModel = valueModel; - this.predicateType = predicateType; - } - - public String absolutePath() { - return this.absolutePath; - } - - public Class scopeRootType() { - return this.scopeRootType; - } - - public org.hibernate.search.engine.search.common.ValueModel valueModel() { - return this.valueModel; - } - - public Class predicateType() { - return this.predicateType; - } - } - -} diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book.java b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book.java index 3dee6047f9a..c6df5e5059e 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book.java @@ -46,9 +46,6 @@ public class Book { @IndexedEmbedded(structure = ObjectStructure.NESTED) private List authors = new ArrayList<>(); - public Book() { - } - public Integer getId() { return id; } diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book__.java b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book__.java deleted file mode 100644 index fb8c26dd2bf..00000000000 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/Book__.java +++ /dev/null @@ -1,338 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.search.documentation.search.metamodel; - -/** - * Note: this class was created by an annotation processor and copied to the sources, - * so that we do not run the AP on an entire documentation module. - */ -@javax.annotation.processing.Generated(value = "org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor") -public final class Book__ - implements - org.hibernate.search.mapper.orm.scope.HibernateOrmRootReferenceScope { - - public static final Book__ INDEX = new Book__(); - - public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 comment; - public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 description; - public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 genre; - public final ValueFieldReferenceP0P13P2P6P7P9 pageCount; - public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 title; - public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 title_autocomplete; - public final Book__authors__ authors; - - private Book__() { - // simple value field references: - this.comment = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "comment", Book__.class, String.class, String.class, - String.class, String.class ); - this.description = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "description", Book__.class, String.class, - String.class, String.class, String.class ); - this.genre = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "genre", Book__.class, Genre.class, Genre.class, - String.class, String.class ); - this.pageCount = new ValueFieldReferenceP0P13P2P6P7P9<>( "pageCount", Book__.class, Integer.class, Integer.class, - Integer.class, Integer.class ); - this.title = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2<>( "title", Book__.class, String.class, String.class, - String.class, String.class ); - this.title_autocomplete = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "title_autocomplete", Book__.class, - String.class, String.class, String.class, String.class ); - // various object field references: - this.authors = new Book__authors__(); - } - - @Override - public Class rootReferenceType() { - return Book__.class; - } - - @Override - public org.hibernate.search.mapper.orm.scope.SearchScope scope( - org.hibernate.search.mapper.orm.scope.SearchScopeProvider scopeProvider) { - return scopeProvider.scope( Book.class ); - } - - public static class ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 - extends TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 { - - private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 mapping; - private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 raw; - private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 string; - - public ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9( - String absolutePath, - Class scopeRootType, - Class inputType, - Class outputType, - Class indexType, - Class rawType - ) { - super( absolutePath, scopeRootType, org.hibernate.search.engine.search.common.ValueModel.MAPPING, inputType ); - this.mapping = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.INDEX, indexType ); - this.raw = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.RAW, rawType ); - this.string = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.STRING, String.class ); - } - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 mapping() { - return mapping; - } - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 raw() { - return raw; - } - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 string() { - return string; - } - - } - - public static class TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9 - implements org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference { - - private final String absolutePath; - private final Class scopeRootType; - private final org.hibernate.search.engine.search.common.ValueModel valueModel; - private final Class predicateType; - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9( - String absolutePath, - Class scopeRootType, - org.hibernate.search.engine.search.common.ValueModel valueModel, - Class predicateType) { - this.absolutePath = absolutePath; - this.scopeRootType = scopeRootType; - this.valueModel = valueModel; - this.predicateType = predicateType; - } - - public String absolutePath() { - return this.absolutePath; - } - - public Class scopeRootType() { - return this.scopeRootType; - } - - public org.hibernate.search.engine.search.common.ValueModel valueModel() { - return this.valueModel; - } - - public Class predicateType() { - return this.predicateType; - } - } - - public static class ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 - extends TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 { - - private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 mapping; - private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 raw; - private final TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 string; - - public ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2( - String absolutePath, - Class scopeRootType, - Class inputType, - Class outputType, - Class indexType, - Class rawType - ) { - super( absolutePath, scopeRootType, org.hibernate.search.engine.search.common.ValueModel.MAPPING, inputType, - outputType ); - this.mapping = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.INDEX, indexType, indexType ); - this.raw = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.RAW, rawType, rawType ); - this.string = new TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.STRING, String.class, String.class ); - } - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 mapping() { - return mapping; - } - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 raw() { - return raw; - } - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 string() { - return string; - } - - } - - public static class TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2 - implements org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference, - org.hibernate.search.engine.search.reference.projection.FieldProjectionFieldReference, - org.hibernate.search.engine.search.reference.projection.HighlightProjectionFieldReference { - - private final String absolutePath; - private final Class scopeRootType; - private final org.hibernate.search.engine.search.common.ValueModel valueModel; - private final Class predicateType; - private final Class projectionType; - - public TypedFieldReferenceP0P13P14P2P4P5P6P7P8P9R1R2( - String absolutePath, - Class scopeRootType, - org.hibernate.search.engine.search.common.ValueModel valueModel, - Class predicateType, - Class projectionType) { - this.absolutePath = absolutePath; - this.scopeRootType = scopeRootType; - this.valueModel = valueModel; - this.predicateType = predicateType; - this.projectionType = projectionType; - } - - public String absolutePath() { - return this.absolutePath; - } - - public Class scopeRootType() { - return this.scopeRootType; - } - - public org.hibernate.search.engine.search.common.ValueModel valueModel() { - return this.valueModel; - } - - public Class predicateType() { - return this.predicateType; - } - - public Class projectionType() { - return this.projectionType; - } - } - - public static class ValueFieldReferenceP0P13P2P6P7P9 extends TypedFieldReferenceP0P13P2P6P7P9 { - - private final TypedFieldReferenceP0P13P2P6P7P9 mapping; - private final TypedFieldReferenceP0P13P2P6P7P9 raw; - private final TypedFieldReferenceP0P13P2P6P7P9 string; - - public ValueFieldReferenceP0P13P2P6P7P9( - String absolutePath, - Class scopeRootType, - Class inputType, - Class outputType, - Class indexType, - Class rawType - ) { - super( absolutePath, scopeRootType, org.hibernate.search.engine.search.common.ValueModel.MAPPING, inputType ); - this.mapping = new TypedFieldReferenceP0P13P2P6P7P9<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.INDEX, indexType ); - this.raw = new TypedFieldReferenceP0P13P2P6P7P9<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.RAW, rawType ); - this.string = new TypedFieldReferenceP0P13P2P6P7P9<>( absolutePath, scopeRootType, - org.hibernate.search.engine.search.common.ValueModel.STRING, String.class ); - } - - public TypedFieldReferenceP0P13P2P6P7P9 mapping() { - return mapping; - } - - public TypedFieldReferenceP0P13P2P6P7P9 raw() { - return raw; - } - - public TypedFieldReferenceP0P13P2P6P7P9 string() { - return string; - } - - } - - public static class TypedFieldReferenceP0P13P2P6P7P9 - implements org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference, - org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference { - - private final String absolutePath; - private final Class scopeRootType; - private final org.hibernate.search.engine.search.common.ValueModel valueModel; - private final Class predicateType; - - public TypedFieldReferenceP0P13P2P6P7P9( - String absolutePath, - Class scopeRootType, - org.hibernate.search.engine.search.common.ValueModel valueModel, - Class predicateType) { - this.absolutePath = absolutePath; - this.scopeRootType = scopeRootType; - this.valueModel = valueModel; - this.predicateType = predicateType; - } - - public String absolutePath() { - return this.absolutePath; - } - - public Class scopeRootType() { - return this.scopeRootType; - } - - public org.hibernate.search.engine.search.common.ValueModel valueModel() { - return this.valueModel; - } - - public Class predicateType() { - return this.predicateType; - } - } - - - public static class Book__authors__ - implements org.hibernate.search.engine.search.reference.object.NestedFieldReference { - - public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 firstName; - public final ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9 lastName; - - private Book__authors__() { - // simple value field references: - this.firstName = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "authors.firstName", Book__.class, String.class, - String.class, String.class, String.class ); - this.lastName = new ValueFieldReferenceP0P13P14P2P4P5P6P7P8P9<>( "authors.lastName", Book__.class, String.class, - String.class, String.class, String.class ); - // various object field references: - - } - - @Override - public String absolutePath() { - return "authors"; - } - - @Override - public Class scopeRootType() { - return Book__.class; - } - - } - -} diff --git a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java index 6bc84410c8a..f22c4e1f2ba 100644 --- a/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java +++ b/documentation/src/test/java/org/hibernate/search/documentation/search/metamodel/MetamodelIT.java @@ -17,7 +17,6 @@ import org.hibernate.search.documentation.testsupport.BackendConfigurations; import org.hibernate.search.documentation.testsupport.DocumentationSetupHelper; import org.hibernate.search.mapper.orm.Search; -import org.hibernate.search.mapper.orm.scope.SearchScope; import org.hibernate.search.mapper.orm.session.SearchSession; import org.junit.jupiter.api.BeforeEach; @@ -56,7 +55,7 @@ void entryPoint() { // end::entryPoint[] Search.session( entityManager ); // tag::entryPoint[] - SearchScope scope = Book__.INDEX.scope( searchSession ); // <2> + var scope = Book__.INDEX.scope( searchSession ); // <2> List hits = searchSession.search( scope ) .where( f -> f.match() @@ -73,7 +72,7 @@ void entryPoint() { @Test void compileCheck() { withinSearchSession( searchSession -> { - SearchScope scope = Book__.INDEX.scope( searchSession ); + var scope = Book__.INDEX.scope( searchSession ); // tag::compileCheck-pass[] List titles = searchSession.search( scope ) .select( f -> f.field( Book__.INDEX.title ) ) // <1> @@ -88,7 +87,7 @@ void compileCheck() { @Test void valueModel() { withinSearchSession( searchSession -> { - SearchScope scope = Book__.INDEX.scope( searchSession ); + var scope = Book__.INDEX.scope( searchSession ); // tag::valueModel[] List hits = searchSession.search( scope ) .where( f -> f.match() diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java index f3d921826d7..cac31d11066 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java @@ -48,13 +48,13 @@ public interface AvgAggregationFieldSteppath to the index field to aggregate. + * @param fieldReference The field reference representing a definition of the index field to aggregate. * @param The type of field values or {@link Double} if a double result is required. * @return The next step. */ @Incubating - default AvgAggregationOptionsStep field(AvgAggregationFieldReference reference) { - return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() ); + default AvgAggregationOptionsStep field(AvgAggregationFieldReference fieldReference) { + return field( fieldReference.absolutePath(), fieldReference.aggregationType(), fieldReference.valueModel() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java index a8a80ec61f1..dfaef44d371 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java @@ -30,11 +30,11 @@ public interface CountAggregationFieldSteppath to the index field to aggregate. + * @param fieldReference The field reference representing a definition of the index field to aggregate. * @return The next step. */ @Incubating - default CountAggregationOptionsStep field(CountAggregationFieldReference reference) { - return field( reference.absolutePath() ); + default CountAggregationOptionsStep field(CountAggregationFieldReference fieldReference) { + return field( fieldReference.absolutePath() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java index f17292ecb4b..cb29d9fee3a 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java @@ -30,11 +30,11 @@ public interface CountDistinctAggregationFieldSteppath to the index field to aggregate. + * @param fieldReference The field reference representing a definition of the index field to aggregate. * @return The next step. */ @Incubating - default CountDistinctAggregationOptionsStep field(CountAggregationFieldReference reference) { - return field( reference.absolutePath() ); + default CountDistinctAggregationOptionsStep field(CountAggregationFieldReference fieldReference) { + return field( fieldReference.absolutePath() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java index f3574ae07b2..705630ed9cf 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java @@ -47,12 +47,12 @@ public interface MaxAggregationFieldSteppath to the index field to aggregate. + * @param fieldReference The field reference representing a definition of the index field to aggregate. * @param The type of field values. * @return The next step. */ @Incubating - default MaxAggregationOptionsStep field(MaxAggregationFieldReference reference) { - return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() ); + default MaxAggregationOptionsStep field(MaxAggregationFieldReference fieldReference) { + return field( fieldReference.absolutePath(), fieldReference.aggregationType(), fieldReference.valueModel() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java index 3d9520b0e5e..60063f5432d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java @@ -47,12 +47,12 @@ public interface MinAggregationFieldSteppath to the index field to aggregate. + * @param fieldReference The field reference representing a definition of the index field to aggregate. * @param The type of field values. * @return The next step. */ @Incubating - default MinAggregationOptionsStep field(MinAggregationFieldReference reference) { - return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() ); + default MinAggregationOptionsStep field(MinAggregationFieldReference fieldReference) { + return field( fieldReference.absolutePath(), fieldReference.aggregationType(), fieldReference.valueModel() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java index ddc68a404e5..9968ef35d0e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/RangeAggregationFieldStep.java @@ -63,7 +63,7 @@ public interface RangeAggregationFieldSteppath to the index field to aggregate. + * @param fieldReference The field reference representing a definition of the index field to aggregate. * @param The type of field values. * @return The next step. */ diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java index be5c0cbcc8f..3e7f6f466c0 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SearchAggregationFactory.java @@ -27,6 +27,15 @@ * Such a factory can also transform relative paths into absolute paths using {@link #toAbsolutePath(String)}; * this can be useful for native aggregations in particular. * + *

Field references

+ * + * A {@link org.hibernate.search.engine.search.reference field reference} is always represented by the absolute field path and, + * if applicable, i.e. when a field reference is typed, a combination of the {@link org.hibernate.search.engine.search.common.ValueModel} and the type. + *

+ * Field references are usually accessed from the generated Hibernate Search's static metamodel classes that describe the index structure. + * Such reference provides the information on which search capabilities the particular index field possesses, and allows switching between different + * {@link org.hibernate.search.engine.search.common.ValueModel value model representations}. + * * @param Scope root type. * * @author Emmanuel Bernard emmanuel@hibernate.org diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java index 24d0ec4e9e6..140eb514abd 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java @@ -47,12 +47,12 @@ public interface SumAggregationFieldSteppath to the index field to aggregate. + * @param fieldReference The field reference representing a definition of the index field to aggregate. * @param The type of field values. * @return The next step. */ @Incubating - default SumAggregationOptionsStep field(SumAggregationFieldReference reference) { - return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() ); + default SumAggregationOptionsStep field(SumAggregationFieldReference fieldReference) { + return field( fieldReference.absolutePath(), fieldReference.aggregationType(), fieldReference.valueModel() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java index 5aa6ef6bdb0..b3039772faf 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/TermsAggregationFieldStep.java @@ -65,7 +65,7 @@ public interface TermsAggregationFieldSteppath to the index field to aggregate. + * @param fieldReference The field reference representing a definition of the index field to aggregate. * @param The type of field values. * @return The next step. */ diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldMoreStep.java index b00f8c1bbfc..ef1fe22de53 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldMoreStep.java @@ -67,7 +67,7 @@ default S field(String fieldPath) { *

* See {@link CommonQueryStringPredicateFieldStep#field(String)} for more information on targeted fields. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. * @@ -75,8 +75,8 @@ default S field(String fieldPath) { */ @Incubating @SuppressWarnings("unchecked") - default S field(FR field) { - return fields( field ); + default S field(FR fieldReference) { + return fields( fieldReference ); } /** @@ -87,7 +87,7 @@ default S field(FR field) { *

* See {@link CommonQueryStringPredicateFieldStep#fields(String...)} for more information on targeted fields. * - * @param fields The field reference representing paths to the index fields + * @param fieldReferences The field reference representing definition of the index fields * to apply the predicate on. * @return The next step. * @@ -95,10 +95,10 @@ default S field(FR field) { */ @Incubating @SuppressWarnings("unchecked") - default S fields(FR... fields) { - String[] paths = new String[fields.length]; - for ( int i = 0; i < fields.length; i++ ) { - paths[i] = fields[i].absolutePath(); + default S fields(FR... fieldReferences) { + String[] paths = new String[fieldReferences.length]; + for ( int i = 0; i < fieldReferences.length; i++ ) { + paths[i] = fieldReferences[i].absolutePath(); } return fields( paths ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldStep.java index d9c5e5e4892..16863919945 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/CommonQueryStringPredicateFieldStep.java @@ -69,14 +69,14 @@ default N field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ @Incubating @SuppressWarnings("unchecked") - default N field(FR field) { - return fields( field ); + default N field(FR fieldReference) { + return fields( fieldReference ); } /** @@ -90,7 +90,7 @@ default N field(FR field) { * and other field-specific settings on the returned step will only need to be done once * and will apply to all the fields passed to this method. * - * @param fields The field reference representing paths to the index fields + * @param fieldReferences The field references representing definitions of the index fields * to apply the predicate on. * @return The next step. * @@ -98,10 +98,10 @@ default N field(FR field) { */ @Incubating @SuppressWarnings("unchecked") - default N fields(FR... fields) { - String[] paths = new String[fields.length]; - for ( int i = 0; i < fields.length; i++ ) { - paths[i] = fields[i].absolutePath(); + default N fields(FR... fieldReferences) { + String[] paths = new String[fieldReferences.length]; + for ( int i = 0; i < fieldReferences.length; i++ ) { + paths[i] = fieldReferences[i].absolutePath(); } return fields( paths ); } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java index f04305db1bc..61e89221bf4 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java @@ -26,13 +26,13 @@ public interface ExistsPredicateFieldSteppath to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ @Incubating - default N field(ExistsPredicateFieldReference field) { - return field( field.absolutePath() ); + default N field(ExistsPredicateFieldReference fieldReference) { + return field( fieldReference.absolutePath() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java index 270cbda2f1f..bf8fe45fe49 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java @@ -54,7 +54,7 @@ default N field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param fieldReference The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java index 86ee7cb427d..cda439347be 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java @@ -32,12 +32,12 @@ public interface NestedPredicateFieldStep * The selected field must have a {@link ObjectStructure#NESTED nested structure} in the targeted indexes. * - * @param field The field reference representing a path to the object field + * @param fieldReference The field reference representing a definition of the object field * to apply the predicate on. * @return The next step. */ - default N objectField(NestedPredicateFieldReference field) { - return objectField( field.absolutePath() ); + default N objectField(NestedPredicateFieldReference fieldReference) { + return objectField( fieldReference.absolutePath() ); } } diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java index 25a81dfba9e..426a1f4caa0 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java @@ -65,7 +65,7 @@ default S field(String fieldPath) { *

* See {@link PhrasePredicateFieldStep#field(PhrasePredicateFieldReference)} for more information on targeted fields. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. * @@ -73,8 +73,8 @@ default S field(String fieldPath) { */ @Incubating @SuppressWarnings("unchecked") - default S field(PhrasePredicateFieldReference field) { - return fields( field ); + default S field(PhrasePredicateFieldReference fieldReference) { + return fields( fieldReference ); } /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java index d105409c21e..690e0815b2e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java @@ -64,7 +64,7 @@ default N field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. * @@ -72,8 +72,8 @@ default N field(String fieldPath) { */ @Incubating @SuppressWarnings("unchecked") - default N field(PhrasePredicateFieldReference field) { - return fields( field ); + default N field(PhrasePredicateFieldReference fieldReference) { + return fields( fieldReference ); } /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldMoreStep.java index 61b768afea0..edfb2517c79 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldMoreStep.java @@ -67,13 +67,13 @@ default S field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ @Incubating - default S field(PrefixPredicateFieldReference field) { - return fields( field.absolutePath() ); + default S field(PrefixPredicateFieldReference fieldReference) { + return fields( fieldReference.absolutePath() ); } /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldStep.java index 51ebb51618e..b9a8700f3df 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PrefixPredicateFieldStep.java @@ -63,13 +63,13 @@ default N field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ @Incubating - default N field(PrefixPredicateFieldReference field) { - return fields( field.absolutePath() ); + default N field(PrefixPredicateFieldReference fieldReference) { + return fields( fieldReference.absolutePath() ); } /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java index f9565096bdc..30258cd07b8 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java @@ -59,14 +59,14 @@ default N field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ @SuppressWarnings("unchecked") default RangePredicateFieldMoreGenericStep, T> field( - RangePredicateFieldReference field) { - return fields( field ); + RangePredicateFieldReference fieldReference) { + return fields( fieldReference ); } /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldMoreStep.java index 1b97600d04e..81bfe61a76d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldMoreStep.java @@ -67,13 +67,13 @@ default S field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ @Incubating - default S field(RegexpPredicateFieldReference field) { - return fields( field.absolutePath() ); + default S field(RegexpPredicateFieldReference fieldReference) { + return fields( fieldReference.absolutePath() ); } /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldStep.java index 2b39db1f0de..e7abff8248e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RegexpPredicateFieldStep.java @@ -63,13 +63,13 @@ default N field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ @Incubating - default N field(RegexpPredicateFieldReference field) { - return fields( field.absolutePath() ); + default N field(RegexpPredicateFieldReference fieldReference) { + return fields( fieldReference.absolutePath() ); } /** 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 8285b216a03..2e29a4c24c5 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 @@ -34,6 +34,15 @@ * Such a factory can also transform relative paths into absolute paths using {@link #toAbsolutePath(String)}; * this can be useful for native predicates in particular. * + *

Field references

+ * + * A {@link org.hibernate.search.engine.search.reference field reference} is always represented by the absolute field path and, + * if applicable, i.e. when a field reference is typed, a combination of the {@link org.hibernate.search.engine.search.common.ValueModel} and the type. + *

+ * Field references are usually accessed from the generated Hibernate Search's static metamodel classes that describe the index structure. + * Such reference provides the information on which search capabilities the particular index field possesses, and allows switching between different + * {@link org.hibernate.search.engine.search.common.ValueModel value model representations}. + * * @param Scope root type. */ public interface SearchPredicateFactory { @@ -249,13 +258,13 @@ SimpleBooleanPredicateOptionsStep or(PredicateFinalStep firstSearchPredicate, * The resulting nested predicate must match all inner clauses, * similarly to an {@link #and() "and" predicate}. * - * @param field The field reference representing a path to the object field + * @param fieldReference The field reference representing a definition of the object field * to apply the predicate on. * @return The initial step of a DSL where the "nested" predicate can be defined. * @see NestedPredicateFieldStep */ - default NestedPredicateClausesStep nested(NestedPredicateFieldReference field) { - return nested( field.absolutePath() ); + default NestedPredicateClausesStep nested(NestedPredicateFieldReference fieldReference) { + return nested( fieldReference.absolutePath() ); } /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldMoreStep.java index f595f35cdb3..82ceed79a8e 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldMoreStep.java @@ -58,7 +58,7 @@ default S field(String fieldPath) { *

* See {@link SpatialWithinPredicateFieldStep#field(String)} for more information on targeted fields. * - * @param fieldReference The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. * diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldStep.java index 4f81e8cc23e..f71d9d3b266 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SpatialWithinPredicateFieldStep.java @@ -51,7 +51,7 @@ default N field(String fieldPath) { * Multiple fields may be targeted by the same predicate: * the predicate will match if any targeted field matches. * - * @param fieldReference The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldMoreStep.java index a02f2950b10..9f619b85bba 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldMoreStep.java @@ -65,13 +65,13 @@ default S field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ @Incubating - default S field(TermsPredicateFieldReference field) { - return fields( field.absolutePath() ); + default S field(TermsPredicateFieldReference fieldReference) { + return fields( fieldReference.absolutePath() ); } /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldStep.java index 028b8779f7d..a47f3e59a31 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/TermsPredicateFieldStep.java @@ -59,13 +59,13 @@ default N field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ @Incubating - default N field(TermsPredicateFieldReference field) { - return fields( field.absolutePath() ); + default N field(TermsPredicateFieldReference fieldReference) { + return fields( fieldReference.absolutePath() ); } /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldMoreStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldMoreStep.java index 59120eaa0c1..f9632ff8f56 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldMoreStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldMoreStep.java @@ -67,12 +67,12 @@ default S field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ - default S field(WildcardPredicateFieldReference field) { - return fields( field.absolutePath() ); + default S field(WildcardPredicateFieldReference fieldReference) { + return fields( fieldReference.absolutePath() ); } /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldStep.java b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldStep.java index b1d2605793f..acaa359181d 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldStep.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/WildcardPredicateFieldStep.java @@ -63,12 +63,12 @@ default N field(String fieldPath) { * When targeting multiple fields, those fields must have compatible types. * Please refer to the reference documentation for more information. * - * @param field The field reference representing a path to the index field + * @param fieldReference The field reference representing a definition of the index field * to apply the predicate on. * @return The next step. */ - default N field(WildcardPredicateFieldReference field) { - return fields( field.absolutePath() ); + default N field(WildcardPredicateFieldReference fieldReference) { + return fields( fieldReference.absolutePath() ); } /** diff --git a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java index b9da4718190..024d8eca33c 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/SearchProjectionFactory.java @@ -40,6 +40,15 @@ * Such a factory can also transform relative paths into absolute paths using {@link #toAbsolutePath(String)}; * this can be useful for native projections in particular. * + *

Field references

+ * + * A {@link org.hibernate.search.engine.search.reference field reference} is always represented by the absolute field path and, + * if applicable, i.e. when a field reference is typed, a combination of the {@link org.hibernate.search.engine.search.common.ValueModel} and the type. + *

+ * Field references are usually accessed from the generated Hibernate Search's static metamodel classes that describe the index structure. + * Such reference provides the information on which search capabilities the particular index field possesses, and allows switching between different + * {@link org.hibernate.search.engine.search.common.ValueModel value model representations}. + * * @param Scope root type. * @param The type of entity references, i.e. the type of objects returned for * {@link #entityReference() entity reference projections}. diff --git a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java index a9bc2d9cc81..c6156a03677 100644 --- a/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java +++ b/engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java @@ -32,6 +32,16 @@ * Such a factory can also transform relative paths into absolute paths using {@link #toAbsolutePath(String)}; * this can be useful for native sorts in particular. * + * + *

Field references

+ * + * A {@link org.hibernate.search.engine.search.reference field reference} is always represented by the absolute field path and, + * if applicable, i.e. when a field reference is typed, a combination of the {@link org.hibernate.search.engine.search.common.ValueModel} and the type. + *

+ * Field references are usually accessed from the generated Hibernate Search's static metamodel classes that describe the index structure. + * Such reference provides the information on which search capabilities the particular index field possesses, and allows switching between different + * {@link org.hibernate.search.engine.search.common.ValueModel value model representations}. + * * @param Scope root type. * @author Emmanuel Bernard emmanuel@hibernate.org */ diff --git a/integrationtest/metamodel/orm-elasticsearch/pom.xml b/integrationtest/metamodel/orm-elasticsearch/pom.xml index b6689917950..9f14e3f1325 100644 --- a/integrationtest/metamodel/orm-elasticsearch/pom.xml +++ b/integrationtest/metamodel/orm-elasticsearch/pom.xml @@ -47,7 +47,7 @@ org.hibernate.search - hibernate-search-metamodel-processor + hibernate-search-processor provided @@ -63,12 +63,12 @@ full - org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor + org.hibernate.search.processor.HibernateSearchProcessor org.hibernate.search - hibernate-search-metamodel-processor + hibernate-search-processor ${project.version} diff --git a/integrationtest/metamodel/orm-lucene/pom.xml b/integrationtest/metamodel/orm-lucene/pom.xml index 1a554f23bb0..efded006070 100644 --- a/integrationtest/metamodel/orm-lucene/pom.xml +++ b/integrationtest/metamodel/orm-lucene/pom.xml @@ -47,7 +47,7 @@ org.hibernate.search - hibernate-search-metamodel-processor + hibernate-search-processor provided @@ -63,12 +63,12 @@ full - org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor + org.hibernate.search.processor.HibernateSearchProcessor org.hibernate.search - hibernate-search-metamodel-processor + hibernate-search-processor ${project.version} diff --git a/integrationtest/metamodel/standalone-elasticsearch/pom.xml b/integrationtest/metamodel/standalone-elasticsearch/pom.xml index 55b9aa970f3..23d86456f0c 100644 --- a/integrationtest/metamodel/standalone-elasticsearch/pom.xml +++ b/integrationtest/metamodel/standalone-elasticsearch/pom.xml @@ -38,7 +38,7 @@ org.hibernate.search - hibernate-search-metamodel-processor + hibernate-search-processor provided @@ -54,12 +54,12 @@ full - org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor + org.hibernate.search.processor.HibernateSearchProcessor org.hibernate.search - hibernate-search-metamodel-processor + hibernate-search-processor ${project.version} diff --git a/integrationtest/metamodel/standalone-lucene/pom.xml b/integrationtest/metamodel/standalone-lucene/pom.xml index b6d1fb51dc2..2fbbd26cdbf 100644 --- a/integrationtest/metamodel/standalone-lucene/pom.xml +++ b/integrationtest/metamodel/standalone-lucene/pom.xml @@ -38,7 +38,7 @@ org.hibernate.search - hibernate-search-metamodel-processor + hibernate-search-processor provided @@ -54,12 +54,12 @@ full - org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor + org.hibernate.search.processor.HibernateSearchProcessor org.hibernate.search - hibernate-search-metamodel-processor + hibernate-search-processor ${project.version} diff --git a/lucene-next/documentation/pom.xml b/lucene-next/documentation/pom.xml index 8a500685ee6..34d1c0dd31a 100644 --- a/lucene-next/documentation/pom.xml +++ b/lucene-next/documentation/pom.xml @@ -109,7 +109,42 @@ even though we don't explicitly use it. This is probably a compiler bug, so here we need to work around it. --> false + + org/hibernate/search/documentation/search/metamodel/** + + + + generate-metamodel + test-compile + + testCompile + + + full + + org/hibernate/search/documentation/search/metamodel/** + + + false + + org.hibernate.search.processor.HibernateSearchProcessor + + + + org.hibernate.search + hibernate-search-processor + ${project.version} + + + org.hibernate.search + hibernate-search-backend-elasticsearch + ${project.version} + + + + + org.apache.maven.plugins diff --git a/metamodel/metamodel-processor/pom.xml b/metamodel/metamodel-processor/pom.xml index c13c4478534..9e8d9f6b0d1 100644 --- a/metamodel/metamodel-processor/pom.xml +++ b/metamodel/metamodel-processor/pom.xml @@ -9,10 +9,10 @@ 8.0.0-SNAPSHOT ../../build/parents/public - hibernate-search-metamodel-processor + hibernate-search-processor - Hibernate Search Metamodel annotation processor - Hibernate Search Metamodel annotation processor + Hibernate Search annotation processor + Hibernate Search annotation processor, that generates the static metamodel. diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/package-info.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/package-info.java deleted file mode 100644 index 5032ffd4ad1..00000000000 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package org.hibernate.search.metamodel.processor; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/HibernateSearchProcessor.java similarity index 71% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/HibernateSearchProcessor.java index 6ea251d42a2..35b0cc37122 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/HibernateSearchProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor; +package org.hibernate.search.processor; import java.util.List; import java.util.Set; @@ -15,22 +15,22 @@ import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; -import org.hibernate.search.metamodel.processor.impl.ExceptionUtils; -import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; -import org.hibernate.search.metamodel.processor.impl.IndexedEntityMetamodelAnnotationProcessor; -import org.hibernate.search.metamodel.processor.impl.MetamodelAnnotationProcessor; +import org.hibernate.search.processor.impl.ExceptionUtils; +import org.hibernate.search.processor.impl.HibernateSearchMetamodelProcessorContext; +import org.hibernate.search.processor.impl.IndexedEntityMetamodelAnnotationProcessor; +import org.hibernate.search.processor.impl.MetamodelAnnotationProcessor; // We inspect all annotations and then decide if we can process them, // this way we can also work with user-defined ones (at some point): @SupportedAnnotationTypes("*") // Currently this is more of a placeholder for future config options: @SupportedOptions({ - HibernateSearchMetamodelProcessorSettings.GENERATED_ANNOTATION_ADD, - HibernateSearchMetamodelProcessorSettings.GENERATED_ANNOTATION_TIMESTAMP, - HibernateSearchMetamodelProcessorSettings.BACKEND_VERSION }) + HibernateSearchProcessorSettings.GENERATED_ANNOTATION_ADD, + HibernateSearchProcessorSettings.GENERATED_ANNOTATION_TIMESTAMP, + HibernateSearchProcessorSettings.BACKEND_VERSION }) @org.hibernate.search.util.common.annotation.impl.SuppressJQAssistant( reason = "JQAssistant has issue with detecting that getSupportedSourceVersion is an overridden method.") -public class HibernateSearchMetamodelProcessor extends AbstractProcessor { +public class HibernateSearchProcessor extends AbstractProcessor { private HibernateSearchMetamodelProcessorContext context; private List processors; @@ -41,7 +41,7 @@ public synchronized void init(ProcessingEnvironment processingEnv) { context = new HibernateSearchMetamodelProcessorContext( processingEnv.getElementUtils(), processingEnv.getTypeUtils(), processingEnv.getMessager(), processingEnv.getFiler(), - new HibernateSearchMetamodelProcessorSettings.Configuration( processingEnv.getOptions() ) ); + new HibernateSearchProcessorSettings.Configuration( processingEnv.getOptions() ) ); processors = List.of( new IndexedEntityMetamodelAnnotationProcessor( context ) ); } diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/HibernateSearchProcessorSettings.java similarity index 87% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/HibernateSearchProcessorSettings.java index d3f3472b040..2cb94105d47 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettings.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/HibernateSearchProcessorSettings.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor; +package org.hibernate.search.processor; import java.io.Serializable; @@ -16,12 +16,12 @@ import javax.lang.model.util.Elements; -public final class HibernateSearchMetamodelProcessorSettings { +public final class HibernateSearchProcessorSettings { - private HibernateSearchMetamodelProcessorSettings() { + private HibernateSearchProcessorSettings() { } - private static final String PREFIX = "org.hibernate.search.metamodel.processor."; + private static final String PREFIX = "org.hibernate.search.processor."; public static final String GENERATED_ANNOTATION_ADD = PREFIX + Radicals.GENERATED_ANNOTATION_ADD; public static final String GENERATED_ANNOTATION_TIMESTAMP = PREFIX + Radicals.GENERATED_ANNOTATION_TIMESTAMP; @@ -67,20 +67,20 @@ public String formattedGeneratedAnnotation() { if ( generatedAnnotationTimestamp ) { return String.format( Locale.ROOT, "@javax.annotation.processing.Generated(value = \"%s\", date = \"%s\")", - HibernateSearchMetamodelProcessor.class.getName(), + HibernateSearchProcessor.class.getName(), LocalDateTime.now( Clock.systemUTC() ).atOffset( ZoneOffset.UTC ) .format( DateTimeFormatter.ISO_OFFSET_DATE_TIME ) ); } else { return String.format( Locale.ROOT, "@javax.annotation.processing.Generated(value = \"%s\")", - HibernateSearchMetamodelProcessor.class.getName() + HibernateSearchProcessor.class.getName() ); } } public String elasticsearchVersion() { - return version == null ? "9.0.0" : version; + return version == null ? "9.0.1" : version; } public String luceneVersion() { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java similarity index 98% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java index 5c2984f0e47..891cedf1a69 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorAnnotationProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Arrays; import java.util.List; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java similarity index 96% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java index c7f3d57e270..634e5125404 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorFieldAnnotationProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java similarity index 96% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java index 62bb5df5c6b..269e5572d27 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorNonFullTextFieldAnnotationProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import javax.lang.model.element.AnnotationMirror; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java similarity index 95% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java index e957950053f..b7e6f63746c 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/AbstractProcessorStandardFieldAnnotationProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import javax.lang.model.element.AnnotationMirror; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorAnnotationProcessorContext.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorAnnotationProcessorContext.java similarity index 92% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorAnnotationProcessorContext.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorAnnotationProcessorContext.java index c5ca3f5f3e3..ae805837290 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorAnnotationProcessorContext.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorAnnotationProcessorContext.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.HashSet; import java.util.Set; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java similarity index 94% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java index 2cc7008b439..68a5f432099 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorDocumentIdProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Map; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java similarity index 98% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java index 8a276d5a3e8..8af50f429cf 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorFulltextFieldProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.List; import java.util.Objects; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java similarity index 90% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java index 85be08378f6..d01bb8fce4d 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorGenericFieldProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Optional; @@ -15,7 +15,7 @@ import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingNonFullTextFieldOptionsStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; +import org.hibernate.search.processor.model.impl.BuiltInBridgeResolverTypes; class ProcessorGenericFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { @Override diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java similarity index 93% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java index 1f456f5b38c..67e32ec3dee 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorGeoPointBindingProcessor.java @@ -2,9 +2,9 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; -import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.collectExtraTypes; +import static org.hibernate.search.processor.impl.ProcessorElementUtils.collectExtraTypes; import java.util.Optional; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java similarity index 95% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java index 6540b284a1e..234cce5e8d3 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorIndexedEmbeddedProcessor.java @@ -2,9 +2,9 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; -import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.collectExtraTypes; +import static org.hibernate.search.processor.impl.ProcessorElementUtils.collectExtraTypes; import java.util.Optional; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java similarity index 97% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java index 0c4d15b9089..1f548e4fba7 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorKeywordFieldProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Optional; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java similarity index 94% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java index 6c3813c442d..25c2f38adaa 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorLatitudeProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Optional; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java similarity index 94% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java index 88927a97c74..1394e92d1f1 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorLongitudeProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Optional; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java similarity index 90% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java index 195de872efe..b2480afc889 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorNonStandardFieldProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Optional; @@ -15,7 +15,7 @@ import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingNonFullTextFieldOptionsStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; +import org.hibernate.search.processor.model.impl.BuiltInBridgeResolverTypes; class ProcessorNonStandardFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { @Override diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorPropertyMappingAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorPropertyMappingAnnotationProcessor.java similarity index 98% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorPropertyMappingAnnotationProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorPropertyMappingAnnotationProcessor.java index c83eff8feed..213f8edab36 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorPropertyMappingAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorPropertyMappingAnnotationProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Optional; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java similarity index 93% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java index cfded3385f7..853bf561bd2 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorScaledNumberFieldProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Optional; @@ -17,7 +17,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingNonFullTextFieldOptionsStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingScaledNumberFieldOptionsStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; -import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; +import org.hibernate.search.processor.model.impl.BuiltInBridgeResolverTypes; class ProcessorScaledNumberFieldProcessor extends AbstractProcessorNonFullTextFieldAnnotationProcessor { @Override diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypeMappingAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorTypeMappingAnnotationProcessor.java similarity index 92% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypeMappingAnnotationProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorTypeMappingAnnotationProcessor.java index 6d5038d3111..49634c31777 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypeMappingAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorTypeMappingAnnotationProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Optional; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java similarity index 97% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java index 4fa648abb81..3d5c2da6450 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorTypePropertyBindingProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Optional; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java similarity index 97% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java index 0014214aaa6..77dbf13ea06 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/annotation/processing/impl/ProcessorVectorFieldProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.annotation.processing.impl; +package org.hibernate.search.processor.annotation.processing.impl; import java.util.Optional; @@ -23,7 +23,7 @@ import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingFieldOptionsStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingStep; import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.PropertyMappingVectorFieldOptionsStep; -import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; +import org.hibernate.search.processor.model.impl.BuiltInBridgeResolverTypes; class ProcessorVectorFieldProcessor extends AbstractProcessorFieldAnnotationProcessor { @Override diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ExceptionUtils.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/ExceptionUtils.java similarity index 84% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ExceptionUtils.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/ExceptionUtils.java index 0a77fc5d238..a31714954cf 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ExceptionUtils.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/ExceptionUtils.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.impl; +package org.hibernate.search.processor.impl; import java.io.IOException; import java.io.PrintWriter; @@ -24,7 +24,8 @@ public static void logError(Messager messager, Exception exception, String messa public static void logError(Messager messager, Exception exception, String message, Element element) { try ( var sw = new StringWriter(); var pw = new PrintWriter( sw ) ) { exception.printStackTrace( pw ); - messager.printMessage( Diagnostic.Kind.ERROR, message + sw, element ); + pw.flush(); + messager.printMessage( Diagnostic.Kind.ERROR, message + sw.toString(), element ); } catch (IOException ex) { throw new RuntimeException( ex ); diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/HibernateSearchMetamodelProcessorContext.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/HibernateSearchMetamodelProcessorContext.java similarity index 76% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/HibernateSearchMetamodelProcessorContext.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/HibernateSearchMetamodelProcessorContext.java index 9a20dbc7001..a5b3d63f6a2 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/HibernateSearchMetamodelProcessorContext.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/HibernateSearchMetamodelProcessorContext.java @@ -2,13 +2,13 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.impl; +package org.hibernate.search.processor.impl; import javax.annotation.processing.Messager; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; -import org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessorSettings.Configuration; +import org.hibernate.search.processor.HibernateSearchProcessorSettings.Configuration; public record HibernateSearchMetamodelProcessorContext( Elements elementUtils, Types typeUtils, Messager messager, javax.annotation.processing.Filer filer, Configuration configuration) { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java similarity index 90% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java index e1d2f0072d3..46685764451 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/IndexedEntityMetamodelAnnotationProcessor.java @@ -2,11 +2,11 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.impl; +package org.hibernate.search.processor.impl; -import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.flattenedAnnotations; -import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.propertyElements; -import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.propertyName; +import static org.hibernate.search.processor.impl.ProcessorElementUtils.flattenedAnnotations; +import static org.hibernate.search.processor.impl.ProcessorElementUtils.propertyElements; +import static org.hibernate.search.processor.impl.ProcessorElementUtils.propertyName; import java.io.IOException; import java.io.Writer; @@ -38,14 +38,14 @@ import org.hibernate.search.mapper.pojo.standalone.entity.SearchIndexedEntity; import org.hibernate.search.mapper.pojo.standalone.mapping.CloseableSearchMapping; import org.hibernate.search.mapper.pojo.standalone.mapping.StandalonePojoMappingConfigurer; -import org.hibernate.search.metamodel.processor.annotation.processing.impl.ProcessorAnnotationProcessorContext; -import org.hibernate.search.metamodel.processor.annotation.processing.impl.ProcessorPropertyMappingAnnotationProcessor; -import org.hibernate.search.metamodel.processor.annotation.processing.impl.ProcessorTypeMappingAnnotationProcessor; -import org.hibernate.search.metamodel.processor.mapping.impl.ProcessorIntrospectorContext; -import org.hibernate.search.metamodel.processor.mapping.impl.ProcessorPojoModelsBootstrapIntrospector; -import org.hibernate.search.metamodel.processor.model.impl.HibernateSearchProcessorEnum; -import org.hibernate.search.metamodel.processor.writer.impl.MetamodelClassWriter; -import org.hibernate.search.metamodel.processor.writer.impl.MetamodelNamesFormatter; +import org.hibernate.search.processor.annotation.processing.impl.ProcessorAnnotationProcessorContext; +import org.hibernate.search.processor.annotation.processing.impl.ProcessorPropertyMappingAnnotationProcessor; +import org.hibernate.search.processor.annotation.processing.impl.ProcessorTypeMappingAnnotationProcessor; +import org.hibernate.search.processor.mapping.impl.ProcessorIntrospectorContext; +import org.hibernate.search.processor.mapping.impl.ProcessorPojoModelsBootstrapIntrospector; +import org.hibernate.search.processor.model.impl.HibernateSearchProcessorEnum; +import org.hibernate.search.processor.writer.impl.MetamodelClassWriter; +import org.hibernate.search.processor.writer.impl.MetamodelNamesFormatter; import org.hibernate.search.util.common.annotation.impl.SuppressJQAssistant; public class IndexedEntityMetamodelAnnotationProcessor implements MetamodelAnnotationProcessor { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/MetamodelAnnotationProcessor.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/MetamodelAnnotationProcessor.java similarity index 81% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/MetamodelAnnotationProcessor.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/MetamodelAnnotationProcessor.java index 7c7a7021864..1182b2666e2 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/MetamodelAnnotationProcessor.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/MetamodelAnnotationProcessor.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.impl; +package org.hibernate.search.processor.impl; import javax.annotation.processing.RoundEnvironment; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ProcessorElementUtils.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/ProcessorElementUtils.java similarity index 94% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ProcessorElementUtils.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/ProcessorElementUtils.java index d1e987e94a7..bdc6b95d703 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/impl/ProcessorElementUtils.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/impl/ProcessorElementUtils.java @@ -2,10 +2,10 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.impl; +package org.hibernate.search.processor.impl; import static org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector.noPrefix; -import static org.hibernate.search.metamodel.processor.impl.IndexedEntityMetamodelAnnotationProcessor.processTypeAndProperties; +import static org.hibernate.search.processor.impl.IndexedEntityMetamodelAnnotationProcessor.processTypeAndProperties; import java.util.List; import java.util.Map; @@ -26,7 +26,7 @@ import javax.lang.model.util.Elements; import javax.lang.model.util.Types; -import org.hibernate.search.metamodel.processor.annotation.processing.impl.ProcessorAnnotationProcessorContext; +import org.hibernate.search.processor.annotation.processing.impl.ProcessorAnnotationProcessorContext; public final class ProcessorElementUtils { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorIntrospectorContext.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/mapping/impl/ProcessorIntrospectorContext.java similarity index 85% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorIntrospectorContext.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/mapping/impl/ProcessorIntrospectorContext.java index b3e0118e4a0..f66bdc1c2a6 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorIntrospectorContext.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/mapping/impl/ProcessorIntrospectorContext.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.mapping.impl; +package org.hibernate.search.processor.mapping.impl; import java.util.HashMap; import java.util.Map; @@ -12,8 +12,8 @@ import javax.lang.model.util.Elements; import javax.lang.model.util.Types; -import org.hibernate.search.metamodel.processor.annotation.processing.impl.ProcessorAnnotationProcessorContext; -import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; +import org.hibernate.search.processor.annotation.processing.impl.ProcessorAnnotationProcessorContext; +import org.hibernate.search.processor.impl.HibernateSearchMetamodelProcessorContext; public final class ProcessorIntrospectorContext { private final HibernateSearchMetamodelProcessorContext processorContext; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java similarity index 89% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java index e88b2b69338..a7c4de6a04d 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/mapping/impl/ProcessorPojoModelsBootstrapIntrospector.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.mapping.impl; +package org.hibernate.search.processor.mapping.impl; import java.util.HashMap; @@ -16,10 +16,10 @@ import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector; import org.hibernate.search.mapper.pojo.model.spi.PojoRawTypeModel; -import org.hibernate.search.metamodel.processor.model.impl.BuiltInBridgeResolverTypes; -import org.hibernate.search.metamodel.processor.model.impl.HibernateSearchProcessorEnum; -import org.hibernate.search.metamodel.processor.model.impl.ProcessorPojoRawTypeModel; -import org.hibernate.search.metamodel.processor.model.impl.ProcessorTypeOrdering; +import org.hibernate.search.processor.model.impl.BuiltInBridgeResolverTypes; +import org.hibernate.search.processor.model.impl.HibernateSearchProcessorEnum; +import org.hibernate.search.processor.model.impl.ProcessorPojoRawTypeModel; +import org.hibernate.search.processor.model.impl.ProcessorTypeOrdering; import org.hibernate.search.util.common.reflect.spi.ValueHandleFactory; public class ProcessorPojoModelsBootstrapIntrospector implements PojoBootstrapIntrospector { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/BuiltInBridgeResolverTypes.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/BuiltInBridgeResolverTypes.java similarity index 98% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/BuiltInBridgeResolverTypes.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/BuiltInBridgeResolverTypes.java index c890ee1d784..4ff105ef362 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/BuiltInBridgeResolverTypes.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/BuiltInBridgeResolverTypes.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model.impl; +package org.hibernate.search.processor.model.impl; import java.util.Optional; import java.util.Set; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/HibernateSearchProcessorEnum.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/HibernateSearchProcessorEnum.java similarity index 97% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/HibernateSearchProcessorEnum.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/HibernateSearchProcessorEnum.java index 6b420996325..0e1337c69fc 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/HibernateSearchProcessorEnum.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/HibernateSearchProcessorEnum.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model.impl; +package org.hibernate.search.processor.model.impl; import java.lang.annotation.Annotation; import java.util.Collection; @@ -160,6 +160,7 @@ public String toIndexedValue(Object value, ValueBridgeToIndexedValueContext cont @Override public void close() { + // nothing to do here, but have to override as both interfaces have a default } @Override diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoPropertyModel.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/ProcessorPojoPropertyModel.java similarity index 90% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoPropertyModel.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/ProcessorPojoPropertyModel.java index 12baf8b0491..2eec0561ff3 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoPropertyModel.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/ProcessorPojoPropertyModel.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model.impl; +package org.hibernate.search.processor.model.impl; import java.lang.annotation.Annotation; import java.util.stream.Stream; @@ -14,8 +14,8 @@ import org.hibernate.search.mapper.pojo.model.spi.PojoPropertyModel; import org.hibernate.search.mapper.pojo.model.spi.PojoTypeModel; -import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; -import org.hibernate.search.metamodel.processor.mapping.impl.ProcessorPojoModelsBootstrapIntrospector; +import org.hibernate.search.processor.impl.HibernateSearchMetamodelProcessorContext; +import org.hibernate.search.processor.mapping.impl.ProcessorPojoModelsBootstrapIntrospector; import org.hibernate.search.util.common.reflect.spi.ValueReadHandle; public class ProcessorPojoPropertyModel implements PojoPropertyModel { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/ProcessorPojoRawTypeModel.java similarity index 94% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/ProcessorPojoRawTypeModel.java index 02cccb085ef..89ca1f10e84 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorPojoRawTypeModel.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/ProcessorPojoRawTypeModel.java @@ -2,10 +2,10 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model.impl; +package org.hibernate.search.processor.model.impl; -import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.propertyElements; -import static org.hibernate.search.metamodel.processor.impl.ProcessorElementUtils.propertyName; +import static org.hibernate.search.processor.impl.ProcessorElementUtils.propertyElements; +import static org.hibernate.search.processor.impl.ProcessorElementUtils.propertyName; import java.lang.annotation.Annotation; import java.util.Collection; @@ -34,8 +34,8 @@ import org.hibernate.search.mapper.pojo.model.spi.PojoRawTypeIdentifier; import org.hibernate.search.mapper.pojo.model.spi.PojoRawTypeModel; import org.hibernate.search.mapper.pojo.model.spi.PojoTypeModel; -import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; -import org.hibernate.search.metamodel.processor.mapping.impl.ProcessorPojoModelsBootstrapIntrospector; +import org.hibernate.search.processor.impl.HibernateSearchMetamodelProcessorContext; +import org.hibernate.search.processor.mapping.impl.ProcessorPojoModelsBootstrapIntrospector; public class ProcessorPojoRawTypeModel implements PojoRawTypeModel { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorTypeOrdering.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/ProcessorTypeOrdering.java similarity index 84% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorTypeOrdering.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/ProcessorTypeOrdering.java index 9a9e0bfc858..984e5863283 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/model/impl/ProcessorTypeOrdering.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/model/impl/ProcessorTypeOrdering.java @@ -2,13 +2,13 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model.impl; +package org.hibernate.search.processor.model.impl; import java.util.stream.Stream; import javax.lang.model.element.TypeElement; -import org.hibernate.search.metamodel.processor.impl.HibernateSearchMetamodelProcessorContext; +import org.hibernate.search.processor.impl.HibernateSearchMetamodelProcessorContext; import org.hibernate.search.util.common.reflect.spi.AbstractTypeOrdering; public class ProcessorTypeOrdering extends AbstractTypeOrdering { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/package-info.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/package-info.java new file mode 100644 index 00000000000..aff1a503b07 --- /dev/null +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/package-info.java @@ -0,0 +1 @@ +package org.hibernate.search.processor; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ClassProperty.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/ClassProperty.java similarity index 90% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ClassProperty.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/ClassProperty.java index 99e9d68ec0d..d8d7e0006d1 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ClassProperty.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/ClassProperty.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.writer.impl; +package org.hibernate.search.processor.writer.impl; import java.util.Locale; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/MetamodelClassWriter.java similarity index 97% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/MetamodelClassWriter.java index 3b72169c2d3..623f19e1115 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelClassWriter.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/MetamodelClassWriter.java @@ -2,9 +2,9 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.writer.impl; +package org.hibernate.search.processor.writer.impl; -import static org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessorSettings.Configuration; +import static org.hibernate.search.processor.HibernateSearchProcessorSettings.Configuration; import java.util.Collection; import java.util.Locale; @@ -23,7 +23,7 @@ import org.hibernate.search.engine.backend.types.converter.spi.ProjectionConverter; import org.hibernate.search.engine.search.common.spi.SearchIndexValueFieldTypeContext; import org.hibernate.search.mapper.pojo.bridge.runtime.impl.PojoValueBridgeDocumentValueConverter; -import org.hibernate.search.metamodel.processor.model.impl.HibernateSearchProcessorEnum; +import org.hibernate.search.processor.model.impl.HibernateSearchProcessorEnum; import org.hibernate.search.util.common.annotation.impl.SuppressJQAssistant; @SuppressJQAssistant(reason = "Need to use an impl clss for the value converter to get to the type element") diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelNamesFormatter.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/MetamodelNamesFormatter.java similarity index 88% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelNamesFormatter.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/MetamodelNamesFormatter.java index 668c545f191..727fd046732 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/MetamodelNamesFormatter.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/MetamodelNamesFormatter.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.writer.impl; +package org.hibernate.search.processor.writer.impl; import java.util.Locale; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitKind.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TraitKind.java similarity index 92% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitKind.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TraitKind.java index 32554e66965..c8afb655303 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitKind.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TraitKind.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.writer.impl; +package org.hibernate.search.processor.writer.impl; enum TraitKind { diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetails.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TraitReferenceDetails.java similarity index 96% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetails.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TraitReferenceDetails.java index 114961f555c..bf16765bf03 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetails.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TraitReferenceDetails.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.writer.impl; +package org.hibernate.search.processor.writer.impl; import java.util.Optional; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TraitReferenceMapping.java similarity index 99% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TraitReferenceMapping.java index 97e87d873e2..8126cbfe5c7 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMapping.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TraitReferenceMapping.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.writer.impl; +package org.hibernate.search.processor.writer.impl; import java.util.Collections; import java.util.HashMap; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TypedFieldReferenceDetails.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TypedFieldReferenceDetails.java similarity index 98% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TypedFieldReferenceDetails.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TypedFieldReferenceDetails.java index e47c2f18104..a95b87dded9 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/TypedFieldReferenceDetails.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/TypedFieldReferenceDetails.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.writer.impl; +package org.hibernate.search.processor.writer.impl; import java.util.ArrayList; import java.util.Collection; diff --git a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/ValueFieldReferenceDetails.java similarity index 97% rename from metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java rename to metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/ValueFieldReferenceDetails.java index 40533743d13..c2e307a1c25 100644 --- a/metamodel/metamodel-processor/src/main/java/org/hibernate/search/metamodel/processor/writer/impl/ValueFieldReferenceDetails.java +++ b/metamodel/metamodel-processor/src/main/java/org/hibernate/search/processor/writer/impl/ValueFieldReferenceDetails.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.writer.impl; +package org.hibernate.search.processor.writer.impl; import java.util.Locale; diff --git a/metamodel/metamodel-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/metamodel/metamodel-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor index ef14b4886c1..44f0b6c6ddb 100644 --- a/metamodel/metamodel-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor +++ b/metamodel/metamodel-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -1 +1 @@ -org.hibernate.search.metamodel.processor.HibernateSearchMetamodelProcessor +org.hibernate.search.processor.HibernateSearchProcessor diff --git a/metamodel/metamodel-processor/src/main/resources/logging.properties b/metamodel/metamodel-processor/src/main/resources/logging.properties new file mode 100644 index 00000000000..f1939643b3f --- /dev/null +++ b/metamodel/metamodel-processor/src/main/resources/logging.properties @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright Red Hat Inc. and Hibernate Authors +# Root logger level +logger.level=SEVERE diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettingsTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/HibernateSearchProcessorSettingsTest.java similarity index 70% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettingsTest.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/HibernateSearchProcessorSettingsTest.java index 9f431c057c7..37a9f39a35c 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorSettingsTest.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/HibernateSearchProcessorSettingsTest.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor; +package org.hibernate.search.processor; import static org.assertj.core.api.Assertions.assertThat; @@ -12,12 +12,12 @@ import org.junit.jupiter.api.Test; -class HibernateSearchMetamodelProcessorSettingsTest { +class HibernateSearchProcessorSettingsTest { @Test void defaultVersionsUpToDate() { - HibernateSearchMetamodelProcessorSettings.Configuration configuration = - new HibernateSearchMetamodelProcessorSettings.Configuration( Map.of() ); + HibernateSearchProcessorSettings.Configuration configuration = + new HibernateSearchProcessorSettings.Configuration( Map.of() ); assertThat( configuration.luceneVersion() ) .isEqualTo( LuceneBackendSettings.Defaults.LUCENE_VERSION.toString() ); assertThat( configuration.elasticsearchVersion() ) diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/HibernateSearchProcessorTest.java similarity index 73% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/HibernateSearchProcessorTest.java index 7b812b5673d..dfb96d138f5 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/HibernateSearchMetamodelProcessorTest.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/HibernateSearchProcessorTest.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor; +package org.hibernate.search.processor; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -25,30 +25,30 @@ import javax.tools.StandardLocation; import javax.tools.ToolProvider; -import org.hibernate.search.metamodel.processor.model.FieldTypesEntity; -import org.hibernate.search.metamodel.processor.model.ISBN; -import org.hibernate.search.metamodel.processor.model.MyContainedEntity; -import org.hibernate.search.metamodel.processor.model.MyContainingEntity; -import org.hibernate.search.metamodel.processor.model.MyCustomField; -import org.hibernate.search.metamodel.processor.model.MyCustomId; -import org.hibernate.search.metamodel.processor.model.MyEmbeddedEntity; -import org.hibernate.search.metamodel.processor.model.MyEntityWithBinders; -import org.hibernate.search.metamodel.processor.model.MyEnum; -import org.hibernate.search.metamodel.processor.model.MyEnumCollectionEntity; -import org.hibernate.search.metamodel.processor.model.MyFieldBinderIndexedEntity; -import org.hibernate.search.metamodel.processor.model.MyFieldBridgeIndexedEntity; -import org.hibernate.search.metamodel.processor.model.MyGeoPointBindingFieldEntity; -import org.hibernate.search.metamodel.processor.model.MyIdBinderIndexedEntity; -import org.hibernate.search.metamodel.processor.model.MyIdBridgeIndexedEntity; -import org.hibernate.search.metamodel.processor.model.MyIndexedEntity; -import org.hibernate.search.metamodel.processor.model.MyIndexedGetterEntity; -import org.hibernate.search.metamodel.processor.model.SomeGenerics; -import org.hibernate.search.metamodel.processor.model.SomeRandomType; -import org.hibernate.search.metamodel.processor.model.SomeRandomTypeBinder; +import org.hibernate.search.processor.model.FieldTypesEntity; +import org.hibernate.search.processor.model.ISBN; +import org.hibernate.search.processor.model.MyContainedEntity; +import org.hibernate.search.processor.model.MyContainingEntity; +import org.hibernate.search.processor.model.MyCustomField; +import org.hibernate.search.processor.model.MyCustomId; +import org.hibernate.search.processor.model.MyEmbeddedEntity; +import org.hibernate.search.processor.model.MyEntityWithBinders; +import org.hibernate.search.processor.model.MyEnum; +import org.hibernate.search.processor.model.MyEnumCollectionEntity; +import org.hibernate.search.processor.model.MyFieldBinderIndexedEntity; +import org.hibernate.search.processor.model.MyFieldBridgeIndexedEntity; +import org.hibernate.search.processor.model.MyGeoPointBindingFieldEntity; +import org.hibernate.search.processor.model.MyIdBinderIndexedEntity; +import org.hibernate.search.processor.model.MyIdBridgeIndexedEntity; +import org.hibernate.search.processor.model.MyIndexedEntity; +import org.hibernate.search.processor.model.MyIndexedGetterEntity; +import org.hibernate.search.processor.model.SomeGenerics; +import org.hibernate.search.processor.model.SomeRandomType; +import org.hibernate.search.processor.model.SomeRandomTypeBinder; import org.junit.jupiter.api.Test; -class HibernateSearchMetamodelProcessorTest { +class HibernateSearchProcessorTest { private static final Path BASE_DIR; private static final Path TARGET_DIR; @@ -73,7 +73,7 @@ void smoke() { DiagnosticCollector diagnostics = new DiagnosticCollector<>(); compile( - new HibernateSearchMetamodelProcessor(), diagnostics, + new HibernateSearchProcessor(), diagnostics, getSourceFile( SomeGenerics.class ), getSourceFile( MyIndexedEntity.class ), getSourceFile( MyEmbeddedEntity.class ), @@ -110,7 +110,7 @@ void binderWarning() { DiagnosticCollector diagnostics = new DiagnosticCollector<>(); compile( - new HibernateSearchMetamodelProcessor(), diagnostics, + new HibernateSearchProcessor(), diagnostics, getSourceFile( MyEntityWithBinders.class ), getSourceFile( SomeRandomType.class ), getSourceFile( SomeRandomTypeBinder.class ) @@ -166,7 +166,7 @@ public File getSourceFile(Class clazz) { private static Path getTargetDir() { try { // target/test-classes - var targetClassesDir = HibernateSearchMetamodelProcessorTest.class.getProtectionDomain() + var targetClassesDir = HibernateSearchProcessorTest.class.getProtectionDomain() .getCodeSource().getLocation().toURI(); // use URI to make things work on Win as well: return Paths.get( targetClassesDir ).getParent(); diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/FieldTypesEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/FieldTypesEntity.java similarity index 97% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/FieldTypesEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/FieldTypesEntity.java index 75bda6899fc..60251538657 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/FieldTypesEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/FieldTypesEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import java.math.BigDecimal; import java.math.BigInteger; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/ISBN.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/ISBN.java similarity index 70% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/ISBN.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/ISBN.java index 066b1ce0982..e60ca9d6252 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/ISBN.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/ISBN.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; public record ISBN(String code) { } diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyContainedEntity.java similarity index 89% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainedEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyContainedEntity.java index 41756a59baf..b838bc46e0d 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainedEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyContainedEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.engine.backend.types.Projectable; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainingEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyContainingEntity.java similarity index 90% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainingEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyContainingEntity.java index 03740bd6a5e..78e43ff8a1d 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyContainingEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyContainingEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomField.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyCustomField.java similarity index 95% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomField.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyCustomField.java index 510d0f0d778..4942c2ad436 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomField.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyCustomField.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.mapper.pojo.bridge.ValueBridge; import org.hibernate.search.mapper.pojo.bridge.binding.ValueBindingContext; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomId.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyCustomId.java similarity index 95% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomId.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyCustomId.java index 3aaf9d4bee0..17968d1aa3d 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyCustomId.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyCustomId.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.mapper.pojo.bridge.IdentifierBridge; import org.hibernate.search.mapper.pojo.bridge.binding.IdentifierBindingContext; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEmbeddedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEmbeddedEntity.java similarity index 88% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEmbeddedEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEmbeddedEntity.java index db4cb617b8f..c2a25aad36e 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEmbeddedEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEmbeddedEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEntityWithBinders.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEntityWithBinders.java similarity index 91% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEntityWithBinders.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEntityWithBinders.java index 826e1a69b6e..2ead0ce0ded 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEntityWithBinders.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEntityWithBinders.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.PropertyBinderRef; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnum.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEnum.java similarity index 70% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnum.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEnum.java index 8de7866e4f0..4a113a1a45c 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnum.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEnum.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; public enum MyEnum { A, diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnumCollectionEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEnumCollectionEntity.java similarity index 89% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnumCollectionEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEnumCollectionEntity.java index 3c8c0dbe59e..69608ce9009 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyEnumCollectionEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyEnumCollectionEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import java.util.List; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBinderIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyFieldBinderIndexedEntity.java similarity index 91% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBinderIndexedEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyFieldBinderIndexedEntity.java index 8b1b63d7f76..935348bf06d 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBinderIndexedEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyFieldBinderIndexedEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.ValueBinderRef; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBridgeIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyFieldBridgeIndexedEntity.java similarity index 91% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBridgeIndexedEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyFieldBridgeIndexedEntity.java index 1f63dbc5279..6b70a6b396a 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyFieldBridgeIndexedEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyFieldBridgeIndexedEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.ValueBridgeRef; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyGeoPointBindingFieldEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyGeoPointBindingFieldEntity.java similarity index 93% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyGeoPointBindingFieldEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyGeoPointBindingFieldEntity.java index 73500b2591b..df14de157eb 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyGeoPointBindingFieldEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyGeoPointBindingFieldEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.GeoPointBinding; import org.hibernate.search.mapper.pojo.bridge.builtin.annotation.Latitude; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBinderIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIdBinderIndexedEntity.java similarity index 92% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBinderIndexedEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIdBinderIndexedEntity.java index f5d96eb181c..27def44c662 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBinderIndexedEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIdBinderIndexedEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.IdentifierBinderRef; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBridgeIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIdBridgeIndexedEntity.java similarity index 92% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBridgeIndexedEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIdBridgeIndexedEntity.java index 7c19cec7b68..2a6a06d9e54 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIdBridgeIndexedEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIdBridgeIndexedEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.mapper.pojo.bridge.mapping.annotation.IdentifierBridgeRef; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIndexedEntity.java similarity index 98% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIndexedEntity.java index a9b96a81258..07f8f12b35c 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIndexedEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import java.math.BigDecimal; import java.time.LocalDate; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedGetterEntity.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIndexedGetterEntity.java similarity index 98% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedGetterEntity.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIndexedGetterEntity.java index c621aa50e0e..ee3f4a9af94 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/MyIndexedGetterEntity.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/MyIndexedGetterEntity.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import java.time.LocalDate; import java.util.List; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeGenerics.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/SomeGenerics.java similarity index 88% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeGenerics.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/SomeGenerics.java index fa78bed4754..de6c8827460 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeGenerics.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/SomeGenerics.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import java.util.List; import java.util.Map; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomType.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/SomeRandomType.java similarity index 75% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomType.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/SomeRandomType.java index 72fd6c27429..db55e36ee32 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomType.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/SomeRandomType.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; public class SomeRandomType { diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomTypeBinder.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/SomeRandomTypeBinder.java similarity index 95% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomTypeBinder.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/SomeRandomTypeBinder.java index 87c5672345e..34e9deeb5b3 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/model/SomeRandomTypeBinder.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/model/SomeRandomTypeBinder.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.model; +package org.hibernate.search.processor.model; import org.hibernate.search.engine.backend.document.IndexFieldReference; import org.hibernate.search.mapper.pojo.bridge.binding.PropertyBindingContext; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetailsTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/writer/impl/TraitReferenceDetailsTest.java similarity index 95% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetailsTest.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/writer/impl/TraitReferenceDetailsTest.java index 3c48370cb21..127c050d8ea 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceDetailsTest.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/writer/impl/TraitReferenceDetailsTest.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.writer.impl; +package org.hibernate.search.processor.writer.impl; import static org.assertj.core.api.Assertions.assertThat; diff --git a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMappingTest.java b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/writer/impl/TraitReferenceMappingTest.java similarity index 97% rename from metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMappingTest.java rename to metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/writer/impl/TraitReferenceMappingTest.java index 647d06f1722..eefbcbc9234 100644 --- a/metamodel/metamodel-processor/src/test/java/org/hibernate/search/metamodel/processor/writer/impl/TraitReferenceMappingTest.java +++ b/metamodel/metamodel-processor/src/test/java/org/hibernate/search/processor/writer/impl/TraitReferenceMappingTest.java @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -package org.hibernate.search.metamodel.processor.writer.impl; +package org.hibernate.search.processor.writer.impl; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail;