Skip to content

Commit 2b137ca

Browse files
committed
skip nulls instead of zeroing them
1 parent 22acc9b commit 2b137ca

File tree

2 files changed

+21
-14
lines changed

2 files changed

+21
-14
lines changed

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/ChangePointOperator.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.elasticsearch.xpack.ml.aggs.changepoint.ChangePointDetector;
2020
import org.elasticsearch.xpack.ml.aggs.changepoint.ChangeType;
2121

22+
import java.util.ArrayList;
2223
import java.util.Deque;
2324
import java.util.LinkedList;
2425
import java.util.List;
@@ -113,7 +114,8 @@ private void createOutputPages() {
113114
valuesCount = INPUT_VALUE_COUNT_LIMIT;
114115
}
115116

116-
double[] values = new double[valuesCount];
117+
List<Double> values = new ArrayList<>(valuesCount);
118+
List<Integer> bucketIndexes = new ArrayList<>(valuesCount);
117119
int valuesIndex = 0;
118120
boolean hasNulls = false;
119121
boolean hasMultivalued = false;
@@ -123,17 +125,22 @@ private void createOutputPages() {
123125
Object value = BlockUtils.toJavaObject(inputBlock, i);
124126
if (value == null) {
125127
hasNulls = true;
126-
values[valuesIndex++] = 0;
128+
valuesIndex++;
127129
} else if (value instanceof List<?> list) {
128130
hasMultivalued = true;
129-
values[valuesIndex++] = ((Number) list.getFirst()).doubleValue();
131+
values.add(((Number) list.getFirst()).doubleValue());
130132
} else {
131-
values[valuesIndex++] = ((Number) value).doubleValue();
133+
values.add(((Number) value).doubleValue());
134+
bucketIndexes.add(valuesIndex++);
132135
}
133136
}
134137
}
135-
136-
ChangeType changeType = ChangePointDetector.getChangeType(new MlAggsHelper.DoubleBucketValues(null, values));
138+
MlAggsHelper.DoubleBucketValues bucketValues = new MlAggsHelper.DoubleBucketValues(
139+
null,
140+
values.stream().mapToDouble(Double::doubleValue).toArray(),
141+
bucketIndexes.stream().mapToInt(Integer::intValue).toArray()
142+
);
143+
ChangeType changeType = ChangePointDetector.getChangeType(bucketValues);
137144
int changePointIndex = changeType.changePoint();
138145

139146
BlockFactory blockFactory = driverContext.blockFactory();
@@ -189,7 +196,7 @@ private void createOutputPages() {
189196
);
190197
}
191198
if (hasNulls) {
192-
warnings(true).registerException(new IllegalArgumentException("values contain nulls; treating them as zeroes"));
199+
warnings(true).registerException(new IllegalArgumentException("values contain nulls; skipping them"));
193200
}
194201
if (hasMultivalued) {
195202
warnings(true).registerException(new IllegalArgumentException("values is multivalued; keeping only first elements"));

x-pack/plugin/esql/qa/testFixtures/src/main/resources/change_point.csv-spec

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -694,12 +694,11 @@ FROM k8s
694694
| STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
695695
| EVAL count=count+CASE(@timestamp>="2024-05-10T00:11:00.000Z", 100, 0)
696696
| EVAL count=CASE(@timestamp=="2024-05-10T00:04:00.000Z", NULL, count)
697-
| EVAL count=CASE(@timestamp=="2024-05-10T00:08:00.000Z", NULL, count)
698697
| CHANGE_POINT count ON @timestamp AS type, pvalue
699698
;
700699

701-
warning:Line 6:3: warnings during evaluation of [CHANGE_POINT count ON @timestamp AS type, pvalue]. Only first 20 failures recorded.
702-
warning:Line 6:3: java.lang.IllegalArgumentException: values contain nulls; treating them as zeroes
700+
warning:Line 5:3: warnings during evaluation of [CHANGE_POINT count ON @timestamp AS type, pvalue]. Only first 20 failures recorded.
701+
warning:Line 5:3: java.lang.IllegalArgumentException: values contain nulls; skipping them
703702

704703
@timestamp:datetime | count:long | type:keyword | pvalue:double
705704
2024-05-10T00:00:00.000Z | 4 | null | null
@@ -710,10 +709,10 @@ warning:Line 6:3: java.lang.IllegalArgumentException: values contain nulls; trea
710709
2024-05-10T00:05:00.000Z | 8 | null | null
711710
2024-05-10T00:06:00.000Z | 10 | null | null
712711
2024-05-10T00:07:00.000Z | 5 | null | null
713-
2024-05-10T00:08:00.000Z | null | null | null
712+
2024-05-10T00:08:00.000Z | 12 | null | null
714713
2024-05-10T00:09:00.000Z | 20 | null | null
715714
2024-05-10T00:10:00.000Z | 5 | null | null
716-
2024-05-10T00:11:00.000Z | 107 | step_change | 2.1947350086494926E-22
715+
2024-05-10T00:11:00.000Z | 107 | step_change | 3.438939970021414E-22
717716
2024-05-10T00:12:00.000Z | 108 | null | null
718717
2024-05-10T00:13:00.000Z | 109 | null | null
719718
2024-05-10T00:14:00.000Z | 109 | null | null
@@ -953,8 +952,9 @@ ROW time=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24], va
953952
| CHANGE_POINT values ON time
954953
;
955954

956-
warning:Line 3:3: warnings during evaluation of [CHANGE_POINT values ON time]. Only first 20 failures recorded.
957-
warning:Line 3:3: java.lang.IllegalArgumentException: values contain nulls; treating them as zeroes
955+
warning: Line 3:3: evaluation of [CHANGE_POINT values ON time] failed, treating result as null. Only first 20 failures recorded.
956+
warning: Line 3:3: java.lang.IllegalArgumentException: not enough buckets to calculate change_point. Requires at least [22]; found [0]
957+
warning: Line 3:3: java.lang.IllegalArgumentException: values contain nulls; skipping them
958958

959959
time:integer | values:integer | type:keyword | pvalue:double
960960
1 | null | null | null

0 commit comments

Comments
 (0)