package org.apache.lucene.search; import org.apache.lucene.util.BitSet; /** * Iterator which works with the knowledge of index segment boundaries. * It returns un-based document ids. * * Internal bitset iterator works with bounded ranges. We remove/add * bases before returning the results. * */ public class BasedBitSetIterator extends DocIdSetIterator { private int base; private int doc = -1; private int upperBound; private BitSet bits; private int length; private long cost; public BasedBitSetIterator(BitSet bits, long cost, int base, int size) { if (cost < 0) { throw new IllegalArgumentException("cost must be >= 0, got " + cost); } this.bits = bits; this.length = bits.length(); this.cost = cost; this.base = base; this.upperBound = base + size; if (upperBound > length) upperBound = length; } @Override public int docID() { return doc; } @Override public int nextDoc() { return advance(doc + 1); } @Override public int advance(int target) { if (target+base >= upperBound) { return doc = NO_MORE_DOCS; } doc = bits.nextSetBit(target+base); if (doc >= upperBound) return doc = NO_MORE_DOCS; return doc = doc - base; } @Override public long cost() { return cost; } }