99
1010use std:: ops:: Range ;
1111
12- use itertools:: Either ;
1312use vortex_array:: ArrayRef ;
1413use vortex_array:: ExecutionCtx ;
1514use vortex_array:: IntoArray ;
@@ -31,7 +30,6 @@ use vortex_array::validity::Validity;
3130use vortex_buffer:: BitBuffer ;
3231use vortex_buffer:: BitBufferMut ;
3332use vortex_error:: VortexResult ;
34- use vortex_mask:: AllOr ;
3533use vortex_mask:: Mask ;
3634
3735use super :: RunEndInputs ;
@@ -40,8 +38,9 @@ use super::empty_partial;
4038use super :: runs:: add_float_run;
4139use super :: runs:: add_signed_run;
4240use super :: runs:: add_unsigned_run;
43- use super :: runs:: sum_next_range;
44- use super :: runs:: sum_range;
41+ use super :: runs:: sum_all_valid;
42+ use super :: runs:: sum_next_valid_range;
43+ use super :: runs:: sum_valid_range;
4544use crate :: RunEnd ;
4645
4746impl DynGroupedAggregateKernel for RunEndSumKernel {
@@ -78,21 +77,20 @@ impl DynGroupedAggregateKernel for RunEndSumKernel {
7877 } ;
7978
8079 let ranges = groups. group_ranges ( ctx) ?;
81- let valid_runs = runs. validity . indices ( ) ;
8280
8381 let ( results, empty_groups) = match_each_unsigned_integer_ptype ! ( runs. ends. ptype( ) , |E | {
8482 let ends = runs. ends. as_slice:: <E >( ) ;
8583 match_each_native_ptype!( runs. values. ptype( ) ,
8684 unsigned: |T | {
87- sum_groups( ends, runs. values. as_slice:: <T >( ) , valid_runs , & ranges,
85+ sum_groups( ends, runs. values. as_slice:: <T >( ) , & runs . validity , & ranges,
8886 & validity, runs. offset, add_unsigned_run)
8987 } ,
9088 signed: |T | {
91- sum_groups( ends, runs. values. as_slice:: <T >( ) , valid_runs , & ranges,
89+ sum_groups( ends, runs. values. as_slice:: <T >( ) , & runs . validity , & ranges,
9290 & validity, runs. offset, add_signed_run)
9391 } ,
9492 floating: |T | {
95- sum_groups( ends, runs. values. as_slice:: <T >( ) , valid_runs , & ranges,
93+ sum_groups( ends, runs. values. as_slice:: <T >( ) , & runs . validity , & ranges,
9694 & validity, runs. offset,
9795 |sum, value, len| add_float_run( sum, value, len, options. skip_nans) )
9896 }
@@ -116,30 +114,38 @@ impl DynGroupedAggregateKernel for RunEndSumKernel {
116114fn sum_groups < E : IntegerPType , T : NativePType , A : NativePType > (
117115 ends : & [ E ] ,
118116 values : & [ T ] ,
119- validity : AllOr < & [ usize ] > ,
117+ validity : & Mask ,
120118 ranges : & GroupRanges ,
121119 group_validity : & Mask ,
122120 offset : usize ,
123121 add_run : impl Fn ( A , T , usize ) -> Option < A > ,
124122) -> ( PrimitiveArray , BitBuffer ) {
125- match ranges {
126- // Consecutive groups reuse the cursor, including a run split across group boundaries.
127- GroupRanges :: FixedSizeList { .. } => {
128- let indices = match validity {
129- AllOr :: All => Either :: Left ( 0 ..ends. len ( ) ) ,
130- AllOr :: None => Either :: Left ( 0 ..0 ) ,
131- AllOr :: Some ( indices) => Either :: Right ( indices. iter ( ) . copied ( ) ) ,
132- } ;
133- let mut indices = indices. peekable ( ) ;
134-
123+ match ( validity, ranges) {
124+ ( Mask :: AllTrue ( _) , GroupRanges :: FixedSizeList { .. } ) => {
125+ let mut cursor = 0 ;
126+ collect_group_sums ( ranges, group_validity, offset, |range| {
127+ sum_all_valid ( ends, values, & mut cursor, range, & add_run)
128+ } )
129+ }
130+ ( Mask :: AllTrue ( _) , GroupRanges :: ListView { .. } ) => {
131+ collect_group_sums ( ranges, group_validity, offset, |range| {
132+ let mut cursor = ends. partition_point ( |end| end. as_ ( ) <= range. start ) ;
133+ sum_all_valid ( ends, values, & mut cursor, range, & add_run)
134+ } )
135+ }
136+ ( Mask :: AllFalse ( _) , _) => collect_group_sums ( ranges, group_validity, offset, |_| {
137+ ( Some ( A :: default ( ) ) , true )
138+ } ) ,
139+ ( Mask :: Values ( validity) , GroupRanges :: FixedSizeList { .. } ) => {
140+ let mut indices = validity. indices ( ) . iter ( ) . copied ( ) . peekable ( ) ;
135141 collect_group_sums ( ranges, group_validity, offset, |range| {
136- sum_next_range ( ends, values, & mut indices, range, & add_run)
142+ sum_next_valid_range ( ends, values, & mut indices, range, & add_run)
137143 } )
138144 }
139- // These ranges can overlap or go backwards, so each group seeks independently.
140- GroupRanges :: ListView { .. } => {
145+ ( Mask :: Values ( validity ) , GroupRanges :: ListView { .. } ) => {
146+ let indices = validity . indices ( ) ;
141147 collect_group_sums ( ranges, group_validity, offset, |range| {
142- sum_range ( ends, values, & validity , range, & add_run)
148+ sum_valid_range ( ends, values, indices , range, & add_run)
143149 } )
144150 }
145151 }
0 commit comments