use nodedb_types::Value;
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
pub enum SqlExpr {
Column(String),
Literal(Value),
BinaryOp {
left: Box<SqlExpr>,
op: BinaryOp,
right: Box<SqlExpr>,
},
Negate(Box<SqlExpr>),
Function { name: String, args: Vec<SqlExpr> },
Cast {
expr: Box<SqlExpr>,
to_type: CastType,
},
Case {
operand: Option<Box<SqlExpr>>,
when_thens: Vec<(SqlExpr, SqlExpr)>,
else_expr: Option<Box<SqlExpr>>,
},
Coalesce(Vec<SqlExpr>),
NullIf(Box<SqlExpr>, Box<SqlExpr>),
IsNull { expr: Box<SqlExpr>, negated: bool },
OldColumn(String),
ExcludedColumn(String),
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
#[msgpack(c_enum)]
pub enum BinaryOp {
Add,
Sub,
Mul,
Div,
Mod,
Eq,
NotEq,
Gt,
GtEq,
Lt,
LtEq,
And,
Or,
Concat,
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
#[msgpack(c_enum)]
pub enum CastType {
Int,
Float,
String,
Bool,
}
#[derive(
Debug,
Clone,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct ComputedColumn {
pub alias: String,
pub expr: SqlExpr,
}
#[derive(
Debug,
Clone,
PartialEq,
serde::Serialize,
serde::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct GroupKeySpec {
pub output_name: String,
pub field: Option<String>,
pub expr: Option<SqlExpr>,
}
impl GroupKeySpec {
pub fn column(name: impl Into<String>) -> Self {
let name = name.into();
Self {
output_name: name.clone(),
field: Some(name),
expr: None,
}
}
}