Skip to content

Commit 08bf0ae

Browse files
SivagurunathanVjpountz
authored andcommitted
Pure disjunctions should rewrite to a MatchNoneQueryBuilder (#48557)
Closes #48475
1 parent d596585 commit 08bf0ae

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
@@ -417,12 +417,19 @@ protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws
417417
changed |= rewriteClauses(queryRewriteContext, mustNotClauses, newBuilder::mustNot);
418418
changed |= rewriteClauses(queryRewriteContext, filterClauses, newBuilder::filter);
419419
changed |= rewriteClauses(queryRewriteContext, shouldClauses, newBuilder::should);
420+
// early termination when must clause is empty and optional clauses is returning MatchNoneQueryBuilder
421+
if(mustClauses.size() == 0 && filterClauses.size() == 0 && shouldClauses.size() > 0
422+
&& newBuilder.shouldClauses.stream().allMatch(b -> b instanceof MatchNoneQueryBuilder)) {
423+
return new MatchNoneQueryBuilder();
424+
}
425+
420426
// lets do some early termination and prevent any kind of rewriting if we have a mandatory query that is a MatchNoneQueryBuilder
421427
Optional<QueryBuilder> any = Stream.concat(newBuilder.mustClauses.stream(), newBuilder.filterClauses.stream())
422428
.filter(b -> b instanceof MatchNoneQueryBuilder).findAny();
423429
if (any.isPresent()) {
424430
return any.get();
425431
}
432+
426433
if (changed) {
427434
newBuilder.adjustPureNegative = adjustPureNegative;
428435
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)