This is an automated email from the ASF dual-hosted git repository.
tustvold pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/master by this push:
new d8381943cc Improve ergonomics of Scalar (#4704)
d8381943cc is described below
commit d8381943ccf74256e36e522fe2c7ae9357888117
Author: Raphael Taylor-Davies <[email protected]>
AuthorDate: Thu Aug 17 09:28:30 2023 +0100
Improve ergonomics of Scalar (#4704)
* Improve ergonomics of Scalar
* Add BooleanArray::new_scalar
---
arrow-array/src/array/boolean_array.rs | 11 ++++++++++-
arrow-array/src/array/byte_array.rs | 7 ++++++-
arrow-array/src/array/primitive_array.rs | 11 ++++++++++-
arrow-array/src/scalar.rs | 15 ++++++++-------
4 files changed, 34 insertions(+), 10 deletions(-)
diff --git a/arrow-array/src/array/boolean_array.rs
b/arrow-array/src/array/boolean_array.rs
index 995bb7d510..0d9a1044be 100644
--- a/arrow-array/src/array/boolean_array.rs
+++ b/arrow-array/src/array/boolean_array.rs
@@ -18,7 +18,7 @@
use crate::array::print_long_array;
use crate::builder::BooleanBuilder;
use crate::iterator::BooleanIter;
-use crate::{Array, ArrayAccessor, ArrayRef};
+use crate::{Array, ArrayAccessor, ArrayRef, Scalar};
use arrow_buffer::{bit_util, BooleanBuffer, MutableBuffer, NullBuffer};
use arrow_data::{ArrayData, ArrayDataBuilder};
use arrow_schema::DataType;
@@ -101,6 +101,15 @@ impl BooleanArray {
}
}
+ /// Create a new [`Scalar`] from `value`
+ pub fn new_scalar(value: bool) -> Scalar<Self> {
+ let values = match value {
+ true => BooleanBuffer::new_set(1),
+ false => BooleanBuffer::new_unset(1),
+ };
+ Scalar::new(Self::new(values, None))
+ }
+
/// Returns the length of this array.
pub fn len(&self) -> usize {
self.values.len()
diff --git a/arrow-array/src/array/byte_array.rs
b/arrow-array/src/array/byte_array.rs
index f694aa32e5..37d8de931e 100644
--- a/arrow-array/src/array/byte_array.rs
+++ b/arrow-array/src/array/byte_array.rs
@@ -20,7 +20,7 @@ use crate::builder::GenericByteBuilder;
use crate::iterator::ArrayIter;
use crate::types::bytes::ByteArrayNativeType;
use crate::types::ByteArrayType;
-use crate::{Array, ArrayAccessor, ArrayRef, OffsetSizeTrait};
+use crate::{Array, ArrayAccessor, ArrayRef, OffsetSizeTrait, Scalar};
use arrow_buffer::{ArrowNativeType, Buffer, MutableBuffer};
use arrow_buffer::{NullBuffer, OffsetBuffer};
use arrow_data::{ArrayData, ArrayDataBuilder};
@@ -182,6 +182,11 @@ impl<T: ByteArrayType> GenericByteArray<T> {
}
}
+ /// Create a new [`Scalar`] from `v`
+ pub fn new_scalar(value: impl AsRef<T::Native>) -> Scalar<Self> {
+ Scalar::new(Self::from_iter_values(std::iter::once(value)))
+ }
+
/// Creates a [`GenericByteArray`] based on an iterator of values without
nulls
pub fn from_iter_values<Ptr, I>(iter: I) -> Self
where
diff --git a/arrow-array/src/array/primitive_array.rs
b/arrow-array/src/array/primitive_array.rs
index 8337326370..0c32279640 100644
--- a/arrow-array/src/array/primitive_array.rs
+++ b/arrow-array/src/array/primitive_array.rs
@@ -24,7 +24,7 @@ use crate::temporal_conversions::{
use crate::timezone::Tz;
use crate::trusted_len::trusted_len_unzip;
use crate::types::*;
-use crate::{Array, ArrayAccessor, ArrayRef};
+use crate::{Array, ArrayAccessor, ArrayRef, Scalar};
use arrow_buffer::{i256, ArrowNativeType, Buffer, NullBuffer, ScalarBuffer};
use arrow_data::bit_iterator::try_for_each_valid_idx;
use arrow_data::{ArrayData, ArrayDataBuilder};
@@ -553,6 +553,15 @@ impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
})
}
+ /// Create a new [`Scalar`] from `value`
+ pub fn new_scalar(value: T::Native) -> Scalar<Self> {
+ Scalar::new(Self {
+ data_type: T::DATA_TYPE,
+ values: vec![value].into(),
+ nulls: None,
+ })
+ }
+
/// Deconstruct this array into its constituent parts
pub fn into_parts(self) -> (DataType, ScalarBuffer<T::Native>,
Option<NullBuffer>) {
(self.data_type, self.values, self.nulls)
diff --git a/arrow-array/src/scalar.rs b/arrow-array/src/scalar.rs
index c142107c5c..7dfdbddd96 100644
--- a/arrow-array/src/scalar.rs
+++ b/arrow-array/src/scalar.rs
@@ -71,8 +71,8 @@ use crate::Array;
///
/// // Comparison of an array and a scalar
/// let a = Int32Array::from(vec![1, 2, 3, 4, 5]);
-/// let b = Int32Array::from(vec![1]);
-/// let r = eq(&a, &Scalar::new(&b)).unwrap();
+/// let b = Int32Array::new_scalar(1);
+/// let r = eq(&a, &b).unwrap();
/// let values: Vec<_> = r.values().iter().collect();
/// assert_eq!(values, &[true, false, false, false, false]);
pub trait Datum {
@@ -101,22 +101,23 @@ impl Datum for &dyn Array {
/// A wrapper around a single value [`Array`] indicating kernels should treat
it as a scalar value
///
/// See [`Datum`] for more information
-pub struct Scalar<'a>(&'a dyn Array);
+#[derive(Debug, Copy, Clone)]
+pub struct Scalar<T: Array>(T);
-impl<'a> Scalar<'a> {
+impl<T: Array> Scalar<T> {
/// Create a new [`Scalar`] from an [`Array`]
///
/// # Panics
///
/// Panics if `array.len() != 1`
- pub fn new(array: &'a dyn Array) -> Self {
+ pub fn new(array: T) -> Self {
assert_eq!(array.len(), 1);
Self(array)
}
}
-impl<'a> Datum for Scalar<'a> {
+impl<T: Array> Datum for Scalar<T> {
fn get(&self) -> (&dyn Array, bool) {
- (self.0, true)
+ (&self.0, true)
}
}