Skip to content

Commit 266644f

Browse files
committed
HSEARCH-3319 More field references
1 parent 916b48c commit 266644f

17 files changed

+292
-4
lines changed

engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/AvgAggregationFieldStep.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import org.hibernate.search.engine.search.common.ValueModel;
1010
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
11+
import org.hibernate.search.engine.search.reference.aggregation.AvgAggregationFieldReference;
1112
import org.hibernate.search.util.common.annotation.Incubating;
1213

1314
/**
@@ -44,4 +45,16 @@ public interface AvgAggregationFieldStep<SR, PDF extends SearchPredicateFactory<
4445
<F> AvgAggregationOptionsStep<SR, ?, PDF, F> field(String fieldPath, Class<F> type,
4546
ValueModel valueModel);
4647

48+
/**
49+
* Target the given field in the avg aggregation.
50+
*
51+
* @param reference The field reference representing a <a href="SearchAggregationFactory.html#field-paths">path</a> to the index field to aggregate.
52+
* @param <F> The type of field values or {@link Double} if a double result is required.
53+
* @return The next step.
54+
*/
55+
@Incubating
56+
default <F> AvgAggregationOptionsStep<SR, ?, PDF, F> field(AvgAggregationFieldReference<SR, F> reference) {
57+
return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() );
58+
}
59+
4760
}

engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountAggregationFieldStep.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import java.util.function.Function;
88

99
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
10+
import org.hibernate.search.engine.search.reference.aggregation.CountAggregationFieldReference;
11+
import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference;
1012
import org.hibernate.search.util.common.annotation.Incubating;
1113

1214
/**
@@ -26,4 +28,14 @@ public interface CountAggregationFieldStep<SR, PDF extends SearchPredicateFactor
2628
*/
2729
CountAggregationOptionsStep<SR, ?, PDF> field(String fieldPath);
2830

31+
/**
32+
* Target the given field in the avg aggregation.
33+
*
34+
* @param reference The field reference representing a <a href="SearchAggregationFactory.html#field-paths">path</a> to the index field to aggregate.
35+
* @return The next step.
36+
*/
37+
@Incubating
38+
default CountAggregationOptionsStep<SR, ?, PDF> field(CountAggregationFieldReference<SR> reference) {
39+
return field( reference.absolutePath() );
40+
}
2941
}

engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/CountDistinctAggregationFieldStep.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.function.Function;
88

99
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
10+
import org.hibernate.search.engine.search.reference.aggregation.CountAggregationFieldReference;
1011
import org.hibernate.search.util.common.annotation.Incubating;
1112

1213
/**
@@ -26,4 +27,14 @@ public interface CountDistinctAggregationFieldStep<SR, PDF extends SearchPredica
2627
*/
2728
CountDistinctAggregationOptionsStep<SR, ?, PDF> field(String fieldPath);
2829

30+
/**
31+
* Target the given field in the avg aggregation.
32+
*
33+
* @param reference The field reference representing a <a href="SearchAggregationFactory.html#field-paths">path</a> to the index field to aggregate.
34+
* @return The next step.
35+
*/
36+
@Incubating
37+
default CountDistinctAggregationOptionsStep<SR, ?, PDF> field(CountAggregationFieldReference<SR> reference) {
38+
return field( reference.absolutePath() );
39+
}
2940
}

engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MaxAggregationFieldStep.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
import org.hibernate.search.engine.search.common.ValueModel;
1010
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
11+
import org.hibernate.search.engine.search.reference.aggregation.AvgAggregationFieldReference;
12+
import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference;
1113
import org.hibernate.search.util.common.annotation.Incubating;
1214

1315
/**
@@ -43,4 +45,15 @@ public interface MaxAggregationFieldStep<SR, PDF extends SearchPredicateFactory<
4345
*/
4446
<F> MaxAggregationOptionsStep<SR, ?, PDF, F> field(String fieldPath, Class<F> type, ValueModel valueModel);
4547

