@@ -40,6 +40,8 @@ pub mod zero_size_type;
4040use std:: cmp:: Ordering ;
4141use std:: fmt:: Debug ;
4242use std:: iter:: TrustedLen ;
43+ use std:: ops:: Deref ;
44+ use std:: ops:: DerefMut ;
4345use std:: ops:: Range ;
4446
4547use borsh:: BorshDeserialize ;
@@ -456,6 +458,7 @@ pub trait AccessType: Debug + Clone + PartialEq + Sized + 'static {
456458/// [ValueType] includes the builder method of a data type based on [AccessType].
457459pub trait ValueType : AccessType {
458460 type ColumnBuilder : Debug + Clone ;
461+ type ColumnBuilderMut < ' a > : Debug + From < & ' a mut Self :: ColumnBuilder > + BuilderExt < Self > ;
459462
460463 /// Convert a scalar value to the generic [Scalar] type
461464 fn upcast_scalar_with_type ( scalar : Self :: Scalar , data_type : & DataType ) -> Scalar ;
@@ -466,27 +469,7 @@ pub trait ValueType: AccessType {
466469 /// Convert a column value to the generic Column type
467470 fn upcast_column_with_type ( col : Self :: Column , data_type : & DataType ) -> Column ;
468471
469- /// Downcast `ColumnBuilder` to a mutable reference of its inner builder type.
470- ///
471- /// Not every builder can be downcasted successfully.
472- /// For example: `ArrayType<T: ValueType>`, `NullableType<T: ValueType>`, and `KvPair<K: ValueType, V: ValueType>`
473- /// cannot be downcasted and this method will return `None`.
474- ///
475- /// So when using this method, we cannot unwrap the returned value directly.
476- /// We should:
477- ///
478- /// ```ignore
479- /// // builder: ColumnBuilder
480- /// // T: ValueType
481- /// if let Some(inner) = T::try_downcast_builder(&mut builder) {
482- /// inner.push(...);
483- /// } else {
484- /// builder.push(...);
485- /// }
486- /// ```
487- fn try_downcast_builder ( builder : & mut ColumnBuilder ) -> Option < & mut Self :: ColumnBuilder > ;
488-
489- fn try_downcast_owned_builder ( builder : ColumnBuilder ) -> Option < Self :: ColumnBuilder > ;
472+ fn downcast_builder ( builder : & mut ColumnBuilder ) -> Self :: ColumnBuilderMut < ' _ > ;
490473
491474 fn try_upcast_column_builder (
492475 builder : Self :: ColumnBuilder ,
@@ -495,15 +478,92 @@ pub trait ValueType: AccessType {
495478
496479 fn column_to_builder ( col : Self :: Column ) -> Self :: ColumnBuilder ;
497480
481+ fn builder_len_mut ( builder : & Self :: ColumnBuilderMut < ' _ > ) -> usize ;
498482 fn builder_len ( builder : & Self :: ColumnBuilder ) -> usize ;
499- fn push_item ( builder : & mut Self :: ColumnBuilder , item : Self :: ScalarRef < ' _ > ) ;
500- fn push_item_repeat ( builder : & mut Self :: ColumnBuilder , item : Self :: ScalarRef < ' _ > , n : usize ) ;
501- fn push_default ( builder : & mut Self :: ColumnBuilder ) ;
502- fn append_column ( builder : & mut Self :: ColumnBuilder , other : & Self :: Column ) ;
483+
484+ fn push_item_mut ( builder : & mut Self :: ColumnBuilderMut < ' _ > , item : Self :: ScalarRef < ' _ > ) ;
485+ fn push_item ( builder : & mut Self :: ColumnBuilder , item : Self :: ScalarRef < ' _ > ) {
486+ Self :: push_item_mut ( & mut builder. into ( ) , item) ;
487+ }
488+
489+ fn push_item_repeat_mut (
490+ builder : & mut Self :: ColumnBuilderMut < ' _ > ,
491+ item : Self :: ScalarRef < ' _ > ,
492+ n : usize ,
493+ ) ;
494+ fn push_item_repeat ( builder : & mut Self :: ColumnBuilder , item : Self :: ScalarRef < ' _ > , n : usize ) {
495+ Self :: push_item_repeat_mut ( & mut builder. into ( ) , item, n) ;
496+ }
497+
498+ fn push_default_mut ( builder : & mut Self :: ColumnBuilderMut < ' _ > ) ;
499+ fn push_default ( builder : & mut Self :: ColumnBuilder ) {
500+ Self :: push_default_mut ( & mut builder. into ( ) )
501+ }
502+
503+ fn append_column_mut ( builder : & mut Self :: ColumnBuilderMut < ' _ > , other : & Self :: Column ) ;
504+ fn append_column ( builder : & mut Self :: ColumnBuilder , other : & Self :: Column ) {
505+ Self :: append_column_mut ( & mut builder. into ( ) , other) ;
506+ }
507+
503508 fn build_column ( builder : Self :: ColumnBuilder ) -> Self :: Column ;
504509 fn build_scalar ( builder : Self :: ColumnBuilder ) -> Self :: Scalar ;
505510}
506511
512+ impl < ' a , T : ValueType > From < & ' a mut T :: ColumnBuilder > for BuilderMut < ' a , T > {
513+ fn from ( value : & ' a mut T :: ColumnBuilder ) -> Self {
514+ BuilderMut ( value)
515+ }
516+ }
517+
518+ #[ derive( Debug ) ]
519+ pub struct BuilderMut < ' a , T : ValueType > ( & ' a mut T :: ColumnBuilder ) ;
520+
521+ impl < T : ValueType > Deref for BuilderMut < ' _ , T > {
522+ type Target = T :: ColumnBuilder ;
523+
524+ fn deref ( & self ) -> & Self :: Target {
525+ self . 0
526+ }
527+ }
528+
529+ impl < T : ValueType > DerefMut for BuilderMut < ' _ , T > {
530+ fn deref_mut ( & mut self ) -> & mut Self :: Target {
531+ self . 0
532+ }
533+ }
534+
535+ impl < ' a , T > BuilderExt < T > for BuilderMut < ' a , T >
536+ where T : ValueType < ColumnBuilderMut < ' a > = Self >
537+ {
538+ fn len ( & self ) -> usize {
539+ T :: builder_len ( self . 0 )
540+ }
541+
542+ fn push_item ( & mut self , item : <T >:: ScalarRef < ' _ > ) {
543+ T :: push_item_mut ( self , item) ;
544+ }
545+
546+ fn push_repeat ( & mut self , item : <T >:: ScalarRef < ' _ > , n : usize ) {
547+ T :: push_item_repeat_mut ( self , item, n) ;
548+ }
549+
550+ fn push_default ( & mut self ) {
551+ T :: push_default_mut ( self ) ;
552+ }
553+
554+ fn append_column ( & mut self , other : & <T >:: Column ) {
555+ T :: append_column_mut ( self , other) ;
556+ }
557+ }
558+
559+ pub trait BuilderExt < T : ValueType > {
560+ fn len ( & self ) -> usize ;
561+ fn push_item ( & mut self , item : T :: ScalarRef < ' _ > ) ;
562+ fn push_repeat ( & mut self , item : T :: ScalarRef < ' _ > , n : usize ) ;
563+ fn push_default ( & mut self ) ;
564+ fn append_column ( & mut self , other : & T :: Column ) ;
565+ }
566+
507567/// Almost all [ValueType] implement [ReturnType], except [AnyType].
508568pub trait ReturnType : ValueType {
509569 fn create_builder ( capacity : usize , generics : & GenericMap ) -> Self :: ColumnBuilder ;
0 commit comments