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; package org.elasticsearch.common.joda;
import org.elasticsearch.common.Strings; 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.*; import org.joda.time.format.*;
/** /**
@ -132,4 +135,29 @@ public class Joda {
} }
return new FormatDateTimeFormatter(input, formatter.withZone(DateTimeZone.UTC)); 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.collect.MapBuilder;
import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.component.AbstractComponent;
import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.joda.Joda;
import org.elasticsearch.common.joda.TimeZoneRounding; import org.elasticsearch.common.joda.TimeZoneRounding;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
@ -58,6 +59,7 @@ public class DateHistogramFacetProcessor extends AbstractComponent implements Fa
dateFieldParsers = MapBuilder.<String, DateFieldParser>newMapBuilder() dateFieldParsers = MapBuilder.<String, DateFieldParser>newMapBuilder()
.put("year", new DateFieldParser.YearOfCentury()) .put("year", new DateFieldParser.YearOfCentury())
.put("1y", new DateFieldParser.YearOfCentury()) .put("1y", new DateFieldParser.YearOfCentury())
.put("quarter", new DateFieldParser.Quarter())
.put("month", new DateFieldParser.MonthOfYear()) .put("month", new DateFieldParser.MonthOfYear())
.put("1m", new DateFieldParser.MonthOfYear()) .put("1m", new DateFieldParser.MonthOfYear())
.put("week", new DateFieldParser.WeekOfWeekyear()) .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 { static class MonthOfYear implements DateFieldParser {
@Override @Override
public DateTimeField parse(Chronology chronology) { 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("stats4").field("date").valueScript("doc['num'].value * 2").interval("day").preZone("-02:00"))
.addFacet(dateHistogramFacet("stats5").field("date").interval("24h")) .addFacet(dateHistogramFacet("stats5").field("date").interval("24h"))
.addFacet(dateHistogramFacet("stats6").field("date").valueField("num").interval("day").preZone("-02:00").postZone("-02:00")) .addFacet(dateHistogramFacet("stats6").field("date").valueField("num").interval("day").preZone("-02:00").postZone("-02:00"))
.addFacet(dateHistogramFacet("stats7").field("date").interval("quarter"))
.execute().actionGet(); .execute().actionGet();
if (searchResponse.failedShards() > 0) { 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).time(), equalTo(utcTimeInMillis("2009-03-05") - TimeValue.timeValueHours(2).millis()));
assertThat(facet.entries().get(1).count(), equalTo(2l)); assertThat(facet.entries().get(1).count(), equalTo(2l));
assertThat(facet.entries().get(1).total(), equalTo(5d)); 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")));
} }
} }