Index: org/apache/lucene/search/FilteredDocIdSet.java =================================================================== --- org/apache/lucene/search/FilteredDocIdSet.java (revision 0) +++ org/apache/lucene/search/FilteredDocIdSet.java (revision 0) @@ -0,0 +1,20 @@ +package org.apache.lucene.search; + +public abstract class FilteredDocIdSet extends DocIdSet{ + private final DocIdSet _innerSet; + public FilteredDocIdSet(DocIdSet innerSet){ + _innerSet = innerSet; + } + + protected abstract boolean match(int docid); + + @Override + public DocIdSetIterator iterator() { + return new FilteredDocIdSetIterator(_innerSet.iterator()){ + protected boolean match(int docid) + { + return FilteredDocIdSet.this.match(docid); + } + }; + } +} Index: org/apache/lucene/search/FilteredDocIdSetIterator.java =================================================================== --- org/apache/lucene/search/FilteredDocIdSetIterator.java (revision 0) +++ org/apache/lucene/search/FilteredDocIdSetIterator.java (revision 0) @@ -0,0 +1,55 @@ +package org.apache.lucene.search; + +import java.io.IOException; + +public abstract class FilteredDocIdSetIterator extends DocIdSetIterator{ + protected DocIdSetIterator _innerIter; + private int _currentDoc; + + public FilteredDocIdSetIterator(DocIdSetIterator innerIter){ + if (innerIter == null){ + throw new IllegalArgumentException("null iterator"); + } + _innerIter=innerIter; + _currentDoc=-1; + } + + abstract protected boolean match(int doc); + + public final int doc() { + return _currentDoc; + } + + public final boolean next() throws IOException{ + while(_innerIter.next()){ + int doc=_innerIter.doc(); + if (match(doc)){ + _currentDoc=doc; + return true; + } + } + return false; + } + + public final boolean skipTo(int n) throws IOException{ + boolean flag=_innerIter.skipTo(n); + if (flag){ + int doc=_innerIter.doc(); + if (match(doc)){ + _currentDoc=doc; + return true; + } + else{ + while(_innerIter.next()){ + int docid=_innerIter.doc(); + if (match(docid)){ + _currentDoc=docid; + return true; + } + } + return false; + } + } + return flag; + } +}