This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 5aa7c4ae79 Minor: Remove clone in optimizer (#11315)
5aa7c4ae79 is described below
commit 5aa7c4ae7977cd043f28c4f55e07fa72d278a7b7
Author: Jay Zhan <[email protected]>
AuthorDate: Mon Jul 8 03:52:31 2024 +0800
Minor: Remove clone in optimizer (#11315)
* rm clone
Signed-off-by: jayzhan211 <[email protected]>
* outer join + fix test
Signed-off-by: jayzhan211 <[email protected]>
---------
Signed-off-by: jayzhan211 <[email protected]>
---
datafusion/optimizer/src/eliminate_nested_union.rs | 34 ++++++++++++----------
datafusion/optimizer/src/eliminate_outer_join.rs | 13 ++++++---
.../optimizer/src/propagate_empty_relation.rs | 4 ++-
3 files changed, 31 insertions(+), 20 deletions(-)
diff --git a/datafusion/optimizer/src/eliminate_nested_union.rs
b/datafusion/optimizer/src/eliminate_nested_union.rs
index 09407aed53..3732f7ed90 100644
--- a/datafusion/optimizer/src/eliminate_nested_union.rs
+++ b/datafusion/optimizer/src/eliminate_nested_union.rs
@@ -21,7 +21,9 @@ use crate::{OptimizerConfig, OptimizerRule};
use datafusion_common::tree_node::Transformed;
use datafusion_common::Result;
use datafusion_expr::expr_rewriter::coerce_plan_expr_for_schema;
+use datafusion_expr::logical_plan::tree_node::unwrap_arc;
use datafusion_expr::{Distinct, LogicalPlan, Union};
+use itertools::Itertools;
use std::sync::Arc;
#[derive(Default)]
@@ -56,32 +58,34 @@ impl OptimizerRule for EliminateNestedUnion {
match plan {
LogicalPlan::Union(Union { inputs, schema }) => {
let inputs = inputs
- .iter()
+ .into_iter()
.flat_map(extract_plans_from_union)
.collect::<Vec<_>>();
Ok(Transformed::yes(LogicalPlan::Union(Union {
- inputs,
+ inputs: inputs.into_iter().map(Arc::new).collect_vec(),
schema,
})))
}
- LogicalPlan::Distinct(Distinct::All(ref nested_plan)) => {
- match nested_plan.as_ref() {
+ LogicalPlan::Distinct(Distinct::All(nested_plan)) => {
+ match unwrap_arc(nested_plan) {
LogicalPlan::Union(Union { inputs, schema }) => {
let inputs = inputs
- .iter()
+ .into_iter()
.map(extract_plan_from_distinct)
.flat_map(extract_plans_from_union)
.collect::<Vec<_>>();
Ok(Transformed::yes(LogicalPlan::Distinct(Distinct::All(
Arc::new(LogicalPlan::Union(Union {
- inputs,
+ inputs:
inputs.into_iter().map(Arc::new).collect_vec(),
schema: schema.clone(),
})),
))))
}
- _ => Ok(Transformed::no(plan)),
+ nested_plan => Ok(Transformed::no(LogicalPlan::Distinct(
+ Distinct::All(Arc::new(nested_plan)),
+ ))),
}
}
_ => Ok(Transformed::no(plan)),
@@ -89,20 +93,20 @@ impl OptimizerRule for EliminateNestedUnion {
}
}
-fn extract_plans_from_union(plan: &Arc<LogicalPlan>) -> Vec<Arc<LogicalPlan>> {
- match plan.as_ref() {
+fn extract_plans_from_union(plan: Arc<LogicalPlan>) -> Vec<LogicalPlan> {
+ match unwrap_arc(plan) {
LogicalPlan::Union(Union { inputs, schema }) => inputs
- .iter()
- .map(|plan| Arc::new(coerce_plan_expr_for_schema(plan,
schema).unwrap()))
+ .into_iter()
+ .map(|plan| coerce_plan_expr_for_schema(&plan, &schema).unwrap())
.collect::<Vec<_>>(),
- _ => vec![plan.clone()],
+ plan => vec![plan],
}
}
-fn extract_plan_from_distinct(plan: &Arc<LogicalPlan>) -> &Arc<LogicalPlan> {
- match plan.as_ref() {
+fn extract_plan_from_distinct(plan: Arc<LogicalPlan>) -> Arc<LogicalPlan> {
+ match unwrap_arc(plan) {
LogicalPlan::Distinct(Distinct::All(plan)) => plan,
- _ => plan,
+ plan => Arc::new(plan),
}
}
diff --git a/datafusion/optimizer/src/eliminate_outer_join.rs
b/datafusion/optimizer/src/eliminate_outer_join.rs
index ccc637a0eb..13c483c6df 100644
--- a/datafusion/optimizer/src/eliminate_outer_join.rs
+++ b/datafusion/optimizer/src/eliminate_outer_join.rs
@@ -18,6 +18,7 @@
//! [`EliminateOuterJoin`] converts `LEFT/RIGHT/FULL` joins to `INNER` joins
use crate::{OptimizerConfig, OptimizerRule};
use datafusion_common::{Column, DFSchema, Result};
+use datafusion_expr::logical_plan::tree_node::unwrap_arc;
use datafusion_expr::logical_plan::{Join, JoinType, LogicalPlan};
use datafusion_expr::{Expr, Filter, Operator};
@@ -78,7 +79,7 @@ impl OptimizerRule for EliminateOuterJoin {
_config: &dyn OptimizerConfig,
) -> Result<Transformed<LogicalPlan>> {
match plan {
- LogicalPlan::Filter(filter) => match filter.input.as_ref() {
+ LogicalPlan::Filter(mut filter) => match unwrap_arc(filter.input) {
LogicalPlan::Join(join) => {
let mut non_nullable_cols: Vec<Column> = vec![];
@@ -109,9 +110,10 @@ impl OptimizerRule for EliminateOuterJoin {
} else {
join.join_type
};
+
let new_join = Arc::new(LogicalPlan::Join(Join {
- left: Arc::new((*join.left).clone()),
- right: Arc::new((*join.right).clone()),
+ left: join.left,
+ right: join.right,
join_type: new_join_type,
join_constraint: join.join_constraint,
on: join.on.clone(),
@@ -122,7 +124,10 @@ impl OptimizerRule for EliminateOuterJoin {
Filter::try_new(filter.predicate, new_join)
.map(|f| Transformed::yes(LogicalPlan::Filter(f)))
}
- _ => Ok(Transformed::no(LogicalPlan::Filter(filter))),
+ filter_input => {
+ filter.input = Arc::new(filter_input);
+ Ok(Transformed::no(LogicalPlan::Filter(filter)))
+ }
},
_ => Ok(Transformed::no(plan)),
}
diff --git a/datafusion/optimizer/src/propagate_empty_relation.rs
b/datafusion/optimizer/src/propagate_empty_relation.rs
index 576dabe305..88bd1b1788 100644
--- a/datafusion/optimizer/src/propagate_empty_relation.rs
+++ b/datafusion/optimizer/src/propagate_empty_relation.rs
@@ -182,7 +182,9 @@ impl OptimizerRule for PropagateEmptyRelation {
},
)))
} else if new_inputs.len() == 1 {
- let child = unwrap_arc(new_inputs[0].clone());
+ let mut new_inputs = new_inputs;
+ let input_plan = new_inputs.pop().unwrap(); // length
checked
+ let child = unwrap_arc(input_plan);
if child.schema().eq(plan.schema()) {
Ok(Transformed::yes(child))
} else {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]