|
37 | 37 | import org.elasticsearch.action.delete.DeleteResponse; |
38 | 38 | import org.elasticsearch.action.get.GetRequest; |
39 | 39 | import org.elasticsearch.action.get.GetResponse; |
| 40 | +import org.elasticsearch.action.get.MultiGetItemResponse; |
| 41 | +import org.elasticsearch.action.get.MultiGetRequest; |
| 42 | +import org.elasticsearch.action.get.MultiGetResponse; |
40 | 43 | import org.elasticsearch.action.index.IndexRequest; |
41 | 44 | import org.elasticsearch.action.index.IndexResponse; |
42 | 45 | import org.elasticsearch.action.support.ActiveShardCount; |
43 | 46 | import org.elasticsearch.action.support.WriteRequest; |
| 47 | +import org.elasticsearch.action.support.WriteRequest.RefreshPolicy; |
44 | 48 | import org.elasticsearch.action.support.replication.ReplicationResponse; |
45 | 49 | import org.elasticsearch.action.update.UpdateRequest; |
46 | 50 | import org.elasticsearch.action.update.UpdateResponse; |
|
68 | 72 | import java.util.concurrent.CountDownLatch; |
69 | 73 | import java.util.concurrent.TimeUnit; |
70 | 74 |
|
| 75 | +import static org.hamcrest.Matchers.arrayWithSize; |
| 76 | +import static org.hamcrest.Matchers.hasEntry; |
| 77 | +import static org.hamcrest.Matchers.containsString; |
| 78 | +import static org.hamcrest.Matchers.hasKey; |
| 79 | +import static org.hamcrest.Matchers.not; |
71 | 80 | import static java.util.Collections.emptyMap; |
72 | 81 | import static java.util.Collections.singletonMap; |
73 | 82 |
|
@@ -809,7 +818,7 @@ public void testGet() throws Exception { |
809 | 818 | { |
810 | 819 | GetRequest request = new GetRequest("posts", "doc", "1"); |
811 | 820 | //tag::get-request-no-source |
812 | | - request.fetchSourceContext(new FetchSourceContext(false)); // <1> |
| 821 | + request.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE); // <1> |
813 | 822 | //end::get-request-no-source |
814 | 823 | GetResponse getResponse = client.get(request); |
815 | 824 | assertNull(getResponse.getSourceInternal()); |
@@ -1066,4 +1075,201 @@ public void afterBulk(long executionId, BulkRequest request, Throwable failure) |
1066 | 1075 | // end::bulk-processor-options |
1067 | 1076 | } |
1068 | 1077 | } |
| 1078 | + |
| 1079 | + public void testMultiGet() throws Exception { |
| 1080 | + RestHighLevelClient client = highLevelClient(); |
| 1081 | + |
| 1082 | + { |
| 1083 | + String mappings = "{\n" + |
| 1084 | + " \"mappings\" : {\n" + |
| 1085 | + " \"type\" : {\n" + |
| 1086 | + " \"properties\" : {\n" + |
| 1087 | + " \"foo\" : {\n" + |
| 1088 | + " \"type\": \"text\",\n" + |
| 1089 | + " \"store\": true\n" + |
| 1090 | + " }\n" + |
| 1091 | + " }\n" + |
| 1092 | + " }\n" + |
| 1093 | + " }\n" + |
| 1094 | + "}"; |
| 1095 | + |
| 1096 | + NStringEntity entity = new NStringEntity(mappings, ContentType.APPLICATION_JSON); |
| 1097 | + Response response = client().performRequest("PUT", "/index", Collections.emptyMap(), entity); |
| 1098 | + assertEquals(200, response.getStatusLine().getStatusCode()); |
| 1099 | + } |
| 1100 | + |
| 1101 | + Map<String, Object> source = new HashMap<>(); |
| 1102 | + source.put("foo", "val1"); |
| 1103 | + source.put("bar", "val2"); |
| 1104 | + source.put("baz", "val3"); |
| 1105 | + client.index(new IndexRequest("index", "type", "example_id") |
| 1106 | + .source(source) |
| 1107 | + .setRefreshPolicy(RefreshPolicy.IMMEDIATE)); |
| 1108 | + |
| 1109 | + { |
| 1110 | + // tag::multi-get-request |
| 1111 | + MultiGetRequest request = new MultiGetRequest(); |
| 1112 | + request.add(new MultiGetRequest.Item( |
| 1113 | + "index", // <1> |
| 1114 | + "type", // <2> |
| 1115 | + "example_id")); // <3> |
| 1116 | + request.add(new MultiGetRequest.Item("index", "type", "another_id")); // <4> |
| 1117 | + // end::multi-get-request |
| 1118 | + |
| 1119 | + // Add a missing index so we can test it. |
| 1120 | + request.add(new MultiGetRequest.Item("missing_index", "type", "id")); |
| 1121 | + |
| 1122 | + // tag::multi-get-request-item-extras |
| 1123 | + request.add(new MultiGetRequest.Item("index", "type", "with_routing") |
| 1124 | + .routing("some_routing")); // <1> |
| 1125 | + request.add(new MultiGetRequest.Item("index", "type", "with_parent") |
| 1126 | + .parent("some_parent")); // <2> |
| 1127 | + request.add(new MultiGetRequest.Item("index", "type", "with_version") |
| 1128 | + .versionType(VersionType.EXTERNAL) // <3> |
| 1129 | + .version(10123L)); // <4> |
| 1130 | + // end::multi-get-request-item-extras |
| 1131 | + // tag::multi-get-request-top-level-extras |
| 1132 | + request.preference("some_preference"); // <1> |
| 1133 | + request.realtime(false); // <2> |
| 1134 | + request.refresh(true); // <3> |
| 1135 | + // end::multi-get-request-top-level-extras |
| 1136 | + |
| 1137 | + // tag::multi-get-execute |
| 1138 | + MultiGetResponse response = client.multiGet(request); |
| 1139 | + // end::multi-get-execute |
| 1140 | + |
| 1141 | + // tag::multi-get-response |
| 1142 | + MultiGetItemResponse firstItem = response.getResponses()[0]; |
| 1143 | + assertNull(firstItem.getFailure()); // <1> |
| 1144 | + GetResponse firstGet = firstItem.getResponse(); // <2> |
| 1145 | + String index = firstItem.getIndex(); |
| 1146 | + String type = firstItem.getType(); |
| 1147 | + String id = firstItem.getId(); |
| 1148 | + if (firstGet.isExists()) { |
| 1149 | + long version = firstGet.getVersion(); |
| 1150 | + String sourceAsString = firstGet.getSourceAsString(); // <3> |
| 1151 | + Map<String, Object> sourceAsMap = firstGet.getSourceAsMap(); // <4> |
| 1152 | + byte[] sourceAsBytes = firstGet.getSourceAsBytes(); // <5> |
| 1153 | + } else { |
| 1154 | + // <6> |
| 1155 | + } |
| 1156 | + // end::multi-get-response |
| 1157 | + |
| 1158 | + assertTrue(firstGet.isExists()); |
| 1159 | + assertEquals(source, firstGet.getSource()); |
| 1160 | + |
| 1161 | + MultiGetItemResponse missingIndexItem = response.getResponses()[2]; |
| 1162 | + // tag::multi-get-indexnotfound |
| 1163 | + assertNull(missingIndexItem.getResponse()); // <1> |
| 1164 | + Exception e = missingIndexItem.getFailure().getFailure(); // <2> |
| 1165 | + ElasticsearchException ee = (ElasticsearchException) e; // <3> |
| 1166 | + // TODO status is broken! fix in a followup |
| 1167 | + // assertEquals(RestStatus.NOT_FOUND, ee.status()); // <4> |
| 1168 | + assertThat(e.getMessage(), |
| 1169 | + containsString("reason=no such index")); // <5> |
| 1170 | + // end::multi-get-indexnotfound |
| 1171 | + |
| 1172 | + // tag::multi-get-execute-listener |
| 1173 | + ActionListener<MultiGetResponse> listener = new ActionListener<MultiGetResponse>() { |
| 1174 | + @Override |
| 1175 | + public void onResponse(MultiGetResponse response) { |
| 1176 | + // <1> |
| 1177 | + } |
| 1178 | + |
| 1179 | + @Override |
| 1180 | + public void onFailure(Exception e) { |
| 1181 | + // <2> |
| 1182 | + } |
| 1183 | + }; |
| 1184 | + // end::multi-get-execute-listener |
| 1185 | + |
| 1186 | + // Replace the empty listener by a blocking listener in test |
| 1187 | + final CountDownLatch latch = new CountDownLatch(1); |
| 1188 | + listener = new LatchedActionListener<>(listener, latch); |
| 1189 | + |
| 1190 | + // tag::multi-get-execute-async |
| 1191 | + client.multiGetAsync(request, listener); // <1> |
| 1192 | + // end::multi-get-execute-async |
| 1193 | + |
| 1194 | + assertTrue(latch.await(30L, TimeUnit.SECONDS)); |
| 1195 | + } |
| 1196 | + { |
| 1197 | + MultiGetRequest request = new MultiGetRequest(); |
| 1198 | + // tag::multi-get-request-no-source |
| 1199 | + request.add(new MultiGetRequest.Item("index", "type", "example_id") |
| 1200 | + .fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE)); // <1> |
| 1201 | + // end::multi-get-request-no-source |
| 1202 | + MultiGetItemResponse item = unwrapAndAssertExample(client.multiGet(request)); |
| 1203 | + assertNull(item.getResponse().getSource()); |
| 1204 | + } |
| 1205 | + { |
| 1206 | + MultiGetRequest request = new MultiGetRequest(); |
| 1207 | + // tag::multi-get-request-source-include |
| 1208 | + String[] includes = new String[] {"foo", "*r"}; |
| 1209 | + String[] excludes = Strings.EMPTY_ARRAY; |
| 1210 | + FetchSourceContext fetchSourceContext = |
| 1211 | + new FetchSourceContext(true, includes, excludes); |
| 1212 | + request.add(new MultiGetRequest.Item("index", "type", "example_id") |
| 1213 | + .fetchSourceContext(fetchSourceContext)); // <1> |
| 1214 | + // end::multi-get-request-source-include |
| 1215 | + MultiGetItemResponse item = unwrapAndAssertExample(client.multiGet(request)); |
| 1216 | + assertThat(item.getResponse().getSource(), hasEntry("foo", "val1")); |
| 1217 | + assertThat(item.getResponse().getSource(), hasEntry("bar", "val2")); |
| 1218 | + assertThat(item.getResponse().getSource(), not(hasKey("baz"))); |
| 1219 | + } |
| 1220 | + { |
| 1221 | + MultiGetRequest request = new MultiGetRequest(); |
| 1222 | + // tag::multi-get-request-source-exclude |
| 1223 | + String[] includes = Strings.EMPTY_ARRAY; |
| 1224 | + String[] excludes = new String[] {"foo", "*r"}; |
| 1225 | + FetchSourceContext fetchSourceContext = |
| 1226 | + new FetchSourceContext(true, includes, excludes); |
| 1227 | + request.add(new MultiGetRequest.Item("index", "type", "example_id") |
| 1228 | + .fetchSourceContext(fetchSourceContext)); // <1> |
| 1229 | + // end::multi-get-request-source-exclude |
| 1230 | + MultiGetItemResponse item = unwrapAndAssertExample(client.multiGet(request)); |
| 1231 | + assertThat(item.getResponse().getSource(), not(hasKey("foo"))); |
| 1232 | + assertThat(item.getResponse().getSource(), not(hasKey("bar"))); |
| 1233 | + assertThat(item.getResponse().getSource(), hasEntry("baz", "val3")); |
| 1234 | + } |
| 1235 | + { |
| 1236 | + MultiGetRequest request = new MultiGetRequest(); |
| 1237 | + // tag::multi-get-request-stored |
| 1238 | + request.add(new MultiGetRequest.Item("index", "type", "example_id") |
| 1239 | + .storedFields("foo")); // <1> |
| 1240 | + MultiGetResponse response = client.multiGet(request); |
| 1241 | + MultiGetItemResponse item = response.getResponses()[0]; |
| 1242 | + String value = item.getResponse().getField("foo").getValue(); // <2> |
| 1243 | + // end::multi-get-request-stored |
| 1244 | + assertNull(item.getResponse().getSource()); |
| 1245 | + assertEquals("val1", value); |
| 1246 | + } |
| 1247 | + { |
| 1248 | + // tag::multi-get-conflict |
| 1249 | + MultiGetRequest request = new MultiGetRequest(); |
| 1250 | + request.add(new MultiGetRequest.Item("index", "type", "example_id") |
| 1251 | + .version(1000L)); |
| 1252 | + MultiGetResponse response = client.multiGet(request); |
| 1253 | + MultiGetItemResponse item = response.getResponses()[0]; |
| 1254 | + assertNull(item.getResponse()); // <1> |
| 1255 | + Exception e = item.getFailure().getFailure(); // <2> |
| 1256 | + ElasticsearchException ee = (ElasticsearchException) e; // <3> |
| 1257 | + // TODO status is broken! fix in a followup |
| 1258 | + // assertEquals(RestStatus.CONFLICT, ee.status()); // <4> |
| 1259 | + assertThat(e.getMessage(), |
| 1260 | + containsString("version conflict, current version [1] is " |
| 1261 | + + "different than the one provided [1000]")); // <5> |
| 1262 | + // end::multi-get-conflict |
| 1263 | + } |
| 1264 | + |
| 1265 | + } |
| 1266 | + |
| 1267 | + private MultiGetItemResponse unwrapAndAssertExample(MultiGetResponse response) { |
| 1268 | + assertThat(response.getResponses(), arrayWithSize(1)); |
| 1269 | + MultiGetItemResponse item = response.getResponses()[0]; |
| 1270 | + assertEquals("index", item.getIndex()); |
| 1271 | + assertEquals("type", item.getType()); |
| 1272 | + assertEquals("example_id", item.getId()); |
| 1273 | + return item; |
| 1274 | + } |
1069 | 1275 | } |
0 commit comments