Skip to content

Commit 79130bd

Browse files
committed
Remove a clone
1 parent 6210816 commit 79130bd

1 file changed

Lines changed: 22 additions & 18 deletions

File tree

  • datafusion/substrait/src/logical_plan/consumer/rel

datafusion/substrait/src/logical_plan/consumer/rel/join_rel.rs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
use crate::logical_plan::consumer::SubstraitConsumer;
1919
use datafusion::common::{Column, JoinType, NullEquality, not_impl_err, plan_err};
2020
use datafusion::logical_expr::requalify_sides_if_needed;
21-
use datafusion::logical_expr::utils::split_conjunction;
21+
use datafusion::logical_expr::utils::split_conjunction_owned;
2222
use datafusion::logical_expr::{
2323
BinaryExpr, Expr, LogicalPlan, LogicalPlanBuilder, Operator,
2424
};
@@ -57,7 +57,7 @@ pub async fn from_join_rel(
5757
// - If an Eq or IsNotDistinctFrom op is encountered, add the left column, right column and is_null_equal_nulls to `join_ons` vector
5858
// - Otherwise we add the expression to join_filter (use conjunction if filter already exists)
5959
let (join_ons, null_equality, join_filter) =
60-
split_eq_and_noneq_join_predicate_with_nulls_equality(&on);
60+
split_eq_and_noneq_join_predicate_with_nulls_equality(on);
6161
let (left_cols, right_cols): (Vec<_>, Vec<_>) =
6262
itertools::multiunzip(join_ons);
6363
left.join_detailed(
@@ -84,9 +84,9 @@ pub async fn from_join_rel(
8484
}
8585

8686
fn split_eq_and_noneq_join_predicate_with_nulls_equality(
87-
filter: &Expr,
87+
filter: Expr,
8888
) -> (Vec<(Column, Column)>, NullEquality, Option<Expr>) {
89-
let exprs = split_conjunction(filter);
89+
let exprs = split_conjunction_owned(filter);
9090

9191
let mut eq_keys: Vec<(Column, Column)> = vec![];
9292
let mut indistinct_keys: Vec<(Column, Column)> = vec![];
@@ -98,29 +98,33 @@ fn split_eq_and_noneq_join_predicate_with_nulls_equality(
9898
left,
9999
op: op @ (Operator::Eq | Operator::IsNotDistinctFrom),
100100
right,
101-
}) => match (left.as_ref(), right.as_ref()) {
101+
}) => match (*left, *right) {
102102
(Expr::Column(l), Expr::Column(r)) => match op {
103-
Operator::Eq => eq_keys.push((l.clone(), r.clone())),
104-
Operator::IsNotDistinctFrom => {
105-
indistinct_keys.push((l.clone(), r.clone()))
106-
}
103+
Operator::Eq => eq_keys.push((l, r)),
104+
Operator::IsNotDistinctFrom => indistinct_keys.push((l, r)),
107105
_ => unreachable!(),
108106
},
109-
_ => accum_filters.push(expr.clone()),
107+
(left, right) => {
108+
accum_filters.push(Expr::BinaryExpr(BinaryExpr {
109+
left: Box::new(left),
110+
op,
111+
right: Box::new(right),
112+
}));
113+
}
110114
},
111-
_ => accum_filters.push(expr.clone()),
115+
_ => accum_filters.push(expr),
112116
}
113117
}
114118

115119
let (join_keys, null_equality) =
116120
match (eq_keys.is_empty(), indistinct_keys.is_empty()) {
117121
// Mixed: use eq_keys as equijoin keys, demote indistinct keys to filter
118122
(false, false) => {
119-
for (l, r) in &indistinct_keys {
123+
for (l, r) in indistinct_keys {
120124
accum_filters.push(Expr::BinaryExpr(BinaryExpr {
121-
left: Box::new(Expr::Column(l.clone())),
125+
left: Box::new(Expr::Column(l)),
122126
op: Operator::IsNotDistinctFrom,
123-
right: Box::new(Expr::Column(r.clone())),
127+
right: Box::new(Expr::Column(r)),
124128
}));
125129
}
126130
(eq_keys, NullEquality::NullEqualsNothing)
@@ -175,7 +179,7 @@ mod tests {
175179
});
176180

177181
let (keys, null_eq, filter) =
178-
split_eq_and_noneq_join_predicate_with_nulls_equality(&expr);
182+
split_eq_and_noneq_join_predicate_with_nulls_equality(expr);
179183

180184
assert_eq!(keys.len(), 1);
181185
assert_eq!(null_eq, NullEquality::NullEqualsNothing);
@@ -192,7 +196,7 @@ mod tests {
192196
});
193197

194198
let (keys, null_eq, filter) =
195-
split_eq_and_noneq_join_predicate_with_nulls_equality(&expr);
199+
split_eq_and_noneq_join_predicate_with_nulls_equality(expr);
196200

197201
assert_eq!(keys.len(), 1);
198202
assert_eq!(null_eq, NullEquality::NullEqualsNull);
@@ -217,7 +221,7 @@ mod tests {
217221
}));
218222

219223
let (keys, null_eq, filter) =
220-
split_eq_and_noneq_join_predicate_with_nulls_equality(&expr);
224+
split_eq_and_noneq_join_predicate_with_nulls_equality(expr);
221225

222226
// Only the Eq key should be an equijoin key.
223227
assert_eq!(keys.len(), 1);
@@ -251,7 +255,7 @@ mod tests {
251255
});
252256

253257
let (keys, _, filter) =
254-
split_eq_and_noneq_join_predicate_with_nulls_equality(&expr);
258+
split_eq_and_noneq_join_predicate_with_nulls_equality(expr);
255259

256260
assert!(keys.is_empty());
257261
assert!(filter.is_some());

0 commit comments

Comments
 (0)