Example usage for org.apache.solr.common.params FacetParams FACET_RANGE_HARD_END

List of usage examples for org.apache.solr.common.params FacetParams FACET_RANGE_HARD_END

Introduction

In this page you can find the example usage for org.apache.solr.common.params FacetParams FACET_RANGE_HARD_END.

Prototype

String FACET_RANGE_HARD_END

To view the source code for org.apache.solr.common.params FacetParams FACET_RANGE_HARD_END.

Click Source Link

Document

Boolean indicating how counts should be computed if the range between 'start' and 'end' is not evenly divisible by 'gap'.

Usage

From source file:com.frank.search.solr.core.DefaultQueryParser.java

License:Apache License

private void appendRangeFacetingOnFields(SolrQuery solrQuery, FacetQuery query) {
    FacetOptions facetRangeOptions = query.getFacetOptions();

    if (facetRangeOptions == null) {
        return;// ww w  . jav  a2  s .  c om
    }

    for (FieldWithRangeParameters<?, ?, ?> rangeField : facetRangeOptions.getFieldsWithRangeParameters()) {

        if (rangeField instanceof FieldWithDateRangeParameters) {
            appendFieldFacetingByDateRange(solrQuery, (FieldWithDateRangeParameters) rangeField);
        } else if (rangeField instanceof FieldWithNumericRangeParameters) {
            appendFieldFacetingByNumberRange(solrQuery, (FieldWithNumericRangeParameters) rangeField);
        }

        if (rangeField.getHardEnd() != null && rangeField.getHardEnd()) {
            FacetParameter param = new FacetParameter(FacetParams.FACET_RANGE_HARD_END, true);
            addFieldSpecificParameterToSolrQuery(solrQuery, rangeField, param);
        }
        if (rangeField.getOther() != null) {
            FacetParameter param = new FacetParameter(FacetParams.FACET_RANGE_OTHER, rangeField.getOther());
            addFieldSpecificParameterToSolrQuery(solrQuery, rangeField, param);
        }

        if (rangeField.getInclude() != null) {
            FacetParameter param = new FacetParameter(FacetParams.FACET_RANGE_INCLUDE, rangeField.getInclude());
            addFieldSpecificParameterToSolrQuery(solrQuery, rangeField, param);
        }

    }
}

From source file:fi.nationallibrary.ndl.solr.request.RangeFieldFacets.java

License:Apache License

