mirror of https://github.com/apache/lucene.git
SOLR-10567: add support for DateRangeField in JSON facet range
This commit is contained in:
parent
4a002411fc
commit
5a3a05d953
|
@ -125,6 +125,8 @@ Improvements
|
||||||
|
|
||||||
* SOLR-14221: Upgrade restlet to version 2.4.0 (janhoy)
|
* 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
|
Optimizations
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.apache.solr.common.params.FacetParams.FacetRangeOther;
|
||||||
import org.apache.solr.common.util.SimpleOrderedMap;
|
import org.apache.solr.common.util.SimpleOrderedMap;
|
||||||
import org.apache.solr.schema.CurrencyFieldType;
|
import org.apache.solr.schema.CurrencyFieldType;
|
||||||
import org.apache.solr.schema.CurrencyValue;
|
import org.apache.solr.schema.CurrencyValue;
|
||||||
|
import org.apache.solr.schema.DateRangeField;
|
||||||
import org.apache.solr.schema.ExchangeRateProvider;
|
import org.apache.solr.schema.ExchangeRateProvider;
|
||||||
import org.apache.solr.schema.FieldType;
|
import org.apache.solr.schema.FieldType;
|
||||||
import org.apache.solr.schema.SchemaField;
|
import org.apache.solr.schema.SchemaField;
|
||||||
|
@ -249,6 +250,8 @@ class FacetRangeProcessor extends FacetProcessor<FacetRange> {
|
||||||
}
|
}
|
||||||
} else if (ft instanceof CurrencyFieldType) {
|
} else if (ft instanceof CurrencyFieldType) {
|
||||||
return new CurrencyCalc(sf);
|
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...
|
// if we made it this far, we have no idea what it is...
|
||||||
|
@ -737,6 +740,7 @@ class FacetRangeProcessor extends FacetProcessor<FacetRange> {
|
||||||
return ((Number) value).floatValue() + Float.parseFloat(gap);
|
return ((Number) value).floatValue() + Float.parseFloat(gap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class DoubleCalc extends Calc {
|
private static class DoubleCalc extends Calc {
|
||||||
@Override
|
@Override
|
||||||
public Comparable bitsToValue(long bits) {
|
public Comparable bitsToValue(long bits) {
|
||||||
|
@ -762,6 +766,7 @@ class FacetRangeProcessor extends FacetProcessor<FacetRange> {
|
||||||
return ((Number) value).doubleValue() + Double.parseDouble(gap);
|
return ((Number) value).doubleValue() + Double.parseDouble(gap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class IntCalc extends Calc {
|
private static class IntCalc extends Calc {
|
||||||
|
|
||||||
public IntCalc(final SchemaField f) { super(f); }
|
public IntCalc(final SchemaField f) { super(f); }
|
||||||
|
@ -778,6 +783,7 @@ class FacetRangeProcessor extends FacetProcessor<FacetRange> {
|
||||||
return ((Number) value).intValue() + Integer.parseInt(gap);
|
return ((Number) value).intValue() + Integer.parseInt(gap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class LongCalc extends Calc {
|
private static class LongCalc extends Calc {
|
||||||
|
|
||||||
public LongCalc(final SchemaField f) { super(f); }
|
public LongCalc(final SchemaField f) { super(f); }
|
||||||
|
@ -790,13 +796,15 @@ class FacetRangeProcessor extends FacetProcessor<FacetRange> {
|
||||||
return ((Number) value).longValue() + Long.parseLong(gap);
|
return ((Number) value).longValue() + Long.parseLong(gap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class DateCalc extends Calc {
|
private static class DateCalc extends Calc {
|
||||||
private final Date now;
|
private final Date now;
|
||||||
public DateCalc(final SchemaField f,
|
public DateCalc(final SchemaField f,
|
||||||
final Date now) {
|
final Date now) {
|
||||||
super(f);
|
super(f);
|
||||||
this.now = now;
|
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");
|
throw new IllegalArgumentException("SchemaField must use field type extending TrieDateField, DateRangeField or PointField");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,6 +226,9 @@
|
||||||
<dynamicField name="*_dtd" type="date" indexed="true" stored="false" docValues="true"/>
|
<dynamicField name="*_dtd" type="date" indexed="true" stored="false" docValues="true"/>
|
||||||
<dynamicField name="*_dtds" type="date" indexed="true" stored="false" multiValued="true" docValues="true"/>
|
<dynamicField name="*_dtds" type="date" indexed="true" stored="false" multiValued="true" docValues="true"/>
|
||||||
|
|
||||||
|
<dynamicField name="*_drf" type="dateRange" indexed="true" stored="true"/>
|
||||||
|
<dynamicField name="*_drfs" type="dateRange" indexed="true" multiValued="true" stored="true"/>
|
||||||
|
|
||||||
<!-- docvalues and stored (S suffix) -->
|
<!-- docvalues and stored (S suffix) -->
|
||||||
<dynamicField name="*_idS" type="int" indexed="true" stored="true" docValues="true"/>
|
<dynamicField name="*_idS" type="int" indexed="true" stored="true" docValues="true"/>
|
||||||
<dynamicField name="*_idsS" type="int" indexed="true" stored="true" multiValued="true" docValues="true"/>
|
<dynamicField name="*_idsS" type="int" indexed="true" stored="true" multiValued="true" docValues="true"/>
|
||||||
|
@ -437,6 +440,7 @@
|
||||||
<!-- A Trie based date field for faster date range queries and date faceting. -->
|
<!-- A Trie based date field for faster date range queries and date faceting. -->
|
||||||
<fieldType name="tdate" class="${solr.tests.DateFieldType}" precisionStep="6" positionIncrementGap="0"/>
|
<fieldType name="tdate" class="${solr.tests.DateFieldType}" precisionStep="6" positionIncrementGap="0"/>
|
||||||
|
|
||||||
|
<fieldType name="dateRange" class="solr.DateRangeField"/>
|
||||||
|
|
||||||
<!--Binary data type. The data should be sent/retrieved in as Base64 encoded Strings -->
|
<!--Binary data type. The data should be sent/retrieved in as Base64 encoded Strings -->
|
||||||
<fieldtype name="binary" class="solr.BinaryField"/>
|
<fieldtype name="binary" class="solr.BinaryField"/>
|
||||||
|
|
|
@ -3463,6 +3463,62 @@ public class TestJsonFacets extends SolrTestCaseHS {
|
||||||
"facets=={count:6, price:{buckets:[{val:\"[*,*]\",count:5}]}}");
|
"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
|
@Test
|
||||||
public void testRangeFacetWithRangesInNewFormat() throws Exception {
|
public void testRangeFacetWithRangesInNewFormat() throws Exception {
|
||||||
Client client = Client.localClient();
|
Client client = Client.localClient();
|
||||||
|
|
Loading…
Reference in New Issue