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.OrDocIdSet; import com.browseengine.bobo.docidset.RandomAccessDocIdSet; public class RandomAccessOrFilter extends RandomAccessFilter { protected final List<RandomAccessFilter> _filters; public RandomAccessOrFilter(List<RandomAccessFilter> filters) { if (filters == null) { Exception e = new Exception(); e.fillInStackTrace(); e.printStackTrace(); } _filters = filters; } @Override public double getFacetSelectivity(BoboSegmentReader reader) { double selectivity = 0; for (RandomAccessFilter filter : _filters) { selectivity += filter.getFacetSelectivity(reader); } 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 orDocIdSet = new OrDocIdSet(list); return new RandomAccessDocIdSet() { @Override public boolean get(int docId) { for (RandomAccessDocIdSet s : randomAccessDocIdSets) { if (s.get(docId)) return true; } return false; } @Override public DocIdSetIterator iterator() throws IOException { return orDocIdSet.iterator(); } }; } } }