Skip to content

Commit 6e8735c

Browse files
committed
frac window agg to handle empty values mercifully
1 parent da76ff6 commit 6e8735c

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

src/moonblade/agg/window.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,10 @@ impl ConcreteWindowAggregation {
156156
match self {
157157
Self::Frac(expr, sum, _) => {
158158
let value = eval_expression(expr, Some(index), record, headers_index)?;
159-
sum.add(value.try_as_number().map_err(|err| err.specify("frac"))?);
159+
160+
if !value.is_nullish() {
161+
sum.add(value.try_as_number().map_err(|err| err.specify("frac"))?);
162+
}
160163
}
161164
_ => (),
162165
};
@@ -258,7 +261,14 @@ impl ConcreteWindowAggregation {
258261
Ok(DynamicValue::from(welford.add(float, *stat)))
259262
}
260263
Self::Frac(expr, sum, decimals) => {
264+
// NOTE: we are evaluation the expression twice, because it seems less costly
265+
// than allocating a cache for every record.
261266
let value = eval_expression(expr, Some(index), record, headers_index)?;
267+
268+
if value.is_nullish() {
269+
return Ok(DynamicValue::None);
270+
}
271+
262272
let number = value.try_as_number().map_err(|err| err.specify("frac"))?;
263273
let frac = sum.get().map(|s| number / s);
264274

tests/test_window.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@ fn window_frac() {
398398
svec!["1"],
399399
svec!["2"],
400400
svec!["3"],
401+
svec![""],
401402
svec!["4"],
402403
svec!["5"],
403404
],
@@ -411,6 +412,7 @@ fn window_frac() {
411412
svec!["1", "0.07"],
412413
svec!["2", "0.13"],
413414
svec!["3", "0.20"],
415+
svec!["", ""],
414416
svec!["4", "0.27"],
415417
svec!["5", "0.33"],
416418
];

0 commit comments

Comments
 (0)