|
21 | 21 | import org.apache.lucene.search.join.ScoreMode; |
22 | 22 | import org.elasticsearch.action.index.IndexRequestBuilder; |
23 | 23 | import org.elasticsearch.action.search.SearchPhaseExecutionException; |
| 24 | +import org.elasticsearch.action.search.SearchRequestBuilder; |
24 | 25 | import org.elasticsearch.action.search.SearchResponse; |
25 | 26 | import org.elasticsearch.common.settings.Settings; |
26 | 27 | import org.elasticsearch.common.xcontent.XContentBuilder; |
27 | 28 | import org.elasticsearch.common.xcontent.XContentType; |
| 29 | +import org.elasticsearch.index.query.InnerHitBuilder; |
| 30 | +import org.elasticsearch.rest.RestStatus; |
28 | 31 | import org.elasticsearch.search.aggregations.Aggregator.SubAggCollectionMode; |
29 | 32 | import org.elasticsearch.search.aggregations.InternalAggregation; |
30 | 33 | import org.elasticsearch.search.aggregations.bucket.filter.Filter; |
|
46 | 49 | import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS; |
47 | 50 | import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS; |
48 | 51 | import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; |
| 52 | +import static org.elasticsearch.index.query.QueryBuilders.boolQuery; |
49 | 53 | import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery; |
50 | 54 | import static org.elasticsearch.index.query.QueryBuilders.nestedQuery; |
51 | 55 | import static org.elasticsearch.index.query.QueryBuilders.termQuery; |
|
57 | 61 | import static org.elasticsearch.search.aggregations.AggregationBuilders.sum; |
58 | 62 | import static org.elasticsearch.search.aggregations.AggregationBuilders.terms; |
59 | 63 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; |
| 64 | +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertFailures; |
60 | 65 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount; |
61 | 66 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertNoFailures; |
62 | 67 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse; |
@@ -674,4 +679,46 @@ public void testFilterAggInsideNestedAgg() throws Exception { |
674 | 679 | numStringParams = bucket.getAggregations().get("num_string_params"); |
675 | 680 | assertThat(numStringParams.getDocCount(), equalTo(0L)); |
676 | 681 | } |
| 682 | + |
| 683 | + public void testExtractInnerHitBuildersWithDuplicateHitName() throws Exception { |
| 684 | + assertAcked( |
| 685 | + prepareCreate("idxduplicatehitnames") |
| 686 | + .setSettings(Settings.builder().put(SETTING_NUMBER_OF_SHARDS, 1).put(SETTING_NUMBER_OF_REPLICAS, 0)) |
| 687 | + .addMapping("product", "categories", "type=keyword", "name", "type=text", "property", "type=nested") |
| 688 | + ); |
| 689 | + ensureGreen("idxduplicatehitnames"); |
| 690 | + |
| 691 | + SearchRequestBuilder searchRequestBuilder = client() |
| 692 | + .prepareSearch("idxduplicatehitnames") |
| 693 | + .setQuery(boolQuery() |
| 694 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder("ih1"))) |
| 695 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder("ih2"))) |
| 696 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder("ih1")))); |
| 697 | + |
| 698 | + assertFailures( |
| 699 | + searchRequestBuilder, |
| 700 | + RestStatus.BAD_REQUEST, |
| 701 | + containsString("[inner_hits] already contains an entry for key [ih1]")); |
| 702 | + } |
| 703 | + |
| 704 | + public void testExtractInnerHitBuildersWithDuplicatePath() throws Exception { |
| 705 | + assertAcked( |
| 706 | + prepareCreate("idxnullhitnames") |
| 707 | + .setSettings(Settings.builder().put(SETTING_NUMBER_OF_SHARDS, 1).put(SETTING_NUMBER_OF_REPLICAS, 0)) |
| 708 | + .addMapping("product", "categories", "type=keyword", "name", "type=text", "property", "type=nested") |
| 709 | + ); |
| 710 | + ensureGreen("idxnullhitnames"); |
| 711 | + |
| 712 | + SearchRequestBuilder searchRequestBuilder = client() |
| 713 | + .prepareSearch("idxnullhitnames") |
| 714 | + .setQuery(boolQuery() |
| 715 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder())) |
| 716 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder())) |
| 717 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder()))); |
| 718 | + |
| 719 | + assertFailures( |
| 720 | + searchRequestBuilder, |
| 721 | + RestStatus.BAD_REQUEST, |
| 722 | + containsString("[inner_hits] already contains an entry for key [property]")); |
| 723 | + } |
677 | 724 | } |
0 commit comments