Skip to content

HSEARCH-5385 Move SearchProjectionFactory into the context for ProjectionDefinition / HSEARCH-5384 Follow up on field refereces to simplify app migration #4623

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,10 @@
public final class ElasticsearchExtension<SR, H, R, E, LOS>
implements SearchQueryDslExtension<SR, ElasticsearchSearchQuerySelectStep<SR, R, E, LOS>, R, E, LOS>,
SearchQueryExtension<ElasticsearchSearchQuery<H>, H>,
SearchPredicateFactoryExtension<SR, ElasticsearchSearchPredicateFactory<SR>>,
SearchSortFactoryExtension<SR, ElasticsearchSearchSortFactory<SR>>,
SearchProjectionFactoryExtension<SR, ElasticsearchSearchProjectionFactory<SR, R, E>, R, E>,
SearchAggregationFactoryExtension<SR, ElasticsearchSearchAggregationFactory<SR>>,
SearchPredicateFactoryExtension<ElasticsearchSearchPredicateFactory<SR>>,
SearchSortFactoryExtension<ElasticsearchSearchSortFactory<SR>>,
SearchProjectionFactoryExtension<ElasticsearchSearchProjectionFactory<SR, R, E>, R, E>,
SearchAggregationFactoryExtension<ElasticsearchSearchAggregationFactory<SR>>,
IndexFieldTypeFactoryExtension<ElasticsearchIndexFieldTypeFactory>,
SchemaExportExtension<ElasticsearchIndexSchemaExport> {

Expand Down Expand Up @@ -106,12 +106,12 @@ private ElasticsearchExtension() {
@Override
public Optional<ElasticsearchSearchQuerySelectStep<SR, R, E, LOS>> extendOptional(
SearchQuerySelectStep<SR, ?, R, E, LOS, ?, ?> original,
SearchQueryIndexScope<?> scope,
SearchQueryIndexScope<SR, ?> scope,
BackendSessionContext sessionContext,
SearchLoadingContextBuilder<E, LOS> loadingContextBuilder) {
if ( scope instanceof ElasticsearchSearchQueryIndexScope ) {
return Optional.of( new ElasticsearchSearchQuerySelectStepImpl<>(
(ElasticsearchSearchQueryIndexScope<?>) scope, sessionContext, loadingContextBuilder
(ElasticsearchSearchQueryIndexScope<SR, ?>) scope, sessionContext, loadingContextBuilder
) );
}
else {
Expand All @@ -136,10 +136,11 @@ public Optional<ElasticsearchSearchQuery<H>> extendOptional(SearchQuery<H> origi
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked") // TODO: use rescope here instead
@Override
public Optional<ElasticsearchSearchPredicateFactory<SR>> extendOptional(SearchPredicateFactory<SR> original) {
if ( original instanceof ElasticsearchSearchPredicateFactory ) {
return Optional.of( (ElasticsearchSearchPredicateFactory<SR>) original );
public Optional<ElasticsearchSearchPredicateFactory<SR>> extendOptional(SearchPredicateFactory original) {
if ( original instanceof ElasticsearchSearchPredicateFactory<?> f ) {
return Optional.of( (ElasticsearchSearchPredicateFactory<SR>) f );
}
else {
return Optional.empty();
Expand All @@ -149,11 +150,11 @@ public Optional<ElasticsearchSearchPredicateFactory<SR>> extendOptional(SearchPr
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked") // TODO: use rescope here instead
@Override
public Optional<ElasticsearchSearchSortFactory<SR>> extendOptional(
SearchSortFactory<SR> original) {
if ( original instanceof ElasticsearchSearchSortFactory ) {
return Optional.of( (ElasticsearchSearchSortFactory<SR>) original );
public Optional<ElasticsearchSearchSortFactory<SR>> extendOptional(SearchSortFactory original) {
if ( original instanceof ElasticsearchSearchSortFactory<?> f ) {
return Optional.of( (ElasticsearchSearchSortFactory<SR>) f );
}
else {
return Optional.empty();
Expand All @@ -163,8 +164,9 @@ public Optional<ElasticsearchSearchSortFactory<SR>> extendOptional(
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked") // TODO: use rescope here instead
@Override
public Optional<ElasticsearchSearchProjectionFactory<SR, R, E>> extendOptional(SearchProjectionFactory<SR, R, E> original) {
public Optional<ElasticsearchSearchProjectionFactory<SR, R, E>> extendOptional(SearchProjectionFactory<R, E> original) {
if ( original instanceof ElasticsearchSearchProjectionFactory ) {
return Optional.of( (ElasticsearchSearchProjectionFactory<SR, R, E>) original );
}
Expand All @@ -176,9 +178,9 @@ public Optional<ElasticsearchSearchProjectionFactory<SR, R, E>> extendOptional(S
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked") // TODO: use rescope here instead
@Override
public Optional<ElasticsearchSearchAggregationFactory<SR>> extendOptional(
SearchAggregationFactory<SR> original) {
public Optional<ElasticsearchSearchAggregationFactory<SR>> extendOptional(SearchAggregationFactory original) {
if ( original instanceof ElasticsearchSearchAggregationFactory ) {
return Optional.of( (ElasticsearchSearchAggregationFactory<SR>) original );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
package org.hibernate.search.backend.elasticsearch.document.model.dsl.impl;

import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

import org.hibernate.search.backend.elasticsearch.document.model.impl.ElasticsearchIndexCompositeNode;
import org.hibernate.search.backend.elasticsearch.document.model.impl.ElasticsearchIndexField;
Expand All @@ -26,6 +28,7 @@
import org.hibernate.search.engine.backend.types.ObjectStructure;
import org.hibernate.search.engine.common.tree.spi.TreeNodeInclusion;
import org.hibernate.search.engine.search.predicate.definition.PredicateDefinition;
import org.hibernate.search.engine.search.predicate.definition.TypedPredicateDefinition;
import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys;

public abstract class AbstractElasticsearchIndexCompositeNodeBuilder implements IndexCompositeNodeBuilder {
Expand All @@ -35,7 +38,7 @@ public abstract class AbstractElasticsearchIndexCompositeNodeBuilder implements
// Use a LinkedHashMap for deterministic iteration
private final Map<String, ElasticsearchIndexNodeContributor> fields = new LinkedHashMap<>();
private final Map<String, ElasticsearchIndexNodeContributor> templates = new LinkedHashMap<>();
private final Map<String, ElasticsearchIndexNamedPredicateOptions> namedPredicates = new LinkedHashMap<>();
private final Set<String> namedPredicates = new LinkedHashSet<>();

protected AbstractElasticsearchIndexCompositeNodeBuilder(
ElasticsearchIndexCompositeNodeType.Builder typeBuilder) {
Expand Down Expand Up @@ -74,14 +77,23 @@ public IndexObjectFieldBuilder addObjectField(String relativeFieldName, TreeNode
@Override
public IndexSchemaNamedPredicateOptionsStep addNamedPredicate(String name, TreeNodeInclusion inclusion,
PredicateDefinition definition) {
ElasticsearchIndexNamedPredicateOptions options = new ElasticsearchIndexNamedPredicateOptions(
inclusion, definition );
putNamedPredicate( name, options );
putNamedPredicate( name );
if ( TreeNodeInclusion.INCLUDED.equals( inclusion ) ) {
typeBuilder.queryElementFactory( PredicateTypeKeys.named( name ),
new ElasticsearchNamedPredicate.Factory( options.definition, name ) );
new ElasticsearchNamedPredicate.Factory( definition, name ) );
}
return options;
return new ElasticsearchIndexNamedPredicateOptions<>( inclusion, definition );
}

@Override
public IndexSchemaNamedPredicateOptionsStep addNamedPredicate(String name,
TreeNodeInclusion inclusion, TypedPredicateDefinition<?> definition) {
putNamedPredicate( name );
if ( TreeNodeInclusion.INCLUDED.equals( inclusion ) ) {
typeBuilder.queryElementFactory( PredicateTypeKeys.named( name ),
new ElasticsearchNamedPredicate.TypedFactory<>( definition, name ) );
}
return new ElasticsearchIndexNamedPredicateOptions<>( inclusion, definition );
}

@Override
Expand Down Expand Up @@ -147,9 +159,8 @@ private void putTemplate(String name, ElasticsearchIndexNodeContributor contribu
}
}

private void putNamedPredicate(String name, ElasticsearchIndexNamedPredicateOptions options) {
Object previous = namedPredicates.putIfAbsent( name, options );
if ( previous != null ) {
private void putNamedPredicate(String name) {
if ( !namedPredicates.add( name ) ) {
throw MappingLog.INSTANCE.indexSchemaNamedPredicateNameConflict( name, eventContext() );
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,8 @@

import org.hibernate.search.engine.backend.document.model.dsl.IndexSchemaNamedPredicateOptionsStep;
import org.hibernate.search.engine.common.tree.spi.TreeNodeInclusion;
import org.hibernate.search.engine.search.predicate.definition.PredicateDefinition;

public class ElasticsearchIndexNamedPredicateOptions implements IndexSchemaNamedPredicateOptionsStep {

public final TreeNodeInclusion inclusion;
public final PredicateDefinition definition;

ElasticsearchIndexNamedPredicateOptions(TreeNodeInclusion inclusion, PredicateDefinition definition) {
this.inclusion = inclusion;
this.definition = definition;
}
public record ElasticsearchIndexNamedPredicateOptions<T>(TreeNodeInclusion inclusion, T definition)
implements IndexSchemaNamedPredicateOptionsStep {

}
Original file line number Diff line number Diff line change
Expand Up @@ -195,9 +195,9 @@ public IndexWorkspace createWorkspace(BackendMappingContext mappingContext, Set<
}

@Override
public IndexScopeBuilder createScopeBuilder(BackendMappingContext mappingContext) {
return new ElasticsearchIndexScopeBuilder(
backendContext, mappingContext, this
public <SR> IndexScopeBuilder<SR> createScopeBuilder(BackendMappingContext mappingContext, Class<SR> rootScopeType) {
return new ElasticsearchIndexScopeBuilder<>(
backendContext, mappingContext, rootScopeType, this
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,20 @@
import org.hibernate.search.engine.backend.scope.spi.IndexScope;
import org.hibernate.search.engine.backend.scope.spi.IndexScopeBuilder;

class ElasticsearchIndexScopeBuilder implements IndexScopeBuilder {
class ElasticsearchIndexScopeBuilder<SR> implements IndexScopeBuilder<SR> {

private final IndexManagerBackendContext backendContext;
private final BackendMappingContext mappingContext;
private final Class<SR> rootScopeType;

// Use LinkedHashSet to ensure stable order when generating requests
private final Set<ElasticsearchIndexManagerImpl> indexManagers = new LinkedHashSet<>();

ElasticsearchIndexScopeBuilder(IndexManagerBackendContext backendContext,
BackendMappingContext mappingContext, ElasticsearchIndexManagerImpl indexManager) {
BackendMappingContext mappingContext, Class<SR> rootScopeType, ElasticsearchIndexManagerImpl indexManager) {
this.backendContext = backendContext;
this.mappingContext = mappingContext;
this.rootScopeType = rootScopeType;
this.indexManagers.add( indexManager );
}

Expand All @@ -40,11 +42,11 @@ void add(IndexManagerBackendContext backendContext, ElasticsearchIndexManagerImp
}

@Override
public IndexScope build() {
public IndexScope<SR> build() {
// Use LinkedHashSet to ensure stable order when generating requests
Set<ElasticsearchIndexModel> indexModels = indexManagers.stream().map( ElasticsearchIndexManagerImpl::model )
.collect( Collectors.toCollection( LinkedHashSet::new ) );
return new ElasticsearchIndexScope( mappingContext, backendContext, indexModels );
return new ElasticsearchIndexScope<>( mappingContext, backendContext, rootScopeType, indexModels );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,10 +146,12 @@ public SearchProjectionBackendContext getSearchProjectionBackendContext() {
}

@Override
public ElasticsearchSearchQueryIndexScope<?> createSearchContext(BackendMappingContext mappingContext,
public <SR> ElasticsearchSearchQueryIndexScope<SR, ?> createSearchContext(BackendMappingContext mappingContext,
Class<SR> rootScopeType,
Set<ElasticsearchIndexModel> indexModels) {
return new ElasticsearchSearchIndexScopeImpl(
return new ElasticsearchSearchIndexScopeImpl<>(
mappingContext,
rootScopeType,
this,
userFacingGson, link.getSearchSyntax(),
multiTenancyStrategy,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,6 @@ public interface ElasticsearchLog
* here to the next value.
*/
@LogMessage(level = TRACE)
@Message(id = ID_OFFSET + 193, value = "")
@Message(id = ID_OFFSET + 194, value = "")
void nextLoggerIdForConvenience();
}
Original file line number Diff line number Diff line change
Expand Up @@ -333,4 +333,8 @@ SearchException vectorKnnMatchVectorTypeDiffersFromField(String absoluteFieldPat
@Message(id = ID_OFFSET + 190, value = "A single-valued highlight projection requested, "
+ "but the corresponding highlighter does not set number of fragments to 1.")
SearchException highlighterIncompatibleCardinality();

@Message(id = ID_OFFSET + 193, value = "Current factory cannot be resocped to '%1$s' as it is scoped to '%2$s'.")
SearchException incompatibleScopeRootType(@FormatWith(ClassFormatter.class) Class<?> requested,
@FormatWith(ClassFormatter.class) Class<?> actual);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@
import org.hibernate.search.engine.backend.mapping.spi.BackendMappingContext;
import org.hibernate.search.engine.backend.scope.spi.IndexScope;

public class ElasticsearchIndexScope
implements IndexScope {
public class ElasticsearchIndexScope<SR>
implements IndexScope<SR> {

private final ElasticsearchSearchQueryIndexScope<?> searchScope;
private final ElasticsearchSearchQueryIndexScope<SR, ?> searchScope;

public ElasticsearchIndexScope(BackendMappingContext mappingContext, SearchBackendContext backendContext,
Class<SR> rootScopeType,
Set<ElasticsearchIndexModel> indexModels) {
this.searchScope = backendContext.createSearchContext( mappingContext, indexModels );
this.searchScope = backendContext.createSearchContext( mappingContext, rootScopeType, indexModels );
}

@Override
Expand All @@ -28,7 +29,7 @@ public String toString() {
}

@Override
public ElasticsearchSearchQueryIndexScope<?> searchScope() {
public ElasticsearchSearchQueryIndexScope<SR, ?> searchScope() {
return searchScope;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,15 @@
import com.google.gson.Gson;
import com.google.gson.JsonObject;

public final class ElasticsearchSearchIndexScopeImpl
public final class ElasticsearchSearchIndexScopeImpl<SR>
extends AbstractSearchIndexScope<
ElasticsearchSearchIndexScopeImpl,
SR,
ElasticsearchSearchIndexScopeImpl<SR>,
ElasticsearchIndexModel,
ElasticsearchSearchIndexNodeContext,
ElasticsearchSearchIndexCompositeNodeContext>
implements ElasticsearchSearchIndexScope<ElasticsearchSearchIndexScopeImpl>,
ElasticsearchSearchQueryIndexScope<ElasticsearchSearchIndexScopeImpl> {
implements ElasticsearchSearchIndexScope<ElasticsearchSearchIndexScopeImpl<SR>>,
ElasticsearchSearchQueryIndexScope<SR, ElasticsearchSearchIndexScopeImpl<SR>> {

// Backend context
private final SearchBackendContext backendContext;
Expand All @@ -81,12 +82,13 @@ public final class ElasticsearchSearchIndexScopeImpl
private final ElasticsearchSearchAggregationBuilderFactory aggregationFactory;

public ElasticsearchSearchIndexScopeImpl(BackendMappingContext mappingContext,
Class<SR> rootScopeType,
SearchBackendContext backendContext,
Gson userFacingGson, ElasticsearchSearchSyntax searchSyntax,
MultiTenancyStrategy multiTenancyStrategy,
TimingSource timingSource,
Set<ElasticsearchIndexModel> indexModels) {
super( mappingContext, indexModels );
super( mappingContext, rootScopeType, indexModels );
this.backendContext = backendContext;
this.userFacingGson = userFacingGson;
this.searchSyntax = searchSyntax;
Expand Down Expand Up @@ -115,7 +117,7 @@ public ElasticsearchSearchIndexScopeImpl(BackendMappingContext mappingContext,
this.aggregationFactory = new ElasticsearchSearchAggregationBuilderFactory( this );
}

private ElasticsearchSearchIndexScopeImpl(ElasticsearchSearchIndexScopeImpl parentScope,
private ElasticsearchSearchIndexScopeImpl(ElasticsearchSearchIndexScopeImpl<SR> parentScope,
ElasticsearchSearchIndexCompositeNodeContext overriddenRoot) {
super( parentScope, overriddenRoot );
this.backendContext = parentScope.backendContext;
Expand All @@ -134,13 +136,13 @@ private ElasticsearchSearchIndexScopeImpl(ElasticsearchSearchIndexScopeImpl pare
}

@Override
protected ElasticsearchSearchIndexScopeImpl self() {
protected ElasticsearchSearchIndexScopeImpl<SR> self() {
return this;
}

@Override
public ElasticsearchSearchIndexScopeImpl withRoot(String objectFieldPath) {
return new ElasticsearchSearchIndexScopeImpl( this, field( objectFieldPath ).toComposite() );
public ElasticsearchSearchIndexScopeImpl<SR> withRoot(String objectFieldPath) {
return new ElasticsearchSearchIndexScopeImpl<>( this, field( objectFieldPath ).toComposite() );
}

@Override
Expand Down Expand Up @@ -171,23 +173,23 @@ public <P> ElasticsearchSearchQueryBuilder<P> select(BackendSessionContext sessi
}

@Override
public <SR> ElasticsearchSearchPredicateFactory<SR> predicateFactory() {
return new ElasticsearchSearchPredicateFactoryImpl<>( SearchPredicateDslContext.root( this ) );
public ElasticsearchSearchPredicateFactory<SR> predicateFactory() {
return new ElasticsearchSearchPredicateFactoryImpl<>( rootScopeType, SearchPredicateDslContext.root( this ) );
}

@Override
public <SR> ElasticsearchSearchSortFactory<SR> sortFactory() {
public ElasticsearchSearchSortFactory<SR> sortFactory() {
return new ElasticsearchSearchSortFactoryImpl<>( SearchSortDslContext
.root( this, ElasticsearchSearchSortFactoryImpl::new, predicateFactory() ) );
}

@Override
public <SR, R, E> ElasticsearchSearchProjectionFactory<SR, R, E> projectionFactory() {
public <R, E> ElasticsearchSearchProjectionFactory<SR, R, E> projectionFactory() {
return new ElasticsearchSearchProjectionFactoryImpl<>( SearchProjectionDslContext.root( this ) );
}

@Override
public <SR> ElasticsearchSearchAggregationFactory<SR> aggregationFactory() {
public ElasticsearchSearchAggregationFactory<SR> aggregationFactory() {
return new ElasticsearchSearchAggregationFactoryImpl<>(
SearchAggregationDslContext.root( this, predicateFactory() ) );
}
Expand Down
Loading