private <T extends Comparable<T>> NamedList getFacetRangeCounts(final SchemaField sf,
        final RangeEndpointCalculator<T> calc) throws IOException {

    final String f = sf.getName();
    final NamedList res = new SimpleOrderedMap();
    final NamedList counts = new NamedList();
    res.add("counts", counts);

    final T start = calc.getValue(required.getFieldParam(f, FacetParams.FACET_RANGE_START));

    // not final, hardend may change this
    T end = calc.getValue(required.getFieldParam(f, FacetParams.FACET_RANGE_END));
    if (end.compareTo(start) < 0) {
        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                "range facet 'end' comes before 'start': " + end + " < " + start);
    }/*  w  w  w. j a  va 2  s.co  m*/

    final String gap = required.getFieldParam(f, FacetParams.FACET_RANGE_GAP);
    String[] gaps = parseGaps(gap);
    // explicitly return the gap.  compute this early so we are more 
    // likely to catch parse errors before attempting math
    for (int i = 0; i < gaps.length; i++) {
        calc.getGap(gaps[i]);
    }
    res.add("gap", gap);

    final int minCount = params.getFieldInt(f, FacetParams.FACET_MINCOUNT, 0);

    final EnumSet<FacetRangeInclude> include = FacetRangeInclude
            .parseParam(params.getFieldParams(f, FacetParams.FACET_RANGE_INCLUDE));

    T low = start;
    int gapIdx = 0;
    int previousCount = 0;

    while (low.compareTo(end) < 0) {
        T high = calc.addGap(low, gaps[gapIdx]);
        if (end.compareTo(high) < 0) {
            if (params.getFieldBool(f, FacetParams.FACET_RANGE_HARD_END, false)) {
                high = end;
            } else {
                end = high;
            }
        }
        if (high.compareTo(low) < 0) {
            throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                    "range facet infinite loop (is gap negative? did the math overflow?)");
        }

        final boolean includeLower = (include.contains(FacetRangeInclude.LOWER)
                || (include.contains(FacetRangeInclude.EDGE) && 0 == low.compareTo(start)));
        final boolean includeUpper = (include.contains(FacetRangeInclude.UPPER)
                || (include.contains(FacetRangeInclude.EDGE) && 0 == high.compareTo(end)));

        final String lowS = calc.formatValue(low);
        final String highS = calc.formatValue(high);

        final int count = rangeCount(sf, lowS, highS, includeLower, includeUpper);
        if (count >= minCount && count != previousCount) {
            counts.add(lowS, count);
            previousCount = count;
        }

        low = high;

        gapIdx = Math.min(gaps.length - 1, gapIdx + 1);
    }

    // explicitly return the start and end so all the counts 
    // (including before/after/between) are meaningful - even if mincount
    // has removed the neighboring ranges
    res.add("start", start);
    res.add("end", end);

    final String[] othersP = params.getFieldParams(f, FacetParams.FACET_RANGE_OTHER);
    if (null != othersP && 0 < othersP.length) {
        Set<FacetRangeOther> others = EnumSet.noneOf(FacetRangeOther.class);

        for (final String o : othersP) {
            others.add(FacetRangeOther.get(o));
        }

        // no matter what other values are listed, we don't do
        // anything if "none" is specified.
        if (!others.contains(FacetRangeOther.NONE)) {

            boolean all = others.contains(FacetRangeOther.ALL);
            final String startS = calc.formatValue(start);
            final String endS = calc.formatValue(end);

            if (all || others.contains(FacetRangeOther.BEFORE)) {
                // include upper bound if "outer" or if first gap doesn't already include it
                res.add(FacetRangeOther.BEFORE.toString(),
                        rangeCount(sf, null, startS, false,
                                (include.contains(FacetRangeInclude.OUTER)
                                        || (!(include.contains(FacetRangeInclude.LOWER)
                                                || include.contains(FacetRangeInclude.EDGE))))));

            }
            if (all || others.contains(FacetRangeOther.AFTER)) {
                // include lower bound if "outer" or if last gap doesn't already include it
                res.add(FacetRangeOther.AFTER.toString(),
                        rangeCount(sf, endS, null,
                                (include.contains(FacetRangeInclude.OUTER)
                                        || (!(include.contains(FacetRangeInclude.UPPER)
                                                || include.contains(FacetRangeInclude.EDGE)))),
                                false));
            }
            if (all || others.contains(FacetRangeOther.BETWEEN)) {
                res.add(FacetRangeOther.BETWEEN.toString(), rangeCount(sf, startS, endS,
                        (include.contains(FacetRangeInclude.LOWER) || include.contains(FacetRangeInclude.EDGE)),
                        (include.contains(FacetRangeInclude.UPPER)
                                || include.contains(FacetRangeInclude.EDGE))));

            }
        }
    }
    return res;
}

From source file:org.jahia.services.search.facets.SimpleJahiaJcrFacets.java

License:Open Source License

