20
20
use crate :: VariantArray ;
21
21
use arrow:: array:: { ArrayRef , BinaryViewArray , BinaryViewBuilder , NullBufferBuilder , StructArray } ;
22
22
use arrow_schema:: { DataType , Field , Fields } ;
23
- use parquet_variant:: { Variant , VariantBuilder } ;
23
+ use parquet_variant:: { ListBuilder , ObjectBuilder , Variant , VariantBuilder , VariantBuilderExt } ;
24
24
use std:: sync:: Arc ;
25
25
26
26
/// A builder for [`VariantArray`]
@@ -166,14 +166,41 @@ impl VariantArrayBuilder {
166
166
self . value_buffer . extend_from_slice ( value) ;
167
167
}
168
168
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 {
171
198
// append directly into the metadata and value buffers
172
199
let metadata_buffer = std:: mem:: take ( & mut self . metadata_buffer ) ;
173
200
let value_buffer = std:: mem:: take ( & mut self . value_buffer ) ;
174
201
let metadata_offset = metadata_buffer. len ( ) ;
175
202
let value_offset = value_buffer. len ( ) ;
176
- DirectVariantBuilder {
203
+ VariantArrayVariantBuilder {
177
204
finished : false ,
178
205
metadata_offset,
179
206
value_offset,
@@ -185,19 +212,36 @@ impl VariantArrayBuilder {
185
212
186
213
/// A `VariantBuilder` that writes directly to the buffers of a `VariantArrayBuilder`.
187
214
///
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 > {
190
220
/// was finish called?
191
221
finished : bool ,
192
- /// starting metadata offset
222
+ /// starting metadata offset in the underlying buffers
193
223
metadata_offset : usize ,
194
224
/// starting value offset
195
225
value_offset : usize ,
196
226
array_builder : & ' a mut VariantArrayBuilder ,
197
227
variant_builder : VariantBuilder ,
198
228
}
199
229
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 < ' _ > {
201
245
/// Return a reference to the underlying `VariantBuilder`
202
246
pub fn inner ( & self ) -> & VariantBuilder {
203
247
& self . variant_builder
@@ -244,14 +288,14 @@ impl DirectVariantBuilder<'_> {
244
288
}
245
289
}
246
290
247
- impl < ' a > Drop for DirectVariantBuilder < ' a > {
291
+ impl < ' a > Drop for VariantArrayVariantBuilder < ' a > {
248
292
fn drop ( & mut self ) {
249
293
if self . finished {
250
294
// if the object was finished, we do not need to do anything
251
295
return ;
252
296
}
253
297
// 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" ) ;
255
299
let variant_builder = std:: mem:: take ( & mut self . variant_builder ) ;
256
300
let ( mut metadata_buffer, mut value_buffer) = variant_builder. finish ( ) ;
257
301
assert ! (
0 commit comments