#![allow(dead_code)]
use std::sync::Arc;
#[derive(Debug, Clone)]
pub enum SqlExpr {
Lit(LitValue),
JsonPath {
root: String,
path: JsonPath,
},
Param(usize),
ColRef(String),
Cast {
inner: Box<SqlExpr>,
ty: SqlType,
},
BinOp {
op: BinOp,
lhs: Box<SqlExpr>,
rhs: Box<SqlExpr>,
},
UnaryOp {
op: UnaryOp,
inner: Box<SqlExpr>,
},
Case {
arms: Vec<(SqlExpr, SqlExpr)>,
else_: Option<Box<SqlExpr>>,
},
Coalesce(Vec<SqlExpr>),
NullIf(Box<SqlExpr>, Box<SqlExpr>),
AsJson(Box<SqlExpr>),
JsonAgg(Box<SubQuery>),
Scalar(Box<SubQuery>),
Exists(Box<SubQuery>),
CountSub(Box<SubQuery>),
Alias {
name: String,
inner: Box<SqlExpr>,
},
ReferenceKey {
reference: Box<SqlExpr>,
expected_type: Option<String>,
},
Boundary {
side: BoundarySide,
kind: BoundaryKind,
source: Box<SqlExpr>,
},
WhereExists {
focus: Box<SqlExpr>,
iter_alias: String,
predicate: Box<SqlExpr>,
negate: bool,
},
WhereScalar {
focus: Box<SqlExpr>,
iter_alias: String,
predicate: Box<SqlExpr>,
projection: Box<SqlExpr>,
},
JoinAggregate {
outer_focus: Box<SqlExpr>,
outer_alias: String,
inner_field: String,
inner_alias: String,
separator: String,
},
CollectionAgg {
root: String,
path: JsonPath,
},
ScalarFromChain {
chain_sql: String,
projection: Box<SqlExpr>,
offset: i64,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BoundarySide {
Low,
High,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BoundaryKind {
Decimal,
Date,
DateTime,
Time,
}
#[derive(Debug, Clone)]
pub enum LitValue {
Null,
Bool(bool),
Int(i64),
Decimal(String),
Str(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SqlType {
Text,
Integer,
Decimal,
Boolean,
Json,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum JsonType {
Object,
Array,
String,
Number,
Boolean,
Null,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinOp {
Eq,
Neq,
Lt,
Lte,
Gt,
Gte,
Add,
Sub,
Mul,
Div,
And,
Or,
Concat,
Like,
RegexMatch,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnaryOp {
Not,
IsNull,
IsNotNull,
Neg,
}
#[derive(Debug, Clone, Default)]
pub struct JsonPath(pub Vec<PathStep>);
impl JsonPath {
pub fn new() -> Self {
Self(Vec::new())
}
pub fn push(&mut self, step: PathStep) {
self.0.push(step);
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PathStep {
Field(String),
Index(i64),
OfType(String),
TypeFilter(JsonType),
}
#[derive(Debug, Clone)]
pub enum PlanNode {
Scan {
alias: String,
resource_type: String,
},
LateralUnnest {
parent: Box<PlanNode>,
source: SqlExpr,
out_alias: String,
left_join: bool,
on_filter: Option<SqlExpr>,
flat_index: Option<i64>,
},
Filter {
parent: Box<PlanNode>,
predicate: SqlExpr,
},
Project {
parent: Box<PlanNode>,
columns: Vec<Column>,
},
Union(Vec<PlanNode>),
Recurse {
parent: Box<PlanNode>,
seed: SqlExpr,
step_paths: Vec<JsonPath>,
out_alias: String,
},
}
#[derive(Debug, Clone)]
pub struct Column {
pub name: String,
pub expr: SqlExpr,
pub collection: bool,
pub ty: SqlType,
}
#[derive(Debug, Clone)]
pub struct SubQuery {
pub plan: PlanNode,
pub select_expr: SqlExpr,
}
pub type DialectRef = Arc<dyn super::dialect::Dialect>;