|
12 | 12 | import org.elasticsearch.TransportVersion; |
13 | 13 | import org.elasticsearch.action.search.MultiSearchRequest; |
14 | 14 | import org.elasticsearch.action.search.MultiSearchResponse.Item; |
| 15 | +import org.elasticsearch.action.search.SearchRequest; |
| 16 | +import org.elasticsearch.common.bytes.BytesArray; |
15 | 17 | import org.elasticsearch.common.settings.Settings; |
16 | 18 | import org.elasticsearch.index.query.QueryBuilders; |
| 19 | +import org.elasticsearch.rest.RestRequest; |
| 20 | +import org.elasticsearch.rest.action.search.RestMultiSearchAction; |
17 | 21 | import org.elasticsearch.search.DummyQueryBuilder; |
18 | 22 | import org.elasticsearch.search.SearchService; |
19 | 23 | import org.elasticsearch.test.ESIntegTestCase; |
20 | 24 | import org.elasticsearch.test.TransportVersionUtils; |
| 25 | +import org.elasticsearch.test.rest.FakeRestRequest; |
| 26 | +import org.elasticsearch.usage.UsageService; |
21 | 27 | import org.elasticsearch.xcontent.XContentType; |
| 28 | +import org.hamcrest.Matchers; |
| 29 | + |
| 30 | +import java.io.IOException; |
| 31 | +import java.util.Map; |
| 32 | +import java.util.Optional; |
22 | 33 |
|
23 | 34 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertFirstHit; |
24 | 35 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount; |
@@ -119,4 +130,90 @@ public TransportVersion getMinimalSupportedVersion() { |
119 | 130 | } |
120 | 131 | ); |
121 | 132 | } |
| 133 | + |
| 134 | + public void testMrtValuesArePickedCorrectly() throws IOException { |
| 135 | + |
| 136 | + { |
| 137 | + // If no MRT is specified, all searches should default to true. |
| 138 | + String body = """ |
| 139 | + {"index": "index-1" } |
| 140 | + {"query" : {"match" : { "message": "this is a test"}}} |
| 141 | + {"index": "index-2" } |
| 142 | + {"query" : {"match_all" : {}}} |
| 143 | + """; |
| 144 | + |
| 145 | + MultiSearchRequest mreq = parseRequest(body, Map.of()); |
| 146 | + for (SearchRequest req : mreq.requests()) { |
| 147 | + assertTrue(req.isCcsMinimizeRoundtrips()); |
| 148 | + } |
| 149 | + } |
| 150 | + |
| 151 | + { |
| 152 | + // MRT query param is false, so all searches should use this value. |
| 153 | + String body = """ |
| 154 | + {"index": "index-1" } |
| 155 | + {"query" : {"match" : { "message": "this is a test"}}} |
| 156 | + {"index": "index-2" } |
| 157 | + {"query" : {"match_all" : {}}} |
| 158 | + """; |
| 159 | + |
| 160 | + MultiSearchRequest mreq = parseRequest(body, Map.of("ccs_minimize_roundtrips", "false")); |
| 161 | + for (SearchRequest req : mreq.requests()) { |
| 162 | + assertFalse(req.isCcsMinimizeRoundtrips()); |
| 163 | + } |
| 164 | + } |
| 165 | + |
| 166 | + { |
| 167 | + // Query param is absent but MRT is specified for each request. |
| 168 | + String body = """ |
| 169 | + {"index": "index-1", "ccs_minimize_roundtrips": false } |
| 170 | + {"query" : {"match" : { "message": "this is a test"}}} |
| 171 | + {"index": "index-2", "ccs_minimize_roundtrips": false } |
| 172 | + {"query" : {"match_all" : {}}} |
| 173 | + """; |
| 174 | + |
| 175 | + MultiSearchRequest mreq = parseRequest(body, Map.of()); |
| 176 | + for (SearchRequest req : mreq.requests()) { |
| 177 | + assertFalse(req.isCcsMinimizeRoundtrips()); |
| 178 | + } |
| 179 | + } |
| 180 | + |
| 181 | + { |
| 182 | + /* |
| 183 | + * The first request overrides the query param and should use MRT=true. |
| 184 | + * The second request should use the query param value. |
| 185 | + */ |
| 186 | + String body = """ |
| 187 | + {"index": "index-1", "ccs_minimize_roundtrips": true } |
| 188 | + {"query" : {"match" : { "message": "this is a test"}}} |
| 189 | + {"index": "index-2" } |
| 190 | + {"query" : {"match_all" : {}}} |
| 191 | + """; |
| 192 | + |
| 193 | + MultiSearchRequest mreq = parseRequest(body, Map.of("ccs_minimize_roundtrips", "false")); |
| 194 | + |
| 195 | + assertThat(mreq.requests().size(), Matchers.is(2)); |
| 196 | + assertTrue(mreq.requests().getFirst().isCcsMinimizeRoundtrips()); |
| 197 | + assertFalse(mreq.requests().getLast().isCcsMinimizeRoundtrips()); |
| 198 | + } |
| 199 | + } |
| 200 | + |
| 201 | + private RestRequest mkRequest(String body, Map<String, String> params) { |
| 202 | + return new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.POST) |
| 203 | + .withPath("/index*/_msearch") |
| 204 | + .withParams(params) |
| 205 | + .withContent(new BytesArray(body), XContentType.JSON) |
| 206 | + .build(); |
| 207 | + } |
| 208 | + |
| 209 | + private MultiSearchRequest parseRequest(String body, Map<String, String> params) throws IOException { |
| 210 | + return RestMultiSearchAction.parseRequest( |
| 211 | + mkRequest(body, params), |
| 212 | + true, |
| 213 | + new UsageService().getSearchUsageHolder(), |
| 214 | + (ignored) -> true, |
| 215 | + // Disable CPS for these tests. |
| 216 | + Optional.of(false) |
| 217 | + ); |
| 218 | + } |
122 | 219 | } |
0 commit comments