use nodedb_types::Value;
use super::spec::WindowFuncSpec;
use crate::expr::{EvalError, SqlExpr};
pub(super) type ArgValues = Option<Vec<Value>>;
pub(super) fn eval_arg_values(
rows: &[(String, Value)],
indices: &[usize],
spec: &WindowFuncSpec,
idx: usize,
) -> Result<ArgValues, EvalError> {
let Some(expr) = spec.args.get(idx) else {
return Ok(None);
};
let values = indices
.iter()
.map(|&i| expr.eval(&rows[i].1))
.collect::<Result<Vec<_>, _>>()?;
Ok(Some(values))
}
pub(super) fn arg_at(values: &ArgValues, pos: usize) -> Value {
values
.as_ref()
.and_then(|v| v.get(pos).cloned())
.unwrap_or(Value::Null)
}
pub(super) fn const_usize_arg(spec: &WindowFuncSpec, idx: usize, default: usize) -> usize {
spec.args
.get(idx)
.and_then(|e| match e {
SqlExpr::Literal(v) => v.as_f64().map(|n| n as usize),
_ => None,
})
.unwrap_or(default)
}
pub(super) fn const_default_arg(spec: &WindowFuncSpec, idx: usize) -> Value {
spec.args
.get(idx)
.and_then(|e| match e {
SqlExpr::Literal(v) => Some(v.clone()),
_ => None,
})
.unwrap_or(Value::Null)
}