From 74f6e0efdd385974ab70ebe91a6569b93795eb57 Mon Sep 17 00:00:00 2001 From: Armin Date: Sat, 19 Apr 2025 03:14:42 +0200 Subject: [PATCH 1/4] Inline redundant SingleBucketAggregation interface This interface is just implemented once, inline it into the abstract parent of all other implementations. --- .../join/aggregations/InternalChildren.java | 6 +- .../join/aggregations/InternalParent.java | 6 +- .../JoinAggregationInspectionHelper.java | 4 +- .../aggregations/InternalChildrenTests.java | 9 +- .../aggregations/InternalParentTests.java | 4 +- .../ParentToChildrenAggregatorTests.java | 11 +- .../bucket/terms/StringTermsIT.java | 2 +- .../aggregations/metrics/ExtendedStatsIT.java | 39 +-- .../metrics/HDRPercentileRanksIT.java | 3 +- .../metrics/HDRPercentilesIT.java | 3 +- .../metrics/MedianAbsoluteDeviationIT.java | 3 +- .../metrics/ScriptedMetricIT.java | 4 +- .../search/aggregations/metrics/StatsIT.java | 13 +- .../search/aggregations/metrics/SumIT.java | 7 +- .../metrics/TDigestPercentileRanksIT.java | 3 +- .../metrics/TDigestPercentilesIT.java | 3 +- .../aggregations/metrics/TopHitsIT.java | 3 +- .../aggregations/metrics/ValueCountIT.java | 4 +- .../aggregations/AggregationBuilders.java | 15 +- .../InternalSingleBucketAggregation.java | 224 ------------------ .../bucket/SingleBucketAggregation.java | 209 +++++++++++++++- .../bucket/filter/InternalFilter.java | 6 +- .../bucket/global/InternalGlobal.java | 5 +- .../bucket/missing/InternalMissing.java | 6 +- .../bucket/nested/InternalNested.java | 5 +- .../bucket/nested/InternalReverseNested.java | 6 +- .../bucket/sampler/InternalSampler.java | 6 +- .../sampler/random/InternalRandomSampler.java | 10 +- .../BucketMetricsPipelineAggregator.java | 4 +- .../aggregations/AggregationsTests.java | 2 +- .../composite/CompositeAggregatorTests.java | 6 +- .../bucket/filter/InternalFilterTests.java | 4 +- .../bucket/global/InternalGlobalTests.java | 4 +- .../bucket/missing/InternalMissingTests.java | 4 +- .../bucket/nested/InternalNestedTests.java | 4 +- .../nested/InternalReverseNestedTests.java | 4 +- .../bucket/nested/NestedAggregatorTests.java | 7 +- .../bucket/sampler/InternalSamplerTests.java | 4 +- .../metrics/CardinalityAggregatorTests.java | 6 +- .../metrics/MaxAggregatorTests.java | 7 +- ...a => SingleBucketAggregationTestCase.java} | 7 +- .../metrics/CentroidAggregationTestBase.java | 14 +- .../SpatialBoundsAggregationTestBase.java | 23 +- .../aggregation/AggregationTestUtils.java | 6 +- .../pivot/AggregationResultUtilsTests.java | 10 +- 45 files changed, 334 insertions(+), 401 deletions(-) delete mode 100644 server/src/main/java/org/elasticsearch/search/aggregations/bucket/InternalSingleBucketAggregation.java rename test/framework/src/main/java/org/elasticsearch/search/aggregations/{InternalSingleBucketAggregationTestCase.java => SingleBucketAggregationTestCase.java} (92%) diff --git a/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/InternalChildren.java b/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/InternalChildren.java index 434681fef3c96..19fc0c3ef3f55 100644 --- a/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/InternalChildren.java +++ b/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/InternalChildren.java @@ -11,7 +11,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import java.io.IOException; import java.util.Map; @@ -19,7 +19,7 @@ /** * Results of the {@link ParentToChildrenAggregator}. */ -public class InternalChildren extends InternalSingleBucketAggregation { +public class InternalChildren extends SingleBucketAggregation { public InternalChildren(String name, long docCount, InternalAggregations aggregations, Map metadata) { super(name, docCount, aggregations, metadata); } @@ -37,7 +37,7 @@ public String getWriteableName() { } @Override - protected InternalSingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { + protected SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { return new InternalChildren(name, docCount, subAggregations, getMetadata()); } } diff --git a/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/InternalParent.java b/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/InternalParent.java index 0c295ed267f6b..4e164d5e8b7c3 100644 --- a/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/InternalParent.java +++ b/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/InternalParent.java @@ -11,7 +11,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import java.io.IOException; import java.util.Map; @@ -19,7 +19,7 @@ /** * Results of the {@link ChildrenToParentAggregator}. */ -public class InternalParent extends InternalSingleBucketAggregation { +public class InternalParent extends SingleBucketAggregation { public InternalParent(String name, long docCount, InternalAggregations aggregations, Map metadata) { super(name, docCount, aggregations, metadata); } @@ -37,7 +37,7 @@ public String getWriteableName() { } @Override - protected InternalSingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { + protected SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { return new InternalParent(name, docCount, subAggregations, getMetadata()); } } diff --git a/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/JoinAggregationInspectionHelper.java b/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/JoinAggregationInspectionHelper.java index 54738e99b6f3f..3152e09564d0f 100644 --- a/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/JoinAggregationInspectionHelper.java +++ b/modules/parent-join/src/main/java/org/elasticsearch/join/aggregations/JoinAggregationInspectionHelper.java @@ -8,6 +8,8 @@ */ package org.elasticsearch.join.aggregations; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; + /** * Counterpart to {@link org.elasticsearch.search.aggregations.support.AggregationInspectionHelper}, providing * helpers for some aggs in the Join package @@ -18,7 +20,7 @@ public static boolean hasValue(InternalParent agg) { return agg.getDocCount() > 0; } - public static boolean hasValue(InternalChildren agg) { + public static boolean hasValue(SingleBucketAggregation agg) { return agg.getDocCount() > 0; } } diff --git a/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/InternalChildrenTests.java b/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/InternalChildrenTests.java index 1bbf0df86cca0..e7b5554ea8637 100644 --- a/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/InternalChildrenTests.java +++ b/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/InternalChildrenTests.java @@ -12,12 +12,13 @@ import org.elasticsearch.join.ParentJoinPlugin; import org.elasticsearch.plugins.SearchPlugin; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.InternalSingleBucketAggregationTestCase; +import org.elasticsearch.search.aggregations.SingleBucketAggregationTestCase; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import java.util.List; import java.util.Map; -public class InternalChildrenTests extends InternalSingleBucketAggregationTestCase { +public class InternalChildrenTests extends SingleBucketAggregationTestCase { @Override protected SearchPlugin registerPlugin() { @@ -25,7 +26,7 @@ protected SearchPlugin registerPlugin() { } @Override - protected InternalChildren createTestInstance( + protected SingleBucketAggregation createTestInstance( String name, long docCount, InternalAggregations aggregations, @@ -35,7 +36,7 @@ protected InternalChildren createTestInstance( } @Override - protected void extraAssertReduced(InternalChildren reduced, List inputs) { + protected void extraAssertReduced(SingleBucketAggregation reduced, List inputs) { // Nothing extra to assert } } diff --git a/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/InternalParentTests.java b/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/InternalParentTests.java index c3c6dbbcf86ae..3935443246649 100644 --- a/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/InternalParentTests.java +++ b/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/InternalParentTests.java @@ -12,12 +12,12 @@ import org.elasticsearch.join.ParentJoinPlugin; import org.elasticsearch.plugins.SearchPlugin; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.InternalSingleBucketAggregationTestCase; +import org.elasticsearch.search.aggregations.SingleBucketAggregationTestCase; import java.util.List; import java.util.Map; -public class InternalParentTests extends InternalSingleBucketAggregationTestCase { +public class InternalParentTests extends SingleBucketAggregationTestCase { @Override protected SearchPlugin registerPlugin() { diff --git a/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/ParentToChildrenAggregatorTests.java b/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/ParentToChildrenAggregatorTests.java index ca90b0e588b18..37a82a58a5e79 100644 --- a/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/ParentToChildrenAggregatorTests.java +++ b/modules/parent-join/src/test/java/org/elasticsearch/join/aggregations/ParentToChildrenAggregatorTests.java @@ -38,6 +38,7 @@ import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.Aggregator; import org.elasticsearch.search.aggregations.AggregatorTestCase; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.terms.StringTerms; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; @@ -154,14 +155,14 @@ public void testParentChildAsSubAgg() throws IOException { StringTerms result = searchAndReduce(indexReader, new AggTestConfig(request, withJoinFields(longField("number"), kwd))); StringTerms.Bucket evenBucket = result.getBucketByKey("even"); - InternalChildren evenChildren = evenBucket.getAggregations().get("children"); + SingleBucketAggregation evenChildren = evenBucket.getAggregations().get("children"); Min evenMin = evenChildren.getAggregations().get("min"); assertThat(evenChildren.getDocCount(), equalTo(expectedEvenChildCount)); assertThat(evenMin.value(), equalTo(expectedEvenMin)); if (expectedOddChildCount > 0) { StringTerms.Bucket oddBucket = result.getBucketByKey("odd"); - InternalChildren oddChildren = oddBucket.getAggregations().get("children"); + SingleBucketAggregation oddChildren = oddBucket.getAggregations().get("children"); Min oddMin = oddChildren.getAggregations().get("min"); assertThat(oddChildren.getDocCount(), equalTo(expectedOddChildCount)); assertThat(oddMin.value(), equalTo(expectedOddMin)); @@ -224,7 +225,7 @@ public void testBestDeferringCollectorWithSubAggOfChildrenAggNeedingScores() thr var fieldType = new NumberFieldMapper.NumberFieldType("number", NumberFieldMapper.NumberType.LONG); var fieldType2 = new KeywordFieldMapper.KeywordFieldType("string_field", false, true, Map.of()); - InternalChildren result = searchAndReduce( + SingleBucketAggregation result = searchAndReduce( indexReader, new AggTestConfig(aggregationBuilder, withJoinFields(fieldType, fieldType2)).withQuery( new TermQuery(new Term("join_field", "parent_type")) @@ -291,13 +292,13 @@ private static SortedDocValuesField createJoinField(String parentType, String id return new SortedDocValuesField("join_field#" + parentType, new BytesRef(id)); } - private void testCase(Query query, IndexReader indexReader, Consumer verify) throws IOException { + private void testCase(Query query, IndexReader indexReader, Consumer verify) throws IOException { ChildrenAggregationBuilder aggregationBuilder = new ChildrenAggregationBuilder("_name", CHILD_TYPE); aggregationBuilder.subAggregation(new MinAggregationBuilder("in_child").field("number")); MappedFieldType fieldType = new NumberFieldMapper.NumberFieldType("number", NumberFieldMapper.NumberType.LONG); - InternalChildren result = searchAndReduce( + SingleBucketAggregation result = searchAndReduce( indexReader, new AggTestConfig(aggregationBuilder, withJoinFields(fieldType)).withQuery(query) ); diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/bucket/terms/StringTermsIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/bucket/terms/StringTermsIT.java index dc6a1e05a6077..422a533be46b8 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/bucket/terms/StringTermsIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/bucket/terms/StringTermsIT.java @@ -106,7 +106,7 @@ public static class CustomScriptPlugin extends AggregationTestScriptsPlugin { protected Map, Object>> pluginScripts() { Map, Object>> scripts = super.pluginScripts(); - scripts.put("'foo_' + _value", vars -> "foo_" + (String) vars.get("_value")); + scripts.put("'foo_' + _value", vars -> "foo_" + vars.get("_value")); scripts.put("_value.substring(0,3)", vars -> ((String) vars.get("_value")).substring(0, 3)); scripts.put("doc['" + MULTI_VALUED_FIELD_NAME + "']", vars -> { diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsIT.java index 8bd91ad7c3542..287bfb1fb75d3 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsIT.java @@ -13,7 +13,6 @@ import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.aggregations.AggregationTestScriptsPlugin; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.Terms; @@ -293,57 +292,45 @@ public void testSingleValuedFieldGetProperty() throws Exception { ExtendedStats stats = global.getAggregations().get("stats"); assertThat(stats, notNullValue()); assertThat(stats.getName(), equalTo("stats")); - ExtendedStats statsFromProperty = (ExtendedStats) ((InternalAggregation) global).getProperty("stats"); + ExtendedStats statsFromProperty = (ExtendedStats) global.getProperty("stats"); assertThat(statsFromProperty, notNullValue()); assertThat(statsFromProperty, sameInstance(stats)); double expectedAvgValue = (double) (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10) / 10; assertThat(stats.getAvg(), equalTo(expectedAvgValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.avg"), equalTo(expectedAvgValue)); + assertThat((double) global.getProperty("stats.avg"), equalTo(expectedAvgValue)); double expectedMinValue = 1.0; assertThat(stats.getMin(), equalTo(expectedMinValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.min"), equalTo(expectedMinValue)); + assertThat((double) global.getProperty("stats.min"), equalTo(expectedMinValue)); double expectedMaxValue = 10.0; assertThat(stats.getMax(), equalTo(expectedMaxValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.max"), equalTo(expectedMaxValue)); + assertThat((double) global.getProperty("stats.max"), equalTo(expectedMaxValue)); double expectedSumValue = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10; assertThat(stats.getSum(), equalTo(expectedSumValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.sum"), equalTo(expectedSumValue)); + assertThat((double) global.getProperty("stats.sum"), equalTo(expectedSumValue)); long expectedCountValue = 10; assertThat(stats.getCount(), equalTo(expectedCountValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.count"), equalTo((double) expectedCountValue)); + assertThat((double) global.getProperty("stats.count"), equalTo((double) expectedCountValue)); double expectedSumOfSquaresValue = (double) 1 + 4 + 9 + 16 + 25 + 36 + 49 + 64 + 81 + 100; assertThat(stats.getSumOfSquares(), equalTo(expectedSumOfSquaresValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.sum_of_squares"), equalTo(expectedSumOfSquaresValue)); + assertThat((double) global.getProperty("stats.sum_of_squares"), equalTo(expectedSumOfSquaresValue)); double expectedVarianceValue = variance(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); assertThat(stats.getVariance(), equalTo(expectedVarianceValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.variance"), equalTo(expectedVarianceValue)); + assertThat((double) global.getProperty("stats.variance"), equalTo(expectedVarianceValue)); double expectedVariancePopulationValue = variancePopulation(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); assertThat(stats.getVariancePopulation(), equalTo(expectedVariancePopulationValue)); - assertThat( - (double) ((InternalAggregation) global).getProperty("stats.variance_population"), - equalTo(expectedVariancePopulationValue) - ); + assertThat((double) global.getProperty("stats.variance_population"), equalTo(expectedVariancePopulationValue)); double expectedVarianceSamplingValue = varianceSampling(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); assertThat(stats.getVarianceSampling(), equalTo(expectedVarianceSamplingValue)); - assertThat( - (double) ((InternalAggregation) global).getProperty("stats.variance_sampling"), - equalTo(expectedVarianceSamplingValue) - ); + assertThat((double) global.getProperty("stats.variance_sampling"), equalTo(expectedVarianceSamplingValue)); double expectedStdDevValue = stdDev(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); assertThat(stats.getStdDeviation(), equalTo(expectedStdDevValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.std_deviation"), equalTo(expectedStdDevValue)); + assertThat((double) global.getProperty("stats.std_deviation"), equalTo(expectedStdDevValue)); double expectedStdDevPopulationValue = stdDevPopulation(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); assertThat(stats.getStdDeviationPopulation(), equalTo(expectedStdDevValue)); - assertThat( - (double) ((InternalAggregation) global).getProperty("stats.std_deviation_population"), - equalTo(expectedStdDevPopulationValue) - ); + assertThat((double) global.getProperty("stats.std_deviation_population"), equalTo(expectedStdDevPopulationValue)); double expectedStdDevSamplingValue = stdDevSampling(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); assertThat(stats.getStdDeviationSampling(), equalTo(expectedStdDevSamplingValue)); - assertThat( - (double) ((InternalAggregation) global).getProperty("stats.std_deviation_sampling"), - equalTo(expectedStdDevSamplingValue) - ); + assertThat((double) global.getProperty("stats.std_deviation_sampling"), equalTo(expectedStdDevSamplingValue)); } ); } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/HDRPercentileRanksIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/HDRPercentileRanksIT.java index 423aa66b88f70..841fcce19dac2 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/HDRPercentileRanksIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/HDRPercentileRanksIT.java @@ -14,7 +14,6 @@ import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.aggregations.AggregationTestScriptsPlugin; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.Terms; @@ -226,7 +225,7 @@ public void testSingleValuedFieldGetProperty() throws Exception { PercentileRanks values = global.getAggregations().get("percentile_ranks"); assertThat(values, notNullValue()); assertThat(values.getName(), equalTo("percentile_ranks")); - assertThat(((InternalAggregation) global).getProperty("percentile_ranks"), sameInstance(values)); + assertThat(global.getProperty("percentile_ranks"), sameInstance(values)); } ); } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/HDRPercentilesIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/HDRPercentilesIT.java index 93362116665a3..c7414b37e7b31 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/HDRPercentilesIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/HDRPercentilesIT.java @@ -15,7 +15,6 @@ import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.aggregations.AggregationTestScriptsPlugin; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.Terms; @@ -203,7 +202,7 @@ public void testSingleValuedFieldGetProperty() throws Exception { Percentiles percentiles = global.getAggregations().get("percentiles"); assertThat(percentiles, notNullValue()); assertThat(percentiles.getName(), equalTo("percentiles")); - assertThat(((InternalAggregation) global).getProperty("percentiles"), sameInstance(percentiles)); + assertThat(global.getProperty("percentiles"), sameInstance(percentiles)); } ); } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationIT.java index a64e2d45d915d..4c02149600ae2 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/MedianAbsoluteDeviationIT.java @@ -15,7 +15,6 @@ import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.aggregations.AggregationTestScriptsPlugin; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.range.Range; @@ -189,7 +188,7 @@ public void testSingleValuedFieldGetProperty() throws Exception { final MedianAbsoluteDeviation mad = global.getAggregations().get("mad"); assertThat(mad, notNullValue()); assertThat(mad.getName(), is("mad")); - assertThat(((InternalAggregation) global).getProperty("mad"), sameInstance(mad)); + assertThat(global.getProperty("mad"), sameInstance(mad)); } ); } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ScriptedMetricIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ScriptedMetricIT.java index 3466b9f91116f..c157e09d7fd98 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ScriptedMetricIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ScriptedMetricIT.java @@ -731,8 +731,8 @@ public void testInitMapCombineReduceGetProperty() throws Exception { assertThat(object, notNullValue()); assertThat(object, instanceOf(Number.class)); assertThat(((Number) object).longValue(), equalTo(numDocs * 3)); - assertThat(((InternalAggregation) global).getProperty("scripted"), sameInstance(scriptedMetricAggregation)); - assertThat((List) ((InternalAggregation) global).getProperty("scripted.value"), sameInstance(aggregationList)); + assertThat(global.getProperty("scripted"), sameInstance(scriptedMetricAggregation)); + assertThat((List) global.getProperty("scripted.value"), sameInstance(aggregationList)); assertThat((List) ((InternalAggregation) scriptedMetricAggregation).getProperty("value"), sameInstance(aggregationList)); } ); diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/StatsIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/StatsIT.java index b1579a1e3e429..e60bb71bd2baf 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/StatsIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/StatsIT.java @@ -15,7 +15,6 @@ import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.aggregations.AggregationTestScriptsPlugin; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.Terms; @@ -131,24 +130,24 @@ public void testSingleValuedFieldGetProperty() throws Exception { Stats stats = global.getAggregations().get("stats"); assertThat(stats, notNullValue()); assertThat(stats.getName(), equalTo("stats")); - Stats statsFromProperty = (Stats) ((InternalAggregation) global).getProperty("stats"); + Stats statsFromProperty = (Stats) global.getProperty("stats"); assertThat(statsFromProperty, notNullValue()); assertThat(statsFromProperty, sameInstance(stats)); double expectedAvgValue = (double) (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10) / 10; assertThat(stats.getAvg(), equalTo(expectedAvgValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.avg"), equalTo(expectedAvgValue)); + assertThat((double) global.getProperty("stats.avg"), equalTo(expectedAvgValue)); double expectedMinValue = 1.0; assertThat(stats.getMin(), equalTo(expectedMinValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.min"), equalTo(expectedMinValue)); + assertThat((double) global.getProperty("stats.min"), equalTo(expectedMinValue)); double expectedMaxValue = 10.0; assertThat(stats.getMax(), equalTo(expectedMaxValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.max"), equalTo(expectedMaxValue)); + assertThat((double) global.getProperty("stats.max"), equalTo(expectedMaxValue)); double expectedSumValue = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10; assertThat(stats.getSum(), equalTo(expectedSumValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.sum"), equalTo(expectedSumValue)); + assertThat((double) global.getProperty("stats.sum"), equalTo(expectedSumValue)); long expectedCountValue = 10; assertThat(stats.getCount(), equalTo(expectedCountValue)); - assertThat((double) ((InternalAggregation) global).getProperty("stats.count"), equalTo((double) expectedCountValue)); + assertThat((double) global.getProperty("stats.count"), equalTo((double) expectedCountValue)); } ); } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/SumIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/SumIT.java index c2799bbf27f07..97f6b792e71cd 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/SumIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/SumIT.java @@ -13,7 +13,6 @@ import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.Terms; @@ -146,9 +145,9 @@ public void testSingleValuedFieldGetProperty() throws Exception { assertThat(sum.getName(), equalTo("sum")); double expectedSumValue = (double) 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10; assertThat(sum.value(), equalTo(expectedSumValue)); - assertThat((Sum) ((InternalAggregation) global).getProperty("sum"), equalTo(sum)); - assertThat((double) ((InternalAggregation) global).getProperty("sum.value"), equalTo(expectedSumValue)); - assertThat((double) ((InternalAggregation) sum).getProperty("value"), equalTo(expectedSumValue)); + assertThat((Sum) global.getProperty("sum"), equalTo(sum)); + assertThat((double) global.getProperty("sum.value"), equalTo(expectedSumValue)); + assertThat((double) sum.getProperty("value"), equalTo(expectedSumValue)); } ); } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentileRanksIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentileRanksIT.java index 7581d645d12dc..e1eaa78f77c6c 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentileRanksIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentileRanksIT.java @@ -15,7 +15,6 @@ import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.aggregations.AggregationTestScriptsPlugin; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.Terms; @@ -194,7 +193,7 @@ public void testSingleValuedFieldGetProperty() throws Exception { PercentileRanks values = global.getAggregations().get("percentile_ranks"); assertThat(values, notNullValue()); assertThat(values.getName(), equalTo("percentile_ranks")); - assertThat(((InternalAggregation) global).getProperty("percentile_ranks"), sameInstance(values)); + assertThat(global.getProperty("percentile_ranks"), sameInstance(values)); } ); } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentilesIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentilesIT.java index ea0d099d7e6bc..d4903ddca0ab0 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentilesIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TDigestPercentilesIT.java @@ -15,7 +15,6 @@ import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.aggregations.AggregationTestScriptsPlugin; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.Terms; @@ -180,7 +179,7 @@ public void testSingleValuedFieldGetProperty() throws Exception { Percentiles percentiles = global.getAggregations().get("percentiles"); assertThat(percentiles, notNullValue()); assertThat(percentiles.getName(), equalTo("percentiles")); - assertThat(((InternalAggregation) global).getProperty("percentiles"), sameInstance(percentiles)); + assertThat(global.getProperty("percentiles"), sameInstance(percentiles)); } ); } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TopHitsIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TopHitsIT.java index f16aee9b78570..ae881a26def2a 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TopHitsIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/TopHitsIT.java @@ -32,7 +32,6 @@ import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.aggregations.Aggregator.SubAggCollectionMode; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.Terms; @@ -473,7 +472,7 @@ public void testBasicsGetProperty() throws Exception { TopHits topHits = global.getAggregations().get("hits"); assertThat(topHits, notNullValue()); assertThat(topHits.getName(), equalTo("hits")); - assertThat((TopHits) ((InternalAggregation) global).getProperty("hits"), sameInstance(topHits)); + assertThat((TopHits) global.getProperty("hits"), sameInstance(topHits)); } ); } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ValueCountIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ValueCountIT.java index 6d386cfae4e33..2aaf58f04ea72 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ValueCountIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/aggregations/metrics/ValueCountIT.java @@ -104,8 +104,8 @@ public void testSingleValuedFieldGetProperty() throws Exception { assertThat(valueCount, notNullValue()); assertThat(valueCount.getName(), equalTo("count")); assertThat(valueCount.getValue(), equalTo(10L)); - assertThat((ValueCount) ((InternalAggregation) global).getProperty("count"), equalTo(valueCount)); - assertThat((double) ((InternalAggregation) global).getProperty("count.value"), equalTo(10d)); + assertThat((ValueCount) global.getProperty("count"), equalTo(valueCount)); + assertThat((double) global.getProperty("count.value"), equalTo(10d)); assertThat((double) ((InternalAggregation) valueCount).getProperty("value"), equalTo(10d)); } ); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/AggregationBuilders.java b/server/src/main/java/org/elasticsearch/search/aggregations/AggregationBuilders.java index 4e083d155017b..d4a85ac0640a1 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/AggregationBuilders.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/AggregationBuilders.java @@ -11,7 +11,6 @@ import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.composite.CompositeAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.composite.CompositeValuesSourceBuilder; import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder; @@ -131,7 +130,7 @@ public static ExtendedStatsAggregationBuilder extendedStats(String name) { } /** - * Create a new {@link SingleBucketAggregation} aggregation with the given name. + * Create a new {@link FilterAggregationBuilder} aggregation with the given name. */ public static FilterAggregationBuilder filter(String name, QueryBuilder filter) { return new FilterAggregationBuilder(name, filter); @@ -152,42 +151,42 @@ public static FiltersAggregationBuilder filters(String name, QueryBuilder... fil } /** - * Create a new {@link SingleBucketAggregation} aggregation with the given name. + * Create a new {@link SamplerAggregationBuilder} aggregation with the given name. */ public static SamplerAggregationBuilder sampler(String name) { return new SamplerAggregationBuilder(name); } /** - * Create a new {@link SingleBucketAggregation} aggregation with the given name. + * Create a new {@link DiversifiedAggregationBuilder} aggregation with the given name. */ public static DiversifiedAggregationBuilder diversifiedSampler(String name) { return new DiversifiedAggregationBuilder(name); } /** - * Create a new {@link SingleBucketAggregation} aggregation with the given name. + * Create a new {@link GlobalAggregationBuilder} aggregation with the given name. */ public static GlobalAggregationBuilder global(String name) { return new GlobalAggregationBuilder(name); } /** - * Create a new {@link SingleBucketAggregation} aggregation with the given name. + * Create a new {@link MissingAggregationBuilder} aggregation with the given name. */ public static MissingAggregationBuilder missing(String name) { return new MissingAggregationBuilder(name); } /** - * Create a new {@link SingleBucketAggregation} aggregation with the given name. + * Create a new {@link NestedAggregationBuilder} aggregation with the given name. */ public static NestedAggregationBuilder nested(String name, String path) { return new NestedAggregationBuilder(name, path); } /** - * Create a new {@link SingleBucketAggregation} aggregation with the given name. + * Create a new {@link ReverseNestedAggregationBuilder} aggregation with the given name. */ public static ReverseNestedAggregationBuilder reverseNested(String name) { return new ReverseNestedAggregationBuilder(name); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/InternalSingleBucketAggregation.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/InternalSingleBucketAggregation.java deleted file mode 100644 index 82aada41409fa..0000000000000 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/InternalSingleBucketAggregation.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ -package org.elasticsearch.search.aggregations.bucket; - -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.core.Releasables; -import org.elasticsearch.search.aggregations.Aggregation; -import org.elasticsearch.search.aggregations.AggregationReduceContext; -import org.elasticsearch.search.aggregations.AggregatorReducer; -import org.elasticsearch.search.aggregations.AggregatorsReducer; -import org.elasticsearch.search.aggregations.InternalAggregation; -import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator.PipelineTree; -import org.elasticsearch.search.aggregations.support.AggregationPath; -import org.elasticsearch.search.sort.SortValue; -import org.elasticsearch.xcontent.XContentBuilder; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Consumer; -import java.util.function.Function; - -/** - * A base class for all the single bucket aggregations. - */ -public abstract class InternalSingleBucketAggregation extends InternalAggregation implements SingleBucketAggregation { - - private final long docCount; - private final InternalAggregations aggregations; - - /** - * Creates a single bucket aggregation. - * - * @param name The aggregation name. - * @param docCount The document count in the single bucket. - * @param aggregations The already built sub-aggregations that are associated with the bucket. - */ - protected InternalSingleBucketAggregation(String name, long docCount, InternalAggregations aggregations, Map metadata) { - super(name, metadata); - this.docCount = docCount; - this.aggregations = aggregations; - } - - /** - * Read from a stream. - */ - protected InternalSingleBucketAggregation(StreamInput in) throws IOException { - super(in); - docCount = in.readVLong(); - aggregations = InternalAggregations.readFrom(in); - } - - @Override - protected void doWriteTo(StreamOutput out) throws IOException { - out.writeVLong(docCount); - aggregations.writeTo(out); - } - - @Override - public long getDocCount() { - return docCount; - } - - @Override - public InternalAggregations getAggregations() { - return aggregations; - } - - /** - * Create a new copy of this {@link Aggregation} with the same settings as - * this {@link Aggregation} and contains the provided sub-aggregations. - * - * @param subAggregations - * the buckets to use in the new {@link Aggregation} - * @return the new {@link Aggregation} - */ - public InternalSingleBucketAggregation create(InternalAggregations subAggregations) { - return newAggregation(getName(), getDocCount(), subAggregations); - } - - /** - * Create a new empty sub aggregation. This must be a new instance on each call. - */ - protected abstract InternalSingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations); - - @Override - protected AggregatorReducer getLeaderReducer(AggregationReduceContext reduceContext, int size) { - return new AggregatorReducer() { - long docCount = 0L; - final AggregatorsReducer subAggregatorReducer = new AggregatorsReducer(getAggregations(), reduceContext, size); - - @Override - public void accept(InternalAggregation aggregation) { - docCount += ((InternalSingleBucketAggregation) aggregation).docCount; - subAggregatorReducer.accept(((InternalSingleBucketAggregation) aggregation).aggregations); - } - - @Override - public InternalAggregation get() { - return newAggregation(getName(), docCount, subAggregatorReducer.get()); - } - - @Override - public void close() { - Releasables.close(subAggregatorReducer); - } - }; - } - - /** - * Amulti-bucket agg needs to first reduce the buckets and *their* pipelines - * before allowing sibling pipelines to materialize. - */ - @Override - public final InternalAggregation reducePipelines( - InternalAggregation reducedAggs, - AggregationReduceContext reduceContext, - PipelineTree pipelineTree - ) { - assert reduceContext.isFinalReduce(); - InternalAggregation reduced = this; - if (pipelineTree.hasSubTrees()) { - List aggs = new ArrayList<>(); - for (InternalAggregation agg : getAggregations()) { - PipelineTree subTree = pipelineTree.subTree(agg.getName()); - aggs.add(agg.reducePipelines(agg, reduceContext, subTree)); - } - InternalAggregations reducedSubAggs = InternalAggregations.from(aggs); - reduced = create(reducedSubAggs); - } - return super.reducePipelines(reduced, reduceContext, pipelineTree); - } - - @Override - public Object getProperty(List path) { - if (path.isEmpty()) { - return this; - } else { - String aggName = path.get(0); - if (aggName.equals("_count")) { - if (path.size() > 1) { - throw new IllegalArgumentException("_count must be the last element in the path"); - } - return getDocCount(); - } - InternalAggregation aggregation = aggregations.get(aggName); - if (aggregation == null) { - throw new IllegalArgumentException("Cannot find an aggregation named [" + aggName + "] in [" + getName() + "]"); - } - return aggregation.getProperty(path.subList(1, path.size())); - } - } - - @Override - public XContentBuilder doXContentBody(XContentBuilder builder, Params params) throws IOException { - builder.field(CommonFields.DOC_COUNT.getPreferredName(), docCount); - aggregations.toXContentInternal(builder, params); - return builder; - } - - @Override - public final SortValue sortValue(String key) { - if (key != null && false == key.equals("doc_count")) { - throw new IllegalArgumentException( - "Unknown value key [" - + key - + "] for single-bucket aggregation [" - + getName() - + "]. Either use [doc_count] as key or drop the key all together." - ); - } - return SortValue.from(docCount); - } - - @Override - public final SortValue sortValue(AggregationPath.PathElement head, Iterator tail) { - return aggregations.sortValue(head, tail); - } - - @Override - protected boolean mustReduceOnSingleInternalAgg() { - return true; - } - - @Override - public InternalAggregation copyWithRewritenBuckets(Function rewriter) { - InternalAggregations rewritten = rewriter.apply(aggregations); - if (rewritten == null) { - return this; - } - return create(rewritten); - } - - @Override - public void forEachBucket(Consumer consumer) { - consumer.accept(aggregations); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null || getClass() != obj.getClass()) return false; - if (super.equals(obj) == false) return false; - - InternalSingleBucketAggregation other = (InternalSingleBucketAggregation) obj; - return Objects.equals(docCount, other.docCount) && Objects.equals(aggregations, other.aggregations); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), docCount, aggregations); - } -} diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/SingleBucketAggregation.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/SingleBucketAggregation.java index c3942e4e3ef8e..38e1ed8a38c72 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/SingleBucketAggregation.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/SingleBucketAggregation.java @@ -6,24 +6,223 @@ * your election, the "Elastic License 2.0", the "GNU Affero General Public * License v3.0 only", or the "Server Side Public License, v 1". */ - package org.elasticsearch.search.aggregations.bucket; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.core.Releasables; import org.elasticsearch.search.aggregations.Aggregation; +import org.elasticsearch.search.aggregations.AggregationReduceContext; +import org.elasticsearch.search.aggregations.AggregatorReducer; +import org.elasticsearch.search.aggregations.AggregatorsReducer; +import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.InternalAggregations; +import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator.PipelineTree; +import org.elasticsearch.search.aggregations.support.AggregationPath; +import org.elasticsearch.search.sort.SortValue; +import org.elasticsearch.xcontent.XContentBuilder; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Function; /** - * A single bucket aggregation + * A base class for all the single bucket aggregations. */ -public interface SingleBucketAggregation extends Aggregation { +public abstract class SingleBucketAggregation extends InternalAggregation { + + private final long docCount; + private final InternalAggregations aggregations; + + /** + * Creates a single bucket aggregation. + * + * @param name The aggregation name. + * @param docCount The document count in the single bucket. + * @param aggregations The already built sub-aggregations that are associated with the bucket. + */ + protected SingleBucketAggregation(String name, long docCount, InternalAggregations aggregations, Map metadata) { + super(name, metadata); + this.docCount = docCount; + this.aggregations = aggregations; + } + + /** + * Read from a stream. + */ + protected SingleBucketAggregation(StreamInput in) throws IOException { + super(in); + docCount = in.readVLong(); + aggregations = InternalAggregations.readFrom(in); + } + + @Override + protected void doWriteTo(StreamOutput out) throws IOException { + out.writeVLong(docCount); + aggregations.writeTo(out); + } /** * @return The number of documents in this bucket */ - long getDocCount(); + public final long getDocCount() { + return docCount; + } /** * @return The sub-aggregations of this bucket */ - InternalAggregations getAggregations(); + public final InternalAggregations getAggregations() { + return aggregations; + } + + /** + * Create a new copy of this {@link Aggregation} with the same settings as + * this {@link Aggregation} and contains the provided sub-aggregations. + * + * @param subAggregations + * the buckets to use in the new {@link Aggregation} + * @return the new {@link Aggregation} + */ + public SingleBucketAggregation create(InternalAggregations subAggregations) { + return newAggregation(getName(), getDocCount(), subAggregations); + } + + /** + * Create a new empty sub aggregation. This must be a new instance on each call. + */ + protected abstract SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations); + + @Override + protected AggregatorReducer getLeaderReducer(AggregationReduceContext reduceContext, int size) { + return new AggregatorReducer() { + long docCount = 0L; + final AggregatorsReducer subAggregatorReducer = new AggregatorsReducer(getAggregations(), reduceContext, size); + + @Override + public void accept(InternalAggregation aggregation) { + docCount += ((SingleBucketAggregation) aggregation).docCount; + subAggregatorReducer.accept(((SingleBucketAggregation) aggregation).aggregations); + } + + @Override + public InternalAggregation get() { + return newAggregation(getName(), docCount, subAggregatorReducer.get()); + } + + @Override + public void close() { + Releasables.close(subAggregatorReducer); + } + }; + } + + /** + * Amulti-bucket agg needs to first reduce the buckets and *their* pipelines + * before allowing sibling pipelines to materialize. + */ + @Override + public final InternalAggregation reducePipelines( + InternalAggregation reducedAggs, + AggregationReduceContext reduceContext, + PipelineTree pipelineTree + ) { + assert reduceContext.isFinalReduce(); + InternalAggregation reduced = this; + if (pipelineTree.hasSubTrees()) { + List aggs = new ArrayList<>(); + for (InternalAggregation agg : getAggregations()) { + PipelineTree subTree = pipelineTree.subTree(agg.getName()); + aggs.add(agg.reducePipelines(agg, reduceContext, subTree)); + } + InternalAggregations reducedSubAggs = InternalAggregations.from(aggs); + reduced = create(reducedSubAggs); + } + return super.reducePipelines(reduced, reduceContext, pipelineTree); + } + + @Override + public Object getProperty(List path) { + if (path.isEmpty()) { + return this; + } else { + String aggName = path.get(0); + if (aggName.equals("_count")) { + if (path.size() > 1) { + throw new IllegalArgumentException("_count must be the last element in the path"); + } + return getDocCount(); + } + InternalAggregation aggregation = aggregations.get(aggName); + if (aggregation == null) { + throw new IllegalArgumentException("Cannot find an aggregation named [" + aggName + "] in [" + getName() + "]"); + } + return aggregation.getProperty(path.subList(1, path.size())); + } + } + + @Override + public XContentBuilder doXContentBody(XContentBuilder builder, Params params) throws IOException { + builder.field(CommonFields.DOC_COUNT.getPreferredName(), docCount); + aggregations.toXContentInternal(builder, params); + return builder; + } + + @Override + public final SortValue sortValue(String key) { + if (key != null && false == key.equals("doc_count")) { + throw new IllegalArgumentException( + "Unknown value key [" + + key + + "] for single-bucket aggregation [" + + getName() + + "]. Either use [doc_count] as key or drop the key all together." + ); + } + return SortValue.from(docCount); + } + + @Override + public final SortValue sortValue(AggregationPath.PathElement head, Iterator tail) { + return aggregations.sortValue(head, tail); + } + + @Override + protected boolean mustReduceOnSingleInternalAgg() { + return true; + } + + @Override + public InternalAggregation copyWithRewritenBuckets(Function rewriter) { + InternalAggregations rewritten = rewriter.apply(aggregations); + if (rewritten == null) { + return this; + } + return create(rewritten); + } + + @Override + public void forEachBucket(Consumer consumer) { + consumer.accept(aggregations); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + if (super.equals(obj) == false) return false; + + SingleBucketAggregation other = (SingleBucketAggregation) obj; + return Objects.equals(docCount, other.docCount) && Objects.equals(aggregations, other.aggregations); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), docCount, aggregations); + } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilter.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilter.java index 493747e71ebd3..0bcdf855f4daf 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilter.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilter.java @@ -12,13 +12,13 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.support.SamplingContext; import java.io.IOException; import java.util.Map; -public class InternalFilter extends InternalSingleBucketAggregation { +public class InternalFilter extends SingleBucketAggregation { InternalFilter(String name, long docCount, InternalAggregations subAggregations, Map metadata) { super(name, docCount, subAggregations, metadata); } @@ -36,7 +36,7 @@ public String getWriteableName() { } @Override - protected InternalSingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { + protected SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { return new InternalFilter(name, docCount, subAggregations, getMetadata()); } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/global/InternalGlobal.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/global/InternalGlobal.java index b956d81bc0f9d..5371c7e46bfa2 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/global/InternalGlobal.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/global/InternalGlobal.java @@ -10,7 +10,6 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import java.io.IOException; @@ -20,7 +19,7 @@ * A global scope get (the document set on which we aggregate is all documents in the search context (ie. index + type) * regardless the query. */ -public class InternalGlobal extends InternalSingleBucketAggregation implements SingleBucketAggregation { +public class InternalGlobal extends SingleBucketAggregation { InternalGlobal(String name, long docCount, InternalAggregations aggregations, Map metadata) { super(name, docCount, aggregations, metadata); } @@ -38,7 +37,7 @@ public String getWriteableName() { } @Override - protected InternalSingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { + protected SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { return new InternalGlobal(name, docCount, subAggregations, getMetadata()); } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/missing/InternalMissing.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/missing/InternalMissing.java index 16e13a1e5999f..9236bf5433793 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/missing/InternalMissing.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/missing/InternalMissing.java @@ -10,12 +10,12 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import java.io.IOException; import java.util.Map; -public class InternalMissing extends InternalSingleBucketAggregation { +public class InternalMissing extends SingleBucketAggregation { InternalMissing(String name, long docCount, InternalAggregations aggregations, Map metadata) { super(name, docCount, aggregations, metadata); } @@ -33,7 +33,7 @@ public String getWriteableName() { } @Override - protected InternalSingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { + protected SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { return new InternalMissing(name, docCount, subAggregations, getMetadata()); } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/InternalNested.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/InternalNested.java index ae4fa5b6c1ce3..22e1df3ea8a76 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/InternalNested.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/InternalNested.java @@ -10,7 +10,6 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import java.io.IOException; @@ -19,7 +18,7 @@ /** * Result of the {@link NestedAggregator}. */ -public class InternalNested extends InternalSingleBucketAggregation implements SingleBucketAggregation { +public class InternalNested extends SingleBucketAggregation { InternalNested(String name, long docCount, InternalAggregations aggregations, Map metadata) { super(name, docCount, aggregations, metadata); } @@ -37,7 +36,7 @@ public String getWriteableName() { } @Override - protected InternalSingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { + protected SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { return new InternalNested(name, docCount, subAggregations, getMetadata()); } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/InternalReverseNested.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/InternalReverseNested.java index e190a15c4a4c0..49234350fb129 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/InternalReverseNested.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/nested/InternalReverseNested.java @@ -10,7 +10,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import java.io.IOException; import java.util.Map; @@ -18,7 +18,7 @@ /** * Result of the {@link ReverseNestedAggregator}. */ -public class InternalReverseNested extends InternalSingleBucketAggregation { +public class InternalReverseNested extends SingleBucketAggregation { public InternalReverseNested(String name, long docCount, InternalAggregations aggregations, Map metadata) { super(name, docCount, aggregations, metadata); } @@ -36,7 +36,7 @@ public String getWriteableName() { } @Override - protected InternalSingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { + protected SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { return new InternalReverseNested(name, docCount, subAggregations, getMetadata()); } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/InternalSampler.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/InternalSampler.java index ce8bd476ab65a..da12c23d18e19 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/InternalSampler.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/InternalSampler.java @@ -10,12 +10,12 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import java.io.IOException; import java.util.Map; -public class InternalSampler extends InternalSingleBucketAggregation { +public class InternalSampler extends SingleBucketAggregation { public static final String NAME = "mapped_sampler"; // InternalSampler and UnmappedSampler share the same parser name, so we use this when identifying the aggregation type public static final String PARSER_NAME = "sampler"; @@ -42,7 +42,7 @@ public String getType() { } @Override - protected InternalSingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { + protected SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { return new InternalSampler(name, docCount, subAggregations, metadata); } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/random/InternalRandomSampler.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/random/InternalRandomSampler.java index 760e66fac67d1..16423d9536fb7 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/random/InternalRandomSampler.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/sampler/random/InternalRandomSampler.java @@ -18,7 +18,7 @@ import org.elasticsearch.search.aggregations.AggregatorsReducer; import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.support.SamplingContext; import org.elasticsearch.xcontent.XContentBuilder; @@ -27,7 +27,7 @@ import java.util.List; import java.util.Map; -public class InternalRandomSampler extends InternalSingleBucketAggregation { +public class InternalRandomSampler extends SingleBucketAggregation { public static final String NAME = "mapped_random_sampler"; public static final String PARSER_NAME = "random_sampler"; @@ -85,7 +85,7 @@ public String getType() { } @Override - protected InternalSingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { + protected SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { return new InternalRandomSampler(name, docCount, seed, shardSeed, probability, subAggregations, metadata); } @@ -97,8 +97,8 @@ protected AggregatorReducer getLeaderReducer(AggregationReduceContext reduceCont @Override public void accept(InternalAggregation aggregation) { - docCount += ((InternalSingleBucketAggregation) aggregation).getDocCount(); - subAggregatorReducer.accept(((InternalSingleBucketAggregation) aggregation).getAggregations()); + docCount += ((SingleBucketAggregation) aggregation).getDocCount(); + subAggregatorReducer.accept(((SingleBucketAggregation) aggregation).getAggregations()); } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/BucketMetricsPipelineAggregator.java b/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/BucketMetricsPipelineAggregator.java index ca3a5d9a6f708..57a81058da709 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/BucketMetricsPipelineAggregator.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/BucketMetricsPipelineAggregator.java @@ -16,7 +16,7 @@ import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.InternalAggregations; import org.elasticsearch.search.aggregations.InternalMultiBucketAggregation; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.pipeline.BucketHelpers.GapPolicy; import org.elasticsearch.search.aggregations.support.AggregationPath; @@ -65,7 +65,7 @@ public final InternalAggregation doReduce(InternalAggregations aggregations, Agg + "] but was missing in search response" ); } - if (currentAgg instanceof InternalSingleBucketAggregation singleBucketAggregation) { + if (currentAgg instanceof SingleBucketAggregation singleBucketAggregation) { currentAgg = singleBucketAggregation.getAggregations().get(parsedPath.get(++currElement).name()); } else if (pathElementContainsBucketKey(parsedPath.get(currElement))) { if (currentAgg instanceof InternalMultiBucketAggregation multiBucketAggregation) { diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/AggregationsTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/AggregationsTests.java index be42a9a652495..b53541f19289b 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/AggregationsTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/AggregationsTests.java @@ -156,7 +156,7 @@ private static InternalAggregations createTestInstance(final int minNumAggs, fin } else { multiBucketAggTestCase.setSubAggregationsSupplier(() -> InternalAggregations.EMPTY); } - } else if (testCase instanceof InternalSingleBucketAggregationTestCase singleBucketAggTestCase) { + } else if (testCase instanceof SingleBucketAggregationTestCase singleBucketAggTestCase) { if (currentDepth < maxDepth) { singleBucketAggTestCase.subAggregationsSupplier = () -> createTestInstance(0, currentDepth + 1, maxDepth); } else { diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/composite/CompositeAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/composite/CompositeAggregatorTests.java index 28a032e7281e6..839e7c21aeac1 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/composite/CompositeAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/composite/CompositeAggregatorTests.java @@ -68,7 +68,7 @@ import org.elasticsearch.search.aggregations.AggregatorTestCase; import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.InternalMultiBucketAggregation; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.geogrid.GeoTileGridAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.geogrid.GeoTileUtils; @@ -808,7 +808,7 @@ public void testSubAggregationOfNested() throws Exception { sequenceIDFields.addFields(root); documents.add(root); iw.addDocuments(documents); - }, (InternalSingleBucketAggregation parent) -> { + }, (SingleBucketAggregation parent) -> { assertEquals(1, parent.getAggregations().asList().size()); InternalComposite result = (InternalComposite) parent.getProperty("compositeAggName"); assertEquals(3, result.getBuckets().size()); @@ -867,7 +867,7 @@ public void testSubAggregationOfNestedAggregateAfter() throws Exception { sequenceIDFields.addFields(root); documents.add(root); iw.addDocuments(documents); - }, (InternalSingleBucketAggregation parent) -> { + }, (SingleBucketAggregation parent) -> { assertEquals(1, parent.getAggregations().asList().size()); InternalComposite result = (InternalComposite) parent.getProperty("compositeAggName"); assertEquals(1, result.getBuckets().size()); diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilterTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilterTests.java index 178618d1cbc03..5700e725d1c80 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilterTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilterTests.java @@ -12,7 +12,7 @@ import org.elasticsearch.search.aggregations.AggregationReduceContext; import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.InternalSingleBucketAggregationTestCase; +import org.elasticsearch.search.aggregations.SingleBucketAggregationTestCase; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator.PipelineTree; import org.elasticsearch.search.aggregations.support.SamplingContext; @@ -25,7 +25,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.sameInstance; -public class InternalFilterTests extends InternalSingleBucketAggregationTestCase { +public class InternalFilterTests extends SingleBucketAggregationTestCase { @Override protected InternalFilter createTestInstance( String name, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/global/InternalGlobalTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/global/InternalGlobalTests.java index 2fbb31f9c7d99..6133708223128 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/global/InternalGlobalTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/global/InternalGlobalTests.java @@ -10,12 +10,12 @@ package org.elasticsearch.search.aggregations.bucket.global; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.InternalSingleBucketAggregationTestCase; +import org.elasticsearch.search.aggregations.SingleBucketAggregationTestCase; import java.util.List; import java.util.Map; -public class InternalGlobalTests extends InternalSingleBucketAggregationTestCase { +public class InternalGlobalTests extends SingleBucketAggregationTestCase { @Override protected InternalGlobal createTestInstance( String name, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/missing/InternalMissingTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/missing/InternalMissingTests.java index c4dc8d43ef426..1bc295c3ec174 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/missing/InternalMissingTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/missing/InternalMissingTests.java @@ -10,12 +10,12 @@ package org.elasticsearch.search.aggregations.bucket.missing; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.InternalSingleBucketAggregationTestCase; +import org.elasticsearch.search.aggregations.SingleBucketAggregationTestCase; import java.util.List; import java.util.Map; -public class InternalMissingTests extends InternalSingleBucketAggregationTestCase { +public class InternalMissingTests extends SingleBucketAggregationTestCase { @Override protected InternalMissing createTestInstance( String name, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/InternalNestedTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/InternalNestedTests.java index 315dc9fb51105..ca21ac33e3576 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/InternalNestedTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/InternalNestedTests.java @@ -10,12 +10,12 @@ package org.elasticsearch.search.aggregations.bucket.nested; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.InternalSingleBucketAggregationTestCase; +import org.elasticsearch.search.aggregations.SingleBucketAggregationTestCase; import java.util.List; import java.util.Map; -public class InternalNestedTests extends InternalSingleBucketAggregationTestCase { +public class InternalNestedTests extends SingleBucketAggregationTestCase { @Override protected InternalNested createTestInstance( String name, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/InternalReverseNestedTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/InternalReverseNestedTests.java index 4e8203fb0306d..c078c4d546ff3 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/InternalReverseNestedTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/InternalReverseNestedTests.java @@ -10,12 +10,12 @@ package org.elasticsearch.search.aggregations.bucket.nested; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.InternalSingleBucketAggregationTestCase; +import org.elasticsearch.search.aggregations.SingleBucketAggregationTestCase; import java.util.List; import java.util.Map; -public class InternalReverseNestedTests extends InternalSingleBucketAggregationTestCase { +public class InternalReverseNestedTests extends SingleBucketAggregationTestCase { @Override protected InternalReverseNested createTestInstance( String name, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/NestedAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/NestedAggregatorTests.java index bac0ed0c242ae..d94fee763980c 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/NestedAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/NestedAggregatorTests.java @@ -55,7 +55,6 @@ import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.AggregatorTestCase; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.terms.InternalTerms; @@ -298,7 +297,7 @@ public void testOrphanedDocs() throws IOException { assertEquals(NESTED_AGG, nested.getName()); assertEquals(expectedNestedDocs, nested.getDocCount()); - Sum sum = (Sum) ((InternalAggregation) nested).getProperty(SUM_AGG_NAME); + Sum sum = (Sum) nested.getProperty(SUM_AGG_NAME); assertEquals(SUM_AGG_NAME, sum.getName()); assertEquals(expectedSum, sum.value(), Double.MIN_VALUE); } @@ -767,8 +766,8 @@ public void testNestedWithPipeline() throws IOException { assertNotNull(terms); for (LongTerms.Bucket bucket : terms.getBuckets()) { - Max max = (Max) bucket.getAggregations().get(MAX_AGG_NAME); - InternalSimpleValue bucketScript = (InternalSimpleValue) bucket.getAggregations().get("bucketscript"); + Max max = bucket.getAggregations().get(MAX_AGG_NAME); + InternalSimpleValue bucketScript = bucket.getAggregations().get("bucketscript"); assertNotNull(max); assertNotNull(bucketScript); assertEquals(max.value(), -bucketScript.getValue(), Double.MIN_VALUE); diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/sampler/InternalSamplerTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/sampler/InternalSamplerTests.java index 407dd8781e8a8..7f0306b3e85a5 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/sampler/InternalSamplerTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/sampler/InternalSamplerTests.java @@ -9,12 +9,12 @@ package org.elasticsearch.search.aggregations.bucket.sampler; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.InternalSingleBucketAggregationTestCase; +import org.elasticsearch.search.aggregations.SingleBucketAggregationTestCase; import java.util.List; import java.util.Map; -public class InternalSamplerTests extends InternalSingleBucketAggregationTestCase { +public class InternalSamplerTests extends SingleBucketAggregationTestCase { @Override protected InternalSampler createTestInstance( String name, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityAggregatorTests.java index 8169a5301f00f..784918a742540 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityAggregatorTests.java @@ -116,7 +116,7 @@ protected ScriptService getMockScriptService() { scripts.put(NUMERIC_VALUES_SCRIPT, vars -> { final Map doc = (Map) vars.get("doc"); - return (ScriptDocValues) doc.get("numbers"); + return doc.get("numbers"); }); MockScriptEngine scriptEngine = new MockScriptEngine( @@ -775,8 +775,8 @@ public void testSingleValuedFieldGlobalAggregation() throws IOException { assertNotNull(cardinality); assertEquals("cardinality", cardinality.getName()); assertEquals(numDocs, cardinality.getValue(), 0); - assertEquals(cardinality, ((InternalAggregation) global).getProperty("cardinality")); - assertEquals(numDocs, (double) ((InternalAggregation) global).getProperty("cardinality.value"), 0); + assertEquals(cardinality, global.getProperty("cardinality")); + assertEquals(numDocs, (double) global.getProperty("cardinality.value"), 0); assertEquals(numDocs, (double) ((InternalAggregation) cardinality).getProperty("value"), 0); }, new AggTestConfig(aggregationBuilder, fieldType)); } diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorTests.java index 21839e003f410..380557fcd941c 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/MaxAggregatorTests.java @@ -49,7 +49,6 @@ import org.elasticsearch.search.aggregations.AggregatorTestCase; import org.elasticsearch.search.aggregations.BucketCollector; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.MultiBucketCollector; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.terms.Terms; @@ -446,9 +445,9 @@ public void testSingleValuedFieldGetProperty() throws IOException { assertNotNull(max); assertEquals("max", max.getName()); assertEquals(10.0, max.value(), 0); - assertEquals(max, ((InternalAggregation) global).getProperty("max")); - assertEquals(10.0, (double) ((InternalAggregation) global).getProperty("max.value"), 0); - assertEquals(10.0, (double) ((InternalAggregation) max).getProperty("value"), 0); + assertEquals(max, global.getProperty("max")); + assertEquals(10.0, (double) global.getProperty("max.value"), 0); + assertEquals(10.0, (double) max.getProperty("value"), 0); indexReader.close(); directory.close(); diff --git a/test/framework/src/main/java/org/elasticsearch/search/aggregations/InternalSingleBucketAggregationTestCase.java b/test/framework/src/main/java/org/elasticsearch/search/aggregations/SingleBucketAggregationTestCase.java similarity index 92% rename from test/framework/src/main/java/org/elasticsearch/search/aggregations/InternalSingleBucketAggregationTestCase.java rename to test/framework/src/main/java/org/elasticsearch/search/aggregations/SingleBucketAggregationTestCase.java index f0533f6a7c8e5..249728ba29f05 100644 --- a/test/framework/src/main/java/org/elasticsearch/search/aggregations/InternalSingleBucketAggregationTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/search/aggregations/SingleBucketAggregationTestCase.java @@ -10,7 +10,7 @@ package org.elasticsearch.search.aggregations; import org.elasticsearch.common.util.Maps; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.metrics.Max; import org.elasticsearch.search.aggregations.metrics.Min; import org.elasticsearch.test.InternalAggregationTestCase; @@ -23,8 +23,7 @@ import static java.util.Collections.emptyMap; -public abstract class InternalSingleBucketAggregationTestCase extends - InternalAggregationTestCase { +public abstract class SingleBucketAggregationTestCase extends InternalAggregationTestCase { private boolean hasInternalMax; private boolean hasInternalMin; @@ -88,7 +87,7 @@ protected T mutateInstance(T instance) { @Override protected final void assertReduced(T reduced, List inputs) { - assertEquals(inputs.stream().mapToLong(InternalSingleBucketAggregation::getDocCount).sum(), reduced.getDocCount()); + assertEquals(inputs.stream().mapToLong(SingleBucketAggregation::getDocCount).sum(), reduced.getDocCount()); if (hasInternalMax) { double expected = inputs.stream().mapToDouble(i -> { Max max = i.getAggregations().get("max"); diff --git a/test/framework/src/main/java/org/elasticsearch/search/aggregations/metrics/CentroidAggregationTestBase.java b/test/framework/src/main/java/org/elasticsearch/search/aggregations/metrics/CentroidAggregationTestBase.java index 2fd66dc6d5611..add70ed3706aa 100644 --- a/test/framework/src/main/java/org/elasticsearch/search/aggregations/metrics/CentroidAggregationTestBase.java +++ b/test/framework/src/main/java/org/elasticsearch/search/aggregations/metrics/CentroidAggregationTestBase.java @@ -11,7 +11,6 @@ import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.geo.SpatialPoint; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.support.ValuesSourceAggregationBuilder; import org.elasticsearch.test.ESIntegTestCase; @@ -106,16 +105,15 @@ public void testSingleValueFieldGetProperty() { assertThat(global.getAggregations().asList().size(), equalTo(1)); CentroidAggregation geoCentroid = global.getAggregations().get(aggName()); - InternalAggregation agg = (InternalAggregation) global; assertThat(geoCentroid, notNullValue()); assertThat(geoCentroid.getName(), equalTo(aggName())); - assertThat((CentroidAggregation) agg.getProperty(aggName()), sameInstance(geoCentroid)); + assertThat((CentroidAggregation) global.getProperty(aggName()), sameInstance(geoCentroid)); assertSameCentroid(geoCentroid.centroid(), singleCentroid); - assertSimilarValue(((SpatialPoint) agg.getProperty(aggName() + ".value")).getY(), singleCentroid.getY()); - assertSimilarValue(((SpatialPoint) agg.getProperty(aggName() + ".value")).getX(), singleCentroid.getX()); - assertSimilarValue((double) agg.getProperty(aggName() + "." + coordinateName("y")), singleCentroid.getY()); - assertSimilarValue((double) agg.getProperty(aggName() + "." + coordinateName("x")), singleCentroid.getX()); - assertEquals(numDocs, (long) ((InternalAggregation) global).getProperty(aggName() + ".count")); + assertSimilarValue(((SpatialPoint) global.getProperty(aggName() + ".value")).getY(), singleCentroid.getY()); + assertSimilarValue(((SpatialPoint) global.getProperty(aggName() + ".value")).getX(), singleCentroid.getX()); + assertSimilarValue((double) global.getProperty(aggName() + "." + coordinateName("y")), singleCentroid.getY()); + assertSimilarValue((double) global.getProperty(aggName() + "." + coordinateName("x")), singleCentroid.getX()); + assertEquals(numDocs, (long) global.getProperty(aggName() + ".count")); } ); } diff --git a/test/framework/src/main/java/org/elasticsearch/search/aggregations/metrics/SpatialBoundsAggregationTestBase.java b/test/framework/src/main/java/org/elasticsearch/search/aggregations/metrics/SpatialBoundsAggregationTestBase.java index c08643473ccd0..41565d72eb474 100644 --- a/test/framework/src/main/java/org/elasticsearch/search/aggregations/metrics/SpatialBoundsAggregationTestBase.java +++ b/test/framework/src/main/java/org/elasticsearch/search/aggregations/metrics/SpatialBoundsAggregationTestBase.java @@ -11,7 +11,6 @@ import org.elasticsearch.common.geo.SpatialPoint; import org.elasticsearch.common.util.BigArray; -import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket; @@ -73,29 +72,17 @@ public void testSingleValuedField_getProperty() { SpatialBounds geobounds = global.getAggregations().get(aggName()); assertThat(geobounds, notNullValue()); assertThat(geobounds.getName(), equalTo(aggName())); - assertThat((SpatialBounds) ((InternalAggregation) global).getProperty(aggName()), sameInstance(geobounds)); + assertThat((SpatialBounds) global.getProperty(aggName()), sameInstance(geobounds)); T topLeft = geobounds.topLeft(); T bottomRight = geobounds.bottomRight(); assertThat(topLeft.getY(), closeTo(singleTopLeft.getY(), GEOHASH_TOLERANCE)); assertThat(topLeft.getX(), closeTo(singleTopLeft.getX(), GEOHASH_TOLERANCE)); assertThat(bottomRight.getY(), closeTo(singleBottomRight.getY(), GEOHASH_TOLERANCE)); assertThat(bottomRight.getX(), closeTo(singleBottomRight.getX(), GEOHASH_TOLERANCE)); - assertThat( - (double) ((InternalAggregation) global).getProperty(aggName() + ".top"), - closeTo(singleTopLeft.getY(), GEOHASH_TOLERANCE) - ); - assertThat( - (double) ((InternalAggregation) global).getProperty(aggName() + ".left"), - closeTo(singleTopLeft.getX(), GEOHASH_TOLERANCE) - ); - assertThat( - (double) ((InternalAggregation) global).getProperty(aggName() + ".bottom"), - closeTo(singleBottomRight.getY(), GEOHASH_TOLERANCE) - ); - assertThat( - (double) ((InternalAggregation) global).getProperty(aggName() + ".right"), - closeTo(singleBottomRight.getX(), GEOHASH_TOLERANCE) - ); + assertThat((double) global.getProperty(aggName() + ".top"), closeTo(singleTopLeft.getY(), GEOHASH_TOLERANCE)); + assertThat((double) global.getProperty(aggName() + ".left"), closeTo(singleTopLeft.getX(), GEOHASH_TOLERANCE)); + assertThat((double) global.getProperty(aggName() + ".bottom"), closeTo(singleBottomRight.getY(), GEOHASH_TOLERANCE)); + assertThat((double) global.getProperty(aggName() + ".right"), closeTo(singleBottomRight.getX(), GEOHASH_TOLERANCE)); } ); diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/aggregation/AggregationTestUtils.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/aggregation/AggregationTestUtils.java index 1604c47ac4754..d059eea40bf39 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/aggregation/AggregationTestUtils.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/aggregation/AggregationTestUtils.java @@ -11,7 +11,7 @@ import org.elasticsearch.search.DocValueFormat; import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.InternalAggregations; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.composite.InternalComposite; import org.elasticsearch.search.aggregations.bucket.histogram.InternalHistogram; import org.elasticsearch.search.aggregations.bucket.terms.StringTerms; @@ -59,8 +59,8 @@ static InternalComposite.InternalBucket createCompositeBucket( return bucket; } - static InternalSingleBucketAggregation createSingleBucketAgg(String name, long docCount, List subAggregations) { - InternalSingleBucketAggregation singleBucketAggregation = mock(InternalSingleBucketAggregation.class); + static SingleBucketAggregation createSingleBucketAgg(String name, long docCount, List subAggregations) { + SingleBucketAggregation singleBucketAggregation = mock(SingleBucketAggregation.class); when(singleBucketAggregation.getName()).thenReturn(name); when(singleBucketAggregation.getDocCount()).thenReturn(docCount); when(singleBucketAggregation.getAggregations()).thenReturn(createAggs(subAggregations)); diff --git a/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/pivot/AggregationResultUtilsTests.java b/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/pivot/AggregationResultUtilsTests.java index 7359071996cc8..c06030a4def2a 100644 --- a/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/pivot/AggregationResultUtilsTests.java +++ b/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/pivot/AggregationResultUtilsTests.java @@ -21,7 +21,7 @@ import org.elasticsearch.search.aggregations.InternalAggregations; import org.elasticsearch.search.aggregations.PipelineAggregationBuilder; import org.elasticsearch.search.aggregations.PipelineAggregatorBuilders; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; import org.elasticsearch.search.aggregations.bucket.composite.InternalComposite; import org.elasticsearch.search.aggregations.bucket.range.InternalRange; import org.elasticsearch.search.aggregations.bucket.range.Range; @@ -1003,12 +1003,8 @@ public void describeTo(Description description) { }; } - public static InternalSingleBucketAggregation createSingleBucketAgg( - String name, - long docCount, - InternalAggregation... subAggregations - ) { - InternalSingleBucketAggregation agg = mock(InternalSingleBucketAggregation.class); + public static SingleBucketAggregation createSingleBucketAgg(String name, long docCount, InternalAggregation... subAggregations) { + SingleBucketAggregation agg = mock(SingleBucketAggregation.class); when(agg.getDocCount()).thenReturn(docCount); when(agg.getName()).thenReturn(name); if (subAggregations != null) { From 034980318dd44b9e50c40d471f88afb534b96084 Mon Sep 17 00:00:00 2001 From: Armin Date: Sat, 19 Apr 2025 19:26:35 +0200 Subject: [PATCH 2/4] fix tests --- .../bucket/SingleBucketAggregation.java | 13 ++++++++++--- .../aggregations/bucket/filter/InternalFilter.java | 2 +- .../ml/dataframe/evaluation/MockAggregations.java | 6 ++---- .../extractor/aggregation/AggregationTestUtils.java | 6 +----- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/SingleBucketAggregation.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/SingleBucketAggregation.java index 38e1ed8a38c72..0d7f2a5b300d8 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/SingleBucketAggregation.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/SingleBucketAggregation.java @@ -34,7 +34,7 @@ /** * A base class for all the single bucket aggregations. */ -public abstract class SingleBucketAggregation extends InternalAggregation { +public class SingleBucketAggregation extends InternalAggregation { private final long docCount; private final InternalAggregations aggregations; @@ -46,7 +46,7 @@ public abstract class SingleBucketAggregation extends InternalAggregation { * @param docCount The document count in the single bucket. * @param aggregations The already built sub-aggregations that are associated with the bucket. */ - protected SingleBucketAggregation(String name, long docCount, InternalAggregations aggregations, Map metadata) { + public SingleBucketAggregation(String name, long docCount, InternalAggregations aggregations, Map metadata) { super(name, metadata); this.docCount = docCount; this.aggregations = aggregations; @@ -96,7 +96,9 @@ public SingleBucketAggregation create(InternalAggregations subAggregations) { /** * Create a new empty sub aggregation. This must be a new instance on each call. */ - protected abstract SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations); + protected SingleBucketAggregation newAggregation(String name, long docCount, InternalAggregations subAggregations) { + return new SingleBucketAggregation(name, docCount, subAggregations, metadata); + } @Override protected AggregatorReducer getLeaderReducer(AggregationReduceContext reduceContext, int size) { @@ -225,4 +227,9 @@ public boolean equals(Object obj) { public int hashCode() { return Objects.hash(super.hashCode(), docCount, aggregations); } + + @Override + public String getWriteableName() { + return "SingleBucketAggregation"; + } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilter.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilter.java index 0bcdf855f4daf..8fe80fa476462 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilter.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/filter/InternalFilter.java @@ -19,7 +19,7 @@ import java.util.Map; public class InternalFilter extends SingleBucketAggregation { - InternalFilter(String name, long docCount, InternalAggregations subAggregations, Map metadata) { + public InternalFilter(String name, long docCount, InternalAggregations subAggregations, Map metadata) { super(name, docCount, subAggregations, metadata); } diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/dataframe/evaluation/MockAggregations.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/dataframe/evaluation/MockAggregations.java index 368823d0f64af..422530b69ecfc 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/dataframe/evaluation/MockAggregations.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/dataframe/evaluation/MockAggregations.java @@ -17,6 +17,7 @@ import java.util.Collections; import java.util.List; +import java.util.Map; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -68,10 +69,7 @@ public static InternalFilters.InternalBucket mockFiltersBucket(String key, long } public static InternalFilter mockFilter(String name, long docCount) { - InternalFilter agg = mock(InternalFilter.class); - when(agg.getName()).thenReturn(name); - when(agg.getDocCount()).thenReturn(docCount); - return agg; + return new InternalFilter(name, docCount, InternalAggregations.EMPTY, Map.of()); } public static InternalNumericMetricsAggregation.SingleValue mockSingleValue(String name, double value) { diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/aggregation/AggregationTestUtils.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/aggregation/AggregationTestUtils.java index d059eea40bf39..f8cd411260108 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/aggregation/AggregationTestUtils.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/aggregation/AggregationTestUtils.java @@ -60,11 +60,7 @@ static InternalComposite.InternalBucket createCompositeBucket( } static SingleBucketAggregation createSingleBucketAgg(String name, long docCount, List subAggregations) { - SingleBucketAggregation singleBucketAggregation = mock(SingleBucketAggregation.class); - when(singleBucketAggregation.getName()).thenReturn(name); - when(singleBucketAggregation.getDocCount()).thenReturn(docCount); - when(singleBucketAggregation.getAggregations()).thenReturn(createAggs(subAggregations)); - return singleBucketAggregation; + return new SingleBucketAggregation(name, docCount, createAggs(subAggregations), Map.of()); } static InternalHistogram.Bucket createHistogramBucket(long timestamp, long docCount) { From b6bbb1b5cc97ea8e22aa97acd8351005387bcc20 Mon Sep 17 00:00:00 2001 From: Armin Date: Sat, 19 Apr 2025 22:03:56 +0200 Subject: [PATCH 3/4] fix more tests --- .../RollupResponseTranslationTests.java | 79 ++++--------------- .../rollup/action/SearchActionTests.java | 10 +-- 2 files changed, 16 insertions(+), 73 deletions(-) diff --git a/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/RollupResponseTranslationTests.java b/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/RollupResponseTranslationTests.java index 88abbd9d89244..cbb970cde746a 100644 --- a/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/RollupResponseTranslationTests.java +++ b/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/RollupResponseTranslationTests.java @@ -162,29 +162,14 @@ public void testMissingLiveIndex() throws Exception { SearchResponse responseWithout = mock(SearchResponse.class); when(responseWithout.getTook()).thenReturn(new TimeValue(100)); List aggTree = new ArrayList<>(1); - InternalFilter filter = mock(InternalFilter.class); List subaggs = new ArrayList<>(2); Map metadata = Maps.newMapWithExpectedSize(1); metadata.put(RollupField.ROLLUP_META + "." + RollupField.COUNT_FIELD, "foo." + RollupField.COUNT_FIELD); - Sum sum = mock(Sum.class); - when(sum.value()).thenReturn(10.0); - when(sum.value()).thenReturn(10.0); - when(sum.getName()).thenReturn("foo"); - when(sum.getMetadata()).thenReturn(metadata); - when(sum.getType()).thenReturn(SumAggregationBuilder.NAME); - subaggs.add(sum); - - Sum count = mock(Sum.class); - when(count.value()).thenReturn(2.0); - when(count.value()).thenReturn(2.0); - when(count.getName()).thenReturn("foo." + RollupField.COUNT_FIELD); - when(count.getMetadata()).thenReturn(null); - when(count.getType()).thenReturn(SumAggregationBuilder.NAME); - subaggs.add(count); - - when(filter.getAggregations()).thenReturn(InternalAggregations.from(subaggs)); - when(filter.getName()).thenReturn("filter_foo"); + subaggs.add(new Sum("foo", 10.0, DocValueFormat.RAW, metadata)); + subaggs.add(new Sum("foo." + RollupField.COUNT_FIELD, 2.0, DocValueFormat.RAW, null)); + + InternalFilter filter = new InternalFilter("filter_foo", 0, InternalAggregations.from(subaggs), metadata); aggTree.add(filter); InternalAggregations mockAggsWithout = InternalAggregations.from(aggTree); @@ -285,33 +270,15 @@ public void testVerifyMissingNormal() { public void testTranslateRollup() throws Exception { SearchResponse response = mock(SearchResponse.class); when(response.getTook()).thenReturn(new TimeValue(100)); - List aggTree = new ArrayList<>(1); - InternalFilter filter = mock(InternalFilter.class); List subaggs = new ArrayList<>(2); Map metadata = Maps.newMapWithExpectedSize(1); metadata.put(RollupField.ROLLUP_META + "." + RollupField.COUNT_FIELD, "foo." + RollupField.COUNT_FIELD); - Sum sum = mock(Sum.class); - when(sum.value()).thenReturn(10.0); - when(sum.value()).thenReturn(10.0); - when(sum.getName()).thenReturn("foo"); - when(sum.getMetadata()).thenReturn(metadata); - when(sum.getType()).thenReturn(SumAggregationBuilder.NAME); - subaggs.add(sum); - - Sum count = mock(Sum.class); - when(count.value()).thenReturn(2.0); - when(count.value()).thenReturn(2.0); - when(count.getName()).thenReturn("foo." + RollupField.COUNT_FIELD); - when(count.getMetadata()).thenReturn(null); - when(count.getType()).thenReturn(SumAggregationBuilder.NAME); - subaggs.add(count); - - when(filter.getAggregations()).thenReturn(InternalAggregations.from(subaggs)); - when(filter.getName()).thenReturn("filter_foo"); - aggTree.add(filter); - - InternalAggregations mockAggs = InternalAggregations.from(aggTree); + subaggs.add(new Sum("foo", 10.0, DocValueFormat.RAW, metadata)); + subaggs.add(new Sum("foo." + RollupField.COUNT_FIELD, 2.0, DocValueFormat.RAW, null)); + InternalAggregations mockAggs = InternalAggregations.from( + new InternalFilter("filter_foo", 0, InternalAggregations.from(subaggs), null) + ); when(response.getAggregations()).thenReturn(mockAggs); MultiSearchResponse multiSearchResponse = new MultiSearchResponse( new MultiSearchResponse.Item[] { new MultiSearchResponse.Item(response, null) }, @@ -434,33 +401,15 @@ public void testSimpleReduction() throws Exception { SearchResponse responseWithout = mock(SearchResponse.class); when(responseWithout.getTook()).thenReturn(new TimeValue(100)); - List aggTree = new ArrayList<>(1); - InternalFilter filter = mock(InternalFilter.class); List subaggs = new ArrayList<>(2); Map metadata = Maps.newMapWithExpectedSize(1); metadata.put(RollupField.ROLLUP_META + "." + RollupField.COUNT_FIELD, "foo." + RollupField.COUNT_FIELD); - Sum sum = mock(Sum.class); - when(sum.value()).thenReturn(10.0); - when(sum.value()).thenReturn(10.0); - when(sum.getName()).thenReturn("foo"); - when(sum.getMetadata()).thenReturn(metadata); - when(sum.getType()).thenReturn(SumAggregationBuilder.NAME); - subaggs.add(sum); - - Sum count = mock(Sum.class); - when(count.value()).thenReturn(2.0); - when(count.value()).thenReturn(2.0); - when(count.getName()).thenReturn("foo." + RollupField.COUNT_FIELD); - when(count.getMetadata()).thenReturn(null); - when(count.getType()).thenReturn(SumAggregationBuilder.NAME); - subaggs.add(count); - - when(filter.getAggregations()).thenReturn(InternalAggregations.from(subaggs)); - when(filter.getName()).thenReturn("filter_foo"); - aggTree.add(filter); - - InternalAggregations mockAggsWithout = InternalAggregations.from(aggTree); + subaggs.add(new Sum("foo", 10.0, DocValueFormat.RAW, metadata)); + subaggs.add(new Sum("foo." + RollupField.COUNT_FIELD, 2.0, DocValueFormat.RAW, null)); + InternalAggregations mockAggsWithout = InternalAggregations.from( + new InternalFilter("filter_foo", 0, InternalAggregations.from(subaggs), Map.of()) + ); when(responseWithout.getAggregations()).thenReturn(mockAggsWithout); MultiSearchResponse.Item rolledResponse = new MultiSearchResponse.Item(responseWithout, null); diff --git a/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/action/SearchActionTests.java b/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/action/SearchActionTests.java index 10d5dca08e609..5ac431079f038 100644 --- a/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/action/SearchActionTests.java +++ b/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/action/SearchActionTests.java @@ -713,7 +713,6 @@ public void testRollupOnly() throws Exception { SearchResponse response = mock(SearchResponse.class); when(response.getTook()).thenReturn(new TimeValue(100)); List aggTree = new ArrayList<>(1); - InternalFilter filter = mock(InternalFilter.class); List subaggs = new ArrayList<>(2); Map metadata = Maps.newMapWithExpectedSize(1); @@ -732,9 +731,7 @@ public void testRollupOnly() throws Exception { when(count.getType()).thenReturn(SumAggregationBuilder.NAME); subaggs.add(count); - when(filter.getAggregations()).thenReturn(InternalAggregations.from(subaggs)); - when(filter.getName()).thenReturn("filter_foo"); - aggTree.add(filter); + aggTree.add(new InternalFilter("filter_foo", 0, InternalAggregations.from(subaggs), null)); InternalAggregations mockAggs = InternalAggregations.from(aggTree); when(response.getAggregations()).thenReturn(mockAggs); @@ -852,7 +849,6 @@ public void testBoth() throws Exception { SearchResponse responseWithout = mock(SearchResponse.class); when(responseWithout.getTook()).thenReturn(new TimeValue(100)); List aggTree = new ArrayList<>(1); - InternalFilter filter = mock(InternalFilter.class); List subaggs = new ArrayList<>(2); Map metadata = Maps.newMapWithExpectedSize(1); @@ -871,9 +867,7 @@ public void testBoth() throws Exception { when(count.getType()).thenReturn(SumAggregationBuilder.NAME); subaggs.add(count); - when(filter.getAggregations()).thenReturn(InternalAggregations.from(subaggs)); - when(filter.getName()).thenReturn("filter_foo"); - aggTree.add(filter); + aggTree.add(new InternalFilter("filter_foo", 0, InternalAggregations.from(subaggs), null)); InternalAggregations mockAggsWithout = InternalAggregations.from(aggTree); when(responseWithout.getAggregations()).thenReturn(mockAggsWithout); From 2d54515c8ad257af6cd6249e28c27f8a396a3eea Mon Sep 17 00:00:00 2001 From: Armin Date: Sun, 20 Apr 2025 01:30:53 +0200 Subject: [PATCH 4/4] fix more tests --- .../pivot/AggregationResultUtilsTests.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/pivot/AggregationResultUtilsTests.java b/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/pivot/AggregationResultUtilsTests.java index c06030a4def2a..2ead764e228c0 100644 --- a/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/pivot/AggregationResultUtilsTests.java +++ b/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/pivot/AggregationResultUtilsTests.java @@ -1004,16 +1004,12 @@ public void describeTo(Description description) { } public static SingleBucketAggregation createSingleBucketAgg(String name, long docCount, InternalAggregation... subAggregations) { - SingleBucketAggregation agg = mock(SingleBucketAggregation.class); - when(agg.getDocCount()).thenReturn(docCount); - when(agg.getName()).thenReturn(name); - if (subAggregations != null) { - InternalAggregations subAggs = InternalAggregations.from(List.of(subAggregations)); - when(agg.getAggregations()).thenReturn(subAggs); - } else { - when(agg.getAggregations()).thenReturn(null); - } - return agg; + return new SingleBucketAggregation( + name, + docCount, + subAggregations == null ? null : InternalAggregations.from(List.of(subAggregations)), + null + ); } public void testSingleBucketAggExtractor() {