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 523a149638 [Variant] Bulk insert elements into List and Object 
Builders (#8629)
523a149638 is described below

commit 523a149638a1da126b5b6f78f7608d6b48c11948
Author: Matthew Kim <[email protected]>
AuthorDate: Thu Oct 16 11:11:56 2025 -0400

    [Variant] Bulk insert elements into List and Object Builders (#8629)
    
    # Rationale for this change
    
    This PR implements `Extend` for list and object builders. This way, we
    can easily bulk insert items.
---
 parquet-variant/src/builder.rs           | 35 ++++++++++++++++++++++++--------
 parquet-variant/src/variant/list.rs      |  8 ++------
 parquet-variant/tests/variant_interop.rs | 12 ++++-------
 3 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/parquet-variant/src/builder.rs b/parquet-variant/src/builder.rs
index d44e9b10a3..50345ba09c 100644
--- a/parquet-variant/src/builder.rs
+++ b/parquet-variant/src/builder.rs
@@ -277,11 +277,7 @@ impl ValueBuilder {
 
     fn append_object<S: BuilderSpecificState>(state: ParentState<'_, S>, obj: 
VariantObject) {
         let mut object_builder = ObjectBuilder::new(state, false);
-
-        for (field_name, value) in obj.iter() {
-            object_builder.insert(field_name, value);
-        }
-
+        object_builder.extend(obj.iter());
         object_builder.finish();
     }
 
@@ -302,9 +298,7 @@ impl ValueBuilder {
 
     fn append_list<S: BuilderSpecificState>(state: ParentState<'_, S>, list: 
VariantList) {
         let mut list_builder = ListBuilder::new(state, false);
-        for value in list.iter() {
-            list_builder.append_value(value);
-        }
+        list_builder.extend(list.iter());
         list_builder.finish();
     }
 
@@ -1443,6 +1437,18 @@ impl<'a, S: BuilderSpecificState> ListBuilder<'a, S> {
     }
 }
 
+impl<'a, 'm, 'v, S, V> Extend<V> for ListBuilder<'a, S>
+where
+    S: BuilderSpecificState,
+    V: Into<Variant<'m, 'v>>,
+{
+    fn extend<T: IntoIterator<Item = V>>(&mut self, iter: T) {
+        for v in iter.into_iter() {
+            self.append_value(v);
+        }
+    }
+}
+
 /// A builder for creating [`Variant::Object`] values.
 ///
 /// See the examples on [`VariantBuilder`] for usage.
@@ -1693,6 +1699,19 @@ impl<'a, S: BuilderSpecificState> ObjectBuilder<'a, S> {
     }
 }
 
+impl<'a, 'm, 'v, S, K, V> Extend<(K, V)> for ObjectBuilder<'a, S>
+where
+    S: BuilderSpecificState,
+    K: AsRef<str>,
+    V: Into<Variant<'m, 'v>>,
+{
+    fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
+        for (key, value) in iter.into_iter() {
+            self.insert(key.as_ref(), value);
+        }
+    }
+}
+
 /// Extends [`VariantBuilder`] to help building nested [`Variant`]s
 ///
 /// Allows users to append values to a [`VariantBuilder`], [`ListBuilder`] or
diff --git a/parquet-variant/src/variant/list.rs 
b/parquet-variant/src/variant/list.rs
index a150295717..fd71afba73 100644
--- a/parquet-variant/src/variant/list.rs
+++ b/parquet-variant/src/variant/list.rs
@@ -727,9 +727,7 @@ mod tests {
     fn make_listi32(range: Range<i32>) -> (Vec<u8>, Vec<u8>) {
         let mut variant_builder = VariantBuilder::new();
         let mut list_builder = variant_builder.new_list();
-        for i in range {
-            list_builder.append_value(i);
-        }
+        list_builder.extend(range);
         list_builder.finish();
         variant_builder.finish()
     }
@@ -738,9 +736,7 @@ mod tests {
     fn make_listi64(range: Range<i64>) -> (Vec<u8>, Vec<u8>) {
         let mut variant_builder = VariantBuilder::new();
         let mut list_builder = variant_builder.new_list();
-        for i in range {
-            list_builder.append_value(i);
-        }
+        list_builder.extend(range);
         list_builder.finish();
         variant_builder.finish()
     }
diff --git a/parquet-variant/tests/variant_interop.rs 
b/parquet-variant/tests/variant_interop.rs
index d931d39293..70b42e1f3c 100644
--- a/parquet-variant/tests/variant_interop.rs
+++ b/parquet-variant/tests/variant_interop.rs
@@ -434,10 +434,7 @@ fn generate_random_value(rng: &mut StdRng, builder: &mut 
VariantBuilder, max_dep
             // Generate a list
             let mut list_builder = builder.new_list();
             let list_len = rng.random_range(0..10);
-
-            for _ in 0..list_len {
-                list_builder.append_value(rng.random::<i32>());
-            }
+            list_builder.extend(std::iter::repeat_with(|| 
rng.random::<i32>()).take(list_len));
             list_builder.finish();
         }
         14 => {
@@ -445,10 +442,9 @@ fn generate_random_value(rng: &mut StdRng, builder: &mut 
VariantBuilder, max_dep
             let mut object_builder = builder.new_object();
             let obj_size = rng.random_range(0..10);
 
-            for i in 0..obj_size {
-                let key = format!("field_{i}");
-                object_builder.insert(&key, rng.random::<i32>());
-            }
+            object_builder
+                .extend((0..obj_size).map(|i| (format!("field_{i}"), 
rng.random::<i32>())));
+
             object_builder.finish();
         }
         15 => {

Reply via email to