Browse Source

AbstractQueryBuilder to no longer extend ToXContentBytes (#25948)

ToXContentToBytes is used as a base class that adds toString and buildAsBytes method implementation to classes that implement ToXContent. With the ongoing cleanups, this class is limited and doesn't add a lot of value, given that buildAsBytes can be replaced with XContentHelper.toXContent and toString can be replaced with Strings.toString(this).

The plan would be to remove ToXContentToBytes entirely, and AbstractQueryBuilder is the first place where we can remove its usage.
Luca Cavanna 8 years ago
parent
commit
4d589afbc2

+ 17 - 13
core/src/main/java/org/elasticsearch/index/query/AbstractQueryBuilder.java

@@ -24,9 +24,9 @@ import org.apache.lucene.search.Query;
 import org.apache.lucene.search.spans.SpanBoostQuery;
 import org.apache.lucene.search.spans.SpanBoostQuery;
 import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.BytesRef;
-import org.elasticsearch.action.support.ToXContentToBytes;
 import org.elasticsearch.common.ParseField;
 import org.elasticsearch.common.ParseField;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.ParsingException;
+import org.elasticsearch.common.Strings;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamOutput;
 import org.elasticsearch.common.io.stream.StreamOutput;
 import org.elasticsearch.common.lucene.BytesRefs;
 import org.elasticsearch.common.lucene.BytesRefs;
@@ -35,7 +35,6 @@ import org.elasticsearch.common.xcontent.NamedXContentRegistry.UnknownNamedObjec
 import org.elasticsearch.common.xcontent.XContentBuilder;
 import org.elasticsearch.common.xcontent.XContentBuilder;
 import org.elasticsearch.common.xcontent.XContentLocation;
 import org.elasticsearch.common.xcontent.XContentLocation;
 import org.elasticsearch.common.xcontent.XContentParser;
 import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.common.xcontent.XContentType;
 
 
 import java.io.IOException;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.ArrayList;
@@ -48,7 +47,7 @@ import java.util.Objects;
  * Base class for all classes producing lucene queries.
  * Base class for all classes producing lucene queries.
  * Supports conversion to BytesReference and creation of lucene Query objects.
  * Supports conversion to BytesReference and creation of lucene Query objects.
  */
  */
-public abstract class AbstractQueryBuilder<QB extends AbstractQueryBuilder<QB>> extends ToXContentToBytes implements QueryBuilder {
+public abstract class AbstractQueryBuilder<QB extends AbstractQueryBuilder<QB>> implements QueryBuilder {
 
 
     /** Default for boost to apply to resulting Lucene query. Defaults to 1.0*/
     /** Default for boost to apply to resulting Lucene query. Defaults to 1.0*/
     public static final float DEFAULT_BOOST = 1.0f;
     public static final float DEFAULT_BOOST = 1.0f;
@@ -59,7 +58,7 @@ public abstract class AbstractQueryBuilder<QB extends AbstractQueryBuilder<QB>>
     protected float boost = DEFAULT_BOOST;
     protected float boost = DEFAULT_BOOST;
 
 
     protected AbstractQueryBuilder() {
     protected AbstractQueryBuilder() {
-        super(XContentType.JSON);
+
     }
     }
 
 
     protected AbstractQueryBuilder(StreamInput in) throws IOException {
     protected AbstractQueryBuilder(StreamInput in) throws IOException {
@@ -113,7 +112,7 @@ public abstract class AbstractQueryBuilder<QB extends AbstractQueryBuilder<QB>>
 
 
     @Override
     @Override
     public final Query toFilter(QueryShardContext context) throws IOException {
     public final Query toFilter(QueryShardContext context) throws IOException {
-        Query result = null;
+        Query result;
             final boolean originalIsFilter = context.isFilter();
             final boolean originalIsFilter = context.isFilter();
             try {
             try {
                 context.setIsFilter(true);
                 context.setIsFilter(true);
@@ -200,7 +199,7 @@ public abstract class AbstractQueryBuilder<QB extends AbstractQueryBuilder<QB>>
      * @param obj the input object
      * @param obj the input object
      * @return the same input object or a {@link BytesRef} representation if input was of type string
      * @return the same input object or a {@link BytesRef} representation if input was of type string
      */
      */
-    protected static Object convertToBytesRefIfString(Object obj) {
+    static Object convertToBytesRefIfString(Object obj) {
         if (obj instanceof String) {
         if (obj instanceof String) {
             return BytesRefs.toBytesRef(obj);
             return BytesRefs.toBytesRef(obj);
         }
         }
@@ -213,7 +212,7 @@ public abstract class AbstractQueryBuilder<QB extends AbstractQueryBuilder<QB>>
      * @param obj the input object
      * @param obj the input object
      * @return the same input object or a utf8 string if input was of type {@link BytesRef}
      * @return the same input object or a utf8 string if input was of type {@link BytesRef}
      */
      */
-    protected static Object convertToStringIfBytesRef(Object obj) {
+    static Object convertToStringIfBytesRef(Object obj) {
         if (obj instanceof BytesRef) {
         if (obj instanceof BytesRef) {
             return ((BytesRef) obj).utf8ToString();
             return ((BytesRef) obj).utf8ToString();
         }
         }
@@ -226,7 +225,7 @@ public abstract class AbstractQueryBuilder<QB extends AbstractQueryBuilder<QB>>
      * their {@link QueryBuilder#toQuery(QueryShardContext)} method are not added to the
      * their {@link QueryBuilder#toQuery(QueryShardContext)} method are not added to the
      * resulting collection.
      * resulting collection.
      */
      */
-    protected static Collection<Query> toQueries(Collection<QueryBuilder> queryBuilders, QueryShardContext context) throws QueryShardException,
+    static Collection<Query> toQueries(Collection<QueryBuilder> queryBuilders, QueryShardContext context) throws QueryShardException,
             IOException {
             IOException {
         List<Query> queries = new ArrayList<>(queryBuilders.size());
         List<Query> queries = new ArrayList<>(queryBuilders.size());
         for (QueryBuilder queryBuilder : queryBuilders) {
         for (QueryBuilder queryBuilder : queryBuilders) {
@@ -244,14 +243,14 @@ public abstract class AbstractQueryBuilder<QB extends AbstractQueryBuilder<QB>>
         return getWriteableName();
         return getWriteableName();
     }
     }
 
 
-    protected static final void writeQueries(StreamOutput out, List<? extends QueryBuilder> queries) throws IOException {
+    static void writeQueries(StreamOutput out, List<? extends QueryBuilder> queries) throws IOException {
         out.writeVInt(queries.size());
         out.writeVInt(queries.size());
         for (QueryBuilder query : queries) {
         for (QueryBuilder query : queries) {
             out.writeNamedWriteable(query);
             out.writeNamedWriteable(query);
         }
         }
     }
     }
 
 
-    protected static final List<QueryBuilder> readQueries(StreamInput in) throws IOException {
+    static List<QueryBuilder> readQueries(StreamInput in) throws IOException {
         int size = in.readVInt();
         int size = in.readVInt();
         List<QueryBuilder> queries = new ArrayList<>(size);
         List<QueryBuilder> queries = new ArrayList<>(size);
         for (int i = 0; i < size; i++) {
         for (int i = 0; i < size; i++) {
@@ -353,8 +352,13 @@ public abstract class AbstractQueryBuilder<QB extends AbstractQueryBuilder<QB>>
      * {@link MatchAllQueryBuilder} and {@link MatchNoneQueryBuilder} support these fields so they
      * {@link MatchAllQueryBuilder} and {@link MatchNoneQueryBuilder} support these fields so they
      * should use this method.
      * should use this method.
      */
      */
-    protected static void declareStandardFields(AbstractObjectParser<? extends QueryBuilder, ?> parser) {
-        parser.declareFloat((builder, value) -> builder.boost(value), AbstractQueryBuilder.BOOST_FIELD);
-        parser.declareString((builder, value) -> builder.queryName(value), AbstractQueryBuilder.NAME_FIELD);
+    static void declareStandardFields(AbstractObjectParser<? extends QueryBuilder, ?> parser) {
+        parser.declareFloat(QueryBuilder::boost, AbstractQueryBuilder.BOOST_FIELD);
+        parser.declareString(QueryBuilder::queryName, AbstractQueryBuilder.NAME_FIELD);
+    }
+
+    @Override
+    public final String toString() {
+        return Strings.toString(this, true, true);
     }
     }
 }
 }

+ 13 - 3
core/src/test/java/org/elasticsearch/index/query/WrapperQueryBuilderTests.java

@@ -24,14 +24,16 @@ import org.apache.lucene.index.memory.MemoryIndex;
 import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TermQuery;
-import org.elasticsearch.action.support.ToXContentToBytes;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.bytes.BytesArray;
 import org.elasticsearch.common.bytes.BytesArray;
 import org.elasticsearch.common.bytes.BytesReference;
 import org.elasticsearch.common.bytes.BytesReference;
+import org.elasticsearch.common.xcontent.XContentHelper;
+import org.elasticsearch.common.xcontent.XContentType;
 import org.elasticsearch.search.internal.SearchContext;
 import org.elasticsearch.search.internal.SearchContext;
 import org.elasticsearch.test.AbstractQueryTestCase;
 import org.elasticsearch.test.AbstractQueryTestCase;
 
 
 import java.io.IOException;
 import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.io.UnsupportedEncodingException;
 import java.io.UnsupportedEncodingException;
 
 
 public class WrapperQueryBuilderTests extends AbstractQueryTestCase<WrapperQueryBuilder> {
 public class WrapperQueryBuilderTests extends AbstractQueryTestCase<WrapperQueryBuilder> {
@@ -44,13 +46,21 @@ public class WrapperQueryBuilderTests extends AbstractQueryTestCase<WrapperQuery
     @Override
     @Override
     protected WrapperQueryBuilder doCreateTestQueryBuilder() {
     protected WrapperQueryBuilder doCreateTestQueryBuilder() {
         QueryBuilder wrappedQuery = RandomQueryBuilder.createQuery(random());
         QueryBuilder wrappedQuery = RandomQueryBuilder.createQuery(random());
+        BytesReference bytes;
+        try {
+            bytes = XContentHelper.toXContent(wrappedQuery, XContentType.JSON, false);
+        } catch(IOException e) {
+            throw new UncheckedIOException(e);
+        }
+
         switch (randomInt(2)) {
         switch (randomInt(2)) {
             case 0:
             case 0:
                 return new WrapperQueryBuilder(wrappedQuery.toString());
                 return new WrapperQueryBuilder(wrappedQuery.toString());
             case 1:
             case 1:
-                return new WrapperQueryBuilder(BytesReference.toBytes(((ToXContentToBytes)wrappedQuery).buildAsBytes()));
+
+                return new WrapperQueryBuilder(BytesReference.toBytes(bytes));
             case 2:
             case 2:
-                return new WrapperQueryBuilder(((ToXContentToBytes)wrappedQuery).buildAsBytes());
+                return new WrapperQueryBuilder(bytes);
             default:
             default:
                 throw new UnsupportedOperationException();
                 throw new UnsupportedOperationException();
         }
         }

+ 11 - 18
core/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilderTests.java

@@ -20,7 +20,6 @@
 package org.elasticsearch.index.query.functionscore;
 package org.elasticsearch.index.query.functionscore;
 
 
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonParseException;
-
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Query;
@@ -35,10 +34,10 @@ import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
 import org.elasticsearch.common.lucene.search.function.WeightFactorFunction;
 import org.elasticsearch.common.lucene.search.function.WeightFactorFunction;
 import org.elasticsearch.common.unit.DistanceUnit;
 import org.elasticsearch.common.unit.DistanceUnit;
 import org.elasticsearch.common.xcontent.XContent;
 import org.elasticsearch.common.xcontent.XContent;
+import org.elasticsearch.common.xcontent.XContentHelper;
 import org.elasticsearch.common.xcontent.XContentParser;
 import org.elasticsearch.common.xcontent.XContentParser;
 import org.elasticsearch.common.xcontent.XContentType;
 import org.elasticsearch.common.xcontent.XContentType;
 import org.elasticsearch.index.mapper.SeqNoFieldMapper;
 import org.elasticsearch.index.mapper.SeqNoFieldMapper;
-import org.elasticsearch.index.query.AbstractQueryBuilder;
 import org.elasticsearch.index.query.MatchAllQueryBuilder;
 import org.elasticsearch.index.query.MatchAllQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.RandomQueryBuilder;
 import org.elasticsearch.index.query.RandomQueryBuilder;
@@ -228,7 +227,7 @@ public class FunctionScoreQueryBuilderTests extends AbstractQueryTestCase<Functi
             break;
             break;
         case DATE_FIELD_NAME:
         case DATE_FIELD_NAME:
             origin = new DateTime(System.currentTimeMillis() - randomIntBetween(0, 1000000), DateTimeZone.UTC).toString();
             origin = new DateTime(System.currentTimeMillis() - randomIntBetween(0, 1000000), DateTimeZone.UTC).toString();
-            scale = randomTimeValue(1, 1000, new String[]{"d", "h", "ms", "s", "m"});
+            scale = randomTimeValue(1, 1000, "d", "h", "ms", "s", "m");
             offset = randomPositiveTimeValue();
             offset = randomPositiveTimeValue();
             break;
             break;
         default:
         default:
@@ -334,7 +333,7 @@ public class FunctionScoreQueryBuilderTests extends AbstractQueryTestCase<Functi
          * given that we copy part of the decay functions as bytes, we test that fromXContent and toXContent both work no matter what the
          * given that we copy part of the decay functions as bytes, we test that fromXContent and toXContent both work no matter what the
          * initial format was
          * initial format was
          */
          */
-        for (int i = 0; i <= XContentType.values().length; i++) {
+        for (XContentType xContentType : XContentType.values()) {
             assertThat(queryBuilder, instanceOf(FunctionScoreQueryBuilder.class));
             assertThat(queryBuilder, instanceOf(FunctionScoreQueryBuilder.class));
             FunctionScoreQueryBuilder functionScoreQueryBuilder = (FunctionScoreQueryBuilder) queryBuilder;
             FunctionScoreQueryBuilder functionScoreQueryBuilder = (FunctionScoreQueryBuilder) queryBuilder;
             assertThat(functionScoreQueryBuilder.query(), instanceOf(TermQueryBuilder.class));
             assertThat(functionScoreQueryBuilder.query(), instanceOf(TermQueryBuilder.class));
@@ -369,12 +368,9 @@ public class FunctionScoreQueryBuilderTests extends AbstractQueryTestCase<Functi
             assertThat(functionScoreQueryBuilder.scoreMode(), equalTo(FunctionScoreQuery.ScoreMode.AVG));
             assertThat(functionScoreQueryBuilder.scoreMode(), equalTo(FunctionScoreQuery.ScoreMode.AVG));
             assertThat(functionScoreQueryBuilder.boostMode(), equalTo(CombineFunction.REPLACE));
             assertThat(functionScoreQueryBuilder.boostMode(), equalTo(CombineFunction.REPLACE));
             assertThat(functionScoreQueryBuilder.maxBoost(), equalTo(10f));
             assertThat(functionScoreQueryBuilder.maxBoost(), equalTo(10f));
-
-            if (i < XContentType.values().length) {
-                BytesReference bytes = ((AbstractQueryBuilder) queryBuilder).buildAsBytes(XContentType.values()[i]);
-                try (XContentParser parser = createParser(XContentType.values()[i].xContent(), bytes)) {
-                    queryBuilder = parseQuery(parser);
-                }
+            BytesReference bytes = XContentHelper.toXContent(queryBuilder, xContentType, false);
+            try (XContentParser parser = createParser(xContentType.xContent(), bytes)) {
+                queryBuilder = parseQuery(parser);
             }
             }
         }
         }
     }
     }
@@ -405,7 +401,7 @@ public class FunctionScoreQueryBuilderTests extends AbstractQueryTestCase<Functi
          * given that we copy part of the decay functions as bytes, we test that fromXContent and toXContent both work no matter what the
          * given that we copy part of the decay functions as bytes, we test that fromXContent and toXContent both work no matter what the
          * initial format was
          * initial format was
          */
          */
-        for (int i = 0; i <= XContentType.values().length; i++) {
+        for (XContentType xContentType : XContentType.values()) {
             assertThat(queryBuilder, instanceOf(FunctionScoreQueryBuilder.class));
             assertThat(queryBuilder, instanceOf(FunctionScoreQueryBuilder.class));
             FunctionScoreQueryBuilder functionScoreQueryBuilder = (FunctionScoreQueryBuilder) queryBuilder;
             FunctionScoreQueryBuilder functionScoreQueryBuilder = (FunctionScoreQueryBuilder) queryBuilder;
             assertThat(functionScoreQueryBuilder.query(), instanceOf(TermQueryBuilder.class));
             assertThat(functionScoreQueryBuilder.query(), instanceOf(TermQueryBuilder.class));
@@ -424,12 +420,9 @@ public class FunctionScoreQueryBuilderTests extends AbstractQueryTestCase<Functi
             assertThat(functionScoreQueryBuilder.scoreMode(), equalTo(FunctionScoreQuery.ScoreMode.AVG));
             assertThat(functionScoreQueryBuilder.scoreMode(), equalTo(FunctionScoreQuery.ScoreMode.AVG));
             assertThat(functionScoreQueryBuilder.boostMode(), equalTo(CombineFunction.REPLACE));
             assertThat(functionScoreQueryBuilder.boostMode(), equalTo(CombineFunction.REPLACE));
             assertThat(functionScoreQueryBuilder.maxBoost(), equalTo(10f));
             assertThat(functionScoreQueryBuilder.maxBoost(), equalTo(10f));
-
-            if (i < XContentType.values().length) {
-                BytesReference bytes = ((AbstractQueryBuilder) queryBuilder).buildAsBytes(XContentType.values()[i]);
-                try (XContentParser parser = createParser(XContentType.values()[i].xContent(), bytes)) {
-                    queryBuilder = parseQuery(parser);
-                }
+            BytesReference bytes = XContentHelper.toXContent(queryBuilder, xContentType, false);
+            try (XContentParser parser = createParser(xContentType.xContent(), bytes)) {
+                queryBuilder = parseQuery(parser);
             }
             }
         }
         }
     }
     }
@@ -647,7 +640,7 @@ public class FunctionScoreQueryBuilderTests extends AbstractQueryTestCase<Functi
                     "  }\n" +
                     "  }\n" +
                     "}";
                     "}";
 
 
-        FunctionScoreQueryBuilder expectedParsed = (FunctionScoreQueryBuilder) parseQuery(json);
+        FunctionScoreQueryBuilder expectedParsed = (FunctionScoreQueryBuilder) parseQuery(expected);
         assertEquals(expectedParsed, parsed);
         assertEquals(expectedParsed, parsed);
 
 
         assertEquals(json, 2, parsed.filterFunctionBuilders().length);
         assertEquals(json, 2, parsed.filterFunctionBuilders().length);

+ 27 - 19
core/src/test/java/org/elasticsearch/indices/IndicesRequestCacheTests.java

@@ -35,6 +35,8 @@ import org.elasticsearch.common.io.stream.BytesStreamOutput;
 import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader;
 import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.unit.ByteSizeValue;
 import org.elasticsearch.common.unit.ByteSizeValue;
+import org.elasticsearch.common.xcontent.XContentHelper;
+import org.elasticsearch.common.xcontent.XContentType;
 import org.elasticsearch.index.cache.request.ShardRequestCache;
 import org.elasticsearch.index.cache.request.ShardRequestCache;
 import org.elasticsearch.index.query.TermQueryBuilder;
 import org.elasticsearch.index.query.TermQueryBuilder;
 import org.elasticsearch.index.shard.ShardId;
 import org.elasticsearch.index.shard.ShardId;
@@ -57,12 +59,13 @@ public class IndicesRequestCacheTests extends ESTestCase {
         DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer),
         DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer),
             new ShardId("foo", "bar", 1));
             new ShardId("foo", "bar", 1));
         TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
         TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
+        BytesReference termBytes = XContentHelper.toXContent(termQuery, XContentType.JSON, false);
         AtomicBoolean indexShard = new AtomicBoolean(true);
         AtomicBoolean indexShard = new AtomicBoolean(true);
 
 
         // initial cache
         // initial cache
         TestEntity entity = new TestEntity(requestCacheStats, indexShard);
         TestEntity entity = new TestEntity(requestCacheStats, indexShard);
         Loader loader = new Loader(reader, 0);
         Loader loader = new Loader(reader, 0);
-        BytesReference value = cache.getOrCompute(entity, loader, reader, termQuery.buildAsBytes());
+        BytesReference value = cache.getOrCompute(entity, loader, reader, termBytes);
         assertEquals("foo", value.streamInput().readString());
         assertEquals("foo", value.streamInput().readString());
         assertEquals(0, requestCacheStats.stats().getHitCount());
         assertEquals(0, requestCacheStats.stats().getHitCount());
         assertEquals(1, requestCacheStats.stats().getMissCount());
         assertEquals(1, requestCacheStats.stats().getMissCount());
@@ -73,7 +76,7 @@ public class IndicesRequestCacheTests extends ESTestCase {
         // cache hit
         // cache hit
         entity = new TestEntity(requestCacheStats, indexShard);
         entity = new TestEntity(requestCacheStats, indexShard);
         loader = new Loader(reader, 0);
         loader = new Loader(reader, 0);
-        value = cache.getOrCompute(entity, loader, reader, termQuery.buildAsBytes());
+        value = cache.getOrCompute(entity, loader, reader, termBytes);
         assertEquals("foo", value.streamInput().readString());
         assertEquals("foo", value.streamInput().readString());
         assertEquals(1, requestCacheStats.stats().getHitCount());
         assertEquals(1, requestCacheStats.stats().getHitCount());
         assertEquals(1, requestCacheStats.stats().getMissCount());
         assertEquals(1, requestCacheStats.stats().getMissCount());
@@ -112,6 +115,7 @@ public class IndicesRequestCacheTests extends ESTestCase {
         writer.addDocument(newDoc(0, "foo"));
         writer.addDocument(newDoc(0, "foo"));
         DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer), new ShardId("foo", "bar", 1));
         DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer), new ShardId("foo", "bar", 1));
         TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
         TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
+        BytesReference termBytes = XContentHelper.toXContent(termQuery, XContentType.JSON, false);
 
 
         writer.updateDocument(new Term("id", "0"), newDoc(0, "bar"));
         writer.updateDocument(new Term("id", "0"), newDoc(0, "bar"));
         DirectoryReader secondReader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer), new ShardId("foo", "bar", 1));
         DirectoryReader secondReader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer), new ShardId("foo", "bar", 1));
@@ -119,7 +123,7 @@ public class IndicesRequestCacheTests extends ESTestCase {
         // initial cache
         // initial cache
         TestEntity entity = new TestEntity(requestCacheStats, indexShard);
         TestEntity entity = new TestEntity(requestCacheStats, indexShard);
         Loader loader = new Loader(reader, 0);
         Loader loader = new Loader(reader, 0);
-        BytesReference value = cache.getOrCompute(entity, loader, reader, termQuery.buildAsBytes());
+        BytesReference value = cache.getOrCompute(entity, loader, reader, termBytes);
         assertEquals("foo", value.streamInput().readString());
         assertEquals("foo", value.streamInput().readString());
         assertEquals(0, requestCacheStats.stats().getHitCount());
         assertEquals(0, requestCacheStats.stats().getHitCount());
         assertEquals(1, requestCacheStats.stats().getMissCount());
         assertEquals(1, requestCacheStats.stats().getMissCount());
@@ -133,7 +137,7 @@ public class IndicesRequestCacheTests extends ESTestCase {
         // cache the second
         // cache the second
         TestEntity secondEntity = new TestEntity(requestCacheStats, indexShard);
         TestEntity secondEntity = new TestEntity(requestCacheStats, indexShard);
         loader = new Loader(secondReader, 0);
         loader = new Loader(secondReader, 0);
-        value = cache.getOrCompute(entity, loader, secondReader, termQuery.buildAsBytes());
+        value = cache.getOrCompute(entity, loader, secondReader, termBytes);
         assertEquals("bar", value.streamInput().readString());
         assertEquals("bar", value.streamInput().readString());
         assertEquals(0, requestCacheStats.stats().getHitCount());
         assertEquals(0, requestCacheStats.stats().getHitCount());
         assertEquals(2, requestCacheStats.stats().getMissCount());
         assertEquals(2, requestCacheStats.stats().getMissCount());
@@ -145,7 +149,7 @@ public class IndicesRequestCacheTests extends ESTestCase {
 
 
         secondEntity = new TestEntity(requestCacheStats, indexShard);
         secondEntity = new TestEntity(requestCacheStats, indexShard);
         loader = new Loader(secondReader, 0);
         loader = new Loader(secondReader, 0);
-        value = cache.getOrCompute(secondEntity, loader, secondReader, termQuery.buildAsBytes());
+        value = cache.getOrCompute(secondEntity, loader, secondReader, termBytes);
         assertEquals("bar", value.streamInput().readString());
         assertEquals("bar", value.streamInput().readString());
         assertEquals(1, requestCacheStats.stats().getHitCount());
         assertEquals(1, requestCacheStats.stats().getHitCount());
         assertEquals(2, requestCacheStats.stats().getMissCount());
         assertEquals(2, requestCacheStats.stats().getMissCount());
@@ -155,7 +159,7 @@ public class IndicesRequestCacheTests extends ESTestCase {
 
 
         entity = new TestEntity(requestCacheStats, indexShard);
         entity = new TestEntity(requestCacheStats, indexShard);
         loader = new Loader(reader, 0);
         loader = new Loader(reader, 0);
-        value = cache.getOrCompute(entity, loader, reader, termQuery.buildAsBytes());
+        value = cache.getOrCompute(entity, loader, reader, termBytes);
         assertEquals("foo", value.streamInput().readString());
         assertEquals("foo", value.streamInput().readString());
         assertEquals(2, requestCacheStats.stats().getHitCount());
         assertEquals(2, requestCacheStats.stats().getHitCount());
         assertEquals(2, requestCacheStats.stats().getMissCount());
         assertEquals(2, requestCacheStats.stats().getMissCount());
@@ -205,6 +209,7 @@ public class IndicesRequestCacheTests extends ESTestCase {
             DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer),
             DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer),
                 new ShardId("foo", "bar", 1));
                 new ShardId("foo", "bar", 1));
             TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
             TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
+            BytesReference termBytes = XContentHelper.toXContent(termQuery, XContentType.JSON, false);
             TestEntity entity = new TestEntity(requestCacheStats, indexShard);
             TestEntity entity = new TestEntity(requestCacheStats, indexShard);
             Loader loader = new Loader(reader, 0);
             Loader loader = new Loader(reader, 0);
 
 
@@ -214,9 +219,9 @@ public class IndicesRequestCacheTests extends ESTestCase {
             TestEntity secondEntity = new TestEntity(requestCacheStats, indexShard);
             TestEntity secondEntity = new TestEntity(requestCacheStats, indexShard);
             Loader secondLoader = new Loader(secondReader, 0);
             Loader secondLoader = new Loader(secondReader, 0);
 
 
-            BytesReference value1 = cache.getOrCompute(entity, loader, reader, termQuery.buildAsBytes());
+            BytesReference value1 = cache.getOrCompute(entity, loader, reader, termBytes);
             assertEquals("foo", value1.streamInput().readString());
             assertEquals("foo", value1.streamInput().readString());
-            BytesReference value2 = cache.getOrCompute(secondEntity, secondLoader, secondReader, termQuery.buildAsBytes());
+            BytesReference value2 = cache.getOrCompute(secondEntity, secondLoader, secondReader, termBytes);
             assertEquals("bar", value2.streamInput().readString());
             assertEquals("bar", value2.streamInput().readString());
             size = requestCacheStats.stats().getMemorySize();
             size = requestCacheStats.stats().getMemorySize();
             IOUtils.close(reader, secondReader, writer, dir, cache);
             IOUtils.close(reader, secondReader, writer, dir, cache);
@@ -233,6 +238,7 @@ public class IndicesRequestCacheTests extends ESTestCase {
         DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer),
         DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer),
             new ShardId("foo", "bar", 1));
             new ShardId("foo", "bar", 1));
         TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
         TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
+        BytesReference termBytes = XContentHelper.toXContent(termQuery, XContentType.JSON, false);
         TestEntity entity = new TestEntity(requestCacheStats, indexShard);
         TestEntity entity = new TestEntity(requestCacheStats, indexShard);
         Loader loader = new Loader(reader, 0);
         Loader loader = new Loader(reader, 0);
 
 
@@ -248,12 +254,12 @@ public class IndicesRequestCacheTests extends ESTestCase {
         TestEntity thirddEntity = new TestEntity(requestCacheStats, indexShard);
         TestEntity thirddEntity = new TestEntity(requestCacheStats, indexShard);
         Loader thirdLoader = new Loader(thirdReader, 0);
         Loader thirdLoader = new Loader(thirdReader, 0);
 
 
-        BytesReference value1 = cache.getOrCompute(entity, loader, reader, termQuery.buildAsBytes());
+        BytesReference value1 = cache.getOrCompute(entity, loader, reader, termBytes);
         assertEquals("foo", value1.streamInput().readString());
         assertEquals("foo", value1.streamInput().readString());
-        BytesReference value2 = cache.getOrCompute(secondEntity, secondLoader, secondReader, termQuery.buildAsBytes());
+        BytesReference value2 = cache.getOrCompute(secondEntity, secondLoader, secondReader, termBytes);
         assertEquals("bar", value2.streamInput().readString());
         assertEquals("bar", value2.streamInput().readString());
         logger.info("Memory size: {}", requestCacheStats.stats().getMemorySize());
         logger.info("Memory size: {}", requestCacheStats.stats().getMemorySize());
-        BytesReference value3 = cache.getOrCompute(thirddEntity, thirdLoader, thirdReader, termQuery.buildAsBytes());
+        BytesReference value3 = cache.getOrCompute(thirddEntity, thirdLoader, thirdReader, termBytes);
         assertEquals("baz", value3.streamInput().readString());
         assertEquals("baz", value3.streamInput().readString());
         assertEquals(2, cache.count());
         assertEquals(2, cache.count());
         assertEquals(1, requestCacheStats.stats().getEvictions());
         assertEquals(1, requestCacheStats.stats().getEvictions());
@@ -272,6 +278,7 @@ public class IndicesRequestCacheTests extends ESTestCase {
         DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer),
         DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer),
             new ShardId("foo", "bar", 1));
             new ShardId("foo", "bar", 1));
         TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
         TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
+        BytesReference termBytes = XContentHelper.toXContent(termQuery, XContentType.JSON, false);
         TestEntity entity = new TestEntity(requestCacheStats, indexShard);
         TestEntity entity = new TestEntity(requestCacheStats, indexShard);
         Loader loader = new Loader(reader, 0);
         Loader loader = new Loader(reader, 0);
 
 
@@ -288,12 +295,12 @@ public class IndicesRequestCacheTests extends ESTestCase {
         TestEntity thirddEntity = new TestEntity(requestCacheStats, differentIdentity);
         TestEntity thirddEntity = new TestEntity(requestCacheStats, differentIdentity);
         Loader thirdLoader = new Loader(thirdReader, 0);
         Loader thirdLoader = new Loader(thirdReader, 0);
 
 
-        BytesReference value1 = cache.getOrCompute(entity, loader, reader, termQuery.buildAsBytes());
+        BytesReference value1 = cache.getOrCompute(entity, loader, reader, termBytes);
         assertEquals("foo", value1.streamInput().readString());
         assertEquals("foo", value1.streamInput().readString());
-        BytesReference value2 = cache.getOrCompute(secondEntity, secondLoader, secondReader, termQuery.buildAsBytes());
+        BytesReference value2 = cache.getOrCompute(secondEntity, secondLoader, secondReader, termBytes);
         assertEquals("bar", value2.streamInput().readString());
         assertEquals("bar", value2.streamInput().readString());
         logger.info("Memory size: {}", requestCacheStats.stats().getMemorySize());
         logger.info("Memory size: {}", requestCacheStats.stats().getMemorySize());
-        BytesReference value3 = cache.getOrCompute(thirddEntity, thirdLoader, thirdReader, termQuery.buildAsBytes());
+        BytesReference value3 = cache.getOrCompute(thirddEntity, thirdLoader, thirdReader, termBytes);
         assertEquals("baz", value3.streamInput().readString());
         assertEquals("baz", value3.streamInput().readString());
         assertEquals(3, cache.count());
         assertEquals(3, cache.count());
         final long hitCount = requestCacheStats.stats().getHitCount();
         final long hitCount = requestCacheStats.stats().getHitCount();
@@ -302,7 +309,7 @@ public class IndicesRequestCacheTests extends ESTestCase {
         cache.cleanCache();
         cache.cleanCache();
         assertEquals(1, cache.count());
         assertEquals(1, cache.count());
         // third has not been validated since it's a different identity
         // third has not been validated since it's a different identity
-        value3 = cache.getOrCompute(thirddEntity, thirdLoader, thirdReader, termQuery.buildAsBytes());
+        value3 = cache.getOrCompute(thirddEntity, thirdLoader, thirdReader, termBytes);
         assertEquals(hitCount + 1, requestCacheStats.stats().getHitCount());
         assertEquals(hitCount + 1, requestCacheStats.stats().getHitCount());
         assertEquals("baz", value3.streamInput().readString());
         assertEquals("baz", value3.streamInput().readString());
 
 
@@ -355,12 +362,13 @@ public class IndicesRequestCacheTests extends ESTestCase {
         DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer),
         DirectoryReader reader = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer),
             new ShardId("foo", "bar", 1));
             new ShardId("foo", "bar", 1));
         TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
         TermQueryBuilder termQuery = new TermQueryBuilder("id", "0");
+        BytesReference termBytes = XContentHelper.toXContent(termQuery, XContentType.JSON, false);
         AtomicBoolean indexShard = new AtomicBoolean(true);
         AtomicBoolean indexShard = new AtomicBoolean(true);
 
 
         // initial cache
         // initial cache
         TestEntity entity = new TestEntity(requestCacheStats, indexShard);
         TestEntity entity = new TestEntity(requestCacheStats, indexShard);
         Loader loader = new Loader(reader, 0);
         Loader loader = new Loader(reader, 0);
-        BytesReference value = cache.getOrCompute(entity, loader, reader, termQuery.buildAsBytes());
+        BytesReference value = cache.getOrCompute(entity, loader, reader, termBytes);
         assertEquals("foo", value.streamInput().readString());
         assertEquals("foo", value.streamInput().readString());
         assertEquals(0, requestCacheStats.stats().getHitCount());
         assertEquals(0, requestCacheStats.stats().getHitCount());
         assertEquals(1, requestCacheStats.stats().getMissCount());
         assertEquals(1, requestCacheStats.stats().getMissCount());
@@ -371,7 +379,7 @@ public class IndicesRequestCacheTests extends ESTestCase {
         // cache hit
         // cache hit
         entity = new TestEntity(requestCacheStats, indexShard);
         entity = new TestEntity(requestCacheStats, indexShard);
         loader = new Loader(reader, 0);
         loader = new Loader(reader, 0);
-        value = cache.getOrCompute(entity, loader, reader, termQuery.buildAsBytes());
+        value = cache.getOrCompute(entity, loader, reader, termBytes);
         assertEquals("foo", value.streamInput().readString());
         assertEquals("foo", value.streamInput().readString());
         assertEquals(1, requestCacheStats.stats().getHitCount());
         assertEquals(1, requestCacheStats.stats().getHitCount());
         assertEquals(1, requestCacheStats.stats().getMissCount());
         assertEquals(1, requestCacheStats.stats().getMissCount());
@@ -384,8 +392,8 @@ public class IndicesRequestCacheTests extends ESTestCase {
         // load again after invalidate
         // load again after invalidate
         entity = new TestEntity(requestCacheStats, indexShard);
         entity = new TestEntity(requestCacheStats, indexShard);
         loader = new Loader(reader, 0);
         loader = new Loader(reader, 0);
-        cache.invalidate(entity, reader,  termQuery.buildAsBytes());
-        value = cache.getOrCompute(entity, loader, reader, termQuery.buildAsBytes());
+        cache.invalidate(entity, reader,  termBytes);
+        value = cache.getOrCompute(entity, loader, reader, termBytes);
         assertEquals("foo", value.streamInput().readString());
         assertEquals("foo", value.streamInput().readString());
         assertEquals(1, requestCacheStats.stats().getHitCount());
         assertEquals(1, requestCacheStats.stats().getHitCount());
         assertEquals(2, requestCacheStats.stats().getMissCount());
         assertEquals(2, requestCacheStats.stats().getMissCount());

+ 11 - 2
core/src/test/java/org/elasticsearch/search/fetch/subphase/MatchedQueriesIT.java

@@ -20,8 +20,13 @@
 package org.elasticsearch.search.fetch.subphase;
 package org.elasticsearch.search.fetch.subphase;
 
 
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.common.bytes.BytesReference;
+import org.elasticsearch.common.xcontent.XContentHelper;
+import org.elasticsearch.common.xcontent.XContentType;
+import org.elasticsearch.index.query.MatchQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.index.query.TermQueryBuilder;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.test.ESIntegTestCase;
 import org.elasticsearch.test.ESIntegTestCase;
 
 
@@ -321,9 +326,13 @@ public class MatchedQueriesIT extends ESIntegTestCase {
         client().prepareIndex("test", "type1", "1").setSource("content", "Lorem ipsum dolor sit amet").get();
         client().prepareIndex("test", "type1", "1").setSource("content", "Lorem ipsum dolor sit amet").get();
         refresh();
         refresh();
 
 
+        MatchQueryBuilder matchQueryBuilder = matchQuery("content", "amet").queryName("abc");
+        BytesReference matchBytes = XContentHelper.toXContent(matchQueryBuilder, XContentType.JSON, false);
+        TermQueryBuilder termQueryBuilder = termQuery("content", "amet").queryName("abc");
+        BytesReference termBytes = XContentHelper.toXContent(termQueryBuilder, XContentType.JSON, false);
         QueryBuilder[] queries = new QueryBuilder[]{
         QueryBuilder[] queries = new QueryBuilder[]{
-                wrapperQuery(matchQuery("content", "amet").queryName("abc").buildAsBytes().utf8ToString()),
-                constantScoreQuery(wrapperQuery(termQuery("content", "amet").queryName("abc").buildAsBytes().utf8ToString()))
+                wrapperQuery(matchBytes),
+                constantScoreQuery(wrapperQuery(termBytes))
         };
         };
         for (QueryBuilder query : queries) {
         for (QueryBuilder query : queries) {
             SearchResponse searchResponse = client().prepareSearch()
             SearchResponse searchResponse = client().prepareSearch()

+ 3 - 2
test/framework/src/main/java/org/elasticsearch/test/AbstractQueryTestCase.java

@@ -148,7 +148,7 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>>
     protected static final String[] MAPPED_FIELD_NAMES = new String[]{STRING_FIELD_NAME, INT_FIELD_NAME, INT_RANGE_FIELD_NAME,
     protected static final String[] MAPPED_FIELD_NAMES = new String[]{STRING_FIELD_NAME, INT_FIELD_NAME, INT_RANGE_FIELD_NAME,
             DOUBLE_FIELD_NAME, BOOLEAN_FIELD_NAME, DATE_FIELD_NAME, DATE_RANGE_FIELD_NAME, OBJECT_FIELD_NAME, GEO_POINT_FIELD_NAME,
             DOUBLE_FIELD_NAME, BOOLEAN_FIELD_NAME, DATE_FIELD_NAME, DATE_RANGE_FIELD_NAME, OBJECT_FIELD_NAME, GEO_POINT_FIELD_NAME,
             GEO_SHAPE_FIELD_NAME};
             GEO_SHAPE_FIELD_NAME};
-    protected static final String[] MAPPED_LEAF_FIELD_NAMES = new String[]{STRING_FIELD_NAME, INT_FIELD_NAME, INT_RANGE_FIELD_NAME,
+    private static final String[] MAPPED_LEAF_FIELD_NAMES = new String[]{STRING_FIELD_NAME, INT_FIELD_NAME, INT_RANGE_FIELD_NAME,
             DOUBLE_FIELD_NAME, BOOLEAN_FIELD_NAME, DATE_FIELD_NAME, DATE_RANGE_FIELD_NAME, GEO_POINT_FIELD_NAME, };
             DOUBLE_FIELD_NAME, BOOLEAN_FIELD_NAME, DATE_FIELD_NAME, DATE_RANGE_FIELD_NAME, GEO_POINT_FIELD_NAME, };
     private static final int NUMBER_OF_TESTQUERIES = 20;
     private static final int NUMBER_OF_TESTQUERIES = 20;
 
 
@@ -534,7 +534,8 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>>
     }
     }
 
 
     protected QueryBuilder parseQuery(AbstractQueryBuilder<?> builder) throws IOException {
     protected QueryBuilder parseQuery(AbstractQueryBuilder<?> builder) throws IOException {
-        return parseQuery(createParser(JsonXContent.jsonXContent, builder.buildAsBytes(XContentType.JSON)));
+        BytesReference bytes = XContentHelper.toXContent(builder, XContentType.JSON, false);
+        return parseQuery(createParser(JsonXContent.jsonXContent, bytes));
     }
     }
 
 
     protected QueryBuilder parseQuery(String queryAsString) throws IOException {
     protected QueryBuilder parseQuery(String queryAsString) throws IOException {