瀏覽代碼

Added missing support for min_doc_count in DateHistogramBuilder

Closes: #4848
uboness 11 年之前
父節點
當前提交
e9b41c92a4

+ 10 - 0
src/main/java/org/elasticsearch/search/aggregations/bucket/histogram/DateHistogramBuilder.java

@@ -33,6 +33,7 @@ public class DateHistogramBuilder extends ValuesSourceAggregationBuilder<DateHis
 
     private Object interval;
     private HistogramBase.Order order;
+    private Long minDocCount;
     private String preZone;
     private String postZone;
     private boolean preZoneAdjustLargeInterval;
@@ -59,6 +60,11 @@ public class DateHistogramBuilder extends ValuesSourceAggregationBuilder<DateHis
         return this;
     }
 
+    public DateHistogramBuilder minDocCount(long minDocCount) {
+        this.minDocCount = minDocCount;
+        return this;
+    }
+
     public DateHistogramBuilder preZone(String preZone) {
         this.preZone = preZone;
         return this;
@@ -99,6 +105,10 @@ public class DateHistogramBuilder extends ValuesSourceAggregationBuilder<DateHis
         }
         builder.field("interval", interval);
 
+        if (minDocCount != null) {
+            builder.field("min_doc_count", minDocCount);
+        }
+
         if (order != null) {
             builder.field("order");
             order.toXContent(builder, params);

+ 62 - 3
src/test/java/org/elasticsearch/search/aggregations/bucket/MinDocCountTests.java

@@ -29,10 +29,13 @@ import org.elasticsearch.common.settings.ImmutableSettings;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogram;
 import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
 import org.elasticsearch.search.aggregations.bucket.terms.Terms;
 import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
 import org.elasticsearch.test.ElasticsearchIntegrationTest;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
 import org.junit.Before;
 
 import java.util.*;
@@ -40,8 +43,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
-import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
-import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
+import static org.elasticsearch.search.aggregations.AggregationBuilders.*;
 
 public class MinDocCountTests extends ElasticsearchIntegrationTest {
 
@@ -65,6 +67,7 @@ public class MinDocCountTests extends ElasticsearchIntegrationTest {
         final List<IndexRequestBuilder> indexRequests = new ArrayList<IndexRequestBuilder>();
         final Set<String> stringTerms = new HashSet<String>();
         final LongSet longTerms = new LongOpenHashSet();
+        final Set<String> dateTerms = new HashSet<String>();
         for (int i = 0; i < cardinality; ++i) {
             String stringTerm;
             do {
@@ -75,9 +78,17 @@ public class MinDocCountTests extends ElasticsearchIntegrationTest {
                 longTerm = randomInt(cardinality * 2);
             } while (!longTerms.add(longTerm));
             double doubleTerm = longTerm * Math.PI;
+            String dateTerm = DateTimeFormat.forPattern("yyyy-MM-dd").print(new DateTime(2014, 1, ((int) longTerm % 20) + 1, 0, 0));
             final int frequency = randomBoolean() ? 1 : randomIntBetween(2, 20);
             for (int j = 0; j < frequency; ++j) {
-                indexRequests.add(client().prepareIndex("idx", "type").setSource(jsonBuilder().startObject().field("s", stringTerm).field("l", longTerm).field("d", doubleTerm).field("match", randomBoolean()).endObject()));
+                indexRequests.add(client().prepareIndex("idx", "type").setSource(jsonBuilder()
+                        .startObject()
+                        .field("s", stringTerm)
+                        .field("l", longTerm)
+                        .field("d", doubleTerm)
+                        .field("date", dateTerm)
+                        .field("match", randomBoolean())
+                        .endObject()));
             }
         }
         cardinality = stringTerms.size();
@@ -134,6 +145,17 @@ public class MinDocCountTests extends ElasticsearchIntegrationTest {
         }
     }
 
+    private void assertSubset(DateHistogram histo1, DateHistogram histo2, long minDocCount) {
+        final Iterator<DateHistogram.Bucket> it2 = histo2.iterator();
+        for (DateHistogram.Bucket b1 : histo1) {
+            if (b1.getDocCount() >= minDocCount) {
+                final DateHistogram.Bucket b2 = it2.next();
+                assertEquals(b1.getKey(), b2.getKey());
+                assertEquals(b1.getDocCount(), b2.getDocCount());
+            }
+        }
+    }
+
     public void testStringTermAsc() throws Exception {
         testMinDocCountOnTerms("s", Script.NO, Terms.Order.term(true));
     }
@@ -298,6 +320,22 @@ public class MinDocCountTests extends ElasticsearchIntegrationTest {
         testMinDocCountOnHistogram(Histogram.Order.KEY_DESC);
     }
 
+    public void testDateHistogramCountAsc() throws Exception {
+        testMinDocCountOnDateHistogram(Histogram.Order.COUNT_ASC);
+    }
+
+    public void testDateHistogramCountDesc() throws Exception {
+        testMinDocCountOnDateHistogram(Histogram.Order.COUNT_DESC);
+    }
+
+    public void testDateHistogramKeyAsc() throws Exception {
+        testMinDocCountOnDateHistogram(Histogram.Order.KEY_ASC);
+    }
+
+    public void testDateHistogramKeyDesc() throws Exception {
+        testMinDocCountOnDateHistogram(Histogram.Order.KEY_DESC);
+    }
+
     private void testMinDocCountOnHistogram(Histogram.Order order) throws Exception {
         final int interval = randomIntBetween(1, 3);
         final SearchResponse allResponse = client().prepareSearch("idx").setTypes("type")
@@ -319,4 +357,25 @@ public class MinDocCountTests extends ElasticsearchIntegrationTest {
 
     }
 
+    private void testMinDocCountOnDateHistogram(Histogram.Order order) throws Exception {
+        final int interval = randomIntBetween(1, 3);
+        final SearchResponse allResponse = client().prepareSearch("idx").setTypes("type")
+                .setSearchType(SearchType.COUNT)
+                .setQuery(QUERY)
+                .addAggregation(dateHistogram("histo").field("date").interval(DateHistogram.Interval.DAY).order(order).minDocCount(0))
+                .execute().actionGet();
+
+        final DateHistogram allHisto = allResponse.getAggregations().get("histo");
+
+        for (long minDocCount = 0; minDocCount < 50; ++minDocCount) {
+            final SearchResponse response = client().prepareSearch("idx").setTypes("type")
+                    .setSearchType(SearchType.COUNT)
+                    .setQuery(QUERY)
+                    .addAggregation(dateHistogram("histo").field("date").interval(DateHistogram.Interval.DAY).order(order).minDocCount(minDocCount))
+                    .execute().actionGet();
+            assertSubset(allHisto, (DateHistogram) response.getAggregations().get("histo"), minDocCount);
+        }
+
+    }
+
 }