1515use std:: fmt:: Debug ;
1616
1717use super :: payload_row:: CompareState ;
18- use super :: CompareItem ;
1918use super :: PartitionedPayload ;
2019use super :: ProbeState ;
2120use super :: RowPtr ;
@@ -164,14 +163,9 @@ impl HashIndex {
164163 row_count : usize ,
165164 mut adapter : impl TableAdapter ,
166165 ) -> usize {
167- for ( i, item) in state. no_match_vector [ ..row_count] . iter_mut ( ) . enumerate ( ) {
168- let hash = state. group_hashes [ i] ;
169- * item = CompareItem {
170- row : i. into ( ) ,
171- salt : Entry :: hash_to_salt ( hash) ,
172- slot : self . init_slot ( hash) ,
173- row_ptr : RowPtr :: null ( ) ,
174- } ;
166+ for ( i, row) in state. no_match_vector [ ..row_count] . iter_mut ( ) . enumerate ( ) {
167+ * row = i. into ( ) ;
168+ state. slots [ i] = self . init_slot ( state. group_hashes [ i] ) ;
175169 }
176170
177171 let mut new_group_count = 0 ;
@@ -183,21 +177,18 @@ impl HashIndex {
183177 let mut no_match_count = 0 ;
184178
185179 // 1. inject new_group_count, new_entry_count, need_compare_count, no_match_count
186- for item in state. no_match_vector [ ..remaining_entries] . iter_mut ( ) {
187- let ( slot, is_new) = self . find_or_insert ( item. slot , item. salt ) ;
188- item. slot = slot;
180+ for row in state. no_match_vector [ ..remaining_entries] . iter ( ) . copied ( ) {
181+ let slot = & mut state. slots [ row] ;
182+ let is_new;
183+
184+ let salt = Entry :: hash_to_salt ( state. group_hashes [ row] ) ;
185+ ( * slot, is_new) = self . find_or_insert ( * slot, salt) ;
189186
190187 if is_new {
191- state. empty_vector [ new_entry_count] = item. row ;
192- state. slots [ new_entry_count] = slot;
188+ state. empty_vector [ new_entry_count] = row;
193189 new_entry_count += 1 ;
194190 } else {
195- state. group_compare_vector [ need_compare_count] = CompareItem {
196- row : item. row ,
197- slot : item. slot ,
198- salt : item. salt ,
199- row_ptr : self . mut_entry ( slot) . get_pointer ( ) ,
200- } ;
191+ state. group_compare_vector [ need_compare_count] = row;
201192 need_compare_count += 1 ;
202193 }
203194 }
@@ -208,40 +199,36 @@ impl HashIndex {
208199
209200 adapter. append_rows ( state, new_entry_count) ;
210201
211- for ( i, row) in state. empty_vector [ ..new_entry_count]
212- . iter ( )
213- . copied ( )
214- . enumerate ( )
215- {
216- let entry = self . mut_entry ( state. slots [ i] ) ;
202+ for row in state. empty_vector [ ..new_entry_count] . iter ( ) . copied ( ) {
203+ let entry = self . mut_entry ( state. slots [ row] ) ;
217204 entry. set_pointer ( state. addresses [ row] ) ;
218205 debug_assert_eq ! ( entry. get_pointer( ) , state. addresses[ row] ) ;
219206 }
220207 }
221208
222209 // 3. set address of compare vector
223210 if need_compare_count > 0 {
224- for item in & mut state. group_compare_vector [ ..need_compare_count] {
225- let entry = self . mut_entry ( item. slot ) ;
211+ for row in state. group_compare_vector [ ..need_compare_count]
212+ . iter ( )
213+ . copied ( )
214+ {
215+ let entry = self . mut_entry ( state. slots [ row] ) ;
226216
227217 debug_assert ! ( entry. is_occupied( ) ) ;
228- debug_assert_eq ! (
229- entry. get_salt( ) ,
230- ( state. group_hashes[ item. row] >> 48 ) as u16
231- ) ;
232- item. row_ptr = entry. get_pointer ( ) ;
233- state. addresses [ item. row ] = item. row_ptr ;
218+ debug_assert_eq ! ( entry. get_salt( ) , ( state. group_hashes[ row] >> 48 ) as u16 ) ;
219+ state. addresses [ row] = entry. get_pointer ( ) ;
234220 }
235221
236222 // 4. compare
237223 no_match_count = adapter. compare ( state, need_compare_count, no_match_count) ;
238224 }
239225
240226 // 5. Linear probing, just increase iter_times
241- for item in & mut state. no_match_vector [ ..no_match_count] {
242- item. slot += 1 ;
243- if item. slot >= self . capacity {
244- item. slot = 0 ;
227+ for row in state. no_match_vector [ ..no_match_count] . iter ( ) . copied ( ) {
228+ let slot = & mut state. slots [ row] ;
229+ * slot += 1 ;
230+ if * slot >= self . capacity {
231+ * slot = 0 ;
245232 }
246233 }
247234 remaining_entries = no_match_count;
@@ -269,7 +256,9 @@ impl<'a> TableAdapter for AdapterImpl<'a> {
269256 need_compare_count : usize ,
270257 no_match_count : usize ,
271258 ) -> usize {
259+ // todo: compare hash first if NECESSARY
272260 CompareState {
261+ address : & state. addresses ,
273262 compare : & mut state. group_compare_vector ,
274263 matched : & mut state. match_vector ,
275264 no_matched : & mut state. no_match_vector ,
@@ -349,12 +338,11 @@ mod tests {
349338 impl TableAdapter for & mut TestTableAdapter {
350339 fn append_rows ( & mut self , state : & mut ProbeState , new_entry_count : usize ) {
351340 for row in state. empty_vector [ ..new_entry_count] . iter ( ) {
352- let row_index = row. to_index ( ) ;
353- let ( key, hash) = self . incoming [ row_index] ;
341+ let ( key, hash) = self . incoming [ * row] ;
354342 let value = key + 20 ;
355343
356344 self . payload . push ( ( key, hash, value) ) ;
357- state. addresses [ * row] = self . get_row_ptr ( true , row_index ) ;
345+ state. addresses [ * row] = self . get_row_ptr ( true , row . to_usize ( ) ) ;
358346 }
359347 }
360348
@@ -364,18 +352,21 @@ mod tests {
364352 need_compare_count : usize ,
365353 mut no_match_count : usize ,
366354 ) -> usize {
367- for item in & state. group_compare_vector [ ..need_compare_count] {
368- let incoming = self . incoming [ item. row . to_index ( ) ] ;
355+ for row in state. group_compare_vector [ ..need_compare_count]
356+ . iter ( )
357+ . copied ( )
358+ {
359+ let incoming = self . incoming [ row] ;
369360
370- let ( key, hash, _) = self . get_payload ( item . row_ptr ) ;
361+ let ( key, hash, _) = self . get_payload ( state . addresses [ row ] ) ;
371362
372363 const POINTER_MASK : u64 = 0x0000FFFFFFFFFFFF ;
373364 assert_eq ! ( incoming. 1 | POINTER_MASK , hash | POINTER_MASK ) ;
374365 if incoming. 0 == key {
375366 continue ;
376367 }
377368
378- state. no_match_vector [ no_match_count] = item . clone ( ) ;
369+ state. no_match_vector [ no_match_count] = row ;
379370 no_match_count += 1 ;
380371 }
381372
0 commit comments