package com.senseidb.search.query.filters;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.lucene.index.IndexReader;
import com.kamikaze.docidset.impl.NotDocIdSet;
/**
* A NOT filter implementation.
*
* Since the sensei filters return upper bounds on cardinality, there is no way to estimate the cardinality of
* a NOT in general. We would need a lower bound on cardinality to do that. Hence we go with maxDoc
*/
public class SenseiNotFilter extends SenseiFilter {
private static final Logger log = Logger.getLogger(SenseiNotFilter.class);
private static final long serialVersionUID = 1L;
private final SenseiFilter _innerFilter;
public SenseiNotFilter(SenseiFilter innerFilter)
{
_innerFilter = innerFilter;
}
@Override
public SenseiDocIdSet getSenseiDocIdSet(IndexReader reader) throws IOException {
SenseiDocIdSet senseiDocIdSet = _innerFilter.getSenseiDocIdSet(reader);
int maxDoc = reader.maxDoc();
DocIdSetCardinality docIdSetCardinality = senseiDocIdSet.getCardinalityEstimate().clone();
docIdSetCardinality.invert();
String plan = EMPTY_STRING;
if(log.isDebugEnabled()) {
plan = "NOT " + senseiDocIdSet.getQueryPlan();
}
return new SenseiDocIdSet(new NotDocIdSet(senseiDocIdSet.getDocIdSet(), maxDoc), docIdSetCardinality, plan);
}
}