use crate::ast::{AggFunc, AlterAction, Assignment, Expr, JoinKind, WindowFunc};
#[derive(Debug, Clone)]
pub struct CreateField {
pub name: String,
pub type_name: String,
pub required: bool,
pub unique: bool,
}
#[derive(Debug, Clone)]
pub enum PlanNode {
SeqScan {
table: String,
},
AliasScan {
table: String,
alias: String,
},
IndexScan {
table: String,
column: String,
key: Expr,
},
RangeScan {
table: String,
column: String,
start: Option<(Expr, bool)>,
end: Option<(Expr, bool)>,
},
Filter {
input: Box<PlanNode>,
predicate: Expr,
},
Project {
input: Box<PlanNode>,
fields: Vec<ProjectField>,
},
Sort {
input: Box<PlanNode>,
keys: Vec<SortKey>,
},
Limit {
input: Box<PlanNode>,
count: Expr,
},
Offset {
input: Box<PlanNode>,
count: Expr,
},
Aggregate {
input: Box<PlanNode>,
function: AggFunc,
field: Option<String>,
},
NestedLoopJoin {
left: Box<PlanNode>,
right: Box<PlanNode>,
on: Option<Expr>,
kind: JoinKind,
},
Distinct {
input: Box<PlanNode>,
},
GroupBy {
input: Box<PlanNode>,
keys: Vec<String>,
aggregates: Vec<GroupAgg>,
having: Option<Expr>,
},
AlterTable {
table: String,
action: AlterAction,
},
DropTable {
name: String,
},
Insert {
table: String,
rows: Vec<Vec<Assignment>>,
},
Upsert {
table: String,
key_column: String,
assignments: Vec<Assignment>,
on_conflict: Vec<Assignment>,
},
Update {
input: Box<PlanNode>,
table: String,
assignments: Vec<Assignment>,
},
Delete {
input: Box<PlanNode>,
table: String,
},
CreateTable {
name: String,
fields: Vec<CreateField>,
},
CreateView {
name: String,
query_text: String,
},
RefreshView {
name: String,
},
DropView {
name: String,
},
Window {
input: Box<PlanNode>,
windows: Vec<WindowDef>,
},
Union {
left: Box<PlanNode>,
right: Box<PlanNode>,
all: bool,
},
Explain {
input: Box<PlanNode>,
},
Begin,
Commit,
Rollback,
}
#[derive(Debug, Clone)]
pub struct ProjectField {
pub alias: Option<String>,
pub expr: Expr,
}
#[derive(Debug, Clone)]
pub struct SortKey {
pub field: String,
pub descending: bool,
}
#[derive(Debug, Clone)]
pub struct GroupAgg {
pub function: AggFunc,
pub field: String,
pub output_name: String,
}
#[derive(Debug, Clone)]
pub struct WindowDef {
pub function: WindowFunc,
pub args: Vec<Expr>,
pub partition_by: Vec<String>,
pub order_by: Vec<SortKey>,
pub output_name: String,
}