vortex_expr/traversal/
operator.rs1use itertools::Itertools;
5use vortex_array::pipeline::OperatorRef;
6use vortex_error::VortexResult;
7
8use crate::traversal::{Node, NodeContainer, Transformed, TraversalOrder};
9
10impl<'a> NodeContainer<'a, Self> for OperatorRef {
11 fn apply_elements<F: FnMut(&'a Self) -> VortexResult<TraversalOrder>>(
12 &'a self,
13 mut f: F,
14 ) -> VortexResult<TraversalOrder> {
15 f(self)
16 }
17
18 fn map_elements<F: FnMut(Self) -> VortexResult<Transformed<Self>>>(
19 self,
20 mut f: F,
21 ) -> VortexResult<Transformed<Self>> {
22 f(self)
23 }
24}
25
26impl Node for OperatorRef {
27 fn apply_children<'a, F: FnMut(&'a Self) -> VortexResult<TraversalOrder>>(
28 &'a self,
29 _f: F,
30 ) -> VortexResult<TraversalOrder> {
31 todo!()
32 }
33
34 fn map_children<F: FnMut(Self) -> VortexResult<Transformed<Self>>>(
35 self,
36 f: F,
37 ) -> VortexResult<Transformed<Self>> {
38 let transformed = self
39 .children()
40 .iter()
41 .cloned()
42 .collect_vec()
43 .map_elements(f)?;
44
45 if transformed.changed {
46 Ok(Transformed {
47 value: self.with_children(transformed.value),
48 order: transformed.order,
49 changed: true,
50 })
51 } else {
52 Ok(Transformed::no(self))
53 }
54 }
55
56 fn iter_children<T>(&self, f: impl FnOnce(&mut dyn Iterator<Item = &Self>) -> T) -> T {
57 f(&mut self.children().iter())
58 }
59
60 fn children_count(&self) -> usize {
61 self.children().len()
62 }
63}