(
rows: &mut [Vec<Value>],
indices: &[usize],
column_index: &HashMap<String, usize>,
spec: &WindowFuncSpec,
write_col: usize,
)
| 37 | } |
| 38 | |
| 39 | fn apply_v_running_aggregate( |
| 40 | rows: &mut [Vec<Value>], |
| 41 | indices: &[usize], |
| 42 | column_index: &HashMap<String, usize>, |
| 43 | spec: &WindowFuncSpec, |
| 44 | write_col: usize, |
| 45 | ) { |
| 46 | let len = indices.len(); |
| 47 | if len == 0 { |
| 48 | return; |
| 49 | } |
| 50 | |
| 51 | let mut running_sum = 0.0f64; |
| 52 | let mut running_count = 0u64; |
| 53 | let mut running_min: Option<f64> = None; |
| 54 | let mut running_max: Option<f64> = None; |
| 55 | let mut peer_start = 0usize; |
| 56 | |
| 57 | for pos in 0..len { |
| 58 | let i = indices[pos]; |
| 59 | let val = rows |
| 60 | .get(i) |
| 61 | .map(|row| eval_arg(spec, row, column_index)) |
| 62 | .unwrap_or(Value::Null); |
| 63 | |
| 64 | if let Some(n) = val.as_f64() { |
| 65 | running_sum += n; |
| 66 | running_count += 1; |
| 67 | running_min = Some(running_min.map_or(n, |m: f64| m.min(n))); |
| 68 | running_max = Some(running_max.map_or(n, |m: f64| m.max(n))); |
| 69 | } else if spec.func_name == "count" { |
| 70 | running_count += 1; |
| 71 | } |
| 72 | |
| 73 | let is_last_in_group = pos + 1 == len |
| 74 | || !order_keys_equal_v(rows, i, indices[pos + 1], column_index, &spec.order_by); |
| 75 | |
| 76 | if is_last_in_group { |
| 77 | let first_val = rows |
| 78 | .get(indices[0]) |
| 79 | .map(|row| eval_arg(spec, row, column_index)) |
| 80 | .unwrap_or(Value::Null); |
| 81 | let last_val = rows |
| 82 | .get(indices[pos]) |
| 83 | .map(|row| eval_arg(spec, row, column_index)) |
| 84 | .unwrap_or(Value::Null); |
| 85 | |
| 86 | let result = match spec.func_name.as_str() { |
| 87 | "sum" => Value::Float(running_sum), |
| 88 | "count" => Value::Integer(running_count as i64), |
| 89 | "avg" => { |
| 90 | if running_count > 0 { |
| 91 | Value::Float(running_sum / running_count as f64) |
| 92 | } else { |
| 93 | Value::Null |
| 94 | } |
| 95 | } |
| 96 | "min" => running_min.map(Value::Float).unwrap_or(Value::Null), |
no test coverage detected