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, PartialEq, 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    PartialEq,
51    Eq,
52    serde::Serialize,
53    serde::Deserialize,
54    zerompk::ToMessagePack,
55    zerompk::FromMessagePack,
56)]
57#[msgpack(c_enum)]
58pub enum BinaryOp {
59    Add,
60    Sub,
61    Mul,
62    Div,
63    Mod,
64    Eq,
65    NotEq,
66    Gt,
67    GtEq,
68    Lt,
69    LtEq,
70    And,
71    Or,
72    Concat,
73}
74
75/// Target types for CAST.
76#[derive(
77    Debug,
78    Clone,
79    PartialEq,
80    Eq,
81    serde::Serialize,
82    serde::Deserialize,
83    zerompk::ToMessagePack,
84    zerompk::FromMessagePack,
85)]
86#[msgpack(c_enum)]
87pub enum CastType {
88    Int,
89    Float,
90    String,
91    Bool,
92}
93
94/// A computed projection column: alias + expression.
95#[derive(
96    Debug,
97    Clone,
98    serde::Serialize,
99    serde::Deserialize,
100    zerompk::ToMessagePack,
101    zerompk::FromMessagePack,
102)]
103pub struct ComputedColumn {
104    pub alias: String,
105    pub expr: SqlExpr,
106}