From 4eff9c9b5e5187eb1b1600370d19841a5553c33c Mon Sep 17 00:00:00 2001 From: Munendra S N Date: Tue, 4 Feb 2020 21:26:40 +0530 Subject: [PATCH] SOLR-10567: add support for DateRangeField in JSON facet range --- solr/CHANGES.txt | 2 + .../apache/solr/search/facet/FacetRange.java | 10 +++- .../solr/collection1/conf/schema_latest.xml | 4 ++ .../solr/search/facet/TestJsonFacets.java | 56 +++++++++++++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 7fc4e1d8246..745401a349a 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -207,6 +207,8 @@ Improvements * SOLR-14221: Upgrade restlet to version 2.4.0 (janhoy) +* SOLR-10567: Add Support for DateRangeField in JSON Facet range (Stephen Weiss, Munendra S N) + Optimizations --------------------- diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java b/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java index 5aaa0391500..a74f35dea89 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java +++ b/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java @@ -32,6 +32,7 @@ import org.apache.solr.common.params.FacetParams.FacetRangeOther; import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.schema.CurrencyFieldType; import org.apache.solr.schema.CurrencyValue; +import org.apache.solr.schema.DateRangeField; import org.apache.solr.schema.ExchangeRateProvider; import org.apache.solr.schema.FieldType; import org.apache.solr.schema.SchemaField; @@ -249,6 +250,8 @@ class FacetRangeProcessor extends FacetProcessor { } } else if (ft instanceof CurrencyFieldType) { return new CurrencyCalc(sf); + } else if (ft instanceof DateRangeField) { + return new DateCalc(sf, null); } // if we made it this far, we have no idea what it is... @@ -737,6 +740,7 @@ class FacetRangeProcessor extends FacetProcessor { return ((Number) value).floatValue() + Float.parseFloat(gap); } } + private static class DoubleCalc extends Calc { @Override public Comparable bitsToValue(long bits) { @@ -762,6 +766,7 @@ class FacetRangeProcessor extends FacetProcessor { return ((Number) value).doubleValue() + Double.parseDouble(gap); } } + private static class IntCalc extends Calc { public IntCalc(final SchemaField f) { super(f); } @@ -778,6 +783,7 @@ class FacetRangeProcessor extends FacetProcessor { return ((Number) value).intValue() + Integer.parseInt(gap); } } + private static class LongCalc extends Calc { public LongCalc(final SchemaField f) { super(f); } @@ -790,13 +796,15 @@ class FacetRangeProcessor extends FacetProcessor { return ((Number) value).longValue() + Long.parseLong(gap); } } + private static class DateCalc extends Calc { private final Date now; public DateCalc(final SchemaField f, final Date now) { super(f); this.now = now; - if (! (field.getType() instanceof TrieDateField) && !(field.getType().isPointField()) ) { + if (!(field.getType() instanceof TrieDateField || field.getType().isPointField() || + field.getType() instanceof DateRangeField)) { throw new IllegalArgumentException("SchemaField must use field type extending TrieDateField, DateRangeField or PointField"); } } diff --git a/solr/core/src/test-files/solr/collection1/conf/schema_latest.xml b/solr/core/src/test-files/solr/collection1/conf/schema_latest.xml index 78d57660a04..af445bc67ed 100644 --- a/solr/core/src/test-files/solr/collection1/conf/schema_latest.xml +++ b/solr/core/src/test-files/solr/collection1/conf/schema_latest.xml @@ -226,6 +226,9 @@ + + + @@ -437,6 +440,7 @@ + diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java index ed566e32e70..73bbfe30876 100644 --- a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java +++ b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java @@ -3463,6 +3463,62 @@ public class TestJsonFacets extends SolrTestCaseHS { "facets=={count:6, price:{buckets:[{val:\"[*,*]\",count:5}]}}"); } + @Test + public void testDateFacets() throws Exception { + Client client = Client.localClient(); + client.deleteByQuery("*:*", null); + boolean multiValue = random().nextBoolean(); + String dateField = multiValue? "b_dts": "b_dt"; + String dateRange = multiValue? "b_drfs": "b_drf"; + + client.add(sdoc("id", "1", "cat_s", "A", dateField, "2014-03-15T12:00:00Z", + dateRange, "2014-03-15T12:00:00Z"), null); + client.add(sdoc("id", "2", "cat_s", "B", dateField, "2015-01-03T00:00:00Z", + dateRange, "2015-01-03T00:00:00Z"), null); + client.add(sdoc("id", "3"), null); + client.commit(); + client.add(sdoc("id", "4", "cat_s", "A", dateField, "2014-03-15T12:00:00Z", + dateRange, "2014-03-15T12:00:00Z"), null); + client.add(sdoc("id", "5", "cat_s", "B", dateField, "2015-01-03T00:00:00Z", + dateRange, "2015-01-03T00:00:00Z"),null); + client.commit(); + client.add(sdoc("id", "6", "cat_s", "B", dateField, "2014-03-15T12:00:00Z", + dateRange, "2014-03-15T12:00:00Z"),null); + client.commit(); + + SolrParams p = params("q", "*:*", "rows", "0"); + for (String s : new String[]{dateField, dateRange}) { + client.testJQ(params(p, "json.facet" + , "{date:{type : range, mincount:1, field :" + s + + ",start:'2013-11-01T00:00:00Z',end:NOW,gap:'+90DAY'}}"), + "facets=={count:6, date:{buckets:" + + "[{val:\"2014-01-30T00:00:00Z\",count:3}, {val:\"2014-10-27T00:00:00Z\",count:2}]" + + "}}"); + + // with ranges + client.testJQ(params(p, "json.facet" + , "{date:{type : range, mincount:1, field :" + s + + ",ranges:[{from:'2013-11-01T00:00:00Z', to:'2014-04-30T00:00:00Z'}," + + "{from:'2015-01-01T00:00:00Z', to:'2020-01-30T00:00:00Z'}]}}"), + "facets=={count:6, date:{buckets:" + + "[{val:\"[2013-11-01T00:00:00Z,2014-04-30T00:00:00Z)\",count:3}," + + " {val:\"[2015-01-01T00:00:00Z,2020-01-30T00:00:00Z)\",count:2}]" + + "}}"); + } + + client.add(sdoc("id", "7", "cat_s", "B", dateRange, "[2010 TO 2014-05-21]"),null); + client.commit(); + client.testJQ(params(p, "json.facet" + , "{date:{type : range, other:'before', field :" + dateRange + + ",start:'2011-11-01T00:00:00Z',end:'2016-01-30T00:00:00Z',gap:'+1YEAR'}}"), + "facets=={count:7, date:{buckets:[" + + "{val:\"2011-11-01T00:00:00Z\",count:1}, {val:\"2012-11-01T00:00:00Z\",count:1}," + + "{val:\"2013-11-01T00:00:00Z\",count:4}, {val:\"2014-11-01T00:00:00Z\",count:2}," + + "{val:\"2015-11-01T00:00:00Z\",count:0}" + + "],before:{count:1}" + + "}}"); + } + @Test public void testRangeFacetWithRangesInNewFormat() throws Exception { Client client = Client.localClient();