48+
/**
49+
* Target the given field in the avg aggregation.
50+
*
51+
* @param reference The field reference representing a <a href="SearchAggregationFactory.html#field-paths">path</a> to the index field to aggregate.
52+
* @param <F> The type of field values.
53+
* @return The next step.
54+
*/
55+
@Incubating
56+
default <F> MaxAggregationOptionsStep<SR, ?, PDF, F> field(MaxAggregationFieldReference<SR, F> reference) {
57+
return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() );
58+
}
4659
}

engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/MinAggregationFieldStep.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
import org.hibernate.search.engine.search.common.ValueModel;
1010
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
11+
import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference;
12+
import org.hibernate.search.engine.search.reference.aggregation.MinAggregationFieldReference;
1113
import org.hibernate.search.util.common.annotation.Incubating;
1214

1315
/**
@@ -43,4 +45,15 @@ public interface MinAggregationFieldStep<SR, PDF extends SearchPredicateFactory<
4345
*/
4446
<F> MinAggregationOptionsStep<SR, ?, PDF, F> field(String fieldPath, Class<F> type, ValueModel valueModel);
4547

48+
/**
49+
* Target the given field in the avg aggregation.
50+
*
51+
* @param reference The field reference representing a <a href="SearchAggregationFactory.html#field-paths">path</a> to the index field to aggregate.
52+
* @param <F> The type of field values.
53+
* @return The next step.
54+
*/
55+
@Incubating
56+
default <F> MinAggregationOptionsStep<SR, ?, PDF, F> field(MinAggregationFieldReference<SR, F> reference) {
57+
return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() );
58+
}
4659
}

engine/src/main/java/org/hibernate/search/engine/search/aggregation/dsl/SumAggregationFieldStep.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
import org.hibernate.search.engine.search.common.ValueModel;
1010
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
11+
import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference;
12+
import org.hibernate.search.engine.search.reference.aggregation.SumAggregationFieldReference;
1113
import org.hibernate.search.util.common.annotation.Incubating;
1214

1315
/**
@@ -43,4 +45,15 @@ public interface SumAggregationFieldStep<SR, PDF extends SearchPredicateFactory<
4345
*/
4446
<F> SumAggregationOptionsStep<SR, ?, PDF, F> field(String fieldPath, Class<F> type, ValueModel valueModel);
4547

