@@ -627,6 +627,26 @@ impl<'a> From<Vec<&'a str>> for BinaryArray {
627627 }
628628}
629629
630+ impl < ' a > From < Vec < & [ u8 ] > > for BinaryArray {
631+ fn from ( v : Vec < & [ u8 ] > ) -> Self {
632+ let mut offsets = vec ! [ ] ;
633+ let mut values = vec ! [ ] ;
634+ let mut length_so_far = 0 ;
635+ offsets. push ( length_so_far) ;
636+ for s in & v {
637+ length_so_far += s. len ( ) as i32 ;
638+ offsets. push ( length_so_far as i32 ) ;
639+ values. extend_from_slice ( s) ;
640+ }
641+ let array_data = ArrayData :: builder ( DataType :: Utf8 )
642+ . len ( v. len ( ) )
643+ . add_buffer ( Buffer :: from ( offsets. to_byte_slice ( ) ) )
644+ . add_buffer ( Buffer :: from ( & values[ ..] ) )
645+ . build ( ) ;
646+ BinaryArray :: from ( array_data)
647+ }
648+ }
649+
630650/// Creates a `BinaryArray` from `List<u8>` array
631651impl From < ListArray > for BinaryArray {
632652 fn from ( v : ListArray ) -> Self {
@@ -1155,6 +1175,36 @@ mod tests {
11551175 }
11561176 }
11571177
1178+ #[ test]
1179+ fn test_binary_array_from_u8_slice ( ) {
1180+ let values: Vec < & [ u8 ] > = vec ! [
1181+ & [ b'h' , b'e' , b'l' , b'l' , b'o' ] ,
1182+ & [ ] ,
1183+ & [ b'p' , b'a' , b'r' , b'q' , b'u' , b'e' , b't' ]
1184+ ] ;
1185+
1186+ // Array data: ["hello", "", "parquet"]
1187+ let binary_array = BinaryArray :: from ( values) ;
1188+
1189+ assert_eq ! ( 3 , binary_array. len( ) ) ;
1190+ assert_eq ! ( 0 , binary_array. null_count( ) ) ;
1191+ assert_eq ! ( [ b'h' , b'e' , b'l' , b'l' , b'o' ] , binary_array. value( 0 ) ) ;
1192+ assert_eq ! ( "hello" , binary_array. get_string( 0 ) ) ;
1193+ assert_eq ! ( [ ] as [ u8 ; 0 ] , binary_array. value( 1 ) ) ;
1194+ assert_eq ! ( "" , binary_array. get_string( 1 ) ) ;
1195+ assert_eq ! (
1196+ [ b'p' , b'a' , b'r' , b'q' , b'u' , b'e' , b't' ] ,
1197+ binary_array. value( 2 )
1198+ ) ;
1199+ assert_eq ! ( "parquet" , binary_array. get_string( 2 ) ) ;
1200+ assert_eq ! ( 5 , binary_array. value_offset( 2 ) ) ;
1201+ assert_eq ! ( 7 , binary_array. value_length( 2 ) ) ;
1202+ for i in 0 ..3 {
1203+ assert ! ( binary_array. is_valid( i) ) ;
1204+ assert ! ( !binary_array. is_null( i) ) ;
1205+ }
1206+ }
1207+
11581208 #[ test]
11591209 #[ should_panic(
11601210 expected = "BinaryArray can only be created from List<u8> arrays, mismatched \
0 commit comments