|
@@ -136,12 +136,25 @@ public class CompositeAggregatorTests extends AggregatorTestCase {
|
|
|
IndexSearcher searcher = new IndexSearcher(new MultiReader());
|
|
|
QueryShardException exc =
|
|
|
expectThrows(QueryShardException.class, () -> createAggregatorFactory(builder, searcher));
|
|
|
- assertThat(exc.getMessage(), containsString("failed to find field [unknown] and [missing] is not provided"));
|
|
|
- // should work when missing is provided
|
|
|
- terms.missing("missing");
|
|
|
+ assertThat(exc.getMessage(), containsString("failed to find field [unknown] and [missing_bucket] is not set"));
|
|
|
+ // should work when missing_bucket is set
|
|
|
+ terms.missingBucket(true);
|
|
|
createAggregatorFactory(builder, searcher);
|
|
|
}
|
|
|
|
|
|
+ public void testMissingBucket() throws Exception {
|
|
|
+ TermsValuesSourceBuilder terms = new TermsValuesSourceBuilder(randomAlphaOfLengthBetween(5, 10))
|
|
|
+ .field("unknown")
|
|
|
+ .missingBucket(true)
|
|
|
+ .missing("MISSING");
|
|
|
+ CompositeAggregationBuilder builder = new CompositeAggregationBuilder("test", Collections.singletonList(terms));
|
|
|
+ IndexSearcher searcher = new IndexSearcher(new MultiReader());
|
|
|
+ QueryShardException exc =
|
|
|
+ expectThrows(QueryShardException.class, () -> createAggregator(builder, searcher));
|
|
|
+ assertWarnings("[missing] is deprecated. Please use [missing_bucket] instead.");
|
|
|
+ assertThat(exc.getMessage(), containsString("cannot use [missing] option in conjunction with [missing_bucket]"));
|
|
|
+ }
|
|
|
+
|
|
|
public void testWithKeyword() throws Exception {
|
|
|
final List<Map<String, List<Object>>> dataset = new ArrayList<>();
|
|
|
dataset.addAll(
|
|
@@ -187,6 +200,97 @@ public class CompositeAggregatorTests extends AggregatorTestCase {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ public void testWithKeywordAndMissingBucket() throws Exception {
|
|
|
+ final List<Map<String, List<Object>>> dataset = new ArrayList<>();
|
|
|
+ dataset.addAll(
|
|
|
+ Arrays.asList(
|
|
|
+ createDocument("keyword", "a"),
|
|
|
+ createDocument("long", 0L),
|
|
|
+ createDocument("keyword", "c"),
|
|
|
+ createDocument("keyword", "a"),
|
|
|
+ createDocument("keyword", "d"),
|
|
|
+ createDocument("keyword", "c"),
|
|
|
+ createDocument("long", 5L)
|
|
|
+ )
|
|
|
+ );
|
|
|
+
|
|
|
+ // sort ascending, null bucket is first
|
|
|
+ testSearchCase(Arrays.asList(new MatchAllDocsQuery()), dataset,
|
|
|
+ () -> {
|
|
|
+ TermsValuesSourceBuilder terms = new TermsValuesSourceBuilder("keyword")
|
|
|
+ .field("keyword")
|
|
|
+ .missingBucket(true);
|
|
|
+ return new CompositeAggregationBuilder("name", Collections.singletonList(terms));
|
|
|
+ }, (result) -> {
|
|
|
+ assertEquals(4, result.getBuckets().size());
|
|
|
+ assertEquals("{keyword=d}", result.afterKey().toString());
|
|
|
+ assertEquals("{keyword=null}", result.getBuckets().get(0).getKeyAsString());
|
|
|
+ assertEquals(2L, result.getBuckets().get(0).getDocCount());
|
|
|
+ assertEquals("{keyword=a}", result.getBuckets().get(1).getKeyAsString());
|
|
|
+ assertEquals(2L, result.getBuckets().get(1).getDocCount());
|
|
|
+ assertEquals("{keyword=c}", result.getBuckets().get(2).getKeyAsString());
|
|
|
+ assertEquals(2L, result.getBuckets().get(2).getDocCount());
|
|
|
+ assertEquals("{keyword=d}", result.getBuckets().get(3).getKeyAsString());
|
|
|
+ assertEquals(1L, result.getBuckets().get(3).getDocCount());
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ // sort descending, null bucket is last
|
|
|
+ testSearchCase(Arrays.asList(new MatchAllDocsQuery()), dataset,
|
|
|
+ () -> {
|
|
|
+ TermsValuesSourceBuilder terms = new TermsValuesSourceBuilder("keyword")
|
|
|
+ .field("keyword")
|
|
|
+ .missingBucket(true)
|
|
|
+ .order(SortOrder.DESC);
|
|
|
+ return new CompositeAggregationBuilder("name", Collections.singletonList(terms));
|
|
|
+ }, (result) -> {
|
|
|
+ assertEquals(4, result.getBuckets().size());
|
|
|
+ assertEquals("{keyword=null}", result.afterKey().toString());
|
|
|
+ assertEquals("{keyword=null}", result.getBuckets().get(3).getKeyAsString());
|
|
|
+ assertEquals(2L, result.getBuckets().get(3).getDocCount());
|
|
|
+ assertEquals("{keyword=a}", result.getBuckets().get(2).getKeyAsString());
|
|
|
+ assertEquals(2L, result.getBuckets().get(2).getDocCount());
|
|
|
+ assertEquals("{keyword=c}", result.getBuckets().get(1).getKeyAsString());
|
|
|
+ assertEquals(2L, result.getBuckets().get(1).getDocCount());
|
|
|
+ assertEquals("{keyword=d}", result.getBuckets().get(0).getKeyAsString());
|
|
|
+ assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ testSearchCase(Arrays.asList(new MatchAllDocsQuery(), new DocValuesFieldExistsQuery("keyword")), dataset,
|
|
|
+ () -> {
|
|
|
+ TermsValuesSourceBuilder terms = new TermsValuesSourceBuilder("keyword")
|
|
|
+ .field("keyword")
|
|
|
+ .missingBucket(true);
|
|
|
+ return new CompositeAggregationBuilder("name", Collections.singletonList(terms))
|
|
|
+ .aggregateAfter(Collections.singletonMap("keyword", null));
|
|
|
+ }, (result) -> {
|
|
|
+ assertEquals(3, result.getBuckets().size());
|
|
|
+ assertEquals("{keyword=d}", result.afterKey().toString());
|
|
|
+ assertEquals("{keyword=a}", result.getBuckets().get(0).getKeyAsString());
|
|
|
+ assertEquals(2L, result.getBuckets().get(0).getDocCount());
|
|
|
+ assertEquals("{keyword=c}", result.getBuckets().get(1).getKeyAsString());
|
|
|
+ assertEquals(2L, result.getBuckets().get(1).getDocCount());
|
|
|
+ assertEquals("{keyword=d}", result.getBuckets().get(2).getKeyAsString());
|
|
|
+ assertEquals(1L, result.getBuckets().get(2).getDocCount());
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ testSearchCase(Arrays.asList(new MatchAllDocsQuery(), new DocValuesFieldExistsQuery("keyword")), dataset,
|
|
|
+ () -> {
|
|
|
+ TermsValuesSourceBuilder terms = new TermsValuesSourceBuilder("keyword")
|
|
|
+ .field("keyword")
|
|
|
+ .missingBucket(true)
|
|
|
+ .order(SortOrder.DESC);
|
|
|
+ return new CompositeAggregationBuilder("name", Collections.singletonList(terms))
|
|
|
+ .aggregateAfter(Collections.singletonMap("keyword", null));
|
|
|
+ }, (result) -> {
|
|
|
+ assertEquals(0, result.getBuckets().size());
|
|
|
+ assertNull(result.afterKey());
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
public void testWithKeywordMissingAfter() throws Exception {
|
|
|
final List<Map<String, List<Object>>> dataset = new ArrayList<>();
|
|
|
dataset.addAll(
|
|
@@ -518,6 +622,67 @@ public class CompositeAggregatorTests extends AggregatorTestCase {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ public void testWithKeywordLongAndMissingBucket() throws Exception {
|
|
|
+ final List<Map<String, List<Object>>> dataset = new ArrayList<>();
|
|
|
+ dataset.addAll(
|
|
|
+ Arrays.asList(
|
|
|
+ createDocument("keyword", "a", "long", 100L),
|
|
|
+ createDocument("double", 0d),
|
|
|
+ createDocument("keyword", "c", "long", 100L),
|
|
|
+ createDocument("keyword", "a", "long", 0L),
|
|
|
+ createDocument("keyword", "d", "long", 10L),
|
|
|
+ createDocument("keyword", "c"),
|
|
|
+ createDocument("keyword", "c", "long", 100L),
|
|
|
+ createDocument("long", 100L),
|
|
|
+ createDocument("double", 0d)
|
|
|
+ )
|
|
|
+ );
|
|
|
+ testSearchCase(Arrays.asList(new MatchAllDocsQuery()), dataset,
|
|
|
+ () -> new CompositeAggregationBuilder("name",
|
|
|
+ Arrays.asList(
|
|
|
+ new TermsValuesSourceBuilder("keyword").field("keyword").missingBucket(true),
|
|
|
+ new TermsValuesSourceBuilder("long").field("long").missingBucket(true)
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ (result) -> {
|
|
|
+ assertEquals(7, result.getBuckets().size());
|
|
|
+ assertEquals("{keyword=d, long=10}", result.afterKey().toString());
|
|
|
+ assertEquals("{keyword=null, long=null}", result.getBuckets().get(0).getKeyAsString());
|
|
|
+ assertEquals(2L, result.getBuckets().get(0).getDocCount());
|
|
|
+ assertEquals("{keyword=null, long=100}", result.getBuckets().get(1).getKeyAsString());
|
|
|
+ assertEquals(1L, result.getBuckets().get(1).getDocCount());
|
|
|
+ assertEquals("{keyword=a, long=0}", result.getBuckets().get(2).getKeyAsString());
|
|
|
+ assertEquals(1L, result.getBuckets().get(2).getDocCount());
|
|
|
+ assertEquals("{keyword=a, long=100}", result.getBuckets().get(3).getKeyAsString());
|
|
|
+ assertEquals(1L, result.getBuckets().get(3).getDocCount());
|
|
|
+ assertEquals("{keyword=c, long=null}", result.getBuckets().get(4).getKeyAsString());
|
|
|
+ assertEquals(1L, result.getBuckets().get(4).getDocCount());
|
|
|
+ assertEquals("{keyword=c, long=100}", result.getBuckets().get(5).getKeyAsString());
|
|
|
+ assertEquals(2L, result.getBuckets().get(5).getDocCount());
|
|
|
+ assertEquals("{keyword=d, long=10}", result.getBuckets().get(6).getKeyAsString());
|
|
|
+ assertEquals(1L, result.getBuckets().get(6).getDocCount());
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ testSearchCase(Arrays.asList(new MatchAllDocsQuery(), new DocValuesFieldExistsQuery("keyword")), dataset,
|
|
|
+ () -> new CompositeAggregationBuilder("name",
|
|
|
+ Arrays.asList(
|
|
|
+ new TermsValuesSourceBuilder("keyword").field("keyword").missingBucket(true),
|
|
|
+ new TermsValuesSourceBuilder("long").field("long").missingBucket(true)
|
|
|
+ )
|
|
|
+ ).aggregateAfter(createAfterKey("keyword", "c", "long", null)
|
|
|
+ ),
|
|
|
+ (result) -> {
|
|
|
+ assertEquals(2, result.getBuckets().size());
|
|
|
+ assertEquals("{keyword=d, long=10}", result.afterKey().toString());
|
|
|
+ assertEquals("{keyword=c, long=100}", result.getBuckets().get(0).getKeyAsString());
|
|
|
+ assertEquals(2L, result.getBuckets().get(0).getDocCount());
|
|
|
+ assertEquals("{keyword=d, long=10}", result.getBuckets().get(1).getKeyAsString());
|
|
|
+ assertEquals(1L, result.getBuckets().get(1).getDocCount());
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
public void testMultiValuedWithKeywordAndLong() throws Exception {
|
|
|
final List<Map<String, List<Object>>> dataset = new ArrayList<>();
|
|
|
dataset.addAll(
|