From 5a31023eae4bf2bd621fa8613699f54842109402 Mon Sep 17 00:00:00 2001 From: "Claude Warren, Jr" Date: Tue, 23 Aug 2022 11:27:24 +0100 Subject: [PATCH] COLLECTIONS-831: Add BloomFilter clear() method --- .../bloomfilter/ArrayCountingBloomFilter.java | 6 ++++++ .../commons/collections4/bloomfilter/BloomFilter.java | 5 +++++ .../collections4/bloomfilter/SimpleBloomFilter.java | 6 ++++++ .../collections4/bloomfilter/SparseBloomFilter.java | 5 +++++ .../bloomfilter/AbstractBloomFilterTest.java | 9 +++++++++ .../collections4/bloomfilter/DefaultBloomFilterTest.java | 5 +++++ 6 files changed, 36 insertions(+) diff --git a/src/main/java/org/apache/commons/collections4/bloomfilter/ArrayCountingBloomFilter.java b/src/main/java/org/apache/commons/collections4/bloomfilter/ArrayCountingBloomFilter.java index 4202f6d86..ba13e6645 100644 --- a/src/main/java/org/apache/commons/collections4/bloomfilter/ArrayCountingBloomFilter.java +++ b/src/main/java/org/apache/commons/collections4/bloomfilter/ArrayCountingBloomFilter.java @@ -16,6 +16,7 @@ */ package org.apache.commons.collections4.bloomfilter; +import java.util.Arrays; import java.util.Objects; import java.util.function.IntPredicate; import java.util.function.LongPredicate; @@ -104,6 +105,11 @@ public final class ArrayCountingBloomFilter implements CountingBloomFilter { this.counts = source.counts.clone(); } + @Override + public void clear() { + Arrays.fill(counts, 0); + } + @Override public ArrayCountingBloomFilter copy() { return new ArrayCountingBloomFilter(this); diff --git a/src/main/java/org/apache/commons/collections4/bloomfilter/BloomFilter.java b/src/main/java/org/apache/commons/collections4/bloomfilter/BloomFilter.java index 58ed6bcb5..9471e5dcd 100644 --- a/src/main/java/org/apache/commons/collections4/bloomfilter/BloomFilter.java +++ b/src/main/java/org/apache/commons/collections4/bloomfilter/BloomFilter.java @@ -60,6 +60,11 @@ public interface BloomFilter extends IndexProducer, BitMapProducer { */ Shape getShape(); + /** + * Resets the filter to its initial, unpopulated state. + */ + void clear(); + /** * Returns {@code true} if this filter contains the specified filter. * diff --git a/src/main/java/org/apache/commons/collections4/bloomfilter/SimpleBloomFilter.java b/src/main/java/org/apache/commons/collections4/bloomfilter/SimpleBloomFilter.java index c351f40c1..eb777f726 100644 --- a/src/main/java/org/apache/commons/collections4/bloomfilter/SimpleBloomFilter.java +++ b/src/main/java/org/apache/commons/collections4/bloomfilter/SimpleBloomFilter.java @@ -117,6 +117,12 @@ public final class SimpleBloomFilter implements BloomFilter { this.cardinality = source.cardinality; } + @Override + public void clear() { + Arrays.fill(bitMap, 0L); + cardinality = 0; + } + @Override public long[] asBitMapArray() { return Arrays.copyOf(bitMap, bitMap.length); diff --git a/src/main/java/org/apache/commons/collections4/bloomfilter/SparseBloomFilter.java b/src/main/java/org/apache/commons/collections4/bloomfilter/SparseBloomFilter.java index 9cfa034eb..f5670ce1c 100644 --- a/src/main/java/org/apache/commons/collections4/bloomfilter/SparseBloomFilter.java +++ b/src/main/java/org/apache/commons/collections4/bloomfilter/SparseBloomFilter.java @@ -174,6 +174,11 @@ public final class SparseBloomFilter implements BloomFilter { return true; } + @Override + public void clear() { + indices.clear(); + } + @Override public Shape getShape() { return shape; diff --git a/src/test/java/org/apache/commons/collections4/bloomfilter/AbstractBloomFilterTest.java b/src/test/java/org/apache/commons/collections4/bloomfilter/AbstractBloomFilterTest.java index d8ceea079..a61885491 100644 --- a/src/test/java/org/apache/commons/collections4/bloomfilter/AbstractBloomFilterTest.java +++ b/src/test/java/org/apache/commons/collections4/bloomfilter/AbstractBloomFilterTest.java @@ -18,6 +18,7 @@ package org.apache.commons.collections4.bloomfilter; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -178,6 +179,14 @@ public abstract class AbstractBloomFilterTest { assertTrue(bf4.contains(bf1)); } + @Test + public void testClear() { + BloomFilter bf1 = createFilter(getTestShape(), from1); + assertNotEquals(0, bf1.cardinality()); + bf1.clear(); + assertEquals(0, bf1.cardinality()); + } + /** * Tests that the andCardinality calculations are correct. * diff --git a/src/test/java/org/apache/commons/collections4/bloomfilter/DefaultBloomFilterTest.java b/src/test/java/org/apache/commons/collections4/bloomfilter/DefaultBloomFilterTest.java index ff258ae80..ea7bd25f6 100644 --- a/src/test/java/org/apache/commons/collections4/bloomfilter/DefaultBloomFilterTest.java +++ b/src/test/java/org/apache/commons/collections4/bloomfilter/DefaultBloomFilterTest.java @@ -112,6 +112,11 @@ public class DefaultBloomFilterTest extends AbstractBloomFilterTest