Skip to content

Commit e07069d

Browse files
committed
impl VariantBuilderExt for VariantArrayVariantBuilder
1 parent c4b2874 commit e07069d

File tree

1 file changed

+54
-10
lines changed

1 file changed

+54
-10
lines changed

parquet-variant-compute/src/variant_array_builder.rs

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
use crate::VariantArray;
2121
use arrow::array::{ArrayRef, BinaryViewArray, BinaryViewBuilder, NullBufferBuilder, StructArray};
2222
use arrow_schema::{DataType, Field, Fields};
23-
use parquet_variant::{Variant, VariantBuilder};
23+
use parquet_variant::{ListBuilder, ObjectBuilder, Variant, VariantBuilder, VariantBuilderExt};
2424
use std::sync::Arc;
2525

2626
/// A builder for [`VariantArray`]
@@ -166,14 +166,41 @@ impl VariantArrayBuilder {
166166
self.value_buffer.extend_from_slice(value);
167167
}
168168

169-
/// Return a DirectVariantBuilder that writes directly to the buffers of this builder.
170-
pub fn variant_builder(&mut self) -> DirectVariantBuilder {
169+
/// Return a VariantArrayVariantBuilder that writes directly to the buffers of this builder.
170+
///
171+
/// # Example
172+
/// ```
173+
/// # use parquet_variant::{Variant, VariantBuilder, VariantBuilderExt};
174+
/// # use parquet_variant_compute::{VariantArray, VariantArrayBuilder};
175+
/// let mut array_builder = VariantArrayBuilder::new(10);
176+
///
177+
/// // First row has a string
178+
/// let mut variant_builder = array_builder.variant_builder();
179+
/// variant_builder.append_value("Hello, World!");
180+
/// // must call finish to write the variant to the buffers
181+
/// variant_builder.finish();
182+
///
183+
/// // Second row is an object
184+
/// let mut variant_builder = array_builder.variant_builder();
185+
/// let mut obj = variant_builder.new_object();
186+
/// obj.insert("my_field", 42i64);
187+
/// obj.finish().unwrap();
188+
/// variant_builder.finish();
189+
///
190+
/// // finalize the array
191+
/// let variant_array: VariantArray = array_builder.build();
192+
///
193+
/// // verify what we wrote is still there
194+
/// assert_eq!(variant_array.value(0), Variant::from("Hello, World!"));
195+
/// assert!(variant_array.value(1).as_object().is_some());
196+
/// ```
197+
pub fn variant_builder(&mut self) -> VariantArrayVariantBuilder {
171198
// append directly into the metadata and value buffers
172199
let metadata_buffer = std::mem::take(&mut self.metadata_buffer);
173200
let value_buffer = std::mem::take(&mut self.value_buffer);
174201
let metadata_offset = metadata_buffer.len();
175202
let value_offset = value_buffer.len();
176-
DirectVariantBuilder {
203+
VariantArrayVariantBuilder {
177204
finished: false,
178205
metadata_offset,
179206
value_offset,
@@ -185,19 +212,36 @@ impl VariantArrayBuilder {
185212

186213
/// A `VariantBuilder` that writes directly to the buffers of a `VariantArrayBuilder`.
187214
///
188-
/// See [`VariantArray::variant_builder`] for an example
189-
pub struct DirectVariantBuilder<'a> {
215+
/// Note this struct implements [`VariantBuilderExt`], so it can be used
216+
/// as a drop-in replacement for [`VariantBuilder`] in most cases.
217+
///
218+
/// See [`VariantArrayBuilder::variant_builder`] for an example
219+
pub struct VariantArrayVariantBuilder<'a> {
190220
/// was finish called?
191221
finished: bool,
192-
/// starting metadata offset
222+
/// starting metadata offset in the underlying buffers
193223
metadata_offset: usize,
194224
/// starting value offset
195225
value_offset: usize,
196226
array_builder: &'a mut VariantArrayBuilder,
197227
variant_builder: VariantBuilder,
198228
}
199229

200-
impl DirectVariantBuilder<'_> {
230+
impl<'a, 'm, 'v> VariantBuilderExt<'m, 'v> for VariantArrayVariantBuilder<'a> {
231+
fn append_value(&mut self, value: impl Into<Variant<'m, 'v>>) {
232+
self.variant_builder.append_value(value);
233+
}
234+
235+
fn new_list(&mut self) -> ListBuilder {
236+
self.variant_builder.new_list()
237+
}
238+
239+
fn new_object(&mut self) -> ObjectBuilder {
240+
self.variant_builder.new_object()
241+
}
242+
}
243+
244+
impl VariantArrayVariantBuilder<'_> {
201245
/// Return a reference to the underlying `VariantBuilder`
202246
pub fn inner(&self) -> &VariantBuilder {
203247
&self.variant_builder
@@ -244,14 +288,14 @@ impl DirectVariantBuilder<'_> {
244288
}
245289
}
246290

247-
impl<'a> Drop for DirectVariantBuilder<'a> {
291+
impl<'a> Drop for VariantArrayVariantBuilder<'a> {
248292
fn drop(&mut self) {
249293
if self.finished {
250294
// if the object was finished, we do not need to do anything
251295
return;
252296
}
253297
// if the object was not finished, we need to reset any partial state put the buffers back
254-
println!("DirectVariantBuilder::drop");
298+
println!("VariantArrayVariantBuilder::drop");
255299
let variant_builder = std::mem::take(&mut self.variant_builder);
256300
let (mut metadata_buffer, mut value_buffer) = variant_builder.finish();
257301
assert!(

0 commit comments

Comments
 (0)