private <T extends Comparable<T>> NamedList<Object> getFacetRangeCounts(final SchemaField sf, final String f,
        final RangeEndpointCalculator<T> calc) throws IOException {
    String prefix = params.getFieldParam(f, FacetParams.FACET_PREFIX);

    final NamedList<Object> res = new SimpleOrderedMap<Object>();
    final NamedList<Object> counts = new NamedList<Object>();
    res.add("counts", counts);

    final T start = calc.getValue(required.getFieldParam(f, FacetParams.FACET_RANGE_START));
    // not final, hardend may change this
    T end = calc.getValue(required.getFieldParam(f, FacetParams.FACET_RANGE_END));
    if (end.compareTo(start) < 0) {
        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                "range facet 'end' comes before 'start': " + end + " < " + start);
    }/*from ww w.j a v a2  s . co  m*/

    final String gap = required.getFieldParam(f, FacetParams.FACET_RANGE_GAP);
    // explicitly return the gap.  compute this early so we are more 
    // likely to catch parse errors before attempting math
    res.add("gap", calc.getGap(gap));

    final int minCount = params.getFieldInt(f, FacetParams.FACET_MINCOUNT, 0);

    final EnumSet<FacetRangeInclude> include = FacetRangeInclude
            .parseParam(params.getFieldParams(f, FacetParams.FACET_RANGE_INCLUDE));

    T low = start;

    while (low.compareTo(end) < 0) {
        T high = calc.addGap(low, gap);
        if (end.compareTo(high) < 0) {
            if (params.getFieldBool(f, FacetParams.FACET_RANGE_HARD_END, false)) {
                high = end;
            } else {
                end = high;
            }
        }
        if (high.compareTo(low) < 0) {
            throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                    "range facet infinite loop (is gap negative? did the math overflow?)");
        }

        final boolean includeLower = (include.contains(FacetRangeInclude.LOWER)
                || (include.contains(FacetRangeInclude.EDGE) && 0 == low.compareTo(start)));
        final boolean includeUpper = (include.contains(FacetRangeInclude.UPPER)
                || (include.contains(FacetRangeInclude.EDGE) && 0 == high.compareTo(end)));

        final String lowS = calc.formatValue(low);
        final String highS = calc.formatValue(high);

        Query rangeQ = getRangeQuery(sf.getType(), null, sf, prefix, lowS, highS, includeLower, includeUpper);
        final int count = rangeCount(rangeQ);
        if (count >= minCount) {
            counts.add(lowS + PROPNAME_INDEX_SEPARATOR + rangeQ.toString(), count);
        }

        low = high;
    }

    // explicitly return the start and end so all the counts 
    // (including before/after/between) are meaningful - even if mincount
    // has removed the neighboring ranges
    res.add("start", start);
    res.add("end", end);

    final String[] othersP = params.getFieldParams(f, FacetParams.FACET_RANGE_OTHER);
    if (null != othersP && 0 < othersP.length) {
        Set<FacetRangeOther> others = EnumSet.noneOf(FacetRangeOther.class);

        for (final String o : othersP) {
            others.add(FacetRangeOther.get(o));
        }

        // no matter what other values are listed, we don't do
        // anything if "none" is specified.
        if (!others.contains(FacetRangeOther.NONE)) {

            boolean all = others.contains(FacetRangeOther.ALL);
            final String startS = calc.formatValue(start);
            final String endS = calc.formatValue(end);

            if (all || others.contains(FacetRangeOther.BEFORE)) {
                // include upper bound if "outer" or if first gap doesn't already include it
                Query rangeQ = getRangeQuery(sf.getType(), null, sf, prefix, null, startS, false,
                        (include.contains(FacetRangeInclude.OUTER)
                                || (!(include.contains(FacetRangeInclude.LOWER)
                                        || include.contains(FacetRangeInclude.EDGE)))));
                int count = rangeCount(rangeQ);
                if (count >= minCount) {
                    res.add(FacetRangeOther.BEFORE.toString(), count);
                    counts.add(FacetRangeOther.BEFORE.toString() + PROPNAME_INDEX_SEPARATOR + rangeQ.toString(),
                            count);
                }
            }
            if (all || others.contains(FacetRangeOther.AFTER)) {
                // include lower bound if "outer" or if last gap doesn't already include it
                Query rangeQ = getRangeQuery(sf.getType(), null, sf, prefix, endS, null,
                        (include.contains(FacetRangeInclude.OUTER)
                                || (!(include.contains(FacetRangeInclude.UPPER)
                                        || include.contains(FacetRangeInclude.EDGE)))),
                        false);
                int count = rangeCount(rangeQ);
                if (count >= minCount) {
                    res.add(FacetRangeOther.AFTER.toString(), count);
                    counts.add(FacetRangeOther.AFTER.toString() + PROPNAME_INDEX_SEPARATOR + rangeQ.toString(),
                            count);
                }
            }
            if (all || others.contains(FacetRangeOther.BETWEEN)) {
                Query rangeQ = getRangeQuery(sf.getType(), null, sf, prefix, startS, endS,
                        (include.contains(FacetRangeInclude.LOWER) || include.contains(FacetRangeInclude.EDGE)),
                        (include.contains(FacetRangeInclude.UPPER)
                                || include.contains(FacetRangeInclude.EDGE)));
                int count = rangeCount(rangeQ);
                if (count >= minCount) {
                    res.add(FacetRangeOther.BETWEEN.toString(), count);
                    counts.add(
                            FacetRangeOther.BETWEEN.toString() + PROPNAME_INDEX_SEPARATOR + rangeQ.toString(),
                            count);
                }
            }
        }
    }
    return res;
}

From source file:org.springframework.data.solr.core.query.FacetOptionsTests.java

License:Apache License

@Test // DATSOLR-86
public void testDateRangeFacetAccessors() {
    Date start = new Date(100);
    Date end = new Date(10000000);
    String gap = "+1DAY";
    boolean hardEnd = true;
    FacetRangeInclude include = FacetRangeInclude.LOWER;
    FacetRangeOther other = FacetRangeOther.BEFORE;

    FieldWithDateRangeParameters dateRangeField = new FieldWithDateRangeParameters( //
            "name", //
            start, //
            end, //
            gap//
    )///*from   w  w w .j  a v a 2  s.  c o m*/
            .setHardEnd(hardEnd) //
            .setInclude(include) //
            .setOther(other);

    Assert.assertEquals("name", dateRangeField.getName());
    Assert.assertEquals(start, dateRangeField.getStart());
    Assert.assertEquals(end, dateRangeField.getEnd());
    Assert.assertEquals(gap, dateRangeField.getGap());
    Assert.assertEquals(hardEnd, dateRangeField.getHardEnd());
    Assert.assertEquals(include, dateRangeField.getInclude());
    Assert.assertEquals(other, dateRangeField.getOther());

    Assert.assertEquals(start, dateRangeField.getQueryParameter(FacetParams.FACET_RANGE_START).getValue());
    Assert.assertEquals(end, dateRangeField.getQueryParameter(FacetParams.FACET_RANGE_END).getValue());
    Assert.assertEquals(gap, dateRangeField.getQueryParameter(FacetParams.FACET_RANGE_GAP).getValue());
    Assert.assertEquals(hardEnd, dateRangeField.getQueryParameter(FacetParams.FACET_RANGE_HARD_END).getValue());
    Assert.assertEquals(include, dateRangeField.getQueryParameter(FacetParams.FACET_RANGE_INCLUDE).getValue());
    Assert.assertEquals(other, dateRangeField.getQueryParameter(FacetParams.FACET_RANGE_OTHER).getValue());
}

