@@ -314,6 +314,7 @@ fn bit_width(data_type: &DataType, i: usize) -> Result<usize> {
314314 ( DataType :: Float64 , 1 ) => size_of :: < f64 > ( ) * 8 ,
315315 ( DataType :: Decimal ( ..) , 1 ) => size_of :: < i128 > ( ) * 8 ,
316316 ( DataType :: Timestamp ( ..) , 1 ) => size_of :: < i64 > ( ) * 8 ,
317+ ( DataType :: Duration ( ..) , 1 ) => size_of :: < i64 > ( ) * 8 ,
317318 // primitive types have a single buffer
318319 ( DataType :: Boolean , _) |
319320 ( DataType :: UInt8 , _) |
@@ -327,7 +328,8 @@ fn bit_width(data_type: &DataType, i: usize) -> Result<usize> {
327328 ( DataType :: Float32 , _) |
328329 ( DataType :: Float64 , _) |
329330 ( DataType :: Decimal ( ..) , _) |
330- ( DataType :: Timestamp ( ..) , _) => {
331+ ( DataType :: Timestamp ( ..) , _) |
332+ ( DataType :: Duration ( ..) , _) => {
331333 return Err ( ArrowError :: CDataInterface ( format ! (
332334 "The datatype \" {:?}\" expects 2 buffers, but requested {}. Please verify that the C data interface is correctly implemented." ,
333335 data_type, i
@@ -873,9 +875,9 @@ mod tests {
873875 use super :: * ;
874876 use crate :: array:: {
875877 export_array_into_raw, make_array, Array , ArrayData , BooleanArray , DecimalArray ,
876- DictionaryArray , FixedSizeBinaryArray , FixedSizeListArray , GenericBinaryArray ,
877- GenericListArray , GenericStringArray , Int32Array , OffsetSizeTrait ,
878- Time32MillisecondArray , TimestampMillisecondArray ,
878+ DictionaryArray , DurationSecondArray , FixedSizeBinaryArray , FixedSizeListArray ,
879+ GenericBinaryArray , GenericListArray , GenericStringArray , Int32Array ,
880+ OffsetSizeTrait , Time32MillisecondArray , TimestampMillisecondArray ,
879881 } ;
880882 use crate :: compute:: kernels;
881883 use crate :: datatypes:: { Field , Int8Type } ;
@@ -1358,4 +1360,40 @@ mod tests {
13581360 }
13591361 Ok ( ( ) )
13601362 }
1363+
1364+ #[ test]
1365+ fn test_duration ( ) -> Result < ( ) > {
1366+ // create an array natively
1367+ let array = DurationSecondArray :: from ( vec ! [ None , Some ( 1 ) , Some ( 2 ) ] ) ;
1368+
1369+ // export it
1370+ let array = ArrowArray :: try_from ( array. data ( ) . clone ( ) ) ?;
1371+
1372+ // (simulate consumer) import it
1373+ let data = ArrayData :: try_from ( array) ?;
1374+ let array = make_array ( data) ;
1375+
1376+ // perform some operation
1377+ let array = kernels:: concat:: concat ( & [ array. as_ref ( ) , array. as_ref ( ) ] ) . unwrap ( ) ;
1378+ let array = array
1379+ . as_any ( )
1380+ . downcast_ref :: < DurationSecondArray > ( )
1381+ . unwrap ( ) ;
1382+
1383+ // verify
1384+ assert_eq ! (
1385+ array,
1386+ & DurationSecondArray :: from( vec![
1387+ None ,
1388+ Some ( 1 ) ,
1389+ Some ( 2 ) ,
1390+ None ,
1391+ Some ( 1 ) ,
1392+ Some ( 2 )
1393+ ] )
1394+ ) ;
1395+
1396+ // (drop/release)
1397+ Ok ( ( ) )
1398+ }
13611399}
0 commit comments