فهرست منبع

Prevent instantiation of top_metrics when sub-aggregations are present (#96180)

Shan Swanlow 2 سال پیش
والد
کامیت
d1ec14fead

+ 6 - 0
docs/changelog/96180.yaml

@@ -0,0 +1,6 @@
+pr: 96180
+summary: Prevent instantiation of `top_metrics` when sub-aggregations are present
+area: Search
+type: bug
+issues:
+  - 95663

+ 8 - 0
x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/topmetrics/TopMetricsAggregationBuilder.java

@@ -11,6 +11,7 @@ import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamOutput;
 import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
 import org.elasticsearch.search.aggregations.AggregationBuilder;
+import org.elasticsearch.search.aggregations.AggregationInitializationException;
 import org.elasticsearch.search.aggregations.AggregatorFactories;
 import org.elasticsearch.search.aggregations.AggregatorFactories.Builder;
 import org.elasticsearch.search.aggregations.AggregatorFactory;
@@ -169,6 +170,13 @@ public class TopMetricsAggregationBuilder extends AbstractAggregationBuilder<Top
         out.writeList(metricFields);
     }
 
+    @Override
+    public TopMetricsAggregationBuilder subAggregations(Builder subFactories) {
+        throw new AggregationInitializationException(
+            "Aggregator [" + name + "] of type [" + getType() + "] cannot accept sub-aggregations"
+        );
+    }
+
     @Override
     protected AggregationBuilder shallowCopy(AggregatorFactories.Builder factoriesBuilder, Map<String, Object> metadata) {
         return new TopMetricsAggregationBuilder(this, factoriesBuilder, metadata);

+ 21 - 0
x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/topmetrics/TopMetricsAggregationBuilderTests.java

@@ -9,6 +9,7 @@ package org.elasticsearch.xpack.analytics.topmetrics;
 
 import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
 import org.elasticsearch.common.io.stream.Writeable.Reader;
+import org.elasticsearch.search.aggregations.AggregationInitializationException;
 import org.elasticsearch.search.aggregations.AggregatorFactories;
 import org.elasticsearch.search.aggregations.BaseAggregationBuilder;
 import org.elasticsearch.search.aggregations.support.MultiValuesSourceFieldConfig;
@@ -101,6 +102,26 @@ public class TopMetricsAggregationBuilderTests extends AbstractXContentSerializi
         }).test();
     }
 
+    public void testValidation() {
+        AggregationInitializationException e = expectThrows(AggregationInitializationException.class, () -> {
+            List<SortBuilder<?>> sortBuilders = singletonList(
+                new FieldSortBuilder(randomAlphaOfLength(5)).order(randomFrom(SortOrder.values()))
+            );
+            List<MultiValuesSourceFieldConfig> metricFields = InternalTopMetricsTests.randomMetricNames(between(1, 5))
+                .stream()
+                .map(name -> {
+                    MultiValuesSourceFieldConfig.Builder metricField = new MultiValuesSourceFieldConfig.Builder();
+                    metricField.setFieldName(randomAlphaOfLength(5)).setMissing(1.0);
+                    return metricField.build();
+                })
+                .collect(toList());
+            new TopMetricsAggregationBuilder("tm", sortBuilders, between(1, 100), metricFields).subAggregations(
+                AggregatorFactories.builder()
+            );
+        });
+        assertEquals("Aggregator [tm] of type [top_metrics] cannot accept sub-aggregations", e.getMessage());
+    }
+
     private void toXContentThroughClientBuilder(TopMetricsAggregationBuilder serverBuilder, XContentBuilder builder) throws IOException {
         builder.startObject();
         createClientBuilder(serverBuilder).toXContent(builder, ToXContent.EMPTY_PARAMS);