From 18365a96769f831616e36c2705f9733182552e4b Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Thu, 21 Mar 2019 16:16:59 +0100 Subject: [PATCH 1/6] Move top-level pipeline aggs out of QuerySearchResult As part of #40177 we have added top-level pipeline aggs to `InternalAggregations`. Given that `QuerySearchResult` holds an `InternalAggregations` instance, there is no need to keep on setting top-level pipeline aggs separately. Top-level pipeline aggs can then always be transported through `InternalAggregations`. Such change is made in a backwards compatible manner. --- .../action/search/SearchPhaseController.java | 2 +- .../search/aggregations/AggregationPhase.java | 3 +- .../aggregations/InternalAggregations.java | 17 ++-------- .../search/query/QuerySearchResult.java | 34 +++++++++++-------- .../InternalAggregationsTests.java | 13 +++---- 5 files changed, 31 insertions(+), 38 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java b/server/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java index f54f101041d1b..0125084c37099 100644 --- a/server/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java +++ b/server/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java @@ -486,7 +486,7 @@ private ReducedQueryPhase reducedQueryPhase(Collection pipelineAggregators = context.aggregations().factories().createPipelineAggregators(); List siblingPipelineAggregators = new ArrayList<>(pipelineAggregators.size()); for (PipelineAggregator pipelineAggregator : pipelineAggregators) { @@ -144,7 +143,7 @@ public void execute(SearchContext context) { + "allowed at the top level"); } } - context.queryResult().pipelineAggregators(siblingPipelineAggregators); + context.queryResult().aggregations(new InternalAggregations(aggregations, siblingPipelineAggregators)); // disable aggregations so that they don't run on next pages in case of scrolling context.aggregations(null); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/InternalAggregations.java b/server/src/main/java/org/elasticsearch/search/aggregations/InternalAggregations.java index 187f5e3864ed1..8910ca25c337d 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/InternalAggregations.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/InternalAggregations.java @@ -77,7 +77,7 @@ public InternalAggregations(List aggregations, List getTopLevelPipelineAggregators() { + public List getTopLevelPipelineAggregators() { return topLevelPipelineAggregators; } @@ -91,20 +91,7 @@ public static InternalAggregations reduce(List aggregation if (aggregationsList.isEmpty()) { return null; } - InternalAggregations first = aggregationsList.get(0); - return reduce(aggregationsList, first.topLevelPipelineAggregators, context); - } - - /** - * Reduces the given list of aggregations as well as the provided top-level pipeline aggregators. - * Note that top-level pipeline aggregators are reduced only as part of the final reduction phase, otherwise they are left untouched. - */ - public static InternalAggregations reduce(List aggregationsList, - List topLevelPipelineAggregators, - ReduceContext context) { - if (aggregationsList.isEmpty()) { - return null; - } + List topLevelPipelineAggregators = aggregationsList.get(0).getTopLevelPipelineAggregators(); // first we collect all aggregations of the same type and list them together Map> aggByName = new HashMap<>(); diff --git a/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java b/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java index 34d3508f6bab5..f5f2c010cba27 100644 --- a/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java +++ b/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java @@ -21,6 +21,7 @@ import org.apache.lucene.search.FieldDoc; import org.apache.lucene.search.TotalHits; +import org.elasticsearch.Version; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore; @@ -28,6 +29,7 @@ import org.elasticsearch.search.SearchPhaseResult; import org.elasticsearch.search.SearchShardTarget; import org.elasticsearch.search.aggregations.Aggregations; +import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.InternalAggregations; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; import org.elasticsearch.search.aggregations.pipeline.SiblingPipelineAggregator; @@ -35,9 +37,7 @@ import org.elasticsearch.search.suggest.Suggest; import java.io.IOException; -import java.util.Collections; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; import static org.elasticsearch.common.lucene.Lucene.readTopDocs; @@ -54,7 +54,6 @@ public final class QuerySearchResult extends SearchPhaseResult { private DocValueFormat[] sortValueFormats; private InternalAggregations aggregations; private boolean hasAggs; - private List pipelineAggregators = Collections.emptyList(); private Suggest suggest; private boolean searchTimedOut; private Boolean terminatedEarly = null; @@ -198,14 +197,6 @@ public void profileResults(ProfileShardResult shardResults) { hasProfileResults = shardResults != null; } - public List pipelineAggregators() { - return pipelineAggregators; - } - - public void pipelineAggregators(List pipelineAggregators) { - this.pipelineAggregators = Objects.requireNonNull(pipelineAggregators); - } - public Suggest suggest() { return suggest; } @@ -294,8 +285,18 @@ public void readFromWithId(long id, StreamInput in) throws IOException { if (hasAggs = in.readBoolean()) { aggregations = InternalAggregations.readAggregations(in); } - pipelineAggregators = in.readNamedWriteableList(PipelineAggregator.class).stream().map(a -> (SiblingPipelineAggregator) a) - .collect(Collectors.toList()); + //TODO update version after backport + if (in.getVersion().before(Version.V_8_0_0)) { + List pipelineAggregators = in.readNamedWriteableList(PipelineAggregator.class).stream() + .map(a -> (SiblingPipelineAggregator) a).collect(Collectors.toList()); + List internalAggs = aggregations.asList().stream() + .map(agg -> (InternalAggregation) agg).collect(Collectors.toList()); + assert this.aggregations.getTopLevelPipelineAggregators().isEmpty(); + //Earlier versions serialize sibling pipeline aggs separately as they used to be set to QuerySearchResult directly, + //while later versions include them in InternalAggregations. Note that despite serializing sibling pipeline aggs as part of + //InternalAggregations is supported since 6.7.0, the shards set sibling pipeline aggs to InternalAggregations only from 7.1 on. + this.aggregations = new InternalAggregations(internalAggs, pipelineAggregators); + } if (in.readBoolean()) { suggest = new Suggest(in); } @@ -332,7 +333,12 @@ public void writeToNoId(StreamOutput out) throws IOException { out.writeBoolean(true); aggregations.writeTo(out); } - out.writeNamedWriteableList(pipelineAggregators); + if (out.getVersion().before(Version.V_8_0_0)) { + //Earlier versions expect sibling pipeline aggs separately as they used to be set to QuerySearchResult directly, + //while later versions expect them in InternalAggregations. Note that despite serializing sibling pipeline aggs as part of + //InternalAggregations is supported since 6.7.0, the shards set sibling pipeline aggs to InternalAggregations only from 7.1 on. + out.writeNamedWriteableList(aggregations.getTopLevelPipelineAggregators()); + } if (suggest == null) { out.writeBoolean(false); } else { diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationsTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationsTests.java index 81626459db4f2..efad636c1e400 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationsTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationsTests.java @@ -50,18 +50,19 @@ public class InternalAggregationsTests extends ESTestCase { public void testReduceEmptyAggs() { List aggs = Collections.emptyList(); InternalAggregation.ReduceContext reduceContext = new InternalAggregation.ReduceContext(null, null, randomBoolean()); - assertNull(InternalAggregations.reduce(aggs, Collections.emptyList(), reduceContext)); + assertNull(InternalAggregations.reduce(aggs, reduceContext)); } public void testNonFinalReduceTopLevelPipelineAggs() { InternalAggregation terms = new StringTerms("name", BucketOrder.key(true), 10, 1, Collections.emptyList(), Collections.emptyMap(), DocValueFormat.RAW, 25, false, 10, Collections.emptyList(), 0); - List aggs = Collections.singletonList(new InternalAggregations(Collections.singletonList(terms))); List topLevelPipelineAggs = new ArrayList<>(); MaxBucketPipelineAggregationBuilder maxBucketPipelineAggregationBuilder = new MaxBucketPipelineAggregationBuilder("test", "test"); topLevelPipelineAggs.add((SiblingPipelineAggregator)maxBucketPipelineAggregationBuilder.create()); + List aggs = Collections.singletonList(new InternalAggregations(Collections.singletonList(terms), + topLevelPipelineAggs)); InternalAggregation.ReduceContext reduceContext = new InternalAggregation.ReduceContext(null, null, false); - InternalAggregations reducedAggs = InternalAggregations.reduce(aggs, topLevelPipelineAggs, reduceContext); + InternalAggregations reducedAggs = InternalAggregations.reduce(aggs, reduceContext); assertEquals(1, reducedAggs.getTopLevelPipelineAggregators().size()); assertEquals(1, reducedAggs.aggregations.size()); } @@ -79,9 +80,9 @@ public void testFinalReduceTopLevelPipelineAggs() { Collections.singletonList(siblingPipelineAggregator)); reducedAggs = InternalAggregations.reduce(Collections.singletonList(aggs), reduceContext); } else { - InternalAggregations aggs = new InternalAggregations(Collections.singletonList(terms)); - List topLevelPipelineAggs = Collections.singletonList(siblingPipelineAggregator); - reducedAggs = InternalAggregations.reduce(Collections.singletonList(aggs), topLevelPipelineAggs, reduceContext); + InternalAggregations aggs = new InternalAggregations(Collections.singletonList(terms), + Collections.singletonList(siblingPipelineAggregator)); + reducedAggs = InternalAggregations.reduce(Collections.singletonList(aggs), reduceContext); } assertEquals(0, reducedAggs.getTopLevelPipelineAggregators().size()); assertEquals(2, reducedAggs.aggregations.size()); From 64fb309ccaed0c10bef0bf457270be6820d4f1ca Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Fri, 22 Mar 2019 11:29:07 +0100 Subject: [PATCH 2/6] address review comments --- .../search/query/QuerySearchResult.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java b/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java index f5f2c010cba27..e17b830a73c9b 100644 --- a/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java +++ b/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java @@ -37,6 +37,7 @@ import org.elasticsearch.search.suggest.Suggest; import java.io.IOException; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -289,13 +290,15 @@ public void readFromWithId(long id, StreamInput in) throws IOException { if (in.getVersion().before(Version.V_8_0_0)) { List pipelineAggregators = in.readNamedWriteableList(PipelineAggregator.class).stream() .map(a -> (SiblingPipelineAggregator) a).collect(Collectors.toList()); - List internalAggs = aggregations.asList().stream() - .map(agg -> (InternalAggregation) agg).collect(Collectors.toList()); - assert this.aggregations.getTopLevelPipelineAggregators().isEmpty(); - //Earlier versions serialize sibling pipeline aggs separately as they used to be set to QuerySearchResult directly, - //while later versions include them in InternalAggregations. Note that despite serializing sibling pipeline aggs as part of - //InternalAggregations is supported since 6.7.0, the shards set sibling pipeline aggs to InternalAggregations only from 7.1 on. - this.aggregations = new InternalAggregations(internalAggs, pipelineAggregators); + if (hasAggs && pipelineAggregators.isEmpty() == false) { + assert this.aggregations.getTopLevelPipelineAggregators().isEmpty(); + List internalAggs = aggregations.asList().stream() + .map(agg -> (InternalAggregation) agg).collect(Collectors.toList()); + //Earlier versions serialize sibling pipeline aggs separately as they used to be set to QuerySearchResult directly, while + //later versions include them in InternalAggregations. Note that despite serializing sibling pipeline aggs as part of + //InternalAggregations is supported since 6.7.0, the shards set sibling pipeline aggs to InternalAggregations only from 7.1. + this.aggregations = new InternalAggregations(internalAggs, pipelineAggregators); + } } if (in.readBoolean()) { suggest = new Suggest(in); @@ -337,7 +340,11 @@ public void writeToNoId(StreamOutput out) throws IOException { //Earlier versions expect sibling pipeline aggs separately as they used to be set to QuerySearchResult directly, //while later versions expect them in InternalAggregations. Note that despite serializing sibling pipeline aggs as part of //InternalAggregations is supported since 6.7.0, the shards set sibling pipeline aggs to InternalAggregations only from 7.1 on. - out.writeNamedWriteableList(aggregations.getTopLevelPipelineAggregators()); + if (aggregations == null) { + out.writeNamedWriteableList(Collections.emptyList()); + } else { + out.writeNamedWriteableList(aggregations.getTopLevelPipelineAggregators()); + } } if (suggest == null) { out.writeBoolean(false); From 56cd793ac77c5a9b9d28ba3dc94ded03f3a3ca83 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Fri, 22 Mar 2019 17:31:36 +0100 Subject: [PATCH 3/6] add tests --- .../search/query/QuerySearchResult.java | 1 - .../InternalAggregationsTests.java | 8 +- .../search/query/QuerySearchResultTests.java | 147 ++++++++++++++++++ 3 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java diff --git a/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java b/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java index e17b830a73c9b..9c624940db8e4 100644 --- a/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java +++ b/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java @@ -291,7 +291,6 @@ public void readFromWithId(long id, StreamInput in) throws IOException { List pipelineAggregators = in.readNamedWriteableList(PipelineAggregator.class).stream() .map(a -> (SiblingPipelineAggregator) a).collect(Collectors.toList()); if (hasAggs && pipelineAggregators.isEmpty() == false) { - assert this.aggregations.getTopLevelPipelineAggregators().isEmpty(); List internalAggs = aggregations.asList().stream() .map(agg -> (InternalAggregation) agg).collect(Collectors.toList()); //Earlier versions serialize sibling pipeline aggs separately as they used to be set to QuerySearchResult directly, while diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationsTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationsTests.java index efad636c1e400..aa244ff7a320b 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationsTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationsTests.java @@ -88,7 +88,7 @@ public void testFinalReduceTopLevelPipelineAggs() { assertEquals(2, reducedAggs.aggregations.size()); } - public void testSerialization() throws Exception { + public static InternalAggregations createTestInstance() throws Exception { List aggsList = new ArrayList<>(); if (randomBoolean()) { StringTermsTests stringTermsTests = new StringTermsTests(); @@ -117,7 +117,11 @@ public void testSerialization() throws Exception { topLevelPipelineAggs.add((SiblingPipelineAggregator)new SumBucketPipelineAggregationBuilder("name3", "bucket3").create()); } } - InternalAggregations aggregations = new InternalAggregations(aggsList, topLevelPipelineAggs); + return new InternalAggregations(aggsList, topLevelPipelineAggs); + } + + public void testSerialization() throws Exception { + InternalAggregations aggregations = createTestInstance(); writeToAndReadFrom(aggregations, 0); } diff --git a/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java b/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java new file mode 100644 index 0000000000000..b2f09d43c9b2c --- /dev/null +++ b/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java @@ -0,0 +1,147 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.search.query; + +import org.apache.lucene.search.ScoreDoc; +import org.apache.lucene.search.TopDocs; +import org.apache.lucene.search.TotalHits; +import org.elasticsearch.Version; +import org.elasticsearch.action.OriginalIndices; +import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput; +import org.elasticsearch.common.io.stream.NamedWriteableRegistry; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.search.DocValueFormat; +import org.elasticsearch.search.SearchModule; +import org.elasticsearch.search.SearchShardTarget; +import org.elasticsearch.search.aggregations.Aggregations; +import org.elasticsearch.search.aggregations.InternalAggregations; +import org.elasticsearch.search.aggregations.InternalAggregationsTests; +import org.elasticsearch.search.aggregations.pipeline.SiblingPipelineAggregator; +import org.elasticsearch.search.suggest.SuggestTests; +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.test.VersionUtils; + +import java.io.IOException; +import java.util.Base64; +import java.util.List; + +import static java.util.Collections.emptyList; + +public class QuerySearchResultTests extends ESTestCase { + + private final NamedWriteableRegistry namedWriteableRegistry; + + public QuerySearchResultTests() { + SearchModule searchModule = new SearchModule(Settings.EMPTY, false, emptyList()); + this.namedWriteableRegistry = new NamedWriteableRegistry(searchModule.getNamedWriteables()); + } + + private static QuerySearchResult createTestInstance() throws Exception { + ShardId shardId = new ShardId("index", "uuid", randomInt()); + QuerySearchResult result = new QuerySearchResult(randomLong(), new SearchShardTarget("node", shardId, null, OriginalIndices.NONE)); + if (randomBoolean()) { + result.terminatedEarly(randomBoolean()); + } + TopDocs topDocs = new TopDocs(new TotalHits(randomLongBetween(0, Long.MAX_VALUE), TotalHits.Relation.EQUAL_TO), new ScoreDoc[0]); + result.topDocs(new TopDocsAndMaxScore(topDocs, randomBoolean() ? Float.NaN : randomFloat()), new DocValueFormat[0]); + result.size(randomInt()); + result.from(randomInt()); + if (randomBoolean()) { + result.suggest(SuggestTests.createTestItem()); + } + if (randomBoolean()) { + result.aggregations(InternalAggregationsTests.createTestInstance()); + } + return result; + } + + public void testSerialization() throws Exception { + QuerySearchResult querySearchResult = createTestInstance(); + Version version = VersionUtils.randomVersion(random()); + QuerySearchResult deserialized = copyStreamable(querySearchResult, namedWriteableRegistry, QuerySearchResult::new, version); + assertEquals(querySearchResult.getRequestId(), deserialized.getRequestId()); + assertNull(deserialized.getSearchShardTarget()); + assertEquals(querySearchResult.topDocs().maxScore, deserialized.topDocs().maxScore, 0f); + assertEquals(querySearchResult.topDocs().topDocs.totalHits, deserialized.topDocs().topDocs.totalHits); + assertEquals(querySearchResult.from(), deserialized.from()); + assertEquals(querySearchResult.size(), deserialized.size()); + assertEquals(querySearchResult.hasAggs(), deserialized.hasAggs()); + if (deserialized.hasAggs()) { + Aggregations aggs = querySearchResult.consumeAggs(); + Aggregations deserializedAggs = deserialized.consumeAggs(); + assertEquals(aggs.asList(), deserializedAggs.asList()); + List pipelineAggs = ((InternalAggregations) aggs).getTopLevelPipelineAggregators(); + List deserializedPipelineAggs = + ((InternalAggregations) deserializedAggs).getTopLevelPipelineAggregators(); + assertEquals(pipelineAggs.size(), deserializedPipelineAggs.size()); + for (int i = 0; i < pipelineAggs.size(); i++) { + SiblingPipelineAggregator pipelineAgg = pipelineAggs.get(i); + SiblingPipelineAggregator deserializedPipelineAgg = deserializedPipelineAggs.get(i); + assertArrayEquals(pipelineAgg.bucketsPaths(), deserializedPipelineAgg.bucketsPaths()); + assertEquals(pipelineAgg.name(), deserializedPipelineAgg.name()); + } + } + assertEquals(querySearchResult.terminatedEarly(), deserialized.terminatedEarly()); + } + + //TODO update version and rename after backport + public void testReadFromPre_8_0_0() throws IOException { + String message = "AAAAAAAAAGQAAAEAAH/AAAAAAQEGc3Rlcm1zBU5DZ0Jl/wABAwHmAQNyYXcFAQAGHAAAAAAAAABzAgZzdGVybXMFZm9tUFoKAAABAwHmAQNy" + + "YXcFAQAFAgAAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAAAcwAACmViTEtDVlpYS0Y/AAAAAAAAAHMAAApkRVJlQWhlYkdUEgAAAAAAAABzAAAKemVITnR3T" + + "0d6SyYAAAAAAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtzS25xCgAAAQMB5gEDcmF3BQEABQgAAAAAAAAAcwAAClpHaWVrR0t5UmofAAAAAAAAAHMAAAp1eX" + + "hmbmplU3lHWwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAAAAAcwAACnZ0Y3R2bENwU1A7AAAAAAAAAHMAAApOUnF4Z3F0V1l6AApQbUlaenRDWXhYSQAAAAA" + + "AAABzAgZzdGVybXMFZm9tUFoKAAABAwHmAQNyYXcFAQAFAgAAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAAAcwAACmViTEtDVlpYS0Y/AAAAAAAAAHMAAApk" + + "RVJlQWhlYkdUEgAAAAAAAABzAAAKemVITnR3T0d6SyYAAAAAAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtzS25xCgAAAQMB5gEDcmF3BQEABQgAAAAAAAAAc" + + "wAAClpHaWVrR0t5UmofAAAAAAAAAHMAAAp1eXhmbmplU3lHWwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAAAAAcwAACnZ0Y3R2bENwU1A7AAAAAAAAAHMAAA" + + "pOUnF4Z3F0V1l6AAp2TXZzbnNGVVJsOAAAAAAAAABzAgZzdGVybXMFZm9tUFoKAAABAwHmAQNyYXcFAQAFAgAAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAA" + + "AcwAACmViTEtDVlpYS0Y/AAAAAAAAAHMAAApkRVJlQWhlYkdUEgAAAAAAAABzAAAKemVITnR3T0d6SyYAAAAAAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtz" + + "S25xCgAAAQMB5gEDcmF3BQEABQgAAAAAAAAAcwAAClpHaWVrR0t5UmofAAAAAAAAAHMAAAp1eXhmbmplU3lHWwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAA" + + "AAAcwAACnZ0Y3R2bENwU1A7AAAAAAAAAHMAAApOUnF4Z3F0V1l6AApPRFBodEdiVEZlBgAAAAAAAABzAgZzdGVybXMFZm9tUFoKAAABAwHmAQNyYXcFAQAFAg" + + "AAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAAAcwAACmViTEtDVlpYS0Y/AAAAAAAAAHMAAApkRVJlQWhlYkdUEgAAAAAAAABzAAAKemVITnR3T0d6SyYAAAA" + + "AAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtzS25xCgAAAQMB5gEDcmF3BQEABQgAAAAAAAAAcwAAClpHaWVrR0t5UmofAAAAAAAAAHMAAAp1eXhmbmplU3lH" + + "WwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAAAAAcwAACnZ0Y3R2bENwU1A7AAAAAAAAAHMAAApOUnF4Z3F0V1l6AApqYXJTY1VLUWtINgAAAAAAAABzAgZzd" + + "GVybXMFZm9tUFoKAAABAwHmAQNyYXcFAQAFAgAAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAAAcwAACmViTEtDVlpYS0Y/AAAAAAAAAHMAAApkRVJlQWhlYk" + + "dUEgAAAAAAAABzAAAKemVITnR3T0d6SyYAAAAAAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtzS25xCgAAAQMB5gEDcmF3BQEABQgAAAAAAAAAcwAAClpHaWV" + + "rR0t5UmofAAAAAAAAAHMAAAp1eXhmbmplU3lHWwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAAAAAcwAACnZ0Y3R2bENwU1A7AAAAAAAAAHMAAApOUnF4Z3F0" + + "V1l6AApLSlViaGhheVNIHQAAAAAAAABzAgZzdGVybXMFZm9tUFoKAAABAwHmAQNyYXcFAQAFAgAAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAAAcwAACmViT" + + "EtDVlpYS0Y/AAAAAAAAAHMAAApkRVJlQWhlYkdUEgAAAAAAAABzAAAKemVITnR3T0d6SyYAAAAAAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtzS25xCgAAAQ" + + "MB5gEDcmF3BQEABQgAAAAAAAAAcwAAClpHaWVrR0t5UmofAAAAAAAAAHMAAAp1eXhmbmplU3lHWwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAAAAAcwAACnZ" + + "0Y3R2bENwU1A7AAAAAAAAAHMAAApOUnF4Z3F0V1l6AAptcGRZZnZpSURaAQptYXhfYnVja2V0BW5hbWUxAQdidWNrZXQx/wNyYXcBAQptYXhfYnVja2V0BW5h" + + "bWUxAQdidWNrZXQx/wNyYXcBAAACAAH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + + "AAAA=="; + byte[] bytes = Base64.getDecoder().decode(message); + try (NamedWriteableAwareStreamInput in = new NamedWriteableAwareStreamInput(StreamInput.wrap(bytes), namedWriteableRegistry)) { + in.setVersion(VersionUtils.randomVersionBetween(random(), Version.CURRENT.minimumCompatibilityVersion(), + Version.max(Version.CURRENT.minimumCompatibilityVersion(), VersionUtils.getPreviousVersion(Version.CURRENT)))); + QuerySearchResult querySearchResult = new QuerySearchResult(); + querySearchResult.readFrom(in); + assertEquals(100, querySearchResult.getRequestId()); + assertTrue(querySearchResult.hasAggs()); + InternalAggregations aggs = (InternalAggregations)querySearchResult.consumeAggs(); + assertEquals(1, aggs.asList().size()); + //top-level pipeline aggs are retrieved as part of InternalAggregations although they were serialized separately + assertEquals(1, aggs.getTopLevelPipelineAggregators().size()); + } + } +} From 11fe5dacf8361b387bcdc32de588df0fbed29dcf Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Fri, 22 Mar 2019 17:41:04 +0100 Subject: [PATCH 4/6] add tests --- .../search/query/QuerySearchResultTests.java | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java b/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java index b2f09d43c9b2c..9ee627ebb4865 100644 --- a/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java +++ b/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java @@ -106,30 +106,20 @@ public void testSerialization() throws Exception { //TODO update version and rename after backport public void testReadFromPre_8_0_0() throws IOException { - String message = "AAAAAAAAAGQAAAEAAH/AAAAAAQEGc3Rlcm1zBU5DZ0Jl/wABAwHmAQNyYXcFAQAGHAAAAAAAAABzAgZzdGVybXMFZm9tUFoKAAABAwHmAQNy" + - "YXcFAQAFAgAAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAAAcwAACmViTEtDVlpYS0Y/AAAAAAAAAHMAAApkRVJlQWhlYkdUEgAAAAAAAABzAAAKemVITnR3T" + - "0d6SyYAAAAAAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtzS25xCgAAAQMB5gEDcmF3BQEABQgAAAAAAAAAcwAAClpHaWVrR0t5UmofAAAAAAAAAHMAAAp1eX" + - "hmbmplU3lHWwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAAAAAcwAACnZ0Y3R2bENwU1A7AAAAAAAAAHMAAApOUnF4Z3F0V1l6AApQbUlaenRDWXhYSQAAAAA" + - "AAABzAgZzdGVybXMFZm9tUFoKAAABAwHmAQNyYXcFAQAFAgAAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAAAcwAACmViTEtDVlpYS0Y/AAAAAAAAAHMAAApk" + - "RVJlQWhlYkdUEgAAAAAAAABzAAAKemVITnR3T0d6SyYAAAAAAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtzS25xCgAAAQMB5gEDcmF3BQEABQgAAAAAAAAAc" + - "wAAClpHaWVrR0t5UmofAAAAAAAAAHMAAAp1eXhmbmplU3lHWwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAAAAAcwAACnZ0Y3R2bENwU1A7AAAAAAAAAHMAAA" + - "pOUnF4Z3F0V1l6AAp2TXZzbnNGVVJsOAAAAAAAAABzAgZzdGVybXMFZm9tUFoKAAABAwHmAQNyYXcFAQAFAgAAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAA" + - "AcwAACmViTEtDVlpYS0Y/AAAAAAAAAHMAAApkRVJlQWhlYkdUEgAAAAAAAABzAAAKemVITnR3T0d6SyYAAAAAAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtz" + - "S25xCgAAAQMB5gEDcmF3BQEABQgAAAAAAAAAcwAAClpHaWVrR0t5UmofAAAAAAAAAHMAAAp1eXhmbmplU3lHWwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAA" + - "AAAcwAACnZ0Y3R2bENwU1A7AAAAAAAAAHMAAApOUnF4Z3F0V1l6AApPRFBodEdiVEZlBgAAAAAAAABzAgZzdGVybXMFZm9tUFoKAAABAwHmAQNyYXcFAQAFAg" + - "AAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAAAcwAACmViTEtDVlpYS0Y/AAAAAAAAAHMAAApkRVJlQWhlYkdUEgAAAAAAAABzAAAKemVITnR3T0d6SyYAAAA" + - "AAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtzS25xCgAAAQMB5gEDcmF3BQEABQgAAAAAAAAAcwAAClpHaWVrR0t5UmofAAAAAAAAAHMAAAp1eXhmbmplU3lH" + - "WwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAAAAAcwAACnZ0Y3R2bENwU1A7AAAAAAAAAHMAAApOUnF4Z3F0V1l6AApqYXJTY1VLUWtINgAAAAAAAABzAgZzd" + - "GVybXMFZm9tUFoKAAABAwHmAQNyYXcFAQAFAgAAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAAAcwAACmViTEtDVlpYS0Y/AAAAAAAAAHMAAApkRVJlQWhlYk" + - "dUEgAAAAAAAABzAAAKemVITnR3T0d6SyYAAAAAAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtzS25xCgAAAQMB5gEDcmF3BQEABQgAAAAAAAAAcwAAClpHaWV" + - "rR0t5UmofAAAAAAAAAHMAAAp1eXhmbmplU3lHWwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAAAAAcwAACnZ0Y3R2bENwU1A7AAAAAAAAAHMAAApOUnF4Z3F0" + - "V1l6AApLSlViaGhheVNIHQAAAAAAAABzAgZzdGVybXMFZm9tUFoKAAABAwHmAQNyYXcFAQAFAgAAAAAAAABzAAAKTVNUbmtmRERlWkcAAAAAAAAAcwAACmViT" + - "EtDVlpYS0Y/AAAAAAAAAHMAAApkRVJlQWhlYkdUEgAAAAAAAABzAAAKemVITnR3T0d6SyYAAAAAAAAAcwAACllYeEtZRExETnUGc3Rlcm1zBWtzS25xCgAAAQ" + - "MB5gEDcmF3BQEABQgAAAAAAAAAcwAAClpHaWVrR0t5UmofAAAAAAAAAHMAAAp1eXhmbmplU3lHWwAAAAAAAABzAAAKVk5YZlBUSWl0URgAAAAAAAAAcwAACnZ" + - "0Y3R2bENwU1A7AAAAAAAAAHMAAApOUnF4Z3F0V1l6AAptcGRZZnZpSURaAQptYXhfYnVja2V0BW5hbWUxAQdidWNrZXQx/wNyYXcBAQptYXhfYnVja2V0BW5h" + - "bWUxAQdidWNrZXQx/wNyYXcBAAACAAH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + - "AAAA=="; + String message = "AAAAAAAAAGQAAAEAAAB/wAAAAAEBBnN0ZXJtcwVJblhNRgoDBVNhdWpvAAVrS3l3cwVHSVVZaAAFZXRUbEUFZGN0WVoABXhzYnVrAAEDAfoN" + + "A3JhdwUBAAJRAAAAAAAAA30DBnN0ZXJtcwVNdVVFRwoAAAEDAfoNA3JhdwUBAAdDAAAAAAAAA30AAApQVkFhaUxSdHh5TAAAAAAAAAN9AAAKTVRUeUxnd1hyd" + + "y0AAAAAAAADfQAACnZRQXZ3cWp0SmwPAAAAAAAAA30AAApmYXNyUUhNVWZBCwAAAAAAAAN9AAAKT3FIQ2RMZ1JZUwUAAAAAAAADfQAACm9jT05aZmZ4ZmUmAA" + + "AAAAAAA30AAApvb0tJTkdvbHdzBnN0ZXJtcwVtRmlmZAoAAAEDAfoNA3JhdwUBAARXAAAAAAAAA30AAApZd3BwQlpBZEhpMQAAAAAAAAN9AAAKREZ3UVpTSXh" + + "DSE4AAAAAAAADfQAAClVMZW1YZGtkSHUUAAAAAAAAA30AAApBUVdKVk1kTlF1BnN0ZXJtcwVxbkJGVgoAAAEDAfoNA3JhdwUBAAYJAAAAAAAAA30AAApBS2NL" + + "U1ZVS25EIQAAAAAAAAN9AAAKWGpCbXZBZmduRhsAAAAAAAADfQAACk54TkJEV3pLRmI7AAAAAAAAA30AAApydkdaZnJycXhWSAAAAAAAAAN9AAAKSURVZ3JhQ" + + "lFHSy4AAAAAAAADfQAACmJmZ0x5YlFlVksAClRJZHJlSkpVc1Y4AAAAAAAAA30DBnN0ZXJtcwVNdVVFRwoAAAEDAfoNA3JhdwUBAAdDAAAAAAAAA30AAApQVk" + + "FhaUxSdHh5TAAAAAAAAAN9AAAKTVRUeUxnd1hydy0AAAAAAAADfQAACnZRQXZ3cWp0SmwPAAAAAAAAA30AAApmYXNyUUhNVWZBCwAAAAAAAAN9AAAKT3FIQ2R" + + "MZ1JZUwUAAAAAAAADfQAACm9jT05aZmZ4ZmUmAAAAAAAAA30AAApvb0tJTkdvbHdzBnN0ZXJtcwVtRmlmZAoAAAEDAfoNA3JhdwUBAARXAAAAAAAAA30AAApZ" + + "d3BwQlpBZEhpMQAAAAAAAAN9AAAKREZ3UVpTSXhDSE4AAAAAAAADfQAAClVMZW1YZGtkSHUUAAAAAAAAA30AAApBUVdKVk1kTlF1BnN0ZXJtcwVxbkJGVgoAA" + + "AEDAfoNA3JhdwUBAAYJAAAAAAAAA30AAApBS2NLU1ZVS25EIQAAAAAAAAN9AAAKWGpCbXZBZmduRhsAAAAAAAADfQAACk54TkJEV3pLRmI7AAAAAAAAA30AAA" + + "pydkdaZnJycXhWSAAAAAAAAAN9AAAKSURVZ3JhQlFHSy4AAAAAAAADfQAACmJmZ0x5YlFlVksACm5rdExLUHp3cGgBCm1heF9idWNrZXQFbmFtZTEBB2J1Y2t" + + "ldDH/A3JhdwEBCm1heF9idWNrZXQFbmFtZTEBB2J1Y2tldDH/A3JhdwEAAAIAAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; + byte[] bytes = Base64.getDecoder().decode(message); try (NamedWriteableAwareStreamInput in = new NamedWriteableAwareStreamInput(StreamInput.wrap(bytes), namedWriteableRegistry)) { in.setVersion(VersionUtils.randomVersionBetween(random(), Version.CURRENT.minimumCompatibilityVersion(), From 4d4fa33d1b048729924592590084e28c83636f27 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Wed, 27 Mar 2019 14:24:47 +0100 Subject: [PATCH 5/6] update versions and disable bwc tests --- build.gradle | 4 ++-- .../org/elasticsearch/search/query/QuerySearchResult.java | 5 ++--- .../elasticsearch/search/query/QuerySearchResultTests.java | 3 +-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 80ed642369ace..d452170b5fb90 100644 --- a/build.gradle +++ b/build.gradle @@ -162,8 +162,8 @@ task verifyVersions { * after the backport of the backcompat code is complete. */ -boolean bwc_tests_enabled = true -final String bwc_tests_disabled_issue = "" /* place a PR link here when committing bwc changes */ +boolean bwc_tests_enabled = false +final String bwc_tests_disabled_issue = "https://github.com/elastic/elasticsearch/pull/40319" /* place a PR link here when committing bwc changes */ if (bwc_tests_enabled == false) { if (bwc_tests_disabled_issue.isEmpty()) { throw new GradleException("bwc_tests_disabled_issue must be set when bwc_tests_enabled == false") diff --git a/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java b/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java index 9c624940db8e4..9f9a2c2680a1f 100644 --- a/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java +++ b/server/src/main/java/org/elasticsearch/search/query/QuerySearchResult.java @@ -286,8 +286,7 @@ public void readFromWithId(long id, StreamInput in) throws IOException { if (hasAggs = in.readBoolean()) { aggregations = InternalAggregations.readAggregations(in); } - //TODO update version after backport - if (in.getVersion().before(Version.V_8_0_0)) { + if (in.getVersion().before(Version.V_7_1_0)) { List pipelineAggregators = in.readNamedWriteableList(PipelineAggregator.class).stream() .map(a -> (SiblingPipelineAggregator) a).collect(Collectors.toList()); if (hasAggs && pipelineAggregators.isEmpty() == false) { @@ -335,7 +334,7 @@ public void writeToNoId(StreamOutput out) throws IOException { out.writeBoolean(true); aggregations.writeTo(out); } - if (out.getVersion().before(Version.V_8_0_0)) { + if (out.getVersion().before(Version.V_7_1_0)) { //Earlier versions expect sibling pipeline aggs separately as they used to be set to QuerySearchResult directly, //while later versions expect them in InternalAggregations. Note that despite serializing sibling pipeline aggs as part of //InternalAggregations is supported since 6.7.0, the shards set sibling pipeline aggs to InternalAggregations only from 7.1 on. diff --git a/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java b/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java index 9ee627ebb4865..780b9f8720861 100644 --- a/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java +++ b/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java @@ -104,8 +104,7 @@ public void testSerialization() throws Exception { assertEquals(querySearchResult.terminatedEarly(), deserialized.terminatedEarly()); } - //TODO update version and rename after backport - public void testReadFromPre_8_0_0() throws IOException { + public void testReadFromPre_7_1_0() throws IOException { String message = "AAAAAAAAAGQAAAEAAAB/wAAAAAEBBnN0ZXJtcwVJblhNRgoDBVNhdWpvAAVrS3l3cwVHSVVZaAAFZXRUbEUFZGN0WVoABXhzYnVrAAEDAfoN" + "A3JhdwUBAAJRAAAAAAAAA30DBnN0ZXJtcwVNdVVFRwoAAAEDAfoNA3JhdwUBAAdDAAAAAAAAA30AAApQVkFhaUxSdHh5TAAAAAAAAAN9AAAKTVRUeUxnd1hyd" + "y0AAAAAAAADfQAACnZRQXZ3cWp0SmwPAAAAAAAAA30AAApmYXNyUUhNVWZBCwAAAAAAAAN9AAAKT3FIQ2RMZ1JZUwUAAAAAAAADfQAACm9jT05aZmZ4ZmUmAA" + From bef93153885bc69a70c2430013c90a36b75cf9ec Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Wed, 27 Mar 2019 15:09:40 +0100 Subject: [PATCH 6/6] remove redundant test, will be added to 7.x only --- .../search/query/QuerySearchResultTests.java | 34 ------------------- 1 file changed, 34 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java b/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java index 780b9f8720861..64712b3e417a0 100644 --- a/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java +++ b/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java @@ -24,9 +24,7 @@ import org.apache.lucene.search.TotalHits; import org.elasticsearch.Version; import org.elasticsearch.action.OriginalIndices; -import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; -import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.shard.ShardId; @@ -41,8 +39,6 @@ import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.VersionUtils; -import java.io.IOException; -import java.util.Base64; import java.util.List; import static java.util.Collections.emptyList; @@ -103,34 +99,4 @@ public void testSerialization() throws Exception { } assertEquals(querySearchResult.terminatedEarly(), deserialized.terminatedEarly()); } - - public void testReadFromPre_7_1_0() throws IOException { - String message = "AAAAAAAAAGQAAAEAAAB/wAAAAAEBBnN0ZXJtcwVJblhNRgoDBVNhdWpvAAVrS3l3cwVHSVVZaAAFZXRUbEUFZGN0WVoABXhzYnVrAAEDAfoN" + - "A3JhdwUBAAJRAAAAAAAAA30DBnN0ZXJtcwVNdVVFRwoAAAEDAfoNA3JhdwUBAAdDAAAAAAAAA30AAApQVkFhaUxSdHh5TAAAAAAAAAN9AAAKTVRUeUxnd1hyd" + - "y0AAAAAAAADfQAACnZRQXZ3cWp0SmwPAAAAAAAAA30AAApmYXNyUUhNVWZBCwAAAAAAAAN9AAAKT3FIQ2RMZ1JZUwUAAAAAAAADfQAACm9jT05aZmZ4ZmUmAA" + - "AAAAAAA30AAApvb0tJTkdvbHdzBnN0ZXJtcwVtRmlmZAoAAAEDAfoNA3JhdwUBAARXAAAAAAAAA30AAApZd3BwQlpBZEhpMQAAAAAAAAN9AAAKREZ3UVpTSXh" + - "DSE4AAAAAAAADfQAAClVMZW1YZGtkSHUUAAAAAAAAA30AAApBUVdKVk1kTlF1BnN0ZXJtcwVxbkJGVgoAAAEDAfoNA3JhdwUBAAYJAAAAAAAAA30AAApBS2NL" + - "U1ZVS25EIQAAAAAAAAN9AAAKWGpCbXZBZmduRhsAAAAAAAADfQAACk54TkJEV3pLRmI7AAAAAAAAA30AAApydkdaZnJycXhWSAAAAAAAAAN9AAAKSURVZ3JhQ" + - "lFHSy4AAAAAAAADfQAACmJmZ0x5YlFlVksAClRJZHJlSkpVc1Y4AAAAAAAAA30DBnN0ZXJtcwVNdVVFRwoAAAEDAfoNA3JhdwUBAAdDAAAAAAAAA30AAApQVk" + - "FhaUxSdHh5TAAAAAAAAAN9AAAKTVRUeUxnd1hydy0AAAAAAAADfQAACnZRQXZ3cWp0SmwPAAAAAAAAA30AAApmYXNyUUhNVWZBCwAAAAAAAAN9AAAKT3FIQ2R" + - "MZ1JZUwUAAAAAAAADfQAACm9jT05aZmZ4ZmUmAAAAAAAAA30AAApvb0tJTkdvbHdzBnN0ZXJtcwVtRmlmZAoAAAEDAfoNA3JhdwUBAARXAAAAAAAAA30AAApZ" + - "d3BwQlpBZEhpMQAAAAAAAAN9AAAKREZ3UVpTSXhDSE4AAAAAAAADfQAAClVMZW1YZGtkSHUUAAAAAAAAA30AAApBUVdKVk1kTlF1BnN0ZXJtcwVxbkJGVgoAA" + - "AEDAfoNA3JhdwUBAAYJAAAAAAAAA30AAApBS2NLU1ZVS25EIQAAAAAAAAN9AAAKWGpCbXZBZmduRhsAAAAAAAADfQAACk54TkJEV3pLRmI7AAAAAAAAA30AAA" + - "pydkdaZnJycXhWSAAAAAAAAAN9AAAKSURVZ3JhQlFHSy4AAAAAAAADfQAACmJmZ0x5YlFlVksACm5rdExLUHp3cGgBCm1heF9idWNrZXQFbmFtZTEBB2J1Y2t" + - "ldDH/A3JhdwEBCm1heF9idWNrZXQFbmFtZTEBB2J1Y2tldDH/A3JhdwEAAAIAAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - - byte[] bytes = Base64.getDecoder().decode(message); - try (NamedWriteableAwareStreamInput in = new NamedWriteableAwareStreamInput(StreamInput.wrap(bytes), namedWriteableRegistry)) { - in.setVersion(VersionUtils.randomVersionBetween(random(), Version.CURRENT.minimumCompatibilityVersion(), - Version.max(Version.CURRENT.minimumCompatibilityVersion(), VersionUtils.getPreviousVersion(Version.CURRENT)))); - QuerySearchResult querySearchResult = new QuerySearchResult(); - querySearchResult.readFrom(in); - assertEquals(100, querySearchResult.getRequestId()); - assertTrue(querySearchResult.hasAggs()); - InternalAggregations aggs = (InternalAggregations)querySearchResult.consumeAggs(); - assertEquals(1, aggs.asList().size()); - //top-level pipeline aggs are retrieved as part of InternalAggregations although they were serialized separately - assertEquals(1, aggs.getTopLevelPipelineAggregators().size()); - } - } }