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 7 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 TypedSearchPredicateFactory<?> 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(TypedSearchPredicateFactory<?> 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 @@ -5,7 +5,9 @@
package org.hibernate.search.backend.lucene.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.lucene.document.model.impl.LuceneIndexCompositeNode;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexField;
Expand All @@ -25,6 +27,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;

abstract class AbstractLuceneIndexCompositeNodeBuilder
Expand All @@ -35,7 +38,7 @@ abstract class AbstractLuceneIndexCompositeNodeBuilder
// Use a LinkedHashMap for deterministic iteration
private final Map<String, LuceneIndexNodeContributor> fields = new LinkedHashMap<>();
private final Map<String, LuceneIndexNodeContributor> templates = new LinkedHashMap<>();
private final Map<String, LuceneIndexNamedPredicateOptions> namedPredicates = new LinkedHashMap<>();
private final Set<String> namedPredicates = new LinkedHashSet<>();

protected AbstractLuceneIndexCompositeNodeBuilder(LuceneIndexCompositeNodeType.Builder typeBuilder) {
this.typeBuilder = typeBuilder;
Expand Down Expand Up @@ -73,14 +76,23 @@ public IndexObjectFieldBuilder addObjectField(String relativeFieldName, TreeNode
@Override
public IndexSchemaNamedPredicateOptionsStep addNamedPredicate(String name,
TreeNodeInclusion inclusion, PredicateDefinition definition) {
LuceneIndexNamedPredicateOptions options = new LuceneIndexNamedPredicateOptions(
inclusion, definition );
putNamedPredicate( name, options );
putNamedPredicate( name );
if ( TreeNodeInclusion.INCLUDED.equals( inclusion ) ) {
typeBuilder.queryElementFactory( PredicateTypeKeys.named( name ),
new LuceneNamedPredicate.Factory( options.definition, name ) );
new LuceneNamedPredicate.Factory( definition, name ) );
}
return options;
return new LuceneIndexNamedPredicateOptions<>( 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 LuceneNamedPredicate.TypedFactory<>( definition, name ) );
}
return new LuceneIndexNamedPredicateOptions<>( inclusion, definition );
}

@Override
Expand Down Expand Up @@ -138,9 +150,8 @@ private void putTemplate(String name, LuceneIndexNodeContributor contributor) {
}
}

private void putNamedPredicate(String name, LuceneIndexNamedPredicateOptions 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 LuceneIndexNamedPredicateOptions implements IndexSchemaNamedPredicateOptionsStep {

public final TreeNodeInclusion inclusion;
public final PredicateDefinition definition;

LuceneIndexNamedPredicateOptions(TreeNodeInclusion inclusion, PredicateDefinition definition) {
this.inclusion = inclusion;
this.definition = definition;
}

public record LuceneIndexNamedPredicateOptions<T>( TreeNodeInclusion inclusion,
T definition)
implements IndexSchemaNamedPredicateOptionsStep {
}
Loading