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

alamb 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 a984ca7344 [Variant] Adding code to store metadata and value 
references in VariantArray (#7945)
a984ca7344 is described below

commit a984ca7344b2202046c00b61a606f8dc1de47a5e
Author: Mark Nash <[email protected]>
AuthorDate: Fri Jul 18 06:00:32 2025 -0700

    [Variant] Adding code to store metadata and value references in 
VariantArray (#7945)
    
    # Which issue does this PR close?
    
    
    - Closes #7920.
    
    # Are these changes tested?
    
    
    Tests were already implemented
    
    # Are there any user-facing changes?
    
    None
---
 parquet-variant-compute/src/variant_array.rs | 32 +++++++++++++++++++++++-----
 1 file changed, 27 insertions(+), 5 deletions(-)

diff --git a/parquet-variant-compute/src/variant_array.rs 
b/parquet-variant-compute/src/variant_array.rs
index e18d9d3b21..cc7f0cffd4 100644
--- a/parquet-variant-compute/src/variant_array.rs
+++ b/parquet-variant-compute/src/variant_array.rs
@@ -59,6 +59,12 @@ pub struct VariantArray {
     /// Dictionary-Encoded, preferably (but not required) with an index type of
     /// int8.
     inner: StructArray,
+
+    /// Reference to the metadata column of inner
+    metadata_ref: ArrayRef,
+
+    /// Reference to the value column of inner
+    value_ref: ArrayRef,
 }
 
 impl VariantArray {
@@ -88,7 +94,8 @@ impl VariantArray {
             ));
         };
         // Ensure the StructArray has a metadata field of BinaryView
-        let Some(metadata_field) = inner.fields().iter().find(|f| f.name() == 
"metadata") else {
+
+        let Some(metadata_field) = VariantArray::find_metadata_field(&inner) 
else {
             return Err(ArrowError::InvalidArgumentError(
                 "Invalid VariantArray: StructArray must contain a 'metadata' 
field".to_string(),
             ));
@@ -99,7 +106,7 @@ impl VariantArray {
                 metadata_field.data_type()
             )));
         }
-        let Some(value_field) = inner.fields().iter().find(|f| f.name() == 
"value") else {
+        let Some(value_field) = VariantArray::find_value_field(&inner) else {
             return Err(ArrowError::InvalidArgumentError(
                 "Invalid VariantArray: StructArray must contain a 'value' 
field".to_string(),
             ));
@@ -113,6 +120,8 @@ impl VariantArray {
 
         Ok(Self {
             inner: inner.clone(),
+            metadata_ref: metadata_field,
+            value_ref: value_field,
         })
     }
 
@@ -138,16 +147,24 @@ impl VariantArray {
         Variant::new(metadata, value)
     }
 
+    fn find_metadata_field(array: &StructArray) -> Option<ArrayRef> {
+        array.column_by_name("metadata").cloned()
+    }
+
+    fn find_value_field(array: &StructArray) -> Option<ArrayRef> {
+        array.column_by_name("value").cloned()
+    }
+
     /// Return a reference to the metadata field of the [`StructArray`]
     pub fn metadata_field(&self) -> &ArrayRef {
         // spec says fields order is not guaranteed, so we search by name
-        self.inner.column_by_name("metadata").unwrap()
+        &self.metadata_ref
     }
 
     /// Return a reference to the value field of the `StructArray`
     pub fn value_field(&self) -> &ArrayRef {
         // spec says fields order is not guaranteed, so we search by name
-        self.inner.column_by_name("value").unwrap()
+        &self.value_ref
     }
 }
 
@@ -169,8 +186,13 @@ impl Array for VariantArray {
     }
 
     fn slice(&self, offset: usize, length: usize) -> ArrayRef {
+        let slice = self.inner.slice(offset, length);
+        let met = self.metadata_ref.slice(offset, length);
+        let val = self.value_ref.slice(offset, length);
         Arc::new(Self {
-            inner: self.inner.slice(offset, length),
+            inner: slice,
+            metadata_ref: met,
+            value_ref: val,
         })
     }
 

Reply via email to