48+
/**
49+
* Target the given field in the avg aggregation.
50+
*
51+
* @param reference The field reference representing a <a href="SearchAggregationFactory.html#field-paths">path</a> to the index field to aggregate.
52+
* @param <F> The type of field values.
53+
* @return The next step.
54+
*/
55+
@Incubating
56+
default <F> SumAggregationOptionsStep<SR, ?, PDF, F> field(SumAggregationFieldReference<SR, F> reference) {
57+
return field( reference.absolutePath(), reference.aggregationType(), reference.valueModel() );
58+
}
4659
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.search.engine.search.reference.aggregation;
6+
7+
public interface AvgAggregationFieldReference<SR, T> extends TypedAggregationFieldReference<SR, T> {
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.search.engine.search.reference.aggregation;
6+
7+
public interface CountAggregationFieldReference<SR> extends AggregationFieldReference<SR> {
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.search.engine.search.reference.aggregation;
6+
7+
public interface CountDistinctAggregationFieldReference<SR> extends AggregationFieldReference<SR> {
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.search.engine.search.reference.aggregation;
6+
7+
public interface MaxAggregationFieldReference<SR, T> extends TypedAggregationFieldReference<SR, T> {
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.search.engine.search.reference.aggregation;
6+
7+
public interface MinAggregationFieldReference<SR, T> extends TypedAggregationFieldReference<SR, T> {
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.search.engine.search.reference.aggregation;
6+
7+
public interface SumAggregationFieldReference<SR, T> extends TypedAggregationFieldReference<SR, T> {
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.search.engine.search.reference.sort;
6+
7+
public interface DistanceSortFieldReference<SR, T> extends TypedSortFieldReference<SR, T> {
8+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package org.hibernate.search.engine.search.reference.spi;
2+
3+
import java.util.Collections;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
import org.hibernate.search.engine.backend.types.IndexFieldTraits;
8+
import org.hibernate.search.engine.search.reference.aggregation.AvgAggregationFieldReference;
9+
import org.hibernate.search.engine.search.reference.aggregation.CountAggregationFieldReference;
10+
import org.hibernate.search.engine.search.reference.aggregation.CountDistinctAggregationFieldReference;
11+
import org.hibernate.search.engine.search.reference.aggregation.MaxAggregationFieldReference;
12+
import org.hibernate.search.engine.search.reference.aggregation.MinAggregationFieldReference;
13+
import org.hibernate.search.engine.search.reference.aggregation.RangeAggregationFieldReference;
14+
import org.hibernate.search.engine.search.reference.aggregation.SumAggregationFieldReference;
15+
import org.hibernate.search.engine.search.reference.aggregation.TermsAggregationFieldReference;
16+
import org.hibernate.search.engine.search.reference.predicate.ExistsPredicateFieldReference;
17+
import org.hibernate.search.engine.search.reference.predicate.KnnPredicateFieldReference;
18+
import org.hibernate.search.engine.search.reference.predicate.MatchPredicateFieldReference;
19+
import org.hibernate.search.engine.search.reference.predicate.NestedPredicateFieldReference;
20+
import org.hibernate.search.engine.search.reference.predicate.PhrasePredicateFieldReference;
21+
import org.hibernate.search.engine.search.reference.predicate.PrefixPredicateFieldReference;
22+
import org.hibernate.search.engine.search.reference.predicate.QueryStringPredicateFieldReference;
23+
import org.hibernate.search.engine.search.reference.predicate.RangePredicateFieldReference;
24+
import org.hibernate.search.engine.search.reference.predicate.RegexpPredicateFieldReference;
25+
import org.hibernate.search.engine.search.reference.predicate.SimpleQueryStringPredicateFieldReference;
26+
import org.hibernate.search.engine.search.reference.predicate.SpatialWithinBoundingBoxPredicateFieldReference;
27+
import org.hibernate.search.engine.search.reference.predicate.SpatialWithinCirclePredicateFieldReference;
28+
import org.hibernate.search.engine.search.reference.predicate.SpatialWithinPolygonPredicateFieldReference;
29+
import org.hibernate.search.engine.search.reference.predicate.TermsPredicateFieldReference;
30+
import org.hibernate.search.engine.search.reference.predicate.WildcardPredicateFieldReference;
31+
import org.hibernate.search.engine.search.reference.projection.DistanceProjectionFieldReference;
32+
import org.hibernate.search.engine.search.reference.projection.FieldProjectionFieldReference;
33+
import org.hibernate.search.engine.search.reference.projection.HighlightProjectionFieldReference;
34+
import org.hibernate.search.engine.search.reference.projection.ObjectProjectionFieldReference;
35+
import org.hibernate.search.engine.search.reference.sort.DistanceSortFieldReference;
36+
import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference;
37+
import org.hibernate.search.util.common.annotation.Incubating;
38+
39+
@Incubating
40+
public class TraitReferenceMapping {
41+
private final Map<String, ReferenceDetails> traits;
42+
43+
private TraitReferenceMapping() {
44+
Map<String, ReferenceDetails> traits = new HashMap<>( backendSpecificTraits() );
45+
46+
traits.put( IndexFieldTraits.Predicates.EXISTS, new ReferenceDetails( ExistsPredicateFieldReference.class, "P0" ) );
47+
traits.put( IndexFieldTraits.Predicates.KNN, new ReferenceDetails( KnnPredicateFieldReference.class, "P1" ) );
48+
traits.put( IndexFieldTraits.Predicates.MATCH, new ReferenceDetails( MatchPredicateFieldReference.class, "P2" ) );
49+
traits.put( IndexFieldTraits.Predicates.NESTED, new ReferenceDetails( NestedPredicateFieldReference.class, "P3" ) );
50+
traits.put( IndexFieldTraits.Predicates.PHRASE, new ReferenceDetails( PhrasePredicateFieldReference.class, "P4" ) );
51+
traits.put( IndexFieldTraits.Predicates.PREFIX, new ReferenceDetails( PrefixPredicateFieldReference.class, "P5" ) );
52+
traits.put( IndexFieldTraits.Predicates.RANGE, new ReferenceDetails( RangePredicateFieldReference.class, "P6" ) );
53+
traits.put( IndexFieldTraits.Predicates.QUERY_STRING,
54+
new ReferenceDetails( QueryStringPredicateFieldReference.class, "P7" ) );
55+
traits.put( IndexFieldTraits.Predicates.REGEXP, new ReferenceDetails( RegexpPredicateFieldReference.class, "P8" ) );
56+
traits.put( IndexFieldTraits.Predicates.SIMPLE_QUERY_STRING,
57+
new ReferenceDetails( SimpleQueryStringPredicateFieldReference.class, "P9" ) );
58+
traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_BOUNDING_BOX,
59+
new ReferenceDetails( SpatialWithinBoundingBoxPredicateFieldReference.class, "P10" ) );
60+
traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_CIRCLE,
61+
new ReferenceDetails( SpatialWithinCirclePredicateFieldReference.class, "P11" ) );
62+
traits.put( IndexFieldTraits.Predicates.SPATIAL_WITHIN_POLYGON,
63+
new ReferenceDetails( SpatialWithinPolygonPredicateFieldReference.class, "P12" ) );
64+
traits.put( IndexFieldTraits.Predicates.TERMS, new ReferenceDetails( TermsPredicateFieldReference.class, "P13" ) );
65+
traits.put( IndexFieldTraits.Predicates.WILDCARD,
66+
new ReferenceDetails( WildcardPredicateFieldReference.class, "P14" ) );
67+
68+
traits.put( IndexFieldTraits.Sorts.DISTANCE, new ReferenceDetails( DistanceSortFieldReference.class, "S0" ) );
69+
traits.put( IndexFieldTraits.Sorts.FIELD, new ReferenceDetails( FieldSortFieldReference.class, "S1" ) );
70+
71+
traits.put( IndexFieldTraits.Projections.DISTANCE,
72+
new ReferenceDetails( DistanceProjectionFieldReference.class, "R0" ) );
73+
traits.put( IndexFieldTraits.Projections.FIELD, new ReferenceDetails( FieldProjectionFieldReference.class, "R1" ) );
74+
traits.put( IndexFieldTraits.Projections.HIGHLIGHT,
75+
new ReferenceDetails( HighlightProjectionFieldReference.class, "R2" ) );
76+
traits.put( IndexFieldTraits.Projections.OBJECT, new ReferenceDetails( ObjectProjectionFieldReference.class, "R3" ) );
77+
78+
traits.put( IndexFieldTraits.Aggregations.RANGE, new ReferenceDetails( RangeAggregationFieldReference.class, "A0" ) );
79+
traits.put( IndexFieldTraits.Aggregations.TERMS, new ReferenceDetails( TermsAggregationFieldReference.class, "A1" ) );
80+
traits.put( IndexFieldTraits.Aggregations.SUM, new ReferenceDetails( SumAggregationFieldReference.class, "A2" ) );
81+
traits.put( IndexFieldTraits.Aggregations.MIN, new ReferenceDetails( MinAggregationFieldReference.class, "A3" ) );
82+
traits.put( IndexFieldTraits.Aggregations.MAX, new ReferenceDetails( MaxAggregationFieldReference.class, "A4" ) );
83+
traits.put( IndexFieldTraits.Aggregations.COUNT, new ReferenceDetails( CountAggregationFieldReference.class, "A5" ) );
84+
traits.put( IndexFieldTraits.Aggregations.COUNT_DISTINCT,
85+
new ReferenceDetails( CountDistinctAggregationFieldReference.class, "A6" ) );
86+
traits.put( IndexFieldTraits.Aggregations.AVG, new ReferenceDetails( AvgAggregationFieldReference.class, "A7" ) );
87+
88+
this.traits = Collections.unmodifiableMap( traits );
89+
}
90+
91+
protected Map<String, ReferenceDetails> backendSpecificTraits() {
92+
return Map.of();
93+
}
94+
95+
public static TraitReferenceMapping instance() {
96+
return new TraitReferenceMapping();
97+
}
98+
99+
public ReferenceDetails reference(String traitName) {
100+
return traits.get( traitName );
101+
}
102+
103+
public record ReferenceDetails(Class<?> referenceClass, String implementationLabel) {
104+
}
105+
106+
}

engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/ExtendedSearchSortFactory.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.function.Function;
88

99
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
10+
import org.hibernate.search.engine.search.reference.sort.DistanceSortFieldReference;
1011
import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference;
1112
import org.hibernate.search.engine.spatial.GeoPoint;
1213

@@ -42,13 +43,13 @@ public interface ExtendedSearchSortFactory<
4243
}
4344

4445
@Override
45-
default DistanceSortOptionsStep<SR, ?, PDF> distance(FieldSortFieldReference<? super SR, ?> fieldReference,
46+
default DistanceSortOptionsStep<SR, ?, PDF> distance(DistanceSortFieldReference<? super SR, ?> fieldReference,
4647
GeoPoint location) {
4748
return distance( fieldReference.absolutePath(), location );
4849
}
4950

5051
@Override
51-
default DistanceSortOptionsStep<SR, ?, PDF> distance(FieldSortFieldReference<? super SR, ?> fieldReference, double latitude,
52+
default DistanceSortOptionsStep<SR, ?, PDF> distance(DistanceSortFieldReference<? super SR, ?> fieldReference, double latitude,
5253
double longitude) {
5354
return distance( fieldReference, GeoPoint.of( latitude, longitude ) );
5455
}

engine/src/main/java/org/hibernate/search/engine/search/sort/dsl/SearchSortFactory.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import org.hibernate.search.engine.search.common.NamedValues;
1111
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
12+
import org.hibernate.search.engine.search.reference.sort.DistanceSortFieldReference;
1213
import org.hibernate.search.engine.search.reference.sort.FieldSortFieldReference;
1314
import org.hibernate.search.engine.spatial.GeoPoint;
1415
import org.hibernate.search.util.common.SearchException;
@@ -102,7 +103,7 @@ public interface SearchSortFactory<SR> {
102103
*/
103104
@Incubating
104105
default DistanceSortOptionsStep<SR, ?, ? extends SearchPredicateFactory<SR>> distance(
105-
FieldSortFieldReference<? super SR, ?> fieldReference, GeoPoint location) {
106+
DistanceSortFieldReference<? super SR, ?> fieldReference, GeoPoint location) {
106107
return distance( fieldReference.absolutePath(), location );
107108
}
108109

@@ -137,7 +138,7 @@ public interface SearchSortFactory<SR> {
137138
*/
138139
@Incubating
139140
default DistanceSortOptionsStep<SR, ?, ? extends SearchPredicateFactory<SR>> distance(
140-
FieldSortFieldReference<? super SR, ?> fieldReference, double latitude,
141+
DistanceSortFieldReference<? super SR, ?> fieldReference, double latitude,
141142
double longitude) {
142143
return distance( fieldReference, GeoPoint.of( latitude, longitude ) );
143144
}

0 commit comments

Comments
 (0)