|
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;
|
@@ -667,4 +672,46 @@ public void testFilterAggInsideNestedAgg() throws Exception {
|
667 | 672 | numStringParams = bucket.getAggregations().get("num_string_params");
|
668 | 673 | assertThat(numStringParams.getDocCount(), equalTo(0L));
|
669 | 674 | }
|
| 675 | + |
| 676 | + public void testExtractInnerHitBuildersWithDuplicateHitName() throws Exception { |
| 677 | + assertAcked( |
| 678 | + prepareCreate("idxduplicatehitnames") |
| 679 | + .setSettings(Settings.builder().put(SETTING_NUMBER_OF_SHARDS, 1).put(SETTING_NUMBER_OF_REPLICAS, 0)) |
| 680 | + .addMapping("product", "categories", "type=keyword", "name", "type=text", "property", "type=nested") |
| 681 | + ); |
| 682 | + ensureGreen("idxduplicatehitnames"); |
| 683 | + |
| 684 | + SearchRequestBuilder searchRequestBuilder = client() |
| 685 | + .prepareSearch("idxduplicatehitnames") |
| 686 | + .setQuery(boolQuery() |
| 687 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder("ih1"))) |
| 688 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder("ih2"))) |
| 689 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder("ih1")))); |
| 690 | + |
| 691 | + assertFailures( |
| 692 | + searchRequestBuilder, |
| 693 | + RestStatus.BAD_REQUEST, |
| 694 | + containsString("[inner_hits] already contains an entry for key [ih1]")); |
| 695 | + } |
| 696 | + |
| 697 | + public void testExtractInnerHitBuildersWithDuplicatePath() throws Exception { |
| 698 | + assertAcked( |
| 699 | + prepareCreate("idxnullhitnames") |
| 700 | + .setSettings(Settings.builder().put(SETTING_NUMBER_OF_SHARDS, 1).put(SETTING_NUMBER_OF_REPLICAS, 0)) |
| 701 | + .addMapping("product", "categories", "type=keyword", "name", "type=text", "property", "type=nested") |
| 702 | + ); |
| 703 | + ensureGreen("idxnullhitnames"); |
| 704 | + |
| 705 | + SearchRequestBuilder searchRequestBuilder = client() |
| 706 | + .prepareSearch("idxnullhitnames") |
| 707 | + .setQuery(boolQuery() |
| 708 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder())) |
| 709 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder())) |
| 710 | + .should(nestedQuery("property", termQuery("property.id", 1D), ScoreMode.None).innerHit(new InnerHitBuilder()))); |
| 711 | + |
| 712 | + assertFailures( |
| 713 | + searchRequestBuilder, |
| 714 | + RestStatus.BAD_REQUEST, |
| 715 | + containsString("[inner_hits] already contains an entry for key [property]")); |
| 716 | + } |
670 | 717 | }
|
0 commit comments