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