@@ -2,7 +2,6 @@ use std::cmp;
22
33use arrow_buffer:: BooleanBuffer ;
44use itertools:: Itertools ;
5- use vortex_array:: array:: PrimitiveArray ;
65use vortex_array:: stats:: { ArrayStatistics as _, Stat , StatisticsVTable , StatsSet } ;
76use vortex_array:: validity:: { ArrayValidity as _, LogicalValidity } ;
87use vortex_array:: variants:: PrimitiveArrayTrait ;
@@ -46,27 +45,23 @@ impl RunEndArray {
4645 let ends = self . ends ( ) . into_primitive ( ) ?;
4746 let values = self . values ( ) . into_bool ( ) ?. boolean_buffer ( ) ;
4847
49- match_each_unsigned_integer_ptype ! ( ends. ptype( ) , |$P | self . typed_true_count:: <$P >( ends , values) )
48+ match_each_unsigned_integer_ptype ! ( ends. ptype( ) , |$P | self . typed_true_count( ends . as_slice :: <$P >( ) , values) )
5049 }
5150
52- fn typed_true_count < P : NativePType > (
51+ fn typed_true_count < P : NativePType + Into < u64 > > (
5352 & self ,
54- decompressed_ends : PrimitiveArray ,
53+ decompressed_ends : & [ P ] ,
5554 decompressed_values : BooleanBuffer ,
56- ) -> VortexResult < u64 >
57- where
58- u64 : From < P > ,
59- u64 : From < bool > ,
60- {
55+ ) -> VortexResult < u64 > {
6156 Ok ( match self . values ( ) . logical_validity ( ) {
6257 LogicalValidity :: AllValid ( _) => {
6358 let mut begin = u64:: try_from ( self . offset ( ) ) . vortex_expect ( "usize fits in u64" ) ;
6459 decompressed_ends
65- . as_slice :: < P > ( )
6660 . iter ( )
61+ . copied ( )
6762 . zip_eq ( & decompressed_values)
6863 . map ( |( end, bool_value) | {
69- let end = u64 :: from ( * end) ;
64+ let end: u64 = end. into ( ) ;
7065 let len = end - begin;
7166 begin = end;
7267 len * u64:: from ( bool_value)
@@ -81,29 +76,23 @@ impl RunEndArray {
8176 None => self . len ( ) as u64 ,
8277 Some ( valid_index) => {
8378 let mut true_count: u64 = 0 ;
84- let offsetted_begin = u64:: try_from ( self . offset ( ) )
85- . ok ( )
86- . vortex_expect ( "usize fits in u64" ) ;
87- let offsetted_len = u64:: try_from ( self . len ( ) + self . offset ( ) )
88- . ok ( )
89- . vortex_expect ( "usize fits in u64" ) ;
90- let decompressed_ends = decompressed_ends. as_slice :: < P > ( ) ;
79+ let offsetted_begin = self . offset ( ) as u64 ;
80+ let offsetted_len = ( self . len ( ) + self . offset ( ) ) as u64 ;
81+ let valid_end: u64 = decompressed_ends[ valid_index] . into ( ) ;
9182 let begin = if valid_index == 0 {
9283 offsetted_begin
9384 } else {
94- u64 :: from ( decompressed_ends [ valid_index - 1 ] )
85+ valid_end
9586 } ;
9687
97- let end =
98- cmp:: min ( u64:: from ( decompressed_ends[ valid_index] ) , offsetted_len) ;
99- true_count +=
100- u64:: from ( decompressed_values. value ( valid_index) ) * ( end - begin) ;
88+ let end = cmp:: min ( valid_end, offsetted_len) ;
89+ true_count += decompressed_values. value ( valid_index) as u64 * ( end - begin) ;
10190
10291 for valid_index in is_valid {
103- let end =
104- cmp:: min ( u64 :: from ( decompressed_ends [ valid_index ] ) , offsetted_len) ;
105- true_count += u64 :: from ( decompressed_values . value ( valid_index ) )
106- * ( end - u64:: from ( decompressed_ends [ valid_index - 1 ] ) ) ;
92+ let valid_end : u64 = decompressed_ends [ valid_index ] . into ( ) ;
93+ let end = cmp:: min ( valid_end , offsetted_len) ;
94+ true_count +=
95+ decompressed_values . value ( valid_index ) as u64 * ( end - valid_end ) ;
10796 }
10897
10998 true_count
@@ -116,46 +105,39 @@ impl RunEndArray {
116105 fn null_count ( & self ) -> VortexResult < u64 > {
117106 let ends = self . ends ( ) . into_primitive ( ) ?;
118107 let null_count = match self . values ( ) . logical_validity ( ) {
119- LogicalValidity :: AllValid ( _) => 0_u64 ,
108+ LogicalValidity :: AllValid ( _) => 0u64 ,
120109 LogicalValidity :: AllInvalid ( _) => self . len ( ) as u64 ,
121110 LogicalValidity :: Array ( is_valid) => {
122111 let is_valid = is_valid. into_bool ( ) ?. boolean_buffer ( ) ;
123- match_each_unsigned_integer_ptype ! ( ends. ptype( ) , |$P | self . null_count_with_array_validity:: <$P >( ends , is_valid) )
112+ match_each_unsigned_integer_ptype ! ( ends. ptype( ) , |$P | self . null_count_with_array_validity( ends . as_slice :: <$P >( ) , is_valid) )
124113 }
125114 } ;
126115 Ok ( null_count)
127116 }
128117
129- fn null_count_with_array_validity < P : NativePType > (
118+ fn null_count_with_array_validity < P : NativePType + Into < u64 > > (
130119 & self ,
131- decompressed_ends : PrimitiveArray ,
120+ decompressed_ends : & [ P ] ,
132121 is_valid : BooleanBuffer ,
133- ) -> u64
134- where
135- u64 : From < P > ,
136- u64 : TryFrom < usize > ,
137- {
122+ ) -> u64 {
138123 let mut is_valid = is_valid. set_indices ( ) ;
139124 match is_valid. next ( ) {
140- None => u64:: try_from ( self . len ( ) )
141- . ok ( )
142- . vortex_expect ( "usize fits in u64" ) ,
125+ None => self . len ( ) as u64 ,
143126 Some ( valid_index) => {
144127 let offsetted_len = ( self . len ( ) + self . offset ( ) ) as u64 ;
145128 let mut null_count: u64 = self . len ( ) as u64 ;
146- let decompressed_ends = decompressed_ends. as_slice :: < P > ( ) ;
147129 let begin = if valid_index == 0 {
148130 0
149131 } else {
150- u64 :: from ( decompressed_ends[ valid_index - 1 ] )
132+ decompressed_ends[ valid_index - 1 ] . into ( )
151133 } ;
152134
153- let end = cmp:: min ( u64 :: from ( decompressed_ends[ valid_index] ) , offsetted_len) ;
135+ let end = cmp:: min ( decompressed_ends[ valid_index] . into ( ) , offsetted_len) ;
154136 null_count -= end - begin;
155137
156138 for valid_index in is_valid {
157- let end = cmp:: min ( u64 :: from ( decompressed_ends[ valid_index] ) , offsetted_len) ;
158- null_count -= end - u64 :: from ( decompressed_ends[ valid_index - 1 ] ) ;
139+ let end = cmp:: min ( decompressed_ends[ valid_index] . into ( ) , offsetted_len) ;
140+ null_count -= end - decompressed_ends[ valid_index - 1 ] . into ( ) ;
159141 }
160142
161143 null_count
0 commit comments