File tree Expand file tree Collapse file tree 2 files changed +22
-0
lines changed
main/java/org/elasticsearch/index/query
test/java/org/elasticsearch/index/query Expand file tree Collapse file tree 2 files changed +22
-0
lines changed Original file line number Diff line number Diff 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 ;
Original file line number Diff line number Diff 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}
You can’t perform that action at this time.
0 commit comments