diff --git a/datafusion/expr/src/tree_node/expr.rs b/datafusion/expr/src/tree_node/expr.rs index ee775b4012de..ac101659b72c 100644 --- a/datafusion/expr/src/tree_node/expr.rs +++ b/datafusion/expr/src/tree_node/expr.rs @@ -480,3 +480,37 @@ where } Ok(v) } + +#[cfg(test)] +mod test { + use std::time::Instant; + use datafusion_common::tree_node::{Transformed, TreeNode, TreeNodeRecursion}; + use crate::{lit, Expr, and}; + + fn create_and_tree(level: u32) -> Expr { + if level == 0 { + lit(true) + } else { + and(create_and_tree(level - 1), create_and_tree(level - 1)) + } + } + + #[test] + fn transform_test() { + let now = Instant::now(); + let mut and_tree = create_and_tree(25); + println!("create_and_tree: {}", now.elapsed().as_millis()); + + let now = Instant::now(); + and_tree = and_tree.transform_down_old(&mut |e| Ok(Transformed::No(e))).unwrap(); + println!("and_tree.transform_down_old: {}", now.elapsed().as_millis()); + + let now = Instant::now(); + let mut and_tree_clone = and_tree.clone(); + println!("and_tree.clone: {}", now.elapsed().as_millis()); + + let now = Instant::now(); + and_tree_clone.transform_down(&mut |e| Ok(TreeNodeRecursion::Continue)).unwrap(); + println!("and_tree_clone.transform_down: {}", now.elapsed().as_millis()); + } +}