You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by yj...@apache.org on 2022/04/06 04:38:37 UTC
[arrow-datafusion] branch master updated: Reduce repetition in Decimal binary kernels, upgrade to arrow 11.1 (#2107)
This is an automated email from the ASF dual-hosted git repository.
yjshen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/master by this push:
new 38498b7bf Reduce repetition in Decimal binary kernels, upgrade to arrow 11.1 (#2107)
38498b7bf is described below
commit 38498b7bfb2dd05f0d9b7ffceb21da4528a697a1
Author: Andrew Lamb <an...@nerdnetworks.org>
AuthorDate: Wed Apr 6 00:38:32 2022 -0400
Reduce repetition in Decimal binary kernels, upgrade to arrow 11.1 (#2107)
* Reduce repetition in Decimal binary kernels
* complete cleanup/
* Update to arrow 11.1
* Update datafusion-cli Cargo
---
ballista/rust/core/Cargo.toml | 2 +-
ballista/rust/executor/Cargo.toml | 4 +-
datafusion-cli/Cargo.lock | 104 +++----
datafusion-cli/Cargo.toml | 2 +-
datafusion-examples/Cargo.toml | 2 +-
datafusion/common/Cargo.toml | 4 +-
datafusion/core/Cargo.toml | 4 +-
datafusion/core/fuzz-utils/Cargo.toml | 2 +-
datafusion/expr/Cargo.toml | 2 +-
datafusion/jit/Cargo.toml | 2 +-
datafusion/physical-expr/Cargo.toml | 2 +-
datafusion/physical-expr/src/expressions/binary.rs | 298 ++++++++-------------
12 files changed, 181 insertions(+), 247 deletions(-)
diff --git a/ballista/rust/core/Cargo.toml b/ballista/rust/core/Cargo.toml
index 5d5a3ab77..800ed53be 100644
--- a/ballista/rust/core/Cargo.toml
+++ b/ballista/rust/core/Cargo.toml
@@ -34,7 +34,7 @@ simd = ["datafusion/simd"]
[dependencies]
ahash = { version = "0.7", default-features = false }
-arrow-flight = { version = "11" }
+arrow-flight = { version = "11.1" }
async-trait = "0.1.41"
chrono = { version = "0.4", default-features = false }
clap = { version = "3", features = ["derive", "cargo"] }
diff --git a/ballista/rust/executor/Cargo.toml b/ballista/rust/executor/Cargo.toml
index 69326352f..9ee793b7b 100644
--- a/ballista/rust/executor/Cargo.toml
+++ b/ballista/rust/executor/Cargo.toml
@@ -33,8 +33,8 @@ snmalloc = ["snmalloc-rs"]
[dependencies]
anyhow = "1"
-arrow = { version = "11" }
-arrow-flight = { version = "11" }
+arrow = { version = "11.1" }
+arrow-flight = { version = "11.1" }
async-trait = "0.1.41"
ballista-core = { path = "../core", version = "0.6.0" }
chrono = { version = "0.4", default-features = false }
diff --git a/datafusion-cli/Cargo.lock b/datafusion-cli/Cargo.lock
index f334af5fa..0263c275b 100644
--- a/datafusion-cli/Cargo.lock
+++ b/datafusion-cli/Cargo.lock
@@ -63,9 +63,9 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
[[package]]
name = "arrow"
-version = "11.0.0"
+version = "11.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db922bcac0aa9f3b6e191d73b0b5df925c2c10ab4893f7416359f289e5d23489"
+checksum = "3e4a0aa844fa9e1933504b4cd10e776167f370b746d0a622f32696d8d3b252e7"
dependencies = [
"bitflags",
"chrono",
@@ -88,9 +88,9 @@ dependencies = [
[[package]]
name = "arrow-flight"
-version = "11.0.0"
+version = "11.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2031e8b2b68eee8f7e1187cbc9c6eb9e3d09c48d937aa3a82e446db30a5f545d"
+checksum = "6538896d203d3f159be25a66279960a3cccfc24381447d06ac9240d5f60dd51a"
dependencies = [
"arrow",
"base64",
@@ -239,9 +239,9 @@ dependencies = [
[[package]]
name = "brotli"
-version = "3.3.3"
+version = "3.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f838e47a451d5a8fa552371f80024dd6ace9b7acdf25c4c3d0f9bc6816fb1c39"
+checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
@@ -311,9 +311,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "3.1.6"
+version = "3.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8c93436c21e4698bacadf42917db28b23017027a4deccb35dbe47a7e7840123"
+checksum = "71c47df61d9e16dc010b55dba1952a57d8c215dbb533fd13cdd13369aac73b1c"
dependencies = [
"atty",
"bitflags",
@@ -328,9 +328,9 @@ dependencies = [
[[package]]
name = "clap_derive"
-version = "3.1.4"
+version = "3.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da95d038ede1a964ce99f49cbe27a7fb538d1da595e4b4f70b8c8f338d17bf16"
+checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1"
dependencies = [
"heck 0.4.0",
"proc-macro-error",
@@ -801,9 +801,9 @@ dependencies = [
[[package]]
name = "h2"
-version = "0.3.12"
+version = "0.3.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62eeb471aa3e3c9197aa4bfeabfe02982f6dc96f750486c0bb0009ac58b26d2b"
+checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57"
dependencies = [
"bytes",
"fnv",
@@ -814,7 +814,7 @@ dependencies = [
"indexmap",
"slab",
"tokio",
- "tokio-util 0.6.9",
+ "tokio-util 0.7.1",
"tracing",
]
@@ -947,9 +947,9 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "1.8.0"
+version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223"
+checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee"
dependencies = [
"autocfg",
"hashbrown 0.11.2",
@@ -1099,10 +1099,11 @@ checksum = "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7"
[[package]]
name = "lock_api"
-version = "0.4.6"
+version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b"
+checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53"
dependencies = [
+ "autocfg",
"scopeguard",
]
@@ -1389,22 +1390,22 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.1"
+version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954"
+checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
- "windows-sys 0.32.0",
+ "windows-sys 0.34.0",
]
[[package]]
name = "parquet"
-version = "11.0.0"
+version = "11.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1460c04ede29e7a2d825357cd764c403b5d28ebdabc129876552c8a86a4ee9a8"
+checksum = "9e2ba225e8c800adda2da6b0d63a65abf71867868682947ccb8fc6a9c68ba541"
dependencies = [
"arrow",
"base64",
@@ -1634,18 +1635,18 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.2.12"
+version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ae183fc1b06c149f0c1793e1eb447c8b04bfe46d48e9e48bfb8d2d7ed64ecf0"
+checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42"
dependencies = [
"bitflags",
]
[[package]]
name = "redox_users"
-version = "0.4.2"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7776223e2696f1aa4c6b0170e83212f47296a00424305117d013dfe86fb0fe55"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
dependencies = [
"getrandom",
"redox_syscall",
@@ -1686,9 +1687,9 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.34.1"
+version = "0.34.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd3cc851a13d30a34cb747ba2a0c5101a4b2e8b1677a29b213ee465365ea495e"
+checksum = "96619609a54d638872db136f56941d34e2a00bb0acf3fa783a90d6b96a093ba2"
dependencies = [
"bitflags",
"errno",
@@ -1785,9 +1786,9 @@ dependencies = [
[[package]]
name = "slab"
-version = "0.4.5"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5"
+checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32"
[[package]]
name = "smallvec"
@@ -1813,9 +1814,9 @@ dependencies = [
[[package]]
name = "sqlparser"
-version = "0.15.0"
+version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adbbea2526ad0d02ad9414a07c396078a5b944bbf9ca4fbab8f01bb4cb579081"
+checksum = "7e9a527b68048eb95495a1508f6c8395c8defcff5ecdbe8ad4106d08a2ef2a3c"
dependencies = [
"log",
]
@@ -2020,6 +2021,7 @@ dependencies = [
"futures-sink",
"pin-project-lite",
"tokio",
+ "tracing",
]
[[package]]
@@ -2123,9 +2125,9 @@ dependencies = [
[[package]]
name = "tracing-core"
-version = "0.1.23"
+version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c"
+checksum = "90442985ee2f57c9e1b548ee72ae842f4a9a20e3f417cc38dbc5dc684d9bb4ee"
dependencies = [
"lazy_static",
]
@@ -2270,15 +2272,15 @@ dependencies = [
[[package]]
name = "windows-sys"
-version = "0.32.0"
+version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6"
+checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825"
dependencies = [
- "windows_aarch64_msvc 0.32.0",
- "windows_i686_gnu 0.32.0",
- "windows_i686_msvc 0.32.0",
- "windows_x86_64_gnu 0.32.0",
- "windows_x86_64_msvc 0.32.0",
+ "windows_aarch64_msvc 0.34.0",
+ "windows_i686_gnu 0.34.0",
+ "windows_i686_msvc 0.34.0",
+ "windows_x86_64_gnu 0.34.0",
+ "windows_x86_64_msvc 0.34.0",
]
[[package]]
@@ -2289,9 +2291,9 @@ checksum = "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.32.0"
+version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5"
+checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d"
[[package]]
name = "windows_i686_gnu"
@@ -2301,9 +2303,9 @@ checksum = "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8"
[[package]]
name = "windows_i686_gnu"
-version = "0.32.0"
+version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615"
+checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed"
[[package]]
name = "windows_i686_msvc"
@@ -2313,9 +2315,9 @@ checksum = "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6"
[[package]]
name = "windows_i686_msvc"
-version = "0.32.0"
+version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172"
+checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956"
[[package]]
name = "windows_x86_64_gnu"
@@ -2325,9 +2327,9 @@ checksum = "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.32.0"
+version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc"
+checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4"
[[package]]
name = "windows_x86_64_msvc"
@@ -2337,9 +2339,9 @@ checksum = "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.32.0"
+version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316"
+checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9"
[[package]]
name = "zstd"
diff --git a/datafusion-cli/Cargo.toml b/datafusion-cli/Cargo.toml
index 03d394f61..3a9a97083 100644
--- a/datafusion-cli/Cargo.toml
+++ b/datafusion-cli/Cargo.toml
@@ -28,7 +28,7 @@ repository = "https://github.com/apache/arrow-datafusion"
rust-version = "1.59"
[dependencies]
-arrow = { version = "11" }
+arrow = { version = "11.1" }
ballista = { path = "../ballista/rust/client", version = "0.6.0", optional = true }
clap = { version = "3", features = ["derive", "cargo"] }
datafusion = { path = "../datafusion/core", version = "7.0.0" }
diff --git a/datafusion-examples/Cargo.toml b/datafusion-examples/Cargo.toml
index 02d3abef5..8a9c2feb4 100644
--- a/datafusion-examples/Cargo.toml
+++ b/datafusion-examples/Cargo.toml
@@ -34,7 +34,7 @@ path = "examples/avro_sql.rs"
required-features = ["datafusion/avro"]
[dev-dependencies]
-arrow-flight = { version = "11" }
+arrow-flight = { version = "11.1" }
async-trait = "0.1.41"
datafusion = { path = "../datafusion/core" }
futures = "0.3"
diff --git a/datafusion/common/Cargo.toml b/datafusion/common/Cargo.toml
index 8917b8257..4ac4e978e 100644
--- a/datafusion/common/Cargo.toml
+++ b/datafusion/common/Cargo.toml
@@ -38,10 +38,10 @@ jit = ["cranelift-module"]
pyarrow = ["pyo3"]
[dependencies]
-arrow = { version = "11", features = ["prettyprint"] }
+arrow = { version = "11.1", features = ["prettyprint"] }
avro-rs = { version = "0.13", features = ["snappy"], optional = true }
cranelift-module = { version = "0.82.0", optional = true }
ordered-float = "2.10"
-parquet = { version = "11", features = ["arrow"], optional = true }
+parquet = { version = "11.1", features = ["arrow"], optional = true }
pyo3 = { version = "0.16", optional = true }
sqlparser = "0.16"
diff --git a/datafusion/core/Cargo.toml b/datafusion/core/Cargo.toml
index 94ad25bc7..77d82cb46 100644
--- a/datafusion/core/Cargo.toml
+++ b/datafusion/core/Cargo.toml
@@ -55,7 +55,7 @@ unicode_expressions = ["datafusion-physical-expr/regex_expressions"]
[dependencies]
ahash = { version = "0.7", default-features = false }
-arrow = { version = "11", features = ["prettyprint"] }
+arrow = { version = "11.1", features = ["prettyprint"] }
async-trait = "0.1.41"
avro-rs = { version = "0.13", features = ["snappy"], optional = true }
chrono = { version = "0.4", default-features = false }
@@ -72,7 +72,7 @@ num-traits = { version = "0.2", optional = true }
num_cpus = "1.13.0"
ordered-float = "2.10"
parking_lot = "0.12"
-parquet = { version = "11", features = ["arrow"] }
+parquet = { version = "11.1", features = ["arrow"] }
paste = "^1.0"
pin-project-lite= "^0.2.7"
pyo3 = { version = "0.16", optional = true }
diff --git a/datafusion/core/fuzz-utils/Cargo.toml b/datafusion/core/fuzz-utils/Cargo.toml
index 20745867a..65e36797a 100644
--- a/datafusion/core/fuzz-utils/Cargo.toml
+++ b/datafusion/core/fuzz-utils/Cargo.toml
@@ -23,6 +23,6 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
-arrow = { version = "11", features = ["prettyprint"] }
+arrow = { version = "11.1", features = ["prettyprint"] }
env_logger = "0.9.0"
rand = "0.8"
diff --git a/datafusion/expr/Cargo.toml b/datafusion/expr/Cargo.toml
index f807d4e8c..33f51e387 100644
--- a/datafusion/expr/Cargo.toml
+++ b/datafusion/expr/Cargo.toml
@@ -36,6 +36,6 @@ path = "src/lib.rs"
[dependencies]
ahash = { version = "0.7", default-features = false }
-arrow = { version = "11", features = ["prettyprint"] }
+arrow = { version = "11.1", features = ["prettyprint"] }
datafusion-common = { path = "../common", version = "7.0.0" }
sqlparser = "0.16"
diff --git a/datafusion/jit/Cargo.toml b/datafusion/jit/Cargo.toml
index e539e2b1f..052f5d82e 100644
--- a/datafusion/jit/Cargo.toml
+++ b/datafusion/jit/Cargo.toml
@@ -36,7 +36,7 @@ path = "src/lib.rs"
jit = []
[dependencies]
-arrow = { version = "11" }
+arrow = { version = "11.1" }
cranelift = "0.82.0"
cranelift-jit = "0.82.0"
cranelift-module = "0.82.0"
diff --git a/datafusion/physical-expr/Cargo.toml b/datafusion/physical-expr/Cargo.toml
index 8f93c72a5..6c39a0049 100644
--- a/datafusion/physical-expr/Cargo.toml
+++ b/datafusion/physical-expr/Cargo.toml
@@ -40,7 +40,7 @@ unicode_expressions = ["unicode-segmentation"]
[dependencies]
ahash = { version = "0.7", default-features = false }
-arrow = { version = "11", features = ["prettyprint"] }
+arrow = { version = "11.1", features = ["prettyprint"] }
blake2 = { version = "^0.10.2", optional = true }
blake3 = { version = "1.0", optional = true }
chrono = { version = "0.4", default-features = false }
diff --git a/datafusion/physical-expr/src/expressions/binary.rs b/datafusion/physical-expr/src/expressions/binary.rs
index 6b40c8f5a..c3fc216aa 100644
--- a/datafusion/physical-expr/src/expressions/binary.rs
+++ b/datafusion/physical-expr/src/expressions/binary.rs
@@ -135,260 +135,192 @@ fn is_not_distinct_from_bool(
// TODO move decimal kernels to to arrow-rs
// https://github.com/apache/arrow-rs/issues/1200
-// TODO use iter added for for decimal array in
-// https://github.com/apache/arrow-rs/issues/1083
+/// Creates an BooleanArray the same size as `left`,
+/// applying `op` to all non-null elements of left
+fn compare_decimal_scalar<F>(
+ left: &DecimalArray,
+ right: i128,
+ op: F,
+) -> Result<BooleanArray>
+where
+ F: Fn(i128, i128) -> bool,
+{
+ Ok(left
+ .iter()
+ .map(|left| left.map(|left| op(left, right)))
+ .collect())
+}
+
+/// Creates an BooleanArray the same size as `left`,
+/// by applying `op` to all non-null elements of left and right
+fn compare_decimal<F>(
+ left: &DecimalArray,
+ right: &DecimalArray,
+ op: F,
+) -> Result<BooleanArray>
+where
+ F: Fn(i128, i128) -> bool,
+{
+ Ok(left
+ .iter()
+ .zip(right.iter())
+ .map(|(left, right)| {
+ if let (Some(left), Some(right)) = (left, right) {
+ Some(op(left, right))
+ } else {
+ None
+ }
+ })
+ .collect())
+}
+
pub(super) fn eq_decimal_scalar(
left: &DecimalArray,
right: i128,
) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) == right)?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal_scalar(left, right, |left, right| left == right)
}
pub(super) fn eq_decimal(
left: &DecimalArray,
right: &DecimalArray,
) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) || right.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) == right.value(i))?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal(left, right, |left, right| left == right)
}
fn neq_decimal_scalar(left: &DecimalArray, right: i128) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) != right)?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal_scalar(left, right, |left, right| left != right)
}
fn neq_decimal(left: &DecimalArray, right: &DecimalArray) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) || right.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) != right.value(i))?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal(left, right, |left, right| left != right)
}
fn lt_decimal_scalar(left: &DecimalArray, right: i128) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) < right)?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal_scalar(left, right, |left, right| left < right)
}
fn lt_decimal(left: &DecimalArray, right: &DecimalArray) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) || right.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) < right.value(i))?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal(left, right, |left, right| left < right)
}
fn lt_eq_decimal_scalar(left: &DecimalArray, right: i128) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) <= right)?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal_scalar(left, right, |left, right| left <= right)
}
fn lt_eq_decimal(left: &DecimalArray, right: &DecimalArray) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) || right.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) <= right.value(i))?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal(left, right, |left, right| left <= right)
}
fn gt_decimal_scalar(left: &DecimalArray, right: i128) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) > right)?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal_scalar(left, right, |left, right| left > right)
}
fn gt_decimal(left: &DecimalArray, right: &DecimalArray) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) || right.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) > right.value(i))?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal(left, right, |left, right| left > right)
}
fn gt_eq_decimal_scalar(left: &DecimalArray, right: i128) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) >= right)?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal_scalar(left, right, |left, right| left >= right)
}
fn gt_eq_decimal(left: &DecimalArray, right: &DecimalArray) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- if left.is_null(i) || right.is_null(i) {
- bool_builder.append_null()?;
- } else {
- bool_builder.append_value(left.value(i) >= right.value(i))?;
- }
- }
- Ok(bool_builder.finish())
+ compare_decimal(left, right, |left, right| left >= right)
}
fn is_distinct_from_decimal(
left: &DecimalArray,
right: &DecimalArray,
) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- match (left.is_null(i), right.is_null(i)) {
- (true, true) => bool_builder.append_value(false)?,
- (true, false) | (false, true) => bool_builder.append_value(true)?,
- (_, _) => bool_builder.append_value(left.value(i) != right.value(i))?,
- }
- }
- Ok(bool_builder.finish())
+ Ok(left
+ .iter()
+ .zip(right.iter())
+ .map(|(left, right)| match (left, right) {
+ (None, None) => Some(false),
+ (None, Some(_)) | (Some(_), None) => Some(true),
+ (Some(left), Some(right)) => Some(left != right),
+ })
+ .collect())
}
fn is_not_distinct_from_decimal(
left: &DecimalArray,
right: &DecimalArray,
) -> Result<BooleanArray> {
- let mut bool_builder = BooleanBuilder::new(left.len());
- for i in 0..left.len() {
- match (left.is_null(i), right.is_null(i)) {
- (true, true) => bool_builder.append_value(true)?,
- (true, false) | (false, true) => bool_builder.append_value(false)?,
- (_, _) => bool_builder.append_value(left.value(i) == right.value(i))?,
- }
- }
- Ok(bool_builder.finish())
+ Ok(left
+ .iter()
+ .zip(right.iter())
+ .map(|(left, right)| match (left, right) {
+ (None, None) => Some(true),
+ (None, Some(_)) | (Some(_), None) => Some(false),
+ (Some(left), Some(right)) => Some(left == right),
+ })
+ .collect())
+}
+
+/// Creates an DecimalArray the same size as `left`,
+/// by applying `op` to all non-null elements of left and right
+fn arith_decimal<F>(
+ left: &DecimalArray,
+ right: &DecimalArray,
+ op: F,
+) -> Result<DecimalArray>
+where
+ F: Fn(i128, i128) -> Result<i128>,
+{
+ left.iter()
+ .zip(right.iter())
+ .map(|(left, right)| {
+ if let (Some(left), Some(right)) = (left, right) {
+ Some(op(left, right)).transpose()
+ } else {
+ Ok(None)
+ }
+ })
+ .collect()
}
fn add_decimal(left: &DecimalArray, right: &DecimalArray) -> Result<DecimalArray> {
- let mut decimal_builder =
- DecimalBuilder::new(left.len(), left.precision(), left.scale());
- for i in 0..left.len() {
- if left.is_null(i) || right.is_null(i) {
- decimal_builder.append_null()?;
- } else {
- decimal_builder.append_value(left.value(i) + right.value(i))?;
- }
- }
- Ok(decimal_builder.finish())
+ let array = arith_decimal(left, right, |left, right| Ok(left + right))?
+ .with_precision_and_scale(left.precision(), left.scale())?;
+ Ok(array)
}
fn subtract_decimal(left: &DecimalArray, right: &DecimalArray) -> Result<DecimalArray> {
- let mut decimal_builder =
- DecimalBuilder::new(left.len(), left.precision(), left.scale());
- for i in 0..left.len() {
- if left.is_null(i) || right.is_null(i) {
- decimal_builder.append_null()?;
- } else {
- decimal_builder.append_value(left.value(i) - right.value(i))?;
- }
- }
- Ok(decimal_builder.finish())
+ let array = arith_decimal(left, right, |left, right| Ok(left - right))?
+ .with_precision_and_scale(left.precision(), left.scale())?;
+ Ok(array)
}
fn multiply_decimal(left: &DecimalArray, right: &DecimalArray) -> Result<DecimalArray> {
- let mut decimal_builder =
- DecimalBuilder::new(left.len(), left.precision(), left.scale());
let divide = 10_i128.pow(left.scale() as u32);
- for i in 0..left.len() {
- if left.is_null(i) || right.is_null(i) {
- decimal_builder.append_null()?;
- } else {
- decimal_builder.append_value(left.value(i) * right.value(i) / divide)?;
- }
- }
- Ok(decimal_builder.finish())
+ let array = arith_decimal(left, right, |left, right| Ok(left * right / divide))?
+ .with_precision_and_scale(left.precision(), left.scale())?;
+ Ok(array)
}
fn divide_decimal(left: &DecimalArray, right: &DecimalArray) -> Result<DecimalArray> {
- let mut decimal_builder =
- DecimalBuilder::new(left.len(), left.precision(), left.scale());
let mul = 10_f64.powi(left.scale() as i32);
- for i in 0..left.len() {
- if left.is_null(i) || right.is_null(i) {
- decimal_builder.append_null()?;
- } else if right.value(i) == 0 {
- return Err(DataFusionError::ArrowError(DivideByZero));
- } else {
- let l_value = left.value(i) as f64;
- let r_value = right.value(i) as f64;
- let result = ((l_value / r_value) * mul) as i128;
- decimal_builder.append_value(result)?;
- }
- }
- Ok(decimal_builder.finish())
+ let array = arith_decimal(left, right, |left, right| {
+ let l_value = left as f64;
+ let r_value = right as f64;
+ let result = ((l_value / r_value) * mul) as i128;
+ Ok(result)
+ })?
+ .with_precision_and_scale(left.precision(), left.scale())?;
+ Ok(array)
}
fn modulus_decimal(left: &DecimalArray, right: &DecimalArray) -> Result<DecimalArray> {
- let mut decimal_builder =
- DecimalBuilder::new(left.len(), left.precision(), left.scale());
- for i in 0..left.len() {
- if left.is_null(i) || right.is_null(i) {
- decimal_builder.append_null()?;
- } else if right.value(i) == 0 {
- return Err(DataFusionError::ArrowError(DivideByZero));
+ let array = arith_decimal(left, right, |left, right| {
+ if right == 0 {
+ Err(DataFusionError::ArrowError(DivideByZero))
} else {
- decimal_builder.append_value(left.value(i) % right.value(i))?;
+ Ok(left % right)
}
- }
- Ok(decimal_builder.finish())
+ })?
+ .with_precision_and_scale(left.precision(), left.scale())?;
+ Ok(array)
}
/// The binary_bitwise_array_op macro only evaluates for integer types