@@ -28,7 +28,7 @@ use crate::util::bit_util::num_required_bits;
2828use  crate :: util:: interner:: { Interner ,  Storage } ; 
2929use  arrow_array:: { 
3030    Array ,  ArrayAccessor ,  BinaryArray ,  BinaryViewArray ,  DictionaryArray ,  FixedSizeBinaryArray , 
31-     LargeBinaryArray ,  LargeStringArray ,  StringArray ,  StringViewArray , 
31+     LargeBinaryArray ,  LargeStringArray ,  RunArray ,   StringArray ,  StringViewArray , 
3232} ; 
3333use  arrow_schema:: DataType ; 
3434
@@ -59,6 +59,28 @@ macro_rules! downcast_dict_op {
5959    } ; 
6060} 
6161
62+ macro_rules!  downcast_ree_impl { 
63+     ( $array: ident,  $key: ident,  $val: ident,  $op: expr $( ,  $arg: expr) * )  => { { 
64+         $op( $array
65+             . as_any( ) 
66+             . downcast_ref:: <RunArray <arrow_array:: types:: $key>>( ) 
67+             . unwrap( ) 
68+             . downcast:: <$val>( ) 
69+             . unwrap( ) $( ,  $arg) * ) 
70+     } } ; 
71+ } 
72+ 
73+ macro_rules!  downcast_ree_op { 
74+     ( $run_end_field: expr,  $val: ident,  $array: ident,  $op: expr $( ,  $arg: expr) * )  => { 
75+         match  $run_end_field. data_type( )  { 
76+             DataType :: Int16  => downcast_ree_impl!( $array,  Int16Type ,  $val,  $op$( ,  $arg) * ) , 
77+             DataType :: Int32  => downcast_ree_impl!( $array,  Int32Type ,  $val,  $op$( ,  $arg) * ) , 
78+             DataType :: Int64  => downcast_ree_impl!( $array,  Int64Type ,  $val,  $op$( ,  $arg) * ) , 
79+             _ => unreachable!( ) , 
80+         } 
81+     } ; 
82+ } 
83+ 
6284macro_rules!  downcast_op { 
6385    ( $data_type: expr,  $array: ident,  $op: expr $( ,  $arg: expr) * )  => { 
6486        match  $data_type { 
@@ -90,6 +112,20 @@ macro_rules! downcast_op {
90112                } 
91113                d => unreachable!( "cannot downcast {} dictionary value to byte array" ,  d) , 
92114            } , 
115+             DataType :: RunEndEncoded ( run_end,  value)  => match  value. data_type( )  { 
116+                 DataType :: Utf8  => downcast_ree_op!( run_end,  StringArray ,  $array,  $op$( ,  $arg) * ) , 
117+                 DataType :: LargeUtf8  => { 
118+                     downcast_ree_op!( run_end,  LargeStringArray ,  $array,  $op$( ,  $arg) * ) 
119+                 } 
120+                 DataType :: Binary  => downcast_ree_op!( run_end,  BinaryArray ,  $array,  $op$( ,  $arg) * ) , 
121+                 DataType :: LargeBinary  => { 
122+                     downcast_ree_op!( run_end,  LargeBinaryArray ,  $array,  $op$( ,  $arg) * ) 
123+                 } 
124+                 DataType :: FixedSizeBinary ( _)  => { 
125+                     downcast_ree_op!( run_end,  FixedSizeBinaryArray ,  $array,  $op$( ,  $arg) * ) 
126+                 } 
127+                 d => unreachable!( "cannot downcast {} run end encoded value to byte array" ,  d) , 
128+             } , 
93129            d => unreachable!( "cannot downcast {} to byte array" ,  d) , 
94130        } 
95131    } ; 
0 commit comments