|
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;
|
@@ -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 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 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);
|
|
0 commit comments