|
38 | 38 | import org.elasticsearch.action.search.SearchResponse; |
39 | 39 | import org.elasticsearch.action.search.SearchScrollRequest; |
40 | 40 | import org.elasticsearch.common.Strings; |
| 41 | +import org.elasticsearch.common.bytes.BytesReference; |
41 | 42 | import org.elasticsearch.common.unit.TimeValue; |
42 | 43 | import org.elasticsearch.common.xcontent.XContentBuilder; |
| 44 | +import org.elasticsearch.common.xcontent.XContentFactory; |
| 45 | +import org.elasticsearch.common.xcontent.XContentType; |
43 | 46 | import org.elasticsearch.index.query.MatchQueryBuilder; |
44 | 47 | import org.elasticsearch.index.query.ScriptQueryBuilder; |
45 | 48 | import org.elasticsearch.index.query.TermsQueryBuilder; |
|
48 | 51 | import org.elasticsearch.rest.RestStatus; |
49 | 52 | import org.elasticsearch.script.Script; |
50 | 53 | import org.elasticsearch.script.ScriptType; |
| 54 | +import org.elasticsearch.script.mustache.SearchTemplateRequest; |
| 55 | +import org.elasticsearch.script.mustache.SearchTemplateResponse; |
51 | 56 | import org.elasticsearch.search.SearchHit; |
52 | 57 | import org.elasticsearch.search.aggregations.BucketOrder; |
53 | 58 | import org.elasticsearch.search.aggregations.bucket.range.Range; |
|
69 | 74 | import java.io.IOException; |
70 | 75 | import java.util.Arrays; |
71 | 76 | import java.util.Collections; |
| 77 | +import java.util.HashMap; |
72 | 78 | import java.util.List; |
73 | 79 | import java.util.Map; |
74 | 80 |
|
75 | 81 | import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; |
| 82 | +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertToXContentEquivalent; |
76 | 83 | import static org.hamcrest.Matchers.both; |
77 | 84 | import static org.hamcrest.Matchers.containsString; |
78 | 85 | import static org.hamcrest.Matchers.either; |
@@ -733,6 +740,103 @@ public void testMultiSearch_failure() throws Exception { |
733 | 740 | assertThat(multiSearchResponse.getResponses()[1].getResponse(), nullValue()); |
734 | 741 | } |
735 | 742 |
|
| 743 | + public void testSearchTemplate() throws IOException { |
| 744 | + SearchTemplateRequest searchTemplateRequest = new SearchTemplateRequest(); |
| 745 | + searchTemplateRequest.setRequest(new SearchRequest("index")); |
| 746 | + |
| 747 | + searchTemplateRequest.setScriptType(ScriptType.INLINE); |
| 748 | + searchTemplateRequest.setScript( |
| 749 | + "{" + |
| 750 | + " \"query\": {" + |
| 751 | + " \"match\": {" + |
| 752 | + " \"num\": {{number}}" + |
| 753 | + " }" + |
| 754 | + " }" + |
| 755 | + "}"); |
| 756 | + |
| 757 | + Map<String, Object> scriptParams = new HashMap<>(); |
| 758 | + scriptParams.put("number", 10); |
| 759 | + searchTemplateRequest.setScriptParams(scriptParams); |
| 760 | + |
| 761 | + searchTemplateRequest.setExplain(true); |
| 762 | + searchTemplateRequest.setProfile(true); |
| 763 | + |
| 764 | + SearchTemplateResponse searchTemplateResponse = execute(searchTemplateRequest, |
| 765 | + highLevelClient()::searchTemplate, |
| 766 | + highLevelClient()::searchTemplateAsync); |
| 767 | + |
| 768 | + assertNull(searchTemplateResponse.getSource()); |
| 769 | + |
| 770 | + SearchResponse searchResponse = searchTemplateResponse.getResponse(); |
| 771 | + assertNotNull(searchResponse); |
| 772 | + |
| 773 | + assertEquals(1, searchResponse.getHits().totalHits); |
| 774 | + assertEquals(1, searchResponse.getHits().getHits().length); |
| 775 | + assertThat(searchResponse.getHits().getMaxScore(), greaterThan(0f)); |
| 776 | + |
| 777 | + SearchHit hit = searchResponse.getHits().getHits()[0]; |
| 778 | + assertNotNull(hit.getExplanation()); |
| 779 | + |
| 780 | + assertFalse(searchResponse.getProfileResults().isEmpty()); |
| 781 | + } |
| 782 | + |
| 783 | + public void testNonExistentSearchTemplate() { |
| 784 | + SearchTemplateRequest searchTemplateRequest = new SearchTemplateRequest(); |
| 785 | + searchTemplateRequest.setRequest(new SearchRequest("index")); |
| 786 | + |
| 787 | + searchTemplateRequest.setScriptType(ScriptType.STORED); |
| 788 | + searchTemplateRequest.setScript("non-existent"); |
| 789 | + searchTemplateRequest.setScriptParams(Collections.emptyMap()); |
| 790 | + |
| 791 | + ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, |
| 792 | + () -> execute(searchTemplateRequest, |
| 793 | + highLevelClient()::searchTemplate, |
| 794 | + highLevelClient()::searchTemplateAsync)); |
| 795 | + |
| 796 | + assertEquals(RestStatus.NOT_FOUND, exception.status()); |
| 797 | + } |
| 798 | + |
| 799 | + public void testRenderSearchTemplate() throws IOException { |
| 800 | + SearchTemplateRequest searchTemplateRequest = new SearchTemplateRequest(); |
| 801 | + |
| 802 | + searchTemplateRequest.setScriptType(ScriptType.INLINE); |
| 803 | + searchTemplateRequest.setScript( |
| 804 | + "{" + |
| 805 | + " \"query\": {" + |
| 806 | + " \"match\": {" + |
| 807 | + " \"num\": {{number}}" + |
| 808 | + " }" + |
| 809 | + " }" + |
| 810 | + "}"); |
| 811 | + |
| 812 | + Map<String, Object> scriptParams = new HashMap<>(); |
| 813 | + scriptParams.put("number", 10); |
| 814 | + searchTemplateRequest.setScriptParams(scriptParams); |
| 815 | + |
| 816 | + // Setting simulate true causes the template to only be rendered. |
| 817 | + searchTemplateRequest.setSimulate(true); |
| 818 | + |
| 819 | + SearchTemplateResponse searchTemplateResponse = execute(searchTemplateRequest, |
| 820 | + highLevelClient()::searchTemplate, |
| 821 | + highLevelClient()::searchTemplateAsync); |
| 822 | + assertNull(searchTemplateResponse.getResponse()); |
| 823 | + |
| 824 | + BytesReference expectedSource = BytesReference.bytes( |
| 825 | + XContentFactory.jsonBuilder() |
| 826 | + .startObject() |
| 827 | + .startObject("query") |
| 828 | + .startObject("match") |
| 829 | + .field("num", 10) |
| 830 | + .endObject() |
| 831 | + .endObject() |
| 832 | + .endObject()); |
| 833 | + |
| 834 | + BytesReference actualSource = searchTemplateResponse.getSource(); |
| 835 | + assertNotNull(actualSource); |
| 836 | + |
| 837 | + assertToXContentEquivalent(expectedSource, actualSource, XContentType.JSON); |
| 838 | + } |
| 839 | + |
736 | 840 | public void testFieldCaps() throws IOException { |
737 | 841 | FieldCapabilitiesRequest request = new FieldCapabilitiesRequest() |
738 | 842 | .indices("index1", "index2") |
|
0 commit comments