@@ -1944,7 +1944,6 @@ public void testPushDownConjunctionsToKnnPrefilter() {
19441944 assertEquals (expectedQuery .toString (), queryExec .query ().toString ());
19451945 }
19461946
1947-
19481947 public void testPushDownNegatedConjunctionsToKnnPrefilter () {
19491948 assumeTrue ("knn must be enabled" , EsqlCapabilities .Cap .KNN_FUNCTION_V3 .isEnabled ());
19501949
@@ -2050,7 +2049,8 @@ public void testPushDownComplexNegationsToKnnPrefilter() {
20502049
20512050 String query = """
20522051 from test
2053- | where ((knn(dense_vector, [0, 1, 2], 10) or NOT integer > 10) and NOT ((keyword == "test") or knn(dense_vector, [4, 5, 6], 10)))
2052+ | where ((knn(dense_vector, [0, 1, 2], 10) or NOT integer > 10)
2053+ and NOT ((keyword == "test") or knn(dense_vector, [4, 5, 6], 10)))
20542054 """ ;
20552055 var plan = plannerOptimizer .plan (query , IS_SV_STATS , makeAnalyzer ("mapping-all-types.json" ));
20562056
@@ -2060,11 +2060,17 @@ public void testPushDownComplexNegationsToKnnPrefilter() {
20602060 var fieldExtract = as (project .child (), FieldExtractExec .class );
20612061 var queryExec = as (fieldExtract .child (), EsQueryExec .class );
20622062
2063+ QueryBuilder notKeywordQuery = wrapWithSingleQuery (
2064+ query ,
2065+ unscore (boolQuery ().mustNot (unscore (termQuery ("keyword" , "test" )))),
2066+ "keyword" ,
2067+ new Source (3 , 12 , "keyword == \" test\" " )
2068+ );
20632069 QueryBuilder notKeywordFilter = wrapWithSingleQuery (
20642070 query ,
20652071 unscore (boolQuery ().mustNot (unscore (termQuery ("keyword" , "test" )))),
20662072 "keyword" ,
2067- new Source (2 , 74 , "keyword == \" test\" " )
2073+ new Source (3 , 6 , "NOT (( keyword == \" test\" ) or knn(dense_vector, [4, 5, 6], 10)) " )
20682074 );
20692075
20702076 QueryBuilder notIntegerGt10 = wrapWithSingleQuery (
@@ -2075,21 +2081,13 @@ public void testPushDownComplexNegationsToKnnPrefilter() {
20752081 );
20762082
20772083 KnnVectorQueryBuilder firstKnn = new KnnVectorQueryBuilder ("dense_vector" , new float [] { 0 , 1 , 2 }, 10 , null , null , null );
2078- KnnVectorQueryBuilder firstKnnFilter = new KnnVectorQueryBuilder ("dense_vector" , new float [] { 0 , 1 , 2 }, 10 , null , null , null );
20792084 KnnVectorQueryBuilder secondKnn = new KnnVectorQueryBuilder ("dense_vector" , new float [] { 4 , 5 , 6 }, 10 , null , null , null );
2080- KnnVectorQueryBuilder secondKnnFilter = new KnnVectorQueryBuilder ("dense_vector" , new float [] { 4 , 5 , 6 }, 10 , null , null , null );
20812085
2082- firstKnn .addFilterQuery (boolQuery ()
2083- .must (notKeywordFilter )
2084- .must (unscore (boolQuery ().mustNot (secondKnnFilter ))));
2085-
2086- secondKnn .addFilterQuery (boolQuery ()
2087- .should (firstKnnFilter )
2088- .should (notIntegerGt10 ));
2086+ firstKnn .addFilterQuery (notKeywordFilter );
2087+ secondKnn .addFilterQuery (notIntegerGt10 );
20892088
20902089 // Build the main boolean query structure
2091- BoolQueryBuilder expectedQuery = boolQuery ()
2092- .must (notKeywordFilter ) // NOT (keyword == "test")
2090+ BoolQueryBuilder expectedQuery = boolQuery ().must (notKeywordQuery ) // NOT (keyword == "test")
20932091 .must (unscore (boolQuery ().mustNot (secondKnn )))
20942092 .must (boolQuery ().should (firstKnn ).should (notIntegerGt10 ));
20952093
@@ -2112,14 +2110,6 @@ public void testMultipleKnnQueriesInPrefilters() {
21122110 var queryExec = as (field .child (), EsQueryExec .class );
21132111
21142112 KnnVectorQueryBuilder firstKnnQuery = new KnnVectorQueryBuilder ("dense_vector" , new float [] { 0 , 1 , 2 }, 10 , null , null , null );
2115- KnnVectorQueryBuilder firstKnnQueryAsFilter = new KnnVectorQueryBuilder (
2116- "dense_vector" ,
2117- new float [] { 0 , 1 , 2 },
2118- 10 ,
2119- null ,
2120- null ,
2121- null
2122- );
21232113 // Integer range query (right side of first OR)
21242114 QueryBuilder integerRangeQuery = wrapWithSingleQuery (
21252115 query ,
@@ -2130,14 +2120,6 @@ public void testMultipleKnnQueriesInPrefilters() {
21302120
21312121 // Second KNN query (right side of second OR)
21322122 KnnVectorQueryBuilder secondKnnQuery = new KnnVectorQueryBuilder ("dense_vector" , new float [] { 4 , 5 , 6 }, 10 , null , null , null );
2133- KnnVectorQueryBuilder secondKnnQueryAsFilter = new KnnVectorQueryBuilder (
2134- "dense_vector" ,
2135- new float [] { 4 , 5 , 6 },
2136- 10 ,
2137- null ,
2138- null ,
2139- null
2140- );
21412123
21422124 // Keyword term query (left side of second OR)
21432125 QueryBuilder keywordQuery = wrapWithSingleQuery (
@@ -2149,13 +2131,10 @@ public void testMultipleKnnQueriesInPrefilters() {
21492131
21502132 // First OR (knn1 OR integer > 10)
21512133 var firstOr = boolQuery ().should (firstKnnQuery ).should (integerRangeQuery );
2152- var firstOrAsFilter = boolQuery ().should (firstKnnQueryAsFilter ).should (integerRangeQuery );
21532134 // Second OR (keyword == "test" OR knn2)
21542135 var secondOr = boolQuery ().should (keywordQuery ).should (secondKnnQuery );
2155- var secondOrAsFilter = boolQuery ().should (keywordQuery ).should (secondKnnQueryAsFilter );
2156- // Add prefilters to the knn queries. knn queries in prefilters don't have prefilters so we use copies of the queries
2157- firstKnnQuery .addFilterQuery (secondOrAsFilter );
2158- secondKnnQuery .addFilterQuery (firstOrAsFilter );
2136+ firstKnnQuery .addFilterQuery (keywordQuery );
2137+ secondKnnQuery .addFilterQuery (integerRangeQuery );
21592138
21602139 // Top-level AND combining both ORs
21612140 var expectedQuery = boolQuery ().must (firstOr ).must (secondOr );
0 commit comments