Skip to content

Commit 2f575e3

Browse files
committed
HSEARCH-3319 Address super-type references
1 parent 4f08fe7 commit 2f575e3

23 files changed

+134
-67
lines changed

documentation/src/test/java/org/hibernate/search/documentation/search/predicate/FieldReferenceIT.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ void smoke() {
6565
.fetchHits( 20 )
6666
).containsOnly( "c" );
6767

68+
assertThat(
69+
searchSession.search( EntityC_.scope )
70+
.select( f -> f.field( EntityC_.stringA ) )
71+
.where( f -> f.match().field( EntityC_.stringA ).matching( "c" ) )
72+
.fetchHits( 20 )
73+
).containsOnly( "c" );
74+
6875
SearchScope<EntityB_union_EntityC_, EntityB> scope = EntityB_union_EntityC_.scope.create( searchSession );
6976

7077
SearchPredicate searchPredicate =
@@ -198,30 +205,24 @@ public static class EntityA_ {
198205
}
199206
}
200207

201-
public static class EntityB_ {
202-
public static ValueFieldReference1<EntityB_, String, String, String> stringA;
208+
public static class EntityB_ extends EntityA_ {
203209
public static ValueFieldReference1<EntityB_, String, String, String> stringB;
204210

205211
public static RootReferenceScope<EntityB_, EntityB> scope;
206212

207213
static {
208-
stringA = ValueFieldReference1.of( "stringA", EntityB_.class, String.class, String.class, String.class );
209214
stringB = ValueFieldReference1.of( "stringB", EntityB_.class, String.class, String.class, String.class );
210215

211216
scope = RootReferenceScopeImpl.of( EntityB_.class, EntityB.class );
212217
}
213218
}
214219

215-
public static class EntityC_ {
216-
public static ValueFieldReference1<EntityC_, String, String, String> stringA;
217-
public static ValueFieldReference1<EntityC_, String, String, String> stringB;
220+
public static class EntityC_ extends EntityB_ {
218221
public static ValueFieldReference1<EntityC_, String, String, String> stringC;
219222

220223
public static RootReferenceScope<EntityC_, EntityC> scope;
221224

222225
static {
223-
stringA = ValueFieldReference1.of( "stringA", EntityC_.class, String.class, String.class, String.class );
224-
stringB = ValueFieldReference1.of( "stringB", EntityC_.class, String.class, String.class, String.class );
225226
stringC = ValueFieldReference1.of( "stringC", EntityC_.class, String.class, String.class, String.class );
226227

227228
scope = RootReferenceScopeImpl.of( EntityC_.class, EntityC.class );

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

Lines changed: 12 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.RangeAggregationFieldReference;
1112

1213
/**
1314
* The initial step in a "range" aggregation definition, where the target field can be set.
@@ -59,4 +60,15 @@ public interface RangeAggregationFieldStep<SR, PDF extends SearchPredicateFactor
5960
*/
6061
<F> RangeAggregationRangeStep<SR, ?, PDF, F> field(String fieldPath, Class<F> type, ValueModel valueModel);
6162

63+
/**
64+
* Target the given field in the range aggregation.
65+
*
66+
* @param fieldReference The field reference representing a <a href="SearchAggregationFactory.html#field-paths">path</a> to the index field to aggregate.
67+
* @param <F> The type of field values.
68+
* @return The next step.
69+
*/
70+
default <F> RangeAggregationRangeStep<SR, ?, PDF, F> field(RangeAggregationFieldReference<? super SR, F> fieldReference) {
71+
return field( fieldReference.absolutePath(), fieldReference.aggregationType(), fieldReference.valueModel() );
72+
}
73+
6274
}

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

Lines changed: 15 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.common.NamedValues;
10+
import org.hibernate.search.engine.search.reference.object.ObjectFieldReference;
1011
import org.hibernate.search.util.common.SearchException;
1112
import org.hibernate.search.util.common.annotation.Incubating;
1213

@@ -146,6 +147,20 @@ <T> AggregationFinalStep<T> withParameters(
146147
@Incubating
147148
SearchAggregationFactory<SR> withRoot(String objectFieldPath);
148149

150+
/**
151+
* Create a new aggregation factory whose root for all paths passed to the DSL
152+
* will be the given object field.
153+
* <p>
154+
* See <a href="#field-paths">here</a> for more information.
155+
*
156+
* @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root.
157+
* @return A new aggregation factory using the given object field as root.
158+
*/
159+
@Incubating
160+
default SearchAggregationFactory<SR> withRoot(ObjectFieldReference<? super SR> objectFieldReference) {
161+
return withRoot( objectFieldReference.absolutePath() );
162+
}
163+
149164
/**
150165
* @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory.
151166
* @return The absolute path of the field, for use in native aggregations for example.

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

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

1010
import org.hibernate.search.engine.search.common.ValueModel;
1111
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
12+
import org.hibernate.search.engine.search.reference.aggregation.TermsAggregationFieldReference;
1213

1314
/**
1415
* The initial step in a "terms" aggregation definition, where the target field can be set.
@@ -61,4 +62,16 @@ public interface TermsAggregationFieldStep<SR, PDF extends SearchPredicateFactor
6162
<F> TermsAggregationOptionsStep<SR, ?, PDF, F, Map<F, Long>> field(String fieldPath, Class<F> type,
6263
ValueModel valueModel);
6364

65+
/**
66+
* Target the given field in the terms aggregation.
67+
*
68+
* @param fieldReference The field reference representing a <a href="SearchAggregationFactory.html#field-paths">path</a> to the index field to aggregate.
69+
* @param <F> The type of field values.
70+
* @return The next step.
71+
*/
72+
default <F> TermsAggregationOptionsStep<SR, ?, PDF, F, Map<F, Long>> field(
73+
TermsAggregationFieldReference<? super SR, F> fieldReference) {
74+
return field( fieldReference.absolutePath(), fieldReference.aggregationType(), fieldReference.valueModel() );
75+
}
76+
6477
}

engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/ExistsPredicateFieldStep.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public interface ExistsPredicateFieldStep<SR, N extends ExistsPredicateOptionsSt
3131
* @return The next step.
3232
*/
3333
@Incubating
34-
default N field(ExistsPredicateFieldReference<SR> field) {
34+
default N field(ExistsPredicateFieldReference<? super SR> field) {
3535
return field( field.absolutePath() );
3636
}
3737

engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/KnnPredicateFieldStep.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ public interface KnnPredicateFieldStep<SR> {
2020
*/
2121
KnnPredicateVectorStep<SR> field(String fieldPath);
2222

23-
<T> KnnPredicateVectorGenericStep<SR, T> field(KnnPredicateFieldReference<SR, T> field);
23+
<T> KnnPredicateVectorGenericStep<SR, T> field(KnnPredicateFieldReference<? super SR, T> field);
2424
}

engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/MatchPredicateFieldStep.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ default N field(String fieldPath) {
5959
* @return The next step.
6060
*/
6161
@SuppressWarnings("unchecked")
62-
default <T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<SR, T>> field(
63-
MatchPredicateFieldReference<SR, T> fieldReference) {
62+
default <T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<? super SR, T>> field(
63+
MatchPredicateFieldReference<? super SR, T> fieldReference) {
6464
return fields( fieldReference );
6565
}
6666

@@ -80,6 +80,6 @@ default N field(String fieldPath) {
8080
* @see #field(MatchPredicateFieldReference)
8181
*/
8282
@SuppressWarnings("unchecked")
83-
<T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<SR, T>> fields(
84-
MatchPredicateFieldReference<SR, T>... fieldReferences);
83+
<T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<? super SR, T>> fields(
84+
MatchPredicateFieldReference<? super SR, T>... fieldReferences);
8585
}

engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/NestedPredicateFieldStep.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public interface NestedPredicateFieldStep<SR, N extends NestedPredicateNestStep<
3636
* to apply the predicate on.
3737
* @return The next step.
3838
*/
39-
default N objectField(NestedPredicateFieldReference<SR> field) {
39+
default N objectField(NestedPredicateFieldReference<? super SR> field) {
4040
return objectField( field.absolutePath() );
4141
}
4242

engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldMoreStep.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ default S field(String fieldPath) {
7373
*/
7474
@Incubating
7575
@SuppressWarnings("unchecked")
76-
default S field(PhrasePredicateFieldReference<SR, ?> field) {
76+
default S field(PhrasePredicateFieldReference<? super SR, ?> field) {
7777
return fields( field );
7878
}
7979

@@ -93,7 +93,7 @@ default S field(PhrasePredicateFieldReference<SR, ?> field) {
9393
*/
9494
@Incubating
9595
@SuppressWarnings("unchecked")
96-
default S fields(PhrasePredicateFieldReference<SR, ?>... fields) {
96+
default S fields(PhrasePredicateFieldReference<? super SR, ?>... fields) {
9797
String[] paths = new String[fields.length];
9898
for ( int i = 0; i < fields.length; i++ ) {
9999
paths[i] = fields[i].absolutePath();

engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/PhrasePredicateFieldStep.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ default N field(String fieldPath) {
7272
*/
7373
@Incubating
7474
@SuppressWarnings("unchecked")
75-
default N field(PhrasePredicateFieldReference<SR, ?> field) {
75+
default N field(PhrasePredicateFieldReference<? super SR, ?> field) {
7676
return fields( field );
7777
}
7878

@@ -95,7 +95,7 @@ default N field(PhrasePredicateFieldReference<SR, ?> field) {
9595
*/
9696
@Incubating
9797
@SuppressWarnings("unchecked")
98-
default N fields(PhrasePredicateFieldReference<SR, ?>... fields) {
98+
default N fields(PhrasePredicateFieldReference<? super SR, ?>... fields) {
9999
String[] paths = new String[fields.length];
100100
for ( int i = 0; i < fields.length; i++ ) {
101101
paths[i] = fields[i].absolutePath();

engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/RangePredicateFieldStep.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ default N field(String fieldPath) {
6464
* @return The next step.
6565
*/
6666
@SuppressWarnings("unchecked")
67-
default <T> RangePredicateFieldMoreGenericStep<SR, ?, ?, RangePredicateFieldReference<SR, T>, T> field(
68-
RangePredicateFieldReference<SR, T> field) {
67+
default <T> RangePredicateFieldMoreGenericStep<SR, ?, ?, RangePredicateFieldReference<? super SR, T>, T> field(
68+
RangePredicateFieldReference<? super SR, T> field) {
6969
return fields( field );
7070
}
7171

@@ -85,7 +85,7 @@ default N field(String fieldPath) {
8585
* @see #field(RangePredicateFieldReference)
8686
*/
8787
@SuppressWarnings("unchecked")
88-
<T> RangePredicateFieldMoreGenericStep<SR, ?, ?, RangePredicateFieldReference<SR, T>, T> fields(
89-
RangePredicateFieldReference<SR, T>... fields);
88+
<T> RangePredicateFieldMoreGenericStep<SR, ?, ?, RangePredicateFieldReference<? super SR, T>, T> fields(
89+
RangePredicateFieldReference<? super SR, T>... fields);
9090

9191
}

engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/SearchPredicateFactory.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.hibernate.search.engine.search.common.BooleanOperator;
1212
import org.hibernate.search.engine.search.common.NamedValues;
1313
import org.hibernate.search.engine.search.predicate.SearchPredicate;
14+
import org.hibernate.search.engine.search.reference.object.ObjectFieldReference;
1415
import org.hibernate.search.engine.search.reference.predicate.NestedPredicateFieldReference;
1516
import org.hibernate.search.util.common.SearchException;
1617
import org.hibernate.search.util.common.annotation.Incubating;
@@ -254,7 +255,7 @@ SimpleBooleanPredicateOptionsStep<?> or(PredicateFinalStep firstSearchPredicate,
254255
* @return The initial step of a DSL where the "nested" predicate can be defined.
255256
* @see NestedPredicateFieldStep
256257
*/
257-
default NestedPredicateClausesStep<SR, ?> nested(NestedPredicateFieldReference<SR> field) {
258+
default NestedPredicateClausesStep<SR, ?> nested(NestedPredicateFieldReference<? super SR> field) {
258259
return nested( field.absolutePath() );
259260
}
260261

@@ -375,6 +376,21 @@ PredicateFinalStep withParameters(
375376
@Incubating
376377
SearchPredicateFactory<SR> withRoot(String objectFieldPath);
377378

379+
/**
380+
* Create a new predicate factory whose root for all paths passed to the DSL
381+
* will be the given object field.
382+
* <p>
383+
* This is used to call reusable methods that apply the same predicate
384+
* on different object fields that have same structure (same sub-fields).
385+
*
386+
* @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root.
387+
* @return A new predicate factory using the given object field as root.
388+
*/
389+
@Incubating
390+
default SearchPredicateFactory<SR> withRoot(ObjectFieldReference<? super SR> objectFieldReference) {
391+
return withRoot( objectFieldReference.absolutePath() );
392+
}
393+
378394
/**
379395
* @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory.
380396
* @return The absolute path of the field, for use in native predicates for example.

engine/src/main/java/org/hibernate/search/engine/search/predicate/dsl/impl/AbstractMatchPredicateFieldMoreStep.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,12 @@ abstract class AbstractMatchPredicateFieldMoreStep<
4747
);
4848
}
4949

50-
public static <SR, T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<SR, T>> create(
51-
SearchPredicateDslContext<?> dslContext, MatchPredicateFieldReference<SR, T>[] fields) {
50+
public static <SR, T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<? super SR, T>> create(
51+
SearchPredicateDslContext<?> dslContext, MatchPredicateFieldReference<? super SR, T>[] fields) {
52+
List<MatchPredicateFieldReference<? super SR, T>> fieldList = Arrays.asList( fields );
5253
return new MatchPredicateFieldMoreStepFieldReference<>(
5354
dslContext,
54-
Arrays.asList( fields )
55+
fieldList
5556
);
5657
}
5758

@@ -152,31 +153,32 @@ private static class MatchPredicateFieldMoreStepFieldReference<SR, T>
152153
AbstractMatchPredicateFieldMoreStep<MatchPredicateFieldMoreStepFieldReference.CommonState<SR, T>,
153154
MatchPredicateFieldMoreStepFieldReference<SR, T>,
154155
T,
155-
MatchPredicateFieldReference<SR, T>>
156+
MatchPredicateFieldReference<? super SR, T>>
156157
implements
157158
MatchPredicateFieldMoreGenericStep<MatchPredicateFieldMoreStepFieldReference<SR, T>,
158159
MatchPredicateFieldMoreStepFieldReference.CommonState<SR, T>,
159160
T,
160-
MatchPredicateFieldReference<SR, T>> {
161+
MatchPredicateFieldReference<? super SR, T>> {
161162

162163
MatchPredicateFieldMoreStepFieldReference(SearchPredicateDslContext<?> dslContext,
163-
List<MatchPredicateFieldReference<SR, T>> fieldPaths) {
164+
List<MatchPredicateFieldReference<? super SR, T>> fieldPaths) {
164165
super( new CommonState<>( dslContext ), fieldPaths );
165166
}
166167

167168
private MatchPredicateFieldMoreStepFieldReference(CommonState<SR, T> commonState,
168-
List<MatchPredicateFieldReference<SR, T>> fieldPaths) {
169+
List<MatchPredicateFieldReference<? super SR, T>> fieldPaths) {
169170
super( commonState, fieldPaths );
170171
}
171172

172173
@Override
173-
public MatchPredicateFieldMoreStepFieldReference<SR, T> field(MatchPredicateFieldReference<SR, T> field) {
174+
public MatchPredicateFieldMoreStepFieldReference<SR, T> field(MatchPredicateFieldReference<? super SR, T> field) {
174175
return new MatchPredicateFieldMoreStepFieldReference<>( commonState, Collections.singletonList( field ) );
175176
}
176177

177178
@Override
178179
@SuppressWarnings("unchecked")
179-
public MatchPredicateFieldMoreStepFieldReference<SR, T> fields(MatchPredicateFieldReference<SR, T>... fieldPaths) {
180+
public MatchPredicateFieldMoreStepFieldReference<SR, T> fields(
181+
MatchPredicateFieldReference<? super SR, T>... fieldPaths) {
180182
return new MatchPredicateFieldMoreStepFieldReference<>( commonState, Arrays.asList( fieldPaths ) );
181183
}
182184

@@ -191,13 +193,15 @@ protected MatchPredicateFieldMoreStepFieldReference<SR, T> thisAsS() {
191193
}
192194

193195
@Override
194-
protected String fieldPath(MatchPredicateFieldReference<SR, T> field) {
196+
protected String fieldPath(MatchPredicateFieldReference<? super SR, T> field) {
195197
return field.absolutePath();
196198
}
197199

198200
private static class CommonState<SR, T>
199201
extends
200-
GenericCommonState<T, MatchPredicateFieldReference<SR, T>, MatchPredicateFieldMoreStepFieldReference<SR, T>> {
202+
GenericCommonState<T,
203+
MatchPredicateFieldReference<? super SR, T>,
204+
MatchPredicateFieldMoreStepFieldReference<SR, T>> {
201205
CommonState(SearchPredicateDslContext<?> dslContext) {
202206
super( dslContext );
203207
}
@@ -206,7 +210,7 @@ CommonState<SR, T> matching(T value) {
206210
Contracts.assertNotNull( value, "value" );
207211

208212
for ( MatchPredicateFieldMoreStepFieldReference<SR, T> fieldSetState : getFieldSetStates() ) {
209-
for ( Map.Entry<MatchPredicateFieldReference<SR, T>,
213+
for ( Map.Entry<MatchPredicateFieldReference<? super SR, T>,
210214
MatchPredicateBuilder> entry : fieldSetState.predicateBuilders
211215
.entrySet() ) {
212216
entry.getValue().value( value, entry.getKey().valueModel() );

0 commit comments

Comments
 (0)