Date Histogram Facet: Add quarter as an interval, closes #1884.

This commit is contained in:
Shay Banon 2012-04-24 19:04:09 +03:00
parent a96391224a
commit a4fb33dbc3
3 changed files with 44 additions and 1 deletions

View File

@ -20,7 +20,10 @@
package org.elasticsearch.common.joda;
import org.elasticsearch.common.Strings;
import org.joda.time.DateTimeZone;
import org.joda.time.*;
import org.joda.time.field.DividedDateTimeField;
import org.joda.time.field.OffsetDateTimeField;
import org.joda.time.field.ScaledDurationField;
import org.joda.time.format.*;
/**
@ -132,4 +135,29 @@ public class Joda {
}
return new FormatDateTimeFormatter(input, formatter.withZone(DateTimeZone.UTC));
}
public static final DurationFieldType Quarters = new DurationFieldType("quarters") {
private static final long serialVersionUID = -8167713675442491871L;
public DurationField getField(Chronology chronology) {
return new ScaledDurationField(chronology.months(), Quarters, 3);
}
};
public static final DateTimeFieldType QuarterOfYear = new DateTimeFieldType("quarterOfYear") {
private static final long serialVersionUID = -5677872459807379123L;
public DurationFieldType getDurationType() {
return Quarters;
}
public DurationFieldType getRangeDurationType() {
return DurationFieldType.years();
}
public DateTimeField getField(Chronology chronology) {
return new OffsetDateTimeField(new DividedDateTimeField(new OffsetDateTimeField(chronology.monthOfYear(), -1), QuarterOfYear, 3), 1);
}
};
}

View File

@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableMap;
import org.elasticsearch.common.collect.MapBuilder;
import org.elasticsearch.common.component.AbstractComponent;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.joda.Joda;
import org.elasticsearch.common.joda.TimeZoneRounding;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
@ -58,6 +59,7 @@ public class DateHistogramFacetProcessor extends AbstractComponent implements Fa
dateFieldParsers = MapBuilder.<String, DateFieldParser>newMapBuilder()
.put("year", new DateFieldParser.YearOfCentury())
.put("1y", new DateFieldParser.YearOfCentury())
.put("quarter", new DateFieldParser.Quarter())
.put("month", new DateFieldParser.MonthOfYear())
.put("1m", new DateFieldParser.MonthOfYear())
.put("week", new DateFieldParser.WeekOfWeekyear())
@ -227,6 +229,13 @@ public class DateHistogramFacetProcessor extends AbstractComponent implements Fa
}
}
static class Quarter implements DateFieldParser {
@Override
public DateTimeField parse(Chronology chronology) {
return Joda.QuarterOfYear.getField(chronology);
}
}
static class MonthOfYear implements DateFieldParser {
@Override
public DateTimeField parse(Chronology chronology) {

View File

@ -1403,6 +1403,7 @@ public class SimpleFacetsTests extends AbstractNodesTests {
.addFacet(dateHistogramFacet("stats4").field("date").valueScript("doc['num'].value * 2").interval("day").preZone("-02:00"))
.addFacet(dateHistogramFacet("stats5").field("date").interval("24h"))
.addFacet(dateHistogramFacet("stats6").field("date").valueField("num").interval("day").preZone("-02:00").postZone("-02:00"))
.addFacet(dateHistogramFacet("stats7").field("date").interval("quarter"))
.execute().actionGet();
if (searchResponse.failedShards() > 0) {
@ -1469,6 +1470,11 @@ public class SimpleFacetsTests extends AbstractNodesTests {
assertThat(facet.entries().get(1).time(), equalTo(utcTimeInMillis("2009-03-05") - TimeValue.timeValueHours(2).millis()));
assertThat(facet.entries().get(1).count(), equalTo(2l));
assertThat(facet.entries().get(1).total(), equalTo(5d));
facet = searchResponse.facets().facet("stats7");
assertThat(facet.name(), equalTo("stats7"));
assertThat(facet.entries().size(), equalTo(1));
assertThat(facet.entries().get(0).time(), equalTo(utcTimeInMillis("2009-01-01")));
}
}