Skip to content

Commit 8ee07df

Browse files
committed
HSEARCH-4950 TOFIXUP: Update knn restrictions for Elasticsearch
1 parent aeeb486 commit 8ee07df

File tree

3 files changed

+20
-14
lines changed

3 files changed

+20
-14
lines changed

backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/ElasticsearchBooleanPredicate.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,11 @@ private ElasticsearchBooleanPredicate(Builder builder) {
6565

6666
@Override
6767
public void checkNestableWithin(PredicateNestingContext context) {
68-
checkAcceptableWithin( context, mustClauses );
69-
checkAcceptableWithin( context, shouldClauses );
70-
checkAcceptableWithin( context, filterClauses );
71-
checkAcceptableWithin( context, mustNotClauses );
68+
PredicateNestingContext updatedContext = context.rejectKnn();
69+
checkAcceptableWithin( updatedContext, mustClauses );
70+
checkAcceptableWithin( updatedContext, shouldClauses );
71+
checkAcceptableWithin( updatedContext, filterClauses );
72+
checkAcceptableWithin( updatedContext, mustNotClauses );
7273
}
7374

7475
@Override
@@ -241,20 +242,12 @@ public void should(SearchPredicate clause) {
241242

242243
ElasticsearchSearchPredicate elasticsearchClause = ElasticsearchSearchPredicate.from( scope, clause );
243244
elasticsearchClause.checkNestableWithin(
244-
!hasNonShouldClause() && maybeKnnClause( clause )
245+
!hasNonShouldClause()
245246
? PredicateNestingContext.acceptsKnn()
246247
: PredicateNestingContext.doesNotAcceptKnn() );
247248
shouldClauses.add( elasticsearchClause );
248249
}
249250

250-
private boolean maybeKnnClause(SearchPredicate clause) {
251-
return clause instanceof ElasticsearchKnnPredicate
252-
|| ( clause instanceof ElasticsearchNamedPredicate
253-
// TODO:
254-
// && clause.providedPredicate instanceof ElasticsearchKnnPredicate
255-
);
256-
}
257-
258251
@Override
259252
public void filter(SearchPredicate clause) {
260253
if ( filterClauses == null ) {

backend/elasticsearch/src/main/java/org/hibernate/search/backend/elasticsearch/search/predicate/impl/PredicateNestingContext.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,13 @@ public boolean acceptsKnnClause() {
4545
return acceptsKnnClause;
4646
}
4747

48+
public PredicateNestingContext rejectKnn() {
49+
if ( !acceptsKnnClause ) {
50+
return this;
51+
}
52+
if ( nestedPath == null ) {
53+
return DOES_NOT_ACCEPT_KNN;
54+
}
55+
return new PredicateNestingContext( nestedPath, false );
56+
}
4857
}

integrationtest/backend/elasticsearch/src/test/java/org/hibernate/search/integrationtest/backend/elasticsearch/search/ElasticsearchKnnPredicateSpecificsIT.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ void knnPredicateInWrongPlace_addingPrebuiltKnn() {
217217
// cannot add a knn through should as we already have a non-should clause
218218
.should( knn ) );
219219

220+
// nested knn predicates are not allowed
221+
knnPredicateInWrongPlace( () -> scope.predicate().nested( "object" ).add( knn ) );
220222

221223
// we add multiple clauses to prevent "optimizations" leading to bool predicate being replaced by a simple knn predicate
222224
SearchPredicate inlineBoolKnnInShould = scope.predicate().bool().should( knn )
@@ -239,8 +241,10 @@ void knnPredicateInWrongPlace_addingPrebuiltKnn() {
239241
knnPredicateInWrongPlace(
240242
() -> scope.predicate().knn( 10 ).field( "location" ).matching( 50.0f, 50.0f )
241243
.filter( boolKnnInShould ) );
242-
}
243244

245+
// nested knn predicates are not allowed
246+
knnPredicateInWrongPlace( () -> scope.predicate().nested( "object" ).add( boolKnnInShould ) );
247+
}
244248
}
245249
}
246250

0 commit comments

Comments
 (0)