@@ -85,7 +85,7 @@ pub struct GroupValuesPrimitive<T: ArrowPrimitiveType> {
85
85
///
86
86
/// We don't store the hashes as hashing fixed width primitives
87
87
/// is fast enough for this not to benefit performance
88
- map : HashTable < usize > ,
88
+ map : HashTable < ( usize , u64 ) > ,
89
89
/// The group index of the null value if any
90
90
null_group : Option < usize > ,
91
91
/// The values for each group index
@@ -127,15 +127,15 @@ where
127
127
let hash = key. hash ( state) ;
128
128
let insert = self . map . entry (
129
129
hash,
130
- |g | unsafe { self . values . get_unchecked ( * g) . is_eq ( key) } ,
131
- |g| unsafe { self . values . get_unchecked ( * g ) . hash ( state ) } ,
130
+ |& ( g , _ ) | unsafe { self . values . get_unchecked ( g) . is_eq ( key) } ,
131
+ |& ( _ , h ) | h ,
132
132
) ;
133
133
134
134
match insert {
135
- hashbrown:: hash_table:: Entry :: Occupied ( o) => * o. get ( ) ,
135
+ hashbrown:: hash_table:: Entry :: Occupied ( o) => o. get ( ) . 0 ,
136
136
hashbrown:: hash_table:: Entry :: Vacant ( v) => {
137
137
let g = self . values . len ( ) ;
138
- v. insert ( g ) ;
138
+ v. insert ( ( g , hash ) ) ;
139
139
self . values . push ( key) ;
140
140
g
141
141
}
@@ -181,12 +181,13 @@ where
181
181
build_primitive ( std:: mem:: take ( & mut self . values ) , self . null_group . take ( ) )
182
182
}
183
183
EmitTo :: First ( n) => {
184
- self . map . retain ( |group_idx | {
184
+ self . map . retain ( |entry | {
185
185
// Decrement group index by n
186
+ let group_idx = entry. 0 ;
186
187
match group_idx. checked_sub ( n) {
187
188
// Group index was >= n, shift value down
188
189
Some ( sub) => {
189
- * group_idx = sub;
190
+ entry . 0 = sub;
190
191
true
191
192
}
192
193
// Group index was < n, so remove from table
0 commit comments