Skip to content

Commit 17bbc12

Browse files
rluvatontobixdev
authored andcommitted
perf: improve ScalarValue::to_array_of_size for Boolean and some null values (apache#18180)
## Which issue does this PR close? N/A ## Rationale for this change make stuff faster ## What changes are included in this PR? 1. updated Boolean scalar to array to use existing functions for creating `BooleanArray` with the same value n times 2. Update None `Binary`/`BinaryView`/`FixedSizeBinary`/`LargeBinary` to use `new_null_array` instead of repeat ## Are these changes tested? Existing tests ## Are there any user-facing changes? Nope
1 parent d4a842d commit 17bbc12

File tree

1 file changed

+16
-18
lines changed
  • datafusion/common/src/scalar

1 file changed

+16
-18
lines changed

datafusion/common/src/scalar/mod.rs

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ use arrow::array::{
7070
TimestampNanosecondArray, TimestampSecondArray, UInt16Array, UInt32Array,
7171
UInt64Array, UInt8Array, UnionArray,
7272
};
73-
use arrow::buffer::ScalarBuffer;
73+
use arrow::buffer::{BooleanBuffer, ScalarBuffer};
7474
use arrow::compute::kernels::cast::{cast_with_options, CastOptions};
7575
use arrow::compute::kernels::numeric::{
7676
add, add_wrapping, div, mul, mul_wrapping, rem, sub, sub_wrapping,
@@ -2888,9 +2888,17 @@ impl ScalarValue {
28882888
ScalarValue::Decimal256(e, precision, scale) => Arc::new(
28892889
ScalarValue::build_decimal256_array(*e, *precision, *scale, size)?,
28902890
),
2891-
ScalarValue::Boolean(e) => {
2892-
Arc::new(BooleanArray::from(vec![*e; size])) as ArrayRef
2893-
}
2891+
ScalarValue::Boolean(e) => match e {
2892+
None => new_null_array(&DataType::Boolean, size),
2893+
Some(true) => {
2894+
Arc::new(BooleanArray::new(BooleanBuffer::new_set(size), None))
2895+
as ArrayRef
2896+
}
2897+
Some(false) => {
2898+
Arc::new(BooleanArray::new(BooleanBuffer::new_unset(size), None))
2899+
as ArrayRef
2900+
}
2901+
},
28942902
ScalarValue::Float64(e) => {
28952903
build_array_from_option!(Float64, Float64Array, e, size)
28962904
}
@@ -2973,15 +2981,13 @@ impl ScalarValue {
29732981
Some(value) => Arc::new(
29742982
repeat_n(Some(value.as_slice()), size).collect::<BinaryArray>(),
29752983
),
2976-
None => Arc::new(repeat_n(None::<&str>, size).collect::<BinaryArray>()),
2984+
None => new_null_array(&DataType::Binary, size),
29772985
},
29782986
ScalarValue::BinaryView(e) => match e {
29792987
Some(value) => Arc::new(
29802988
repeat_n(Some(value.as_slice()), size).collect::<BinaryViewArray>(),
29812989
),
2982-
None => {
2983-
Arc::new(repeat_n(None::<&str>, size).collect::<BinaryViewArray>())
2984-
}
2990+
None => new_null_array(&DataType::BinaryView, size),
29852991
},
29862992
ScalarValue::FixedSizeBinary(s, e) => match e {
29872993
Some(value) => Arc::new(
@@ -2991,21 +2997,13 @@ impl ScalarValue {
29912997
)
29922998
.unwrap(),
29932999
),
2994-
None => Arc::new(
2995-
FixedSizeBinaryArray::try_from_sparse_iter_with_size(
2996-
repeat_n(None::<&[u8]>, size),
2997-
*s,
2998-
)
2999-
.unwrap(),
3000-
),
3000+
None => Arc::new(FixedSizeBinaryArray::new_null(*s, size)),
30013001
},
30023002
ScalarValue::LargeBinary(e) => match e {
30033003
Some(value) => Arc::new(
30043004
repeat_n(Some(value.as_slice()), size).collect::<LargeBinaryArray>(),
30053005
),
3006-
None => {
3007-
Arc::new(repeat_n(None::<&str>, size).collect::<LargeBinaryArray>())
3008-
}
3006+
None => new_null_array(&DataType::LargeBinary, size),
30093007
},
30103008
ScalarValue::List(arr) => {
30113009
if size == 1 {

0 commit comments

Comments
 (0)