diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/AbstractParsedPercentiles.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/AbstractParsedPercentiles.java index f48e7257b1c2a..a45d089cc79bc 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/AbstractParsedPercentiles.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/AbstractParsedPercentiles.java @@ -81,7 +81,7 @@ public boolean hasNext() { @Override public Percentile next() { Map.Entry next = iterator.next(); - return new InternalPercentile(next.getKey(), next.getValue()); + return new Percentile(next.getKey(), next.getValue()); } }; } diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/ParsedHDRPercentileRanks.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/ParsedHDRPercentileRanks.java index 31fc8f88cfca2..79749df11760b 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/ParsedHDRPercentileRanks.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/ParsedHDRPercentileRanks.java @@ -23,8 +23,10 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.search.aggregations.metrics.percentiles.AbstractParsedPercentiles; import org.elasticsearch.search.aggregations.metrics.percentiles.ParsedPercentileRanks; +import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile; import java.io.IOException; +import java.util.Iterator; public class ParsedHDRPercentileRanks extends ParsedPercentileRanks { @@ -33,6 +35,23 @@ protected String getType() { return InternalHDRPercentileRanks.NAME; } + @Override + public Iterator iterator() { + final Iterator iterator = super.iterator(); + return new Iterator() { + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public Percentile next() { + Percentile percentile = iterator.next(); + return new Percentile(percentile.getValue(), percentile.getPercent()); + } + }; + } + private static ObjectParser PARSER = new ObjectParser<>(ParsedHDRPercentileRanks.class.getSimpleName(), true, ParsedHDRPercentileRanks::new); static { diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/ParsedTDigestPercentileRanks.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/ParsedTDigestPercentileRanks.java index 57f3df041154f..3d51e98d62201 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/ParsedTDigestPercentileRanks.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/ParsedTDigestPercentileRanks.java @@ -23,8 +23,10 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.search.aggregations.metrics.percentiles.AbstractParsedPercentiles; import org.elasticsearch.search.aggregations.metrics.percentiles.ParsedPercentileRanks; +import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile; import java.io.IOException; +import java.util.Iterator; public class ParsedTDigestPercentileRanks extends ParsedPercentileRanks { @@ -33,6 +35,23 @@ protected String getType() { return InternalTDigestPercentileRanks.NAME; } + @Override + public Iterator iterator() { + final Iterator iterator = super.iterator(); + return new Iterator() { + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public Percentile next() { + Percentile percentile = iterator.next(); + return new Percentile(percentile.getValue(), percentile.getPercent()); + } + }; + } + private static ObjectParser PARSER = new ObjectParser<>(ParsedTDigestPercentileRanks.class.getSimpleName(), true, ParsedTDigestPercentileRanks::new); static { diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationTestCase.java b/core/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationTestCase.java index d6b50f69bc9d2..e6c5098761c05 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationTestCase.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/InternalAggregationTestCase.java @@ -54,7 +54,6 @@ import static java.util.Collections.singletonMap; import static org.elasticsearch.common.xcontent.XContentHelper.toXContent; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertToXContentEquivalent; -import static org.hamcrest.Matchers.containsString; public abstract class InternalAggregationTestCase extends AbstractWireSerializingTestCase { @@ -169,6 +168,10 @@ public final void testFromXContent() throws IOException { final NamedXContentRegistry xContentRegistry = xContentRegistry(); final T aggregation = createTestInstance(); + //norelease Remove this assumption when all aggregations can be parsed back. + assumeTrue("This test does not support the aggregation type yet", + getNamedXContents().stream().filter(entry -> entry.name.match(aggregation.getType())).count() > 0); + final ToXContent.Params params = new ToXContent.MapParams(singletonMap(RestSearchAction.TYPED_KEYS_PARAM, "true")); final boolean humanReadable = randomBoolean(); final XContentType xContentType = randomFrom(XContentType.values()); @@ -199,10 +202,6 @@ public final void testFromXContent() throws IOException { final BytesReference parsedBytes = toXContent((ToXContent) parsedAggregation, xContentType, params, humanReadable); assertToXContentEquivalent(originalBytes, parsedBytes, xContentType); assertFromXContent(aggregation, (ParsedAggregation) parsedAggregation); - - } catch (NamedXContentRegistry.UnknownNamedObjectException e) { - //norelease Remove this catch block when all aggregations can be parsed back. - assertThat(e.getMessage(), containsString("Unknown Aggregation")); } } diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/metrics/percentiles/InternalPercentilesRanksTestCase.java b/core/src/test/java/org/elasticsearch/search/aggregations/metrics/percentiles/InternalPercentilesRanksTestCase.java index 23acfcd779a29..be7d55e5447e4 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/metrics/percentiles/InternalPercentilesRanksTestCase.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/metrics/percentiles/InternalPercentilesRanksTestCase.java @@ -19,15 +19,26 @@ package org.elasticsearch.search.aggregations.metrics.percentiles; +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.xcontent.ToXContent; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.rest.action.search.RestSearchAction; import org.elasticsearch.search.DocValueFormat; +import org.elasticsearch.search.aggregations.Aggregation; import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.InternalAggregationTestCase; import org.elasticsearch.search.aggregations.ParsedAggregation; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; +import java.io.IOException; +import java.util.Iterator; import java.util.List; import java.util.Map; +import static java.util.Collections.singletonMap; +import static org.elasticsearch.common.xcontent.XContentHelper.toXContent; + public abstract class InternalPercentilesRanksTestCase extends InternalAggregationTestCase { @Override @@ -64,5 +75,36 @@ protected final void assertFromXContent(T aggregation, ParsedAggregation parsedA assertTrue(parsedClass.isInstance(parsedAggregation)); } + public void testPercentilesRanksIterators() throws IOException { + final T aggregation = createTestInstance(); + + final ToXContent.Params params = new ToXContent.MapParams(singletonMap(RestSearchAction.TYPED_KEYS_PARAM, "true")); + final XContentType xContentType = randomFrom(XContentType.values()); + final BytesReference originalBytes = toXContent(aggregation, xContentType, params, randomBoolean()); + + Aggregation parsedAggregation; + try (XContentParser parser = xContentType.xContent().createParser(xContentRegistry(), originalBytes)) { + assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken()); + assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken()); + + String currentName = parser.currentName(); + int i = currentName.indexOf(InternalAggregation.TYPED_KEYS_DELIMITER); + String aggType = currentName.substring(0, i); + String aggName = currentName.substring(i + 1); + + parsedAggregation = parser.namedObject(Aggregation.class, aggType, aggName); + + assertEquals(XContentParser.Token.END_OBJECT, parser.currentToken()); + assertEquals(XContentParser.Token.END_OBJECT, parser.nextToken()); + assertNull(parser.nextToken()); + } + + final Iterator it = ((PercentileRanks) aggregation).iterator(); + final Iterator parsedIt = ((PercentileRanks) parsedAggregation).iterator(); + while (it.hasNext()) { + assertEquals(it.next(), parsedIt.next()); + } + } + protected abstract Class parsedParsedPercentileRanksClass(); }