@@ -139,10 +139,14 @@ impl NullState {
139
139
// no nulls, no filter,
140
140
( false , None ) => {
141
141
let iter = group_indices. iter ( ) . zip ( data. iter ( ) ) ;
142
+
142
143
for ( & group_index, & new_value) in iter {
143
- seen_values. set_bit ( group_index, true ) ;
144
144
value_fn ( group_index, new_value) ;
145
145
}
146
+ // update seen values in separate loop
147
+ for & group_index in group_indices. iter ( ) {
148
+ seen_values. set_bit ( group_index, true ) ;
149
+ }
146
150
}
147
151
// nulls, no filter
148
152
( true , None ) => {
@@ -157,6 +161,7 @@ impl NullState {
157
161
let data_remainder = data_chunks. remainder ( ) ;
158
162
159
163
group_indices_chunks
164
+ . clone ( )
160
165
. zip ( data_chunks)
161
166
. zip ( bit_chunks. iter ( ) )
162
167
. for_each ( |( ( group_index_chunk, data_chunk) , mask) | {
@@ -167,14 +172,28 @@ impl NullState {
167
172
// valid bit was set, real value
168
173
let is_valid = ( mask & index_mask) != 0 ;
169
174
if is_valid {
170
- seen_values. set_bit ( group_index, true ) ;
171
175
value_fn ( group_index, new_value) ;
172
176
}
173
177
index_mask <<= 1 ;
174
178
} ,
175
179
)
176
180
} ) ;
177
181
182
+ group_indices_chunks. zip ( bit_chunks. iter ( ) ) . for_each (
183
+ |( group_index_chunk, mask) | {
184
+ // index_mask has value 1 << i in the loop
185
+ let mut index_mask = 1 ;
186
+ group_index_chunk. iter ( ) . for_each ( |& group_index| {
187
+ // valid bit was set, real value
188
+ let is_valid = ( mask & index_mask) != 0 ;
189
+ if is_valid {
190
+ seen_values. set_bit ( group_index, true ) ;
191
+ }
192
+ index_mask <<= 1 ;
193
+ } )
194
+ } ,
195
+ ) ;
196
+
178
197
// handle any remaining bits (after the initial 64)
179
198
let remainder_bits = bit_chunks. remainder_bits ( ) ;
180
199
group_indices_remainder
@@ -184,10 +203,17 @@ impl NullState {
184
203
. for_each ( |( i, ( & group_index, & new_value) ) | {
185
204
let is_valid = remainder_bits & ( 1 << i) != 0 ;
186
205
if is_valid {
187
- seen_values. set_bit ( group_index, true ) ;
188
206
value_fn ( group_index, new_value) ;
189
207
}
190
208
} ) ;
209
+ group_indices_remainder. iter ( ) . enumerate ( ) . for_each (
210
+ |( i, & group_index) | {
211
+ let is_valid = remainder_bits & ( 1 << i) != 0 ;
212
+ if is_valid {
213
+ seen_values. set_bit ( group_index, true ) ;
214
+ }
215
+ } ,
216
+ ) ;
191
217
}
192
218
// no nulls, but a filter
193
219
( false , Some ( filter) ) => {
@@ -201,10 +227,17 @@ impl NullState {
201
227
. zip ( filter. iter ( ) )
202
228
. for_each ( |( ( & group_index, & new_value) , filter_value) | {
203
229
if let Some ( true ) = filter_value {
204
- seen_values. set_bit ( group_index, true ) ;
205
230
value_fn ( group_index, new_value) ;
206
231
}
207
- } )
232
+ } ) ;
233
+
234
+ group_indices. iter ( ) . zip ( filter. iter ( ) ) . for_each (
235
+ |( & group_index, filter_value) | {
236
+ if let Some ( true ) = filter_value {
237
+ seen_values. set_bit ( group_index, true ) ;
238
+ }
239
+ } ,
240
+ )
208
241
}
209
242
// both null values and filters
210
243
( true , Some ( filter) ) => {
0 commit comments