use super::plan::*;
impl DslPlan {
fn inputs<'a>(&'a self, scratch: &mut Vec<&'a DslPlan>) {
use DslPlan::*;
match self {
Select { input, .. }
| GroupBy { input, .. }
| Filter { input, .. }
| Distinct { input, .. }
| Sort { input, .. }
| Slice { input, .. }
| HStack { input, .. }
| MatchToSchema { input, .. }
| MapFunction { input, .. }
| Sink { input, .. }
| Cache { input, .. } => scratch.push(input),
Union { inputs, .. } | HConcat { inputs, .. } | SinkMultiple { inputs } => {
scratch.extend(inputs)
},
PipeWithSchema { input, .. } => scratch.extend(input.iter()),
Join {
input_left,
input_right,
..
} => {
scratch.push(input_left);
scratch.push(input_right);
},
ExtContext { input, contexts } => {
scratch.push(input);
scratch.extend(contexts);
},
IR { dsl, .. } => scratch.push(dsl),
Scan { .. } | DataFrameScan { .. } => (),
#[cfg(feature = "pivot")]
Pivot { input, .. } => scratch.push(input),
#[cfg(feature = "python")]
PythonScan { .. } => (),
#[cfg(feature = "merge_sorted")]
MergeSorted {
input_left,
input_right,
..
} => {
scratch.push(input_left);
scratch.push(input_right);
},
}
}
}
pub struct DslPlanIter<'a> {
stack: Vec<&'a DslPlan>,
}
impl<'a> Iterator for DslPlanIter<'a> {
type Item = &'a DslPlan;
fn next(&mut self) -> Option<Self::Item> {
self.stack
.pop()
.inspect(|next| next.inputs(&mut self.stack))
}
}
impl<'a> IntoIterator for &'a DslPlan {
type Item = &'a DslPlan;
type IntoIter = DslPlanIter<'a>;
fn into_iter(self) -> Self::IntoIter {
DslPlanIter { stack: vec![self] }
}
}