use std::cell::Cell;
use indexmap::{IndexSet, indexset};
use crate::engine::mir::Eval;
use super::{
Const, DeleteByKey, ExecStatement, Filter, FindPkByIndex, GetByKey, Guard, NestedMerge, Node,
Project, QueryPk, ReadModifyWrite, UpdateByKey,
};
#[derive(Debug)]
pub(crate) enum Operation {
Const(Const),
DeleteByKey(DeleteByKey),
Eval(Eval),
ExecStatement(Box<ExecStatement>),
Filter(Filter),
FindPkByIndex(FindPkByIndex),
GetByKey(GetByKey),
Guard(Guard),
NestedMerge(NestedMerge),
Project(Project),
ReadModifyWrite(Box<ReadModifyWrite>),
QueryPk(QueryPk),
UpdateByKey(UpdateByKey),
}
impl From<Operation> for Node {
fn from(value: Operation) -> Self {
let deps = match &value {
Operation::Const(_m) => IndexSet::new(),
Operation::DeleteByKey(m) => indexset![m.input],
Operation::Eval(m) => m.inputs.clone(),
Operation::ExecStatement(m) => m.inputs.clone(),
Operation::Filter(m) => indexset![m.input],
Operation::FindPkByIndex(m) => m.inputs.clone(),
Operation::GetByKey(m) => {
indexset![m.input]
}
Operation::Guard(m) => {
let mut deps = indexset![m.input];
deps.extend(m.guard_inputs.iter().copied());
deps
}
Operation::NestedMerge(m) => m.inputs.clone(),
Operation::Project(m) => indexset![m.input],
Operation::ReadModifyWrite(m) => m.inputs.clone(),
Operation::QueryPk(m) => m.input.into_iter().collect(),
Operation::UpdateByKey(m) => indexset![m.input],
};
Node {
op: value,
deps,
var: Cell::new(None),
num_uses: Cell::new(0),
visited: Cell::new(false),
}
}
}