|
20 | 20 |
|
21 | 21 | import org.elasticsearch.action.search.SearchPhaseExecutionException; |
22 | 22 | import org.elasticsearch.action.search.SearchResponse; |
| 23 | +import org.elasticsearch.common.settings.ImmutableSettings; |
23 | 24 | import org.elasticsearch.common.xcontent.XContentBuilder; |
24 | 25 | import org.elasticsearch.search.aggregations.Aggregator.SubAggCollectionMode; |
| 26 | +import org.elasticsearch.search.aggregations.bucket.filter.Filter; |
25 | 27 | import org.elasticsearch.search.aggregations.bucket.nested.Nested; |
26 | 28 | import org.elasticsearch.search.aggregations.bucket.nested.ReverseNested; |
27 | 29 | import org.elasticsearch.search.aggregations.bucket.terms.Terms; |
| 30 | +import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCount; |
28 | 31 | import org.elasticsearch.test.ElasticsearchIntegrationTest; |
29 | 32 | import org.hamcrest.Matchers; |
30 | 33 | import org.junit.Test; |
|
33 | 36 | import java.util.Arrays; |
34 | 37 | import java.util.List; |
35 | 38 |
|
| 39 | +import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS; |
| 40 | +import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS; |
36 | 41 | import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; |
| 42 | +import static org.elasticsearch.index.query.FilterBuilders.termFilter; |
37 | 43 | import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery; |
38 | 44 | import static org.elasticsearch.search.aggregations.AggregationBuilders.*; |
39 | | -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; |
40 | | -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse; |
| 45 | +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.*; |
| 46 | +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount; |
| 47 | +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertNoFailures; |
41 | 48 | import static org.hamcrest.Matchers.*; |
42 | 49 | import static org.hamcrest.core.IsNull.notNullValue; |
43 | 50 |
|
@@ -466,4 +473,163 @@ public void nonExistingNestedField() throws Exception { |
466 | 473 | ReverseNested reverseNested = nested.getAggregations().get("incorrect"); |
467 | 474 | assertThat(reverseNested.getDocCount(), is(0l)); |
468 | 475 | } |
| 476 | + |
| 477 | + @Test |
| 478 | + public void testSameParentDocHavingMultipleBuckets() throws Exception { |
| 479 | + XContentBuilder mapping = jsonBuilder().startObject().startObject("product").field("dynamic", "strict").startObject("properties") |
| 480 | + .startObject("id").field("type", "long").endObject() |
| 481 | + .startObject("category") |
| 482 | + .field("type", "nested") |
| 483 | + .startObject("properties") |
| 484 | + .startObject("name").field("type", "string").endObject() |
| 485 | + .endObject() |
| 486 | + .endObject() |
| 487 | + .startObject("sku") |
| 488 | + .field("type", "nested") |
| 489 | + .startObject("properties") |
| 490 | + .startObject("sku_type").field("type", "string").endObject() |
| 491 | + .startObject("colors") |
| 492 | + .field("type", "nested") |
| 493 | + .startObject("properties") |
| 494 | + .startObject("name").field("type", "string").endObject() |
| 495 | + .endObject() |
| 496 | + .endObject() |
| 497 | + .endObject() |
| 498 | + .endObject() |
| 499 | + .endObject().endObject().endObject(); |
| 500 | + assertAcked( |
| 501 | + prepareCreate("idx3") |
| 502 | + .setSettings(ImmutableSettings.builder().put(SETTING_NUMBER_OF_SHARDS, 1).put(SETTING_NUMBER_OF_REPLICAS, 0)) |
| 503 | + .addMapping("product", mapping) |
| 504 | + ); |
| 505 | + |
| 506 | + client().prepareIndex("idx3", "product", "1").setRefresh(true).setSource( |
| 507 | + jsonBuilder().startObject() |
| 508 | + .startArray("sku") |
| 509 | + .startObject() |
| 510 | + .field("sku_type", "bar1") |
| 511 | + .startArray("colors") |
| 512 | + .startObject().field("name", "red").endObject() |
| 513 | + .startObject().field("name", "green").endObject() |
| 514 | + .startObject().field("name", "yellow").endObject() |
| 515 | + .endArray() |
| 516 | + .endObject() |
| 517 | + .startObject() |
| 518 | + .field("sku_type", "bar1") |
| 519 | + .startArray("colors") |
| 520 | + .startObject().field("name", "red").endObject() |
| 521 | + .startObject().field("name", "blue").endObject() |
| 522 | + .startObject().field("name", "white").endObject() |
| 523 | + .endArray() |
| 524 | + .endObject() |
| 525 | + .startObject() |
| 526 | + .field("sku_type", "bar1") |
| 527 | + .startArray("colors") |
| 528 | + .startObject().field("name", "black").endObject() |
| 529 | + .startObject().field("name", "blue").endObject() |
| 530 | + .endArray() |
| 531 | + .endObject() |
| 532 | + .startObject() |
| 533 | + .field("sku_type", "bar2") |
| 534 | + .startArray("colors") |
| 535 | + .startObject().field("name", "orange").endObject() |
| 536 | + .endArray() |
| 537 | + .endObject() |
| 538 | + .startObject() |
| 539 | + .field("sku_type", "bar2") |
| 540 | + .startArray("colors") |
| 541 | + .startObject().field("name", "pink").endObject() |
| 542 | + .endArray() |
| 543 | + .endObject() |
| 544 | + .endArray() |
| 545 | + .startArray("category") |
| 546 | + .startObject().field("name", "abc").endObject() |
| 547 | + .startObject().field("name", "klm").endObject() |
| 548 | + .startObject().field("name", "xyz").endObject() |
| 549 | + .endArray() |
| 550 | + .endObject() |
| 551 | + ).get(); |
| 552 | + |
| 553 | + SearchResponse response = client().prepareSearch("idx3") |
| 554 | + .addAggregation( |
| 555 | + nested("nested_0").path("category").subAggregation( |
| 556 | + terms("group_by_category").field("category.name").subAggregation( |
| 557 | + reverseNested("to_root").subAggregation( |
| 558 | + nested("nested_1").path("sku").subAggregation( |
| 559 | + filter("filter_by_sku").filter(termFilter("sku.sku_type", "bar1")).subAggregation( |
| 560 | + count("sku_count").field("sku_type") |
| 561 | + ) |
| 562 | + ) |
| 563 | + ) |
| 564 | + ) |
| 565 | + ) |
| 566 | + ).get(); |
| 567 | + assertNoFailures(response); |
| 568 | + assertHitCount(response, 1); |
| 569 | + |
| 570 | + Nested nested0 = response.getAggregations().get("nested_0"); |
| 571 | + assertThat(nested0.getDocCount(), equalTo(3l)); |
| 572 | + Terms terms = nested0.getAggregations().get("group_by_category"); |
| 573 | + assertThat(terms.getBuckets().size(), equalTo(3)); |
| 574 | + for (String bucketName : new String[]{"abc", "klm", "xyz"}) { |
| 575 | + logger.info("Checking results for bucket {}", bucketName); |
| 576 | + Terms.Bucket bucket = terms.getBucketByKey(bucketName); |
| 577 | + assertThat(bucket.getDocCount(), equalTo(1l)); |
| 578 | + ReverseNested toRoot = bucket.getAggregations().get("to_root"); |
| 579 | + assertThat(toRoot.getDocCount(), equalTo(1l)); |
| 580 | + Nested nested1 = toRoot.getAggregations().get("nested_1"); |
| 581 | + assertThat(nested1.getDocCount(), equalTo(5l)); |
| 582 | + Filter filterByBar = nested1.getAggregations().get("filter_by_sku"); |
| 583 | + assertThat(filterByBar.getDocCount(), equalTo(3l)); |
| 584 | + ValueCount barCount = filterByBar.getAggregations().get("sku_count"); |
| 585 | + assertThat(barCount.getValue(), equalTo(3l)); |
| 586 | + } |
| 587 | + |
| 588 | + response = client().prepareSearch("idx3") |
| 589 | + .addAggregation( |
| 590 | + nested("nested_0").path("category").subAggregation( |
| 591 | + terms("group_by_category").field("category.name").subAggregation( |
| 592 | + reverseNested("to_root").subAggregation( |
| 593 | + nested("nested_1").path("sku").subAggregation( |
| 594 | + filter("filter_by_sku").filter(termFilter("sku.sku_type", "bar1")).subAggregation( |
| 595 | + nested("nested_2").path("sku.colors").subAggregation( |
| 596 | + filter("filter_sku_color").filter(termFilter("sku.colors.name", "red")).subAggregation( |
| 597 | + reverseNested("reverse_to_sku").path("sku").subAggregation( |
| 598 | + count("sku_count").field("sku_type") |
| 599 | + ) |
| 600 | + ) |
| 601 | + ) |
| 602 | + ) |
| 603 | + ) |
| 604 | + ) |
| 605 | + ) |
| 606 | + ) |
| 607 | + ).get(); |
| 608 | + assertNoFailures(response); |
| 609 | + assertHitCount(response, 1); |
| 610 | + |
| 611 | + nested0 = response.getAggregations().get("nested_0"); |
| 612 | + assertThat(nested0.getDocCount(), equalTo(3l)); |
| 613 | + terms = nested0.getAggregations().get("group_by_category"); |
| 614 | + assertThat(terms.getBuckets().size(), equalTo(3)); |
| 615 | + for (String bucketName : new String[]{"abc", "klm", "xyz"}) { |
| 616 | + logger.info("Checking results for bucket {}", bucketName); |
| 617 | + Terms.Bucket bucket = terms.getBucketByKey(bucketName); |
| 618 | + assertThat(bucket.getDocCount(), equalTo(1l)); |
| 619 | + ReverseNested toRoot = bucket.getAggregations().get("to_root"); |
| 620 | + assertThat(toRoot.getDocCount(), equalTo(1l)); |
| 621 | + Nested nested1 = toRoot.getAggregations().get("nested_1"); |
| 622 | + assertThat(nested1.getDocCount(), equalTo(5l)); |
| 623 | + Filter filterByBar = nested1.getAggregations().get("filter_by_sku"); |
| 624 | + assertThat(filterByBar.getDocCount(), equalTo(3l)); |
| 625 | + Nested nested2 = filterByBar.getAggregations().get("nested_2"); |
| 626 | + assertThat(nested2.getDocCount(), equalTo(8l)); |
| 627 | + Filter filterBarColor = nested2.getAggregations().get("filter_sku_color"); |
| 628 | + assertThat(filterBarColor.getDocCount(), equalTo(2l)); |
| 629 | + ReverseNested reverseToBar = filterBarColor.getAggregations().get("reverse_to_sku"); |
| 630 | + assertThat(reverseToBar.getDocCount(), equalTo(2l)); |
| 631 | + ValueCount barCount = reverseToBar.getAggregations().get("sku_count"); |
| 632 | + assertThat(barCount.getValue(), equalTo(2l)); |
| 633 | + } |
| 634 | + } |
469 | 635 | } |
0 commit comments