From e7a09ce4dd44a9850b889c68e803f07155139916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20B=C3=BCscher?= Date: Mon, 20 Feb 2017 11:46:43 +0100 Subject: [PATCH 1/2] Tests: Add unit test for InternalChildren Relates to #22278 --- .../InternalSingleBucketAggregation.java | 15 ++++- .../children/InternalChildrenTests.java | 66 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 core/src/test/java/org/elasticsearch/search/aggregations/bucket/children/InternalChildrenTests.java diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/InternalSingleBucketAggregation.java b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/InternalSingleBucketAggregation.java index e8b04680064e3..2da4ae7fe33fc 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/InternalSingleBucketAggregation.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/InternalSingleBucketAggregation.java @@ -30,6 +30,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; /** * A base class for all the single bucket aggregations. @@ -80,7 +81,7 @@ public InternalAggregations getAggregations() { /** * 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} @@ -133,4 +134,16 @@ public XContentBuilder doXContentBody(XContentBuilder builder, Params params) th aggregations.toXContentInternal(builder, params); return builder; } + + @Override + protected boolean doEquals(Object obj) { + InternalSingleBucketAggregation other = (InternalSingleBucketAggregation) obj; + return Objects.equals(docCount, other.docCount) && + Objects.equals(aggregations, other.aggregations); + } + + @Override + protected int doHashCode() { + return Objects.hash(docCount, aggregations); + } } diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/children/InternalChildrenTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/children/InternalChildrenTests.java new file mode 100644 index 0000000000000..e3508e341775b --- /dev/null +++ b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/children/InternalChildrenTests.java @@ -0,0 +1,66 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.search.aggregations.bucket.children; + +import org.elasticsearch.common.io.stream.Writeable.Reader; +import org.elasticsearch.search.DocValueFormat; +import org.elasticsearch.search.aggregations.InternalAggregation; +import org.elasticsearch.search.aggregations.InternalAggregationTestCase; +import org.elasticsearch.search.aggregations.InternalAggregations; +import org.elasticsearch.search.aggregations.metrics.max.InternalMax; +import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class InternalChildrenTests extends InternalAggregationTestCase { + + @Override + protected InternalChildren createTestInstance(String name, List pipelineAggregators, + Map metaData) { + // we shouldn't use the full long range here since we sum doc count on reduce, and don't want to overflow the long range there + long docCount = Math.abs(randomInt()); + int numAggregations = randomIntBetween(0, 20); + List aggs = new ArrayList<>(numAggregations); + for (int i = 0; i < numAggregations; i++) { + aggs.add(new InternalMax(randomAsciiOfLength(5), randomDouble(), + randomFrom(DocValueFormat.BOOLEAN, DocValueFormat.GEOHASH, DocValueFormat.IP, DocValueFormat.RAW), pipelineAggregators, + metaData)); + } + // don't randomize the name parameter, since InternalSingleBucketAggregation#doReduce asserts its the same for all reduced aggs + return new InternalChildren("childAgg", docCount, new InternalAggregations(aggs), pipelineAggregators, metaData); + } + + @Override + protected void assertReduced(InternalChildren reduced, List inputs) { + long expectedDocCount = 0; + for (Children input : inputs) { + expectedDocCount += input.getDocCount(); + } + assertEquals(expectedDocCount, reduced.getDocCount()); + } + + @Override + protected Reader instanceReader() { + return InternalChildren::new; + } + +} From 5eabd52059942aef305f4080b593d2e2e24b4564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20B=C3=BCscher?= Date: Mon, 20 Feb 2017 12:09:29 +0100 Subject: [PATCH 2/2] small review changes --- .../aggregations/bucket/children/InternalChildrenTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/children/InternalChildrenTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/children/InternalChildrenTests.java index e3508e341775b..3b54bf3f35967 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/children/InternalChildrenTests.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/children/InternalChildrenTests.java @@ -37,7 +37,7 @@ public class InternalChildrenTests extends InternalAggregationTestCase pipelineAggregators, Map metaData) { // we shouldn't use the full long range here since we sum doc count on reduce, and don't want to overflow the long range there - long docCount = Math.abs(randomInt()); + long docCount = randomIntBetween(0, Integer.MAX_VALUE); int numAggregations = randomIntBetween(0, 20); List aggs = new ArrayList<>(numAggregations); for (int i = 0; i < numAggregations; i++) {