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 b9fdc53ac8 Minor: Add `ConstExpr`::from, use in places (#11283)
b9fdc53ac8 is described below
commit b9fdc53ac80c68f819191c2f2f9872ae64c5d3d8
Author: Andrew Lamb <[email protected]>
AuthorDate: Sat Jul 6 07:28:19 2024 -0400
Minor: Add `ConstExpr`::from, use in places (#11283)
---
.../fuzz_cases/sort_preserving_repartition_fuzz.rs | 2 +-
datafusion/physical-expr/src/equivalence/class.rs | 28 ++++++++++++++++++++++
datafusion/physical-expr/src/equivalence/mod.rs | 2 +-
.../physical-expr/src/equivalence/ordering.rs | 6 ++---
.../physical-expr/src/equivalence/properties.rs | 22 ++++++++---------
datafusion/physical-plan/src/filter.rs | 6 ++---
datafusion/physical-plan/src/union.rs | 2 +-
datafusion/physical-plan/src/windows/mod.rs | 4 +---
8 files changed, 47 insertions(+), 25 deletions(-)
diff --git
a/datafusion/core/tests/fuzz_cases/sort_preserving_repartition_fuzz.rs
b/datafusion/core/tests/fuzz_cases/sort_preserving_repartition_fuzz.rs
index f00d17a06f..ceae13a469 100644
--- a/datafusion/core/tests/fuzz_cases/sort_preserving_repartition_fuzz.rs
+++ b/datafusion/core/tests/fuzz_cases/sort_preserving_repartition_fuzz.rs
@@ -80,7 +80,7 @@ mod sp_repartition_fuzz_tests {
// Define a and f are aliases
eq_properties.add_equal_conditions(col_a, col_f)?;
// Column e has constant value.
- eq_properties =
eq_properties.add_constants([ConstExpr::new(col_e.clone())]);
+ eq_properties = eq_properties.add_constants([ConstExpr::from(col_e)]);
// Randomly order columns for sorting
let mut rng = StdRng::seed_from_u64(seed);
diff --git a/datafusion/physical-expr/src/equivalence/class.rs
b/datafusion/physical-expr/src/equivalence/class.rs
index 4c0edd2a5d..e483f935b7 100644
--- a/datafusion/physical-expr/src/equivalence/class.rs
+++ b/datafusion/physical-expr/src/equivalence/class.rs
@@ -42,12 +42,28 @@ use datafusion_common::JoinType;
/// - `across_partitions`: A boolean flag indicating whether the constant
expression is
/// valid across partitions. If set to `true`, the constant expression has
same value for all partitions.
/// If set to `false`, the constant expression may have different values for
different partitions.
+///
+/// # Example
+///
+/// ```rust
+/// # use datafusion_physical_expr::ConstExpr;
+/// # use datafusion_physical_expr_common::expressions::lit;
+/// let col = lit(5);
+/// // Create a constant expression from a physical expression ref
+/// let const_expr = ConstExpr::from(&col);
+/// // create a constant expression from a physical expression
+/// let const_expr = ConstExpr::from(col);
+/// ```
pub struct ConstExpr {
expr: Arc<dyn PhysicalExpr>,
across_partitions: bool,
}
impl ConstExpr {
+ /// Create a new constant expression from a physical expression.
+ ///
+ /// Note you can also use `ConstExpr::from` to create a constant expression
+ /// from a reference as well
pub fn new(expr: Arc<dyn PhysicalExpr>) -> Self {
Self {
expr,
@@ -85,6 +101,18 @@ impl ConstExpr {
}
}
+impl From<Arc<dyn PhysicalExpr>> for ConstExpr {
+ fn from(expr: Arc<dyn PhysicalExpr>) -> Self {
+ Self::new(expr)
+ }
+}
+
+impl From<&Arc<dyn PhysicalExpr>> for ConstExpr {
+ fn from(expr: &Arc<dyn PhysicalExpr>) -> Self {
+ Self::new(Arc::clone(expr))
+ }
+}
+
/// Checks whether `expr` is among in the `const_exprs`.
pub fn const_exprs_contains(
const_exprs: &[ConstExpr],
diff --git a/datafusion/physical-expr/src/equivalence/mod.rs
b/datafusion/physical-expr/src/equivalence/mod.rs
index 1ed9a4ac21..83f94057f7 100644
--- a/datafusion/physical-expr/src/equivalence/mod.rs
+++ b/datafusion/physical-expr/src/equivalence/mod.rs
@@ -205,7 +205,7 @@ mod tests {
// Define a and f are aliases
eq_properties.add_equal_conditions(col_a, col_f)?;
// Column e has constant value.
- eq_properties =
eq_properties.add_constants([ConstExpr::new(Arc::clone(col_e))]);
+ eq_properties = eq_properties.add_constants([ConstExpr::from(col_e)]);
// Randomly order columns for sorting
let mut rng = StdRng::seed_from_u64(seed);
diff --git a/datafusion/physical-expr/src/equivalence/ordering.rs
b/datafusion/physical-expr/src/equivalence/ordering.rs
index d71075dc77..c4b8a5c465 100644
--- a/datafusion/physical-expr/src/equivalence/ordering.rs
+++ b/datafusion/physical-expr/src/equivalence/ordering.rs
@@ -556,9 +556,9 @@ mod tests {
let eq_group = EquivalenceGroup::new(eq_group);
eq_properties.add_equivalence_group(eq_group);
- let constants = constants.into_iter().map(|expr| {
- ConstExpr::new(Arc::clone(expr)).with_across_partitions(true)
- });
+ let constants = constants
+ .into_iter()
+ .map(|expr|
ConstExpr::from(expr).with_across_partitions(true));
eq_properties = eq_properties.add_constants(constants);
let reqs = convert_to_sort_exprs(&reqs);
diff --git a/datafusion/physical-expr/src/equivalence/properties.rs
b/datafusion/physical-expr/src/equivalence/properties.rs
index 9a6a17f58c..d9d19c0bcf 100644
--- a/datafusion/physical-expr/src/equivalence/properties.rs
+++ b/datafusion/physical-expr/src/equivalence/properties.rs
@@ -213,13 +213,13 @@ impl EquivalenceProperties {
// Left expression is constant, add right as constant
if !const_exprs_contains(&self.constants, right) {
self.constants
-
.push(ConstExpr::new(Arc::clone(right)).with_across_partitions(true));
+ .push(ConstExpr::from(right).with_across_partitions(true));
}
} else if self.is_expr_constant(right) {
// Right expression is constant, add left as constant
if !const_exprs_contains(&self.constants, left) {
self.constants
-
.push(ConstExpr::new(Arc::clone(left)).with_across_partitions(true));
+ .push(ConstExpr::from(left).with_across_partitions(true));
}
}
@@ -300,7 +300,7 @@ impl EquivalenceProperties {
{
if !const_exprs_contains(&self.constants, &expr) {
let const_expr =
-
ConstExpr::new(expr).with_across_partitions(across_partitions);
+
ConstExpr::from(expr).with_across_partitions(across_partitions);
self.constants.push(const_expr);
}
}
@@ -404,7 +404,7 @@ impl EquivalenceProperties {
// we add column `a` as constant to the algorithm state. This
enables us
// to deduce that `(b + c) ASC` is satisfied, given `a` is
constant.
eq_properties = eq_properties
-
.add_constants(std::iter::once(ConstExpr::new(normalized_req.expr)));
+
.add_constants(std::iter::once(ConstExpr::from(normalized_req.expr)));
}
true
}
@@ -832,9 +832,8 @@ impl EquivalenceProperties {
&& !const_exprs_contains(&projected_constants, target)
{
// Expression evaluates to single value
- projected_constants.push(
-
ConstExpr::new(Arc::clone(target)).with_across_partitions(true),
- );
+ projected_constants
+
.push(ConstExpr::from(target).with_across_partitions(true));
}
}
projected_constants
@@ -927,8 +926,8 @@ impl EquivalenceProperties {
// Note that these expressions are not properly "constants". This
is just
// an implementation strategy confined to this function.
for (PhysicalSortExpr { expr, .. }, idx) in &ordered_exprs {
- eq_properties = eq_properties
-
.add_constants(std::iter::once(ConstExpr::new(Arc::clone(expr))));
+ eq_properties =
+
eq_properties.add_constants(std::iter::once(ConstExpr::from(expr)));
search_indices.shift_remove(idx);
}
// Add new ordered section to the state.
@@ -2147,8 +2146,7 @@ mod tests {
let col_h = &col("h", &test_schema)?;
// Add column h as constant
- eq_properties =
-
eq_properties.add_constants(vec![ConstExpr::new(Arc::clone(col_h))]);
+ eq_properties =
eq_properties.add_constants(vec![ConstExpr::from(col_h)]);
let test_cases = vec![
// TEST CASE 1
@@ -2458,7 +2456,7 @@ mod tests {
for case in cases {
let mut properties = base_properties
.clone()
- .add_constants(case.constants.into_iter().map(ConstExpr::new));
+
.add_constants(case.constants.into_iter().map(ConstExpr::from));
for [left, right] in &case.equal_conditions {
properties.add_equal_conditions(left, right)?
}
diff --git a/datafusion/physical-plan/src/filter.rs
b/datafusion/physical-plan/src/filter.rs
index c141958c11..ab7a63e445 100644
--- a/datafusion/physical-plan/src/filter.rs
+++ b/datafusion/physical-plan/src/filter.rs
@@ -173,13 +173,11 @@ impl FilterExec {
// Filter evaluates to single value for all partitions
if input_eqs.is_expr_constant(binary.left()) {
res_constants.push(
- ConstExpr::new(binary.right().clone())
- .with_across_partitions(true),
+
ConstExpr::from(binary.right()).with_across_partitions(true),
)
} else if input_eqs.is_expr_constant(binary.right()) {
res_constants.push(
- ConstExpr::new(binary.left().clone())
- .with_across_partitions(true),
+
ConstExpr::from(binary.left()).with_across_partitions(true),
)
}
}
diff --git a/datafusion/physical-plan/src/union.rs
b/datafusion/physical-plan/src/union.rs
index 3f88eb4c37..867cddeb7b 100644
--- a/datafusion/physical-plan/src/union.rs
+++ b/datafusion/physical-plan/src/union.rs
@@ -188,7 +188,7 @@ fn calculate_union_eq_properties(
// TODO: Check whether constant expressions evaluates
the same value or not for each partition
let across_partitions = false;
return Some(
- ConstExpr::new(meet_constant.owned_expr())
+ ConstExpr::from(meet_constant.owned_expr())
.with_across_partitions(across_partitions),
);
}
diff --git a/datafusion/physical-plan/src/windows/mod.rs
b/datafusion/physical-plan/src/windows/mod.rs
index d798eaacc7..0622aad74c 100644
--- a/datafusion/physical-plan/src/windows/mod.rs
+++ b/datafusion/physical-plan/src/windows/mod.rs
@@ -598,9 +598,7 @@ pub fn get_window_mode(
options: None,
}));
// Treat partition by exprs as constant. During analysis of requirements
are satisfied.
- let const_exprs = partitionby_exprs
- .iter()
- .map(|expr| ConstExpr::new(expr.clone()));
+ let const_exprs = partitionby_exprs.iter().map(ConstExpr::from);
let partition_by_eqs = input_eqs.add_constants(const_exprs);
let order_by_reqs = PhysicalSortRequirement::from_sort_exprs(orderby_keys);
let reverse_order_by_reqs =
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]