datafusion_physical_expr_common/
tree_node.rs1use std::fmt::{self, Display, Formatter};
21use std::sync::Arc;
22
23use crate::physical_expr::{with_new_children_if_necessary, PhysicalExpr};
24
25use datafusion_common::tree_node::{ConcreteTreeNode, DynTreeNode};
26use datafusion_common::Result;
27
28impl DynTreeNode for dyn PhysicalExpr {
29 fn arc_children(&self) -> Vec<&Arc<Self>> {
30 self.children()
31 }
32
33 fn with_new_arc_children(
34 &self,
35 arc_self: Arc<Self>,
36 new_children: Vec<Arc<Self>>,
37 ) -> Result<Arc<Self>> {
38 with_new_children_if_necessary(arc_self, new_children)
39 }
40}
41
42#[derive(Debug)]
46pub struct ExprContext<T: Sized> {
47 pub expr: Arc<dyn PhysicalExpr>,
49 pub data: T,
51 pub children: Vec<Self>,
53}
54
55impl<T> ExprContext<T> {
56 pub fn new(expr: Arc<dyn PhysicalExpr>, data: T, children: Vec<Self>) -> Self {
57 Self {
58 expr,
59 data,
60 children,
61 }
62 }
63
64 pub fn update_expr_from_children(mut self) -> Result<Self> {
65 let children_expr = self.children.iter().map(|c| Arc::clone(&c.expr)).collect();
66 self.expr = with_new_children_if_necessary(self.expr, children_expr)?;
67 Ok(self)
68 }
69}
70
71impl<T: Default> ExprContext<T> {
72 pub fn new_default(plan: Arc<dyn PhysicalExpr>) -> Self {
73 let children = plan
74 .children()
75 .into_iter()
76 .cloned()
77 .map(Self::new_default)
78 .collect();
79 Self::new(plan, Default::default(), children)
80 }
81}
82
83impl<T: Display> Display for ExprContext<T> {
84 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
85 write!(f, "expr: {:?}", self.expr)?;
86 write!(f, "data:{}", self.data)?;
87 write!(f, "")
88 }
89}
90
91impl<T> ConcreteTreeNode for ExprContext<T> {
92 fn children(&self) -> &[Self] {
93 &self.children
94 }
95
96 fn take_children(mut self) -> (Self, Vec<Self>) {
97 let children = std::mem::take(&mut self.children);
98 (self, children)
99 }
100
101 fn with_new_children(mut self, children: Vec<Self>) -> Result<Self> {
102 self.children = children;
103 self.update_expr_from_children()
104 }
105}