package com.senseidb.search.query.filters; import com.browseengine.bobo.api.BoboIndexReader; import com.browseengine.bobo.facets.filter.RandomAccessFilter; import com.browseengine.bobo.query.MatchAllDocIdSetIterator; import org.apache.log4j.Logger; import org.apache.lucene.index.IndexReader; import org.apache.lucene.search.DocIdSet; import org.apache.lucene.search.DocIdSetIterator; import java.io.IOException; import java.util.Comparator; public class SenseiDocIdSet { private static final Logger log = Logger.getLogger(SenseiDocIdSet.class); public static final Comparator<SenseiDocIdSet> DECREASING_CARDINALITY_COMPARATOR = new Comparator<SenseiDocIdSet>() { @Override public int compare(SenseiDocIdSet a, SenseiDocIdSet b) { return -a.getCardinalityEstimate().compareTo(b.getCardinalityEstimate()); } }; public static final Comparator<SenseiDocIdSet> INCREASING_CARDINALITY_COMPARATOR = new Comparator<SenseiDocIdSet> (){ @Override public int compare(SenseiDocIdSet a, SenseiDocIdSet b) { return a.getCardinalityEstimate().compareTo(b.getCardinalityEstimate()); } }; private final DocIdSet docIdSet; private final DocIdSetCardinality docIdSetCardinalityEstimate; private final String queryPlan; public SenseiDocIdSet(DocIdSet docIdSet, DocIdSetCardinality docIdSetCardinalityEstimate, String queryPlan) { this.docIdSet = docIdSet; this.docIdSetCardinalityEstimate = docIdSetCardinalityEstimate; this.queryPlan = queryPlan; } public DocIdSet getDocIdSet() { return docIdSet; } public DocIdSetCardinality getCardinalityEstimate() { return docIdSetCardinalityEstimate; } public String getQueryPlan() { return "[" + docIdSetCardinalityEstimate + "] " + queryPlan; } public static SenseiDocIdSet build(RandomAccessFilter randomAccessFilter, BoboIndexReader boboIndexReader, String queryPlan) throws IOException { DocIdSet docIdSet = randomAccessFilter.getDocIdSet(boboIndexReader); double facetSelectivity = randomAccessFilter.getFacetSelectivity(boboIndexReader); return new SenseiDocIdSet(docIdSet, DocIdSetCardinality.exact(facetSelectivity), queryPlan); } public static SenseiDocIdSet buildMatchAll(final IndexReader reader, String queryPlan) { DocIdSet docIdSet = new DocIdSet() { @Override public boolean isCacheable() { return false; } @Override public DocIdSetIterator iterator() throws IOException { return new MatchAllDocIdSetIterator(reader); } }; String plan = FilterConstructor.EMPTY_STRING; if(log.isDebugEnabled()) { plan = "MATCH ALL " + queryPlan; } return new SenseiDocIdSet(docIdSet, DocIdSetCardinality.one(), plan); } public static SenseiDocIdSet buildMatchNone(String queryPlan) { String plan = FilterConstructor.EMPTY_STRING; if(log.isDebugEnabled()) { plan = "MATCH NONE " + queryPlan; } return new SenseiDocIdSet(DocIdSet.EMPTY_DOCIDSET, DocIdSetCardinality.zero(), plan); } }