1818use crate :: cast:: * ;
1919use arrow_array:: cast:: AsArray ;
2020use arrow_array:: types:: {
21- ArrowDictionaryKeyType , ArrowPrimitiveType , Date32Type , Date64Type , Decimal128Type ,
22- Decimal256Type , DurationMicrosecondType , DurationMillisecondType , DurationNanosecondType ,
23- DurationSecondType , Float16Type , Float32Type , Float64Type , Int8Type , Int16Type , Int32Type ,
24- Int64Type , IntervalDayTimeType , IntervalMonthDayNanoType , IntervalYearMonthType ,
25- Time32MillisecondType , Time32SecondType , Time64MicrosecondType , Time64NanosecondType ,
26- TimestampMicrosecondType , TimestampMillisecondType , TimestampNanosecondType ,
27- TimestampSecondType , UInt8Type , UInt16Type , UInt32Type , UInt64Type ,
21+ ArrowDictionaryKeyType , ArrowPrimitiveType , Int8Type , Int16Type , Int32Type , Int64Type ,
22+ UInt8Type , UInt16Type , UInt32Type , UInt64Type ,
2823} ;
2924use arrow_array:: {
30- Array , ArrayRef , BinaryViewArray , BooleanArray , DictionaryArray , FixedSizeBinaryArray ,
31- GenericBinaryArray , GenericStringArray , PrimitiveArray , StringViewArray ,
25+ Array , ArrayRef , BooleanArray , DictionaryArray , FixedSizeBinaryArray , GenericBinaryArray ,
26+ GenericStringArray , OffsetSizeTrait , PrimitiveArray , downcast_primitive_array ,
3227} ;
3328
3429/// Attempts to cast a `RunArray` with index type K into
@@ -182,75 +177,17 @@ fn compute_run_boundaries(array: &ArrayRef) -> (Vec<usize>, Vec<usize>) {
182177 return ( Vec :: new ( ) , Vec :: new ( ) ) ;
183178 }
184179
185- use arrow_schema:: { DataType :: * , IntervalUnit , TimeUnit } ;
180+ use arrow_schema:: DataType :: * ;
186181
187- match array. data_type ( ) {
182+ let array = array. as_ref ( ) ;
183+ downcast_primitive_array ! {
184+ array => runs_for_primitive( array) ,
188185 Null => ( vec![ array. len( ) ] , vec![ 0 ] ) ,
189186 Boolean => runs_for_boolean( array. as_boolean( ) ) ,
190- Int8 => runs_for_primitive ( array. as_primitive :: < Int8Type > ( ) ) ,
191- Int16 => runs_for_primitive ( array. as_primitive :: < Int16Type > ( ) ) ,
192- Int32 => runs_for_primitive ( array. as_primitive :: < Int32Type > ( ) ) ,
193- Int64 => runs_for_primitive ( array. as_primitive :: < Int64Type > ( ) ) ,
194- UInt8 => runs_for_primitive ( array. as_primitive :: < UInt8Type > ( ) ) ,
195- UInt16 => runs_for_primitive ( array. as_primitive :: < UInt16Type > ( ) ) ,
196- UInt32 => runs_for_primitive ( array. as_primitive :: < UInt32Type > ( ) ) ,
197- UInt64 => runs_for_primitive ( array. as_primitive :: < UInt64Type > ( ) ) ,
198- Float16 => runs_for_primitive ( array. as_primitive :: < Float16Type > ( ) ) ,
199- Float32 => runs_for_primitive ( array. as_primitive :: < Float32Type > ( ) ) ,
200- Float64 => runs_for_primitive ( array. as_primitive :: < Float64Type > ( ) ) ,
201- Date32 => runs_for_primitive ( array. as_primitive :: < Date32Type > ( ) ) ,
202- Date64 => runs_for_primitive ( array. as_primitive :: < Date64Type > ( ) ) ,
203- Time32 ( TimeUnit :: Second ) => runs_for_primitive ( array. as_primitive :: < Time32SecondType > ( ) ) ,
204- Time32 ( TimeUnit :: Millisecond ) => {
205- runs_for_primitive ( array. as_primitive :: < Time32MillisecondType > ( ) )
206- }
207- Time64 ( TimeUnit :: Microsecond ) => {
208- runs_for_primitive ( array. as_primitive :: < Time64MicrosecondType > ( ) )
209- }
210- Time64 ( TimeUnit :: Nanosecond ) => {
211- runs_for_primitive ( array. as_primitive :: < Time64NanosecondType > ( ) )
212- }
213- Duration ( TimeUnit :: Second ) => {
214- runs_for_primitive ( array. as_primitive :: < DurationSecondType > ( ) )
215- }
216- Duration ( TimeUnit :: Millisecond ) => {
217- runs_for_primitive ( array. as_primitive :: < DurationMillisecondType > ( ) )
218- }
219- Duration ( TimeUnit :: Microsecond ) => {
220- runs_for_primitive ( array. as_primitive :: < DurationMicrosecondType > ( ) )
221- }
222- Duration ( TimeUnit :: Nanosecond ) => {
223- runs_for_primitive ( array. as_primitive :: < DurationNanosecondType > ( ) )
224- }
225- Timestamp ( TimeUnit :: Second , _) => {
226- runs_for_primitive ( array. as_primitive :: < TimestampSecondType > ( ) )
227- }
228- Timestamp ( TimeUnit :: Millisecond , _) => {
229- runs_for_primitive ( array. as_primitive :: < TimestampMillisecondType > ( ) )
230- }
231- Timestamp ( TimeUnit :: Microsecond , _) => {
232- runs_for_primitive ( array. as_primitive :: < TimestampMicrosecondType > ( ) )
233- }
234- Timestamp ( TimeUnit :: Nanosecond , _) => {
235- runs_for_primitive ( array. as_primitive :: < TimestampNanosecondType > ( ) )
236- }
237- Interval ( IntervalUnit :: YearMonth ) => {
238- runs_for_primitive ( array. as_primitive :: < IntervalYearMonthType > ( ) )
239- }
240- Interval ( IntervalUnit :: DayTime ) => {
241- runs_for_primitive ( array. as_primitive :: < IntervalDayTimeType > ( ) )
242- }
243- Interval ( IntervalUnit :: MonthDayNano ) => {
244- runs_for_primitive ( array. as_primitive :: < IntervalMonthDayNanoType > ( ) )
245- }
246- Decimal128 ( _, _) => runs_for_primitive ( array. as_primitive :: < Decimal128Type > ( ) ) ,
247- Decimal256 ( _, _) => runs_for_primitive ( array. as_primitive :: < Decimal256Type > ( ) ) ,
248- Utf8 => runs_for_string_i32 ( array. as_string :: < i32 > ( ) ) ,
249- LargeUtf8 => runs_for_string_i64 ( array. as_string :: < i64 > ( ) ) ,
250- Utf8View => runs_for_string_view ( array. as_string_view ( ) ) ,
251- Binary => runs_for_binary_i32 ( array. as_binary :: < i32 > ( ) ) ,
252- LargeBinary => runs_for_binary_i64 ( array. as_binary :: < i64 > ( ) ) ,
253- BinaryView => runs_for_binary_view ( array. as_binary_view ( ) ) ,
187+ Utf8 => runs_for_string( array. as_string:: <i32 >( ) ) ,
188+ LargeUtf8 => runs_for_string( array. as_string:: <i64 >( ) ) ,
189+ Binary => runs_for_binary( array. as_binary:: <i32 >( ) ) ,
190+ LargeBinary => runs_for_binary( array. as_binary:: <i64 >( ) ) ,
254191 FixedSizeBinary ( _) => runs_for_fixed_size_binary( array. as_fixed_size_binary( ) ) ,
255192 Dictionary ( key_type, _) => match key_type. as_ref( ) {
256193 Int8 => runs_for_dictionary:: <Int8Type >( array. as_dictionary( ) ) ,
@@ -261,9 +198,9 @@ fn compute_run_boundaries(array: &ArrayRef) -> (Vec<usize>, Vec<usize>) {
261198 UInt16 => runs_for_dictionary:: <UInt16Type >( array. as_dictionary( ) ) ,
262199 UInt32 => runs_for_dictionary:: <UInt32Type >( array. as_dictionary( ) ) ,
263200 UInt64 => runs_for_dictionary:: <UInt64Type >( array. as_dictionary( ) ) ,
264- _ => runs_generic ( array. as_ref ( ) ) ,
201+ _ => runs_generic( array) ,
265202 } ,
266- _ => runs_generic ( array. as_ref ( ) ) ,
203+ _ => runs_generic( array) ,
267204 }
268205}
269206
@@ -361,20 +298,8 @@ fn runs_for_primitive<T: ArrowPrimitiveType>(
361298 finalize_runs ( run_boundaries, len)
362299}
363300
364- fn runs_for_binary_i32 ( array : & GenericBinaryArray < i32 > ) -> ( Vec < usize > , Vec < usize > ) {
365- let mut to_usize = |v : i32 | v as usize ;
366- runs_for_binary_like (
367- array. len ( ) ,
368- array. null_count ( ) ,
369- array. value_offsets ( ) ,
370- array. value_data ( ) ,
371- |idx| array. is_valid ( idx) ,
372- & mut to_usize,
373- )
374- }
375-
376- fn runs_for_binary_i64 ( array : & GenericBinaryArray < i64 > ) -> ( Vec < usize > , Vec < usize > ) {
377- let mut to_usize = |v : i64 | v as usize ;
301+ fn runs_for_binary < O : OffsetSizeTrait > ( array : & GenericBinaryArray < O > ) -> ( Vec < usize > , Vec < usize > ) {
302+ let mut to_usize = |v : O | v. as_usize ( ) ;
378303 runs_for_binary_like (
379304 array. len ( ) ,
380305 array. null_count ( ) ,
@@ -449,8 +374,8 @@ fn runs_for_binary_like<T: Copy>(
449374 finalize_runs ( run_boundaries, len)
450375}
451376
452- fn runs_for_string_i32 ( array : & GenericStringArray < i32 > ) -> ( Vec < usize > , Vec < usize > ) {
453- let mut to_usize = |v : i32 | v as usize ;
377+ fn runs_for_string < O : OffsetSizeTrait > ( array : & GenericStringArray < O > ) -> ( Vec < usize > , Vec < usize > ) {
378+ let mut to_usize = |v : O | v. as_usize ( ) ;
454379 runs_for_binary_like (
455380 array. len ( ) ,
456381 array. null_count ( ) ,
@@ -461,26 +386,6 @@ fn runs_for_string_i32(array: &GenericStringArray<i32>) -> (Vec<usize>, Vec<usiz
461386 )
462387}
463388
464- fn runs_for_string_i64 ( array : & GenericStringArray < i64 > ) -> ( Vec < usize > , Vec < usize > ) {
465- let mut to_usize = |v : i64 | v as usize ;
466- runs_for_binary_like (
467- array. len ( ) ,
468- array. null_count ( ) ,
469- array. value_offsets ( ) ,
470- array. value_data ( ) ,
471- |idx| array. is_valid ( idx) ,
472- & mut to_usize,
473- )
474- }
475-
476- fn runs_for_string_view ( array : & StringViewArray ) -> ( Vec < usize > , Vec < usize > ) {
477- runs_generic ( array)
478- }
479-
480- fn runs_for_binary_view ( array : & BinaryViewArray ) -> ( Vec < usize > , Vec < usize > ) {
481- runs_generic ( array)
482- }
483-
484389fn runs_for_fixed_size_binary ( array : & FixedSizeBinaryArray ) -> ( Vec < usize > , Vec < usize > ) {
485390 let len = array. len ( ) ;
486391 if let Some ( runs) = trivial_runs ( len) {
0 commit comments