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)
     }
 }

Reply via email to