@@ -79,3 +79,75 @@ impl TreeNode for LogicalPlan {
7979 Ok ( tnr)
8080 }
8181}
82+
83+ #[ cfg( test) ]
84+ mod test {
85+ use crate :: { LogicalPlanBuilder , LogicalPlan } ;
86+ use datafusion_common:: tree_node:: { Transformed , TreeNode , TreeNodeRecursion } ;
87+ use std:: time:: Instant ;
88+
89+ fn create_union_tree ( level : u32 ) -> LogicalPlanBuilder {
90+ if level == 0 {
91+ LogicalPlanBuilder :: empty ( true )
92+ } else {
93+ create_union_tree ( level - 1 ) . union ( create_union_tree ( level - 1 ) . build ( ) . unwrap ( ) ) . unwrap ( )
94+ }
95+ }
96+
97+ #[ test]
98+ fn transform_test ( ) {
99+ let now = Instant :: now ( ) ;
100+ let mut union_tree = create_union_tree ( 25 ) . build ( ) . unwrap ( ) ;
101+ println ! ( "create_union_tree: {}" , now. elapsed( ) . as_millis( ) ) ;
102+
103+ let now = Instant :: now ( ) ;
104+ union_tree = union_tree
105+ . transform_down_old ( & mut |p| Ok ( Transformed :: No ( p) ) )
106+ . unwrap ( ) ;
107+ println ! ( "union_tree.transform_down_old: {}" , now. elapsed( ) . as_millis( ) ) ;
108+
109+ let now = Instant :: now ( ) ;
110+ let mut union_tree_clone = union_tree. clone ( ) ;
111+ println ! ( "union_tree.clone: {}" , now. elapsed( ) . as_millis( ) ) ;
112+
113+ let now = Instant :: now ( ) ;
114+ union_tree_clone
115+ . transform_down ( & mut |_p| Ok ( TreeNodeRecursion :: Continue ) )
116+ . unwrap ( ) ;
117+ println ! (
118+ "union_tree_clone.transform_down: {}" ,
119+ now. elapsed( ) . as_millis( )
120+ ) ;
121+
122+ println ! ( "results: {}" , union_tree == union_tree_clone) ;
123+
124+ let now = Instant :: now ( ) ;
125+ union_tree = union_tree
126+ . transform_down_old ( & mut |p| match p {
127+ LogicalPlan :: EmptyRelation ( _) => Ok ( Transformed :: Yes ( LogicalPlanBuilder :: empty ( false ) . build ( ) . unwrap ( ) ) ) ,
128+ o => Ok ( Transformed :: No ( o) ) ,
129+ } )
130+ . unwrap ( ) ;
131+ println ! (
132+ "union_tree.transform_down_old 2: {}" ,
133+ now. elapsed( ) . as_millis( )
134+ ) ;
135+
136+ let now = Instant :: now ( ) ;
137+ union_tree_clone
138+ . transform_down ( & mut |p| match p {
139+ LogicalPlan :: EmptyRelation ( _) => {
140+ * p = LogicalPlanBuilder :: empty ( false ) . build ( ) . unwrap ( ) ;
141+ Ok ( TreeNodeRecursion :: Continue )
142+ }
143+ _ => Ok ( TreeNodeRecursion :: Continue ) ,
144+ } )
145+ . unwrap ( ) ;
146+ println ! (
147+ "union_tree_clone.transform_down 2: {}" ,
148+ now. elapsed( ) . as_millis( )
149+ ) ;
150+
151+ println ! ( "results: {}" , union_tree == union_tree_clone) ;
152+ }
153+ }
0 commit comments