Skip to content

Commit 523a149

Browse files
[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.
1 parent 28d0b77 commit 523a149

File tree

3 files changed

+33
-22
lines changed

3 files changed

+33
-22
lines changed

parquet-variant/src/builder.rs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -277,11 +277,7 @@ impl ValueBuilder {
277277

278278
fn append_object<S: BuilderSpecificState>(state: ParentState<'_, S>, obj: VariantObject) {
279279
let mut object_builder = ObjectBuilder::new(state, false);
280-
281-
for (field_name, value) in obj.iter() {
282-
object_builder.insert(field_name, value);
283-
}
284-
280+
object_builder.extend(obj.iter());
285281
object_builder.finish();
286282
}
287283

@@ -302,9 +298,7 @@ impl ValueBuilder {
302298

303299
fn append_list<S: BuilderSpecificState>(state: ParentState<'_, S>, list: VariantList) {
304300
let mut list_builder = ListBuilder::new(state, false);
305-
for value in list.iter() {
306-
list_builder.append_value(value);
307-
}
301+
list_builder.extend(list.iter());
308302
list_builder.finish();
309303
}
310304

@@ -1443,6 +1437,18 @@ impl<'a, S: BuilderSpecificState> ListBuilder<'a, S> {
14431437
}
14441438
}
14451439

1440+
impl<'a, 'm, 'v, S, V> Extend<V> for ListBuilder<'a, S>
1441+
where
1442+
S: BuilderSpecificState,
1443+
V: Into<Variant<'m, 'v>>,
1444+
{
1445+
fn extend<T: IntoIterator<Item = V>>(&mut self, iter: T) {
1446+
for v in iter.into_iter() {
1447+
self.append_value(v);
1448+
}
1449+
}
1450+
}
1451+
14461452
/// A builder for creating [`Variant::Object`] values.
14471453
///
14481454
/// See the examples on [`VariantBuilder`] for usage.
@@ -1693,6 +1699,19 @@ impl<'a, S: BuilderSpecificState> ObjectBuilder<'a, S> {
16931699
}
16941700
}
16951701

1702+
impl<'a, 'm, 'v, S, K, V> Extend<(K, V)> for ObjectBuilder<'a, S>
1703+
where
1704+
S: BuilderSpecificState,
1705+
K: AsRef<str>,
1706+
V: Into<Variant<'m, 'v>>,
1707+
{
1708+
fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
1709+
for (key, value) in iter.into_iter() {
1710+
self.insert(key.as_ref(), value);
1711+
}
1712+
}
1713+
}
1714+
16961715
/// Extends [`VariantBuilder`] to help building nested [`Variant`]s
16971716
///
16981717
/// Allows users to append values to a [`VariantBuilder`], [`ListBuilder`] or

parquet-variant/src/variant/list.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -727,9 +727,7 @@ mod tests {
727727
fn make_listi32(range: Range<i32>) -> (Vec<u8>, Vec<u8>) {
728728
let mut variant_builder = VariantBuilder::new();
729729
let mut list_builder = variant_builder.new_list();
730-
for i in range {
731-
list_builder.append_value(i);
732-
}
730+
list_builder.extend(range);
733731
list_builder.finish();
734732
variant_builder.finish()
735733
}
@@ -738,9 +736,7 @@ mod tests {
738736
fn make_listi64(range: Range<i64>) -> (Vec<u8>, Vec<u8>) {
739737
let mut variant_builder = VariantBuilder::new();
740738
let mut list_builder = variant_builder.new_list();
741-
for i in range {
742-
list_builder.append_value(i);
743-
}
739+
list_builder.extend(range);
744740
list_builder.finish();
745741
variant_builder.finish()
746742
}

parquet-variant/tests/variant_interop.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -434,21 +434,17 @@ fn generate_random_value(rng: &mut StdRng, builder: &mut VariantBuilder, max_dep
434434
// Generate a list
435435
let mut list_builder = builder.new_list();
436436
let list_len = rng.random_range(0..10);
437-
438-
for _ in 0..list_len {
439-
list_builder.append_value(rng.random::<i32>());
440-
}
437+
list_builder.extend(std::iter::repeat_with(|| rng.random::<i32>()).take(list_len));
441438
list_builder.finish();
442439
}
443440
14 => {
444441
// Generate an object
445442
let mut object_builder = builder.new_object();
446443
let obj_size = rng.random_range(0..10);
447444

448-
for i in 0..obj_size {
449-
let key = format!("field_{i}");
450-
object_builder.insert(&key, rng.random::<i32>());
451-
}
445+
object_builder
446+
.extend((0..obj_size).map(|i| (format!("field_{i}"), rng.random::<i32>())));
447+
452448
object_builder.finish();
453449
}
454450
15 => {

0 commit comments

Comments
 (0)