package com.browseengine.bobo.facets.filter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.lucene.search.DocIdSet; import org.apache.lucene.search.DocIdSetIterator; import com.browseengine.bobo.api.BoboSegmentReader; import com.browseengine.bobo.docidset.AndDocIdSet; import com.browseengine.bobo.docidset.RandomAccessDocIdSet; public class RandomAccessAndFilter extends RandomAccessFilter { protected List<RandomAccessFilter> _filters; public RandomAccessAndFilter(List<RandomAccessFilter> filters) { _filters = filters; } @Override public double getFacetSelectivity(BoboSegmentReader reader) { double selectivity = Double.MAX_VALUE; for (RandomAccessFilter filter : _filters) { double curSelectivity = filter.getFacetSelectivity(reader); if (selectivity > curSelectivity) { selectivity = curSelectivity; } } if (selectivity > 0.999) { selectivity = 1.0; } return selectivity; } @Override public RandomAccessDocIdSet getRandomAccessDocIdSet(BoboSegmentReader reader) throws IOException { if (_filters.size() == 1) { return _filters.get(0).getRandomAccessDocIdSet(reader); } else { List<DocIdSet> list = new ArrayList<DocIdSet>(_filters.size()); List<RandomAccessDocIdSet> randomAccessList = new ArrayList<RandomAccessDocIdSet>( _filters.size()); for (RandomAccessFilter f : _filters) { RandomAccessDocIdSet s = f.getRandomAccessDocIdSet(reader); list.add(s); randomAccessList.add(s); } final RandomAccessDocIdSet[] randomAccessDocIdSets = randomAccessList .toArray(new RandomAccessDocIdSet[randomAccessList.size()]); final DocIdSet andDocIdSet = new AndDocIdSet(list); return new RandomAccessDocIdSet() { @Override public boolean get(int docId) { for (RandomAccessDocIdSet s : randomAccessDocIdSets) { if (!s.get(docId)) return false; } return true; } @Override public DocIdSetIterator iterator() throws IOException { return andDocIdSet.iterator(); } }; } } }