Skip to content

Commit a73973f

Browse files
committed
Add tests
1 parent 6a52b63 commit a73973f

File tree

1 file changed

+85
-1
lines changed

1 file changed

+85
-1
lines changed

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)