This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/main by this push:
     new d7b9bf431c refactor(variant): replace shredding cast flag with 
VariantCastMode (#11294)
d7b9bf431c is described below

commit d7b9bf431c980ccad21b0a9777e12d24770cad58
Author: Kosta Tarasov <[email protected]>
AuthorDate: Fri Oct 2 18:32:55 2026 +0000

    refactor(variant): replace shredding cast flag with VariantCastMode (#11294)
    
    # Which issue does this PR close?
    
    Follow-up to [this comment on
    
#10157](https://github.com/apache/arrow-rs/pull/10157#issuecomment-5195795798).
    
    # Rationale for this change
    
    Make the distinction between shredding conversions and `variant_get`
    casts explicit instead of representing it with a boolean.
    
    # What changes are included in this PR?
    
    Replace `shred: bool` with `VariantCastMode::{Shred, Get}` throughout
    variant conversion helpers and their call sites.
    
    # Are these changes tested?
    
    Covered by existing tests: 369 unit tests and 15 doc tests pass. Clippy
    and formatting checks also pass.
    
    # Are there any user-facing changes?
    
    No. This is an internal refactor with no behavior changes.
---
 parquet-variant-compute/src/shred_variant.rs    |  19 +--
 parquet-variant-compute/src/type_conversion.rs  |  39 ++++--
 parquet-variant-compute/src/variant_to_arrow.rs | 175 ++++++++++++++----------
 3 files changed, 137 insertions(+), 96 deletions(-)

diff --git a/parquet-variant-compute/src/shred_variant.rs 
b/parquet-variant-compute/src/shred_variant.rs
index fa603d4f2e..2d78bc9014 100644
--- a/parquet-variant-compute/src/shred_variant.rs
+++ b/parquet-variant-compute/src/shred_variant.rs
@@ -17,6 +17,7 @@
 
 //! Module for shredding VariantArray with a given schema.
 
+use crate::type_conversion::VariantCastMode;
 use crate::variant_array::{ShreddedVariantFieldArray, StructArrayBuilder};
 use crate::variant_to_arrow::{
     ArrayVariantToArrowRowBuilder, PrimitiveVariantToArrowRowBuilder,
@@ -87,7 +88,7 @@ pub(crate) fn shred_variant_with_options(
         cast_options,
         array.len(),
         NullValue::TopLevelVariant,
-        true,
+        VariantCastMode::Shred,
     )?;
     for i in 0..array.len() {
         if array.is_null(i) {
@@ -141,7 +142,7 @@ pub(crate) fn 
make_variant_to_shredded_variant_arrow_row_builder<'a>(
     cast_options: &'a CastOptions,
     capacity: usize,
     null_value: NullValue,
-    shred: bool,
+    cast_mode: VariantCastMode,
 ) -> Result<VariantToShreddedVariantRowBuilder<'a>> {
     let builder = match data_type {
         DataType::Struct(fields) => {
@@ -150,7 +151,7 @@ pub(crate) fn 
make_variant_to_shredded_variant_arrow_row_builder<'a>(
                 cast_options,
                 capacity,
                 null_value,
-                shred,
+                cast_mode,
             )?;
             VariantToShreddedVariantRowBuilder::Object(typed_value_builder)
         }
@@ -190,7 +191,7 @@ pub(crate) fn 
make_variant_to_shredded_variant_arrow_row_builder<'a>(
         | DataType::FixedSizeBinary(16) // UUID
         => {
             let builder =
-                make_primitive_variant_to_arrow_row_builder(data_type, 
cast_options, capacity, shred)?;
+                make_primitive_variant_to_arrow_row_builder(data_type, 
cast_options, capacity, cast_mode)?;
             let typed_value_builder =
                 VariantToShreddedPrimitiveVariantRowBuilder::new(builder, 
capacity, null_value);
             VariantToShreddedVariantRowBuilder::Primitive(typed_value_builder)
@@ -368,7 +369,7 @@ impl<'a> VariantToShreddedObjectVariantRowBuilder<'a> {
         cast_options: &'a CastOptions,
         capacity: usize,
         null_value: NullValue,
-        shred: bool,
+        cast_mode: VariantCastMode,
     ) -> Result<Self> {
         let typed_value_builders = fields.iter().map(|field| {
             let builder = make_variant_to_shredded_variant_arrow_row_builder(
@@ -376,7 +377,7 @@ impl<'a> VariantToShreddedObjectVariantRowBuilder<'a> {
                 cast_options,
                 capacity,
                 NullValue::ObjectField,
-                shred,
+                cast_mode,
             )?;
             Ok((field.name().as_str(), builder))
         });
@@ -1082,7 +1083,7 @@ mod tests {
                 &cast_options,
                 1,
                 mode,
-                true,
+                VariantCastMode::Shred,
             )
             .unwrap();
             primitive_builder.append_null().unwrap();
@@ -1113,7 +1114,7 @@ mod tests {
                 &cast_options,
                 1,
                 mode,
-                true,
+                VariantCastMode::Shred,
             )
             .unwrap();
             array_builder.append_null().unwrap();
@@ -1142,7 +1143,7 @@ mod tests {
                 &cast_options,
                 1,
                 mode,
-                true,
+                VariantCastMode::Shred,
             )
             .unwrap();
             object_builder.append_null().unwrap();
diff --git a/parquet-variant-compute/src/type_conversion.rs 
b/parquet-variant-compute/src/type_conversion.rs
index b3d3b7094f..2882b70bbe 100644
--- a/parquet-variant-compute/src/type_conversion.rs
+++ b/parquet-variant-compute/src/type_conversion.rs
@@ -34,16 +34,25 @@ use half::f16;
 use num_traits::NumCast;
 use parquet_variant::{Variant, VariantDecimal4, VariantDecimal8, 
VariantDecimal16};
 
+/// Controls the conversions allowed when extracting a typed value from a 
variant.
+#[derive(Debug, Clone, Copy)]
+pub(crate) enum VariantCastMode {
+    /// Use the conversions permitted by the variant shredding specification.
+    Shred,
+    /// Allow casts when extracting a value with `variant_get`.
+    Get,
+}
+
 /// Extension trait for Arrow primitive types that can extract their native 
value from a Variant
 pub(crate) trait PrimitiveFromVariant: ArrowPrimitiveType {
-    fn from_variant(variant: &Variant<'_, '_>, shred: bool) -> 
Option<Self::Native>;
+    fn from_variant(variant: &Variant<'_, '_>, cast_mode: VariantCastMode) -> 
Option<Self::Native>;
 }
 
 /// Extension trait for Arrow timestamp types that can extract their native 
value from a Variant
 /// We can't use [`PrimitiveFromVariant`] directly because we need _two_ 
implementations for each
 /// timestamp type -- the `NTZ` param here.
 pub(crate) trait TimestampFromVariant<const NTZ: bool>: ArrowTimestampType {
-    fn from_variant(variant: &Variant<'_, '_>, shred: bool) -> 
Option<Self::Native>;
+    fn from_variant(variant: &Variant<'_, '_>, cast_mode: VariantCastMode) -> 
Option<Self::Native>;
 }
 
 /// Cast a single `Variant` value with safe/strict semantics.
@@ -71,10 +80,10 @@ pub(crate) fn variant_cast_with_options<'a, 'm, 'v, T>(
 macro_rules! impl_primitive_from_variant {
     ($arrow_type:ty, $shred_fun:expr, $get_method:ident $(, $cast_fn:expr)?) 
=> {
         impl PrimitiveFromVariant for $arrow_type {
-            fn from_variant(variant: &Variant<'_, '_>, shred: bool) -> 
Option<Self::Native> {
-                let value = match shred {
-                    true => $shred_fun(variant),
-                    false => $get_method(variant),
+            fn from_variant(variant: &Variant<'_, '_>, cast_mode: 
VariantCastMode) -> Option<Self::Native> {
+                let value = match cast_mode {
+                    VariantCastMode::Shred => $shred_fun(variant),
+                    VariantCastMode::Get => $get_method(variant),
                 };
                 $( let value = value.and_then($cast_fn); )?
                 value
@@ -86,10 +95,13 @@ macro_rules! impl_primitive_from_variant {
 macro_rules! impl_timestamp_from_variant {
     ($timestamp_type:ty, $shred_fun:expr, $variant_method:expr, 
ntz=$ntz:ident, $cast_fn:expr $(,)?) => {
         impl TimestampFromVariant<{ $ntz }> for $timestamp_type {
-            fn from_variant(variant: &Variant<'_, '_>, shred: bool) -> 
Option<Self::Native> {
-                let value = match shred {
-                    true => ($shred_fun)(variant),
-                    false => $variant_method(variant),
+            fn from_variant(
+                variant: &Variant<'_, '_>,
+                cast_mode: VariantCastMode,
+            ) -> Option<Self::Native> {
+                let value = match cast_mode {
+                    VariantCastMode::Shred => ($shred_fun)(variant),
+                    VariantCastMode::Get => $variant_method(variant),
                 };
 
                 value.and_then($cast_fn)
@@ -685,8 +697,11 @@ impl ShredDecimalVariant for Decimal256Type {
     }
 }
 
-pub(crate) fn variant_to_boolean(variant: &Variant<'_, '_>, shred: bool) -> 
Option<bool> {
-    if shred {
+pub(crate) fn variant_to_boolean(
+    variant: &Variant<'_, '_>,
+    cast_mode: VariantCastMode,
+) -> Option<bool> {
+    if matches!(cast_mode, VariantCastMode::Shred) {
         return variant.as_boolean();
     }
 
diff --git a/parquet-variant-compute/src/variant_to_arrow.rs 
b/parquet-variant-compute/src/variant_to_arrow.rs
index 2c811b8b7b..7febecaab5 100644
--- a/parquet-variant-compute/src/variant_to_arrow.rs
+++ b/parquet-variant-compute/src/variant_to_arrow.rs
@@ -20,7 +20,7 @@ use crate::shred_variant::{
     make_variant_to_shredded_variant_arrow_row_builder,
 };
 use crate::type_conversion::{
-    PrimitiveFromVariant, ShredDecimalVariant, TimestampFromVariant,
+    PrimitiveFromVariant, ShredDecimalVariant, TimestampFromVariant, 
VariantCastMode,
     shred_variant_to_unscaled_decimal, variant_cast_with_options, 
variant_to_boolean,
     variant_to_unscaled_decimal,
 };
@@ -106,7 +106,7 @@ fn make_typed_variant_to_arrow_row_builder<'a>(
     data_type: &'a DataType,
     cast_options: &'a CastOptions,
     capacity: usize,
-    shred: bool,
+    cast_mode: VariantCastMode,
 ) -> Result<VariantToArrowRowBuilder<'a>> {
     use VariantToArrowRowBuilder::*;
 
@@ -139,7 +139,7 @@ fn make_typed_variant_to_arrow_row_builder<'a>(
                 *ordered,
                 cast_options,
                 capacity,
-                shred,
+                cast_mode,
             )?;
             Ok(Map(builder))
         }
@@ -166,7 +166,7 @@ fn make_typed_variant_to_arrow_row_builder<'a>(
                 data_type,
                 cast_options,
                 capacity,
-                shred,
+                cast_mode,
             )?;
             Ok(Primitive(builder))
         }
@@ -188,9 +188,12 @@ pub(crate) fn make_variant_to_arrow_row_builder<'a>(
             metadata.clone(),
             capacity,
         )),
-        Some(data_type) => {
-            make_typed_variant_to_arrow_row_builder(data_type, cast_options, 
capacity, false)?
-        }
+        Some(data_type) => make_typed_variant_to_arrow_row_builder(
+            data_type,
+            cast_options,
+            capacity,
+            VariantCastMode::Get,
+        )?,
     };
 
     // Wrap with path extraction if needed
@@ -403,7 +406,7 @@ impl<'a> EncodedVariantToArrowRowBuilder<'a> {
             value_type,
             cast_options,
             capacity,
-            false,
+            VariantCastMode::Get,
         )?);
         Ok(Self {
             data_type,
@@ -431,7 +434,7 @@ pub(crate) fn 
make_primitive_variant_to_arrow_row_builder<'a>(
     data_type: &'a DataType,
     cast_options: &'a CastOptions,
     capacity: usize,
-    shred: bool,
+    cast_mode: VariantCastMode,
 ) -> Result<PrimitiveVariantToArrowRowBuilder<'a>> {
     use PrimitiveVariantToArrowRowBuilder::*;
 
@@ -440,108 +443,108 @@ pub(crate) fn 
make_primitive_variant_to_arrow_row_builder<'a>(
         DataType::Boolean => Boolean(VariantToBooleanArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::Int8 => Int8(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::Int16 => Int16(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::Int32 => Int32(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::Int64 => Int64(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::UInt8 => UInt8(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::UInt16 => UInt16(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::UInt32 => UInt32(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::UInt64 => UInt64(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::Float16 => Float16(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::Float32 => Float32(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::Float64 => Float64(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::Decimal32(precision, scale) => 
Decimal32(VariantToDecimalArrowRowBuilder::new(
             cast_options,
             capacity,
             *precision,
             *scale,
-            shred,
+            cast_mode,
         )?),
         DataType::Decimal64(precision, scale) => 
Decimal64(VariantToDecimalArrowRowBuilder::new(
             cast_options,
             capacity,
             *precision,
             *scale,
-            shred,
+            cast_mode,
         )?),
         DataType::Decimal128(precision, scale) => 
Decimal128(VariantToDecimalArrowRowBuilder::new(
             cast_options,
             capacity,
             *precision,
             *scale,
-            shred,
+            cast_mode,
         )?),
         DataType::Decimal256(precision, scale) => 
Decimal256(VariantToDecimalArrowRowBuilder::new(
             cast_options,
             capacity,
             *precision,
             *scale,
-            shred,
+            cast_mode,
         )?),
         DataType::Date32 => Date32(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::Date64 => Date64(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::Time32(TimeUnit::Second) => 
Time32Second(VariantToPrimitiveArrowRowBuilder::new(
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )),
         DataType::Time32(TimeUnit::Millisecond) => Time32Milli(
-            VariantToPrimitiveArrowRowBuilder::new(cast_options, capacity, 
shred),
+            VariantToPrimitiveArrowRowBuilder::new(cast_options, capacity, 
cast_mode),
         ),
         DataType::Time32(t) => {
             return Err(ArrowError::InvalidArgumentError(format!(
@@ -549,10 +552,10 @@ pub(crate) fn 
make_primitive_variant_to_arrow_row_builder<'a>(
             )));
         }
         DataType::Time64(TimeUnit::Microsecond) => Time64Micro(
-            VariantToPrimitiveArrowRowBuilder::new(cast_options, capacity, 
shred),
+            VariantToPrimitiveArrowRowBuilder::new(cast_options, capacity, 
cast_mode),
         ),
         DataType::Time64(TimeUnit::Nanosecond) => Time64Nano(
-            VariantToPrimitiveArrowRowBuilder::new(cast_options, capacity, 
shred),
+            VariantToPrimitiveArrowRowBuilder::new(cast_options, capacity, 
cast_mode),
         ),
         DataType::Time64(t) => {
             return Err(ArrowError::InvalidArgumentError(format!(
@@ -560,28 +563,28 @@ pub(crate) fn 
make_primitive_variant_to_arrow_row_builder<'a>(
             )));
         }
         DataType::Timestamp(TimeUnit::Second, None) => TimestampSecondNtz(
-            VariantToTimestampNtzArrowRowBuilder::new(cast_options, capacity, 
shred),
+            VariantToTimestampNtzArrowRowBuilder::new(cast_options, capacity, 
cast_mode),
         ),
         DataType::Timestamp(TimeUnit::Second, tz) => TimestampSecond(
-            VariantToTimestampArrowRowBuilder::new(cast_options, capacity, 
shred, tz.clone()),
+            VariantToTimestampArrowRowBuilder::new(cast_options, capacity, 
cast_mode, tz.clone()),
         ),
         DataType::Timestamp(TimeUnit::Millisecond, None) => TimestampMilliNtz(
-            VariantToTimestampNtzArrowRowBuilder::new(cast_options, capacity, 
shred),
+            VariantToTimestampNtzArrowRowBuilder::new(cast_options, capacity, 
cast_mode),
         ),
         DataType::Timestamp(TimeUnit::Millisecond, tz) => TimestampMilli(
-            VariantToTimestampArrowRowBuilder::new(cast_options, capacity, 
shred, tz.clone()),
+            VariantToTimestampArrowRowBuilder::new(cast_options, capacity, 
cast_mode, tz.clone()),
         ),
         DataType::Timestamp(TimeUnit::Microsecond, None) => TimestampMicroNtz(
-            VariantToTimestampNtzArrowRowBuilder::new(cast_options, capacity, 
shred),
+            VariantToTimestampNtzArrowRowBuilder::new(cast_options, capacity, 
cast_mode),
         ),
         DataType::Timestamp(TimeUnit::Microsecond, tz) => TimestampMicro(
-            VariantToTimestampArrowRowBuilder::new(cast_options, capacity, 
shred, tz.clone()),
+            VariantToTimestampArrowRowBuilder::new(cast_options, capacity, 
cast_mode, tz.clone()),
         ),
         DataType::Timestamp(TimeUnit::Nanosecond, None) => TimestampNanoNtz(
-            VariantToTimestampNtzArrowRowBuilder::new(cast_options, capacity, 
shred),
+            VariantToTimestampNtzArrowRowBuilder::new(cast_options, capacity, 
cast_mode),
         ),
         DataType::Timestamp(TimeUnit::Nanosecond, tz) => TimestampNano(
-            VariantToTimestampArrowRowBuilder::new(cast_options, capacity, 
shred, tz.clone()),
+            VariantToTimestampArrowRowBuilder::new(cast_options, capacity, 
cast_mode, tz.clone()),
         ),
         DataType::Duration(_) | DataType::Interval(_) => {
             return Err(ArrowError::InvalidArgumentError(
@@ -655,7 +658,7 @@ impl<'a> StructVariantToArrowRowBuilder<'a> {
                 field.data_type(),
                 cast_options,
                 capacity,
-                false,
+                VariantCastMode::Get,
             )?);
         }
         Ok(Self {
@@ -760,7 +763,7 @@ impl<'a> UnionVariantToArrowRowBuilder<'a> {
                     field.data_type(),
                     cast_options,
                     capacity,
-                    false,
+                    VariantCastMode::Get,
                 )?,
                 len: 0,
             });
@@ -978,7 +981,7 @@ impl<'a> MapVariantToArrowRowBuilder<'a> {
         ordered: bool,
         cast_options: &'a CastOptions,
         capacity: usize,
-        shred: bool,
+        cast_mode: VariantCastMode,
     ) -> Result<Self> {
         let DataType::Struct(entry_fields) = entries_field.data_type() else {
             return Err(ArrowError::InvalidArgumentError(format!(
@@ -999,13 +1002,13 @@ impl<'a> MapVariantToArrowRowBuilder<'a> {
             key_field.data_type(),
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )?);
         let value_builder = Box::new(make_typed_variant_to_arrow_row_builder(
             value_field.data_type(),
             cast_options,
             capacity,
-            shred,
+            cast_mode,
         )?);
         if capacity >= isize::MAX as usize {
             return Err(ArrowError::ComputeError(
@@ -1207,12 +1210,12 @@ impl VariantPathRowBuilder<'_> {
 macro_rules! define_variant_to_primitive_builder {
     (struct $name:ident<$lifetime:lifetime $(, $generic:ident: $bound:path )?>
     |$array_param:ident $(, $field:ident: $field_type:ty)?| -> 
$builder_name:ident $(< $array_type:ty >)? { $init_expr: expr },
-    |$value: ident $(, $shred: ident)?| $value_transform:expr,
+    |$value: ident $(, $cast_mode: ident)?| $value_transform:expr,
     type_name: $type_name:expr) => {
         pub(crate) struct $name<$lifetime $(, $generic : $bound )?>
         {
             builder: $builder_name $(<$array_type>)?,
-            $($shred: bool,)?
+            $($cast_mode: VariantCastMode,)?
             cast_options: &$lifetime CastOptions<$lifetime>,
         }
 
@@ -1220,14 +1223,14 @@ macro_rules! define_variant_to_primitive_builder {
             fn new(
                 cast_options: &$lifetime CastOptions<$lifetime>,
                 $array_param: usize,
-                $($shred: bool,)?
+                $($cast_mode: VariantCastMode,)?
                 // add this so that $init_expr can use it
                 $( $field: $field_type, )?
             ) -> Self {
                 Self {
                     builder: $init_expr,
                     cast_options,
-                    $($shred)?
+                    $($cast_mode)?
                 }
             }
 
@@ -1237,7 +1240,7 @@ macro_rules! define_variant_to_primitive_builder {
             }
 
             fn append_value(&mut self, $value: &Variant<'_, '_>) -> 
Result<bool> {
-                $(let $shred: bool = self.shred;)?
+                $(let $cast_mode: VariantCastMode = self.cast_mode;)?
                 match variant_cast_with_options(
                     $value,
                     self.cast_options,
@@ -1283,21 +1286,21 @@ define_variant_to_primitive_builder!(
 define_variant_to_primitive_builder!(
     struct VariantToBooleanArrowRowBuilder<'a>
     |capacity| -> BooleanBuilder { BooleanBuilder::with_capacity(capacity) },
-    |value, shred| variant_to_boolean(value, shred),
+    |value, cast_mode| variant_to_boolean(value, cast_mode),
     type_name: datatypes::BooleanType::DATA_TYPE
 );
 
 define_variant_to_primitive_builder!(
     struct VariantToPrimitiveArrowRowBuilder<'a, T:PrimitiveFromVariant>
     |capacity| -> PrimitiveBuilder<T> { 
PrimitiveBuilder::<T>::with_capacity(capacity) },
-    |value, shred| T::from_variant(value, shred),
+    |value, cast_mode| T::from_variant(value, cast_mode),
     type_name: T::DATA_TYPE
 );
 
 define_variant_to_primitive_builder!(
     struct VariantToTimestampNtzArrowRowBuilder<'a, 
T:TimestampFromVariant<true>>
     |capacity| -> PrimitiveBuilder<T> { 
PrimitiveBuilder::<T>::with_capacity(capacity) },
-    |value, shred| T::from_variant(value, shred),
+    |value, cast_mode| T::from_variant(value, cast_mode),
     type_name: T::DATA_TYPE
 );
 
@@ -1306,7 +1309,7 @@ define_variant_to_primitive_builder!(
     |capacity, tz: Option<Arc<str>> | -> PrimitiveBuilder<T> {
         PrimitiveBuilder::<T>::with_capacity(capacity).with_timezone_opt(tz)
     },
-    |value, shred| T::from_variant(value, shred),
+    |value, cast_mode| T::from_variant(value, cast_mode),
     type_name: T::DATA_TYPE
 );
 
@@ -1327,7 +1330,7 @@ where
     cast_options: &'a CastOptions<'a>,
     precision: u8,
     scale: i8,
-    shred: bool,
+    cast_mode: VariantCastMode,
 }
 
 impl<'a, T> VariantToDecimalArrowRowBuilder<'a, T>
@@ -1340,7 +1343,7 @@ where
         capacity: usize,
         precision: u8,
         scale: i8,
-        shred: bool,
+        cast_mode: VariantCastMode,
     ) -> Result<Self> {
         let builder = PrimitiveBuilder::<T>::with_capacity(capacity)
             .with_precision_and_scale(precision, scale)?;
@@ -1349,7 +1352,7 @@ where
             cast_options,
             precision,
             scale,
-            shred,
+            cast_mode,
         })
     }
 
@@ -1359,9 +1362,13 @@ where
     }
 
     fn append_value(&mut self, value: &Variant<'_, '_>) -> Result<bool> {
-        match variant_cast_with_options(value, self.cast_options, |value| 
match self.shred {
-            true => shred_variant_to_unscaled_decimal::<T>(value, 
self.precision, self.scale),
-            false => variant_to_unscaled_decimal::<T>(value, self.precision, 
self.scale),
+        match variant_cast_with_options(value, self.cast_options, |value| 
match self.cast_mode {
+            VariantCastMode::Shred => {
+                shred_variant_to_unscaled_decimal::<T>(value, self.precision, 
self.scale)
+            }
+            VariantCastMode::Get => {
+                variant_to_unscaled_decimal::<T>(value, self.precision, 
self.scale)
+            }
         }) {
             Ok(Some(scaled)) => {
                 self.builder.append_value(scaled);
@@ -1502,7 +1509,7 @@ where
                 cast_options,
                 capacity,
                 NullValue::ArrayElement,
-                shredded,
+                VariantCastMode::Shred,
             )?;
             ListElementBuilder::Shredded(Box::new(builder))
         } else {
@@ -1510,7 +1517,7 @@ where
                 element_data_type,
                 cast_options,
                 capacity,
-                shredded,
+                VariantCastMode::Get,
             )?;
             ListElementBuilder::Typed(Box::new(builder))
         };
@@ -1612,7 +1619,7 @@ impl<'a> VariantToFixedSizeListArrowRowBuilder<'a> {
                 cast_options,
                 capacity,
                 NullValue::ArrayElement,
-                shredded,
+                VariantCastMode::Shred,
             )?;
             ListElementBuilder::Shredded(Box::new(builder))
         } else {
@@ -1620,7 +1627,7 @@ impl<'a> VariantToFixedSizeListArrowRowBuilder<'a> {
                 element_data_type,
                 cast_options,
                 capacity,
-                shredded,
+                VariantCastMode::Get,
             )?;
             ListElementBuilder::Typed(Box::new(builder))
         };
@@ -1760,6 +1767,7 @@ mod tests {
     use super::{
         make_primitive_variant_to_arrow_row_builder, 
make_typed_variant_to_arrow_row_builder,
     };
+    use crate::type_conversion::VariantCastMode;
     use arrow::array::{
         Array, Decimal32Array, FixedSizeBinaryArray, Int32Array, ListArray, 
StructArray,
     };
@@ -1811,9 +1819,12 @@ mod tests {
         ];
 
         for data_type in non_primitive_types {
-            let Err(err) =
-                make_primitive_variant_to_arrow_row_builder(&data_type, 
&cast_options, 1, false)
-            else {
+            let Err(err) = make_primitive_variant_to_arrow_row_builder(
+                &data_type,
+                &cast_options,
+                1,
+                VariantCastMode::Get,
+            ) else {
                 panic!("non-primitive type {data_type:?} should be rejected")
             };
 
@@ -1832,9 +1843,13 @@ mod tests {
             safe: false,
             ..Default::default()
         };
-        let mut builder =
-            make_primitive_variant_to_arrow_row_builder(&DataType::Int32, 
&cast_options, 2, false)
-                .unwrap();
+        let mut builder = make_primitive_variant_to_arrow_row_builder(
+            &DataType::Int32,
+            &cast_options,
+            2,
+            VariantCastMode::Get,
+        )
+        .unwrap();
 
         assert!(!builder.append_value(&Variant::Null).unwrap());
         assert!(builder.append_value(&Variant::Int32(42)).unwrap());
@@ -1855,7 +1870,7 @@ mod tests {
             &DataType::Decimal32(9, 2),
             &cast_options,
             2,
-            false,
+            VariantCastMode::Get,
         )
         .unwrap();
         let decimal_variant: Variant<'_, '_> = VariantDecimal4::try_new(1234, 
2).unwrap().into();
@@ -1879,7 +1894,7 @@ mod tests {
             &DataType::FixedSizeBinary(16),
             &cast_options,
             2,
-            false,
+            VariantCastMode::Get,
         )
         .unwrap();
         let uuid = Uuid::nil();
@@ -1904,8 +1919,13 @@ mod tests {
         };
 
         let list_type = DataType::List(Arc::new(Field::new("item", 
DataType::Int64, true)));
-        let mut list_builder =
-            make_typed_variant_to_arrow_row_builder(&list_type, &cast_options, 
1, false).unwrap();
+        let mut list_builder = make_typed_variant_to_arrow_row_builder(
+            &list_type,
+            &cast_options,
+            1,
+            VariantCastMode::Get,
+        )
+        .unwrap();
         assert!(!list_builder.append_value(Variant::Null).unwrap());
         let list_array = list_builder.finish().unwrap();
         let list_array = 
list_array.as_any().downcast_ref::<ListArray>().unwrap();
@@ -1913,8 +1933,13 @@ mod tests {
 
         let struct_type =
             DataType::Struct(Fields::from(vec![Field::new("a", 
DataType::Int32, true)]));
-        let mut struct_builder =
-            make_typed_variant_to_arrow_row_builder(&struct_type, 
&cast_options, 1, false).unwrap();
+        let mut struct_builder = make_typed_variant_to_arrow_row_builder(
+            &struct_type,
+            &cast_options,
+            1,
+            VariantCastMode::Get,
+        )
+        .unwrap();
         assert!(!struct_builder.append_value(Variant::Null).unwrap());
         let struct_array = struct_builder.finish().unwrap();
         let struct_array = 
struct_array.as_any().downcast_ref::<StructArray>().unwrap();

Reply via email to