Skip to content

Commit d1ec14f

Browse files
authored
Prevent instantiation of top_metrics when sub-aggregations are present (elastic#96180)
1 parent 0cf1b70 commit d1ec14f

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

docs/changelog/96180.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 96180
2+
summary: Prevent instantiation of `top_metrics` when sub-aggregations are present
3+
area: Search
4+
type: bug
5+
issues:
6+
- 95663

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.elasticsearch.common.io.stream.StreamOutput;
1212
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
1313
import org.elasticsearch.search.aggregations.AggregationBuilder;
14+
import org.elasticsearch.search.aggregations.AggregationInitializationException;
1415
import org.elasticsearch.search.aggregations.AggregatorFactories;
1516
import org.elasticsearch.search.aggregations.AggregatorFactories.Builder;
1617
import org.elasticsearch.search.aggregations.AggregatorFactory;
@@ -169,6 +170,13 @@ protected void doWriteTo(StreamOutput out) throws IOException {
169170
out.writeList(metricFields);
170171
}
171172

173+
@Override
174+
public TopMetricsAggregationBuilder subAggregations(Builder subFactories) {
175+
throw new AggregationInitializationException(
176+
"Aggregator [" + name + "] of type [" + getType() + "] cannot accept sub-aggregations"
177+
);
178+
}
179+
172180
@Override
173181
protected AggregationBuilder shallowCopy(AggregatorFactories.Builder factoriesBuilder, Map<String, Object> metadata) {
174182
return new TopMetricsAggregationBuilder(this, factoriesBuilder, metadata);

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
1111
import org.elasticsearch.common.io.stream.Writeable.Reader;
12+
import org.elasticsearch.search.aggregations.AggregationInitializationException;
1213
import org.elasticsearch.search.aggregations.AggregatorFactories;
1314
import org.elasticsearch.search.aggregations.BaseAggregationBuilder;
1415
import org.elasticsearch.search.aggregations.support.MultiValuesSourceFieldConfig;
@@ -101,6 +102,26 @@ public void testClientBuilder() throws IOException {
101102
}).test();
102103
}
103104

105+
public void testValidation() {
106+
AggregationInitializationException e = expectThrows(AggregationInitializationException.class, () -> {
107+
List<SortBuilder<?>> sortBuilders = singletonList(
108+
new FieldSortBuilder(randomAlphaOfLength(5)).order(randomFrom(SortOrder.values()))
109+
);
110+
List<MultiValuesSourceFieldConfig> metricFields = InternalTopMetricsTests.randomMetricNames(between(1, 5))
111+
.stream()
112+
.map(name -> {
113+
MultiValuesSourceFieldConfig.Builder metricField = new MultiValuesSourceFieldConfig.Builder();
114+
metricField.setFieldName(randomAlphaOfLength(5)).setMissing(1.0);
115+
return metricField.build();
116+
})
117+
.collect(toList());
118+
new TopMetricsAggregationBuilder("tm", sortBuilders, between(1, 100), metricFields).subAggregations(
119+
AggregatorFactories.builder()
120+
);
121+
});
122+
assertEquals("Aggregator [tm] of type [top_metrics] cannot accept sub-aggregations", e.getMessage());
123+
}
124+
104125
private void toXContentThroughClientBuilder(TopMetricsAggregationBuilder serverBuilder, XContentBuilder builder) throws IOException {
105126
builder.startObject();
106127
createClientBuilder(serverBuilder).toXContent(builder, ToXContent.EMPTY_PARAMS);

0 commit comments

Comments
 (0)