This repository has been archived by the owner on Oct 30, 2020. It is now read-only.
/
PredicateFacetFilter.java
82 lines (70 loc) · 2.83 KB
/
PredicateFacetFilter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package com.senseidb.search.facet.attribute;
import java.io.IOException;
import org.apache.lucene.search.DocIdSetIterator;
import com.browseengine.bobo.api.BoboIndexReader;
import com.browseengine.bobo.docidset.EmptyDocIdSet;
import com.browseengine.bobo.docidset.RandomAccessDocIdSet;
import com.browseengine.bobo.facets.data.FacetDataCache;
import com.browseengine.bobo.facets.filter.Function;
import com.browseengine.bobo.facets.filter.RandomAccessFilter;
public class PredicateFacetFilter extends RandomAccessFilter {
private final Function<BoboIndexReader, FacetDataCache<?>> dataCacheBuilder;
private final FacetPredicate facetPredicate;
public PredicateFacetFilter(Function<BoboIndexReader, FacetDataCache<?>> dataCacheBuilder, FacetPredicate facetPredicate) {
this.dataCacheBuilder = dataCacheBuilder;
this.facetPredicate = facetPredicate;
}
@Override
public RandomAccessDocIdSet getRandomAccessDocIdSet(BoboIndexReader reader) throws IOException {
final FacetDataCache<?> facetDataCache = dataCacheBuilder.apply(reader);
int startDocIdTemp = Integer.MAX_VALUE;
int endDocIdTemp = -1;
for (int i = facetPredicate.valueStartIndex(facetDataCache); i < facetPredicate.valueEndIndex(facetDataCache); i++) {
if (facetPredicate.evaluateValue(facetDataCache, i)) {
if (!facetPredicate.evaluateValue(facetDataCache, i)) {
continue;
}
if (startDocIdTemp > facetDataCache.minIDs[i]) {
startDocIdTemp = facetDataCache.minIDs[i];
}
if (endDocIdTemp < facetDataCache.maxIDs[i]) {
endDocIdTemp = facetDataCache.maxIDs[i];
}
}
}
final int startDocId = startDocIdTemp;
final int endDocId = endDocIdTemp;
if (startDocId > endDocId) {
return EmptyDocIdSet.getInstance();
}
return new RandomAccessDocIdSet() {
@Override
public boolean get(int docId) {
return facetPredicate.evaluate(facetDataCache, docId);
}
@Override
public DocIdSetIterator iterator() throws IOException {
return new PredicateDocIdIterator(startDocId, endDocId, facetPredicate, facetDataCache);
}
};
}
@Override
public double getFacetSelectivity(BoboIndexReader reader) {
FacetDataCache<?> dataCache = dataCacheBuilder.apply(reader);
int[] frequencies = dataCache.freqs;
double selectivity = 0;
int accumFreq = 0;
int total = reader.maxDoc();
for (int i = facetPredicate.valueStartIndex(dataCache); i < facetPredicate.valueEndIndex(dataCache); i++) {
if (!facetPredicate.evaluateValue(dataCache, i)) {
continue;
}
accumFreq += frequencies[i];
}
selectivity = (double) accumFreq / (double) total;
if (selectivity > 0.999) {
selectivity = 1.0;
}
return selectivity;
}
}