From c698eb1066cdee1f0da0ec17a6c10a6277222795 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Fri, 26 May 2023 09:13:16 -0700 Subject: [PATCH] add BitSet.clear() (#12268) --- lucene/CHANGES.txt | 4 ++++ .../lucene/analysis/hunspell/TrigramAutomaton.java | 2 +- .../lucene/backward_codecs/lucene80/IndexedDISI.java | 4 ++-- .../apache/lucene/codecs/lucene90/IndexedDISI.java | 4 ++-- .../core/src/java/org/apache/lucene/util/BitSet.java | 10 ++++++++++ .../src/java/org/apache/lucene/util/FixedBitSet.java | 5 +++++ .../java/org/apache/lucene/util/GrowableBitSet.java | 5 +++++ .../org/apache/lucene/util/SparseFixedBitSet.java | 12 ++++++++++++ .../org/apache/lucene/util/automaton/Operations.java | 2 +- .../apache/lucene/util/hnsw/HnswGraphSearcher.java | 2 +- .../facet/range/OverlappingLongRangeCounter.java | 4 ++-- 11 files changed, 45 insertions(+), 9 deletions(-) diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index db018fb21446..ef143e1a0fc1 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -110,6 +110,10 @@ Other API Changes --------------------- + +* GITHUB#12268: Add BitSet.clear() without parameters for clearing the entire set + (Jonathan Ellis) + (No changes) New Features diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/TrigramAutomaton.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/TrigramAutomaton.java index dfe994ccf827..f4404e4bcf02 100644 --- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/TrigramAutomaton.java +++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/TrigramAutomaton.java @@ -79,7 +79,7 @@ private int runAutomatonOnStringChars(String s) { } int ngramScore(CharsRef s2) { - countedSubstrings.clear(0, countedSubstrings.length()); + countedSubstrings.clear(); int score1 = 0, score2 = 0, score3 = 0; // scores for substrings of length 1, 2 and 3 diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/backward_codecs/lucene80/IndexedDISI.java b/lucene/backward-codecs/src/java/org/apache/lucene/backward_codecs/lucene80/IndexedDISI.java index fc82ce588860..639bdbd73339 100644 --- a/lucene/backward-codecs/src/java/org/apache/lucene/backward_codecs/lucene80/IndexedDISI.java +++ b/lucene/backward-codecs/src/java/org/apache/lucene/backward_codecs/lucene80/IndexedDISI.java @@ -219,7 +219,7 @@ static short writeBitSet(DocIdSetIterator it, IndexOutput out, byte denseRankPow // Flush block flush(prevBlock, buffer, blockCardinality, denseRankPower, out); // Reset for next block - buffer.clear(0, buffer.length()); + buffer.clear(); totalCardinality += blockCardinality; blockCardinality = 0; } @@ -233,7 +233,7 @@ static short writeBitSet(DocIdSetIterator it, IndexOutput out, byte denseRankPow jumps, out.getFilePointer() - origo, totalCardinality, jumpBlockIndex, prevBlock + 1); totalCardinality += blockCardinality; flush(prevBlock, buffer, blockCardinality, denseRankPower, out); - buffer.clear(0, buffer.length()); + buffer.clear(); prevBlock++; } final int lastBlock = diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/IndexedDISI.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/IndexedDISI.java index 8da289e3ad35..205892d2fe9f 100644 --- a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/IndexedDISI.java +++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/IndexedDISI.java @@ -220,7 +220,7 @@ public static short writeBitSet(DocIdSetIterator it, IndexOutput out, byte dense // Flush block flush(prevBlock, buffer, blockCardinality, denseRankPower, out); // Reset for next block - buffer.clear(0, buffer.length()); + buffer.clear(); totalCardinality += blockCardinality; blockCardinality = 0; } @@ -234,7 +234,7 @@ public static short writeBitSet(DocIdSetIterator it, IndexOutput out, byte dense jumps, out.getFilePointer() - origo, totalCardinality, jumpBlockIndex, prevBlock + 1); totalCardinality += blockCardinality; flush(prevBlock, buffer, blockCardinality, denseRankPower, out); - buffer.clear(0, buffer.length()); + buffer.clear(); prevBlock++; } final int lastBlock = diff --git a/lucene/core/src/java/org/apache/lucene/util/BitSet.java b/lucene/core/src/java/org/apache/lucene/util/BitSet.java index f8b8ba65a591..c5d84833b28a 100644 --- a/lucene/core/src/java/org/apache/lucene/util/BitSet.java +++ b/lucene/core/src/java/org/apache/lucene/util/BitSet.java @@ -43,6 +43,16 @@ public static BitSet of(DocIdSetIterator it, int maxDoc) throws IOException { return set; } + /** + * Clear all the bits of the set. + * + *

Depending on the implementation, this may be significantly faster than clear(0, length). + */ + public void clear() { + // default implementation for compatibility + clear(0, length()); + } + /** Set the bit at i. */ public abstract void set(int i); diff --git a/lucene/core/src/java/org/apache/lucene/util/FixedBitSet.java b/lucene/core/src/java/org/apache/lucene/util/FixedBitSet.java index 5566bd0c4833..ebf626a777da 100644 --- a/lucene/core/src/java/org/apache/lucene/util/FixedBitSet.java +++ b/lucene/core/src/java/org/apache/lucene/util/FixedBitSet.java @@ -147,6 +147,11 @@ public FixedBitSet(long[] storedBits, int numBits) { assert verifyGhostBitsClear(); } + @Override + public void clear() { + Arrays.fill(bits, 0L); + } + /** * Checks if the bits past numBits are clear. Some methods rely on this implicit assumption: * search for "Depends on the ghost bits being clear!" diff --git a/lucene/core/src/java/org/apache/lucene/util/GrowableBitSet.java b/lucene/core/src/java/org/apache/lucene/util/GrowableBitSet.java index a5e6915e6569..6512683c7e2f 100644 --- a/lucene/core/src/java/org/apache/lucene/util/GrowableBitSet.java +++ b/lucene/core/src/java/org/apache/lucene/util/GrowableBitSet.java @@ -44,6 +44,11 @@ public void clear(int index) { bitSet.clear(index); } + @Override + public void clear() { + bitSet.clear(); + } + @Override public boolean get(int index) { return bitSet.get(index); diff --git a/lucene/core/src/java/org/apache/lucene/util/SparseFixedBitSet.java b/lucene/core/src/java/org/apache/lucene/util/SparseFixedBitSet.java index 49d61614e86d..b4ebe3cfc59a 100644 --- a/lucene/core/src/java/org/apache/lucene/util/SparseFixedBitSet.java +++ b/lucene/core/src/java/org/apache/lucene/util/SparseFixedBitSet.java @@ -17,6 +17,7 @@ package org.apache.lucene.util; import java.io.IOException; +import java.util.Arrays; import org.apache.lucene.search.DocIdSetIterator; /** @@ -73,6 +74,17 @@ public SparseFixedBitSet(int length) { + RamUsageEstimator.shallowSizeOf(bits); } + @Override + public void clear() { + Arrays.fill(bits, null); + Arrays.fill(indices, 0L); + nonZeroLongCount = 0; + ramBytesUsed = + BASE_RAM_BYTES_USED + + RamUsageEstimator.sizeOf(indices) + + RamUsageEstimator.shallowSizeOf(bits); + } + @Override public int length() { return length; diff --git a/lucene/core/src/java/org/apache/lucene/util/automaton/Operations.java b/lucene/core/src/java/org/apache/lucene/util/automaton/Operations.java index 268744203154..3a3fd871e5a2 100644 --- a/lucene/core/src/java/org/apache/lucene/util/automaton/Operations.java +++ b/lucene/core/src/java/org/apache/lucene/util/automaton/Operations.java @@ -1097,7 +1097,7 @@ public static String getCommonPrefix(Automaton a) { FixedBitSet tmp = current; current = next; next = tmp; - next.clear(0, next.length()); + next.clear(); } return builder.toString(); } diff --git a/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraphSearcher.java b/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraphSearcher.java index 84481db28422..a963c4d9a8d6 100644 --- a/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraphSearcher.java +++ b/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraphSearcher.java @@ -369,6 +369,6 @@ private void prepareScratchState(int capacity) { } // else GrowableBitSet knows how to grow itself safely } - visited.clear(0, visited.length()); + visited.clear(); } } diff --git a/lucene/facet/src/java/org/apache/lucene/facet/range/OverlappingLongRangeCounter.java b/lucene/facet/src/java/org/apache/lucene/facet/range/OverlappingLongRangeCounter.java index 3c9ae7ebd7cb..b478e3994e11 100644 --- a/lucene/facet/src/java/org/apache/lucene/facet/range/OverlappingLongRangeCounter.java +++ b/lucene/facet/src/java/org/apache/lucene/facet/range/OverlappingLongRangeCounter.java @@ -84,7 +84,7 @@ void startMultiValuedDoc() { if (multiValuedDocElementaryIntervalHits == null) { multiValuedDocElementaryIntervalHits = new FixedBitSet(boundaries.length); } else { - multiValuedDocElementaryIntervalHits.clear(0, multiValuedDocElementaryIntervalHits.length()); + multiValuedDocElementaryIntervalHits.clear(); } } @@ -103,7 +103,7 @@ boolean endMultiValuedDoc() { if (multiValuedDocRangeHits == null) { multiValuedDocRangeHits = new FixedBitSet(rangeCount()); } else { - multiValuedDocRangeHits.clear(0, multiValuedDocRangeHits.length()); + multiValuedDocRangeHits.clear(); } elementaryIntervalUpto = 0; rollupMultiValued(root);