package org.thrudb.thrudex.lucene;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.Filter;
import org.apache.lucene.util.OpenBitSet;
public class RealTimeDiskFilter extends Filter {
/**
*
*/
private static final long serialVersionUID = 1L;
private IndexReader diskReader = null;
private OpenBitSet diskFilter = null;
private Map<Term,Boolean> termSet = null;
private Logger logger = Logger.getLogger(getClass());
public RealTimeDiskFilter(IndexReader diskReader) {
this.diskReader = diskReader;
diskFilter = new OpenBitSet(diskReader.maxDoc());
diskFilter.set(0, diskReader.maxDoc());
termSet = new HashMap<Term,Boolean>();
}
@Override
public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
if(reader != diskReader){
OpenBitSet rset = new OpenBitSet(reader.maxDoc());
rset.set(0, reader.maxDoc());
return rset;
}
return diskFilter;
}
public boolean hideTerm(Term term) throws IOException {
//check we haven't hidden already
if(termSet.containsKey(term))
return termSet.get(term).booleanValue();
//Find terms and filter them out
TermDocs termDocs = diskReader.termDocs(term);
if(termDocs == null){
//add this term to the termSet
termSet.put(term, new Boolean(false));
return false;
}
boolean found = false;
while(termDocs.next()){
diskFilter.clear(termDocs.doc());
found = true;
}
//add this term to the termSet
termSet.put(term, new Boolean(found));
return found;
}
public Set<Term> getTermSet(){
Set<Term> tmpTermSet = new HashSet<Term>();
for(Map.Entry<Term, Boolean> e : termSet.entrySet()){
if(e.getValue()){
tmpTermSet.add(e.getKey());
}
}
return tmpTermSet;
}
}