@@ -143,6 +143,9 @@ fn take_impl<IndexType: ArrowPrimitiveType>(
143
143
DataType :: LargeUtf8 => {
144
144
Ok ( Arc :: new( take_bytes( values. as_string:: <i64 >( ) , indices) ?) )
145
145
}
146
+ DataType :: Utf8View => {
147
+ Ok ( Arc :: new( take_byte_view( values. as_string_view( ) , indices) ?) )
148
+ }
146
149
DataType :: List ( _) => {
147
150
Ok ( Arc :: new( take_list:: <_, Int32Type >( values. as_list( ) , indices) ?) )
148
151
}
@@ -204,6 +207,9 @@ fn take_impl<IndexType: ArrowPrimitiveType>(
204
207
DataType :: LargeBinary => {
205
208
Ok ( Arc :: new( take_bytes( values. as_binary:: <i64 >( ) , indices) ?) )
206
209
}
210
+ DataType :: BinaryView => {
211
+ Ok ( Arc :: new( take_byte_view( values. as_binary_view( ) , indices) ?) )
212
+ }
207
213
DataType :: FixedSizeBinary ( size) => {
208
214
let values = values
209
215
. as_any( )
@@ -437,6 +443,20 @@ fn take_bytes<T: ByteArrayType, IndexType: ArrowPrimitiveType>(
437
443
Ok ( GenericByteArray :: from ( array_data) )
438
444
}
439
445
446
+ /// `take` implementation for byte view arrays
447
+ fn take_byte_view < T : ByteViewType , IndexType : ArrowPrimitiveType > (
448
+ array : & GenericByteViewArray < T > ,
449
+ indices : & PrimitiveArray < IndexType > ,
450
+ ) -> Result < GenericByteViewArray < T > , ArrowError > {
451
+ let new_views = take_native ( array. views ( ) , indices) ;
452
+ let new_nulls = take_nulls ( array. nulls ( ) , indices) ;
453
+ Ok ( GenericByteViewArray :: new (
454
+ new_views,
455
+ array. data_buffers ( ) . to_vec ( ) ,
456
+ new_nulls,
457
+ ) )
458
+ }
459
+
440
460
/// `take` implementation for list arrays
441
461
///
442
462
/// Calculates the index and indexed offset for the inner array,
@@ -1424,6 +1444,53 @@ mod tests {
1424
1444
assert_eq ! ( result. as_ref( ) , & expected) ;
1425
1445
}
1426
1446
1447
+ fn _test_byte_view < T > ( )
1448
+ where
1449
+ T : ByteViewType ,
1450
+ str : AsRef < T :: Native > ,
1451
+ T :: Native : PartialEq ,
1452
+ {
1453
+ let index = UInt32Array :: from ( vec ! [ Some ( 3 ) , None , Some ( 1 ) , Some ( 3 ) , Some ( 4 ) , Some ( 2 ) ] ) ;
1454
+ let array = {
1455
+ // ["hello", "world", null, "large payload over 12 bytes", "lulu"]
1456
+ let mut builder = GenericByteViewBuilder :: < T > :: new ( ) ;
1457
+ builder. append_value ( "hello" ) ;
1458
+ builder. append_value ( "world" ) ;
1459
+ builder. append_null ( ) ;
1460
+ builder. append_value ( "large payload over 12 bytes" ) ;
1461
+ builder. append_value ( "lulu" ) ;
1462
+ builder. finish ( )
1463
+ } ;
1464
+
1465
+ let actual = take ( & array, & index, None ) . unwrap ( ) ;
1466
+
1467
+ assert_eq ! ( actual. len( ) , index. len( ) ) ;
1468
+
1469
+ let expected = {
1470
+ // ["large payload over 12 bytes", null, "world", "large payload over 12 bytes", "lulu", null]
1471
+ let mut builder = GenericByteViewBuilder :: < T > :: new ( ) ;
1472
+ builder. append_value ( "large payload over 12 bytes" ) ;
1473
+ builder. append_null ( ) ;
1474
+ builder. append_value ( "world" ) ;
1475
+ builder. append_value ( "large payload over 12 bytes" ) ;
1476
+ builder. append_value ( "lulu" ) ;
1477
+ builder. append_null ( ) ;
1478
+ builder. finish ( )
1479
+ } ;
1480
+
1481
+ assert_eq ! ( actual. as_ref( ) , & expected) ;
1482
+ }
1483
+
1484
+ #[ test]
1485
+ fn test_take_string_view ( ) {
1486
+ _test_byte_view :: < StringViewType > ( )
1487
+ }
1488
+
1489
+ #[ test]
1490
+ fn test_take_binary_view ( ) {
1491
+ _test_byte_view :: < BinaryViewType > ( )
1492
+ }
1493
+
1427
1494
macro_rules! test_take_list {
1428
1495
( $offset_type: ty, $list_data_type: ident, $list_array_type: ident) => { {
1429
1496
// Construct a value array, [[0,0,0], [-1,-2,-1], [], [2,3]]
0 commit comments