@@ -141,6 +141,9 @@ impl<R: RunEndIndexType> RunArray<R> {
141141 ///
142142 /// [`values`]: Self::values
143143 pub fn values_slice ( & self ) -> ArrayRef {
144+ if self . is_empty ( ) {
145+ return self . values . slice ( 0 , 0 ) ;
146+ }
144147 let start = self . get_start_physical_index ( ) ;
145148 let end = self . get_end_physical_index ( ) ;
146149 self . values . slice ( start, end - start + 1 )
@@ -655,6 +658,7 @@ mod tests {
655658 use super :: * ;
656659 use crate :: builder:: PrimitiveRunBuilder ;
657660 use crate :: cast:: AsArray ;
661+ use crate :: new_empty_array;
658662 use crate :: types:: { Int8Type , UInt32Type } ;
659663 use crate :: { Int16Array , Int32Array , StringArray } ;
660664
@@ -752,6 +756,26 @@ mod tests {
752756 assert_eq ! ( run_ends. values( ) , & run_ends_values) ;
753757 }
754758
759+ #[ test]
760+ fn test_run_array_empty ( ) {
761+ let runs = new_empty_array ( & DataType :: Int16 ) ;
762+ let runs = runs. as_primitive :: < Int16Type > ( ) ;
763+ let values = new_empty_array ( & DataType :: Int64 ) ;
764+ let array = RunArray :: try_new ( runs, & values) . unwrap ( ) ;
765+
766+ fn assertions ( array : & RunArray < Int16Type > ) {
767+ assert ! ( array. is_empty( ) ) ;
768+ assert_eq ! ( array. get_start_physical_index( ) , 0 ) ;
769+ assert_eq ! ( array. get_end_physical_index( ) , 0 ) ;
770+ assert ! ( array. get_physical_indices:: <i16 >( & [ ] ) . unwrap( ) . is_empty( ) ) ;
771+ assert ! ( array. run_ends( ) . is_empty( ) ) ;
772+ assert_eq ! ( array. run_ends( ) . sliced_values( ) . count( ) , 0 ) ;
773+ }
774+
775+ assertions ( & array) ;
776+ assertions ( & array. slice ( 0 , 0 ) ) ;
777+ }
778+
755779 #[ test]
756780 fn test_run_array_fmt_debug ( ) {
757781 let mut builder = PrimitiveRunBuilder :: < Int16Type , UInt32Type > :: with_capacity ( 3 ) ;
@@ -1186,4 +1210,89 @@ mod tests {
11861210 let values_slice2 = values_slice2. as_primitive :: < Int32Type > ( ) ;
11871211 assert_eq ! ( values_slice2. values( ) , & [ 1 ] ) ;
11881212 }
1213+
1214+ #[ test]
1215+ fn test_run_array_values_slice_empty ( ) {
1216+ let run_ends = Int32Array :: from ( vec ! [ 2 , 5 , 10 ] ) ;
1217+ let values = StringArray :: from ( vec ! [ "a" , "b" , "c" ] ) ;
1218+ let array = RunArray :: < Int32Type > :: try_new ( & run_ends, & values) . unwrap ( ) ;
1219+
1220+ let slice = array. slice ( 0 , 0 ) ;
1221+ assert_eq ! ( slice. len( ) , 0 ) ;
1222+
1223+ let values_slice = slice. values_slice ( ) ;
1224+ assert_eq ! ( values_slice. len( ) , 0 ) ;
1225+ assert_eq ! ( values_slice. data_type( ) , & DataType :: Utf8 ) ;
1226+ }
1227+
1228+ #[ test]
1229+ fn test_run_array_eq_empty ( ) {
1230+ let run_ends = Int32Array :: from ( vec ! [ 2 , 5 , 10 ] ) ;
1231+ let values = StringArray :: from ( vec ! [ "a" , "b" , "c" ] ) ;
1232+ let array = RunArray :: < Int32Type > :: try_new ( & run_ends, & values) . unwrap ( ) ;
1233+
1234+ let slice1 = array. slice ( 0 , 0 ) ;
1235+ let slice2 = array. slice ( 1 , 0 ) ;
1236+ let slice3 = array. slice ( 10 , 0 ) ;
1237+
1238+ assert_eq ! ( slice1, slice2) ;
1239+ assert_eq ! ( slice2, slice3) ;
1240+
1241+ let empty_array = new_empty_array ( array. data_type ( ) ) ;
1242+ let empty_array = crate :: cast:: as_run_array :: < Int32Type > ( empty_array. as_ref ( ) ) ;
1243+
1244+ assert_eq ! ( & slice1, empty_array) ;
1245+ }
1246+
1247+ #[ test]
1248+ fn test_run_array_eq_diff_physical_same_logical ( ) {
1249+ let run_ends1 = Int32Array :: from ( vec ! [ 1 , 3 , 6 ] ) ;
1250+ let values1 = StringArray :: from ( vec ! [ "a" , "b" , "c" ] ) ;
1251+ let array1 = RunArray :: < Int32Type > :: try_new ( & run_ends1, & values1) . unwrap ( ) ;
1252+
1253+ let run_ends2 = Int32Array :: from ( vec ! [ 1 , 2 , 3 , 4 , 5 , 6 ] ) ;
1254+ let values2 = StringArray :: from ( vec ! [ "a" , "b" , "b" , "c" , "c" , "c" ] ) ;
1255+ let array2 = RunArray :: < Int32Type > :: try_new ( & run_ends2, & values2) . unwrap ( ) ;
1256+
1257+ assert_eq ! ( array1, array2) ;
1258+ }
1259+
1260+ #[ test]
1261+ fn test_run_array_eq_sliced ( ) {
1262+ let run_ends1 = Int32Array :: from ( vec ! [ 2 , 5 , 10 ] ) ;
1263+ let values1 = StringArray :: from ( vec ! [ "a" , "b" , "c" ] ) ;
1264+ let array1 = RunArray :: < Int32Type > :: try_new ( & run_ends1, & values1) . unwrap ( ) ;
1265+ // Logical: a, a, b, b, b, c, c, c, c, c
1266+
1267+ let slice1 = array1. slice ( 1 , 6 ) ;
1268+ // Logical: a, b, b, b, c, c
1269+
1270+ let run_ends2 = Int32Array :: from ( vec ! [ 1 , 4 , 6 ] ) ;
1271+ let values2 = StringArray :: from ( vec ! [ "a" , "b" , "c" ] ) ;
1272+ let array2 = RunArray :: < Int32Type > :: try_new ( & run_ends2, & values2) . unwrap ( ) ;
1273+ // Logical: a, b, b, b, c, c
1274+
1275+ assert_eq ! ( slice1, array2) ;
1276+
1277+ let slice2 = array1. slice ( 2 , 3 ) ;
1278+ // Logical: b, b, b
1279+ let run_ends3 = Int32Array :: from ( vec ! [ 3 ] ) ;
1280+ let values3 = StringArray :: from ( vec ! [ "b" ] ) ;
1281+ let array3 = RunArray :: < Int32Type > :: try_new ( & run_ends3, & values3) . unwrap ( ) ;
1282+ assert_eq ! ( slice2, array3) ;
1283+ }
1284+
1285+ #[ test]
1286+ fn test_run_array_eq_sliced_different_offsets ( ) {
1287+ let run_ends1 = Int32Array :: from ( vec ! [ 2 , 5 , 10 ] ) ;
1288+ let values1 = StringArray :: from ( vec ! [ "a" , "b" , "c" ] ) ;
1289+ let array1 = RunArray :: < Int32Type > :: try_new ( & run_ends1, & values1) . unwrap ( ) ;
1290+
1291+ let slice1 = array1. slice ( 1 , 4 ) ; // a, b, b, b
1292+ let slice2 = array1. slice ( 1 , 4 ) ;
1293+ assert_eq ! ( slice1, slice2) ;
1294+
1295+ let slice3 = array1. slice ( 0 , 4 ) ; // a, a, b, b
1296+ assert_ne ! ( slice1, slice3) ;
1297+ }
11891298}
0 commit comments