vortex_expr/traversal/
operator.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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}