vortex_expr/traversal/
operator.rs

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