package org.apache.solr.request; import java.util.ArrayList; import java.util.Collections; import org.apache.lucene.search.FieldCache.DocTermsIndex; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.CharsRef; import org.apache.solr.common.util.NamedList; import org.apache.solr.request.SimpleFacets.CountPair; import org.apache.solr.schema.FieldType; import org.apache.solr.util.BoundedTreeSet; public class FacetPercentiles { private int runningCount = 0; private ArrayList<Double> targetCounts = new ArrayList<Double>(); private ArrayList<Double> requestedPercentiles = new ArrayList<Double>(); private int nextTargetCountIndex = 0; private NamedList<Integer> buckets = new NamedList<Integer>(); private NamedList<String> percentiles; private double average = 0; private double total = 0; private int totalCount = 0; public double getAverage() { return average; } public int getTotalCount() { return totalCount; } public double getTotal() { return total; } public FacetPercentiles(String[] requestedPercentiles, int totalCount) { for (String individualRequestedPercentileSet : requestedPercentiles){ for(String individualRequestedPercentile : individualRequestedPercentileSet.split(",")) { try{ double requestedPercentile = Double.parseDouble(individualRequestedPercentile); double targetCount = totalCount * (requestedPercentile / 100); this.requestedPercentiles.add(requestedPercentile); this.targetCounts.add(targetCount); } catch (Exception e){ } } } Collections.sort(this.requestedPercentiles); Collections.sort(this.targetCounts); percentiles = new NamedList<String>(); this.totalCount = totalCount; } public void processFacetCount(String facetValue, int count) { if (stillLookingForPercentiles()) { runningCount += count; while (stillLookingForPercentiles() && isFacetValueInteresting()){ recordFoundPercentile(facetValue); } } } public void accumulateAverage(String facetValue, int count) { double val = 0; try { val = Double.parseDouble(facetValue); } catch (Exception e) { } average = average + (val * count/totalCount); total += val * count; } public void storeFacetCount(String facetValue, int count) { buckets.add(facetValue,count); } private boolean isFacetValueInteresting() { return targetCounts.get(nextTargetCountIndex) <= runningCount; } private void recordFoundPercentile(String facetValue) { percentiles.add(requestedPercentiles.get(nextTargetCountIndex).toString(), facetValue); nextTargetCountIndex++; } public boolean foundAllPercentiles() { return nextTargetCountIndex >= targetCounts.size(); } public boolean stillLookingForPercentiles() { return !foundAllPercentiles(); } public NamedList<String> getPercentiles() { return percentiles; } public NamedList<Integer> getBuckets() { return this.buckets; } }