(ctx: &EvalContext, expr: &Expr)
| 94 | } |
| 95 | |
| 96 | pub(crate) fn eval(ctx: &EvalContext, expr: &Expr) -> Result<Value, PromqlError> { |
| 97 | match expr { |
| 98 | Expr::Scalar(v) => Ok(Value::Scalar(*v, ctx.timestamp_ms)), |
| 99 | Expr::StringLiteral(_) => Err(PromqlError::TypeError { |
| 100 | context: "evaluation".to_string(), |
| 101 | detail: "string literals not supported in evaluation".to_string(), |
| 102 | }), |
| 103 | Expr::VectorSelector { |
| 104 | name, |
| 105 | matchers, |
| 106 | offset, |
| 107 | } => selector::eval_vector_selector(ctx, name.as_deref(), matchers, *offset), |
| 108 | Expr::MatrixSelector { selector, range } => { |
| 109 | selector::eval_matrix_selector(ctx, selector, *range) |
| 110 | } |
| 111 | Expr::Paren(inner) => eval(ctx, inner), |
| 112 | Expr::Negate(inner) => { |
| 113 | let val = eval(ctx, inner)?; |
| 114 | Ok(helpers::negate_value(val, ctx.timestamp_ms)) |
| 115 | } |
| 116 | Expr::BinaryOp { |
| 117 | op, |
| 118 | lhs, |
| 119 | rhs, |
| 120 | return_bool, |
| 121 | .. |
| 122 | } => { |
| 123 | let l = eval(ctx, lhs)?; |
| 124 | let r = eval(ctx, rhs)?; |
| 125 | binary::eval_binary_op(*op, l, r, *return_bool, ctx.timestamp_ms) |
| 126 | } |
| 127 | Expr::Aggregate { |
| 128 | op, |
| 129 | expr: inner, |
| 130 | param, |
| 131 | grouping, |
| 132 | } => { |
| 133 | let val = eval(ctx, inner)?; |
| 134 | let p = match param { |
| 135 | Some(p) => { |
| 136 | if let Value::Scalar(v, _) = eval(ctx, p)? { |
| 137 | Some(v) |
| 138 | } else { |
| 139 | None |
| 140 | } |
| 141 | } |
| 142 | None => None, |
| 143 | }; |
| 144 | aggregate::eval_aggregation(*op, val, p, grouping, ctx.timestamp_ms) |
| 145 | } |
| 146 | Expr::Call { func, args } => call::eval_call(ctx, func, args), |
| 147 | Expr::Subquery { |
| 148 | expr: inner, |
| 149 | range, |
| 150 | step, |
| 151 | } => eval_subquery(ctx, inner, *range, *step), |
| 152 | } |
| 153 | } |
no test coverage detected