This is an automated email from the ASF dual-hosted git repository.
agrove pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-comet.git
The following commit(s) were added to refs/heads/main by this push:
new 00eaa8e4 chore: Upgrade to latest DataFusion revision (#909)
00eaa8e4 is described below
commit 00eaa8e4d8ae78c12c08829026c7dc7ccf3b1cd7
Author: Andy Grove <[email protected]>
AuthorDate: Thu Sep 5 12:09:34 2024 -0600
chore: Upgrade to latest DataFusion revision (#909)
* update dependency version
* update avg
* update avg_decimal
* update sum_decimal
* variance
* stddev
* covariance
* correlation
* save progress
* code compiles
* clippy
* remove duplicate of down_cast_any_ref function
* remove duplicate of down_cast_any_ref function
* machete
* bump DF version again and use StatsType from DataFusion
* implement groups accumulator for stddev and variance
* refactor
* fmt
* revert group accumulator
---
native/Cargo.lock | 134 ++++++-------
native/Cargo.toml | 16 +-
.../src/execution/datafusion/expressions/avg.rs | 45 +++--
.../datafusion/expressions/avg_decimal.rs | 46 +++--
.../datafusion/expressions/bitwise_not.rs | 3 +-
.../expressions/bloom_filter_might_contain.rs | 3 +-
.../datafusion/expressions/checkoverflow.rs | 3 +-
.../datafusion/expressions/correlation.rs | 45 +++--
.../execution/datafusion/expressions/covariance.rs | 46 ++---
.../src/execution/datafusion/expressions/mod.rs | 2 -
.../execution/datafusion/expressions/negative.rs | 2 +-
.../datafusion/expressions/normalize_nan.rs | 3 +-
.../src/execution/datafusion/expressions/stats.rs | 27 ---
.../src/execution/datafusion/expressions/stddev.rs | 43 ++--
.../execution/datafusion/expressions/strings.rs | 6 +-
.../execution/datafusion/expressions/subquery.rs | 10 +-
.../datafusion/expressions/sum_decimal.rs | 48 +++--
.../execution/datafusion/expressions/unbound.rs | 2 +-
.../src/execution/datafusion/expressions/utils.rs | 19 --
.../execution/datafusion/expressions/variance.rs | 38 ++--
native/core/src/execution/datafusion/planner.rs | 219 ++++++++++++++-------
native/core/src/execution/jni_api.rs | 2 +-
native/spark-expr/Cargo.toml | 1 -
native/spark-expr/src/cast.rs | 3 +-
native/spark-expr/src/if_expr.rs | 3 +-
native/spark-expr/src/regexp.rs | 2 +-
native/spark-expr/src/structs.rs | 3 +-
native/spark-expr/src/temporal.rs | 3 +-
native/spark-expr/src/utils.rs | 18 --
29 files changed, 419 insertions(+), 376 deletions(-)
diff --git a/native/Cargo.lock b/native/Cargo.lock
index a3f6f6d3..3692f048 100644
--- a/native/Cargo.lock
+++ b/native/Cargo.lock
@@ -346,13 +346,13 @@ checksum =
"0c24e9d990669fbd16806bff449e4ac644fd9b1fca014760087732fe4102f131"
[[package]]
name = "async-trait"
-version = "0.1.81"
+version = "0.1.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107"
+checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn 2.0.77",
]
[[package]]
@@ -463,9 +463,9 @@ checksum =
"79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]]
name = "bytemuck"
-version = "1.17.0"
+version = "1.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fd4c6dcc3b0aea2f5c0b4b82c2b15fe39ddbc76041a310848f4706edf76bb31"
+checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2"
[[package]]
name = "byteorder"
@@ -487,9 +487,9 @@ checksum =
"37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
[[package]]
name = "cc"
-version = "1.1.14"
+version = "1.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50d2eb3cd3d1bf4529e31c215ee6f93ec5a3d536d9f578f93d9d33ee19562932"
+checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b"
dependencies = [
"jobserver",
"libc",
@@ -659,9 +659,9 @@ dependencies = [
[[package]]
name = "constant_time_eq"
-version = "0.3.0"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2"
+checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6"
[[package]]
name = "core-foundation-sys"
@@ -671,9 +671,9 @@ checksum =
"773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "cpp_demangle"
-version = "0.4.3"
+version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119"
+checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d"
dependencies = [
"cfg-if",
]
@@ -811,7 +811,7 @@ dependencies = [
[[package]]
name = "datafusion"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"ahash",
"arrow",
@@ -833,7 +833,6 @@ dependencies = [
"datafusion-optimizer",
"datafusion-physical-expr",
"datafusion-physical-expr-common",
- "datafusion-physical-expr-functions-aggregate",
"datafusion-physical-optimizer",
"datafusion-physical-plan",
"datafusion-sql",
@@ -860,7 +859,7 @@ dependencies = [
[[package]]
name = "datafusion-catalog"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"arrow-schema",
"async-trait",
@@ -945,7 +944,6 @@ dependencies = [
"datafusion-common",
"datafusion-expr",
"datafusion-physical-expr",
- "datafusion-physical-plan",
"num",
"rand",
"regex",
@@ -956,7 +954,7 @@ dependencies = [
[[package]]
name = "datafusion-common"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"ahash",
"arrow",
@@ -978,7 +976,7 @@ dependencies = [
[[package]]
name = "datafusion-common-runtime"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"log",
"tokio",
@@ -987,7 +985,7 @@ dependencies = [
[[package]]
name = "datafusion-execution"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"arrow",
"chrono",
@@ -1007,7 +1005,7 @@ dependencies = [
[[package]]
name = "datafusion-expr"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"ahash",
"arrow",
@@ -1028,7 +1026,7 @@ dependencies = [
[[package]]
name = "datafusion-expr-common"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"arrow",
"datafusion-common",
@@ -1038,7 +1036,7 @@ dependencies = [
[[package]]
name = "datafusion-functions"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"arrow",
"arrow-buffer",
@@ -1064,7 +1062,7 @@ dependencies = [
[[package]]
name = "datafusion-functions-aggregate"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"ahash",
"arrow",
@@ -1084,7 +1082,7 @@ dependencies = [
[[package]]
name = "datafusion-functions-aggregate-common"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"ahash",
"arrow",
@@ -1097,7 +1095,7 @@ dependencies = [
[[package]]
name = "datafusion-functions-nested"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"arrow",
"arrow-array",
@@ -1119,7 +1117,7 @@ dependencies = [
[[package]]
name = "datafusion-functions-window"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"datafusion-common",
"datafusion-expr",
@@ -1130,7 +1128,7 @@ dependencies = [
[[package]]
name = "datafusion-optimizer"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"arrow",
"async-trait",
@@ -1149,7 +1147,7 @@ dependencies = [
[[package]]
name = "datafusion-physical-expr"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"ahash",
"arrow",
@@ -1180,7 +1178,7 @@ dependencies = [
[[package]]
name = "datafusion-physical-expr-common"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"ahash",
"arrow",
@@ -1190,25 +1188,10 @@ dependencies = [
"rand",
]
-[[package]]
-name = "datafusion-physical-expr-functions-aggregate"
-version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
-dependencies = [
- "ahash",
- "arrow",
- "datafusion-common",
- "datafusion-expr",
- "datafusion-expr-common",
- "datafusion-functions-aggregate-common",
- "datafusion-physical-expr-common",
- "rand",
-]
-
[[package]]
name = "datafusion-physical-optimizer"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"datafusion-common",
"datafusion-execution",
@@ -1220,7 +1203,7 @@ dependencies = [
[[package]]
name = "datafusion-physical-plan"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"ahash",
"arrow",
@@ -1238,7 +1221,6 @@ dependencies = [
"datafusion-functions-aggregate-common",
"datafusion-physical-expr",
"datafusion-physical-expr-common",
- "datafusion-physical-expr-functions-aggregate",
"futures",
"half",
"hashbrown",
@@ -1255,7 +1237,7 @@ dependencies = [
[[package]]
name = "datafusion-sql"
version = "41.0.0"
-source =
"git+https://github.com/apache/datafusion.git?rev=dff590b#dff590bfd2bb9993b2c8ce6f76a3bdd973e520a8"
+source =
"git+https://github.com/apache/datafusion.git?rev=91b1d2b#91b1d2bfe8f603df94e846b91d8475a0af2e5240"
dependencies = [
"arrow",
"arrow-array",
@@ -1448,7 +1430,7 @@ checksum =
"87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn 2.0.77",
]
[[package]]
@@ -1624,9 +1606,9 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.4.0"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c"
+checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5"
dependencies = [
"equivalent",
"hashbrown",
@@ -2128,9 +2110,9 @@ dependencies = [
[[package]]
name = "object"
-version = "0.36.3"
+version = "0.36.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9"
+checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a"
dependencies = [
"memchr",
]
@@ -2435,7 +2417,7 @@ dependencies = [
"itertools 0.12.1",
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn 2.0.77",
]
[[package]]
@@ -2556,9 +2538,9 @@ checksum =
"7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
[[package]]
name = "rgb"
-version = "0.8.48"
+version = "0.8.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f86ae463694029097b846d8f99fd5536740602ae00022c0c50c5600720b2f71"
+checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a"
dependencies = [
"bytemuck",
]
@@ -2571,18 +2553,18 @@ checksum =
"719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]]
name = "rustc_version"
-version = "0.4.0"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
dependencies = [
"semver",
]
[[package]]
name = "rustix"
-version = "0.38.34"
+version = "0.38.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
+checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f"
dependencies = [
"bitflags 2.6.0",
"errno",
@@ -2657,7 +2639,7 @@ checksum =
"a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn 2.0.77",
]
[[package]]
@@ -2775,7 +2757,7 @@ checksum =
"01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn 2.0.77",
]
[[package]]
@@ -2815,7 +2797,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
- "syn 2.0.76",
+ "syn 2.0.77",
]
[[package]]
@@ -2826,9 +2808,9 @@ checksum =
"13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "symbolic-common"
-version = "12.10.0"
+version = "12.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16629323a4ec5268ad23a575110a724ad4544aae623451de600c747bf87b36cf"
+checksum = "9c1db5ac243c7d7f8439eb3b8f0357888b37cf3732957e91383b0ad61756374e"
dependencies = [
"debugid",
"memmap2",
@@ -2838,9 +2820,9 @@ dependencies = [
[[package]]
name = "symbolic-demangle"
-version = "12.10.0"
+version = "12.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48c043a45f08f41187414592b3ceb53fb0687da57209cc77401767fb69d5b596"
+checksum = "ea26e430c27d4a8a5dea4c4b81440606c7c1a415bd611451ef6af8c81416afc3"
dependencies = [
"cpp_demangle",
"rustc-demangle",
@@ -2860,9 +2842,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.76"
+version = "2.0.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525"
+checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
dependencies = [
"proc-macro2",
"quote",
@@ -2899,7 +2881,7 @@ checksum =
"a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn 2.0.77",
]
[[package]]
@@ -2959,9 +2941,9 @@ checksum =
"1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.39.3"
+version = "1.40.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5"
+checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998"
dependencies = [
"backtrace",
"bytes",
@@ -2977,7 +2959,7 @@ checksum =
"693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn 2.0.77",
]
[[package]]
@@ -2999,7 +2981,7 @@ checksum =
"34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn 2.0.77",
]
[[package]]
@@ -3149,7 +3131,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn 2.0.77",
"wasm-bindgen-shared",
]
@@ -3171,7 +3153,7 @@ checksum =
"afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn 2.0.77",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -3410,7 +3392,7 @@ checksum =
"fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn 2.0.77",
]
[[package]]
diff --git a/native/Cargo.toml b/native/Cargo.toml
index 33711b1d..54e56894 100644
--- a/native/Cargo.toml
+++ b/native/Cargo.toml
@@ -39,14 +39,14 @@ arrow-buffer = { version = "52.2.0" }
arrow-data = { version = "52.2.0" }
arrow-schema = { version = "52.2.0" }
parquet = { version = "52.2.0", default-features = false, features =
["experimental"] }
-datafusion-common = { git = "https://github.com/apache/datafusion.git", rev =
"dff590b" }
-datafusion = { default-features = false, git =
"https://github.com/apache/datafusion.git", rev = "dff590b", features =
["unicode_expressions", "crypto_expressions"] }
-datafusion-functions = { git = "https://github.com/apache/datafusion.git", rev
= "dff590b", features = ["crypto_expressions"] }
-datafusion-functions-nested = { git =
"https://github.com/apache/datafusion.git", rev = "dff590b", default-features
= false }
-datafusion-expr = { git = "https://github.com/apache/datafusion.git", rev =
"dff590b", default-features = false }
-datafusion-execution = { git = "https://github.com/apache/datafusion.git", rev
= "dff590b", default-features = false }
-datafusion-physical-plan = { git = "https://github.com/apache/datafusion.git",
rev = "dff590b", default-features = false }
-datafusion-physical-expr = { git = "https://github.com/apache/datafusion.git",
rev = "dff590b", default-features = false }
+datafusion-common = { git = "https://github.com/apache/datafusion.git", rev =
"91b1d2b" }
+datafusion = { default-features = false, git =
"https://github.com/apache/datafusion.git", rev = "91b1d2b", features =
["unicode_expressions", "crypto_expressions"] }
+datafusion-functions = { git = "https://github.com/apache/datafusion.git", rev
= "91b1d2b", features = ["crypto_expressions"] }
+datafusion-functions-nested = { git =
"https://github.com/apache/datafusion.git", rev = "91b1d2b", default-features
= false }
+datafusion-expr = { git = "https://github.com/apache/datafusion.git", rev =
"91b1d2b", default-features = false }
+datafusion-execution = { git = "https://github.com/apache/datafusion.git", rev
= "91b1d2b", default-features = false }
+datafusion-physical-plan = { git = "https://github.com/apache/datafusion.git",
rev = "91b1d2b", default-features = false }
+datafusion-physical-expr = { git = "https://github.com/apache/datafusion.git",
rev = "91b1d2b", default-features = false }
datafusion-comet-spark-expr = { path = "spark-expr", version = "0.3.0" }
datafusion-comet-proto = { path = "proto", version = "0.3.0" }
chrono = { version = "0.4", default-features = false, features = ["clock"] }
diff --git a/native/core/src/execution/datafusion/expressions/avg.rs
b/native/core/src/execution/datafusion/expressions/avg.rs
index 5e7b555c..7820497d 100644
--- a/native/core/src/execution/datafusion/expressions/avg.rs
+++ b/native/core/src/execution/datafusion/expressions/avg.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use crate::execution::datafusion::expressions::utils::down_cast_any_ref;
use arrow::compute::sum;
use arrow_array::{
builder::PrimitiveBuilder,
@@ -25,20 +24,24 @@ use arrow_array::{
};
use arrow_schema::{DataType, Field};
use datafusion::logical_expr::{
- type_coercion::aggregates::avg_return_type, Accumulator, EmitTo,
GroupsAccumulator,
+ type_coercion::aggregates::avg_return_type, Accumulator, EmitTo,
GroupsAccumulator, Signature,
};
use datafusion_common::{not_impl_err, Result, ScalarValue};
-use datafusion_physical_expr::{expressions::format_state_name, AggregateExpr,
PhysicalExpr};
+use datafusion_physical_expr::{expressions::format_state_name, PhysicalExpr};
use std::{any::Any, sync::Arc};
use arrow_array::ArrowNativeTypeOp;
-
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
+use datafusion_expr::function::{AccumulatorArgs, StateFieldsArgs};
+use datafusion_expr::Volatility::Immutable;
+use datafusion_expr::{AggregateUDFImpl, ReversedUDAF};
use DataType::*;
/// AVG aggregate expression
#[derive(Debug, Clone)]
pub struct Avg {
name: String,
+ signature: Signature,
expr: Arc<dyn PhysicalExpr>,
input_data_type: DataType,
result_data_type: DataType,
@@ -51,6 +54,7 @@ impl Avg {
Self {
name: name.into(),
+ signature: Signature::user_defined(Immutable),
expr,
input_data_type: data_type,
result_data_type,
@@ -58,17 +62,13 @@ impl Avg {
}
}
-impl AggregateExpr for Avg {
+impl AggregateUDFImpl for Avg {
/// Return a reference to Any that can be used for downcasting
fn as_any(&self) -> &dyn Any {
self
}
- fn field(&self) -> Result<Field> {
- Ok(Field::new(&self.name, self.result_data_type.clone(), true))
- }
-
- fn create_accumulator(&self) -> Result<Box<dyn Accumulator>> {
+ fn accumulator(&self, _acc_args: AccumulatorArgs) -> Result<Box<dyn
Accumulator>> {
// instantiate specialized accumulator based for the type
match (&self.input_data_type, &self.result_data_type) {
(Float64, Float64) => Ok(Box::<AvgAccumulator>::default()),
@@ -80,7 +80,7 @@ impl AggregateExpr for Avg {
}
}
- fn state_fields(&self) -> Result<Vec<Field>> {
+ fn state_fields(&self, _args: StateFieldsArgs) -> Result<Vec<Field>> {
Ok(vec![
Field::new(
format_state_name(&self.name, "sum"),
@@ -95,19 +95,22 @@ impl AggregateExpr for Avg {
])
}
- fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
- vec![Arc::clone(&self.expr)]
- }
-
fn name(&self) -> &str {
&self.name
}
- fn groups_accumulator_supported(&self) -> bool {
+ fn reverse_expr(&self) -> ReversedUDAF {
+ ReversedUDAF::Identical
+ }
+
+ fn groups_accumulator_supported(&self, _args: AccumulatorArgs) -> bool {
true
}
- fn create_groups_accumulator(&self) -> Result<Box<dyn GroupsAccumulator>> {
+ fn create_groups_accumulator(
+ &self,
+ _args: AccumulatorArgs,
+ ) -> Result<Box<dyn GroupsAccumulator>> {
// instantiate specialized accumulator based for the type
match (&self.input_data_type, &self.result_data_type) {
(Float64, Float64) =>
Ok(Box::new(AvgGroupsAccumulator::<Float64Type, _>::new(
@@ -126,6 +129,14 @@ impl AggregateExpr for Avg {
fn default_value(&self, _data_type: &DataType) -> Result<ScalarValue> {
Ok(ScalarValue::Float64(None))
}
+
+ fn signature(&self) -> &Signature {
+ &self.signature
+ }
+
+ fn return_type(&self, arg_types: &[DataType]) -> Result<DataType> {
+ avg_return_type(self.name(), &arg_types[0])
+ }
}
impl PartialEq<dyn Any> for Avg {
diff --git a/native/core/src/execution/datafusion/expressions/avg_decimal.rs
b/native/core/src/execution/datafusion/expressions/avg_decimal.rs
index b035d324..0462f2d3 100644
--- a/native/core/src/execution/datafusion/expressions/avg_decimal.rs
+++ b/native/core/src/execution/datafusion/expressions/avg_decimal.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use crate::execution::datafusion::expressions::utils::down_cast_any_ref;
use arrow::{array::BooleanBufferBuilder, buffer::NullBuffer, compute::sum};
use arrow_array::{
builder::PrimitiveBuilder,
@@ -24,16 +23,20 @@ use arrow_array::{
Array, ArrayRef, Decimal128Array, Int64Array, PrimitiveArray,
};
use arrow_schema::{DataType, Field};
-use datafusion::logical_expr::{Accumulator, EmitTo, GroupsAccumulator};
+use datafusion::logical_expr::{Accumulator, EmitTo, GroupsAccumulator,
Signature};
use datafusion_common::{not_impl_err, Result, ScalarValue};
-use datafusion_physical_expr::{expressions::format_state_name, AggregateExpr,
PhysicalExpr};
+use datafusion_physical_expr::{expressions::format_state_name, PhysicalExpr};
use std::{any::Any, sync::Arc};
use arrow_array::ArrowNativeTypeOp;
use arrow_data::decimal::{
validate_decimal_precision, MAX_DECIMAL_FOR_EACH_PRECISION,
MIN_DECIMAL_FOR_EACH_PRECISION,
};
-
+use datafusion::logical_expr::Volatility::Immutable;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
+use datafusion_expr::function::{AccumulatorArgs, StateFieldsArgs};
+use datafusion_expr::type_coercion::aggregates::avg_return_type;
+use datafusion_expr::{AggregateUDFImpl, ReversedUDAF};
use num::{integer::div_ceil, Integer};
use DataType::*;
@@ -41,6 +44,7 @@ use DataType::*;
#[derive(Debug, Clone)]
pub struct AvgDecimal {
name: String,
+ signature: Signature,
expr: Arc<dyn PhysicalExpr>,
sum_data_type: DataType,
result_data_type: DataType,
@@ -56,6 +60,7 @@ impl AvgDecimal {
) -> Self {
Self {
name: name.into(),
+ signature: Signature::user_defined(Immutable),
expr,
result_data_type: result_type,
sum_data_type: sum_type,
@@ -63,17 +68,13 @@ impl AvgDecimal {
}
}
-impl AggregateExpr for AvgDecimal {
+impl AggregateUDFImpl for AvgDecimal {
/// Return a reference to Any that can be used for downcasting
fn as_any(&self) -> &dyn Any {
self
}
- fn field(&self) -> Result<Field> {
- Ok(Field::new(&self.name, self.result_data_type.clone(), true))
- }
-
- fn create_accumulator(&self) -> Result<Box<dyn Accumulator>> {
+ fn accumulator(&self, _acc_args: AccumulatorArgs) -> Result<Box<dyn
Accumulator>> {
match (&self.sum_data_type, &self.result_data_type) {
(Decimal128(sum_precision, sum_scale),
Decimal128(target_precision, target_scale)) => {
Ok(Box::new(AvgDecimalAccumulator::new(
@@ -91,7 +92,7 @@ impl AggregateExpr for AvgDecimal {
}
}
- fn state_fields(&self) -> Result<Vec<Field>> {
+ fn state_fields(&self, _args: StateFieldsArgs) -> Result<Vec<Field>> {
Ok(vec![
Field::new(
format_state_name(&self.name, "sum"),
@@ -106,23 +107,22 @@ impl AggregateExpr for AvgDecimal {
])
}
- fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
- vec![Arc::clone(&self.expr)]
- }
-
fn name(&self) -> &str {
&self.name
}
- fn reverse_expr(&self) -> Option<Arc<dyn AggregateExpr>> {
- None
+ fn reverse_expr(&self) -> ReversedUDAF {
+ ReversedUDAF::Identical
}
- fn groups_accumulator_supported(&self) -> bool {
+ fn groups_accumulator_supported(&self, _args: AccumulatorArgs) -> bool {
true
}
- fn create_groups_accumulator(&self) -> Result<Box<dyn GroupsAccumulator>> {
+ fn create_groups_accumulator(
+ &self,
+ _args: AccumulatorArgs,
+ ) -> Result<Box<dyn GroupsAccumulator>> {
// instantiate specialized accumulator based for the type
match (&self.sum_data_type, &self.result_data_type) {
(Decimal128(sum_precision, sum_scale),
Decimal128(target_precision, target_scale)) => {
@@ -154,6 +154,14 @@ impl AggregateExpr for AvgDecimal {
),
}
}
+
+ fn signature(&self) -> &Signature {
+ &self.signature
+ }
+
+ fn return_type(&self, arg_types: &[DataType]) -> Result<DataType> {
+ avg_return_type(self.name(), &arg_types[0])
+ }
}
impl PartialEq<dyn Any> for AvgDecimal {
diff --git a/native/core/src/execution/datafusion/expressions/bitwise_not.rs
b/native/core/src/execution/datafusion/expressions/bitwise_not.rs
index c7b2bc06..a2b9ebe5 100644
--- a/native/core/src/execution/datafusion/expressions/bitwise_not.rs
+++ b/native/core/src/execution/datafusion/expressions/bitwise_not.rs
@@ -26,12 +26,11 @@ use arrow::{
datatypes::{DataType, Schema},
record_batch::RecordBatch,
};
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion::{error::DataFusionError, logical_expr::ColumnarValue};
use datafusion_common::{Result, ScalarValue};
use datafusion_physical_expr::PhysicalExpr;
-use crate::execution::datafusion::expressions::utils::down_cast_any_ref;
-
macro_rules! compute_op {
($OPERAND:expr, $DT:ident) => {{
let operand = $OPERAND
diff --git
a/native/core/src/execution/datafusion/expressions/bloom_filter_might_contain.rs
b/native/core/src/execution/datafusion/expressions/bloom_filter_might_contain.rs
index b66ca5b2..462a2224 100644
---
a/native/core/src/execution/datafusion/expressions/bloom_filter_might_contain.rs
+++
b/native/core/src/execution/datafusion/expressions/bloom_filter_might_contain.rs
@@ -21,9 +21,10 @@ use crate::{
use arrow::record_batch::RecordBatch;
use arrow_array::cast::as_primitive_array;
use arrow_schema::{DataType, Schema};
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion::physical_plan::ColumnarValue;
use datafusion_common::{internal_err, Result, ScalarValue};
-use datafusion_physical_expr::{aggregate::utils::down_cast_any_ref,
PhysicalExpr};
+use datafusion_physical_expr::PhysicalExpr;
use std::{
any::Any,
fmt::Display,
diff --git a/native/core/src/execution/datafusion/expressions/checkoverflow.rs
b/native/core/src/execution/datafusion/expressions/checkoverflow.rs
index ff2cffd4..e922171b 100644
--- a/native/core/src/execution/datafusion/expressions/checkoverflow.rs
+++ b/native/core/src/execution/datafusion/expressions/checkoverflow.rs
@@ -29,11 +29,10 @@ use arrow::{
};
use arrow_schema::{DataType, Schema};
use datafusion::logical_expr::ColumnarValue;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::{DataFusionError, ScalarValue};
use datafusion_physical_expr::PhysicalExpr;
-use crate::execution::datafusion::expressions::utils::down_cast_any_ref;
-
/// This is from Spark `CheckOverflow` expression. Spark `CheckOverflow`
expression rounds decimals
/// to given scale and check if the decimals can fit in given precision. As
`cast` kernel rounds
/// decimals already, Comet `CheckOverflow` expression only checks if the
decimals can fit in the
diff --git a/native/core/src/execution/datafusion/expressions/correlation.rs
b/native/core/src/execution/datafusion/expressions/correlation.rs
index 3dcf6cca..6bf35e71 100644
--- a/native/core/src/execution/datafusion/expressions/correlation.rs
+++ b/native/core/src/execution/datafusion/expressions/correlation.rs
@@ -20,16 +20,20 @@ use arrow::compute::{and, filter, is_not_null};
use std::{any::Any, sync::Arc};
use crate::execution::datafusion::expressions::{
- covariance::CovarianceAccumulator, stats::StatsType,
stddev::StddevAccumulator,
- utils::down_cast_any_ref,
+ covariance::CovarianceAccumulator, stddev::StddevAccumulator,
};
use arrow::{
array::ArrayRef,
datatypes::{DataType, Field},
};
use datafusion::logical_expr::Accumulator;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::{Result, ScalarValue};
-use datafusion_physical_expr::{expressions::format_state_name, AggregateExpr,
PhysicalExpr};
+use datafusion_expr::function::{AccumulatorArgs, StateFieldsArgs};
+use datafusion_expr::type_coercion::aggregates::NUMERICS;
+use datafusion_expr::{AggregateUDFImpl, Signature, Volatility};
+use datafusion_physical_expr::expressions::StatsType;
+use datafusion_physical_expr::{expressions::format_state_name, PhysicalExpr};
/// CORR aggregate expression
/// The implementation mostly is the same as the DataFusion's implementation.
The reason
@@ -39,6 +43,7 @@ use
datafusion_physical_expr::{expressions::format_state_name, AggregateExpr, Ph
#[derive(Debug)]
pub struct Correlation {
name: String,
+ signature: Signature,
expr1: Arc<dyn PhysicalExpr>,
expr2: Arc<dyn PhysicalExpr>,
null_on_divide_by_zero: bool,
@@ -56,6 +61,7 @@ impl Correlation {
assert!(matches!(data_type, DataType::Float64));
Self {
name: name.into(),
+ signature: Signature::uniform(2, NUMERICS.to_vec(),
Volatility::Immutable),
expr1,
expr2,
null_on_divide_by_zero,
@@ -63,23 +69,34 @@ impl Correlation {
}
}
-impl AggregateExpr for Correlation {
+impl AggregateUDFImpl for Correlation {
/// Return a reference to Any that can be used for downcasting
fn as_any(&self) -> &dyn Any {
self
}
- fn field(&self) -> Result<Field> {
- Ok(Field::new(&self.name, DataType::Float64, true))
+ fn name(&self) -> &str {
+ &self.name
+ }
+
+ fn signature(&self) -> &Signature {
+ &self.signature
+ }
+
+ fn return_type(&self, _arg_types: &[DataType]) -> Result<DataType> {
+ Ok(DataType::Float64)
+ }
+ fn default_value(&self, _data_type: &DataType) -> Result<ScalarValue> {
+ Ok(ScalarValue::Float64(None))
}
- fn create_accumulator(&self) -> Result<Box<dyn Accumulator>> {
+ fn accumulator(&self, _acc_args: AccumulatorArgs) -> Result<Box<dyn
Accumulator>> {
Ok(Box::new(CorrelationAccumulator::try_new(
self.null_on_divide_by_zero,
)?))
}
- fn state_fields(&self) -> Result<Vec<Field>> {
+ fn state_fields(&self, _args: StateFieldsArgs) -> Result<Vec<Field>> {
Ok(vec![
Field::new(
format_state_name(&self.name, "count"),
@@ -113,18 +130,6 @@ impl AggregateExpr for Correlation {
),
])
}
-
- fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
- vec![Arc::clone(&self.expr1), Arc::clone(&self.expr2)]
- }
-
- fn name(&self) -> &str {
- &self.name
- }
-
- fn default_value(&self, _data_type: &DataType) -> Result<ScalarValue> {
- Ok(ScalarValue::Float64(None))
- }
}
impl PartialEq<dyn Any> for Correlation {
diff --git a/native/core/src/execution/datafusion/expressions/covariance.rs
b/native/core/src/execution/datafusion/expressions/covariance.rs
index 11b345a2..9166e397 100644
--- a/native/core/src/execution/datafusion/expressions/covariance.rs
+++ b/native/core/src/execution/datafusion/expressions/covariance.rs
@@ -19,20 +19,21 @@
use std::{any::Any, sync::Arc};
-use crate::execution::datafusion::expressions::stats::StatsType;
use arrow::{
array::{ArrayRef, Float64Array},
compute::cast,
datatypes::{DataType, Field},
};
use datafusion::logical_expr::Accumulator;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::{
downcast_value, unwrap_or_internal_err, DataFusionError, Result,
ScalarValue,
};
-use datafusion_physical_expr::{
- aggregate::utils::down_cast_any_ref, expressions::format_state_name,
AggregateExpr,
- PhysicalExpr,
-};
+use datafusion_expr::function::{AccumulatorArgs, StateFieldsArgs};
+use datafusion_expr::type_coercion::aggregates::NUMERICS;
+use datafusion_expr::{AggregateUDFImpl, Signature, Volatility};
+use datafusion_physical_expr::expressions::StatsType;
+use datafusion_physical_expr::{expressions::format_state_name, PhysicalExpr};
/// COVAR_SAMP and COVAR_POP aggregate expression
/// The implementation mostly is the same as the DataFusion's implementation.
The reason
@@ -41,6 +42,7 @@ use datafusion_physical_expr::{
#[derive(Debug, Clone)]
pub struct Covariance {
name: String,
+ signature: Signature,
expr1: Arc<dyn PhysicalExpr>,
expr2: Arc<dyn PhysicalExpr>,
stats_type: StatsType,
@@ -61,6 +63,7 @@ impl Covariance {
assert!(matches!(data_type, DataType::Float64));
Self {
name: name.into(),
+ signature: Signature::uniform(2, NUMERICS.to_vec(),
Volatility::Immutable),
expr1,
expr2,
stats_type,
@@ -69,24 +72,35 @@ impl Covariance {
}
}
-impl AggregateExpr for Covariance {
+impl AggregateUDFImpl for Covariance {
/// Return a reference to Any that can be used for downcasting
fn as_any(&self) -> &dyn Any {
self
}
- fn field(&self) -> Result<Field> {
- Ok(Field::new(&self.name, DataType::Float64, true))
+ fn name(&self) -> &str {
+ &self.name
+ }
+
+ fn signature(&self) -> &Signature {
+ &self.signature
+ }
+
+ fn return_type(&self, _arg_types: &[DataType]) -> Result<DataType> {
+ Ok(DataType::Float64)
+ }
+ fn default_value(&self, _data_type: &DataType) -> Result<ScalarValue> {
+ Ok(ScalarValue::Float64(None))
}
- fn create_accumulator(&self) -> Result<Box<dyn Accumulator>> {
+ fn accumulator(&self, _acc_args: AccumulatorArgs) -> Result<Box<dyn
Accumulator>> {
Ok(Box::new(CovarianceAccumulator::try_new(
self.stats_type,
self.null_on_divide_by_zero,
)?))
}
- fn state_fields(&self) -> Result<Vec<Field>> {
+ fn state_fields(&self, _args: StateFieldsArgs) -> Result<Vec<Field>> {
Ok(vec![
Field::new(
format_state_name(&self.name, "count"),
@@ -110,18 +124,6 @@ impl AggregateExpr for Covariance {
),
])
}
-
- fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
- vec![Arc::clone(&self.expr1), Arc::clone(&self.expr2)]
- }
-
- fn name(&self) -> &str {
- &self.name
- }
-
- fn default_value(&self, _data_type: &DataType) -> Result<ScalarValue> {
- Ok(ScalarValue::Float64(None))
- }
}
impl PartialEq<dyn Any> for Covariance {
diff --git a/native/core/src/execution/datafusion/expressions/mod.rs
b/native/core/src/execution/datafusion/expressions/mod.rs
index 4435f6b6..10c9d309 100644
--- a/native/core/src/execution/datafusion/expressions/mod.rs
+++ b/native/core/src/execution/datafusion/expressions/mod.rs
@@ -30,13 +30,11 @@ pub mod comet_scalar_funcs;
pub mod correlation;
pub mod covariance;
pub mod negative;
-pub mod stats;
pub mod stddev;
pub mod strings;
pub mod subquery;
pub mod sum_decimal;
pub mod unbound;
-mod utils;
pub mod variance;
pub use datafusion_comet_spark_expr::{EvalMode, SparkError};
diff --git a/native/core/src/execution/datafusion/expressions/negative.rs
b/native/core/src/execution/datafusion/expressions/negative.rs
index fbcd194f..8dfe7174 100644
--- a/native/core/src/execution/datafusion/expressions/negative.rs
+++ b/native/core/src/execution/datafusion/expressions/negative.rs
@@ -21,6 +21,7 @@ use arrow::{compute::kernels::numeric::neg_wrapping,
datatypes::IntervalDayTimeT
use arrow_array::RecordBatch;
use arrow_buffer::IntervalDayTime;
use arrow_schema::{DataType, Schema};
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion::{
logical_expr::{interval_arithmetic::Interval, ColumnarValue},
physical_expr::PhysicalExpr,
@@ -28,7 +29,6 @@ use datafusion::{
use datafusion_comet_spark_expr::SparkError;
use datafusion_common::{Result, ScalarValue};
use datafusion_expr::sort_properties::ExprProperties;
-use datafusion_physical_expr::aggregate::utils::down_cast_any_ref;
use std::{
any::Any,
hash::{Hash, Hasher},
diff --git a/native/core/src/execution/datafusion/expressions/normalize_nan.rs
b/native/core/src/execution/datafusion/expressions/normalize_nan.rs
index d2192fee..c5331ad7 100644
--- a/native/core/src/execution/datafusion/expressions/normalize_nan.rs
+++ b/native/core/src/execution/datafusion/expressions/normalize_nan.rs
@@ -29,10 +29,9 @@ use arrow::{
};
use arrow_schema::{DataType, Schema};
use datafusion::logical_expr::ColumnarValue;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_physical_expr::PhysicalExpr;
-use crate::execution::datafusion::expressions::utils::down_cast_any_ref;
-
#[derive(Debug, Hash)]
pub struct NormalizeNaNAndZero {
pub data_type: DataType,
diff --git a/native/core/src/execution/datafusion/expressions/stats.rs
b/native/core/src/execution/datafusion/expressions/stats.rs
deleted file mode 100644
index 1f4e64d0..00000000
--- a/native/core/src/execution/datafusion/expressions/stats.rs
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/// Enum used for differentiating population and sample for statistical
functions
-#[derive(PartialEq, Eq, Debug, Clone, Copy)]
-pub enum StatsType {
- /// Population
- Population,
- /// Sample
- Sample,
-}
diff --git a/native/core/src/execution/datafusion/expressions/stddev.rs
b/native/core/src/execution/datafusion/expressions/stddev.rs
index bc96a568..1ba495e2 100644
--- a/native/core/src/execution/datafusion/expressions/stddev.rs
+++ b/native/core/src/execution/datafusion/expressions/stddev.rs
@@ -17,16 +17,18 @@
use std::{any::Any, sync::Arc};
-use crate::execution::datafusion::expressions::{
- stats::StatsType, utils::down_cast_any_ref, variance::VarianceAccumulator,
-};
+use crate::execution::datafusion::expressions::variance::VarianceAccumulator;
use arrow::{
array::ArrayRef,
datatypes::{DataType, Field},
};
use datafusion::logical_expr::Accumulator;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::{internal_err, Result, ScalarValue};
-use datafusion_physical_expr::{expressions::format_state_name, AggregateExpr,
PhysicalExpr};
+use datafusion_expr::function::{AccumulatorArgs, StateFieldsArgs};
+use datafusion_expr::{AggregateUDFImpl, Signature, Volatility};
+use datafusion_physical_expr::expressions::StatsType;
+use datafusion_physical_expr::{expressions::format_state_name, PhysicalExpr};
/// STDDEV and STDDEV_SAMP (standard deviation) aggregate expression
/// The implementation mostly is the same as the DataFusion's implementation.
The reason
@@ -36,6 +38,7 @@ use
datafusion_physical_expr::{expressions::format_state_name, AggregateExpr, Ph
#[derive(Debug)]
pub struct Stddev {
name: String,
+ signature: Signature,
expr: Arc<dyn PhysicalExpr>,
stats_type: StatsType,
null_on_divide_by_zero: bool,
@@ -54,6 +57,7 @@ impl Stddev {
assert!(matches!(data_type, DataType::Float64));
Self {
name: name.into(),
+ signature: Signature::coercible(vec![DataType::Float64],
Volatility::Immutable),
expr,
stats_type,
null_on_divide_by_zero,
@@ -61,31 +65,42 @@ impl Stddev {
}
}
-impl AggregateExpr for Stddev {
+impl AggregateUDFImpl for Stddev {
/// Return a reference to Any that can be used for downcasting
fn as_any(&self) -> &dyn Any {
self
}
- fn field(&self) -> Result<Field> {
- Ok(Field::new(&self.name, DataType::Float64, true))
+ fn name(&self) -> &str {
+ &self.name
+ }
+
+ fn signature(&self) -> &Signature {
+ &self.signature
+ }
+
+ fn return_type(&self, _arg_types: &[DataType]) -> Result<DataType> {
+ Ok(DataType::Float64)
}
- fn create_accumulator(&self) -> Result<Box<dyn Accumulator>> {
+ fn accumulator(&self, _acc_args: AccumulatorArgs) -> Result<Box<dyn
Accumulator>> {
Ok(Box::new(StddevAccumulator::try_new(
self.stats_type,
self.null_on_divide_by_zero,
)?))
}
- fn create_sliding_accumulator(&self) -> Result<Box<dyn Accumulator>> {
+ fn create_sliding_accumulator(
+ &self,
+ _acc_args: AccumulatorArgs,
+ ) -> Result<Box<dyn Accumulator>> {
Ok(Box::new(StddevAccumulator::try_new(
self.stats_type,
self.null_on_divide_by_zero,
)?))
}
- fn state_fields(&self) -> Result<Vec<Field>> {
+ fn state_fields(&self, _args: StateFieldsArgs) -> Result<Vec<Field>> {
Ok(vec![
Field::new(
format_state_name(&self.name, "count"),
@@ -101,14 +116,6 @@ impl AggregateExpr for Stddev {
])
}
- fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
- vec![Arc::clone(&self.expr)]
- }
-
- fn name(&self) -> &str {
- &self.name
- }
-
fn default_value(&self, _data_type: &DataType) -> Result<ScalarValue> {
Ok(ScalarValue::Float64(None))
}
diff --git a/native/core/src/execution/datafusion/expressions/strings.rs
b/native/core/src/execution/datafusion/expressions/strings.rs
index 96e45eae..200b4ec5 100644
--- a/native/core/src/execution/datafusion/expressions/strings.rs
+++ b/native/core/src/execution/datafusion/expressions/strings.rs
@@ -17,10 +17,7 @@
#![allow(deprecated)]
-use crate::execution::{
- datafusion::expressions::utils::down_cast_any_ref,
- kernels::strings::{string_space, substring},
-};
+use crate::execution::kernels::strings::{string_space, substring};
use arrow::{
compute::{
contains_dyn, contains_utf8_scalar_dyn, ends_with_dyn,
ends_with_utf8_scalar_dyn, like_dyn,
@@ -30,6 +27,7 @@ use arrow::{
};
use arrow_schema::{DataType, Schema};
use datafusion::logical_expr::ColumnarValue;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::{DataFusionError, ScalarValue::Utf8};
use datafusion_physical_expr::PhysicalExpr;
use std::{
diff --git a/native/core/src/execution/datafusion/expressions/subquery.rs
b/native/core/src/execution/datafusion/expressions/subquery.rs
index cf6f8d84..3eeb29c1 100644
--- a/native/core/src/execution/datafusion/expressions/subquery.rs
+++ b/native/core/src/execution/datafusion/expressions/subquery.rs
@@ -15,9 +15,14 @@
// specific language governing permissions and limitations
// under the License.
+use crate::{
+ execution::utils::bytes_to_i128,
+ jvm_bridge::{jni_static_call, BinaryWrapper, JVMClasses, StringWrapper},
+};
use arrow_array::RecordBatch;
use arrow_schema::{DataType, Schema, TimeUnit};
use datafusion::logical_expr::ColumnarValue;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::{internal_err, ScalarValue};
use datafusion_physical_expr::PhysicalExpr;
use jni::{
@@ -31,11 +36,6 @@ use std::{
sync::Arc,
};
-use crate::{
- execution::{datafusion::expressions::utils::down_cast_any_ref,
utils::bytes_to_i128},
- jvm_bridge::{jni_static_call, BinaryWrapper, JVMClasses, StringWrapper},
-};
-
#[derive(Debug, Hash)]
pub struct Subquery {
/// The ID of the execution context that owns this subquery. We use this
ID to retrieve the
diff --git a/native/core/src/execution/datafusion/expressions/sum_decimal.rs
b/native/core/src/execution/datafusion/expressions/sum_decimal.rs
index 37030b67..e957bd25 100644
--- a/native/core/src/execution/datafusion/expressions/sum_decimal.rs
+++ b/native/core/src/execution/datafusion/expressions/sum_decimal.rs
@@ -15,6 +15,7 @@
// specific language governing permissions and limitations
// under the License.
+use crate::unlikely;
use arrow::{
array::BooleanBufferBuilder,
buffer::{BooleanBuffer, NullBuffer},
@@ -25,15 +26,18 @@ use arrow_array::{
use arrow_data::decimal::validate_decimal_precision;
use arrow_schema::{DataType, Field};
use datafusion::logical_expr::{Accumulator, EmitTo, GroupsAccumulator};
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::{Result as DFResult, ScalarValue};
-use datafusion_physical_expr::{aggregate::utils::down_cast_any_ref,
AggregateExpr, PhysicalExpr};
+use datafusion_expr::function::{AccumulatorArgs, StateFieldsArgs};
+use datafusion_expr::Volatility::Immutable;
+use datafusion_expr::{AggregateUDFImpl, ReversedUDAF, Signature};
+use datafusion_physical_expr::PhysicalExpr;
use std::{any::Any, ops::BitAnd, sync::Arc};
-use crate::unlikely;
-
#[derive(Debug)]
pub struct SumDecimal {
name: String,
+ signature: Signature,
expr: Arc<dyn PhysicalExpr>,
/// The data type of the SUM result
@@ -56,6 +60,7 @@ impl SumDecimal {
};
Self {
name: name.into(),
+ signature: Signature::user_defined(Immutable),
expr,
result_type: data_type,
precision,
@@ -65,27 +70,19 @@ impl SumDecimal {
}
}
-impl AggregateExpr for SumDecimal {
+impl AggregateUDFImpl for SumDecimal {
fn as_any(&self) -> &dyn Any {
self
}
- fn field(&self) -> DFResult<Field> {
- Ok(Field::new(
- &self.name,
- self.result_type.clone(),
- self.nullable,
- ))
- }
-
- fn create_accumulator(&self) -> DFResult<Box<dyn Accumulator>> {
+ fn accumulator(&self, _args: AccumulatorArgs) -> DFResult<Box<dyn
Accumulator>> {
Ok(Box::new(SumDecimalAccumulator::new(
self.precision,
self.scale,
)))
}
- fn state_fields(&self) -> DFResult<Vec<Field>> {
+ fn state_fields(&self, _args: StateFieldsArgs) -> DFResult<Vec<Field>> {
let fields = vec![
Field::new(&self.name, self.result_type.clone(), self.nullable),
Field::new("is_empty", DataType::Boolean, false),
@@ -93,19 +90,26 @@ impl AggregateExpr for SumDecimal {
Ok(fields)
}
- fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
- vec![Arc::clone(&self.expr)]
- }
-
fn name(&self) -> &str {
&self.name
}
- fn groups_accumulator_supported(&self) -> bool {
+ fn signature(&self) -> &Signature {
+ &self.signature
+ }
+
+ fn return_type(&self, _arg_types: &[DataType]) -> DFResult<DataType> {
+ Ok(self.result_type.clone())
+ }
+
+ fn groups_accumulator_supported(&self, _args: AccumulatorArgs) -> bool {
true
}
- fn create_groups_accumulator(&self) -> DFResult<Box<dyn
GroupsAccumulator>> {
+ fn create_groups_accumulator(
+ &self,
+ _args: AccumulatorArgs,
+ ) -> DFResult<Box<dyn GroupsAccumulator>> {
Ok(Box::new(SumDecimalGroupsAccumulator::new(
self.result_type.clone(),
self.precision,
@@ -119,6 +123,10 @@ impl AggregateExpr for SumDecimal {
&DataType::Decimal128(self.precision, self.scale),
)
}
+
+ fn reverse_expr(&self) -> ReversedUDAF {
+ ReversedUDAF::Identical
+ }
}
impl PartialEq<dyn Any> for SumDecimal {
diff --git a/native/core/src/execution/datafusion/expressions/unbound.rs
b/native/core/src/execution/datafusion/expressions/unbound.rs
index 95f9912c..a6babd0f 100644
--- a/native/core/src/execution/datafusion/expressions/unbound.rs
+++ b/native/core/src/execution/datafusion/expressions/unbound.rs
@@ -15,9 +15,9 @@
// specific language governing permissions and limitations
// under the License.
-use crate::execution::datafusion::expressions::utils::down_cast_any_ref;
use arrow_array::RecordBatch;
use arrow_schema::{DataType, Schema};
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion::physical_plan::ColumnarValue;
use datafusion_common::{internal_err, Result};
use datafusion_physical_expr::PhysicalExpr;
diff --git a/native/core/src/execution/datafusion/expressions/utils.rs
b/native/core/src/execution/datafusion/expressions/utils.rs
deleted file mode 100644
index 540fca86..00000000
--- a/native/core/src/execution/datafusion/expressions/utils.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-// re-export for legacy reasons
-pub use datafusion_comet_spark_expr::utils::down_cast_any_ref;
diff --git a/native/core/src/execution/datafusion/expressions/variance.rs
b/native/core/src/execution/datafusion/expressions/variance.rs
index 5cfbf294..2f4d8091 100644
--- a/native/core/src/execution/datafusion/expressions/variance.rs
+++ b/native/core/src/execution/datafusion/expressions/variance.rs
@@ -17,14 +17,18 @@
use std::{any::Any, sync::Arc};
-use crate::execution::datafusion::expressions::{stats::StatsType,
utils::down_cast_any_ref};
use arrow::{
array::{ArrayRef, Float64Array},
datatypes::{DataType, Field},
};
use datafusion::logical_expr::Accumulator;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::{downcast_value, DataFusionError, Result, ScalarValue};
-use datafusion_physical_expr::{expressions::format_state_name, AggregateExpr,
PhysicalExpr};
+use datafusion_expr::function::{AccumulatorArgs, StateFieldsArgs};
+use datafusion_expr::Volatility::Immutable;
+use datafusion_expr::{AggregateUDFImpl, Signature};
+use datafusion_physical_expr::expressions::StatsType;
+use datafusion_physical_expr::{expressions::format_state_name, PhysicalExpr};
/// VAR_SAMP and VAR_POP aggregate expression
/// The implementation mostly is the same as the DataFusion's implementation.
The reason
@@ -34,6 +38,7 @@ use
datafusion_physical_expr::{expressions::format_state_name, AggregateExpr, Ph
#[derive(Debug)]
pub struct Variance {
name: String,
+ signature: Signature,
expr: Arc<dyn PhysicalExpr>,
stats_type: StatsType,
null_on_divide_by_zero: bool,
@@ -52,6 +57,7 @@ impl Variance {
assert!(matches!(data_type, DataType::Float64));
Self {
name: name.into(),
+ signature: Signature::numeric(1, Immutable),
expr,
stats_type,
null_on_divide_by_zero,
@@ -59,31 +65,39 @@ impl Variance {
}
}
-impl AggregateExpr for Variance {
+impl AggregateUDFImpl for Variance {
/// Return a reference to Any that can be used for downcasting
fn as_any(&self) -> &dyn Any {
self
}
- fn field(&self) -> Result<Field> {
- Ok(Field::new(&self.name, DataType::Float64, true))
+ fn name(&self) -> &str {
+ &self.name
+ }
+
+ fn signature(&self) -> &Signature {
+ &self.signature
+ }
+
+ fn return_type(&self, _arg_types: &[DataType]) -> Result<DataType> {
+ Ok(DataType::Float64)
}
- fn create_accumulator(&self) -> Result<Box<dyn Accumulator>> {
+ fn accumulator(&self, _acc_args: AccumulatorArgs) -> Result<Box<dyn
Accumulator>> {
Ok(Box::new(VarianceAccumulator::try_new(
self.stats_type,
self.null_on_divide_by_zero,
)?))
}
- fn create_sliding_accumulator(&self) -> Result<Box<dyn Accumulator>> {
+ fn create_sliding_accumulator(&self, _args: AccumulatorArgs) ->
Result<Box<dyn Accumulator>> {
Ok(Box::new(VarianceAccumulator::try_new(
self.stats_type,
self.null_on_divide_by_zero,
)?))
}
- fn state_fields(&self) -> Result<Vec<Field>> {
+ fn state_fields(&self, _args: StateFieldsArgs) -> Result<Vec<Field>> {
Ok(vec![
Field::new(
format_state_name(&self.name, "count"),
@@ -99,14 +113,6 @@ impl AggregateExpr for Variance {
])
}
- fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
- vec![Arc::clone(&self.expr)]
- }
-
- fn name(&self) -> &str {
- &self.name
- }
-
fn default_value(&self, _data_type: &DataType) -> Result<ScalarValue> {
Ok(ScalarValue::Float64(None))
}
diff --git a/native/core/src/execution/datafusion/planner.rs
b/native/core/src/execution/datafusion/planner.rs
index 6fca4678..a3057743 100644
--- a/native/core/src/execution/datafusion/planner.rs
+++ b/native/core/src/execution/datafusion/planner.rs
@@ -33,7 +33,6 @@ use crate::{
correlation::Correlation,
covariance::Covariance,
negative,
- stats::StatsType,
stddev::Stddev,
strings::{Contains, EndsWith, Like, StartsWith,
StringSpaceExpr, SubstringExpr},
subquery::Subquery,
@@ -55,7 +54,6 @@ use
datafusion::functions_aggregate::bit_and_or_xor::{bit_and_udaf, bit_or_udaf,
use datafusion::functions_aggregate::min_max::max_udaf;
use datafusion::functions_aggregate::min_max::min_udaf;
use datafusion::functions_aggregate::sum::sum_udaf;
-use
datafusion::physical_expr_functions_aggregate::aggregate::AggregateExprBuilder;
use datafusion::physical_plan::windows::BoundedWindowAggExec;
use datafusion::physical_plan::InputOrderMode;
use datafusion::{
@@ -70,7 +68,7 @@ use datafusion::{
in_list, BinaryExpr, CaseExpr, CastExpr, Column, IsNotNullExpr,
IsNullExpr,
Literal as DataFusionLiteral, NotExpr,
},
- AggregateExpr, PhysicalExpr, PhysicalSortExpr, ScalarFunctionExpr,
+ PhysicalExpr, PhysicalSortExpr, ScalarFunctionExpr,
},
physical_optimizer::join_selection::swap_hash_join,
physical_plan::{
@@ -83,6 +81,8 @@ use datafusion::{
},
prelude::SessionContext,
};
+use datafusion_physical_expr::aggregate::{AggregateExprBuilder,
AggregateFunctionExpr};
+
use datafusion_comet_proto::{
spark_expression::{
self, agg_expr::ExprStruct as AggExprStruct, expr::ExprStruct,
literal::Value, AggExpr,
@@ -105,8 +105,10 @@ use datafusion_common::{
JoinType as DFJoinType, ScalarValue,
};
use datafusion_expr::expr::find_df_window_func;
-use datafusion_expr::{WindowFrame, WindowFrameBound, WindowFrameUnits,
WindowFunctionDefinition};
-use datafusion_physical_expr::expressions::Literal;
+use datafusion_expr::{
+ AggregateUDF, WindowFrame, WindowFrameBound, WindowFrameUnits,
WindowFunctionDefinition,
+};
+use datafusion_physical_expr::expressions::{Literal, StatsType};
use datafusion_physical_expr::window::WindowExpr;
use itertools::Itertools;
use jni::objects::GlobalRef;
@@ -116,7 +118,7 @@ use std::{collections::HashMap, sync::Arc};
// For clippy error on type_complexity.
type ExecResult<T> = Result<T, ExecutionError>;
-type PhyAggResult = Result<Vec<Arc<dyn AggregateExpr>>, ExecutionError>;
+type PhyAggResult = Result<Vec<Arc<AggregateFunctionExpr>>, ExecutionError>;
type PhyExprResult = Result<Vec<(Arc<dyn PhysicalExpr>, String)>,
ExecutionError>;
type PartitionPhyExprResult = Result<Vec<Arc<dyn PhysicalExpr>>,
ExecutionError>;
@@ -1293,7 +1295,7 @@ impl PhysicalPlanner {
&self,
spark_expr: &AggExpr,
schema: SchemaRef,
- ) -> Result<Arc<dyn AggregateExpr>, ExecutionError> {
+ ) -> Result<Arc<AggregateFunctionExpr>, ExecutionError> {
match spark_expr.expr_struct.as_ref().unwrap() {
AggExprStruct::Count(expr) => {
assert!(!expr.children.is_empty());
@@ -1365,12 +1367,24 @@ impl PhysicalPlanner {
match datatype {
DataType::Decimal128(_, _) => {
- Ok(Arc::new(SumDecimal::new("sum", child, datatype)))
+ let func = AggregateUDF::new_from_impl(SumDecimal::new(
+ "sum",
+ Arc::clone(&child),
+ datatype,
+ ));
+ AggregateExprBuilder::new(Arc::new(func), vec![child])
+ .schema(schema)
+ .alias("sum")
+ .with_ignore_nulls(false)
+ .with_distinct(false)
+ .build()
+ .map_err(|e|
ExecutionError::DataFusionError(e.to_string()))
}
_ => {
// cast to the result data type of SUM if necessary,
we should not expect
// a cast failure since it should have already been
checked at Spark side
- let child = Arc::new(CastExpr::new(child,
datatype.clone(), None));
+ let child =
+ Arc::new(CastExpr::new(Arc::clone(&child),
datatype.clone(), None));
AggregateExprBuilder::new(sum_udaf(), vec![child])
.schema(schema)
@@ -1387,24 +1401,45 @@ impl PhysicalPlanner {
let datatype =
to_arrow_datatype(expr.datatype.as_ref().unwrap());
let input_datatype =
to_arrow_datatype(expr.sum_datatype.as_ref().unwrap());
match datatype {
- DataType::Decimal128(_, _) => Ok(Arc::new(AvgDecimal::new(
- child,
- "avg",
- datatype,
- input_datatype,
- ))),
+ DataType::Decimal128(_, _) => {
+ let func = AggregateUDF::new_from_impl(AvgDecimal::new(
+ Arc::clone(&child),
+ "avg",
+ datatype,
+ input_datatype,
+ ));
+ AggregateExprBuilder::new(Arc::new(func), vec![child])
+ .schema(schema)
+ .alias("avg")
+ .with_ignore_nulls(false)
+ .with_distinct(false)
+ .build()
+ .map_err(|e|
ExecutionError::DataFusionError(e.to_string()))
+ }
_ => {
// cast to the result data type of AVG if the result
data type is different
// from the input type, e.g. AVG(Int32). We should not
expect a cast
// failure since it should have already been checked
at Spark side.
- let child = Arc::new(CastExpr::new(child,
datatype.clone(), None));
- Ok(Arc::new(Avg::new(child, "avg", datatype)))
+ let child: Arc<dyn PhysicalExpr> =
+ Arc::new(CastExpr::new(Arc::clone(&child),
datatype.clone(), None));
+ let func = AggregateUDF::new_from_impl(Avg::new(
+ Arc::clone(&child),
+ "avg",
+ datatype,
+ ));
+ AggregateExprBuilder::new(Arc::new(func), vec![child])
+ .schema(schema)
+ .alias("avg")
+ .with_ignore_nulls(false)
+ .with_distinct(false)
+ .build()
+ .map_err(|e|
ExecutionError::DataFusionError(e.to_string()))
}
}
}
AggExprStruct::First(expr) => {
let child = self.create_expr(expr.child.as_ref().unwrap(),
Arc::clone(&schema))?;
- let func =
datafusion_expr::AggregateUDF::new_from_impl(FirstValue::new());
+ let func = AggregateUDF::new_from_impl(FirstValue::new());
AggregateExprBuilder::new(Arc::new(func), vec![child])
.schema(schema)
@@ -1416,7 +1451,7 @@ impl PhysicalPlanner {
}
AggExprStruct::Last(expr) => {
let child = self.create_expr(expr.child.as_ref().unwrap(),
Arc::clone(&schema))?;
- let func =
datafusion_expr::AggregateUDF::new_from_impl(LastValue::new());
+ let func = AggregateUDF::new_from_impl(LastValue::new());
AggregateExprBuilder::new(Arc::new(func), vec![child])
.schema(schema)
@@ -1466,22 +1501,40 @@ impl PhysicalPlanner {
self.create_expr(expr.child2.as_ref().unwrap(),
Arc::clone(&schema))?;
let datatype =
to_arrow_datatype(expr.datatype.as_ref().unwrap());
match expr.stats_type {
- 0 => Ok(Arc::new(Covariance::new(
- child1,
- child2,
- "covariance",
- datatype,
- StatsType::Sample,
- expr.null_on_divide_by_zero,
- ))),
- 1 => Ok(Arc::new(Covariance::new(
- child1,
- child2,
- "covariance_pop",
- datatype,
- StatsType::Population,
- expr.null_on_divide_by_zero,
- ))),
+ 0 => {
+ let func = AggregateUDF::new_from_impl(Covariance::new(
+ Arc::clone(&child1),
+ Arc::clone(&child2),
+ "covariance",
+ datatype,
+ StatsType::Sample,
+ expr.null_on_divide_by_zero,
+ ));
+
+ Self::create_aggr_func_expr(
+ "covariance",
+ schema,
+ vec![child1, child2],
+ func,
+ )
+ }
+ 1 => {
+ let func = AggregateUDF::new_from_impl(Covariance::new(
+ Arc::clone(&child1),
+ Arc::clone(&child2),
+ "covariance_pop",
+ datatype,
+ StatsType::Population,
+ expr.null_on_divide_by_zero,
+ ));
+
+ Self::create_aggr_func_expr(
+ "covariance_pop",
+ schema,
+ vec![child1, child2],
+ func,
+ )
+ }
stats_type => Err(ExecutionError::GeneralError(format!(
"Unknown StatisticsType {:?} for Variance",
stats_type
@@ -1492,20 +1545,28 @@ impl PhysicalPlanner {
let child = self.create_expr(expr.child.as_ref().unwrap(),
Arc::clone(&schema))?;
let datatype =
to_arrow_datatype(expr.datatype.as_ref().unwrap());
match expr.stats_type {
- 0 => Ok(Arc::new(Variance::new(
- child,
- "variance",
- datatype,
- StatsType::Sample,
- expr.null_on_divide_by_zero,
- ))),
- 1 => Ok(Arc::new(Variance::new(
- child,
- "variance_pop",
- datatype,
- StatsType::Population,
- expr.null_on_divide_by_zero,
- ))),
+ 0 => {
+ let func = AggregateUDF::new_from_impl(Variance::new(
+ Arc::clone(&child),
+ "variance",
+ datatype,
+ StatsType::Sample,
+ expr.null_on_divide_by_zero,
+ ));
+
+ Self::create_aggr_func_expr("variance", schema,
vec![child], func)
+ }
+ 1 => {
+ let func = AggregateUDF::new_from_impl(Variance::new(
+ Arc::clone(&child),
+ "variance_pop",
+ datatype,
+ StatsType::Population,
+ expr.null_on_divide_by_zero,
+ ));
+
+ Self::create_aggr_func_expr("variance_pop", schema,
vec![child], func)
+ }
stats_type => Err(ExecutionError::GeneralError(format!(
"Unknown StatisticsType {:?} for Variance",
stats_type
@@ -1516,20 +1577,28 @@ impl PhysicalPlanner {
let child = self.create_expr(expr.child.as_ref().unwrap(),
Arc::clone(&schema))?;
let datatype =
to_arrow_datatype(expr.datatype.as_ref().unwrap());
match expr.stats_type {
- 0 => Ok(Arc::new(Stddev::new(
- child,
- "stddev",
- datatype,
- StatsType::Sample,
- expr.null_on_divide_by_zero,
- ))),
- 1 => Ok(Arc::new(Stddev::new(
- child,
- "stddev_pop",
- datatype,
- StatsType::Population,
- expr.null_on_divide_by_zero,
- ))),
+ 0 => {
+ let func = AggregateUDF::new_from_impl(Stddev::new(
+ Arc::clone(&child),
+ "stddev",
+ datatype,
+ StatsType::Sample,
+ expr.null_on_divide_by_zero,
+ ));
+
+ Self::create_aggr_func_expr("stddev", schema,
vec![child], func)
+ }
+ 1 => {
+ let func = AggregateUDF::new_from_impl(Stddev::new(
+ Arc::clone(&child),
+ "stddev_pop",
+ datatype,
+ StatsType::Population,
+ expr.null_on_divide_by_zero,
+ ));
+
+ Self::create_aggr_func_expr("stddev_pop", schema,
vec![child], func)
+ }
stats_type => Err(ExecutionError::GeneralError(format!(
"Unknown StatisticsType {:?} for stddev",
stats_type
@@ -1542,13 +1611,14 @@ impl PhysicalPlanner {
let child2 =
self.create_expr(expr.child2.as_ref().unwrap(),
Arc::clone(&schema))?;
let datatype =
to_arrow_datatype(expr.datatype.as_ref().unwrap());
- Ok(Arc::new(Correlation::new(
- child1,
- child2,
+ let func = AggregateUDF::new_from_impl(Correlation::new(
+ Arc::clone(&child1),
+ Arc::clone(&child2),
"correlation",
datatype,
expr.null_on_divide_by_zero,
- )))
+ ));
+ Self::create_aggr_func_expr("correlation", schema,
vec![child1, child2], func)
}
}
}
@@ -1809,6 +1879,21 @@ impl PhysicalPlanner {
Ok(scalar_expr)
}
+
+ fn create_aggr_func_expr(
+ name: &str,
+ schema: SchemaRef,
+ children: Vec<Arc<dyn PhysicalExpr>>,
+ func: AggregateUDF,
+ ) -> Result<Arc<AggregateFunctionExpr>, ExecutionError> {
+ AggregateExprBuilder::new(Arc::new(func), children)
+ .schema(schema)
+ .alias(name)
+ .with_ignore_nulls(false)
+ .with_distinct(false)
+ .build()
+ .map_err(|e| e.into())
+ }
}
impl From<DataFusionError> for ExecutionError {
diff --git a/native/core/src/execution/jni_api.rs
b/native/core/src/execution/jni_api.rs
index 1cb790ef..2d99a854 100644
--- a/native/core/src/execution/jni_api.rs
+++ b/native/core/src/execution/jni_api.rs
@@ -240,7 +240,7 @@ fn prepare_datafusion_session_context(
// this is the threshold of number of groups / number of rows and
the
// maximum value is 1.0, so we set the threshold a little higher
just
// to be safe
- ScalarValue::Float64(Some(1.1)),
+ &ScalarValue::Float64(Some(1.1)),
);
for (key, value) in conf.iter().filter(|(k, _)|
k.starts_with("datafusion.")) {
diff --git a/native/spark-expr/Cargo.toml b/native/spark-expr/Cargo.toml
index 0a371a6e..a5d15691 100644
--- a/native/spark-expr/Cargo.toml
+++ b/native/spark-expr/Cargo.toml
@@ -35,7 +35,6 @@ datafusion = { workspace = true }
datafusion-common = { workspace = true }
datafusion-expr = { workspace = true }
datafusion-physical-expr = { workspace = true }
-datafusion-physical-plan = { workspace = true }
chrono-tz = { workspace = true }
num = { workspace = true }
regex = { workspace = true }
diff --git a/native/spark-expr/src/cast.rs b/native/spark-expr/src/cast.rs
index 12dbfdcd..6a3974fe 100644
--- a/native/spark-expr/src/cast.rs
+++ b/native/spark-expr/src/cast.rs
@@ -50,6 +50,7 @@ use datafusion_expr::ColumnarValue;
use datafusion_physical_expr::PhysicalExpr;
use chrono::{NaiveDate, NaiveDateTime, TimeZone, Timelike};
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use num::{
cast::AsPrimitive, integer::div_floor, traits::CheckedNeg, CheckedSub,
Integer, Num,
ToPrimitive,
@@ -57,7 +58,7 @@ use num::{
use regex::Regex;
use crate::timezone;
-use crate::utils::{array_with_timezone, down_cast_any_ref};
+use crate::utils::array_with_timezone;
use crate::{EvalMode, SparkError, SparkResult};
diff --git a/native/spark-expr/src/if_expr.rs b/native/spark-expr/src/if_expr.rs
index 9a90b727..193a90fb 100644
--- a/native/spark-expr/src/if_expr.rs
+++ b/native/spark-expr/src/if_expr.rs
@@ -26,11 +26,10 @@ use arrow::{
record_batch::RecordBatch,
};
use datafusion::logical_expr::ColumnarValue;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::Result;
use datafusion_physical_expr::{expressions::CaseExpr, PhysicalExpr};
-use crate::utils::down_cast_any_ref;
-
/// IfExpr is a wrapper around CaseExpr, because `IF(a, b, c)` is semantically
equivalent to
/// `CASE WHEN a THEN b ELSE c END`.
#[derive(Debug, Hash)]
diff --git a/native/spark-expr/src/regexp.rs b/native/spark-expr/src/regexp.rs
index 221fd1f0..c7626285 100644
--- a/native/spark-expr/src/regexp.rs
+++ b/native/spark-expr/src/regexp.rs
@@ -15,13 +15,13 @@
// specific language governing permissions and limitations
// under the License.
-use crate::utils::down_cast_any_ref;
use crate::SparkError;
use arrow::compute::take;
use arrow_array::builder::BooleanBuilder;
use arrow_array::types::Int32Type;
use arrow_array::{Array, BooleanArray, DictionaryArray, RecordBatch,
StringArray};
use arrow_schema::{DataType, Schema};
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::{internal_err, Result};
use datafusion_expr::ColumnarValue;
use datafusion_physical_expr::PhysicalExpr;
diff --git a/native/spark-expr/src/structs.rs b/native/spark-expr/src/structs.rs
index 49017b67..cda8246d 100644
--- a/native/spark-expr/src/structs.rs
+++ b/native/spark-expr/src/structs.rs
@@ -19,6 +19,7 @@ use arrow::record_batch::RecordBatch;
use arrow_array::{Array, StructArray};
use arrow_schema::{DataType, Field, Schema};
use datafusion::logical_expr::ColumnarValue;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::{DataFusionError, Result as DataFusionResult,
ScalarValue};
use datafusion_physical_expr::PhysicalExpr;
use std::{
@@ -28,8 +29,6 @@ use std::{
sync::Arc,
};
-use crate::utils::down_cast_any_ref;
-
#[derive(Debug, Hash)]
pub struct CreateNamedStruct {
values: Vec<Arc<dyn PhysicalExpr>>,
diff --git a/native/spark-expr/src/temporal.rs
b/native/spark-expr/src/temporal.rs
index 415db607..91953dd6 100644
--- a/native/spark-expr/src/temporal.rs
+++ b/native/spark-expr/src/temporal.rs
@@ -28,10 +28,11 @@ use arrow::{
};
use arrow_schema::{DataType, Schema, TimeUnit::Microsecond};
use datafusion::logical_expr::ColumnarValue;
+use datafusion::physical_expr_common::physical_expr::down_cast_any_ref;
use datafusion_common::{DataFusionError, ScalarValue::Utf8};
use datafusion_physical_expr::PhysicalExpr;
-use crate::utils::{array_with_timezone, down_cast_any_ref};
+use crate::utils::array_with_timezone;
use crate::kernels::temporal::{
date_trunc_array_fmt_dyn, date_trunc_dyn, timestamp_trunc_array_fmt_dyn,
timestamp_trunc_dyn,
diff --git a/native/spark-expr/src/utils.rs b/native/spark-expr/src/utils.rs
index 6945e82b..db4ad195 100644
--- a/native/spark-expr/src/utils.rs
+++ b/native/spark-expr/src/utils.rs
@@ -20,7 +20,6 @@ use arrow_array::{
types::{Int32Type, TimestampMicrosecondType},
};
use arrow_schema::{ArrowError, DataType};
-use std::any::Any;
use std::sync::Arc;
use crate::timezone::Tz;
@@ -30,23 +29,6 @@ use arrow::{
};
use chrono::{DateTime, Offset, TimeZone};
-use datafusion_physical_plan::PhysicalExpr;
-
-/// A utility function from DataFusion. It is not exposed by DataFusion.
-pub fn down_cast_any_ref(any: &dyn Any) -> &dyn Any {
- if any.is::<Arc<dyn PhysicalExpr>>() {
- any.downcast_ref::<Arc<dyn PhysicalExpr>>()
- .unwrap()
- .as_any()
- } else if any.is::<Box<dyn PhysicalExpr>>() {
- any.downcast_ref::<Box<dyn PhysicalExpr>>()
- .unwrap()
- .as_any()
- } else {
- any
- }
-}
-
/// Preprocesses input arrays to add timezone information from Spark to Arrow
array datatype or
/// to apply timezone offset.
//
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]