@@ -93,6 +93,14 @@ pub fn length(array: &dyn Array) -> Result<ArrayRef, ArrowError> {
93
93
DataType :: FixedSizeBinary ( len) | DataType :: FixedSizeList ( _, len) => Ok ( Arc :: new (
94
94
Int32Array :: new ( vec ! [ * len; array. len( ) ] . into ( ) , array. nulls ( ) . cloned ( ) ) ,
95
95
) ) ,
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
+ }
96
104
other => Err ( ArrowError :: ComputeError ( format ! (
97
105
"length not supported for {other:?}"
98
106
) ) ) ,
@@ -253,6 +261,23 @@ mod tests {
253
261
length_binary_helper ! ( i64 , Int64Array , length, value, result)
254
262
}
255
263
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
+
256
281
#[ test]
257
282
fn length_test_list ( ) {
258
283
let value = vec ! [
0 commit comments