Skip to content

Commit a99e75f

Browse files
committed
Add multiple filters test
1 parent 91d4a0a commit a99e75f

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1871,6 +1871,42 @@ public void testKnnPrefilters() {
18711871
assertEquals(expectedQuery.toString(), queryExec.query().toString());
18721872
}
18731873

1874+
public void testKnnPrefiltersWithMultipleFilters() {
1875+
assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V3.isEnabled());
1876+
1877+
String query = """
1878+
from test
1879+
| where knn(dense_vector, [0, 1, 2], 10)
1880+
| where integer > 10
1881+
| where keyword == "test"
1882+
""";
1883+
var plan = plannerOptimizer.plan(query, IS_SV_STATS, makeAnalyzer("mapping-all-types.json"));
1884+
1885+
var limit = as(plan, LimitExec.class);
1886+
var exchange = as(limit.child(), ExchangeExec.class);
1887+
var project = as(exchange.child(), ProjectExec.class);
1888+
var field = as(project.child(), FieldExtractExec.class);
1889+
var queryExec = as(field.child(), EsQueryExec.class);
1890+
var integerFilter = wrapWithSingleQuery(query, unscore(rangeQuery("integer").gt(10)), "integer", new Source(3, 8, "integer > 10"));
1891+
var keywordFilter = wrapWithSingleQuery(
1892+
query,
1893+
unscore(termQuery("keyword", "test")),
1894+
"keyword",
1895+
new Source(4, 8, "keyword == \"test\"")
1896+
);
1897+
QueryBuilder expectedFilterQueryBuilder = boolQuery().must(integerFilter).must(keywordFilter);
1898+
KnnVectorQueryBuilder expectedKnnQueryBuilder = new KnnVectorQueryBuilder(
1899+
"dense_vector",
1900+
new float[] { 0, 1, 2 },
1901+
10,
1902+
null,
1903+
null,
1904+
null
1905+
).addFilterQuery(expectedFilterQueryBuilder);
1906+
var expectedQuery = boolQuery().must(expectedKnnQueryBuilder).must(integerFilter).must(keywordFilter);
1907+
assertEquals(expectedQuery.toString(), queryExec.query().toString());
1908+
}
1909+
18741910
public void testPushDownConjunctionsToKnnPrefilter() {
18751911
assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V3.isEnabled());
18761912

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7877,6 +7877,29 @@ public void testPushDownConjunctionsToKnnPrefilter() {
78777877
var esRelation = as(filter.child(), EsRelation.class);
78787878
}
78797879

7880+
public void testPushDownMultipleFiltersToKnnPrefilter() {
7881+
assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V3.isEnabled());
7882+
7883+
var query = """
7884+
from test
7885+
| where knn(dense_vector, [0, 1, 2], 10)
7886+
| where integer > 10
7887+
| where keyword == "test"
7888+
""";
7889+
var optimized = planTypes(query);
7890+
7891+
var limit = as(optimized, Limit.class);
7892+
var filter = as(limit.child(), Filter.class);
7893+
var firstAnd = as(filter.condition(), And.class);
7894+
var knn = as(firstAnd.left(), Knn.class);
7895+
var prefilterAnd = as(firstAnd.right(), And.class);
7896+
as(prefilterAnd.left(), GreaterThan.class);
7897+
as(prefilterAnd.right(), Equals.class);
7898+
List<Expression> filterExpressions = knn.filterExpressions();
7899+
assertThat(filterExpressions.size(), equalTo(1));
7900+
assertThat(prefilterAnd, equalTo(filterExpressions.get(0)));
7901+
}
7902+
78807903
public void testNotPushDownDisjunctionsToKnnPrefilter() {
78817904
assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V3.isEnabled());
78827905

0 commit comments

Comments
 (0)