From source file:org.springframework.data.solr.core.query.FacetOptionsTests.java

License:Apache License

@Test // DATSOLR-86
public void testNumericRangeFacetAccessors() {
    int start = 100;
    int end = 10000000;
    int gap = 200;
    boolean hardEnd = true;
    FacetRangeInclude include = FacetRangeInclude.LOWER;
    FacetRangeOther other = FacetRangeOther.BEFORE;

    FieldWithNumericRangeParameters numRangeField = new FieldWithNumericRangeParameters( //
            "name", //
            start, //
            end, //
            gap //
    )///*from   w w  w .ja  va2  s .c  om*/
            .setHardEnd(hardEnd) //
            .setInclude(include) //
            .setOther(other);

    Assert.assertEquals("name", numRangeField.getName());
    Assert.assertEquals(start, numRangeField.getStart());
    Assert.assertEquals(end, numRangeField.getEnd());
    Assert.assertEquals(gap, numRangeField.getGap());
    Assert.assertEquals(hardEnd, numRangeField.getHardEnd());
    Assert.assertEquals(include, numRangeField.getInclude());
    Assert.assertEquals(other, numRangeField.getOther());

    Assert.assertEquals(start, numRangeField.getQueryParameter(FacetParams.FACET_RANGE_START).getValue());
    Assert.assertEquals(end, numRangeField.getQueryParameter(FacetParams.FACET_RANGE_END).getValue());
    Assert.assertEquals(gap, numRangeField.getQueryParameter(FacetParams.FACET_RANGE_GAP).getValue());
    Assert.assertEquals(hardEnd, numRangeField.getQueryParameter(FacetParams.FACET_RANGE_HARD_END).getValue());
    Assert.assertEquals(include, numRangeField.getQueryParameter(FacetParams.FACET_RANGE_INCLUDE).getValue());
    Assert.assertEquals(other, numRangeField.getQueryParameter(FacetParams.FACET_RANGE_OTHER).getValue());
}

From source file:org.springframework.data.solr.core.query.FacetOptionsTests.java

License:Apache License

@Test // DATSOLR-86
public void testDateRangeFacetAccessorsAfterNullSet() {
    FieldWithDateRangeParameters dateRangeField = new FieldWithDateRangeParameters( //
            "name", //
            new Date(100), //
            new Date(10000000), //
            "+1DAY"//
    )///*  w ww . j  ava 2 s  .  c  om*/
            .setHardEnd(true) //
            .setInclude(FacetRangeInclude.LOWER) //
            .setOther(FacetRangeOther.BEFORE);

    dateRangeField.setHardEnd(null);
    dateRangeField.setInclude(null);
    dateRangeField.setOther(null);

    Assert.assertNull(dateRangeField.getQueryParameter(FacetParams.FACET_RANGE_HARD_END));
    Assert.assertNull(dateRangeField.getQueryParameter(FacetParams.FACET_RANGE_INCLUDE));
    Assert.assertNull(dateRangeField.getQueryParameter(FacetParams.FACET_RANGE_OTHER));
}

From source file:org.springframework.data.solr.core.query.FacetOptionsTests.java

License:Apache License

@Test // DATSOLR-86
public void testNumericRangeFacetAccessorsAfterNullSet() {
    FieldWithNumericRangeParameters numRangeField = new FieldWithNumericRangeParameters( //
            "name", //
            100, //
            10000000, //
            200 //
    )///*from w  ww. j av  a  2s. co m*/
            .setHardEnd(true) //
            .setInclude(FacetRangeInclude.LOWER) //
            .setOther(FacetRangeOther.BEFORE);

    numRangeField.setHardEnd(null);
    numRangeField.setInclude(null);
    numRangeField.setOther(null);

    Assert.assertNull(numRangeField.getQueryParameter(FacetParams.FACET_RANGE_HARD_END));
    Assert.assertNull(numRangeField.getQueryParameter(FacetParams.FACET_RANGE_INCLUDE));
    Assert.assertNull(numRangeField.getQueryParameter(FacetParams.FACET_RANGE_OTHER));
}