Skip to content

HSEARCH-**** Attempt to make the migration simpler #4618

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

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
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 @@ -22,21 +22,21 @@
import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFactoryExtension;
import org.hibernate.search.engine.common.schema.management.SchemaExport;
import org.hibernate.search.engine.common.schema.management.SchemaExportExtension;
import org.hibernate.search.engine.search.aggregation.dsl.SearchAggregationFactory;
import org.hibernate.search.engine.search.aggregation.dsl.SearchAggregationFactoryExtension;
import org.hibernate.search.engine.search.aggregation.dsl.TypedSearchAggregationFactory;
import org.hibernate.search.engine.search.loading.spi.SearchLoadingContext;
import org.hibernate.search.engine.search.loading.spi.SearchLoadingContextBuilder;
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactoryExtension;
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
import org.hibernate.search.engine.search.predicate.dsl.TypedSearchPredicateFactory;
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactoryExtension;
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
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;
import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep;
import org.hibernate.search.engine.search.query.spi.SearchQueryIndexScope;
import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory;
import org.hibernate.search.engine.search.sort.dsl.SearchSortFactoryExtension;
import org.hibernate.search.engine.search.sort.dsl.TypedSearchSortFactory;

/**
* An extension for the Elasticsearch backend, giving access to Elasticsearch-specific features.
Expand Down Expand Up @@ -137,7 +137,7 @@ public Optional<ElasticsearchSearchQuery<H>> extendOptional(SearchQuery<H> origi
* {@inheritDoc}
*/
@Override
public Optional<ElasticsearchSearchPredicateFactory<SR>> extendOptional(SearchPredicateFactory<SR> original) {
public Optional<ElasticsearchSearchPredicateFactory<SR>> extendOptional(TypedSearchPredicateFactory<SR> original) {
if ( original instanceof ElasticsearchSearchPredicateFactory ) {
return Optional.of( (ElasticsearchSearchPredicateFactory<SR>) original );
}
Expand All @@ -151,7 +151,7 @@ public Optional<ElasticsearchSearchPredicateFactory<SR>> extendOptional(SearchPr
*/
@Override
public Optional<ElasticsearchSearchSortFactory<SR>> extendOptional(
SearchSortFactory<SR> original) {
TypedSearchSortFactory<SR> original) {
if ( original instanceof ElasticsearchSearchSortFactory ) {
return Optional.of( (ElasticsearchSearchSortFactory<SR>) original );
}
Expand All @@ -164,7 +164,8 @@ public Optional<ElasticsearchSearchSortFactory<SR>> extendOptional(
* {@inheritDoc}
*/
@Override
public Optional<ElasticsearchSearchProjectionFactory<SR, R, E>> extendOptional(SearchProjectionFactory<SR, R, E> original) {
public Optional<ElasticsearchSearchProjectionFactory<SR, R, E>> extendOptional(
TypedSearchProjectionFactory<SR, R, E> original) {
if ( original instanceof ElasticsearchSearchProjectionFactory ) {
return Optional.of( (ElasticsearchSearchProjectionFactory<SR, R, E>) original );
}
Expand All @@ -178,7 +179,7 @@ public Optional<ElasticsearchSearchProjectionFactory<SR, R, E>> extendOptional(S
*/
@Override
public Optional<ElasticsearchSearchAggregationFactory<SR>> extendOptional(
SearchAggregationFactory<SR> original) {
TypedSearchAggregationFactory<SR> 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 @@ -11,12 +11,17 @@
import org.hibernate.search.backend.elasticsearch.search.common.impl.AbstractElasticsearchCompositeNodeSearchQueryElementFactory;
import org.hibernate.search.backend.elasticsearch.search.common.impl.ElasticsearchSearchIndexCompositeNodeContext;
import org.hibernate.search.backend.elasticsearch.search.common.impl.ElasticsearchSearchIndexScope;
import org.hibernate.search.engine.search.common.NonStaticMetamodelScope;
import org.hibernate.search.engine.search.common.spi.SearchQueryElementFactory;
import org.hibernate.search.engine.search.predicate.SearchPredicate;
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.dsl.SearchPredicateFactory;
import org.hibernate.search.engine.search.predicate.dsl.TypedSearchPredicateFactory;
import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateFactoryDelegate;
import org.hibernate.search.engine.search.predicate.spi.NamedPredicateBuilder;
import org.hibernate.search.engine.search.predicate.spi.NamedValuesBasedPredicateDefinitionContext;
import org.hibernate.search.engine.search.predicate.spi.NamedValuesBasedTypedPredicateDefinitionContext;

import com.google.gson.JsonObject;

Expand Down Expand Up @@ -63,46 +68,133 @@ public void checkCompatibleWith(SearchQueryElementFactory<?, ?, ?> other) {
@Override
public NamedPredicateBuilder create(ElasticsearchSearchIndexScope<?> scope,
ElasticsearchSearchIndexCompositeNodeContext node) {
return new Builder( definition, predicateName, scope, node );
return new BasicBuilder( definition, predicateName, scope, node );
}
}

private static class Builder extends AbstractBuilder implements NamedPredicateBuilder {
private final PredicateDefinition definition;
public static class TypedFactory<SR>
extends AbstractElasticsearchCompositeNodeSearchQueryElementFactory<NamedPredicateBuilder> {
private final TypedPredicateDefinition<SR> definition;
private final String predicateName;
private final ElasticsearchSearchIndexCompositeNodeContext field;
private SearchPredicateFactory<?> factory;
private final Map<String, Object> params = new LinkedHashMap<>();

Builder(PredicateDefinition definition, String predicateName,
public TypedFactory(TypedPredicateDefinition<SR> definition, String predicateName) {
this.definition = definition;
this.predicateName = predicateName;
}

@Override
public void checkCompatibleWith(SearchQueryElementFactory<?, ?, ?> other) {
super.checkCompatibleWith( other );
Factory castedOther = (Factory) other;
if ( !definition.equals( castedOther.definition ) ) {
throw QueryLog.INSTANCE.differentPredicateDefinitionForQueryElement( definition, castedOther.definition );
}
}

@Override
public NamedPredicateBuilder create(ElasticsearchSearchIndexScope<?> scope,
ElasticsearchSearchIndexCompositeNodeContext node) {
return new TypedBuilder<>( definition, predicateName, scope, node );
}
}

private abstract static class Builder extends AbstractBuilder implements NamedPredicateBuilder {
protected final String predicateName;
protected final ElasticsearchSearchIndexCompositeNodeContext field;
protected final Map<String, Object> params = new LinkedHashMap<>();

Builder(String predicateName,
ElasticsearchSearchIndexScope<?> scope,
ElasticsearchSearchIndexCompositeNodeContext node) {
super( scope, node );
this.definition = definition;
this.predicateName = predicateName;
this.field = node;
}

@Override
public void factory(SearchPredicateFactory<?> factory) {
this.factory = factory;
public final void param(String name, Object value) {
params.put( name, value );
}

protected abstract ElasticsearchSearchPredicate providedPredicate();

@Override
public void param(String name, Object value) {
params.put( name, value );
public final SearchPredicate build() {
return new ElasticsearchNamedPredicate( this, providedPredicate() );
}

}

private static class BasicBuilder extends Builder {
private final PredicateDefinition definition;
private SearchPredicateFactory factory;

BasicBuilder(PredicateDefinition definition, String predicateName,
ElasticsearchSearchIndexScope<?> scope,
ElasticsearchSearchIndexCompositeNodeContext node) {
super( predicateName, scope, node );
this.definition = definition;
}

@SuppressWarnings("unchecked")
@Override
public SearchPredicate build() {
NamedValuesBasedPredicateDefinitionContext<?> ctx =
new NamedValuesBasedPredicateDefinitionContext<>( factory, params,
public void factory(TypedSearchPredicateFactory<?> factory) {
if ( isCompatible( factory ) ) {
this.factory =
new SearchPredicateFactoryDelegate( (TypedSearchPredicateFactory<NonStaticMetamodelScope>) factory );
}
else {
throw new IllegalArgumentException( "Current search predicate factory is incompatible with this \""
+ predicateName + "\" name predicate." );
}
}

private boolean isCompatible(TypedSearchPredicateFactory<?> factory) {
return true;
}

@Override
protected ElasticsearchSearchPredicate providedPredicate() {
NamedValuesBasedPredicateDefinitionContext ctx =
new NamedValuesBasedPredicateDefinitionContext( factory, params,
name -> QueryLog.INSTANCE.paramNotDefined( name, predicateName, field.eventContext() ) );

ElasticsearchSearchPredicate providedPredicate = ElasticsearchSearchPredicate.from(
scope, definition.create( ctx ) );
return ElasticsearchSearchPredicate.from( scope, definition.create( ctx ) );
}
}

private static class TypedBuilder<SR> extends Builder {
private final TypedPredicateDefinition<SR> definition;
private TypedSearchPredicateFactory<SR> factory;

TypedBuilder(TypedPredicateDefinition<SR> definition, String predicateName, ElasticsearchSearchIndexScope<?> scope,
ElasticsearchSearchIndexCompositeNodeContext node) {
super( predicateName, scope, node );
this.definition = definition;
}

@SuppressWarnings("unchecked")
@Override
public void factory(TypedSearchPredicateFactory<?> factory) {
if ( isCompatible( factory ) ) {
this.factory = (TypedSearchPredicateFactory<SR>) factory;
}
else {
throw new IllegalArgumentException( "Current search predicate factory is incompatible with this \""
+ predicateName + "\" name predicate." );
}
}

private boolean isCompatible(TypedSearchPredicateFactory<?> factory) {
return true;
}

@Override
protected ElasticsearchSearchPredicate providedPredicate() {
var ctx = new NamedValuesBasedTypedPredicateDefinitionContext<>( factory, params,
name -> QueryLog.INSTANCE.paramNotDefined( name, predicateName, field.eventContext() ) );

return new ElasticsearchNamedPredicate( this, providedPredicate );
return ElasticsearchSearchPredicate.from( scope, definition.create( ctx ) );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import org.hibernate.search.engine.search.projection.dsl.ExtendedSearchProjectionFactory;
import org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep;
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;

import com.google.gson.JsonObject;

Expand All @@ -16,7 +16,7 @@
* @param <SR> Scope root type.
* @param <R> The type of entity references.
* @param <E> The type of entities.
* @see SearchProjectionFactory
* @see TypedSearchProjectionFactory
*/
public interface ElasticsearchSearchProjectionFactory<SR, R, E>
extends ExtendedSearchProjectionFactory<SR, ElasticsearchSearchProjectionFactory<SR, R, E>, R, E> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,21 @@
import org.hibernate.search.engine.backend.types.dsl.IndexFieldTypeFactoryExtension;
import org.hibernate.search.engine.common.schema.management.SchemaExport;
import org.hibernate.search.engine.common.schema.management.SchemaExportExtension;
import org.hibernate.search.engine.search.aggregation.dsl.SearchAggregationFactory;
import org.hibernate.search.engine.search.aggregation.dsl.SearchAggregationFactoryExtension;
import org.hibernate.search.engine.search.aggregation.dsl.TypedSearchAggregationFactory;
import org.hibernate.search.engine.search.loading.spi.SearchLoadingContext;
import org.hibernate.search.engine.search.loading.spi.SearchLoadingContextBuilder;
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactoryExtension;
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory;
import org.hibernate.search.engine.search.predicate.dsl.TypedSearchPredicateFactory;
import org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactoryExtension;
import org.hibernate.search.engine.search.projection.dsl.TypedSearchProjectionFactory;
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;
import org.hibernate.search.engine.search.query.dsl.SearchQuerySelectStep;
import org.hibernate.search.engine.search.query.spi.SearchQueryIndexScope;
import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory;
import org.hibernate.search.engine.search.sort.dsl.SearchSortFactoryExtension;
import org.hibernate.search.engine.search.sort.dsl.TypedSearchSortFactory;

/**
* An extension for the Lucene backend, giving access to Lucene-specific features.
Expand Down Expand Up @@ -140,7 +140,7 @@ public Optional<LuceneSearchQuery<H>> extendOptional(SearchQuery<H> original,
* {@inheritDoc}
*/
@Override
public Optional<LuceneSearchPredicateFactory<SR>> extendOptional(SearchPredicateFactory<SR> original) {
public Optional<LuceneSearchPredicateFactory<SR>> extendOptional(TypedSearchPredicateFactory<SR> original) {
if ( original instanceof LuceneSearchPredicateFactory ) {
return Optional.of( (LuceneSearchPredicateFactory<SR>) original );
}
Expand All @@ -154,7 +154,7 @@ public Optional<LuceneSearchPredicateFactory<SR>> extendOptional(SearchPredicate
*/
@Override
public Optional<LuceneSearchSortFactory<SR>> extendOptional(
SearchSortFactory<SR> original) {
TypedSearchSortFactory<SR> original) {
if ( original instanceof LuceneSearchSortFactory ) {
return Optional.of( (LuceneSearchSortFactory<SR>) original );
}
Expand All @@ -167,7 +167,7 @@ public Optional<LuceneSearchSortFactory<SR>> extendOptional(
* {@inheritDoc}
*/
@Override
public Optional<LuceneSearchProjectionFactory<SR, R, E>> extendOptional(SearchProjectionFactory<SR, R, E> original) {
public Optional<LuceneSearchProjectionFactory<SR, R, E>> extendOptional(TypedSearchProjectionFactory<SR, R, E> original) {
if ( original instanceof LuceneSearchProjectionFactory ) {
return Optional.of( (LuceneSearchProjectionFactory<SR, R, E>) original );
}
Expand All @@ -180,7 +180,7 @@ public Optional<LuceneSearchProjectionFactory<SR, R, E>> extendOptional(SearchPr
* {@inheritDoc}
*/
@Override
public Optional<LuceneSearchAggregationFactory<SR>> extendOptional(SearchAggregationFactory<SR> original) {
public Optional<LuceneSearchAggregationFactory<SR>> extendOptional(TypedSearchAggregationFactory<SR> original) {
if ( original instanceof LuceneSearchAggregationFactory ) {
return Optional.of( (LuceneSearchAggregationFactory<SR>) original );
}
Expand Down
Loading