diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/AbstractElasticsearchSearchNestedPredicateBuilder.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/AbstractElasticsearchSearchNestedPredicateBuilder.java index 4c0a20c0d5f..9fd41283684 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/AbstractElasticsearchSearchNestedPredicateBuilder.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/AbstractElasticsearchSearchNestedPredicateBuilder.java @@ -28,13 +28,16 @@ public AbstractElasticsearchSearchNestedPredicateBuilder(List nestedPath public final JsonObject build(ElasticsearchSearchPredicateContext context) { JsonObject result = super.build( context ); if ( nestedPathHierarchy != null && !nestedPathHierarchy.isEmpty() ) { - result = applyImplicitNested( result, new LinkedList<>( nestedPathHierarchy ), context ); + result = applyImplicitNested( result, nestedPathHierarchy, context ); } return result; } - private JsonObject applyImplicitNested(JsonObject partialResult, List nestedPathHierarchy, - ElasticsearchSearchPredicateContext context) { + public static JsonObject applyImplicitNested(JsonObject partialResult, List nestedPathHierarchy, ElasticsearchSearchPredicateContext context) { + return applyImplicitNestedStep( partialResult, new LinkedList<>( nestedPathHierarchy ), context ); + } + + private static JsonObject applyImplicitNestedStep(JsonObject partialResult, List nestedPathHierarchy, ElasticsearchSearchPredicateContext context) { if ( nestedPathHierarchy.isEmpty() ) { return partialResult; } @@ -48,7 +51,7 @@ private JsonObject applyImplicitNested(JsonObject partialResult, List ne JsonObject innerObject = new JsonObject(); PATH_ACCESSOR.set( innerObject, lastPath ); - QUERY_ACCESSOR.set( innerObject, applyImplicitNested( partialResult, nestedPathHierarchy, context ) ); + QUERY_ACCESSOR.set( innerObject, applyImplicitNestedStep( partialResult, nestedPathHierarchy, context ) ); JsonObject outerObject = new JsonObject(); outerObject.add( "nested", innerObject ); diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/ElasticsearchSimpleQueryStringPredicateBuilder.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/ElasticsearchSimpleQueryStringPredicateBuilder.java index d22ec1ac1ac..186403c9003 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/ElasticsearchSimpleQueryStringPredicateBuilder.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/ElasticsearchSimpleQueryStringPredicateBuilder.java @@ -7,6 +7,7 @@ package org.hibernate.search.backend.elasticsearch.search.predicate.impl; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import org.hibernate.search.backend.elasticsearch.gson.impl.JsonAccessor; @@ -111,8 +112,11 @@ protected JsonObject doBuild(ElasticsearchSearchPredicateContext context, QUERY_ACCESSOR.set( innerObject, simpleQueryString ); DEFAULT_OPERATOR_ACCESSOR.set( innerObject, defaultOperator ); + List nestedPathHierarchy = null; JsonArray fieldArray = new JsonArray(); for ( ElasticsearchSimpleQueryStringPredicateBuilderFieldState fieldContext : fields.values() ) { + // TODO: check if the fields belong **all** to the same nested object or to the root object. + nestedPathHierarchy = fieldContext.getNestedPathHierarchy( scopeModel ); fieldArray.add( fieldContext.build() ); } FIELDS_ACCESSOR.set( innerObject, fieldArray ); @@ -133,7 +137,9 @@ protected JsonObject doBuild(ElasticsearchSearchPredicateContext context, } SIMPLE_QUERY_STRING_ACCESSOR.set( outerObject, innerObject ); - return outerObject; + + return ( nestedPathHierarchy == null || nestedPathHierarchy.isEmpty() ) ? outerObject : + AbstractElasticsearchSearchNestedPredicateBuilder.applyImplicitNested( outerObject, nestedPathHierarchy, context ); } /** diff --git a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/types/predicate/impl/ElasticsearchSimpleQueryStringPredicateBuilderFieldState.java b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/types/predicate/impl/ElasticsearchSimpleQueryStringPredicateBuilderFieldState.java index 565a922da8e..e64196cbc4d 100644 --- a/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/types/predicate/impl/ElasticsearchSimpleQueryStringPredicateBuilderFieldState.java +++ b/backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/types/predicate/impl/ElasticsearchSimpleQueryStringPredicateBuilderFieldState.java @@ -6,6 +6,9 @@ */ package org.hibernate.search.backend.elasticsearch.types.predicate.impl; +import java.util.List; + +import org.hibernate.search.backend.elasticsearch.scope.model.impl.ElasticsearchScopeModel; import org.hibernate.search.engine.search.predicate.spi.SimpleQueryStringPredicateBuilder; import com.google.gson.JsonPrimitive; @@ -33,4 +36,8 @@ public JsonPrimitive build() { } return new JsonPrimitive( sb.toString() ); } + + public List getNestedPathHierarchy(ElasticsearchScopeModel scopeModel) { + return scopeModel.getNestedPathHierarchy( absoluteFieldPath ); + } } diff --git a/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/tmp/ImplicitNestedSearchPredicateIT.java b/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/tmp/ImplicitNestedSearchPredicateIT.java index 991ef2d3180..e87bef1e776 100644 --- a/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/tmp/ImplicitNestedSearchPredicateIT.java +++ b/integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/tmp/ImplicitNestedSearchPredicateIT.java @@ -31,7 +31,6 @@ import org.hibernate.search.util.impl.integrationtest.mapper.stub.StubMappingScope; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; @@ -132,7 +131,6 @@ public void predicate_wildcard() { verify_implicit_nest( p -> p.wildcard().field( "nested.text" ).matching( SOME_WILDCARD_PATTERN ) ); } - @Ignore // TODO: support this @Test public void predicate_simpleQueryString() { verify_implicit_nest( p -> p.simpleQueryString().field( "nested.text" ).matching( SOME_SIMPLE_QUERY_STRING ) );