Skip to main content

nodedb_query/expr/
types.rs

1//! SqlExpr AST node definitions.
2
3use nodedb_types::Value;
4
5/// A serializable SQL expression that can be evaluated against a document.
6#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
7pub enum SqlExpr {
8    /// Column reference: extract field value from the document.
9    Column(String),
10    /// Literal value.
11    Literal(Value),
12    /// Binary operation: left op right.
13    BinaryOp {
14        left: Box<SqlExpr>,
15        op: BinaryOp,
16        right: Box<SqlExpr>,
17    },
18    /// Unary negation: -expr or NOT expr.
19    Negate(Box<SqlExpr>),
20    /// Scalar function call.
21    Function { name: String, args: Vec<SqlExpr> },
22    /// CAST(expr AS type).
23    Cast {
24        expr: Box<SqlExpr>,
25        to_type: CastType,
26    },
27    /// CASE WHEN cond1 THEN val1 ... ELSE default END.
28    Case {
29        operand: Option<Box<SqlExpr>>,
30        when_thens: Vec<(SqlExpr, SqlExpr)>,
31        else_expr: Option<Box<SqlExpr>>,
32    },
33    /// COALESCE(expr1, expr2, ...): first non-null value.
34    Coalesce(Vec<SqlExpr>),
35    /// NULLIF(expr1, expr2): returns NULL if expr1 = expr2, else expr1.
36    NullIf(Box<SqlExpr>, Box<SqlExpr>),
37    /// IS NULL / IS NOT NULL.
38    IsNull { expr: Box<SqlExpr>, negated: bool },
39    /// OLD column reference: extract field value from the pre-update document.
40    /// Used in TRANSITION CHECK predicates. Resolves against the OLD row
41    /// when evaluated via `eval_with_old()`. Returns NULL in normal `eval()`.
42    OldColumn(String),
43}
44
45/// Binary operators.
46#[derive(
47    Debug,
48    Clone,
49    Copy,
50    serde::Serialize,
51    serde::Deserialize,
52    zerompk::ToMessagePack,
53    zerompk::FromMessagePack,
54)]
55#[msgpack(c_enum)]
56pub enum BinaryOp {
57    Add,
58    Sub,
59    Mul,
60    Div,
61    Mod,
62    Eq,
63    NotEq,
64    Gt,
65    GtEq,
66    Lt,
67    LtEq,
68    And,
69    Or,
70    Concat,
71}
72
73/// Target types for CAST.
74#[derive(
75    Debug,
76    Clone,
77    serde::Serialize,
78    serde::Deserialize,
79    zerompk::ToMessagePack,
80    zerompk::FromMessagePack,
81)]
82#[msgpack(c_enum)]
83pub enum CastType {
84    Int,
85    Float,
86    String,
87    Bool,
88}
89
90/// A computed projection column: alias + expression.
91#[derive(
92    Debug,
93    Clone,
94    serde::Serialize,
95    serde::Deserialize,
96    zerompk::ToMessagePack,
97    zerompk::FromMessagePack,
98)]
99pub struct ComputedColumn {
100    pub alias: String,
101    pub expr: SqlExpr,
102}