Skip to content

Commit

Permalink
HSEARCH-3476 Use a dedicated object to store the context for the proj…
Browse files Browse the repository at this point in the history
…ection DSL

Mainly for consistency with all the other search DSLs.
  • Loading branch information
yrodiere committed Jun 19, 2020
1 parent 0832d20 commit a687b14
Show file tree
Hide file tree
Showing 19 changed files with 160 additions and 81 deletions.
Expand Up @@ -41,7 +41,7 @@
import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext;
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactoryExtension;
import org.hibernate.search.engine.search.projection.spi.SearchProjectionBuilderFactory;
import org.hibernate.search.engine.search.projection.dsl.spi.SearchProjectionDslContext;
import org.hibernate.search.engine.search.query.SearchQuery;
import org.hibernate.search.engine.search.query.SearchQueryExtension;
import org.hibernate.search.engine.search.query.dsl.SearchQueryDslExtension;
Expand Down Expand Up @@ -186,11 +186,13 @@ public Optional<ElasticsearchSearchSortFactory> extendOptional(
* {@inheritDoc}
*/
@Override
public Optional<ElasticsearchSearchProjectionFactory<R, E>> extendOptional(
SearchProjectionFactory<R, E> original, SearchProjectionBuilderFactory factory) {
if ( factory instanceof ElasticsearchSearchProjectionBuilderFactory ) {
@SuppressWarnings("unchecked") // If the factory is an instance of ElasticsearchSearchProjectionBuilderFactory, the cast is safe
public Optional<ElasticsearchSearchProjectionFactory<R, E>> extendOptional(SearchProjectionFactory<R, E> original,
SearchProjectionDslContext<?> dslContext) {
if ( dslContext.builderFactory() instanceof ElasticsearchSearchProjectionBuilderFactory ) {
return Optional.of( new ElasticsearchSearchProjectionFactoryImpl<>(
original, (ElasticsearchSearchProjectionBuilderFactory) factory
original,
(SearchProjectionDslContext<ElasticsearchSearchProjectionBuilderFactory>) dslContext
) );
}
else {
Expand Down
Expand Up @@ -11,6 +11,7 @@
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
import org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep;
import org.hibernate.search.engine.search.projection.dsl.spi.DelegatingSearchProjectionFactory;
import org.hibernate.search.engine.search.projection.dsl.spi.SearchProjectionDslContext;
import org.hibernate.search.engine.search.projection.dsl.spi.StaticProjectionFinalStep;

import com.google.gson.JsonObject;
Expand All @@ -19,26 +20,26 @@ public class ElasticsearchSearchProjectionFactoryImpl<R, E>
extends DelegatingSearchProjectionFactory<R, E>
implements ElasticsearchSearchProjectionFactory<R, E> {

private final ElasticsearchSearchProjectionBuilderFactory factory;
private final SearchProjectionDslContext<ElasticsearchSearchProjectionBuilderFactory> dslContext;

public ElasticsearchSearchProjectionFactoryImpl(SearchProjectionFactory<R, E> delegate,
ElasticsearchSearchProjectionBuilderFactory factory) {
SearchProjectionDslContext<ElasticsearchSearchProjectionBuilderFactory> dslContext) {
super( delegate );
this.factory = factory;
this.dslContext = dslContext;
}

@Override
public ProjectionFinalStep<JsonObject> source() {
return new StaticProjectionFinalStep<>( factory.source() );
return new StaticProjectionFinalStep<>( dslContext.builderFactory().source() );
}

@Override
public ProjectionFinalStep<JsonObject> explanation() {
return new StaticProjectionFinalStep<>( factory.explanation() );
return new StaticProjectionFinalStep<>( dslContext.builderFactory().explanation() );
}

@Override
public ProjectionFinalStep<JsonObject> jsonHit() {
return new StaticProjectionFinalStep<>( factory.jsonHit() );
return new StaticProjectionFinalStep<>( dslContext.builderFactory().jsonHit() );
}
}
Expand Up @@ -38,6 +38,7 @@
import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext;
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactoryExtension;
import org.hibernate.search.engine.search.projection.dsl.spi.SearchProjectionDslContext;
import org.hibernate.search.engine.search.query.dsl.SearchQueryDslExtension;
import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep;
import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory;
Expand All @@ -46,7 +47,6 @@
import org.hibernate.search.engine.backend.scope.spi.IndexScope;
import org.hibernate.search.engine.search.loading.context.spi.LoadingContext;
import org.hibernate.search.engine.search.loading.context.spi.LoadingContextBuilder;
import org.hibernate.search.engine.search.projection.spi.SearchProjectionBuilderFactory;
import org.hibernate.search.engine.search.query.SearchQuery;
import org.hibernate.search.engine.search.query.SearchQueryExtension;
import org.hibernate.search.util.common.logging.impl.LoggerFactory;
Expand Down Expand Up @@ -186,11 +186,13 @@ public Optional<LuceneSearchSortFactory> extendOptional(
* {@inheritDoc}
*/
@Override
public Optional<LuceneSearchProjectionFactory<R, E>> extendOptional(
SearchProjectionFactory<R, E> original, SearchProjectionBuilderFactory factory) {
if ( factory instanceof LuceneSearchProjectionBuilderFactory ) {
@SuppressWarnings("unchecked") // If the factory is an instance of LuceneSearchProjectionBuilderFactory, the cast is safe
public Optional<LuceneSearchProjectionFactory<R, E>> extendOptional(SearchProjectionFactory<R, E> original,
SearchProjectionDslContext<?> dslContext) {
if ( dslContext.builderFactory() instanceof LuceneSearchProjectionBuilderFactory ) {
return Optional.of( new LuceneSearchProjectionFactoryImpl<>(
original, (LuceneSearchProjectionBuilderFactory) factory
original,
(SearchProjectionDslContext<LuceneSearchProjectionBuilderFactory>) dslContext
) );
}
else {
Expand Down
Expand Up @@ -11,6 +11,7 @@
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
import org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep;
import org.hibernate.search.engine.search.projection.dsl.spi.DelegatingSearchProjectionFactory;
import org.hibernate.search.engine.search.projection.dsl.spi.SearchProjectionDslContext;
import org.hibernate.search.engine.search.projection.dsl.spi.StaticProjectionFinalStep;

import org.apache.lucene.document.Document;
Expand All @@ -20,21 +21,21 @@ public class LuceneSearchProjectionFactoryImpl<R, E>
extends DelegatingSearchProjectionFactory<R, E>
implements LuceneSearchProjectionFactory<R, E> {

private final LuceneSearchProjectionBuilderFactory factory;
private final SearchProjectionDslContext<LuceneSearchProjectionBuilderFactory> dslContext;

public LuceneSearchProjectionFactoryImpl(SearchProjectionFactory<R, E> delegate,
LuceneSearchProjectionBuilderFactory factory) {
SearchProjectionDslContext<LuceneSearchProjectionBuilderFactory> dslContext) {
super( delegate );
this.factory = factory;
this.dslContext = dslContext;
}

@Override
public ProjectionFinalStep<Document> document() {
return new StaticProjectionFinalStep<>( factory.document() );
return new StaticProjectionFinalStep<>( dslContext.builderFactory().document() );
}

@Override
public ProjectionFinalStep<Explanation> explanation() {
return new StaticProjectionFinalStep<>( factory.explanation() );
return new StaticProjectionFinalStep<>( dslContext.builderFactory().explanation() );
}
}
Expand Up @@ -18,6 +18,7 @@
import org.hibernate.search.engine.search.predicate.dsl.impl.SearchPredicateDslContextImpl;
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
import org.hibernate.search.engine.search.projection.dsl.impl.DefaultSearchProjectionFactory;
import org.hibernate.search.engine.search.projection.dsl.impl.SearchProjectionDslContextImpl;
import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep;
import org.hibernate.search.engine.search.query.dsl.impl.DefaultSearchQuerySelectStep;
import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory;
Expand Down Expand Up @@ -64,7 +65,9 @@ public SearchSortFactory sort() {

@Override
public SearchProjectionFactory<R, E> projection() {
return new DefaultSearchProjectionFactory<>( delegate.searchProjectionFactory() );
return new DefaultSearchProjectionFactory<>(
SearchProjectionDslContextImpl.root( delegate.searchProjectionFactory() )
);
}

@Override
Expand Down
Expand Up @@ -10,7 +10,7 @@
import java.util.Optional;

import org.hibernate.search.engine.search.projection.dsl.spi.DelegatingSearchProjectionFactory;
import org.hibernate.search.engine.search.projection.spi.SearchProjectionBuilderFactory;
import org.hibernate.search.engine.search.projection.dsl.spi.SearchProjectionDslContext;

/**
* An extension to the search projection DSL, allowing the use of non-standard projections in a query.
Expand All @@ -36,11 +36,11 @@ public interface SearchProjectionFactoryExtension<T, R, E> {
* <strong>WARNING:</strong> this method is not API, see comments at the type level.
*
* @param original The original, non-extended {@link SearchProjectionFactory}.
* @param factory A {@link SearchProjectionBuilderFactory}.
* @param dslContext A {@link SearchProjectionDslContext}.
* @return An optional containing the extended projection factory ({@link T}) in case
* of success, or an empty optional otherwise.
*/
Optional<T> extendOptional(SearchProjectionFactory<R, E> original,
SearchProjectionBuilderFactory factory);
SearchProjectionDslContext<?> dslContext);

}
Expand Up @@ -12,8 +12,8 @@

import org.hibernate.search.engine.search.projection.SearchProjection;
import org.hibernate.search.engine.search.projection.dsl.CompositeProjectionOptionsStep;
import org.hibernate.search.engine.search.projection.dsl.spi.SearchProjectionDslContext;
import org.hibernate.search.engine.search.projection.spi.CompositeProjectionBuilder;
import org.hibernate.search.engine.search.projection.spi.SearchProjectionBuilderFactory;
import org.hibernate.search.util.common.function.TriFunction;


Expand All @@ -22,31 +22,33 @@ public class CompositeProjectionOptionsStepImpl<T>

private final CompositeProjectionBuilder<T> compositeProjectionBuilder;

public CompositeProjectionOptionsStepImpl(SearchProjectionBuilderFactory factory,
public CompositeProjectionOptionsStepImpl(SearchProjectionDslContext<?> dslContext,
Function<List<?>, T> transformer,
SearchProjection<?>[] projections) {
this.compositeProjectionBuilder = factory.composite( transformer, projections );
this.compositeProjectionBuilder = dslContext.builderFactory().composite( transformer, projections );
}

public <P> CompositeProjectionOptionsStepImpl(SearchProjectionBuilderFactory factory,
public <P> CompositeProjectionOptionsStepImpl(SearchProjectionDslContext<?> dslContext,
Function<P, T> transformer,
SearchProjection<P> projection) {
this.compositeProjectionBuilder = factory.composite( transformer, projection );
this.compositeProjectionBuilder = dslContext.builderFactory().composite( transformer, projection );
}

public <P1, P2> CompositeProjectionOptionsStepImpl(SearchProjectionBuilderFactory factory,
public <P1, P2> CompositeProjectionOptionsStepImpl(SearchProjectionDslContext<?> dslContext,
BiFunction<P1, P2, T> transformer,
SearchProjection<P1> projection1,
SearchProjection<P2> projection2) {
this.compositeProjectionBuilder = factory.composite( transformer, projection1, projection2 );
this.compositeProjectionBuilder = dslContext.builderFactory()
.composite( transformer, projection1, projection2 );
}

public <P1, P2, P3> CompositeProjectionOptionsStepImpl(SearchProjectionBuilderFactory factory,
public <P1, P2, P3> CompositeProjectionOptionsStepImpl(SearchProjectionDslContext<?> dslContext,
TriFunction<P1, P2, P3, T> transformer,
SearchProjection<P1> projection1,
SearchProjection<P2> projection2,
SearchProjection<P3> projection3) {
this.compositeProjectionBuilder = factory.composite( transformer, projection1, projection2, projection3 );
this.compositeProjectionBuilder = dslContext.builderFactory()
.composite( transformer, projection1, projection2, projection3 );
}

@Override
Expand Down
Expand Up @@ -23,30 +23,29 @@
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactoryExtension;
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactoryExtensionIfSupportedStep;
import org.hibernate.search.engine.search.common.ValueConvert;
import org.hibernate.search.engine.search.projection.spi.SearchProjectionBuilderFactory;
import org.hibernate.search.engine.search.projection.dsl.spi.SearchProjectionDslContext;
import org.hibernate.search.engine.spatial.GeoPoint;
import org.hibernate.search.util.common.function.TriFunction;
import org.hibernate.search.util.common.impl.Contracts;


public class DefaultSearchProjectionFactory<R, E> implements SearchProjectionFactory<R, E> {

private final SearchProjectionBuilderFactory factory;
private final SearchProjectionDslContext<?> dslContext;

public DefaultSearchProjectionFactory(SearchProjectionBuilderFactory factory) {
this.factory = factory;
public DefaultSearchProjectionFactory(SearchProjectionDslContext<?> dslContext) {
this.dslContext = dslContext;
}

@Override
public DocumentReferenceProjectionOptionsStep<?> documentReference() {
return new DocumentReferenceProjectionOptionsStepImpl( factory );
return new DocumentReferenceProjectionOptionsStepImpl( dslContext );
}

@Override
public <T> FieldProjectionValueStep<?, T> field(String absoluteFieldPath, Class<T> clazz, ValueConvert convert) {
Contracts.assertNotNull( clazz, "clazz" );

return new FieldProjectionValueStepImpl<>( factory, absoluteFieldPath, clazz, convert );
return new FieldProjectionValueStepImpl<>( dslContext, absoluteFieldPath, clazz, convert );
}

@Override
Expand All @@ -56,24 +55,23 @@ public FieldProjectionValueStep<?, Object> field(String absoluteFieldPath, Value

@Override
public EntityReferenceProjectionOptionsStep<?, R> entityReference() {
return new EntityReferenceProjectionOptionsStepImpl<>( factory );
return new EntityReferenceProjectionOptionsStepImpl<>( dslContext );
}

@Override
public EntityProjectionOptionsStep<?, E> entity() {
return new EntityProjectionOptionsStepImpl<>( factory );
return new EntityProjectionOptionsStepImpl<>( dslContext );
}

@Override
public ScoreProjectionOptionsStep<?> score() {
return new ScoreProjectionOptionsStepImpl( factory );
return new ScoreProjectionOptionsStepImpl( dslContext );
}

@Override
public DistanceToFieldProjectionValueStep<?, Double> distance(String absoluteFieldPath, GeoPoint center) {
Contracts.assertNotNull( center, "center" );

return new DistanceToFieldProjectionValueStepImpl( factory, absoluteFieldPath, center );
return new DistanceToFieldProjectionValueStepImpl( dslContext, absoluteFieldPath, center );
}

@Override
Expand All @@ -82,15 +80,15 @@ public <T> CompositeProjectionOptionsStep<?, T> composite(Function<List<?>, T> t
Contracts.assertNotNull( transformer, "transformer" );
Contracts.assertNotNullNorEmpty( projections, "projections" );

return new CompositeProjectionOptionsStepImpl<>( factory, transformer, projections );
return new CompositeProjectionOptionsStepImpl<>( dslContext, transformer, projections );
}

@Override
public <P, T> CompositeProjectionOptionsStep<?, T> composite(Function<P, T> transformer, SearchProjection<P> projection) {
Contracts.assertNotNull( transformer, "transformer" );
Contracts.assertNotNull( projection, "projection" );

return new CompositeProjectionOptionsStepImpl<>( factory, transformer, projection );
return new CompositeProjectionOptionsStepImpl<>( dslContext, transformer, projection );
}

@Override
Expand All @@ -100,7 +98,7 @@ public <P1, P2, T> CompositeProjectionOptionsStep<?, T> composite(BiFunction<P1,
Contracts.assertNotNull( projection1, "projection1" );
Contracts.assertNotNull( projection2, "projection2" );

return new CompositeProjectionOptionsStepImpl<>( factory, transformer, projection1, projection2 );
return new CompositeProjectionOptionsStepImpl<>( dslContext, transformer, projection1, projection2 );
}

@Override
Expand All @@ -111,18 +109,18 @@ public <P1, P2, P3, T> CompositeProjectionOptionsStep<?, T> composite(TriFunctio
Contracts.assertNotNull( projection2, "projection2" );
Contracts.assertNotNull( projection3, "projection3" );

return new CompositeProjectionOptionsStepImpl<>( factory, transformer, projection1, projection2, projection3 );
return new CompositeProjectionOptionsStepImpl<>( dslContext, transformer, projection1, projection2, projection3 );
}

@Override
public <T> T extension(SearchProjectionFactoryExtension<T, R, E> extension) {
return DslExtensionState.returnIfSupported(
extension, extension.extendOptional( this, factory )
extension, extension.extendOptional( this, dslContext )
);
}

@Override
public <T> SearchProjectionFactoryExtensionIfSupportedStep<T, R, E> extension() {
return new SearchProjectionFactoryExtensionStep<>( this, factory );
return new SearchProjectionFactoryExtensionStep<>( this, dslContext );
}
}
Expand Up @@ -10,18 +10,19 @@

import org.hibernate.search.engine.search.projection.dsl.DistanceToFieldProjectionOptionsStep;
import org.hibernate.search.engine.search.projection.dsl.DistanceToFieldProjectionValueStep;
import org.hibernate.search.engine.search.projection.dsl.spi.SearchProjectionDslContext;
import org.hibernate.search.engine.search.projection.spi.ListProjectionAccumulator;
import org.hibernate.search.engine.search.projection.spi.SearchProjectionBuilderFactory;
import org.hibernate.search.engine.search.projection.spi.SingleValuedProjectionAccumulator;
import org.hibernate.search.engine.spatial.GeoPoint;

public class DistanceToFieldProjectionValueStepImpl
extends DistanceToFieldProjectionOptionsStepImpl<Double>
implements DistanceToFieldProjectionValueStep<DistanceToFieldProjectionOptionsStepImpl<Double>, Double> {

DistanceToFieldProjectionValueStepImpl(SearchProjectionBuilderFactory factory, String absoluteFieldPath,
DistanceToFieldProjectionValueStepImpl(SearchProjectionDslContext<?> dslContext, String absoluteFieldPath,
GeoPoint center) {
super( factory.distance( absoluteFieldPath, center ), SingleValuedProjectionAccumulator.provider() );
super( dslContext.builderFactory().distance( absoluteFieldPath, center ),
SingleValuedProjectionAccumulator.provider() );
}

@Override
Expand Down
Expand Up @@ -9,17 +9,17 @@
import org.hibernate.search.engine.backend.common.DocumentReference;
import org.hibernate.search.engine.search.projection.SearchProjection;
import org.hibernate.search.engine.search.projection.dsl.DocumentReferenceProjectionOptionsStep;
import org.hibernate.search.engine.search.projection.dsl.spi.SearchProjectionDslContext;
import org.hibernate.search.engine.search.projection.spi.DocumentReferenceProjectionBuilder;
import org.hibernate.search.engine.search.projection.spi.SearchProjectionBuilderFactory;


public class DocumentReferenceProjectionOptionsStepImpl
implements DocumentReferenceProjectionOptionsStep<DocumentReferenceProjectionOptionsStepImpl> {

private final DocumentReferenceProjectionBuilder documentReferenceProjectionBuilder;

DocumentReferenceProjectionOptionsStepImpl(SearchProjectionBuilderFactory factory) {
this.documentReferenceProjectionBuilder = factory.documentReference();
DocumentReferenceProjectionOptionsStepImpl(SearchProjectionDslContext<?> dslContext) {
this.documentReferenceProjectionBuilder = dslContext.builderFactory().documentReference();
}

@Override
Expand Down

0 comments on commit a687b14

Please sign in to comment.