use crate::{NameId, StringId};
#[derive(Debug, Clone, PartialEq)]
pub enum Op {
Nop,
Seq(Vec<Op>),
Iterate { source: DataSource, body: Box<Op> },
Filter { cond: Condition, body: Box<Op> },
Insert {
relation: NameId,
args: Vec<Operand>,
},
Let {
var: NameId,
expr: Expr,
body: Box<Op>,
},
GroupBy {
source: NameId, vars: Vec<NameId>, keys: Vec<NameId>, aggregates: Vec<Aggregate>,
body: Box<Op>,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct Aggregate {
pub var: NameId,
pub func: NameId,
pub args: Vec<Operand>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum DataSource {
Scan { relation: NameId, vars: Vec<NameId> },
ScanDelta { relation: NameId, vars: Vec<NameId> },
IndexLookup {
relation: NameId,
col_idx: usize,
key: Operand,
vars: Vec<NameId>,
},
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum CmpOp {
Eq,
Neq,
Lt,
Le,
Gt,
Ge,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Condition {
Cmp {
op: CmpOp,
left: Operand,
right: Operand,
},
Negation {
relation: NameId,
args: Vec<Operand>,
},
Call {
function: NameId,
args: Vec<Operand>,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum Expr {
Value(Operand),
Call {
function: NameId,
args: Vec<Operand>,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum Operand {
Var(NameId),
Const(Constant),
}
#[derive(Clone, Debug, PartialEq)]
pub enum Constant {
Number(i64),
Float(f64),
String(StringId),
Name(NameId),
Time(i64),
Duration(i64),
}