From 7f3916af7ad012cc59dcd22bf073ec4b3e1ac444 Mon Sep 17 00:00:00 2001 From: Mark Tozzi Date: Thu, 20 Nov 2025 11:48:55 -0500 Subject: [PATCH] sum of empty histogram is now null --- .../analytics/mapper/TDigestFieldMapper.java | 27 +++++++++++++------ .../xpack/analytics/mapper/TDigestParser.java | 2 +- .../test/analytics/t_digest_fieldtype.yml | 1 - 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapper.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapper.java index 2f331ad93d3cf..74ced0a1c2e3b 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapper.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapper.java @@ -402,10 +402,13 @@ public void parse(DocumentParserContext context) throws IOException { ); } NumericDocValuesField countField = new NumericDocValuesField(valuesCountSubFieldName(fullPath()), parsedTDigest.count()); - NumericDocValuesField sumField = new NumericDocValuesField( - valuesSumSubFieldName(fullPath()), - NumericUtils.doubleToSortableLong(parsedTDigest.sum()) - ); + NumericDocValuesField sumField = null; + if (Double.isNaN(parsedTDigest.sum()) == false) { + sumField = new NumericDocValuesField( + valuesSumSubFieldName(fullPath()), + NumericUtils.doubleToSortableLong(parsedTDigest.sum()) + ); + } if (context.doc().getByKey(fieldType().name()) != null) { throw new IllegalArgumentException( "Field [" @@ -417,7 +420,9 @@ public void parse(DocumentParserContext context) throws IOException { } context.doc().addWithKey(fieldType().name(), digestField); context.doc().add(countField); - context.doc().add(sumField); + if (sumField != null) { + context.doc().add(sumField); + } if (maxField != null) { context.doc().add(maxField); } @@ -564,8 +569,12 @@ public DocValuesLoader docValuesLoader(LeafReader leafReader, int[] docIdsInLeaf max = Double.NaN; } - sumValues.advanceExact(docId); - sum = NumericUtils.sortableLongToDouble(sumValues.longValue()); + if (sumValues != null) { + sumValues.advanceExact(docId); + sum = NumericUtils.sortableLongToDouble(sumValues.longValue()); + } else { + sum = Double.NaN; + } binaryValue = docValues.binaryValue(); return true; @@ -595,7 +604,9 @@ public void write(XContentBuilder b) throws IOException { if (Double.isNaN(max) == false) { b.field("max", max); } - b.field("sum", sum); + if (Double.isNaN(sum) == false) { + b.field("sum", sum); + } b.startArray(CENTROIDS_NAME); while (value.next()) { diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestParser.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestParser.java index 2cd536fa74035..2b8bdb7bf6613 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestParser.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestParser.java @@ -158,7 +158,7 @@ public static ParsedTDigest parse(String mappedFieldName, XContentParser parser) ); } if (centroids.isEmpty()) { - sum = 0.0; + sum = null; min = null; max = null; } diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/analytics/t_digest_fieldtype.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/analytics/t_digest_fieldtype.yml index 2bc33882100ae..bdf509e1f6cba 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/analytics/t_digest_fieldtype.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/analytics/t_digest_fieldtype.yml @@ -276,7 +276,6 @@ TDigest with synthetic source and empty digest: - match: _source: latency: - sum: 0.0 centroids: [ ] counts: [ ]