Search in sources :

Example 1 with RangeFacetAccumulator

use of org.apache.solr.analytics.accumulator.facet.RangeFacetAccumulator in project lucene-solr by apache.

the class FacetingAccumulator method processRangeFacets.

/**
   * Initiates the collecting of range facets
   * @param filter the base filter to use
   * @throws IOException if searching fails
   */
public void processRangeFacets(final Filter filter) throws IOException {
    for (RangeFacetRequest rfr : rangeFacets) {
        String[] pivotStr;
        String start = rfr.getStart();
        if (start.contains(AnalyticsParams.QUERY_RESULT)) {
            throw new SolrException(ErrorCode.BAD_REQUEST, "Query result requests can not be used in Range Facets");
        } else if (start.contains(AnalyticsParams.RESULT)) {
            try {
                pivotStr = ExpressionFactory.getArguments(start.substring(start.indexOf('(') + 1, start.indexOf(')')).trim());
                if (pivotStr.length == 1) {
                    rfr.setStart(getResult(pivotStr[0]));
                } else if (pivotStr.length == 3) {
                    rfr.setStart(getResult(pivotStr[0], pivotStr[1], pivotStr[2]));
                } else {
                    throw new SolrException(ErrorCode.BAD_REQUEST, "Result request " + start + " has an invalid amount of arguments.");
                }
            } catch (IndexOutOfBoundsException e) {
                throw new SolrException(ErrorCode.BAD_REQUEST, "Result request " + start + " is invalid. Lacks parentheses.", e);
            }
        }
        String end = rfr.getEnd();
        if (end.contains(AnalyticsParams.QUERY_RESULT)) {
            throw new SolrException(ErrorCode.BAD_REQUEST, "Query result requests can not be used in Range Facets");
        } else if (end.contains(AnalyticsParams.RESULT)) {
            try {
                pivotStr = ExpressionFactory.getArguments(end.substring(end.indexOf('(') + 1, end.indexOf(')')).trim());
                if (pivotStr.length == 1) {
                    rfr.setEnd(getResult(pivotStr[0]));
                } else if (pivotStr.length == 3) {
                    rfr.setEnd(getResult(pivotStr[0], pivotStr[1], pivotStr[2]));
                } else {
                    throw new SolrException(ErrorCode.BAD_REQUEST, "Result request " + end + " has an invalid amount of arguments.");
                }
            } catch (IndexOutOfBoundsException e) {
                throw new SolrException(ErrorCode.BAD_REQUEST, "Result request " + end + " is invalid. Lacks parentheses.", e);
            }
        }
        String[] gaps = rfr.getGaps();
        for (int count = 0; count < gaps.length; count++) {
            String gap = gaps[count];
            if (gap.contains(AnalyticsParams.QUERY_RESULT)) {
                throw new SolrException(ErrorCode.BAD_REQUEST, "Query result requests can not be used in Range Facets");
            } else if (gap.contains(AnalyticsParams.RESULT)) {
                try {
                    pivotStr = ExpressionFactory.getArguments(gap.substring(gap.indexOf('(') + 1, gap.indexOf(')')).trim());
                    if (pivotStr.length == 1) {
                        gaps[count] = getResult(pivotStr[0]);
                    } else if (pivotStr.length == 3) {
                        gaps[count] = getResult(pivotStr[0], pivotStr[1], pivotStr[2]);
                    } else {
                        throw new SolrException(ErrorCode.BAD_REQUEST, "Result request " + gap + " has an invalid amount of arguments.");
                    }
                } catch (IndexOutOfBoundsException e) {
                    throw new SolrException(ErrorCode.BAD_REQUEST, "Result request " + gap + " is invalid. Lacks parentheses.", e);
                }
            }
        }
        // Computes the end points of the ranges in the rangeFacet
        final RangeEndpointCalculator<? extends Comparable<?>> rec = RangeEndpointCalculator.create(rfr);
        final SchemaField sf = rfr.getField();
        // collect the documents for that range.
        for (FacetRange range : rec.getRanges()) {
            final String upper;
            final String lower;
            String facetValue = "";
            if (range.lower == null) {
                facetValue = "(*";
                lower = null;
            } else {
                lower = range.lower;
                facetValue = ((range.includeLower) ? "[" : "(") + range.lower;
            }
            facetValue += " TO ";
            if (range.upper == null) {
                upper = null;
                facetValue += "*)";
            } else {
                upper = range.upper;
                facetValue += range.upper + ((range.includeUpper) ? "]" : ")");
            }
            Query q = sf.getType().getRangeQuery(null, sf, lower, upper, range.includeLower, range.includeUpper);
            RangeFacetAccumulator rAcc = new RangeFacetAccumulator(this, rfr.getName(), facetValue);
            // The searcher sends docIds to the RangeFacetAccumulator which forwards
            // them to <code>collectRange()</code> in this class for collection.
            Query filtered = new BooleanQuery.Builder().add(q, Occur.MUST).add(filter, Occur.FILTER).build();
            searcher.search(filtered, rAcc);
            computeRangeFacet(sf.getName());
        }
    }
}
Also used : RangeFacetRequest(org.apache.solr.analytics.request.RangeFacetRequest) BooleanQuery(org.apache.lucene.search.BooleanQuery) Query(org.apache.lucene.search.Query) BooleanQuery(org.apache.lucene.search.BooleanQuery) SchemaField(org.apache.solr.schema.SchemaField) RangeFacetAccumulator(org.apache.solr.analytics.accumulator.facet.RangeFacetAccumulator) FacetRange(org.apache.solr.analytics.util.RangeEndpointCalculator.FacetRange) SolrException(org.apache.solr.common.SolrException)

Aggregations

BooleanQuery (org.apache.lucene.search.BooleanQuery)1 Query (org.apache.lucene.search.Query)1 RangeFacetAccumulator (org.apache.solr.analytics.accumulator.facet.RangeFacetAccumulator)1 RangeFacetRequest (org.apache.solr.analytics.request.RangeFacetRequest)1 FacetRange (org.apache.solr.analytics.util.RangeEndpointCalculator.FacetRange)1 SolrException (org.apache.solr.common.SolrException)1 SchemaField (org.apache.solr.schema.SchemaField)1