|
@@ -20,7 +20,6 @@ import java.util.Objects;
|
|
|
import java.util.Set;
|
|
|
|
|
|
import static org.hamcrest.Matchers.equalTo;
|
|
|
-import static org.hamcrest.Matchers.greaterThanOrEqualTo;
|
|
|
|
|
|
public class LongKeyedBucketOrdsTests extends ESTestCase {
|
|
|
private final MockBigArrays bigArrays = new MockBigArrays(new MockPageCacheRecycler(Settings.EMPTY), new NoneCircuitBreakerService());
|
|
@@ -96,72 +95,84 @@ public class LongKeyedBucketOrdsTests extends ESTestCase {
|
|
|
|
|
|
public void testCollectsFromManyBuckets() {
|
|
|
try (LongKeyedBucketOrds ords = LongKeyedBucketOrds.build(bigArrays, CardinalityUpperBound.MANY)) {
|
|
|
- // Test a few explicit values
|
|
|
- assertThat(ords.add(0, 0), equalTo(0L));
|
|
|
- assertThat(ords.add(1, 0), equalTo(1L));
|
|
|
- assertThat(ords.add(0, 0), equalTo(-1L));
|
|
|
- assertThat(ords.add(1, 0), equalTo(-2L));
|
|
|
- assertThat(ords.size(), equalTo(2L));
|
|
|
- assertThat(ords.find(0, 0), equalTo(0L));
|
|
|
- assertThat(ords.find(1, 0), equalTo(1L));
|
|
|
+ assertCollectsFromManyBuckets(ords, scaledRandomIntBetween(1, 10000), Long.MIN_VALUE, Long.MAX_VALUE);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- // And some random values
|
|
|
- Set<OwningBucketOrdAndValue> seen = new HashSet<>();
|
|
|
- seen.add(new OwningBucketOrdAndValue(0, 0));
|
|
|
- seen.add(new OwningBucketOrdAndValue(1, 0));
|
|
|
- OwningBucketOrdAndValue[] values = new OwningBucketOrdAndValue[scaledRandomIntBetween(1, 10000)];
|
|
|
- long maxAllowedOwningBucketOrd = scaledRandomIntBetween(0, values.length);
|
|
|
- long maxOwningBucketOrd = Long.MIN_VALUE;
|
|
|
- for (int i = 0; i < values.length; i++) {
|
|
|
- values[i] = randomValueOtherThanMany(seen::contains, () ->
|
|
|
- new OwningBucketOrdAndValue(randomLongBetween(0, maxAllowedOwningBucketOrd), randomLong()));
|
|
|
- seen.add(values[i]);
|
|
|
- maxOwningBucketOrd = Math.max(maxOwningBucketOrd, values[i].owningBucketOrd);
|
|
|
- }
|
|
|
- for (int i = 0; i < values.length; i++) {
|
|
|
- assertThat(ords.find(values[i].owningBucketOrd, values[i].value), equalTo(-1L));
|
|
|
- assertThat(ords.add(values[i].owningBucketOrd, values[i].value), equalTo(i + 2L));
|
|
|
- assertThat(ords.find(values[i].owningBucketOrd, values[i].value), equalTo(i + 2L));
|
|
|
- assertThat(ords.size(), equalTo(i + 3L));
|
|
|
- if (randomBoolean()) {
|
|
|
- assertThat(ords.add(0, 0), equalTo(-1L));
|
|
|
- }
|
|
|
- }
|
|
|
- for (int i = 0; i < values.length; i++) {
|
|
|
- assertThat(ords.add(values[i].owningBucketOrd, values[i].value), equalTo(-1 - (i + 2L)));
|
|
|
+ public void testCollectsFromManyBucketsSmall() {
|
|
|
+ int owningBucketOrds = scaledRandomIntBetween(1, 10000);
|
|
|
+ long maxValue = randomLongBetween(10000 / owningBucketOrds, 2^(16 * 3));
|
|
|
+ CardinalityUpperBound cardinality = CardinalityUpperBound.ONE.multiply(owningBucketOrds);
|
|
|
+ try (LongKeyedBucketOrds ords = LongKeyedBucketOrds.buildForValueRange(bigArrays, cardinality, 0, maxValue)) {
|
|
|
+ assertCollectsFromManyBuckets(ords, owningBucketOrds, 0, maxValue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void assertCollectsFromManyBuckets(LongKeyedBucketOrds ords, int maxAllowedOwningBucketOrd, long minValue, long maxValue) {
|
|
|
+ // Test a few explicit values
|
|
|
+ assertThat(ords.add(0, 0), equalTo(0L));
|
|
|
+ assertThat(ords.add(1, 0), equalTo(1L));
|
|
|
+ assertThat(ords.add(0, 0), equalTo(-1L));
|
|
|
+ assertThat(ords.add(1, 0), equalTo(-2L));
|
|
|
+ assertThat(ords.size(), equalTo(2L));
|
|
|
+ assertThat(ords.find(0, 0), equalTo(0L));
|
|
|
+ assertThat(ords.find(1, 0), equalTo(1L));
|
|
|
+
|
|
|
+ // And some random values
|
|
|
+ Set<OwningBucketOrdAndValue> seen = new HashSet<>();
|
|
|
+ seen.add(new OwningBucketOrdAndValue(0, 0));
|
|
|
+ seen.add(new OwningBucketOrdAndValue(1, 0));
|
|
|
+ OwningBucketOrdAndValue[] values = new OwningBucketOrdAndValue[scaledRandomIntBetween(1, 10000)];
|
|
|
+ long maxOwningBucketOrd = Long.MIN_VALUE;
|
|
|
+ for (int i = 0; i < values.length; i++) {
|
|
|
+ values[i] = randomValueOtherThanMany(seen::contains, () ->
|
|
|
+ new OwningBucketOrdAndValue(randomLongBetween(0, maxAllowedOwningBucketOrd), randomLongBetween(minValue, maxValue)));
|
|
|
+ seen.add(values[i]);
|
|
|
+ maxOwningBucketOrd = Math.max(maxOwningBucketOrd, values[i].owningBucketOrd);
|
|
|
+ }
|
|
|
+ for (int i = 0; i < values.length; i++) {
|
|
|
+ assertThat(ords.find(values[i].owningBucketOrd, values[i].value), equalTo(-1L));
|
|
|
+ assertThat(ords.add(values[i].owningBucketOrd, values[i].value), equalTo(i + 2L));
|
|
|
+ assertThat(ords.find(values[i].owningBucketOrd, values[i].value), equalTo(i + 2L));
|
|
|
+ assertThat(ords.size(), equalTo(i + 3L));
|
|
|
+ if (randomBoolean()) {
|
|
|
+ assertThat(ords.add(0, 0), equalTo(-1L));
|
|
|
}
|
|
|
+ }
|
|
|
+ for (int i = 0; i < values.length; i++) {
|
|
|
+ assertThat(ords.add(values[i].owningBucketOrd, values[i].value), equalTo(-1 - (i + 2L)));
|
|
|
+ }
|
|
|
|
|
|
- // And the explicit values are still ok
|
|
|
- assertThat(ords.add(0, 0), equalTo(-1L));
|
|
|
- assertThat(ords.add(1, 0), equalTo(-2L));
|
|
|
+ // And the explicit values are still ok
|
|
|
+ assertThat(ords.add(0, 0), equalTo(-1L));
|
|
|
+ assertThat(ords.add(1, 0), equalTo(-2L));
|
|
|
|
|
|
|
|
|
- for (long owningBucketOrd = 0; owningBucketOrd <= maxAllowedOwningBucketOrd; owningBucketOrd++) {
|
|
|
- long expectedCount = 0;
|
|
|
- LongKeyedBucketOrds.BucketOrdsEnum ordsEnum = ords.ordsEnum(owningBucketOrd);
|
|
|
- if (owningBucketOrd <= 1) {
|
|
|
+ for (long owningBucketOrd = 0; owningBucketOrd <= maxAllowedOwningBucketOrd; owningBucketOrd++) {
|
|
|
+ long expectedCount = 0;
|
|
|
+ LongKeyedBucketOrds.BucketOrdsEnum ordsEnum = ords.ordsEnum(owningBucketOrd);
|
|
|
+ if (owningBucketOrd <= 1) {
|
|
|
+ expectedCount++;
|
|
|
+ assertTrue(ordsEnum.next());
|
|
|
+ assertThat(ordsEnum.ord(), equalTo(owningBucketOrd));
|
|
|
+ assertThat(ordsEnum.value(), equalTo(0L));
|
|
|
+ }
|
|
|
+ for (int i = 0; i < values.length; i++) {
|
|
|
+ if (values[i].owningBucketOrd == owningBucketOrd) {
|
|
|
expectedCount++;
|
|
|
assertTrue(ordsEnum.next());
|
|
|
- assertThat(ordsEnum.ord(), equalTo(owningBucketOrd));
|
|
|
- assertThat(ordsEnum.value(), equalTo(0L));
|
|
|
+ assertThat(ordsEnum.ord(), equalTo(i + 2L));
|
|
|
+ assertThat(ordsEnum.value(), equalTo(values[i].value));
|
|
|
}
|
|
|
- for (int i = 0; i < values.length; i++) {
|
|
|
- if (values[i].owningBucketOrd == owningBucketOrd) {
|
|
|
- expectedCount++;
|
|
|
- assertTrue(ordsEnum.next());
|
|
|
- assertThat(ordsEnum.ord(), equalTo(i + 2L));
|
|
|
- assertThat(ordsEnum.value(), equalTo(values[i].value));
|
|
|
- }
|
|
|
- }
|
|
|
- assertFalse(ordsEnum.next());
|
|
|
-
|
|
|
- assertThat(ords.bucketsInOrd(owningBucketOrd), equalTo(expectedCount));
|
|
|
}
|
|
|
- assertFalse(ords.ordsEnum(randomLongBetween(maxOwningBucketOrd + 1, Long.MAX_VALUE)).next());
|
|
|
- assertThat(ords.bucketsInOrd(randomLongBetween(maxOwningBucketOrd + 1, Long.MAX_VALUE)), equalTo(0L));
|
|
|
+ assertFalse(ordsEnum.next());
|
|
|
|
|
|
- assertThat(ords.maxOwningBucketOrd(), greaterThanOrEqualTo(maxOwningBucketOrd));
|
|
|
+ assertThat(ords.bucketsInOrd(owningBucketOrd), equalTo(expectedCount));
|
|
|
}
|
|
|
+ assertFalse(ords.ordsEnum(randomLongBetween(maxOwningBucketOrd + 1, Long.MAX_VALUE)).next());
|
|
|
+ assertThat(ords.bucketsInOrd(randomLongBetween(maxOwningBucketOrd + 1, Long.MAX_VALUE)), equalTo(0L));
|
|
|
+
|
|
|
+ assertThat(ords.maxOwningBucketOrd(), equalTo(maxOwningBucketOrd));
|
|
|
}
|
|
|
|
|
|
private class OwningBucketOrdAndValue {
|