Skip to content

Commit

Permalink
LayerManager.Builder implements Supplier
Browse files Browse the repository at this point in the history
  • Loading branch information
garydgregory committed Aug 26, 2024
1 parent edcc524 commit f5337f1
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 25 deletions.
1 change: 1 addition & 0 deletions src/changes/changes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
<action type="fix" dev="ggregory" due-to="Dávid Szigecsán. Gary Gregory">Increase test coverage for ListUtils #517.</action>
<action type="fix" dev="ggregory" due-to="Dávid Szigecsán">Use the Junit (Jupiter) API #518.</action>
<!-- ADD -->
<action type="add" dev="ggregory" due-to="Dávid Szigecsán">LayerManager.Builder implements Supplier.</action>
<!-- UPDATE -->
<action issue="COLLECTIONS-857" type="update" dev="ggregory" due-to="Claude Warren">Update bloom filter documentation #508.</action>
<action issue="COLLECTIONS-857" type="update" dev="ggregory" due-to="Dependabot, Gary Gregory">Bump commons-codec:commons-codec from 1.17.0 to 1.17.1 #514.</action>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,12 @@
public class LayerManager<T extends BloomFilter> implements BloomFilterExtractor {

/**
* Builder to create Layer Manager.
* Builds new instances of {@link LayerManager}.
*
* @param <T> the {@link BloomFilter} type.
*/
public static class Builder<T extends BloomFilter> {
public static class Builder<T extends BloomFilter> implements Supplier<LayerManager<T>> {

private Predicate<LayerManager<T>> extendCheck;
private Supplier<T> supplier;
private Consumer<Deque<T>> cleanup;
Expand All @@ -75,7 +76,8 @@ private Builder() {
*
* @return a new LayerManager.
*/
public LayerManager<T> build() {
@Override
public LayerManager<T> get() {
return new LayerManager<>(supplier, extendCheck, cleanup, true);
}

Expand All @@ -97,7 +99,7 @@ public Builder<T> setCleanup(final Consumer<Deque<T>> cleanup) {
*
* @param extendCheck The predicate to determine if a new target should be
* created.
* @return this for chaining.
* @return {@code this} instance.
*/
public Builder<T> setExtendCheck(final Predicate<LayerManager<T>> extendCheck) {
this.extendCheck = extendCheck;
Expand All @@ -109,7 +111,7 @@ public Builder<T> setExtendCheck(final Predicate<LayerManager<T>> extendCheck) {
* the supplier provides the instance of the Bloom filter.
*
* @param supplier The supplier of new Bloom filter instances.
* @return this for chaining.
* @return {@code this} instance.
*/
public Builder<T> setSupplier(final Supplier<T> supplier) {
this.supplier = supplier;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public class BloomFilteExtractorFromLayeredBloomFilterTest extends AbstractBloom
protected BloomFilterExtractor createUnderTest(final BloomFilter... filters) {
final Shape shape = filters[0].getShape();
final LayerManager layerManager = LayerManager.builder().setSupplier(() -> new SimpleBloomFilter(shape))
.setExtendCheck(LayerManager.ExtendCheck.advanceOnPopulated()).setCleanup(LayerManager.Cleanup.noCleanup()).build();
.setExtendCheck(LayerManager.ExtendCheck.advanceOnPopulated()).setCleanup(LayerManager.Cleanup.noCleanup()).get();
final LayeredBloomFilter underTest = new LayeredBloomFilter(shape, layerManager);
for (final BloomFilter bf : filters) {
underTest.merge(bf);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public class LayerManagerTest {
@ValueSource(ints = {4, 10, 2, 1})
public void testAdvanceOnCount(final int breakAt) {
final Predicate<LayerManager<BloomFilter>> underTest = LayerManager.ExtendCheck.advanceOnCount(breakAt);
final LayerManager<BloomFilter> layerManager = testingBuilder().build();
final LayerManager<BloomFilter> layerManager = testingBuilder().get();
for (int i = 0; i < breakAt - 1; i++) {
assertFalse(underTest.test(layerManager), "at " + i);
layerManager.getTarget().merge(TestingHashers.FROM1);
Expand All @@ -63,7 +63,7 @@ public void testAdvanceOnCountInvalidArguments() {
@Test
public void testAdvanceOnPopulated() {
final Predicate<LayerManager<BloomFilter>> underTest = LayerManager.ExtendCheck.advanceOnPopulated();
final LayerManager<BloomFilter> layerManager = testingBuilder().build();
final LayerManager<BloomFilter> layerManager = testingBuilder().get();
assertFalse(underTest.test(layerManager));
layerManager.getTarget().merge(TestingHashers.FROM1);
assertTrue(underTest.test(layerManager));
Expand All @@ -74,7 +74,7 @@ public void testAdvanceOnSaturation() {
final double maxN = shape.estimateMaxN();
int hashStart = 0;
final Predicate<LayerManager<BloomFilter>> underTest = LayerManager.ExtendCheck.advanceOnSaturation(maxN);
final LayerManager<BloomFilter> layerManager = testingBuilder().build();
final LayerManager<BloomFilter> layerManager = testingBuilder().get();
while (layerManager.getTarget().getShape().estimateN(layerManager.getTarget().cardinality()) < maxN) {
assertFalse(underTest.test(layerManager));
layerManager.getTarget().merge(new IncrementingHasher(hashStart, shape.getNumberOfHashFunctions()));
Expand All @@ -88,24 +88,24 @@ public void testAdvanceOnSaturation() {
@Test
public void testBuilder() {
final LayerManager.Builder<BloomFilter> underTest = LayerManager.builder();
NullPointerException npe = assertThrows(NullPointerException.class, underTest::build);
NullPointerException npe = assertThrows(NullPointerException.class, underTest::get);
assertTrue(npe.getMessage().contains("filterSupplier"));
underTest.setSupplier(() -> null).setCleanup(null);
npe = assertThrows(NullPointerException.class, underTest::build);
npe = assertThrows(NullPointerException.class, underTest::get);
assertTrue(npe.getMessage().contains("filterCleanup"));
underTest.setCleanup(x -> {
}).setExtendCheck(null);
npe = assertThrows(NullPointerException.class, underTest::build);
npe = assertThrows(NullPointerException.class, underTest::get);
assertTrue(npe.getMessage().contains("extendCheck"));

npe = assertThrows(NullPointerException.class, () -> LayerManager.builder().setSupplier(() -> null).build());
npe = assertThrows(NullPointerException.class, () -> LayerManager.builder().setSupplier(() -> null).get());
assertTrue(npe.getMessage().contains("filterSupplier.get() returned null."));

}

@Test
public void testClear() {
final LayerManager<BloomFilter> underTest = LayerManager.builder().setSupplier(() -> new SimpleBloomFilter(shape)).build();
final LayerManager<BloomFilter> underTest = LayerManager.builder().setSupplier(() -> new SimpleBloomFilter(shape)).get();
underTest.getTarget().merge(TestingHashers.randomHasher());
underTest.next();
underTest.getTarget().merge(TestingHashers.randomHasher());
Expand All @@ -119,7 +119,7 @@ public void testClear() {

@Test
public void testCopy() {
final LayerManager<BloomFilter> underTest = LayerManager.builder().setSupplier(() -> new SimpleBloomFilter(shape)).build();
final LayerManager<BloomFilter> underTest = LayerManager.builder().setSupplier(() -> new SimpleBloomFilter(shape)).get();
underTest.getTarget().merge(TestingHashers.randomHasher());
underTest.next();
underTest.getTarget().merge(TestingHashers.randomHasher());
Expand All @@ -140,7 +140,7 @@ public void testCopy() {
@Test
public void testForEachBloomFilter() {
final LayerManager<BloomFilter> underTest = LayerManager.builder().setSupplier(() -> new SimpleBloomFilter(shape))
.setExtendCheck(LayerManager.ExtendCheck.advanceOnPopulated()).build();
.setExtendCheck(LayerManager.ExtendCheck.advanceOnPopulated()).get();

final List<BloomFilter> lst = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Expand All @@ -161,7 +161,7 @@ public void testForEachBloomFilter() {
@Test
public void testGet() {
final SimpleBloomFilter f = new SimpleBloomFilter(shape);
final LayerManager<BloomFilter> underTest = LayerManager.builder().setSupplier(() -> f).build();
final LayerManager<BloomFilter> underTest = LayerManager.builder().setSupplier(() -> f).get();
assertEquals(1, underTest.getDepth());
assertSame(f, underTest.get(0));
assertThrows(NoSuchElementException.class, () -> underTest.get(-1));
Expand All @@ -175,7 +175,7 @@ private LayerManager.Builder<BloomFilter> testingBuilder() {
@Test
public void testNeverAdvance() {
final Predicate<LayerManager<BloomFilter>> underTest = LayerManager.ExtendCheck.neverAdvance();
final LayerManager<BloomFilter> layerManager = testingBuilder().build();
final LayerManager<BloomFilter> layerManager = testingBuilder().get();
assertFalse(underTest.test(layerManager));
for (int i = 0; i < 10; i++) {
layerManager.getTarget().merge(TestingHashers.randomHasher());
Expand All @@ -185,7 +185,7 @@ public void testNeverAdvance() {

@Test
public void testNextAndGetDepth() {
final LayerManager<BloomFilter> underTest = LayerManager.builder().setSupplier(() -> new SimpleBloomFilter(shape)).build();
final LayerManager<BloomFilter> underTest = LayerManager.builder().setSupplier(() -> new SimpleBloomFilter(shape)).get();
assertEquals(1, underTest.getDepth());
underTest.getTarget().merge(TestingHashers.randomHasher());
assertEquals(1, underTest.getDepth());
Expand Down Expand Up @@ -281,7 +281,7 @@ public void testTarget() {
return true;
}).setCleanup(ll -> {
cleanupCalled[0] = true;
}).build();
}).get();
assertFalse(extendCheckCalled[0]);
assertFalse(cleanupCalled[0]);
assertEquals(1, supplierCount[0]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ static LayeredBloomFilter<TimestampedBloomFilter> createTimedLayeredFilter(final
.setCleanup(cleanup)
.setExtendCheck(new AdvanceOnTimeQuanta(quanta)
.or(LayerManager.ExtendCheck.advanceOnSaturation(shape.estimateMaxN())))
.build();
.get();
return new LayeredBloomFilter<>(shape, layerManager);
}

Expand Down Expand Up @@ -174,7 +174,7 @@ public static <T extends BloomFilter> LayeredBloomFilter<T> fixed(final Shape sh
final LayerManager.Builder<T> builder = LayerManager.builder();
builder.setExtendCheck(LayerManager.ExtendCheck.advanceOnPopulated())
.setCleanup(LayerManager.Cleanup.onMaxSize(maxDepth)).setSupplier(supplier);
return new LayeredBloomFilter<>(shape, builder.build());
return new LayeredBloomFilter<>(shape, builder.get());
}

// instrumentation to record timestamps in dbgInstrument list
Expand Down Expand Up @@ -221,7 +221,7 @@ private LayeredBloomFilter<BloomFilter> setupFindTest() {
@Test
public void testCardinalityAndIsEmpty() {
final LayerManager<BloomFilter> layerManager = LayerManager.builder().setExtendCheck(ExtendCheck.neverAdvance())
.setSupplier(() -> new SimpleBloomFilter(getTestShape())).build();
.setSupplier(() -> new SimpleBloomFilter(getTestShape())).get();
testCardinalityAndIsEmpty(new LayeredBloomFilter<>(getTestShape(), layerManager));
}

Expand All @@ -233,7 +233,7 @@ public void testCleanup() {
final LayerManager layerManager = LayerManager.builder()
.setSupplier(() -> new NumberedBloomFilter(getTestShape(), 3, sequence[0]++))
.setExtendCheck(ExtendCheck.neverAdvance())
.setCleanup(ll -> ll.removeIf( f -> (((NumberedBloomFilter) f).value-- == 0))).build();
.setCleanup(ll -> ll.removeIf( f -> (((NumberedBloomFilter) f).value-- == 0))).get();
final LayeredBloomFilter underTest = new LayeredBloomFilter(getTestShape(), layerManager );
assertEquals(1, underTest.getDepth());
underTest.merge(TestingHashers.randomHasher());
Expand Down Expand Up @@ -385,7 +385,7 @@ public void testMultipleFilters() {
@Test
public final void testNext() {
final LayerManager<BloomFilter> layerManager = LayerManager.builder().setSupplier(() -> new SimpleBloomFilter(getTestShape()))
.build();
.get();

final LayeredBloomFilter<BloomFilter> filter = new LayeredBloomFilter<>(getTestShape(), layerManager);
filter.merge(TestingHashers.FROM1);
Expand Down

0 comments on commit f5337f1

Please sign in to comment.