use crate::planning::plan::logical::logical_node_enum::LogicalNodeEnum;
pub trait LogicalNode {
fn id(&self) -> i64;
fn name(&self) -> &'static str;
fn output_var(&self) -> Option<&str>;
fn col_names(&self) -> &[String];
fn set_output_var(&mut self, var: String);
fn set_col_names(&mut self, names: Vec<String>);
fn into_enum(self) -> LogicalNodeEnum;
}
pub trait LogicalZeroInputNode: LogicalNode {}
pub trait LogicalSingleInputNode: LogicalNode {
fn input(&self) -> &LogicalNodeEnum;
fn input_mut(&mut self) -> &mut LogicalNodeEnum;
fn set_input(&mut self, input: LogicalNodeEnum);
fn take_input(&mut self) -> Option<LogicalNodeEnum>;
}
pub trait LogicalBinaryInputNode: LogicalNode {
fn left_input(&self) -> &LogicalNodeEnum;
fn right_input(&self) -> &LogicalNodeEnum;
fn left_input_mut(&mut self) -> &mut LogicalNodeEnum;
fn right_input_mut(&mut self) -> &mut LogicalNodeEnum;
fn set_left_input(&mut self, input: LogicalNodeEnum);
fn set_right_input(&mut self, input: LogicalNodeEnum);
}
pub trait LogicalJoinNode: LogicalBinaryInputNode {
fn hash_keys(&self) -> &[linkrs_core::types::expr::contextual::ContextualExpression];
fn probe_keys(&self) -> &[linkrs_core::types::expr::contextual::ContextualExpression];
}
pub trait LogicalMultipleInputNode: LogicalNode {
fn inputs(&self) -> &[LogicalNodeEnum];
fn inputs_mut(&mut self) -> &mut Vec<LogicalNodeEnum>;
fn add_input(&mut self, input: LogicalNodeEnum);
fn remove_input(&mut self, index: usize) -> Result<(), String>;
}