37
37
import java .util .Arrays ;
38
38
import java .util .Collections ;
39
39
40
+ import static org .apache .paimon .index .PartitionIndex .getMaxBucketsPerAssigner ;
41
+ import static org .apache .paimon .index .PartitionIndex .getSpecifiedMaxBuckets ;
40
42
import static org .apache .paimon .io .DataFileTestUtils .row ;
41
43
import static org .assertj .core .api .Assertions .assertThat ;
42
44
import static org .assertj .core .api .Assertions .assertThatThrownBy ;
@@ -136,7 +138,7 @@ public void testAssignWithUpperBound() {
136
138
assertThatThrownBy (() -> assigner .assign (row (1 ), 1 ))
137
139
.hasMessageContaining ("This is a bug, record assign id" );
138
140
139
- // exceed upper bound
141
+ // exceed buckets upper bound
140
142
// partition 1
141
143
int hash = 18 ;
142
144
for (int i = 0 ; i < 200 ; i ++) {
@@ -151,7 +153,78 @@ public void testAssignWithUpperBound() {
151
153
}
152
154
}
153
155
154
- @ ParameterizedTest (name = "maxBucket: {0}" )
156
+ @ Test
157
+ public void testMultiAssigners () {
158
+ int [] maxBucketsArr = getMaxBucketsPerAssigner (4 , 2 );
159
+ Assertions .assertThat (maxBucketsArr ).isEqualTo (new int [] {2 , 2 });
160
+
161
+ maxBucketsArr = getMaxBucketsPerAssigner (8 , 3 );
162
+ Assertions .assertThat (maxBucketsArr ).isEqualTo (new int [] {3 , 3 , 2 });
163
+
164
+ maxBucketsArr = getMaxBucketsPerAssigner (3 , 2 );
165
+ Assertions .assertThat (maxBucketsArr ).isEqualTo (new int [] {2 , 1 });
166
+
167
+ Assertions .assertThat (getSpecifiedMaxBuckets (maxBucketsArr , 0 )).isEqualTo (2 );
168
+ Assertions .assertThat (getSpecifiedMaxBuckets (maxBucketsArr , 1 )).isEqualTo (1 );
169
+ Assertions .assertThat (getSpecifiedMaxBuckets (maxBucketsArr , 2 )).isEqualTo (0 );
170
+
171
+ maxBucketsArr = getMaxBucketsPerAssigner (-1 , 2 );
172
+ Assertions .assertThat (maxBucketsArr ).isEqualTo (new int [] {-1 , -1 });
173
+
174
+ Assertions .assertThat (getSpecifiedMaxBuckets (maxBucketsArr , 0 )).isEqualTo (-1 );
175
+ Assertions .assertThat (getSpecifiedMaxBuckets (maxBucketsArr , 1 )).isEqualTo (-1 );
176
+ Assertions .assertThat (getSpecifiedMaxBuckets (maxBucketsArr , 2 )).isEqualTo (-1 );
177
+
178
+ assertThatThrownBy (() -> getMaxBucketsPerAssigner (-10 , 2 ))
179
+ .hasMessageContaining (
180
+ "Max-buckets should either be equal to -1 (unlimited), or it must be greater than 0 (fixed upper bound)." );
181
+ }
182
+
183
+ @ Test
184
+ public void testAssignWithUpperBoundMultiAssigners () {
185
+ int [] maxBucketsArr = getMaxBucketsPerAssigner (3 , 2 );
186
+ Assertions .assertThat (maxBucketsArr ).isEqualTo (new int [] {2 , 1 });
187
+
188
+ HashBucketAssigner assigner0 = createAssigner (2 , 2 , 0 , maxBucketsArr [0 ]);
189
+ HashBucketAssigner assigner1 = createAssigner (2 , 2 , 1 , maxBucketsArr [1 ]);
190
+
191
+ // assigner0: assign
192
+ assertThat (assigner0 .assign (row (1 ), 0 )).isEqualTo (0 );
193
+ assertThat (assigner0 .assign (row (1 ), 2 )).isEqualTo (0 );
194
+ assertThat (assigner0 .assign (row (1 ), 4 )).isEqualTo (0 );
195
+ assertThat (assigner0 .assign (row (1 ), 6 )).isEqualTo (0 );
196
+ assertThat (assigner0 .assign (row (1 ), 8 )).isEqualTo (0 );
197
+
198
+ // assigner0: full
199
+ assertThat (assigner0 .assign (row (1 ), 10 )).isEqualTo (2 );
200
+ assertThat (assigner0 .assign (row (1 ), 12 )).isEqualTo (2 );
201
+ assertThat (assigner0 .assign (row (1 ), 14 )).isEqualTo (2 );
202
+ assertThat (assigner0 .assign (row (1 ), 16 )).isEqualTo (2 );
203
+ assertThat (assigner0 .assign (row (1 ), 18 )).isEqualTo (2 );
204
+
205
+ // assigner0: exceed buckets upper bound
206
+ int hash = 18 ;
207
+ for (int i = 0 ; i < 200 ; i ++) {
208
+ int bucket = assigner0 .assign (row (2 ), hash += 2 );
209
+ Assertions .assertThat (bucket ).isIn (0 , 2 );
210
+ }
211
+
212
+ // assigner1: assign
213
+ assertThat (assigner1 .assign (row (1 ), 1 )).isEqualTo (1 );
214
+ assertThat (assigner1 .assign (row (1 ), 3 )).isEqualTo (1 );
215
+ assertThat (assigner1 .assign (row (1 ), 5 )).isEqualTo (1 );
216
+ assertThat (assigner1 .assign (row (1 ), 7 )).isEqualTo (1 );
217
+ assertThat (assigner1 .assign (row (1 ), 9 )).isEqualTo (1 );
218
+
219
+ // assigner1: exceed buckets upper bound
220
+ hash = 9 ;
221
+ for (int i = 0 ; i < 200 ; i ++) {
222
+ int bucket = assigner1 .assign (row (2 ), hash += 2 );
223
+ Assertions .assertThat (bucket ).isIn (1 );
224
+ }
225
+ }
226
+
227
+ @ ParameterizedTest (name = "maxBuckets: {0}" )
155
228
@ ValueSource (ints = {-1 , 1 , 2 })
156
229
public void testPartitionCopy (int maxBucketsNum ) {
157
230
HashBucketAssigner assigner = createAssigner (1 , 1 , 0 , maxBucketsNum );
@@ -229,7 +302,7 @@ public void testAssignRestoreWithUpperBound() {
229
302
assertThat (assigner0 .assign (row (1 ), 11 )).isEqualTo (0 );
230
303
assertThat (assigner0 .assign (row (1 ), 14 )).isEqualTo (0 );
231
304
assertThat (assigner2 .assign (row (1 ), 16 )).isEqualTo (2 );
232
- // exceed buckets limits
305
+ // exceed buckets upper bound
233
306
assertThat (assigner0 .assign (row (1 ), 17 )).isEqualTo (0 );
234
307
}
235
308
0 commit comments