@@ -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