Skip to content

Commit 5aa7c4a

Browse files
authored
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]>
1 parent 45599ce commit 5aa7c4a

File tree

3 files changed

+31
-20
lines changed

3 files changed

+31
-20
lines changed

datafusion/optimizer/src/eliminate_nested_union.rs

+19-15
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ use crate::{OptimizerConfig, OptimizerRule};
2121
use datafusion_common::tree_node::Transformed;
2222
use datafusion_common::Result;
2323
use datafusion_expr::expr_rewriter::coerce_plan_expr_for_schema;
24+
use datafusion_expr::logical_plan::tree_node::unwrap_arc;
2425
use datafusion_expr::{Distinct, LogicalPlan, Union};
26+
use itertools::Itertools;
2527
use std::sync::Arc;
2628

2729
#[derive(Default)]
@@ -56,53 +58,55 @@ impl OptimizerRule for EliminateNestedUnion {
5658
match plan {
5759
LogicalPlan::Union(Union { inputs, schema }) => {
5860
let inputs = inputs
59-
.iter()
61+
.into_iter()
6062
.flat_map(extract_plans_from_union)
6163
.collect::<Vec<_>>();
6264

6365
Ok(Transformed::yes(LogicalPlan::Union(Union {
64-
inputs,
66+
inputs: inputs.into_iter().map(Arc::new).collect_vec(),
6567
schema,
6668
})))
6769
}
68-
LogicalPlan::Distinct(Distinct::All(ref nested_plan)) => {
69-
match nested_plan.as_ref() {
70+
LogicalPlan::Distinct(Distinct::All(nested_plan)) => {
71+
match unwrap_arc(nested_plan) {
7072
LogicalPlan::Union(Union { inputs, schema }) => {
7173
let inputs = inputs
72-
.iter()
74+
.into_iter()
7375
.map(extract_plan_from_distinct)
7476
.flat_map(extract_plans_from_union)
7577
.collect::<Vec<_>>();
7678

7779
Ok(Transformed::yes(LogicalPlan::Distinct(Distinct::All(
7880
Arc::new(LogicalPlan::Union(Union {
79-
inputs,
81+
inputs: inputs.into_iter().map(Arc::new).collect_vec(),
8082
schema: schema.clone(),
8183
})),
8284
))))
8385
}
84-
_ => Ok(Transformed::no(plan)),
86+
nested_plan => Ok(Transformed::no(LogicalPlan::Distinct(
87+
Distinct::All(Arc::new(nested_plan)),
88+
))),
8589
}
8690
}
8791
_ => Ok(Transformed::no(plan)),
8892
}
8993
}
9094
}
9195

92-
fn extract_plans_from_union(plan: &Arc<LogicalPlan>) -> Vec<Arc<LogicalPlan>> {
93-
match plan.as_ref() {
96+
fn extract_plans_from_union(plan: Arc<LogicalPlan>) -> Vec<LogicalPlan> {
97+
match unwrap_arc(plan) {
9498
LogicalPlan::Union(Union { inputs, schema }) => inputs
95-
.iter()
96-
.map(|plan| Arc::new(coerce_plan_expr_for_schema(plan, schema).unwrap()))
99+
.into_iter()
100+
.map(|plan| coerce_plan_expr_for_schema(&plan, &schema).unwrap())
97101
.collect::<Vec<_>>(),
98-
_ => vec![plan.clone()],
102+
plan => vec![plan],
99103
}
100104
}
101105

102-
fn extract_plan_from_distinct(plan: &Arc<LogicalPlan>) -> &Arc<LogicalPlan> {
103-
match plan.as_ref() {
106+
fn extract_plan_from_distinct(plan: Arc<LogicalPlan>) -> Arc<LogicalPlan> {
107+
match unwrap_arc(plan) {
104108
LogicalPlan::Distinct(Distinct::All(plan)) => plan,
105-
_ => plan,
109+
plan => Arc::new(plan),
106110
}
107111
}
108112

datafusion/optimizer/src/eliminate_outer_join.rs

+9-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
//! [`EliminateOuterJoin`] converts `LEFT/RIGHT/FULL` joins to `INNER` joins
1919
use crate::{OptimizerConfig, OptimizerRule};
2020
use datafusion_common::{Column, DFSchema, Result};
21+
use datafusion_expr::logical_plan::tree_node::unwrap_arc;
2122
use datafusion_expr::logical_plan::{Join, JoinType, LogicalPlan};
2223
use datafusion_expr::{Expr, Filter, Operator};
2324

@@ -78,7 +79,7 @@ impl OptimizerRule for EliminateOuterJoin {
7879
_config: &dyn OptimizerConfig,
7980
) -> Result<Transformed<LogicalPlan>> {
8081
match plan {
81-
LogicalPlan::Filter(filter) => match filter.input.as_ref() {
82+
LogicalPlan::Filter(mut filter) => match unwrap_arc(filter.input) {
8283
LogicalPlan::Join(join) => {
8384
let mut non_nullable_cols: Vec<Column> = vec![];
8485

@@ -109,9 +110,10 @@ impl OptimizerRule for EliminateOuterJoin {
109110
} else {
110111
join.join_type
111112
};
113+
112114
let new_join = Arc::new(LogicalPlan::Join(Join {
113-
left: Arc::new((*join.left).clone()),
114-
right: Arc::new((*join.right).clone()),
115+
left: join.left,
116+
right: join.right,
115117
join_type: new_join_type,
116118
join_constraint: join.join_constraint,
117119
on: join.on.clone(),
@@ -122,7 +124,10 @@ impl OptimizerRule for EliminateOuterJoin {
122124
Filter::try_new(filter.predicate, new_join)
123125
.map(|f| Transformed::yes(LogicalPlan::Filter(f)))
124126
}
125-
_ => Ok(Transformed::no(LogicalPlan::Filter(filter))),
127+
filter_input => {
128+
filter.input = Arc::new(filter_input);
129+
Ok(Transformed::no(LogicalPlan::Filter(filter)))
130+
}
126131
},
127132
_ => Ok(Transformed::no(plan)),
128133
}

datafusion/optimizer/src/propagate_empty_relation.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,9 @@ impl OptimizerRule for PropagateEmptyRelation {
182182
},
183183
)))
184184
} else if new_inputs.len() == 1 {
185-
let child = unwrap_arc(new_inputs[0].clone());
185+
let mut new_inputs = new_inputs;
186+
let input_plan = new_inputs.pop().unwrap(); // length checked
187+
let child = unwrap_arc(input_plan);
186188
if child.schema().eq(plan.schema()) {
187189
Ok(Transformed::yes(child))
188190
} else {

0 commit comments

Comments
 (0)