Skip to content

Commit e641e38

Browse files
committed
Use filter again in PushFiltersToSource when no scoring is needed
1 parent 66935a0 commit e641e38

File tree

2 files changed

+28
-25
lines changed

2 files changed

+28
-25
lines changed

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/PushFiltersToSource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ private static PhysicalPlan rewrite(
101101
if (newPushable.size() > 0) { // update the executable with pushable conditions
102102
Query queryDSL = TRANSLATOR_HANDLER.asQuery(Predicates.combineAnd(newPushable));
103103
QueryBuilder planQuery = queryDSL.toQueryBuilder();
104-
var query = Queries.combine(Queries.Clause.MUST, asList(queryExec.query(), planQuery));
104+
Queries.Clause combiningQueryClauseType = queryExec.hasScoring() ? Queries.Clause.MUST : Queries.Clause.FILTER;
105+
var query = Queries.combine(combiningQueryClauseType, asList(queryExec.query(), planQuery));
105106
queryExec = new EsQueryExec(
106107
queryExec.source(),
107108
queryExec.indexPattern(),

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

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4769,11 +4769,11 @@ public void testPushSpatialDistanceToSource() {
47694769
var fieldExtract = as(project.child(), FieldExtractExec.class);
47704770
var source = source(fieldExtract.child());
47714771
var bool = as(source.query(), BoolQueryBuilder.class);
4772-
var rangeQueryBuilders = bool.must().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
4772+
var rangeQueryBuilders = bool.filter().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
47734773
assertThat("Expected one range query builder", rangeQueryBuilders.size(), equalTo(1));
47744774
assertThat(((SingleValueQuery.Builder) rangeQueryBuilders.get(0)).field(), equalTo("scalerank"));
47754775
if (op.equals("==")) {
4776-
var boolQueryBuilders = bool.must().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
4776+
var boolQueryBuilders = bool.filter().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
47774777
assertThat("Expected one sub-bool query builder", boolQueryBuilders.size(), equalTo(1));
47784778
var bool2 = as(boolQueryBuilders.get(0), BoolQueryBuilder.class);
47794779
var shapeQueryBuilders = bool2.must()
@@ -4782,7 +4782,7 @@ public void testPushSpatialDistanceToSource() {
47824782
.toList();
47834783
assertShapeQueryRange(shapeQueryBuilders, Math.nextDown(expected.value), expected.value);
47844784
} else {
4785-
var shapeQueryBuilders = bool.must()
4785+
var shapeQueryBuilders = bool.filter()
47864786
.stream()
47874787
.filter(p -> p instanceof SpatialRelatesQuery.ShapeQueryBuilder)
47884788
.toList();
@@ -4828,7 +4828,7 @@ AND ST_DISTANCE(location, TO_GEOPOINT("POINT(12.565 55.673)")) >= 400000
48284828
var fieldExtract = as(project.child(), FieldExtractExec.class);
48294829
var source = source(fieldExtract.child());
48304830
var bool = as(source.query(), BoolQueryBuilder.class);
4831-
var rangeQueryBuilders = bool.must().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
4831+
var rangeQueryBuilders = bool.filter().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
48324832
assertThat("Expected zero range query builder", rangeQueryBuilders.size(), equalTo(0));
48334833
var shapeQueryBuilders = bool.must().stream().filter(p -> p instanceof SpatialRelatesQuery.ShapeQueryBuilder).toList();
48344834
assertShapeQueryRange(shapeQueryBuilders, 400000.0, 600000.0);
@@ -4932,7 +4932,7 @@ public void testPushSpatialDistanceEvalToSource() {
49324932
var fieldExtract2 = as(evalExec.child(), FieldExtractExec.class);
49334933
var source = source(fieldExtract2.child());
49344934
var bool = as(source.query(), BoolQueryBuilder.class);
4935-
var rangeQueryBuilders = bool.must().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
4935+
var rangeQueryBuilders = bool.filter().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
49364936
assertThat("Expected zero range query builder", rangeQueryBuilders.size(), equalTo(0));
49374937
var shapeQueryBuilders = bool.must().stream().filter(p -> p instanceof SpatialRelatesQuery.ShapeQueryBuilder).toList();
49384938
assertShapeQueryRange(shapeQueryBuilders, 400000.0, 600000.0);
@@ -4989,7 +4989,7 @@ public void testPushSpatialDistanceMultiEvalToSource() {
49894989
var fieldExtract2 = as(evalExec.child(), FieldExtractExec.class);
49904990
var source = source(fieldExtract2.child());
49914991
var bool = as(source.query(), BoolQueryBuilder.class);
4992-
var rangeQueryBuilders = bool.must().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
4992+
var rangeQueryBuilders = bool.filter().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
49934993
assertThat("Expected zero range query builder", rangeQueryBuilders.size(), equalTo(0));
49944994
var shapeQueryBuilders = bool.must().stream().filter(p -> p instanceof SpatialRelatesQuery.ShapeQueryBuilder).toList();
49954995
assertShapeQueryRange(shapeQueryBuilders, 400000.0, 600000.0);
@@ -5077,8 +5077,9 @@ AND ST_DISTANCE(location, TO_GEOPOINT("POINT(12.565 55.673)")) >= 200000))
50775077
var fieldExtract = as(project.child(), FieldExtractExec.class);
50785078
var source = source(fieldExtract.child());
50795079
var bool = as(source.query(), BoolQueryBuilder.class);
5080-
assertThat("Expected boolean query of three MUST clauses", bool.must().size(), equalTo(3));
5081-
var boolDisjuntive = as(bool.must().get(2), BoolQueryBuilder.class);
5080+
assertThat("Expected boolean query of three MUST clauses", bool.must().size(), equalTo(2));
5081+
assertThat("Expected boolean query of one FILTER clause", bool.filter().size(), equalTo(1));
5082+
var boolDisjuntive = as(bool.filter().get(0), BoolQueryBuilder.class);
50825083
var disjuntiveQueryBuilders = boolDisjuntive.should().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
50835084
assertThat("Expected two disjunctive query builders", disjuntiveQueryBuilders.size(), equalTo(2));
50845085
for (int i = 0; i < disjuntiveQueryBuilders.size(); i++) {
@@ -5166,8 +5167,9 @@ AND NOT (distance <= 500000
51665167
var fieldExtract2 = as(evalExec.child(), FieldExtractExec.class);
51675168
var source = source(fieldExtract2.child());
51685169
var bool = as(source.query(), BoolQueryBuilder.class);
5169-
assertThat("Expected boolean query of three MUST clauses", bool.must().size(), equalTo(3));
5170-
var boolDisjuntive = as(bool.must().get(2), BoolQueryBuilder.class);
5170+
assertThat("Expected boolean query of three MUST clauses", bool.must().size(), equalTo(2));
5171+
assertThat("Expected boolean query of one FILTER clause", bool.filter().size(), equalTo(1));
5172+
var boolDisjuntive = as(bool.filter().get(0), BoolQueryBuilder.class);
51715173
var disjuntiveQueryBuilders = boolDisjuntive.should().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
51725174
assertThat("Expected two disjunctive query builders", disjuntiveQueryBuilders.size(), equalTo(2));
51735175
for (int i = 0; i < disjuntiveQueryBuilders.size(); i++) {
@@ -5375,10 +5377,10 @@ public void testPushSpatialDistanceEvalWithStatsToSource() {
53755377

53765378
// Fine-grained checks on the pushed down query
53775379
var bool = as(source.query(), BoolQueryBuilder.class);
5378-
var rangeQueryBuilders = bool.must().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
5380+
var rangeQueryBuilders = bool.filter().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
53795381
assertThat("Expected one range query builder", rangeQueryBuilders.size(), equalTo(1));
53805382
assertThat(((SingleValueQuery.Builder) rangeQueryBuilders.get(0)).field(), equalTo("scalerank"));
5381-
var filterBool = bool.must().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
5383+
var filterBool = bool.filter().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
53825384
var fb = as(filterBool.get(0), BoolQueryBuilder.class);
53835385
var shapeQueryBuilders = fb.must().stream().filter(p -> p instanceof SpatialRelatesQuery.ShapeQueryBuilder).toList();
53845386
assertShapeQueryRange(shapeQueryBuilders, 10000.0, 1000000.0);
@@ -5849,10 +5851,10 @@ public void testPushTopNDistanceWithCompoundFilterToSource() {
58495851

58505852
// Fine-grained checks on the pushed down query
58515853
var bool = as(source.query(), BoolQueryBuilder.class);
5852-
var rangeQueryBuilders = bool.must().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
5854+
var rangeQueryBuilders = bool.filter().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
58535855
assertThat("Expected one range query builder", rangeQueryBuilders.size(), equalTo(1));
58545856
assertThat(((SingleValueQuery.Builder) rangeQueryBuilders.get(0)).field(), equalTo("scalerank"));
5855-
var filterBool = bool.must().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
5857+
var filterBool = bool.filter().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
58565858
var fb = as(filterBool.get(0), BoolQueryBuilder.class);
58575859
var shapeQueryBuilders = fb.must().stream().filter(p -> p instanceof SpatialRelatesQuery.ShapeQueryBuilder).toList();
58585860
assertShapeQueryRange(shapeQueryBuilders, 10000.0, 500000.0);
@@ -5943,10 +5945,10 @@ public void testPushTopNDistanceAndPushableFieldWithCompoundFilterToSource() {
59435945

59445946
// Fine-grained checks on the pushed down query
59455947
var bool = as(source.query(), BoolQueryBuilder.class);
5946-
var rangeQueryBuilders = bool.must().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
5948+
var rangeQueryBuilders = bool.filter().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
59475949
assertThat("Expected one range query builder", rangeQueryBuilders.size(), equalTo(1));
59485950
assertThat(((SingleValueQuery.Builder) rangeQueryBuilders.get(0)).field(), equalTo("scalerank"));
5949-
var filterBool = bool.must().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
5951+
var filterBool = bool.filter().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
59505952
var fb = as(filterBool.get(0), BoolQueryBuilder.class);
59515953
var shapeQueryBuilders = fb.must().stream().filter(p -> p instanceof SpatialRelatesQuery.ShapeQueryBuilder).toList();
59525954
assertShapeQueryRange(shapeQueryBuilders, 10000.0, 500000.0);
@@ -6018,10 +6020,10 @@ public void testPushTopNDistanceAndNonPushableEvalWithCompoundFilterToSource() {
60186020

60196021
// Fine-grained checks on the pushed down query
60206022
var bool = as(source.query(), BoolQueryBuilder.class);
6021-
var rangeQueryBuilders = bool.must().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
6023+
var rangeQueryBuilders = bool.filter().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
60226024
assertThat("Expected one range query builder", rangeQueryBuilders.size(), equalTo(1));
60236025
assertThat(((SingleValueQuery.Builder) rangeQueryBuilders.get(0)).field(), equalTo("scalerank"));
6024-
var filterBool = bool.must().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
6026+
var filterBool = bool.filter().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
60256027
var fb = as(filterBool.get(0), BoolQueryBuilder.class);
60266028
var shapeQueryBuilders = fb.must().stream().filter(p -> p instanceof SpatialRelatesQuery.ShapeQueryBuilder).toList();
60276029
assertShapeQueryRange(shapeQueryBuilders, 10000.0, 500000.0);
@@ -6247,10 +6249,10 @@ public void testPushCompoundTopNDistanceWithCompoundFilterToSource() {
62476249

62486250
// Fine-grained checks on the pushed down query
62496251
var bool = as(source.query(), BoolQueryBuilder.class);
6250-
var rangeQueryBuilders = bool.must().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
6252+
var rangeQueryBuilders = bool.filter().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
62516253
assertThat("Expected one range query builder", rangeQueryBuilders.size(), equalTo(1));
62526254
assertThat(((SingleValueQuery.Builder) rangeQueryBuilders.get(0)).field(), equalTo("scalerank"));
6253-
var filterBool = bool.must().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
6255+
var filterBool = bool.filter().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
62546256
var fb = as(filterBool.get(0), BoolQueryBuilder.class);
62556257
var shapeQueryBuilders = fb.must().stream().filter(p -> p instanceof SpatialRelatesQuery.ShapeQueryBuilder).toList();
62566258
assertShapeQueryRange(shapeQueryBuilders, 10000.0, 500000.0);
@@ -6346,10 +6348,10 @@ public void testPushCompoundTopNDistanceWithCompoundFilterAndCompoundEvalToSourc
63466348

63476349
// Fine-grained checks on the pushed down query
63486350
var bool = as(source.query(), BoolQueryBuilder.class);
6349-
var rangeQueryBuilders = bool.must().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
6351+
var rangeQueryBuilders = bool.filter().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
63506352
assertThat("Expected one range query builder", rangeQueryBuilders.size(), equalTo(1));
63516353
assertThat(((SingleValueQuery.Builder) rangeQueryBuilders.get(0)).field(), equalTo("scalerank"));
6352-
var filterBool = bool.must().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
6354+
var filterBool = bool.filter().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
63536355
var fb = as(filterBool.get(0), BoolQueryBuilder.class);
63546356
var shapeQueryBuilders = fb.must().stream().filter(p -> p instanceof SpatialRelatesQuery.ShapeQueryBuilder).toList();
63556357
assertShapeQueryRange(shapeQueryBuilders, 10000.0, 500000.0);
@@ -6532,10 +6534,10 @@ public void testPushCompoundTopNDistanceWithCompoundFilterAndNestedCompoundEvalT
65326534

65336535
// Fine-grained checks on the pushed down query
65346536
var bool = as(source.query(), BoolQueryBuilder.class);
6535-
var rangeQueryBuilders = bool.must().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
6537+
var rangeQueryBuilders = bool.filter().stream().filter(p -> p instanceof SingleValueQuery.Builder).toList();
65366538
assertThat("Expected one range query builder", rangeQueryBuilders.size(), equalTo(1));
65376539
assertThat(((SingleValueQuery.Builder) rangeQueryBuilders.get(0)).field(), equalTo("scalerank"));
6538-
var filterBool = bool.must().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
6540+
var filterBool = bool.filter().stream().filter(p -> p instanceof BoolQueryBuilder).toList();
65396541
var fb = as(filterBool.get(0), BoolQueryBuilder.class);
65406542
var shapeQueryBuilders = fb.must().stream().filter(p -> p instanceof SpatialRelatesQuery.ShapeQueryBuilder).toList();
65416543
assertShapeQueryRange(shapeQueryBuilders, 10000.0, 500000.0);

0 commit comments

Comments
 (0)