@@ -7852,7 +7852,7 @@ public void testSampleNoPushDownChangePoint() {
78527852 }
78537853
78547854 public void testPushDownConjunctionsToKnnPrefilter () {
7855- assumeTrue ("sample must be enabled" , EsqlCapabilities .Cap .SAMPLE_V3 .isEnabled ());
7855+ assumeTrue ("knn must be enabled" , EsqlCapabilities .Cap .KNN_FUNCTION_V3 .isEnabled ());
78567856
78577857 var query = """
78587858 from test
@@ -7870,4 +7870,88 @@ public void testPushDownConjunctionsToKnnPrefilter() {
78707870 assertThat (and .right (), equalTo (prefilter ));
78717871 var esRelation = as (filter .child (), EsRelation .class );
78727872 }
7873+
7874+ public void testNotPushDownDisjunctionsToKnnPrefilter () {
7875+ assumeTrue ("knn must be enabled" , EsqlCapabilities .Cap .KNN_FUNCTION_V3 .isEnabled ());
7876+
7877+ var query = """
7878+ from test
7879+ | where knn(dense_vector, [0, 1, 2], 10) or integer > 10
7880+ """ ;
7881+ var optimized = planTypes (query );
7882+
7883+ var limit = as (optimized , Limit .class );
7884+ var filter = as (limit .child (), Filter .class );
7885+ var or = as (filter .condition (), Or .class );
7886+ var knn = as (or .left (), Knn .class );
7887+ List <Expression > filterExpressions = knn .filterExpressions ();
7888+ assertThat (filterExpressions .size (), equalTo (0 ));
7889+ }
7890+
7891+ public void testPushDownConjunctionsAndNotDisjunctionsToKnnPrefilter () {
7892+ assumeTrue ("knn must be enabled" , EsqlCapabilities .Cap .KNN_FUNCTION_V3 .isEnabled ());
7893+
7894+ /*
7895+ and
7896+ and
7897+ or
7898+ knn(dense_vector, [0, 1, 2], 10)
7899+ integer > 10
7900+ keyword == "test"
7901+ or
7902+ short < 5
7903+ double > 5.0
7904+ */
7905+ // Both conjunctions are pushed down to knn prefilters, disjunctions are not
7906+ var query = """
7907+ from test
7908+ | where
7909+ ((knn(dense_vector, [0, 1, 2], 10) or integer > 10) and keyword == "test") and ((short < 5) or (double > 5.0))
7910+ """ ;
7911+ var optimized = planTypes (query );
7912+
7913+ var limit = as (optimized , Limit .class );
7914+ var filter = as (limit .child (), Filter .class );
7915+ var and = as (filter .condition (), And .class );
7916+ var leftAnd = as (and .left (), And .class );
7917+ var rightOr = as (and .right (), Or .class );
7918+ var leftOr = as (leftAnd .left (), Or .class );
7919+ var knn = as (leftOr .left (), Knn .class );
7920+ var rightOrPrefilter = as (knn .filterExpressions ().get (0 ), Or .class );
7921+ assertThat (rightOr , equalTo (rightOrPrefilter ));
7922+ var leftAndPrefilter = as (knn .filterExpressions ().get (1 ), Equals .class );
7923+ assertThat (leftAnd .right (), equalTo (leftAndPrefilter ));
7924+ }
7925+
7926+ public void testMorePushDownConjunctionsAndNotDisjunctionsToKnnPrefilter () {
7927+ assumeTrue ("knn must be enabled" , EsqlCapabilities .Cap .KNN_FUNCTION_V3 .isEnabled ());
7928+
7929+ /*
7930+ or
7931+ or
7932+ and
7933+ knn(dense_vector, [0, 1, 2], 10)
7934+ integer > 10
7935+ keyword == "test"
7936+ and
7937+ short < 5
7938+ double > 5.0
7939+ */
7940+ // Just the conjunction is pushed down to knn prefilters, disjunctions are not
7941+ var query = """
7942+ from test
7943+ | where
7944+ ((knn(dense_vector, [0, 1, 2], 10) and integer > 10) or keyword == "test") or ((short < 5) and (double > 5.0))
7945+ """ ;
7946+ var optimized = planTypes (query );
7947+
7948+ var limit = as (optimized , Limit .class );
7949+ var filter = as (limit .child (), Filter .class );
7950+ var or = as (filter .condition (), Or .class );
7951+ var leftOr = as (or .left (), Or .class );
7952+ var leftAnd = as (leftOr .left (), And .class );
7953+ var knn = as (leftAnd .left (), Knn .class );
7954+ var rightAndPrefilter = as (knn .filterExpressions ().get (0 ), GreaterThan .class );
7955+ assertThat (leftAnd .right (), equalTo (rightAndPrefilter ));
7956+ }
78737957}
0 commit comments