(
all_vals: &[Option<f64>],
indices: &[usize],
rows: &[Vec<Value>],
column_index: &HashMap<String, usize>,
spec: &WindowFuncSpec,
start_idx: usize,
end_idx: usize,
)
| 170 | } |
| 171 | |
| 172 | fn aggregate_v_slice( |
| 173 | all_vals: &[Option<f64>], |
| 174 | indices: &[usize], |
| 175 | rows: &[Vec<Value>], |
| 176 | column_index: &HashMap<String, usize>, |
| 177 | spec: &WindowFuncSpec, |
| 178 | start_idx: usize, |
| 179 | end_idx: usize, |
| 180 | ) -> Value { |
| 181 | let slice_vals: Vec<f64> = all_vals[start_idx..=end_idx] |
| 182 | .iter() |
| 183 | .filter_map(|v| *v) |
| 184 | .collect(); |
| 185 | let slice_count = end_idx - start_idx + 1; |
| 186 | |
| 187 | match spec.func_name.as_str() { |
| 188 | "sum" => { |
| 189 | let rt = simd_agg::ts_runtime(); |
| 190 | Value::Float((rt.sum_f64)(&slice_vals)) |
| 191 | } |
| 192 | "count" => Value::Integer(slice_count as i64), |
| 193 | "avg" => { |
| 194 | if slice_vals.is_empty() { |
| 195 | Value::Null |
| 196 | } else { |
| 197 | let rt = simd_agg::ts_runtime(); |
| 198 | Value::Float((rt.sum_f64)(&slice_vals) / slice_vals.len() as f64) |
| 199 | } |
| 200 | } |
| 201 | "min" => { |
| 202 | if slice_vals.is_empty() { |
| 203 | Value::Null |
| 204 | } else { |
| 205 | let rt = simd_agg::ts_runtime(); |
| 206 | Value::Float((rt.min_f64)(&slice_vals)) |
| 207 | } |
| 208 | } |
| 209 | "max" => { |
| 210 | if slice_vals.is_empty() { |
| 211 | Value::Null |
| 212 | } else { |
| 213 | let rt = simd_agg::ts_runtime(); |
| 214 | Value::Float((rt.max_f64)(&slice_vals)) |
| 215 | } |
| 216 | } |
| 217 | "first_value" => indices |
| 218 | .get(start_idx) |
| 219 | .and_then(|&i| rows.get(i)) |
| 220 | .map(|row| { |
| 221 | eval_arg_for_row( |
| 222 | spec.args |
| 223 | .first() |
| 224 | .unwrap_or(&crate::expr::types::SqlExpr::Literal(Value::Null)), |
| 225 | row, |
| 226 | column_index, |
| 227 | ) |
| 228 | }) |
| 229 | .unwrap_or(Value::Null), |
no test coverage detected