Skip to content

Commit aaf4fff

Browse files
committed
HSEARCH-3319 Address super-type references
1 parent eeace91 commit aaf4fff

23 files changed

+134
-67
lines changed

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

+9-8
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ void smoke() {
6767
.fetchHits( 20 )
6868
).containsOnly( "c" );
6969

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

7279
SearchPredicate searchPredicate =
@@ -200,30 +207,24 @@ public static class EntityA_ {
200207
}
201208
}
202209

203-
public static class EntityB_ {
204-
public static ValueFieldReference1<EntityB_, String, String, String> stringA;
210+
public static class EntityB_ extends EntityA_ {
205211
public static ValueFieldReference1<EntityB_, String, String, String> stringB;
206212

207213
public static RootReferenceScope<EntityB_, EntityB> scope;
208214

209215
static {
210-
stringA = ValueFieldReference1.of( "stringA", EntityB_.class, String.class, String.class, String.class );
211216
stringB = ValueFieldReference1.of( "stringB", EntityB_.class, String.class, String.class, String.class );
212217

213218
scope = RootReferenceScopeImpl.of( EntityB_.class, EntityB.class );
214219
}
215220
}
216221

217-
public static class EntityC_ {
218-
public static ValueFieldReference1<EntityC_, String, String, String> stringA;
219-
public static ValueFieldReference1<EntityC_, String, String, String> stringB;
222+
public static class EntityC_ extends EntityB_ {
220223
public static ValueFieldReference1<EntityC_, String, String, String> stringC;
221224

222225
public static RootReferenceScope<EntityC_, EntityC> scope;
223226

224227
static {
225-
stringA = ValueFieldReference1.of( "stringA", EntityC_.class, String.class, String.class, String.class );
226-
stringB = ValueFieldReference1.of( "stringB", EntityC_.class, String.class, String.class, String.class );
227228
stringC = ValueFieldReference1.of( "stringC", EntityC_.class, String.class, String.class, String.class );
228229

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

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

+12
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import org.hibernate.search.engine.search.common.ValueConvert;
1212
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
13+
import org.hibernate.search.engine.search.reference.aggregation.RangeAggregationFieldReference;
1314

1415
/**
1516
* The initial step in a "range" aggregation definition, where the target field can be set.
@@ -43,4 +44,15 @@ public interface RangeAggregationFieldStep<SR, PDF extends SearchPredicateFactor
4344
*/
4445
<F> RangeAggregationRangeStep<SR, ?, PDF, F> field(String fieldPath, Class<F> type, ValueConvert convert);
4546

47+
/**
48+
* Target the given field in the range aggregation.
49+
*
50+
* @param fieldReference The field reference representing a <a href="SearchAggregationFactory.html#field-paths">path</a> to the index field to aggregate.
51+
* @param <F> The type of field values.
52+
* @return The next step.
53+
*/
54+
default <F> RangeAggregationRangeStep<SR, ?, PDF, F> field(RangeAggregationFieldReference<? super SR, F> fieldReference) {
55+
return field( fieldReference.absolutePath(), fieldReference.aggregationType(), fieldReference.valueConvert() );
56+
}
57+
4658
}

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

+15
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.function.Function;
1010

1111
import org.hibernate.search.engine.search.common.NamedValues;
12+
import org.hibernate.search.engine.search.reference.object.ObjectFieldReference;
1213
import org.hibernate.search.util.common.SearchException;
1314
import org.hibernate.search.util.common.annotation.Incubating;
1415

@@ -101,6 +102,20 @@ <T> AggregationFinalStep<T> withParameters(
101102
@Incubating
102103
SearchAggregationFactory<SR> withRoot(String objectFieldPath);
103104

105+
/**
106+
* Create a new aggregation factory whose root for all paths passed to the DSL
107+
* will be the given object field.
108+
* <p>
109+
* See <a href="#field-paths">here</a> for more information.
110+
*
111+
* @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root.
112+
* @return A new aggregation factory using the given object field as root.
113+
*/
114+
@Incubating
115+
default SearchAggregationFactory<SR> withRoot(ObjectFieldReference<? super SR> objectFieldReference) {
116+
return withRoot( objectFieldReference.absolutePath() );
117+
}
118+
104119
/**
105120
* @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory.
106121
* @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

+13
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import org.hibernate.search.engine.search.common.ValueConvert;
1313
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
14+
import org.hibernate.search.engine.search.reference.aggregation.TermsAggregationFieldReference;
1415

1516
/**
1617
* The initial step in a "terms" aggregation definition, where the target field can be set.
@@ -45,4 +46,16 @@ public interface TermsAggregationFieldStep<SR, PDF extends SearchPredicateFactor
4546
<F> TermsAggregationOptionsStep<SR, ?, PDF, F, Map<F, Long>> field(String fieldPath, Class<F> type,
4647
ValueConvert convert);
4748

49+
/**
50+
* Target the given field in the terms aggregation.
51+
*
52+
* @param fieldReference The field reference representing a <a href="SearchAggregationFactory.html#field-paths">path</a> to the index field to aggregate.
53+
* @param <F> The type of field values.
54+
* @return The next step.
55+
*/
56+
default <F> TermsAggregationOptionsStep<SR, ?, PDF, F, Map<F, Long>> field(
57+
TermsAggregationFieldReference<? super SR, F> fieldReference) {
58+
return field( fieldReference.absolutePath(), fieldReference.aggregationType(), fieldReference.valueConvert() );
59+
}
60+
4861
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public interface ExistsPredicateFieldStep<SR, N extends ExistsPredicateOptionsSt
3333
* @return The next step.
3434
*/
3535
@Incubating
36-
default N field(ExistsPredicateFieldReference<SR> field) {
36+
default N field(ExistsPredicateFieldReference<? super SR> field) {
3737
return field( field.absolutePath() );
3838
}
3939

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ public interface KnnPredicateFieldStep<SR> {
2222
*/
2323
KnnPredicateVectorStep<SR> field(String fieldPath);
2424

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

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ default N field(String fieldPath) {
6161
* @return The next step.
6262
*/
6363
@SuppressWarnings("unchecked")
64-
default <T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<SR, T>> field(
65-
MatchPredicateFieldReference<SR, T> fieldReference) {
64+
default <T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<? super SR, T>> field(
65+
MatchPredicateFieldReference<? super SR, T> fieldReference) {
6666
return fields( fieldReference );
6767
}
6868

@@ -82,6 +82,6 @@ default N field(String fieldPath) {
8282
* @see #field(MatchPredicateFieldReference)
8383
*/
8484
@SuppressWarnings("unchecked")
85-
<T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<SR, T>> fields(
86-
MatchPredicateFieldReference<SR, T>... fieldReferences);
85+
<T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<? super SR, T>> fields(
86+
MatchPredicateFieldReference<? super SR, T>... fieldReferences);
8787
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public interface NestedPredicateFieldStep<SR, N extends NestedPredicateNestStep<
3838
* to apply the predicate on.
3939
* @return The next step.
4040
*/
41-
default N objectField(NestedPredicateFieldReference<SR> field) {
41+
default N objectField(NestedPredicateFieldReference<? super SR> field) {
4242
return objectField( field.absolutePath() );
4343
}
4444

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ default S field(String fieldPath) {
7575
*/
7676
@Incubating
7777
@SuppressWarnings("unchecked")
78-
default S field(PhrasePredicateFieldReference<SR, ?> field) {
78+
default S field(PhrasePredicateFieldReference<? super SR, ?> field) {
7979
return fields( field );
8080
}
8181

@@ -95,7 +95,7 @@ default S field(PhrasePredicateFieldReference<SR, ?> field) {
9595
*/
9696
@Incubating
9797
@SuppressWarnings("unchecked")
98-
default S fields(PhrasePredicateFieldReference<SR, ?>... fields) {
98+
default S 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/PhrasePredicateFieldStep.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ default N field(String fieldPath) {
7474
*/
7575
@Incubating
7676
@SuppressWarnings("unchecked")
77-
default N field(PhrasePredicateFieldReference<SR, ?> field) {
77+
default N field(PhrasePredicateFieldReference<? super SR, ?> field) {
7878
return fields( field );
7979
}
8080

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

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ default N field(String fieldPath) {
6666
* @return The next step.
6767
*/
6868
@SuppressWarnings("unchecked")
69-
default <T> RangePredicateFieldMoreGenericStep<SR, ?, ?, RangePredicateFieldReference<SR, T>, T> field(
70-
RangePredicateFieldReference<SR, T> field) {
69+
default <T> RangePredicateFieldMoreGenericStep<SR, ?, ?, RangePredicateFieldReference<? super SR, T>, T> field(
70+
RangePredicateFieldReference<? super SR, T> field) {
7171
return fields( field );
7272
}
7373

@@ -87,7 +87,7 @@ default N field(String fieldPath) {
8787
* @see #field(RangePredicateFieldReference)
8888
*/
8989
@SuppressWarnings("unchecked")
90-
<T> RangePredicateFieldMoreGenericStep<SR, ?, ?, RangePredicateFieldReference<SR, T>, T> fields(
91-
RangePredicateFieldReference<SR, T>... fields);
90+
<T> RangePredicateFieldMoreGenericStep<SR, ?, ?, RangePredicateFieldReference<? super SR, T>, T> fields(
91+
RangePredicateFieldReference<? super SR, T>... fields);
9292

9393
}

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

+17-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.hibernate.search.engine.search.common.BooleanOperator;
1414
import org.hibernate.search.engine.search.common.NamedValues;
1515
import org.hibernate.search.engine.search.predicate.SearchPredicate;
16+
import org.hibernate.search.engine.search.reference.object.ObjectFieldReference;
1617
import org.hibernate.search.engine.search.reference.predicate.NestedPredicateFieldReference;
1718
import org.hibernate.search.util.common.SearchException;
1819
import org.hibernate.search.util.common.annotation.Incubating;
@@ -248,7 +249,7 @@ SimpleBooleanPredicateOptionsStep<?> or(PredicateFinalStep firstSearchPredicate,
248249
* @return The initial step of a DSL where the "nested" predicate can be defined.
249250
* @see NestedPredicateFieldStep
250251
*/
251-
default NestedPredicateClausesStep<SR, ?> nested(NestedPredicateFieldReference<SR> field) {
252+
default NestedPredicateClausesStep<SR, ?> nested(NestedPredicateFieldReference<? super SR> field) {
252253
return nested( field.absolutePath() );
253254
}
254255

@@ -369,6 +370,21 @@ PredicateFinalStep withParameters(
369370
@Incubating
370371
SearchPredicateFactory<SR> withRoot(String objectFieldPath);
371372

373+
/**
374+
* Create a new predicate factory whose root for all paths passed to the DSL
375+
* will be the given object field.
376+
* <p>
377+
* This is used to call reusable methods that apply the same predicate
378+
* on different object fields that have same structure (same sub-fields).
379+
*
380+
* @param objectFieldReference The reference representing the path from the current root to an object field that will become the new root.
381+
* @return A new predicate factory using the given object field as root.
382+
*/
383+
@Incubating
384+
default SearchPredicateFactory<SR> withRoot(ObjectFieldReference<? super SR> objectFieldReference) {
385+
return withRoot( objectFieldReference.absolutePath() );
386+
}
387+
372388
/**
373389
* @param relativeFieldPath The path to a field, relative to the {@link #withRoot(String) root} of this factory.
374390
* @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

+16-12
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,12 @@ abstract class AbstractMatchPredicateFieldMoreStep<
5353
);
5454
}
5555

56-
public static <SR, T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<SR, T>> create(
57-
SearchPredicateDslContext<?> dslContext, MatchPredicateFieldReference<SR, T>[] fields) {
56+
public static <SR, T> MatchPredicateFieldMoreGenericStep<?, ?, T, MatchPredicateFieldReference<? super SR, T>> create(
57+
SearchPredicateDslContext<?> dslContext, MatchPredicateFieldReference<? super SR, T>[] fields) {
58+
List<MatchPredicateFieldReference<? super SR, T>> fieldList = Arrays.asList( fields );
5859
return new MatchPredicateFieldMoreStepFieldReference<>(
5960
dslContext,
60-
Arrays.asList( fields )
61+
fieldList
6162
);
6263
}
6364

@@ -158,31 +159,32 @@ private static class MatchPredicateFieldMoreStepFieldReference<SR, T>
158159
AbstractMatchPredicateFieldMoreStep<MatchPredicateFieldMoreStepFieldReference.CommonState<SR, T>,
159160
MatchPredicateFieldMoreStepFieldReference<SR, T>,
160161
T,
161-
MatchPredicateFieldReference<SR, T>>
162+
MatchPredicateFieldReference<? super SR, T>>
162163
implements
163164
MatchPredicateFieldMoreGenericStep<MatchPredicateFieldMoreStepFieldReference<SR, T>,
164165
MatchPredicateFieldMoreStepFieldReference.CommonState<SR, T>,
165166
T,
166-
MatchPredicateFieldReference<SR, T>> {
167+
MatchPredicateFieldReference<? super SR, T>> {
167168

168169
MatchPredicateFieldMoreStepFieldReference(SearchPredicateDslContext<?> dslContext,
169-
List<MatchPredicateFieldReference<SR, T>> fieldPaths) {
170+
List<MatchPredicateFieldReference<? super SR, T>> fieldPaths) {
170171
super( new CommonState<>( dslContext ), fieldPaths );
171172
}
172173

173174
private MatchPredicateFieldMoreStepFieldReference(CommonState<SR, T> commonState,
174-
List<MatchPredicateFieldReference<SR, T>> fieldPaths) {
175+
List<MatchPredicateFieldReference<? super SR, T>> fieldPaths) {
175176
super( commonState, fieldPaths );
176177
}
177178

178179
@Override
179-
public MatchPredicateFieldMoreStepFieldReference<SR, T> field(MatchPredicateFieldReference<SR, T> field) {
180+
public MatchPredicateFieldMoreStepFieldReference<SR, T> field(MatchPredicateFieldReference<? super SR, T> field) {
180181
return new MatchPredicateFieldMoreStepFieldReference<>( commonState, Collections.singletonList( field ) );
181182
}
182183

183184
@Override
184185
@SuppressWarnings("unchecked")
185-
public MatchPredicateFieldMoreStepFieldReference<SR, T> fields(MatchPredicateFieldReference<SR, T>... fieldPaths) {
186+
public MatchPredicateFieldMoreStepFieldReference<SR, T> fields(
187+
MatchPredicateFieldReference<? super SR, T>... fieldPaths) {
186188
return new MatchPredicateFieldMoreStepFieldReference<>( commonState, Arrays.asList( fieldPaths ) );
187189
}
188190

@@ -197,13 +199,15 @@ protected MatchPredicateFieldMoreStepFieldReference<SR, T> thisAsS() {
197199
}
198200

199201
@Override
200-
protected String fieldPath(MatchPredicateFieldReference<SR, T> field) {
202+
protected String fieldPath(MatchPredicateFieldReference<? super SR, T> field) {
201203
return field.absolutePath();
202204
}
203205

204206
private static class CommonState<SR, T>
205207
extends
206-
GenericCommonState<T, MatchPredicateFieldReference<SR, T>, MatchPredicateFieldMoreStepFieldReference<SR, T>> {
208+
GenericCommonState<T,
209+
MatchPredicateFieldReference<? super SR, T>,
210+
MatchPredicateFieldMoreStepFieldReference<SR, T>> {
207211
CommonState(SearchPredicateDslContext<?> dslContext) {
208212
super( dslContext );
209213
}
@@ -212,7 +216,7 @@ CommonState<SR, T> matching(T value) {
212216
Contracts.assertNotNull( value, "value" );
213217

214218
for ( MatchPredicateFieldMoreStepFieldReference<SR, T> fieldSetState : getFieldSetStates() ) {
215-
for ( Map.Entry<MatchPredicateFieldReference<SR, T>,
219+
for ( Map.Entry<MatchPredicateFieldReference<? super SR, T>,
216220
MatchPredicateBuilder> entry : fieldSetState.predicateBuilders
217221
.entrySet() ) {
218222
entry.getValue().value( value, entry.getKey().valueConvert() );

0 commit comments

Comments
 (0)