Skip to content

Commit 1824a2f

Browse files
authored
Pure disjunctions should rewrite to a MatchNoneQueryBuilder (#48557) (#49673)
Closes #48475
1 parent e528b41 commit 1824a2f

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

server/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,12 +424,19 @@ protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws
424424
changed |= rewriteClauses(queryRewriteContext, mustNotClauses, newBuilder::mustNot);
425425
changed |= rewriteClauses(queryRewriteContext, filterClauses, newBuilder::filter);
426426
changed |= rewriteClauses(queryRewriteContext, shouldClauses, newBuilder::should);
427+
// early termination when must clause is empty and optional clauses is returning MatchNoneQueryBuilder
428+
if(mustClauses.size() == 0 && filterClauses.size() == 0 && shouldClauses.size() > 0
429+
&& newBuilder.shouldClauses.stream().allMatch(b -> b instanceof MatchNoneQueryBuilder)) {
430+
return new MatchNoneQueryBuilder();
431+
}
432+
427433
// lets do some early termination and prevent any kind of rewriting if we have a mandatory query that is a MatchNoneQueryBuilder
428434
Optional<QueryBuilder> any = Stream.concat(newBuilder.mustClauses.stream(), newBuilder.filterClauses.stream())
429435
.filter(b -> b instanceof MatchNoneQueryBuilder).findAny();
430436
if (any.isPresent()) {
431437
return any.get();
432438
}
439+
433440
if (changed) {
434441
newBuilder.adjustPureNegative = adjustPureNegative;
435442
newBuilder.minimumShouldMatch = minimumShouldMatch;

server/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,5 +371,20 @@ public void testRewriteWithMatchNone() throws IOException {
371371
.filter(new MatchNoneQueryBuilder()));
372372
rewritten = Rewriteable.rewrite(boolQueryBuilder, createShardContext());
373373
assertEquals(new MatchNoneQueryBuilder(), rewritten);
374+
375+
boolQueryBuilder = new BoolQueryBuilder();
376+
boolQueryBuilder.should(new WrapperQueryBuilder(new MatchNoneQueryBuilder().toString()));
377+
rewritten = Rewriteable.rewrite(boolQueryBuilder, createShardContext());
378+
assertEquals(new MatchNoneQueryBuilder(), rewritten);
379+
380+
boolQueryBuilder = new BoolQueryBuilder();
381+
boolQueryBuilder.should(new TermQueryBuilder("foo", "bar"));
382+
boolQueryBuilder.should(new WrapperQueryBuilder(new MatchNoneQueryBuilder().toString()));
383+
rewritten = Rewriteable.rewrite(boolQueryBuilder, createShardContext());
384+
assertNotEquals(new MatchNoneQueryBuilder(), rewritten);
385+
386+
boolQueryBuilder = new BoolQueryBuilder();
387+
rewritten = Rewriteable.rewrite(boolQueryBuilder, createShardContext());
388+
assertNotEquals(new MatchNoneQueryBuilder(), rewritten);
374389
}
375390
}

0 commit comments

Comments
 (0)