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 @@ -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 ;
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