(
args: &[ast::Expr],
catalog: &dyn SqlCatalog,
temporal: TemporalScope,
)
| 182 | } |
| 183 | |
| 184 | fn plan_agg( |
| 185 | args: &[ast::Expr], |
| 186 | catalog: &dyn SqlCatalog, |
| 187 | temporal: TemporalScope, |
| 188 | ) -> Result<SqlPlan> { |
| 189 | if args.len() < 3 || args.len() > 4 { |
| 190 | return Err(SqlError::Unsupported { |
| 191 | detail: format!( |
| 192 | "ARRAY_AGG expects 3..=4 args (name, attr, reducer, [group_by_dim]); got {}", |
| 193 | args.len() |
| 194 | ), |
| 195 | }); |
| 196 | } |
| 197 | let name = require_array_name(args, 0, "ARRAY_AGG", catalog)?; |
| 198 | let view = catalog |
| 199 | .lookup_array(&name) |
| 200 | .ok_or_else(|| SqlError::Unsupported { |
| 201 | detail: format!("ARRAY_AGG: array '{name}' not found"), |
| 202 | })?; |
| 203 | |
| 204 | let attr = expect_string_literal(&args[1], "ARRAY_AGG attr")?; |
| 205 | if !view.attrs.iter().any(|a| a.name == attr) { |
| 206 | return Err(SqlError::Unsupported { |
| 207 | detail: format!("ARRAY_AGG: array '{name}' has no attr '{attr}'"), |
| 208 | }); |
| 209 | } |
| 210 | |
| 211 | let reducer_str = expect_string_literal(&args[2], "ARRAY_AGG reducer")?; |
| 212 | let reducer = ArrayReducerAst::parse(&reducer_str).ok_or_else(|| SqlError::Unsupported { |
| 213 | detail: format!("ARRAY_AGG: unknown reducer '{reducer_str}' (want sum/count/min/max/mean)"), |
| 214 | })?; |
| 215 | |
| 216 | let group_by_dim = if args.len() == 4 && !is_null_literal(&args[3]) { |
| 217 | let dim = expect_string_literal(&args[3], "ARRAY_AGG group_by_dim")?; |
| 218 | if !view.dims.iter().any(|d| d.name == dim) { |
| 219 | return Err(SqlError::Unsupported { |
| 220 | detail: format!("ARRAY_AGG: array '{name}' has no dim '{dim}'"), |
| 221 | }); |
| 222 | } |
| 223 | Some(dim) |
| 224 | } else { |
| 225 | None |
| 226 | }; |
| 227 | |
| 228 | Ok(SqlPlan::ArrayAgg { |
| 229 | name, |
| 230 | attr, |
| 231 | reducer, |
| 232 | group_by_dim, |
| 233 | temporal, |
| 234 | }) |
| 235 | } |
| 236 | |
| 237 | fn plan_elementwise(args: &[ast::Expr], catalog: &dyn SqlCatalog) -> Result<SqlPlan> { |
| 238 | if args.len() != 4 { |
no test coverage detected