浏览代码

WrapperQueryBuilder should also rewrite the parsed query.

Failing to do so can cause other errors later on during query execution.
For example if  `WrapperQueryBuilder` wraps a `GeoShapeQueryBuilder` that fetches the shape from an index then it will skip the shape fetching
and fail later with the error that no shapes have been fetched.
Martijn van Groningen 8 年之前
父节点
当前提交
c8da7f84a2

+ 1 - 1
core/src/main/java/org/elasticsearch/index/query/WrapperQueryBuilder.java

@@ -160,7 +160,7 @@ public class WrapperQueryBuilder extends AbstractQueryBuilder<WrapperQueryBuilde
     protected QueryBuilder doRewrite(QueryRewriteContext context) throws IOException {
         try (XContentParser qSourceParser = XContentFactory.xContent(source).createParser(context.getXContentRegistry(), source)) {
 
-            final QueryBuilder queryBuilder = parseInnerQueryBuilder(qSourceParser);
+            final QueryBuilder queryBuilder = parseInnerQueryBuilder(qSourceParser).rewrite(context);
             if (boost() != DEFAULT_BOOST || queryName() != null) {
                 final BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
                 boolQueryBuilder.must(queryBuilder);

+ 1 - 1
core/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTests.java

@@ -409,7 +409,7 @@ public class BoolQueryBuilderTests extends AbstractQueryTestCase<BoolQueryBuilde
         boolQueryBuilder.must(new WrapperQueryBuilder(new WrapperQueryBuilder(new MatchAllQueryBuilder().toString()).toString()));
         QueryBuilder rewritten = boolQueryBuilder.rewrite(createShardContext());
         BoolQueryBuilder expected = new BoolQueryBuilder();
-        expected.must(new WrapperQueryBuilder(new MatchAllQueryBuilder().toString()));
+        expected.must(new MatchAllQueryBuilder());
         assertEquals(expected, rewritten);
 
         expected = new BoolQueryBuilder();

+ 20 - 0
core/src/test/java/org/elasticsearch/index/query/WrapperQueryBuilderTests.java

@@ -19,9 +19,11 @@
 
 package org.elasticsearch.index.query;
 
+import org.apache.lucene.index.Term;
 import org.apache.lucene.index.memory.MemoryIndex;
 import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TermQuery;
 import org.elasticsearch.action.support.ToXContentToBytes;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.bytes.BytesArray;
@@ -129,6 +131,24 @@ public class WrapperQueryBuilderTests extends AbstractQueryTestCase<WrapperQuery
         assertEquals(new BoolQueryBuilder().must(query).boost(3), builder.rewrite(shardContext));
     }
 
+    public void testRewriteInnerQueryToo() throws IOException {
+        QueryShardContext shardContext = createShardContext();
+
+        QueryBuilder qb = new WrapperQueryBuilder(
+            new WrapperQueryBuilder(new TermQueryBuilder("foo", "bar").toString()).toString()
+        );
+        assertEquals(new TermQuery(new Term("foo", "bar")), qb.rewrite(shardContext).toQuery(shardContext));
+        qb = new WrapperQueryBuilder(
+            new WrapperQueryBuilder(
+                new WrapperQueryBuilder(new TermQueryBuilder("foo", "bar").toString()).toString()
+            ).toString()
+        );
+        assertEquals(new TermQuery(new Term("foo", "bar")), qb.rewrite(shardContext).toQuery(shardContext));
+
+        qb = new WrapperQueryBuilder(new BoolQueryBuilder().toString());
+        assertEquals(new MatchAllDocsQuery(), qb.rewrite(shardContext).toQuery(shardContext));
+    }
+
     @Override
     protected Query rewrite(Query query) throws IOException {
         // WrapperQueryBuilder adds some optimization if the wrapper and query builder have boosts / query names that wraps