Skip to content

Commit edfbab4

Browse files
committed
HSEARCH-5385 Update projection definition context
1 parent 4a7310c commit edfbab4

File tree

27 files changed

+115
-113
lines changed

27 files changed

+115
-113
lines changed

documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/constructorparameter/MyFieldProjectionBinder.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import org.hibernate.search.engine.search.projection.SearchProjection;
88
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinition;
99
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinitionContext;
10-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
1110
import org.hibernate.search.mapper.pojo.search.definition.binding.ProjectionBinder;
1211
import org.hibernate.search.mapper.pojo.search.definition.binding.ProjectionBindingContext;
1312

@@ -31,9 +30,8 @@ private MyProjectionDefinition(String fieldName) {
3130
}
3231

3332
@Override
34-
public SearchProjection<String> create(TypedSearchProjectionFactory<?, ?, ?> factory,
35-
ProjectionDefinitionContext context) {
36-
return factory.field( fieldName, String.class ) // <3>
33+
public SearchProjection<String> create(ProjectionDefinitionContext context) {
34+
return context.projection().field( fieldName, String.class ) // <3>
3735
.toProjection();
3836
}
3937
}

documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/multi/MyFieldProjectionBinder.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import org.hibernate.search.engine.search.projection.SearchProjection;
1212
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinition;
1313
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinitionContext;
14-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
1514
import org.hibernate.search.mapper.pojo.model.PojoModelValue;
1615
import org.hibernate.search.mapper.pojo.search.definition.binding.ProjectionBinder;
1716
import org.hibernate.search.mapper.pojo.search.definition.binding.ProjectionBindingContext;
@@ -32,9 +31,8 @@ public void bind(ProjectionBindingContext context) {
3231
private static class MyProjectionDefinition
3332
implements ProjectionDefinition<List<String>> { // <4>
3433
@Override
35-
public SearchProjection<List<String>> create(TypedSearchProjectionFactory<?, ?, ?> factory,
36-
ProjectionDefinitionContext context) {
37-
return factory.field( "tags", String.class )
34+
public SearchProjection<List<String>> create(ProjectionDefinitionContext context) {
35+
return context.projection().field( "tags", String.class )
3836
.collector( ProjectionCollector.list() ) // <4>
3937
.toProjection();
4038
}

documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/param/annotation/MyFieldProjectionBinder.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import org.hibernate.search.engine.search.projection.SearchProjection;
88
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinition;
99
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinitionContext;
10-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
1110
import org.hibernate.search.mapper.pojo.search.definition.binding.ProjectionBinder;
1211
import org.hibernate.search.mapper.pojo.search.definition.binding.ProjectionBindingContext;
1312

@@ -39,9 +38,8 @@ public MyProjectionDefinition(String fieldName) { // <2>
3938
}
4039

4140
@Override
42-
public SearchProjection<String> create(TypedSearchProjectionFactory<?, ?, ?> factory,
43-
ProjectionDefinitionContext context) {
44-
return factory.field( fieldName, String.class ) // <3>
41+
public SearchProjection<String> create(ProjectionDefinitionContext context) {
42+
return context.projection().field( fieldName, String.class ) // <3>
4543
.toProjection();
4644
}
4745
}

documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/param/string/MyFieldProjectionBinder.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import org.hibernate.search.engine.search.projection.SearchProjection;
88
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinition;
99
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinitionContext;
10-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
1110
import org.hibernate.search.mapper.pojo.search.definition.binding.ProjectionBinder;
1211
import org.hibernate.search.mapper.pojo.search.definition.binding.ProjectionBindingContext;
1312

@@ -32,9 +31,8 @@ public MyProjectionDefinition(String fieldName) { // <2>
3231
}
3332

3433
@Override
35-
public SearchProjection<String> create(TypedSearchProjectionFactory<?, ?, ?> factory,
36-
ProjectionDefinitionContext context) {
37-
return factory.field( fieldName, String.class ) // <3>
34+
public SearchProjection<String> create(ProjectionDefinitionContext context) {
35+
return context.projection().field( fieldName, String.class ) // <3>
3836
.toProjection();
3937
}
4038
}

documentation/src/test/java/org/hibernate/search/documentation/mapper/orm/binding/projectionbinder/simple/MyFieldProjectionBinder.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import org.hibernate.search.engine.search.projection.SearchProjection;
88
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinition;
99
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinitionContext;
10-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
1110
import org.hibernate.search.mapper.pojo.search.definition.binding.ProjectionBinder;
1211
import org.hibernate.search.mapper.pojo.search.definition.binding.ProjectionBindingContext;
1312

@@ -29,9 +28,8 @@ public void bind(ProjectionBindingContext context) { // <2>
2928
private static class MyProjectionDefinition // <1>
3029
implements ProjectionDefinition<String> { // <2>
3130
@Override
32-
public SearchProjection<String> create(TypedSearchProjectionFactory<?, ?, ?> factory,
33-
ProjectionDefinitionContext context) {
34-
return factory.field( "title", String.class ) // <3>
31+
public SearchProjection<String> create(ProjectionDefinitionContext context) {
32+
return context.projection().field( "title", String.class ) // <3>
3533
.toProjection(); // <4>
3634
}
3735
}

engine/src/main/java/org/hibernate/search/engine/search/projection/definition/ProjectionDefinition.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
package org.hibernate.search.engine.search.projection.definition;
66

77
import org.hibernate.search.engine.search.predicate.SearchPredicate;
8-
import org.hibernate.search.engine.search.predicate.dsl.TypedSearchPredicateFactory;
98
import org.hibernate.search.engine.search.projection.SearchProjection;
10-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
9+
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
1110
import org.hibernate.search.util.common.annotation.Incubating;
1211

1312
/**
@@ -31,13 +30,27 @@ public interface ProjectionDefinition<P> {
3130
* If the projection is used in the context of an object field,
3231
* this factory expects field paths to be provided relative to that same object field.
3332
* This factory is only valid in the present context and must not be used after
34-
* {@link ProjectionDefinition#create(TypedSearchProjectionFactory, ProjectionDefinitionContext)} returns.
33+
* {@link ProjectionDefinition#create(SearchProjectionFactory, ProjectionDefinitionContext)} returns.
3534
* @param context The context in which the definition is applied.
3635
* @return The created {@link SearchPredicate}.
3736
* @throws RuntimeException If the creation of the projection fails.
38-
* @see TypedSearchPredicateFactory
37+
* @see SearchProjectionFactory
3938
* @see ProjectionDefinitionContext
39+
* @deprecated Use {@link #create(ProjectionDefinitionContext)} and {@link ProjectionDefinitionContext#projection()} instead.
4040
*/
41-
SearchProjection<? extends P> create(TypedSearchProjectionFactory<?, ?, ?> factory, ProjectionDefinitionContext context);
41+
@Deprecated(since = "8.0", forRemoval = true)
42+
default SearchProjection<? extends P> create(SearchProjectionFactory<?, ?> factory, ProjectionDefinitionContext context) {
43+
return create( context );
44+
}
4245

46+
/**
47+
* Creates a projection with a specific projected type.
48+
*
49+
* @param context The context in which the definition is applied.
50+
* @return The created {@link SearchPredicate}.
51+
* @throws RuntimeException If the creation of the projection fails.
52+
* @see SearchProjectionFactory
53+
* @see ProjectionDefinitionContext
54+
*/
55+
SearchProjection<? extends P> create(ProjectionDefinitionContext context);
4356
}

engine/src/main/java/org/hibernate/search/engine/search/projection/definition/ProjectionDefinitionContext.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,23 @@
44
*/
55
package org.hibernate.search.engine.search.projection.definition;
66

7-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
7+
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
88
import org.hibernate.search.util.common.annotation.Incubating;
99

1010
/**
11-
* The context passed to {@link ProjectionDefinition#create(TypedSearchProjectionFactory, ProjectionDefinitionContext)}.
12-
* @see ProjectionDefinition#create(TypedSearchProjectionFactory, ProjectionDefinitionContext)
11+
* The context passed to {@link ProjectionDefinition#create(ProjectionDefinitionContext)}.
12+
* @see ProjectionDefinition#create(ProjectionDefinitionContext)
1313
*/
1414
@Incubating
1515
public interface ProjectionDefinitionContext {
16+
/**
17+
* @return A projection factory.
18+
* If the projection is used in the context of an object field,
19+
* this factory expects field paths to be provided relative to that same object field.
20+
* This factory is only valid in the present context and must not be used after
21+
* {@link ProjectionDefinition#create(ProjectionDefinitionContext)} returns.
22+
*/
23+
SearchProjectionFactory<?, ?> projection();
1624

25+
ProjectionDefinitionContext withRoot(String fieldPath);
1726
}

engine/src/main/java/org/hibernate/search/engine/search/projection/definition/impl/DefaultProjectionDefinitionContext.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
package org.hibernate.search.engine.search.projection.definition.impl;
66

77
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinitionContext;
8+
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
89

9-
public final class DefaultProjectionDefinitionContext
10+
public record DefaultProjectionDefinitionContext(SearchProjectionFactory<?, ?> projection)
1011
implements ProjectionDefinitionContext {
11-
// TODO HSEARCH-4806/HSEARCH-4807 have the query create an instance when instantiating projections
12-
public static final DefaultProjectionDefinitionContext INSTANCE =
13-
new DefaultProjectionDefinitionContext();
1412

15-
private DefaultProjectionDefinitionContext() {
13+
@Override
14+
public ProjectionDefinitionContext withRoot(String fieldPath) {
15+
return new DefaultProjectionDefinitionContext( projection.withRoot( fieldPath ) );
1616
}
1717
}

engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/CompositeProjectionDefinition.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,25 @@
99
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinitionContext;
1010
import org.hibernate.search.engine.search.projection.dsl.CompositeProjectionInnerStep;
1111
import org.hibernate.search.engine.search.projection.dsl.CompositeProjectionValueStep;
12-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
12+
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
1313

1414
public interface CompositeProjectionDefinition<T> extends ProjectionDefinition<T>, AutoCloseable {
1515

16+
@SuppressWarnings("removal")
17+
@Deprecated(since = "8.0", forRemoval = true)
1618
@Override
17-
default SearchProjection<? extends T> create(TypedSearchProjectionFactory<?, ?, ?> factory,
18-
ProjectionDefinitionContext context) {
19-
return apply( factory, factory.composite(), context ).toProjection();
19+
default SearchProjection<? extends T> create(SearchProjectionFactory<?, ?> factory, ProjectionDefinitionContext context) {
20+
var projection = context.projection();
21+
return apply( projection.composite(), context ).toProjection();
2022
}
2123

22-
CompositeProjectionValueStep<?, T> apply(TypedSearchProjectionFactory<?, ?, ?> projectionFactory,
23-
CompositeProjectionInnerStep initialStep,
24+
@Override
25+
default SearchProjection<? extends T> create(ProjectionDefinitionContext context) {
26+
var projection = context.projection();
27+
return apply( projection.composite(), context ).toProjection();
28+
}
29+
30+
CompositeProjectionValueStep<?, T> apply(CompositeProjectionInnerStep initialStep,
2431
ProjectionDefinitionContext context);
2532

2633
/**

engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/ConstantProjectionDefinition.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import org.hibernate.search.engine.search.projection.ProjectionCollector;
1515
import org.hibernate.search.engine.search.projection.SearchProjection;
1616
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinitionContext;
17-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
1817
import org.hibernate.search.util.common.annotation.Incubating;
1918
import org.hibernate.search.util.common.spi.ToStringTreeAppender;
2019

@@ -91,8 +90,7 @@ public void appendTo(ToStringTreeAppender appender) {
9190
}
9291

9392
@Override
94-
public SearchProjection<T> create(TypedSearchProjectionFactory<?, ?, ?> factory,
95-
ProjectionDefinitionContext context) {
96-
return factory.constant( value ).toProjection();
93+
public SearchProjection<T> create(ProjectionDefinitionContext context) {
94+
return context.projection().constant( value ).toProjection();
9795
}
9896
}

engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/DistanceProjectionDefinition.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import org.hibernate.search.engine.search.projection.ProjectionCollector;
1010
import org.hibernate.search.engine.search.projection.SearchProjection;
1111
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinitionContext;
12-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
1312
import org.hibernate.search.engine.spatial.DistanceUnit;
1413
import org.hibernate.search.engine.spatial.GeoPoint;
1514
import org.hibernate.search.util.common.annotation.Incubating;
@@ -56,9 +55,8 @@ protected boolean multi() {
5655
}
5756

5857
@Override
59-
public SearchProjection<Double> create(TypedSearchProjectionFactory<?, ?, ?> factory,
60-
ProjectionDefinitionContext context) {
61-
return factory.withParameters( params -> factory
58+
public SearchProjection<Double> create(ProjectionDefinitionContext context) {
59+
return context.projection().withParameters( params -> context.projection()
6260
.distance( fieldPath, params.get( parameterName, GeoPoint.class ) )
6361
.unit( unit )
6462
).toProjection();
@@ -79,9 +77,8 @@ protected boolean multi() {
7977
}
8078

8179
@Override
82-
public SearchProjection<List<Double>> create(TypedSearchProjectionFactory<?, ?, ?> factory,
83-
ProjectionDefinitionContext context) {
84-
return factory.withParameters( params -> factory
80+
public SearchProjection<List<Double>> create(ProjectionDefinitionContext context) {
81+
return context.projection().withParameters( params -> context.projection()
8582
.distance( fieldPath, params.get( parameterName, GeoPoint.class ) )
8683
.collector( ProjectionCollector.list() )
8784
.unit( unit )
@@ -105,9 +102,8 @@ protected boolean multi() {
105102
}
106103

107104
@Override
108-
public SearchProjection<C> create(TypedSearchProjectionFactory<?, ?, ?> factory,
109-
ProjectionDefinitionContext context) {
110-
return factory.withParameters( params -> factory
105+
public SearchProjection<C> create(ProjectionDefinitionContext context) {
106+
return context.projection().withParameters( params -> context.projection()
111107
.distance( fieldPath, params.get( parameterName, GeoPoint.class ) )
112108
.collector( collector )
113109
.unit( unit )

engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/FieldProjectionDefinition.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import org.hibernate.search.engine.search.projection.ProjectionCollector;
1111
import org.hibernate.search.engine.search.projection.SearchProjection;
1212
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinitionContext;
13-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
1413
import org.hibernate.search.util.common.annotation.Incubating;
1514
import org.hibernate.search.util.common.spi.ToStringTreeAppender;
1615

@@ -56,9 +55,8 @@ protected boolean multi() {
5655
}
5756

5857
@Override
59-
public SearchProjection<F> create(TypedSearchProjectionFactory<?, ?, ?> factory,
60-
ProjectionDefinitionContext context) {
61-
return factory.field( fieldPath, fieldType, valueModel ).toProjection();
58+
public SearchProjection<F> create(ProjectionDefinitionContext context) {
59+
return context.projection().field( fieldPath, fieldType, valueModel ).toProjection();
6260
}
6361
}
6462

@@ -76,9 +74,8 @@ protected boolean multi() {
7674
}
7775

7876
@Override
79-
public SearchProjection<List<F>> create(TypedSearchProjectionFactory<?, ?, ?> factory,
80-
ProjectionDefinitionContext context) {
81-
return factory.field( fieldPath, fieldType, valueModel )
77+
public SearchProjection<List<F>> create(ProjectionDefinitionContext context) {
78+
return context.projection().field( fieldPath, fieldType, valueModel )
8279
.collector( ProjectionCollector.list() ).toProjection();
8380
}
8481
}
@@ -99,9 +96,8 @@ protected boolean multi() {
9996
}
10097

10198
@Override
102-
public SearchProjection<C> create(TypedSearchProjectionFactory<?, ?, ?> factory,
103-
ProjectionDefinitionContext context) {
104-
return factory.field( fieldPath, fieldType, valueModel )
99+
public SearchProjection<C> create(ProjectionDefinitionContext context) {
100+
return context.projection().field( fieldPath, fieldType, valueModel )
105101
.collector( collector ).toProjection();
106102
}
107103
}

engine/src/main/java/org/hibernate/search/engine/search/projection/definition/spi/ObjectProjectionDefinition.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import org.hibernate.search.engine.search.projection.ProjectionCollector;
1010
import org.hibernate.search.engine.search.projection.SearchProjection;
1111
import org.hibernate.search.engine.search.projection.definition.ProjectionDefinitionContext;
12-
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
1312
import org.hibernate.search.util.common.annotation.Incubating;
1413
import org.hibernate.search.util.common.spi.ToStringTreeAppender;
1514

@@ -59,9 +58,9 @@ protected boolean multi() {
5958
}
6059

6160
@Override
62-
public SearchProjection<T> create(TypedSearchProjectionFactory<?, ?, ?> factory,
63-
ProjectionDefinitionContext context) {
64-
return delegate.apply( factory.withRoot( fieldPath ), factory.object( fieldPath ), context )
61+
public SearchProjection<T> create(ProjectionDefinitionContext context) {
62+
var projection = context.projection();
63+
return delegate.apply( projection.object( fieldPath ), context.withRoot( fieldPath ) )
6564
.toProjection();
6665
}
6766
}
@@ -80,9 +79,8 @@ protected boolean multi() {
8079
}
8180

8281
@Override
83-
public SearchProjection<List<T>> create(TypedSearchProjectionFactory<?, ?, ?> factory,
84-
ProjectionDefinitionContext context) {
85-
return delegate.apply( factory.withRoot( fieldPath ), factory.object( fieldPath ), context )
82+
public SearchProjection<List<T>> create(ProjectionDefinitionContext context) {
83+
return delegate.apply( context.projection().object( fieldPath ), context.withRoot( fieldPath ) )
8684
.collector( ProjectionCollector.list() ).toProjection();
8785
}
8886
}
@@ -103,9 +101,8 @@ protected boolean multi() {
103101
}
104102

105103
@Override
106-
public SearchProjection<C> create(TypedSearchProjectionFactory<?, ?, ?> factory,
107-
ProjectionDefinitionContext context) {
108-
return delegate.apply( factory.withRoot( fieldPath ), factory.object( fieldPath ), context )
104+
public SearchProjection<C> create(ProjectionDefinitionContext context) {
105+
return delegate.apply( context.projection().object( fieldPath ), context.withRoot( fieldPath ) )
109106
.collector( collector ).toProjection();
110107
}
111108
}

engine/src/main/java/org/hibernate/search/engine/search/projection/dsl/impl/CompositeProjectionInnerStepImpl.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.hibernate.search.engine.search.projection.dsl.CompositeProjectionInnerStep;
1414
import org.hibernate.search.engine.search.projection.dsl.CompositeProjectionValueStep;
1515
import org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep;
16+
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
1617
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
1718
import org.hibernate.search.engine.search.projection.dsl.spi.SearchProjectionDslContext;
1819
import org.hibernate.search.engine.search.projection.spi.CompositeProjectionBuilder;
@@ -48,9 +49,9 @@ public <V> CompositeProjectionValueStep<?, V> as(Class<V> objectClass) {
4849
? projectionFactory
4950
: projectionFactory.withRoot( objectFieldPath );
5051
return dslContext.scope().projectionRegistry().composite( objectClass )
51-
.apply( projectionFactoryWithCorrectRoot, this,
52-
// TODO HSEARCH-4806/HSEARCH-4807 pass an actual context with parameters
53-
DefaultProjectionDefinitionContext.INSTANCE );
52+
// TODO: fix this cast:
53+
.apply( this, new DefaultProjectionDefinitionContext(
54+
(SearchProjectionFactory<?, ?>) projectionFactoryWithCorrectRoot ) );
5455
}
5556

5657
@Override

0 commit comments

Comments
 (0)