@Override public RandomAccessDocIdSet getRandomAccessDocIdSet(BoboIndexReader reader) throws IOException { final MultiValueFacetDataCache dataCache = (MultiValueFacetDataCache) _facetHandler.getFacetData(reader); final int[] index = _valueConverter.convert(dataCache, _vals); final BigNestedIntArray nestedArray = dataCache._nestedArray; final OpenBitSet bitset = new OpenBitSet(dataCache.valArray.size()); for (int i : index) { bitset.fastSet(i); } if (_takeCompliment) { // flip the bits int size = dataCache.valArray.size(); for (int i = 0; i < size; ++i) { bitset.fastFlip(i); } } long count = bitset.cardinality(); if (count == 0) { final DocIdSet empty = EmptyDocIdSet.getInstance(); return new RandomAccessDocIdSet() { @Override public boolean get(int docId) { return false; } @Override public DocIdSetIterator iterator() throws IOException { return empty.iterator(); } }; } else { return new RandomAccessDocIdSet() { @Override public DocIdSetIterator iterator() { return new MultiValueOrFacetDocIdSetIterator(dataCache, bitset); } @Override public final boolean get(int docId) { return nestedArray.contains(docId, bitset); } }; } }
public double getFacetSelectivity(BoboIndexReader reader) { double selectivity = 0; MultiValueFacetDataCache dataCache = (MultiValueFacetDataCache) _facetHandler.getFacetData(reader); int[] idxes = _valueConverter.convert(dataCache, _vals); if (idxes == null) { return 0.0; } int accumFreq = 0; for (int idx : idxes) { accumFreq += dataCache.freqs[idx]; } int total = reader.maxDoc(); selectivity = (double) accumFreq / (double) total; if (selectivity > 0.999) { selectivity = 1.0; } return selectivity; }