@@ -93,6 +93,14 @@ pub fn length(array: &dyn Array) -> Result<ArrayRef, ArrowError> {
9393 DataType :: FixedSizeBinary ( len) | DataType :: FixedSizeList ( _, len) => Ok ( Arc :: new (
9494 Int32Array :: new ( vec ! [ * len; array. len( ) ] . into ( ) , array. nulls ( ) . cloned ( ) ) ,
9595 ) ) ,
96+ DataType :: BinaryView => {
97+ let list = array. as_binary_view ( ) ;
98+ let v = list. views ( ) . iter ( ) . map ( |v| * v as i32 ) . collect :: < Vec < _ > > ( ) ;
99+ Ok ( Arc :: new ( PrimitiveArray :: < Int32Type > :: new (
100+ v. into ( ) ,
101+ list. nulls ( ) . cloned ( ) ,
102+ ) ) )
103+ }
96104 other => Err ( ArrowError :: ComputeError ( format ! (
97105 "length not supported for {other:?}"
98106 ) ) ) ,
@@ -253,6 +261,23 @@ mod tests {
253261 length_binary_helper ! ( i64 , Int64Array , length, value, result)
254262 }
255263
264+ #[ test]
265+ fn length_test_binary_view ( ) {
266+ let value: Vec < & [ u8 ] > = vec ! [
267+ b"zero" ,
268+ & [ 0xff , 0xf8 ] ,
269+ b"two" ,
270+ b"this is a longer string to test binary array with" ,
271+ ] ;
272+ let expected: Vec < i32 > = vec ! [ 4 , 2 , 3 , 49 ] ;
273+
274+ let array = BinaryViewArray :: from ( value) ;
275+ let result = length ( & array) . unwrap ( ) ;
276+ let result = result. as_any ( ) . downcast_ref :: < Int32Array > ( ) . unwrap ( ) ;
277+ let expected: Int32Array = expected. into ( ) ;
278+ assert_eq ! ( & expected, result) ;
279+ }
280+
256281 #[ test]
257282 fn length_test_list ( ) {
258283 let value = vec ! [
0 commit comments