diff --git a/src/main/java/org/elasticsearch/common/rounding/TimeZoneRounding.java b/src/main/java/org/elasticsearch/common/rounding/TimeZoneRounding.java index d795013577255..1e04b5d4c4a6a 100644 --- a/src/main/java/org/elasticsearch/common/rounding/TimeZoneRounding.java +++ b/src/main/java/org/elasticsearch/common/rounding/TimeZoneRounding.java @@ -162,7 +162,7 @@ public long valueForKey(long time) { @Override public long nextRoundingValue(long value) { - return unit.field().roundCeiling(value + 1); + return unit.field().getDurationField().add(value, 1); } @Override @@ -210,7 +210,7 @@ public long valueForKey(long key) { @Override public long nextRoundingValue(long value) { - return unit.field().roundCeiling(value + 1); + return unit.field().getDurationField().add(value, 1); } @Override @@ -262,7 +262,7 @@ public long valueForKey(long time) { @Override public long nextRoundingValue(long value) { - return unit.field().getDurationField().getUnitMillis() + value; + return unit.field().getDurationField().add(value, 1); } @Override diff --git a/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/InternalHistogram.java b/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/InternalHistogram.java index 94286b32156f9..ef39438406318 100644 --- a/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/InternalHistogram.java +++ b/src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/InternalHistogram.java @@ -320,10 +320,11 @@ public InternalAggregation reduce(ReduceContext reduceContext) { B nextBucket = list.get(iter.nextIndex()); if (lastBucket != null) { long key = emptyBucketInfo.rounding.nextRoundingValue(lastBucket.key); - while (key != nextBucket.key) { + while (key < nextBucket.key) { iter.add(createBucket(key, 0, emptyBucketInfo.subAggregations, formatter)); key = emptyBucketInfo.rounding.nextRoundingValue(key); } + assert key == nextBucket.key; } lastBucket = iter.next(); } diff --git a/src/test/java/org/elasticsearch/search/aggregations/bucket/DateHistogramTests.java b/src/test/java/org/elasticsearch/search/aggregations/bucket/DateHistogramTests.java index 2e392dfe4d017..021632fc92e99 100644 --- a/src/test/java/org/elasticsearch/search/aggregations/bucket/DateHistogramTests.java +++ b/src/test/java/org/elasticsearch/search/aggregations/bucket/DateHistogramTests.java @@ -1299,4 +1299,36 @@ public void singleValue_WithMultipleDateFormatsFromMapping() throws Exception { assertThat(bucket, Matchers.notNullValue()); assertThat(bucket.getDocCount(), equalTo(5l)); } + + public void testIssue6965() { + SearchResponse response = client().prepareSearch("idx") + .addAggregation(dateHistogram("histo").field("date").preZone("+01:00").interval(DateHistogram.Interval.MONTH).minDocCount(0)) + .execute().actionGet(); + + assertSearchResponse(response); + + + DateHistogram histo = response.getAggregations().get("histo"); + assertThat(histo, notNullValue()); + assertThat(histo.getName(), equalTo("histo")); + assertThat(histo.getBuckets().size(), equalTo(3)); + + DateTime key = new DateTime(2012, 1, 1, 0, 0, DateTimeZone.UTC); + DateHistogram.Bucket bucket = getBucket(histo, key); + assertThat(bucket, notNullValue()); + assertThat(bucket.getKeyAsNumber().longValue(), equalTo(key.getMillis())); + assertThat(bucket.getDocCount(), equalTo(1l)); + + key = new DateTime(2012, 2, 1, 0, 0, DateTimeZone.UTC); + bucket = getBucket(histo, key); + assertThat(bucket, notNullValue()); + assertThat(bucket.getKeyAsNumber().longValue(), equalTo(key.getMillis())); + assertThat(bucket.getDocCount(), equalTo(2l)); + + key = new DateTime(2012, 3, 1, 0, 0, DateTimeZone.UTC); + bucket = getBucket(histo, key); + assertThat(bucket, notNullValue()); + assertThat(bucket.getKeyAsNumber().longValue(), equalTo(key.getMillis())); + assertThat(bucket.getDocCount(), equalTo(3l)); + } }