peter-toth commented on code in PR #13467:
URL: https://github.com/apache/datafusion/pull/13467#discussion_r1848124393


##########
datafusion/expr/src/logical_plan/tree_node.rs:
##########
@@ -423,54 +405,40 @@ impl LogicalPlan {
         mut f: F,
     ) -> Result<TreeNodeRecursion> {
         match self {
-            LogicalPlan::Projection(Projection { expr, .. }) => {
-                expr.iter().apply_until_stop(f)
-            }
-            LogicalPlan::Values(Values { values, .. }) => values
-                .iter()
-                .apply_until_stop(|value| value.iter().apply_until_stop(&mut 
f)),
+            LogicalPlan::Projection(Projection { expr, .. }) => 
expr.apply_elements(f),
+            LogicalPlan::Values(Values { values, .. }) => 
values.apply_elements(f),
             LogicalPlan::Filter(Filter { predicate, .. }) => f(predicate),
             LogicalPlan::Repartition(Repartition {
                 partitioning_scheme,
                 ..
             }) => match partitioning_scheme {
                 Partitioning::Hash(expr, _) | Partitioning::DistributeBy(expr) 
=> {
-                    expr.iter().apply_until_stop(f)
+                    expr.apply_elements(f)
                 }
                 Partitioning::RoundRobinBatch(_) => 
Ok(TreeNodeRecursion::Continue),
             },
             LogicalPlan::Window(Window { window_expr, .. }) => {
-                window_expr.iter().apply_until_stop(f)
+                window_expr.apply_elements(f)
             }
             LogicalPlan::Aggregate(Aggregate {
                 group_expr,
                 aggr_expr,
                 ..
-            }) => group_expr
-                .iter()
-                .chain(aggr_expr.iter())
-                .apply_until_stop(f),
+            }) => (group_expr, aggr_expr).apply_ref_elements(f),
             // There are two part of expression for join, equijoin(on) and 
non-equijoin(filter).
             // 1. the first part is `on.len()` equijoin expressions, and the 
struct of each expr is `left-on = right-on`.
             // 2. the second part is non-equijoin(filter).
             LogicalPlan::Join(Join { on, filter, .. }) => {
-                on.iter()
-                    // TODO: why we need to create an `Expr::eq`? Cloning 
`Expr` is costly...

Review Comment:
   Oops, I didn't want to remove the artificial `Expr::eq` between the left and 
right sides as some rules might depend on it. (Unfortunately that artificial 
node requires the clone...)
   But actually it is a bit weird that removing it didn't cause any test 
failures...



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org
For additional commands, e-mail: github-h...@datafusion.apache.org

Reply via email to