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