use std::collections::HashMap;
use crate::analyze::conjunction::{Conjunction, ConjunctionID, Variable};
#[derive(Debug, Clone)]
pub struct Pipeline {
pub conjunctions: Vec<Conjunction>,
pub stages: Vec<PipelineStage>,
pub variable_info: HashMap<Variable, VariableInfo>,
pub outputs: Vec<Variable>,
}
impl Pipeline {
pub fn variable_name(&self, variable: &Variable) -> Option<&str> {
self.variable_info.get(variable).map(|v| v.name.as_str())
}
}
#[derive(Debug, Clone)]
pub struct VariableInfo {
pub name: String,
}
#[derive(Debug, Clone)]
pub enum PipelineStage {
Match {
block: ConjunctionID,
},
Insert {
block: ConjunctionID,
},
Put {
block: ConjunctionID,
},
Update {
block: ConjunctionID,
},
Delete {
block: ConjunctionID,
deleted_variables: Vec<Variable>,
},
Select { variables: Vec<Variable> },
Sort { variables: Vec<SortVariable> },
Require { variables: Vec<Variable> },
Offset { offset: u64 },
Limit { limit: u64 },
Distinct,
Reduce { reducers: Vec<ReduceAssignment>, groupby: Vec<Variable> },
}
#[derive(Debug, Clone)]
pub struct ReduceAssignment {
pub assigned: Variable,
pub reducer: Reducer,
}
#[derive(Debug, Clone)]
pub struct Reducer {
pub arguments: Vec<Variable>,
pub reducer: String,
}
#[derive(Debug, Clone)]
pub struct SortVariable {
pub variable: Variable,
pub order: SortOrder,
}
#[repr(C)]
#[derive(Debug, Clone)]
pub enum SortOrder {
Ascending,
Descending,
}