This is an automated email from the ASF dual-hosted git repository.
jayzhan 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 41863dd989 fix set (#14081)
41863dd989 is described below
commit 41863dd98990a6add737390fc8ec7321d83449eb
Author: Jay Zhan <[email protected]>
AuthorDate: Sun Jan 12 22:22:05 2025 +0800
fix set (#14081)
Signed-off-by: Jay Zhan <[email protected]>
---
.../physical-expr-common/src/physical_expr.rs | 3 +++
datafusion/physical-expr/src/physical_expr.rs | 30 ++++++++--------------
2 files changed, 14 insertions(+), 19 deletions(-)
diff --git a/datafusion/physical-expr-common/src/physical_expr.rs
b/datafusion/physical-expr-common/src/physical_expr.rs
index e90f9c32ee..b1b889136b 100644
--- a/datafusion/physical-expr-common/src/physical_expr.rs
+++ b/datafusion/physical-expr-common/src/physical_expr.rs
@@ -31,6 +31,9 @@ use datafusion_expr_common::columnar_value::ColumnarValue;
use datafusion_expr_common::interval_arithmetic::Interval;
use datafusion_expr_common::sort_properties::ExprProperties;
+/// Shared [`PhysicalExpr`].
+pub type PhysicalExprRef = Arc<dyn PhysicalExpr>;
+
/// [`PhysicalExpr`]s represent expressions such as `A + 1` or `CAST(c1 AS
int)`.
///
/// `PhysicalExpr` knows its type, nullability and can be evaluated directly on
diff --git a/datafusion/physical-expr/src/physical_expr.rs
b/datafusion/physical-expr/src/physical_expr.rs
index 9a9f40b6a1..a4184845a0 100644
--- a/datafusion/physical-expr/src/physical_expr.rs
+++ b/datafusion/physical-expr/src/physical_expr.rs
@@ -17,12 +17,11 @@
use std::sync::Arc;
+use datafusion_common::HashMap;
pub(crate) use datafusion_physical_expr_common::physical_expr::PhysicalExpr;
+pub use datafusion_physical_expr_common::physical_expr::PhysicalExprRef;
use itertools::izip;
-/// Shared [`PhysicalExpr`].
-pub type PhysicalExprRef = Arc<dyn PhysicalExpr>;
-
/// This function is similar to the `contains` method of `Vec`. It finds
/// whether `expr` is among `physical_exprs`.
pub fn physical_exprs_contains(
@@ -48,31 +47,24 @@ pub fn physical_exprs_bag_equal(
lhs: &[Arc<dyn PhysicalExpr>],
rhs: &[Arc<dyn PhysicalExpr>],
) -> bool {
- // TODO: Once we can use `HashMap`s with `Arc<dyn PhysicalExpr>`, this
- // function should use a `HashMap` to reduce computational
complexity.
- if lhs.len() == rhs.len() {
- let mut rhs_vec = rhs.to_vec();
- for expr in lhs {
- if let Some(idx) = rhs_vec.iter().position(|e| expr.eq(e)) {
- rhs_vec.swap_remove(idx);
- } else {
- return false;
- }
- }
- true
- } else {
- false
+ let mut multi_set_lhs: HashMap<_, usize> = HashMap::new();
+ let mut multi_set_rhs: HashMap<_, usize> = HashMap::new();
+ for expr in lhs {
+ *multi_set_lhs.entry(expr).or_insert(0) += 1;
+ }
+ for expr in rhs {
+ *multi_set_rhs.entry(expr).or_insert(0) += 1;
}
+ multi_set_lhs == multi_set_rhs
}
#[cfg(test)]
mod tests {
- use std::sync::Arc;
+ use super::*;
use crate::expressions::{Column, Literal};
use crate::physical_expr::{
physical_exprs_bag_equal, physical_exprs_contains,
physical_exprs_equal,
- PhysicalExpr,
};
use datafusion_common::ScalarValue;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]