use of org.apache.solr.analytics.expression.Expression in project lucene-solr by apache.
the class FacetingAccumulator method export.
@Override
@SuppressWarnings("unchecked")
public NamedList<?> export() {
final NamedList<Object> base = (NamedList<Object>) super.export();
NamedList<NamedList<?>> facetList = new NamedList<>();
// Add the field facet buckets to the output
base.add("fieldFacets", facetList);
for (FieldFacetRequest freq : request.getFieldFacets()) {
final String name = freq.getName();
if (hiddenFieldFacets.contains(name)) {
continue;
}
final Map<String, Expression[]> buckets = fieldFacetExpressions.get(name);
final NamedList<Object> bucketBase = new NamedList<>();
Iterable<Entry<String, Expression[]>> iter = buckets.entrySet();
final FieldFacetRequest fr = (FieldFacetRequest) freq;
final FacetSortSpecification sort = fr.getSort();
final int limit = fr.getLimit();
final int offset = fr.getOffset();
final boolean showMissing = fr.showsMissing();
if (!showMissing) {
buckets.remove(MISSING_VALUE);
}
// Sorting the buckets if a sort specification is provided
if (sort != null && buckets.values().iterator().hasNext()) {
int sortPlace = Arrays.binarySearch(expressionNames, sort.getStatistic());
final Expression first = buckets.values().iterator().next()[sortPlace];
final Comparator<Expression> comp = (Comparator<Expression>) first.comparator(sort.getDirection());
final List<Entry<String, Expression[]>> sorted = new ArrayList<>(buckets.size());
Iterables.addAll(sorted, iter);
Collections.sort(sorted, new EntryComparator(comp, sortPlace));
iter = sorted;
}
// apply the limit
if (limit > AnalyticsContentHandler.DEFAULT_FACET_LIMIT) {
if (offset > 0) {
iter = Iterables.skip(iter, offset);
}
iter = Iterables.limit(iter, limit);
}
// Export each expression in the bucket.
for (Entry<String, Expression[]> bucket : iter) {
bucketBase.add(bucket.getKey(), export(bucket.getValue()));
}
facetList.add(name, bucketBase);
}
// Add the range facet buckets to the output
facetList = new NamedList<>();
base.add("rangeFacets", facetList);
for (RangeFacetRequest freq : request.getRangeFacets()) {
final String name = freq.getName();
final Map<String, Expression[]> buckets = rangeFacetExpressions.get(name);
final NamedList<Object> bucketBase = new NamedList<>();
Iterable<Entry<String, Expression[]>> iter = buckets.entrySet();
for (Entry<String, Expression[]> bucket : iter) {
bucketBase.add(bucket.getKey(), export(bucket.getValue()));
}
facetList.add(name, bucketBase);
}
// Add the query facet buckets to the output
facetList = new NamedList<>();
base.add("queryFacets", facetList);
for (QueryFacetRequest freq : request.getQueryFacets()) {
final String name = freq.getName();
final Map<String, Expression[]> buckets = queryFacetExpressions.get(name);
final NamedList<Object> bucketBase = new NamedList<>();
Iterable<Entry<String, Expression[]>> iter = buckets.entrySet();
for (Entry<String, Expression[]> bucket : iter) {
bucketBase.add(bucket.getKey(), export(bucket.getValue()));
}
facetList.add(name, bucketBase);
}
return base;
}
Aggregations