@@ -190,6 +190,29 @@ impl<T: ByteArrayType> GenericByteArray<T> {
190190 Scalar :: new ( Self :: from_iter_values ( std:: iter:: once ( value) ) )
191191 }
192192
193+ /// Create a new [`GenericByteArray`] where `value` is repeated `repeat_count` times.
194+ ///
195+ /// # Panics
196+ /// This will panic if value's length multiplied by `repeat_count` overflows usize.
197+ ///
198+ pub fn new_repeated ( value : impl AsRef < T :: Native > , repeat_count : usize ) -> Self {
199+ let s: & [ u8 ] = value. as_ref ( ) . as_ref ( ) ;
200+ let value_offsets = OffsetBuffer :: from_repeated_length ( s. len ( ) , repeat_count) ;
201+ let bytes: Buffer = {
202+ let mut mutable_buffer = MutableBuffer :: with_capacity ( 0 ) ;
203+ mutable_buffer. repeat_slice_n_times ( s, repeat_count) ;
204+
205+ mutable_buffer. into ( )
206+ } ;
207+
208+ Self {
209+ data_type : T :: DATA_TYPE ,
210+ value_data : bytes,
211+ value_offsets,
212+ nulls : None ,
213+ }
214+ }
215+
193216 /// Creates a [`GenericByteArray`] based on an iterator of values without nulls
194217 pub fn from_iter_values < Ptr , I > ( iter : I ) -> Self
195218 where
@@ -593,7 +616,7 @@ where
593616
594617#[ cfg( test) ]
595618mod tests {
596- use crate :: { BinaryArray , StringArray } ;
619+ use crate :: { Array , BinaryArray , StringArray } ;
597620 use arrow_buffer:: { Buffer , NullBuffer , OffsetBuffer } ;
598621
599622 #[ test]
@@ -651,4 +674,42 @@ mod tests {
651674
652675 BinaryArray :: new ( offsets, non_ascii_data, None ) ;
653676 }
677+
678+ #[ test]
679+ fn create_repeated ( ) {
680+ let arr = BinaryArray :: new_repeated ( b"hello" , 3 ) ;
681+ assert_eq ! ( arr. len( ) , 3 ) ;
682+ assert_eq ! ( arr. value( 0 ) , b"hello" ) ;
683+ assert_eq ! ( arr. value( 1 ) , b"hello" ) ;
684+ assert_eq ! ( arr. value( 2 ) , b"hello" ) ;
685+
686+ let arr = StringArray :: new_repeated ( "world" , 2 ) ;
687+ assert_eq ! ( arr. len( ) , 2 ) ;
688+ assert_eq ! ( arr. value( 0 ) , "world" ) ;
689+ assert_eq ! ( arr. value( 1 ) , "world" ) ;
690+ }
691+
692+ #[ test]
693+ #[ should_panic( expected = "usize overflow" ) ]
694+ fn create_repeated_usize_overflow_1 ( ) {
695+ let _arr = BinaryArray :: new_repeated ( b"hello" , ( usize:: MAX / "hello" . len ( ) ) + 1 ) ;
696+ }
697+
698+ #[ test]
699+ #[ should_panic( expected = "usize overflow" ) ]
700+ fn create_repeated_usize_overflow_2 ( ) {
701+ let _arr = BinaryArray :: new_repeated ( b"hello" , usize:: MAX ) ;
702+ }
703+
704+ #[ test]
705+ #[ should_panic( expected = "offset overflow" ) ]
706+ fn create_repeated_i32_offset_overflow_1 ( ) {
707+ let _arr = BinaryArray :: new_repeated ( b"hello" , usize:: MAX / "hello" . len ( ) ) ;
708+ }
709+
710+ #[ test]
711+ #[ should_panic( expected = "offset overflow" ) ]
712+ fn create_repeated_i32_offset_overflow_2 ( ) {
713+ let _arr = BinaryArray :: new_repeated ( b"hello" , ( ( i32:: MAX as usize ) / "hello" . len ( ) ) + 1 ) ;
714+ }
654715}
0 commit comments