diff --git a/docs/changelog/86401.yaml b/docs/changelog/86401.yaml new file mode 100644 index 0000000000000..f0c6b448109a7 --- /dev/null +++ b/docs/changelog/86401.yaml @@ -0,0 +1,5 @@ +pr: 86401 +summary: Allow `serial_diff` under `min_doc_count` aggs +area: Aggregations +type: bug +issues: [] diff --git a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search.aggregation/500_serial_diff.yml b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search.aggregation/500_serial_diff.yml new file mode 100644 index 0000000000000..9a49067c09c38 --- /dev/null +++ b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search.aggregation/500_serial_diff.yml @@ -0,0 +1,163 @@ +basic: + - do: + bulk: + index: test + refresh: true + body: + - { "index": { } } + - { "@timestamp": "2022-01-01T00:00:00", "v": 1 } + - { "index": { } } + - { "@timestamp": "2022-01-01T01:00:00", "v": 2 } + - { "index": { } } + - { "@timestamp": "2022-01-01T02:00:00", "v": 1 } + + - do: + search: + body: + size: 0 + aggs: + "@timestamp": + date_histogram: + field: "@timestamp" + fixed_interval: 1h + aggs: + v: {avg: {field: v}} + d: {serial_diff: {buckets_path: v}} + - match: { hits.total.value: 3 } + - length: { aggregations.@timestamp.buckets: 3 } + - match: { aggregations.@timestamp.buckets.0.key_as_string: 2022-01-01T00:00:00.000Z } + - match: { aggregations.@timestamp.buckets.1.key_as_string: 2022-01-01T01:00:00.000Z } + - match: { aggregations.@timestamp.buckets.2.key_as_string: 2022-01-01T02:00:00.000Z } + - match: { aggregations.@timestamp.buckets.0.v.value: 1 } + - match: { aggregations.@timestamp.buckets.1.v.value: 2 } + - match: { aggregations.@timestamp.buckets.2.v.value: 1 } + - is_false: aggregations.@timestamp.buckets.0.d + - match: { aggregations.@timestamp.buckets.1.d.value: 1 } + - match: { aggregations.@timestamp.buckets.2.d.value: -1 } + +--- +lag: + - do: + bulk: + index: test + refresh: true + body: + - { "index": { } } + - { "@timestamp": "2022-01-01T00:00:00", "v": 1 } + - { "index": { } } + - { "@timestamp": "2022-01-01T01:00:00", "v": 2 } + - { "index": { } } + - { "@timestamp": "2022-01-01T02:00:00", "v": 3 } + - { "index": { } } + - { "@timestamp": "2022-01-01T03:00:00", "v": 1 } + + - do: + search: + body: + size: 0 + aggs: + "@timestamp": + date_histogram: + field: "@timestamp" + fixed_interval: 1h + aggs: + v: { avg: { field: v } } + d: { serial_diff: { buckets_path: v, lag: 2 } } + - match: { hits.total.value: 4 } + - length: { aggregations.@timestamp.buckets: 4 } + - match: { aggregations.@timestamp.buckets.0.key_as_string: 2022-01-01T00:00:00.000Z } + - match: { aggregations.@timestamp.buckets.1.key_as_string: 2022-01-01T01:00:00.000Z } + - match: { aggregations.@timestamp.buckets.2.key_as_string: 2022-01-01T02:00:00.000Z } + - match: { aggregations.@timestamp.buckets.3.key_as_string: 2022-01-01T03:00:00.000Z } + - match: { aggregations.@timestamp.buckets.0.v.value: 1 } + - match: { aggregations.@timestamp.buckets.1.v.value: 2 } + - match: { aggregations.@timestamp.buckets.2.v.value: 3 } + - match: { aggregations.@timestamp.buckets.3.v.value: 1 } + - is_false: aggregations.@timestamp.buckets.0.d + - is_false: aggregations.@timestamp.buckets.1.d + - match: { aggregations.@timestamp.buckets.2.d.value: 2 } + - match: { aggregations.@timestamp.buckets.3.d.value: -1 } + +--- +parent has gap: + - do: + bulk: + index: test + refresh: true + body: + - { "index": { } } + - { "@timestamp": "2022-01-01T00:00:00", "v": 1 } + - { "index": { } } + - { "@timestamp": "2022-01-01T01:00:00", "v": 2 } + - { "index": { } } + - { "@timestamp": "2022-01-01T03:00:00", "v": 1 } + + - do: + search: + body: + size: 0 + aggs: + "@timestamp": + date_histogram: + field: "@timestamp" + fixed_interval: 1h + aggs: + v: {avg: {field: v}} + d: {serial_diff: {buckets_path: v}} + - match: { hits.total.value: 3 } + - length: { aggregations.@timestamp.buckets: 4 } + - match: { aggregations.@timestamp.buckets.0.key_as_string: 2022-01-01T00:00:00.000Z } + - match: { aggregations.@timestamp.buckets.1.key_as_string: 2022-01-01T01:00:00.000Z } + - match: { aggregations.@timestamp.buckets.2.key_as_string: 2022-01-01T02:00:00.000Z } + - match: { aggregations.@timestamp.buckets.3.key_as_string: 2022-01-01T03:00:00.000Z } + - match: { aggregations.@timestamp.buckets.0.v.value: 1 } + - match: { aggregations.@timestamp.buckets.1.v.value: 2 } + - is_false: aggregations.@timestamp.buckets.2.v.value + - match: { aggregations.@timestamp.buckets.3.v.value: 1 } + - is_false: aggregations.@timestamp.buckets.0.d + - match: { aggregations.@timestamp.buckets.1.d.value: 1 } + - is_false: aggregations.@timestamp.buckets.2.d + - is_false: aggregations.@timestamp.buckets.3.d + +--- +parent has min_doc_count: + - skip: + version: " - 8.2.99" + reason: allowed in 8.3.0 + + - do: + bulk: + index: test + refresh: true + body: + - { "index": { } } + - { "@timestamp": "2022-01-01T00:00:00", "v": 1 } + - { "index": { } } + - { "@timestamp": "2022-01-01T01:00:00", "v": 2 } + - { "index": { } } + - { "@timestamp": "2022-01-01T03:00:00", "v": 1 } + + - do: + search: + body: + size: 0 + aggs: + "@timestamp": + date_histogram: + field: "@timestamp" + fixed_interval: 1h + min_doc_count: 1 + aggs: + v: {avg: {field: v}} + d: {serial_diff: {buckets_path: v}} + - match: { hits.total.value: 3 } + - length: { aggregations.@timestamp.buckets: 3 } + - match: { aggregations.@timestamp.buckets.0.key_as_string: 2022-01-01T00:00:00.000Z } + - match: { aggregations.@timestamp.buckets.1.key_as_string: 2022-01-01T01:00:00.000Z } + - match: { aggregations.@timestamp.buckets.2.key_as_string: 2022-01-01T03:00:00.000Z } + - match: { aggregations.@timestamp.buckets.0.v.value: 1 } + - match: { aggregations.@timestamp.buckets.1.v.value: 2 } + - match: { aggregations.@timestamp.buckets.2.v.value: 1 } + - is_false: aggregations.@timestamp.buckets.0.d + - match: { aggregations.@timestamp.buckets.1.d.value: 1 } + - match: { aggregations.@timestamp.buckets.2.d.value: -1 } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/AggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/AggregationBuilder.java index 860a83f88712f..11141995003d9 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/AggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/AggregationBuilder.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; /** * A factory that knows how to create an {@link Aggregator} of a specific type. @@ -189,4 +190,38 @@ public static final class CommonFields extends ParseField.CommonFields { public String toString() { return Strings.toString(this); } + + /** + * Return true if any of the child aggregations is a time-series aggregation that requires an in-order execution + */ + public boolean isInSortOrderExecutionRequired() { + for (AggregationBuilder builder : factoriesBuilder.getAggregatorFactories()) { + if (builder.isInSortOrderExecutionRequired()) { + return true; + } + } + return false; + } + + /** + * Called by aggregations whose parents must be sequentially ordered. + * @param type the type of the aggregation being validated + * @param name the name of the aggregation being validated + * @param addValidationError callback to add validation errors + */ + protected void validateSequentiallyOrdered(String type, String name, Consumer addValidationError) { + addValidationError.accept( + type + " aggregation [" + name + "] must have a histogram, date_histogram or auto_date_histogram as parent" + ); + } + + /** + * Called by aggregations whose parents must be sequentially ordered without any gaps. + * @param type the type of the aggregation being validated + * @param name the name of the aggregation being validated + * @param addValidationError callback to add validation errors + */ + protected void validateSequentiallyOrderedWithoutGaps(String type, String name, Consumer addValidationError) { + validateSequentiallyOrdered(type, name, addValidationError); + } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/PipelineAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/PipelineAggregationBuilder.java index dfb93fac8f96b..0fce9cf9a3703 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/PipelineAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/PipelineAggregationBuilder.java @@ -14,9 +14,6 @@ import org.elasticsearch.index.query.QueryRewriteContext; import org.elasticsearch.index.query.Rewriteable; import org.elasticsearch.search.aggregations.AggregatorFactories.Builder; -import org.elasticsearch.search.aggregations.bucket.histogram.AutoDateHistogramAggregationBuilder; -import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder; -import org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; import org.elasticsearch.xcontent.ToXContentFragment; @@ -127,6 +124,15 @@ public void validateHasParent(String type, String name) { @Override public void validateParentAggSequentiallyOrdered(String type, String name) { + noParentCantBeOrdered(type, name); + } + + @Override + public void validateParentAggSequentiallyOrderedWithoutSkips(String type, String name) { + noParentCantBeOrdered(type, name); + } + + private void noParentCantBeOrdered(String type, String name) { addValidationError( type + " aggregation [" @@ -161,23 +167,12 @@ public void validateHasParent(String type, String name) { @Override public void validateParentAggSequentiallyOrdered(String type, String name) { - if (parent instanceof HistogramAggregationBuilder) { - HistogramAggregationBuilder histoParent = (HistogramAggregationBuilder) parent; - if (histoParent.minDocCount() != 0) { - addValidationError("parent histogram of " + type + " aggregation [" + name + "] must have min_doc_count of 0"); - } - } else if (parent instanceof DateHistogramAggregationBuilder) { - DateHistogramAggregationBuilder histoParent = (DateHistogramAggregationBuilder) parent; - if (histoParent.minDocCount() != 0) { - addValidationError("parent histogram of " + type + " aggregation [" + name + "] must have min_doc_count of 0"); - } - } else if (parent instanceof AutoDateHistogramAggregationBuilder) { - // Nothing to check - } else { - addValidationError( - type + " aggregation [" + name + "] must have a histogram, date_histogram or auto_date_histogram as parent" - ); - } + parent.validateSequentiallyOrdered(type, name, this::addValidationError); + } + + @Override + public void validateParentAggSequentiallyOrderedWithoutSkips(String type, String name) { + parent.validateSequentiallyOrderedWithoutGaps(type, name, this::addValidationError); } } @@ -218,6 +213,11 @@ public void addBucketPathValidationError(String error) { */ public abstract void validateParentAggSequentiallyOrdered(String type, String name); + /** + * Validates that the parent is sequentially ordered and doesn't have any gps. + */ + public abstract void validateParentAggSequentiallyOrderedWithoutSkips(String type, String name); + /** * The validation exception, if there is one. It'll be {@code null} * if the context wasn't provided with any exception on creation diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/AutoDateHistogramAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/AutoDateHistogramAggregationBuilder.java index 1134d2baa336f..d1e19e28acd78 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/AutoDateHistogramAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/AutoDateHistogramAggregationBuilder.java @@ -35,6 +35,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; +import java.util.function.Consumer; public class AutoDateHistogramAggregationBuilder extends ValuesSourceAggregationBuilder { @@ -354,4 +355,12 @@ public String toString() { return "RoundingInfo[" + rounding + " " + Arrays.toString(innerIntervals) + "]"; } } + + @Override + protected void validateSequentiallyOrdered(String type, String name, Consumer addValidationError) {} + + @Override + protected void validateSequentiallyOrderedWithoutGaps(String type, String name, Consumer addValidationError) { + // auto_date_histogram never has gaps + } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregationBuilder.java index 693bb2460e51c..e2582743f9b41 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramAggregationBuilder.java @@ -36,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Consumer; import static java.util.Collections.unmodifiableMap; @@ -532,4 +533,14 @@ public boolean equals(Object obj) { && Objects.equals(extendedBounds, other.extendedBounds) && Objects.equals(hardBounds, other.hardBounds); } + + @Override + protected void validateSequentiallyOrdered(String type, String name, Consumer addValidationError) {} + + @Override + protected void validateSequentiallyOrderedWithoutGaps(String type, String name, Consumer addValidationError) { + if (minDocCount != 0) { + addValidationError.accept("parent histogram of " + type + " aggregation [" + name + "] must have min_doc_count of 0"); + } + } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregationBuilder.java index 7e7a49d90d3a4..dcc183ef6f503 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/HistogramAggregationBuilder.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Consumer; /** * A builder for histograms on numeric fields. This builder can operate on either base numeric fields, or numeric range fields. IP range @@ -433,4 +434,14 @@ public boolean equals(Object obj) { && Objects.equals(extendedBounds, other.extendedBounds) && Objects.equals(hardBounds, other.hardBounds); } + + @Override + protected void validateSequentiallyOrdered(String type, String name, Consumer addValidationError) {} + + @Override + protected void validateSequentiallyOrderedWithoutGaps(String type, String name, Consumer addValidationError) { + if (minDocCount != 0) { + addValidationError.accept("parent histogram of " + type + " aggregation [" + name + "] must have min_doc_count of 0"); + } + } } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/CumulativeSumPipelineAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/CumulativeSumPipelineAggregationBuilder.java index 90fc593c61c96..41f0e52720fc5 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/CumulativeSumPipelineAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/CumulativeSumPipelineAggregationBuilder.java @@ -96,7 +96,7 @@ protected void validate(ValidationContext context) { if (bucketsPaths.length != 1) { context.addBucketPathValidationError("must contain a single entry for aggregation [" + name + "]"); } - context.validateParentAggSequentiallyOrdered(NAME, name); + context.validateParentAggSequentiallyOrderedWithoutSkips(NAME, name); } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/DerivativePipelineAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/DerivativePipelineAggregationBuilder.java index f59142ad3bc1d..c27d64505e05b 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/DerivativePipelineAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/DerivativePipelineAggregationBuilder.java @@ -144,7 +144,7 @@ protected void validate(ValidationContext context) { ); } - context.validateParentAggSequentiallyOrdered(NAME, name); + context.validateParentAggSequentiallyOrderedWithoutSkips(NAME, name); } @Override diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/MovFnPipelineAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/MovFnPipelineAggregationBuilder.java index e28728f7b01fe..1921236470a18 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/MovFnPipelineAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/MovFnPipelineAggregationBuilder.java @@ -173,7 +173,7 @@ protected void validate(ValidationContext context) { if (window <= 0) { context.addValidationError("[" + WINDOW.getPreferredName() + "] must be a positive, non-zero integer."); } - context.validateParentAggSequentiallyOrdered(NAME, name); + context.validateParentAggSequentiallyOrderedWithoutSkips(NAME, name); } @Override diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/CumulativeSumTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/CumulativeSumTests.java index f9272a60a94d6..21beed053efca 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/CumulativeSumTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/CumulativeSumTests.java @@ -10,14 +10,13 @@ import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.BasePipelineAggregationTestCase; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; import java.io.IOException; import static java.util.Collections.emptyList; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class CumulativeSumTests extends BasePipelineAggregationTestCase { @Override @@ -42,9 +41,7 @@ public void testValidate() throws IOException { } public void testInvalidParent() throws IOException { - AggregationBuilder parent = mock(AggregationBuilder.class); - when(parent.getName()).thenReturn("name"); - + AggregationBuilder parent = new TermsAggregationBuilder("name"); assertThat( validate(parent, new CumulativeSumPipelineAggregationBuilder("name", "invalid_agg>metric")), equalTo( diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/DerivativeTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/DerivativeTests.java index a29ba8f5e8227..9de23d9f83722 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/DerivativeTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/DerivativeTests.java @@ -11,6 +11,7 @@ import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.BasePipelineAggregationTestCase; import org.elasticsearch.search.aggregations.PipelineAggregationBuilder; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; import org.elasticsearch.search.aggregations.pipeline.BucketHelpers.GapPolicy; import java.io.IOException; @@ -19,8 +20,6 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class DerivativeTests extends BasePipelineAggregationTestCase { @@ -66,9 +65,7 @@ public void testValidate() throws IOException { public void testValidateException() throws IOException { final Set aggBuilders = new HashSet<>(); aggBuilders.add(new DerivativePipelineAggregationBuilder("deriv", "der")); - AggregationBuilder parent = mock(AggregationBuilder.class); - when(parent.getName()).thenReturn("name"); - + AggregationBuilder parent = new TermsAggregationBuilder("name"); assertThat( validate(parent, new DerivativePipelineAggregationBuilder("name", "invalid_agg>metric")), equalTo( diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/MovFnPipelineAggregationBuilderSerializationTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/MovFnPipelineAggregationBuilderSerializationTests.java index ea90342f9d103..8f432f420e1bd 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/MovFnPipelineAggregationBuilderSerializationTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/MovFnPipelineAggregationBuilderSerializationTests.java @@ -11,6 +11,7 @@ import org.elasticsearch.script.Script; import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.BasePipelineAggregationTestCase; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; import java.io.IOException; import java.util.Collections; @@ -19,8 +20,6 @@ import static java.util.Collections.emptyMap; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class MovFnPipelineAggregationBuilderSerializationTests extends BasePipelineAggregationTestCase { @Override @@ -48,9 +47,7 @@ public void testValidParent() throws IOException { public void testInvalidParent() throws IOException { Script script = new Script(Script.DEFAULT_SCRIPT_TYPE, "painless", "test", Collections.emptyMap()); - AggregationBuilder parent = mock(AggregationBuilder.class); - when(parent.getName()).thenReturn("name"); - + AggregationBuilder parent = new TermsAggregationBuilder("name"); assertThat( validate(parent, new MovFnPipelineAggregationBuilder("name", "invalid_agg>metric", script, 1)), equalTo( diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/SerialDifferenceTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/SerialDifferenceTests.java index 36fa17461f6e2..db001a1a13c14 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/SerialDifferenceTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/pipeline/SerialDifferenceTests.java @@ -11,6 +11,7 @@ import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.BasePipelineAggregationTestCase; import org.elasticsearch.search.aggregations.PipelineAggregationBuilder; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; import org.elasticsearch.search.aggregations.pipeline.BucketHelpers.GapPolicy; import java.io.IOException; @@ -20,8 +21,6 @@ import static java.util.Collections.emptyList; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class SerialDifferenceTests extends BasePipelineAggregationTestCase { @@ -58,8 +57,7 @@ public void testValidate() throws IOException { public void testInvalidParent() throws IOException { final Set aggBuilders = new HashSet<>(); aggBuilders.add(createTestAggregatorFactory()); - AggregationBuilder parent = mock(AggregationBuilder.class); - when(parent.getName()).thenReturn("name"); + AggregationBuilder parent = new TermsAggregationBuilder("t"); assertThat( validate(parent, new SerialDiffPipelineAggregationBuilder("name", "invalid_agg>metric")), equalTo( diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/cumulativecardinality/CumulativeCardinalityTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/cumulativecardinality/CumulativeCardinalityTests.java index 22d26775bf307..b4e654981cac0 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/cumulativecardinality/CumulativeCardinalityTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/cumulativecardinality/CumulativeCardinalityTests.java @@ -13,6 +13,7 @@ import org.elasticsearch.search.aggregations.bucket.histogram.AutoDateHistogramAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; import java.io.IOException; import java.util.List; @@ -21,8 +22,6 @@ import static java.util.Collections.singletonList; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class CumulativeCardinalityTests extends BasePipelineAggregationTestCase { @Override @@ -64,8 +63,7 @@ public void testParentValidations() throws IOException { assertThat(validate(new AutoDateHistogramAggregationBuilder("name"), builder), nullValue()); // Mocked "test" agg, should fail validation - AggregationBuilder stubParent = mock(AggregationBuilder.class); - when(stubParent.getName()).thenReturn("name"); + AggregationBuilder stubParent = new TermsAggregationBuilder("name"); assertThat( validate(stubParent, builder), equalTo( diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/movingPercentiles/MovingPercentilesTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/movingPercentiles/MovingPercentilesTests.java index 618d005fd7578..74e49c56103d7 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/movingPercentiles/MovingPercentilesTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/movingPercentiles/MovingPercentilesTests.java @@ -14,6 +14,7 @@ import org.elasticsearch.search.aggregations.bucket.histogram.AutoDateHistogramAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; import java.io.IOException; import java.util.List; @@ -22,8 +23,6 @@ import static java.util.Collections.singletonList; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class MovingPercentilesTests extends BasePipelineAggregationTestCase { @Override @@ -68,9 +67,7 @@ public void testParentValidations() throws IOException { assertThat(validate(new DateHistogramAggregationBuilder("name"), builder), nullValue()); assertThat(validate(new AutoDateHistogramAggregationBuilder("name"), builder), nullValue()); - // Mocked "test" agg, should fail validation - AggregationBuilder stubParent = mock(AggregationBuilder.class); - when(stubParent.getName()).thenReturn("name"); + AggregationBuilder stubParent = new TermsAggregationBuilder("name"); assertThat( validate(stubParent, builder), equalTo(