You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datasketches.apache.org by jm...@apache.org on 2024/03/29 21:23:44 UTC
(datasketches-java) 02/06: WIP: fix wrap methods to take input isEmpty flag
This is an automated email from the ASF dual-hosted git repository.
jmalkin pushed a commit to branch bloom-direct
in repository https://gitbox.apache.org/repos/asf/datasketches-java.git
commit 312f3d491fb44c14d8b5ac837aa0eea4f3224402
Author: Jon <jm...@apache.org>
AuthorDate: Thu Mar 28 00:36:10 2024 -0700
WIP: fix wrap methods to take input isEmpty flag
---
.../datasketches/filters/bloomfilter/BitArray.java | 21 ++++++++++++++++++---
.../filters/bloomfilter/DirectBitArray.java | 6 +++---
.../filters/bloomfilter/DirectBitArrayR.java | 4 ++--
3 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/src/main/java/org/apache/datasketches/filters/bloomfilter/BitArray.java b/src/main/java/org/apache/datasketches/filters/bloomfilter/BitArray.java
index 76fe2f85..22715126 100644
--- a/src/main/java/org/apache/datasketches/filters/bloomfilter/BitArray.java
+++ b/src/main/java/org/apache/datasketches/filters/bloomfilter/BitArray.java
@@ -19,7 +19,10 @@
package org.apache.datasketches.filters.bloomfilter;
- /**
+import org.apache.datasketches.memory.Memory;
+import org.apache.datasketches.memory.WritableMemory;
+
+/**
* This class holds an array of bits suitable for use in a Bloom Filter
*
* <p>Rounds the number of bits up to the smallest multiple of 64 (one long)
@@ -31,6 +34,18 @@ abstract class BitArray {
protected BitArray() {}
+ static BitArray heapify(final Memory mem, final boolean isEmpty) {
+ return HeapBitArray.heapify(mem);
+ }
+
+ static BitArray wrap(final Memory mem) {
+ return DirectBitArrayR.wrap(mem);
+ }
+
+ static BitArray writableWrap(final WritableMemory wmem) {
+ return DirectBitArray.writableWrap(wmem);
+ }
+
boolean isEmpty() {
return !isDirty() && getNumBitsSet() == 0;
}
@@ -78,8 +93,8 @@ abstract class BitArray {
long getSerializedSizeBytes() {
// We only really need an int for array length but this will keep everything
// aligned to 8 bytes.
- // Always write array length and numBitsSet, even if empty
- return Long.BYTES * (isEmpty() ? 2L : (2L + getArrayLength()));
+ // Always write array length, but write numBitsSet only if empty
+ return Long.BYTES * (isEmpty() ? 1L : (2L + getArrayLength()));
}
abstract protected boolean isDirty();
diff --git a/src/main/java/org/apache/datasketches/filters/bloomfilter/DirectBitArray.java b/src/main/java/org/apache/datasketches/filters/bloomfilter/DirectBitArray.java
index 4d0509bd..dbe9c048 100644
--- a/src/main/java/org/apache/datasketches/filters/bloomfilter/DirectBitArray.java
+++ b/src/main/java/org/apache/datasketches/filters/bloomfilter/DirectBitArray.java
@@ -31,16 +31,16 @@ final class DirectBitArray extends DirectBitArrayR {
numBitsSet_ = storedNumBitsSet;
}
- static DirectBitArray wrap(final WritableMemory mem) {
+ static DirectBitArray writableWrap(final WritableMemory mem, final boolean isEmpty) {
final int arrayLength = mem.getInt(0);
- final long storedNumBitsSet = mem.getLong(NUM_BITS_OFFSET);
+ final long storedNumBitsSet = isEmpty ? 0L : mem.getLong(NUM_BITS_OFFSET);
if (arrayLength * (long) Long.SIZE > MAX_BITS) {
throw new SketchesArgumentException("Possible corruption: Serialized image indicates array beyond maximum filter capacity");
}
// if empty cannot wrap as writable
- if (storedNumBitsSet == 0) {
+ if (isEmpty) {
throw new SketchesArgumentException("Cannot wrap an empty filter for writing as there is no backing data array");
}
diff --git a/src/main/java/org/apache/datasketches/filters/bloomfilter/DirectBitArrayR.java b/src/main/java/org/apache/datasketches/filters/bloomfilter/DirectBitArrayR.java
index d938380d..e7c073fb 100644
--- a/src/main/java/org/apache/datasketches/filters/bloomfilter/DirectBitArrayR.java
+++ b/src/main/java/org/apache/datasketches/filters/bloomfilter/DirectBitArrayR.java
@@ -50,9 +50,9 @@ public class DirectBitArrayR extends BitArray {
// assumes we have a region with only the portion of Memory
// the BitArray cares about
- static DirectBitArrayR wrap(final Memory mem) {
+ static DirectBitArrayR wrap(final Memory mem, final boolean isEmpty) {
final int arrayLength = mem.getInt(0);
- final long storedNumBitsSet = mem.getLong(NUM_BITS_OFFSET);
+ final long storedNumBitsSet = isEmpty ? 0L : mem.getLong(NUM_BITS_OFFSET);
if (arrayLength * (long) Long.SIZE > MAX_BITS) {
throw new SketchesArgumentException("Possible corruption: Serialized image indicates array beyond maximum filter capacity");
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org