MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / apply_v_running_aggregate

Function apply_v_running_aggregate

nodedb-query/src/window/value_agg.rs:39–109  ·  view source on GitHub ↗
(
    rows: &mut [Vec<Value>],
    indices: &[usize],
    column_index: &HashMap<String, usize>,
    spec: &WindowFuncSpec,
    write_col: usize,
)

Source from the content-addressed store, hash-verified

37}
38
39fn 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),

Callers 1

apply_v_aggregateFunction · 0.85

Calls 8

eval_argFunction · 0.85
order_keys_equal_vFunction · 0.85
set_cellFunction · 0.85
lenMethod · 0.45
getMethod · 0.45
as_f64Method · 0.45
as_strMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected