Skip to content

Commit 67badfe

Browse files
authored
[ML] Handle empty percentile results (#116015) (#116215)
Do not add the leaf node if the percentiles bucket is empty. Fix #116013
1 parent 30a62ef commit 67badfe

File tree

3 files changed

+17
-3
lines changed

3 files changed

+17
-3
lines changed

docs/changelog/116015.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 116015
2+
summary: Empty percentile results no longer throw no_such_element_exception in Anomaly Detection jobs
3+
area: Machine Learning
4+
type: bug
5+
issues:
6+
- 116013

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/datafeed/extractor/aggregation/AggregationToJsonProcessor.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.elasticsearch.search.aggregations.metrics.GeoCentroid;
2121
import org.elasticsearch.search.aggregations.metrics.Max;
2222
import org.elasticsearch.search.aggregations.metrics.NumericMetricsAggregation;
23-
import org.elasticsearch.search.aggregations.metrics.Percentile;
2423
import org.elasticsearch.search.aggregations.metrics.Percentiles;
2524
import org.elasticsearch.xcontent.XContentBuilder;
2625
import org.elasticsearch.xcontent.json.JsonXContent;
@@ -408,8 +407,8 @@ private boolean processGeoCentroid(GeoCentroid agg) {
408407
}
409408

410409
private boolean processPercentiles(Percentiles percentiles) {
411-
Iterator<Percentile> percentileIterator = percentiles.iterator();
412-
boolean aggregationAdded = addMetricIfFinite(percentiles.getName(), percentileIterator.next().value());
410+
var percentileIterator = percentiles.iterator();
411+
var aggregationAdded = percentileIterator.hasNext() && addMetricIfFinite(percentiles.getName(), percentileIterator.next().value());
413412
if (percentileIterator.hasNext()) {
414413
throw new IllegalArgumentException("Multi-percentile aggregation [" + percentiles.getName() + "] is not supported");
415414
}

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/aggregation/AggregationToJsonProcessorTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,15 @@ public void testProcessGivenBucketAndLeafAggregationsButBucketNotInFields() thro
505505
{"time":4400,"my_value":4.0,"doc_count":7}"""));
506506
}
507507

508+
public void testProcessGivenEmptyPercentiles() throws IOException {
509+
var histogramBuckets = List.of(createHistogramBucket(1000L, 4, List.of(createMax("time", 1000), createPercentiles("my_field"))));
510+
511+
var json = aggToString(Sets.newHashSet("my_field"), histogramBuckets);
512+
513+
assertThat(json, equalTo("""
514+
{"time":1000,"doc_count":4}"""));
515+
}
516+
508517
public void testProcessGivenSinglePercentilesPerHistogram() throws IOException {
509518
List<InternalHistogram.Bucket> histogramBuckets = Arrays.asList(
510519
createHistogramBucket(1000L, 4, Arrays.asList(createMax("time", 1000), createPercentiles("my_field", 1.0))),

0 commit comments

Comments
 (0)