@@ -129,7 +129,7 @@ impl VariantArray {
129129 Ok ( Self {
130130 inner : inner. clone ( ) ,
131131 metadata : metadata. clone ( ) ,
132- shredding_state : ShreddingState :: try_new ( metadata . clone ( ) , value, typed_value) ?,
132+ shredding_state : ShreddingState :: try_new ( value, typed_value) ?,
133133 } )
134134 }
135135
@@ -154,8 +154,7 @@ impl VariantArray {
154154 // This would be a lot simpler if ShreddingState were just a pair of Option... we already
155155 // have everything we need.
156156 let inner = builder. build ( ) ;
157- let shredding_state =
158- ShreddingState :: try_new ( metadata. clone ( ) , value, typed_value) . unwrap ( ) ; // valid by construction
157+ let shredding_state = ShreddingState :: try_new ( value, typed_value) . unwrap ( ) ; // valid by construction
159158 Self {
160159 inner,
161160 metadata,
@@ -222,7 +221,7 @@ impl VariantArray {
222221 typed_value_to_variant ( typed_value, index)
223222 }
224223 }
225- ShreddingState :: AllNull { .. } => {
224+ ShreddingState :: AllNull => {
226225 // AllNull case: neither value nor typed_value fields exist
227226 // NOTE: This handles the case where neither value nor typed_value fields exist.
228227 // For top-level variants, this returns Variant::Null (JSON null).
@@ -325,14 +324,11 @@ impl ShreddedVariantFieldArray {
325324 . and_then ( |col| col. as_binary_view_opt ( ) . cloned ( ) ) ;
326325 let typed_value = inner_struct. column_by_name ( "typed_value" ) . cloned ( ) ;
327326
328- // Use a dummy metadata for the constructor (ShreddedVariantFieldArray doesn't have metadata)
329- let dummy_metadata = arrow:: array:: BinaryViewArray :: new_null ( inner_struct. len ( ) ) ;
330-
331327 // Note this clone is cheap, it just bumps the ref count
332328 let inner = inner_struct. clone ( ) ;
333329 Ok ( Self {
334330 inner : inner. clone ( ) ,
335- shredding_state : ShreddingState :: try_new ( dummy_metadata , value, typed_value) ?,
331+ shredding_state : ShreddingState :: try_new ( value, typed_value) ?,
336332 } )
337333 }
338334
@@ -432,16 +428,10 @@ impl Array for ShreddedVariantFieldArray {
432428#[ derive( Debug ) ]
433429pub enum ShreddingState {
434430 /// This variant has no typed_value field
435- Unshredded {
436- metadata : BinaryViewArray ,
437- value : BinaryViewArray ,
438- } ,
431+ Unshredded { value : BinaryViewArray } ,
439432 /// This variant has a typed_value field and no value field
440433 /// meaning it is the shredded type
441- Typed {
442- metadata : BinaryViewArray ,
443- typed_value : ArrayRef ,
444- } ,
434+ Typed { typed_value : ArrayRef } ,
445435 /// Imperfectly shredded: Shredded values reside in `typed_value` while those that failed to
446436 /// shred reside in `value`. Missing field values are NULL in both columns, while NULL primitive
447437 /// values have NULL `typed_value` and `Variant::Null` in `value`.
@@ -453,7 +443,6 @@ pub enum ShreddingState {
453443 /// the `value` is a variant object containing the subset of fields for which shredding was
454444 /// not even attempted.
455445 PartiallyShredded {
456- metadata : BinaryViewArray ,
457446 value : BinaryViewArray ,
458447 typed_value : ArrayRef ,
459448 } ,
@@ -463,38 +452,20 @@ pub enum ShreddingState {
463452 /// Note: By strict spec interpretation, this should only be valid for shredded object fields,
464453 /// not top-level variants. However, we allow it and treat as Variant::Null for pragmatic
465454 /// handling of missing data.
466- AllNull { metadata : BinaryViewArray } ,
455+ AllNull ,
467456}
468457
469458impl ShreddingState {
470459 /// try to create a new `ShreddingState` from the given fields
471460 pub fn try_new (
472- metadata : BinaryViewArray ,
473461 value : Option < BinaryViewArray > ,
474462 typed_value : Option < ArrayRef > ,
475463 ) -> Result < Self , ArrowError > {
476- match ( metadata, value, typed_value) {
477- ( metadata, Some ( value) , Some ( typed_value) ) => Ok ( Self :: PartiallyShredded {
478- metadata,
479- value,
480- typed_value,
481- } ) ,
482- ( metadata, Some ( value) , None ) => Ok ( Self :: Unshredded { metadata, value } ) ,
483- ( metadata, None , Some ( typed_value) ) => Ok ( Self :: Typed {
484- metadata,
485- typed_value,
486- } ) ,
487- ( metadata, None , None ) => Ok ( Self :: AllNull { metadata } ) ,
488- }
489- }
490-
491- /// Return a reference to the metadata field
492- pub fn metadata_field ( & self ) -> & BinaryViewArray {
493- match self {
494- ShreddingState :: Unshredded { metadata, .. } => metadata,
495- ShreddingState :: Typed { metadata, .. } => metadata,
496- ShreddingState :: PartiallyShredded { metadata, .. } => metadata,
497- ShreddingState :: AllNull { metadata } => metadata,
464+ match ( value, typed_value) {
465+ ( Some ( value) , Some ( typed_value) ) => Ok ( Self :: PartiallyShredded { value, typed_value } ) ,
466+ ( Some ( value) , None ) => Ok ( Self :: Unshredded { value } ) ,
467+ ( None , Some ( typed_value) ) => Ok ( Self :: Typed { typed_value } ) ,
468+ ( None , None ) => Ok ( Self :: AllNull ) ,
498469 }
499470 }
500471
@@ -504,7 +475,7 @@ impl ShreddingState {
504475 ShreddingState :: Unshredded { value, .. } => Some ( value) ,
505476 ShreddingState :: Typed { .. } => None ,
506477 ShreddingState :: PartiallyShredded { value, .. } => Some ( value) ,
507- ShreddingState :: AllNull { .. } => None ,
478+ ShreddingState :: AllNull => None ,
508479 }
509480 }
510481
@@ -514,36 +485,26 @@ impl ShreddingState {
514485 ShreddingState :: Unshredded { .. } => None ,
515486 ShreddingState :: Typed { typed_value, .. } => Some ( typed_value) ,
516487 ShreddingState :: PartiallyShredded { typed_value, .. } => Some ( typed_value) ,
517- ShreddingState :: AllNull { .. } => None ,
488+ ShreddingState :: AllNull => None ,
518489 }
519490 }
520491
521492 /// Slice all the underlying arrays
522493 pub fn slice ( & self , offset : usize , length : usize ) -> Self {
523494 match self {
524- ShreddingState :: Unshredded { metadata, value } => ShreddingState :: Unshredded {
525- metadata : metadata. slice ( offset, length) ,
495+ ShreddingState :: Unshredded { value } => ShreddingState :: Unshredded {
526496 value : value. slice ( offset, length) ,
527497 } ,
528- ShreddingState :: Typed {
529- metadata,
530- typed_value,
531- } => ShreddingState :: Typed {
532- metadata : metadata. slice ( offset, length) ,
533- typed_value : typed_value. slice ( offset, length) ,
534- } ,
535- ShreddingState :: PartiallyShredded {
536- metadata,
537- value,
538- typed_value,
539- } => ShreddingState :: PartiallyShredded {
540- metadata : metadata. slice ( offset, length) ,
541- value : value. slice ( offset, length) ,
498+ ShreddingState :: Typed { typed_value } => ShreddingState :: Typed {
542499 typed_value : typed_value. slice ( offset, length) ,
543500 } ,
544- ShreddingState :: AllNull { metadata } => ShreddingState :: AllNull {
545- metadata : metadata. slice ( offset, length) ,
546- } ,
501+ ShreddingState :: PartiallyShredded { value, typed_value } => {
502+ ShreddingState :: PartiallyShredded {
503+ value : value. slice ( offset, length) ,
504+ typed_value : typed_value. slice ( offset, length) ,
505+ }
506+ }
507+ ShreddingState :: AllNull => ShreddingState :: AllNull ,
547508 }
548509 }
549510}
@@ -744,7 +705,7 @@ mod test {
744705 // Verify the shredding state is AllNull
745706 assert ! ( matches!(
746707 variant_array. shredding_state( ) ,
747- ShreddingState :: AllNull { .. }
708+ ShreddingState :: AllNull
748709 ) ) ;
749710
750711 // Verify that value() returns Variant::Null (compensating for spec violation)
@@ -801,17 +762,10 @@ mod test {
801762
802763 #[ test]
803764 fn all_null_shredding_state ( ) {
804- let metadata = BinaryViewArray :: from ( vec ! [ b"test" as & [ u8 ] ] ) ;
805- let shredding_state = ShreddingState :: try_new ( metadata. clone ( ) , None , None ) . unwrap ( ) ;
765+ let shredding_state = ShreddingState :: try_new ( None , None ) . unwrap ( ) ;
806766
807767 // Verify the shredding state is AllNull
808- assert ! ( matches!( shredding_state, ShreddingState :: AllNull { .. } ) ) ;
809-
810- // Verify metadata is preserved correctly
811- if let ShreddingState :: AllNull { metadata : m } = shredding_state {
812- assert_eq ! ( m. len( ) , metadata. len( ) ) ;
813- assert_eq ! ( m. value( 0 ) , metadata. value( 0 ) ) ;
814- }
768+ assert ! ( matches!( shredding_state, ShreddingState :: AllNull ) ) ;
815769 }
816770
817771 #[ test]
@@ -827,7 +781,7 @@ mod test {
827781 // Verify the shredding state is AllNull
828782 assert ! ( matches!(
829783 variant_array. shredding_state( ) ,
830- ShreddingState :: AllNull { .. }
784+ ShreddingState :: AllNull
831785 ) ) ;
832786
833787 // Verify all values are null
0 commit comments