@@ -218,11 +218,6 @@ impl VarBinBufferBuilder {
218218 Self { dtype, storage }
219219 }
220220
221- /// Returns whether this builder uses 64-bit offsets.
222- pub fn has_large_offsets ( & self ) -> bool {
223- matches ! ( self . storage, TypedBuilder :: I64 ( _) )
224- }
225-
226221 /// Appends decompressed values represented by one contiguous byte buffer and per-row lengths.
227222 pub fn append_values (
228223 & mut self ,
@@ -416,12 +411,20 @@ impl ArrayBuilder for VarBinBufferBuilder {
416411
417412#[ cfg( test) ]
418413mod tests {
414+ use rstest:: rstest;
419415 use vortex_error:: VortexResult ;
416+ use vortex_mask:: Mask ;
420417
418+ use crate :: IntoArray ;
421419 use crate :: VortexSessionExecute ;
422420 use crate :: array_session;
421+ use crate :: arrays:: VarBinArray ;
422+ use crate :: arrays:: VarBinViewArray ;
423423 use crate :: arrays:: varbin:: VarBinArrayExt ;
424+ use crate :: arrays:: varbin:: builder:: VarBinBufferBuilder ;
424425 use crate :: arrays:: varbin:: builder:: VarBinBuilder ;
426+ use crate :: assert_arrays_eq;
427+ use crate :: builders:: ArrayBuilder ;
425428 use crate :: dtype:: DType ;
426429 use crate :: dtype:: Nullability :: Nullable ;
427430 use crate :: expr:: stats:: Precision ;
@@ -453,6 +456,67 @@ mod tests {
453456 ) ;
454457 }
455458
459+ #[ rstest]
460+ #[ case( false ) ]
461+ #[ case( true ) ]
462+ fn test_append_varbin_to_buffer_builder ( #[ case] large_offsets : bool ) -> VortexResult < ( ) > {
463+ let source =
464+ VarBinArray :: from_iter ( [ Some ( "hello" ) , None , Some ( "world" ) ] , DType :: Utf8 ( Nullable ) ) ;
465+ let mut builder =
466+ VarBinBufferBuilder :: with_capacity ( source. dtype ( ) . clone ( ) , large_offsets, source. len ( ) ) ;
467+ let mut ctx = array_session ( ) . create_execution_ctx ( ) ;
468+
469+ source
470+ . clone ( )
471+ . into_array ( )
472+ . append_to_builder ( & mut builder, & mut ctx) ?;
473+
474+ assert_arrays_eq ! ( builder. finish_into_varbin( ) , source, & mut ctx) ;
475+ Ok ( ( ) )
476+ }
477+
478+ #[ rstest]
479+ #[ case( false ) ]
480+ #[ case( true ) ]
481+ fn test_array_builder_methods ( #[ case] large_offsets : bool ) -> VortexResult < ( ) > {
482+ let mut ctx = array_session ( ) . create_execution_ctx ( ) ;
483+ for validity in [
484+ Mask :: new_true ( 3 ) ,
485+ Mask :: new_false ( 3 ) ,
486+ Mask :: from_iter ( [ true , false , true ] ) ,
487+ ] {
488+ let mut builder =
489+ VarBinBufferBuilder :: with_capacity ( DType :: Utf8 ( Nullable ) , large_offsets, 0 ) ;
490+ assert ! ( builder. as_any( ) . is:: <VarBinBufferBuilder >( ) ) ;
491+ builder. reserve_exact ( 3 ) ;
492+ builder. append_zero ( ) ;
493+ builder. append_scalar ( & Scalar :: utf8 ( "hello" , Nullable ) ) ?;
494+ builder. append_null ( ) ;
495+ assert_eq ! ( builder. len( ) , 3 ) ;
496+ builder. set_validity ( validity. clone ( ) ) ;
497+
498+ let result = builder. finish_into_canonical ( & mut ctx) . into_array ( ) ;
499+ assert_eq ! ( result. validity( ) ?. execute_mask( 3 , & mut ctx) ?, validity) ;
500+ }
501+ Ok ( ( ) )
502+ }
503+
504+ #[ test]
505+ fn test_append_all_null_varbinview_to_buffer_builder ( ) -> VortexResult < ( ) > {
506+ let source = VarBinViewArray :: from_iter ( [ None :: < & str > , None ] , DType :: Utf8 ( Nullable ) ) ;
507+ let mut builder =
508+ VarBinBufferBuilder :: with_capacity ( source. dtype ( ) . clone ( ) , false , source. len ( ) ) ;
509+ let mut ctx = array_session ( ) . create_execution_ctx ( ) ;
510+
511+ source
512+ . clone ( )
513+ . into_array ( )
514+ . append_to_builder ( & mut builder, & mut ctx) ?;
515+
516+ assert_arrays_eq ! ( builder. finish_into_varbin( ) , source, & mut ctx) ;
517+ Ok ( ( ) )
518+ }
519+
456520 #[ test]
457521 fn offsets_have_is_sorted_stat ( ) -> VortexResult < ( ) > {
458522 let mut builder = VarBinBuilder :: < i32 > :: with_capacity ( 0 ) ;
0 commit comments