Class SparseLiveDocs
LiveDocs implementation optimized for sparse deletions.
This implementation stores DELETED documents using SparseFixedBitSet, which provides:
- O(1) random access via
get(int) - O(deletedDocs) iteration via
deletedDocsIterator() - Memory usage proportional to number of deleted documents, not total documents
This is most efficient when deletions are sparse. For denser deletions, DenseLiveDocs
should be used instead.
Inverted semantics: Unlike typical live docs that store which documents are live, this stores which documents are DELETED. Therefore:
get(int)returnstrueif doc is LIVE (bit is NOT set in deletedDocs)deletedDocsIterator()iterates documents where bit IS set in deletedDocs
Immutability: This class is immutable once constructed. Instances are typically created
using the SparseLiveDocs.Builder via builder(SparseFixedBitSet, int).
- WARNING: This API is experimental and might change in incompatible ways in the next release.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic final classBuilder for creating SparseLiveDocs instances with optional pre-computed deleted count.Nested classes/interfaces inherited from interface org.apache.lucene.util.Bits
Bits.MatchAllBits, Bits.MatchNoBits -
Field Summary
Fields inherited from interface org.apache.lucene.util.Bits
EMPTY_ARRAY -
Method Summary
Modifier and TypeMethodDescriptionvoidapplyMask(FixedBitSet bitSet, int offset) static SparseLiveDocs.Builderbuilder(SparseFixedBitSet deletedDocs, int maxDoc) Creates a builder for constructing SparseLiveDocs instances.intReturns the number of deleted documents.Returns an iterator over deleted document IDs.booleanget(int index) Returns the value of the bit with the specifiedindex.intlength()Returns the number of bits in this setReturns an iterator over live document IDs.longReturns the memory usage in bytes.toString()
-
Method Details
-
builder
Creates a builder for constructing SparseLiveDocs instances.- Parameters:
deletedDocs- bit set where set bits represent DELETED documentsmaxDoc- the maximum document ID (exclusive)- Returns:
- a new builder instance
-
get
public boolean get(int index) Description copied from interface:BitsReturns the value of the bit with the specifiedindex.- Specified by:
getin interfaceBits- Parameters:
index- index, should be non-negative and <Bits.length(). The result of passing negative or out of bounds values is undefined by this interface, just don't do it!- Returns:
trueif the bit is set,falseotherwise.
-
length
public int length()Description copied from interface:BitsReturns the number of bits in this set -
applyMask
Apply thisBitsinstance to the givenFixedBitSet, which starts at the givenoffset.offsetmust be non-negative. For each indexiintobitSet, ifbitSet.get(i)is set thenoffset + imust be less thanBits.length(): bits ofbitSetwhose corresponding index into this instance is out of range are not covered. Implementations that can detect such a bit cheaply --FixedBitSet.applyMask(org.apache.lucene.util.FixedBitSet, int)and theLiveDocsimplementations do -- throwIllegalArgumentException; the default implementation below readsBits.get(int)out of bounds instead, which is undefined perBits.get(int).Apart from that, this should behave the same way as the default implementation, which does the following:
for (int i = bitSet.nextSetBit(0); i != DocIdSetIterator.NO_MORE_DOCS; i = i + 1 >= bitSet.length() ? DocIdSetIterator.NO_MORE_DOCS : bitSet.nextSetBit(i + 1)) { if (get(offset + i) == false) { bitSet.clear(i); } }Applying a mask may only ever clear bits, and the only bits it may clear are the deleted documents, so this is a word-level and-not of the deleted documents into the destination rather than the per-bit loop of the default implementation. It runs one word operation per non-zero word of the deleted documents in the window, that is at most one per 64 documents of the window, so its cost is bounded by the size of the window and does not depend on how many bits are set in the destination.
- Specified by:
applyMaskin interfaceBits- Throws:
IllegalArgumentException- unless every set bit ofbitSetat indexisatisfiesoffset + i < maxDoc
-
liveDocsIterator
Description copied from interface:LiveDocsReturns an iterator over live document IDs.The returned iterator provides sequential access to all live documents in ascending order. The iteration complexity depends on the implementation:
- For sparse deletions: O(maxDoc) - may need to scan all documents
- For dense deletions: O(liveDocs) - only visits live documents
Callers can use
DocIdSetIterator.cost()to determine the expected number of live documents.- Specified by:
liveDocsIteratorin interfaceLiveDocs- Returns:
- an iterator over live document IDs
-
deletedDocsIterator
Description copied from interface:LiveDocsReturns an iterator over deleted document IDs.The returned iterator provides sequential access to all deleted documents in ascending order. The iteration complexity depends on the implementation:
- For sparse deletions: O(deletedDocs) - only visits deleted documents
- For dense deletions: O(maxDoc) - may need to scan all documents
Callers can use
DocIdSetIterator.cost()to determine if sparse iteration would be beneficial for their use case.- Specified by:
deletedDocsIteratorin interfaceLiveDocs- Returns:
- an iterator over deleted document IDs, or an empty iterator if no documents are deleted
-
deletedCount
public int deletedCount()Description copied from interface:LiveDocsReturns the number of deleted documents.This can be used to determine deletion density and choose appropriate algorithms.
- Specified by:
deletedCountin interfaceLiveDocs- Returns:
- the number of deleted documents in this segment
-
ramBytesUsed
public long ramBytesUsed()Returns the memory usage in bytes.- Returns:
- estimated memory usage in bytes
-
toString
-