use std::cell::Cell;
use indexmap::IndexSet;
use toasty_core::stmt;
use crate::engine::exec;
use super::{LogicalPlan, NodeId, Operation};
#[derive(Debug)]
pub(crate) struct Node {
pub(crate) op: Operation,
pub(crate) deps: IndexSet<NodeId>,
pub(crate) var: Cell<Option<exec::VarId>>,
pub(crate) num_uses: Cell<usize>,
pub(crate) visited: Cell<bool>,
}
impl Node {
pub(crate) fn ty(&self) -> &stmt::Type {
match &self.op {
Operation::Const(m) => &m.ty,
Operation::DeleteByKey(m) => &m.ty,
Operation::Eval(m) => &m.eval.ret,
Operation::ExecStatement(m) => &m.ty,
Operation::Filter(m) => &m.ty,
Operation::FindPkByIndex(m) => &m.ty,
Operation::GetByKey(m) => &m.ty,
Operation::Guard(m) => &m.ty,
Operation::QueryPk(m) => &m.ty,
Operation::Project(m) => &m.ty,
Operation::UpdateByKey(m) => &m.ty,
Operation::NestedMerge(_m) => todo!(),
Operation::ReadModifyWrite(m) => &m.ty,
}
}
pub(crate) fn to_exec(
&self,
logical_plan: &LogicalPlan,
var_table: &mut exec::VarDecls,
) -> exec::Action {
match &self.op {
Operation::Const(op) => op.to_exec(self, var_table).into(),
Operation::DeleteByKey(op) => op.to_exec(logical_plan, self, var_table).into(),
Operation::Eval(op) => op.to_exec(logical_plan, self, var_table).into(),
Operation::ExecStatement(op) => op.to_exec(logical_plan, self, var_table).into(),
Operation::Filter(op) => op.to_exec(logical_plan, self, var_table).into(),
Operation::FindPkByIndex(op) => op.to_exec(logical_plan, self, var_table).into(),
Operation::GetByKey(op) => op.to_exec(logical_plan, self, var_table).into(),
Operation::Guard(op) => op.to_exec(logical_plan, self, var_table).into(),
Operation::NestedMerge(op) => op.to_exec(logical_plan, self, var_table).into(),
Operation::Project(op) => op.to_exec(logical_plan, self, var_table).into(),
Operation::ReadModifyWrite(op) => op.to_exec(logical_plan, self, var_table).into(),
Operation::QueryPk(op) => op.to_exec(logical_plan, self, var_table).into(),
Operation::UpdateByKey(op) => op.to_exec(logical_plan, self, var_table).into(),
}
}
}