houqp commented on a change in pull request #605: URL: https://github.com/apache/arrow-datafusion/pull/605#discussion_r664706662
########## File path: datafusion/src/logical_plan/plan.rs ########## @@ -354,6 +356,43 @@ impl LogicalPlan { | LogicalPlan::CreateExternalTable { .. } => vec![], } } + + /// returns all `Using` join columns in a logical plan + pub fn using_columns(&self) -> Result<Vec<HashSet<Column>>, DataFusionError> { + struct UsingJoinColumnVisitor { + using_columns: Vec<HashSet<Column>>, + } + + impl PlanVisitor for UsingJoinColumnVisitor { + type Error = DataFusionError; + + fn pre_visit(&mut self, plan: &LogicalPlan) -> Result<bool, Self::Error> { + if let LogicalPlan::Join { + join_constraint: JoinConstraint::Using, + on, + .. + } = plan + { + self.using_columns.push( + on.iter() + .map(|entry| { + std::iter::once(entry.0.clone()) + .chain(std::iter::once(entry.1.clone())) Review comment: i wanted to avoid an extra memory allocation incurred by `Vec::new`, but i will double check to see if once chain is actually generating the optimal code without memory allocations. -- 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...@arrow.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org