package proj.zoie.impl.indexing.internal;
import java.io.IOException;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.index.FilterIndexReader.FilterTermDocs;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
public class ZoieSegmentTermDocs extends FilterTermDocs {
private final DocIdSetIterator _delSetIterator;
private int _nextDelDoc;
public ZoieSegmentTermDocs(TermDocs in,DocIdSet delSet) throws IOException{
this(in,delSet.iterator());
}
public ZoieSegmentTermDocs(TermDocs in, DocIdSetIterator delSetIterator) throws IOException {
super(in);
_delSetIterator = delSetIterator;
_nextDelDoc=_delSetIterator.nextDoc();
}
public boolean next() throws IOException {
boolean hasNext=in.next();
if (_nextDelDoc!=DocIdSetIterator.NO_MORE_DOCS){
int currID =in.doc();
while(hasNext){
if (currID<_nextDelDoc){
return hasNext;
}
else{
if (currID == _nextDelDoc){
hasNext=in.next();
currID =in.doc();
}
_nextDelDoc = _delSetIterator.advance(currID);
}
}
}
return hasNext;
}
public int read(final int[] docs, final int[] freqs) throws IOException {
if (_nextDelDoc!=DocIdSetIterator.NO_MORE_DOCS){
int i = 0;
while (i < docs.length) {
if (!in.next())
return i;
int doc = in.doc();
if (doc<_nextDelDoc){
docs[i] = doc;
freqs[i] = in.freq();
i++;
}
else{
_nextDelDoc = _delSetIterator.advance(doc);
if (doc==_nextDelDoc){
continue;
}
else{
docs[i] = doc;
freqs[i] = in.freq();
i++;
}
}
}
return i;
}
else{
return in.read(docs,freqs);
}
}
public boolean skipTo(int i) throws IOException {
if (!in.skipTo(i))
return false;
if (_nextDelDoc!=DocIdSetIterator.NO_MORE_DOCS){
int doc = in.doc();
if (doc<_nextDelDoc) return true;
_nextDelDoc = _delSetIterator.advance(doc);
if (doc==_nextDelDoc) return next();
}
return true;
}
}