Skip to content

Commit 3c6dd64

Browse files
author
Farid Faoudi
authored
Add support for GetFieldMapping request in ReactiveElasticsearchClient.
Original Pull Request #1641 Closes #1640
1 parent 5bf0c4b commit 3c6dd64

File tree

5 files changed

+142
-0
lines changed

5 files changed

+142
-0
lines changed

src/main/java/org/springframework/data/elasticsearch/client/reactive/DefaultReactiveElasticsearchClient.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import io.netty.handler.ssl.JdkSslContext;
2323
import io.netty.handler.timeout.ReadTimeoutHandler;
2424
import io.netty.handler.timeout.WriteTimeoutHandler;
25+
import org.elasticsearch.client.indices.GetFieldMappingsRequest;
26+
import org.elasticsearch.client.indices.GetFieldMappingsResponse;
2527
import reactor.core.publisher.Flux;
2628
import reactor.core.publisher.Mono;
2729
import reactor.netty.http.client.HttpClient;
@@ -139,6 +141,7 @@
139141
* @author Russell Parry
140142
* @author Thomas Geese
141143
* @author Brian Clozel
144+
* @author Farid Faoudi
142145
* @since 3.2
143146
* @see ClientConfiguration
144147
* @see ReactiveRestClients
@@ -674,6 +677,11 @@ public Mono<GetMappingsResponse> getMapping(HttpHeaders headers, GetMappingsRequ
674677
return sendRequest(getMappingsRequest, requestCreator.getMapping(), GetMappingsResponse.class, headers).next();
675678
}
676679

680+
@Override
681+
public Mono<GetFieldMappingsResponse> getFieldMapping(HttpHeaders headers, GetFieldMappingsRequest getFieldMappingsRequest) {
682+
return sendRequest(getFieldMappingsRequest, requestCreator.getFieldMapping(), GetFieldMappingsResponse.class, headers).next();
683+
}
684+
677685
@Override
678686
public Mono<GetSettingsResponse> getSettings(HttpHeaders headers, GetSettingsRequest getSettingsRequest) {
679687
return sendRequest(getSettingsRequest, requestCreator.getSettings(), GetSettingsResponse.class, headers).next();

src/main/java/org/springframework/data/elasticsearch/client/reactive/ReactiveElasticsearchClient.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.springframework.data.elasticsearch.client.reactive;
1717

18+
import org.elasticsearch.client.indices.GetFieldMappingsRequest;
19+
import org.elasticsearch.client.indices.GetFieldMappingsResponse;
1820
import reactor.core.publisher.Flux;
1921
import reactor.core.publisher.Mono;
2022

@@ -77,6 +79,7 @@
7779
* @author Peter-Josef Meisch
7880
* @author Henrique Amaral
7981
* @author Thomas Geese
82+
* @author Farid Faoudi
8083
* @since 3.2
8184
* @see ClientConfiguration
8285
* @see ReactiveRestClients
@@ -1162,6 +1165,50 @@ default Mono<GetMappingsResponse> getMapping(GetMappingsRequest getMappingsReque
11621165
*/
11631166
Mono<GetMappingsResponse> getMapping(HttpHeaders headers, GetMappingsRequest getMappingsRequest);
11641167

1168+
/**
1169+
* Execute the given {@link GetFieldMappingsRequest} against the {@literal indices} API.
1170+
*
1171+
* @param consumer never {@literal null}.
1172+
* @return a {@link Mono} signalling operation completion or an {@link Mono#error(Throwable) error} if eg. the index
1173+
* does not exist.
1174+
* @see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-field-mapping.html"> Indices
1175+
* Flush API on elastic.co</a>
1176+
* @since 4.2
1177+
*/
1178+
default Mono<GetFieldMappingsResponse> getFieldMapping(Consumer<GetFieldMappingsRequest> consumer) {
1179+
1180+
GetFieldMappingsRequest request = new GetFieldMappingsRequest();
1181+
consumer.accept(request);
1182+
return getFieldMapping(request);
1183+
}
1184+
1185+
/**
1186+
* Execute the given {@link GetFieldMappingsRequest} against the {@literal indices} API.
1187+
*
1188+
* @param getFieldMappingsRequest must not be {@literal null}.
1189+
* @return a {@link Mono} signalling operation completion or an {@link Mono#error(Throwable) error} if eg. the index
1190+
* does not exist.
1191+
* @see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-field-mapping.html"> Indices
1192+
* Flush API on elastic.co</a>
1193+
* @since 4.2
1194+
*/
1195+
default Mono<GetFieldMappingsResponse> getFieldMapping(GetFieldMappingsRequest getFieldMappingsRequest) {
1196+
return getFieldMapping(HttpHeaders.EMPTY, getFieldMappingsRequest);
1197+
}
1198+
1199+
/**
1200+
* Execute the given {@link GetFieldMappingsRequest} against the {@literal indices} API.
1201+
*
1202+
* @param headers Use {@link HttpHeaders} to provide eg. authentication data. Must not be {@literal null}.
1203+
* @param getFieldMappingsRequest must not be {@literal null}.
1204+
* @return a {@link Mono} signalling operation completion or an {@link Mono#error(Throwable) error} if eg. the index
1205+
* does not exist.
1206+
* @see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-field-mapping.html"> Indices
1207+
* Flush API on elastic.co</a>
1208+
* @since 4.2
1209+
*/
1210+
Mono<GetFieldMappingsResponse> getFieldMapping(HttpHeaders headers, GetFieldMappingsRequest getFieldMappingsRequest);
1211+
11651212
/**
11661213
* Execute the given {@link IndicesAliasesRequest} against the {@literal indices} API.
11671214
*

src/main/java/org/springframework/data/elasticsearch/client/reactive/RequestCreator.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.elasticsearch.action.update.UpdateRequest;
2929
import org.elasticsearch.client.Request;
3030
import org.elasticsearch.client.core.CountRequest;
31+
import org.elasticsearch.client.indices.GetFieldMappingsRequest;
3132
import org.elasticsearch.client.indices.GetIndexTemplatesRequest;
3233
import org.elasticsearch.client.indices.IndexTemplatesExistRequest;
3334
import org.elasticsearch.client.indices.PutIndexTemplateRequest;
@@ -37,6 +38,7 @@
3738

3839
/**
3940
* @author Roman Puchkovskiy
41+
* @author Farid Faoudi
4042
* @since 4.0
4143
*/
4244
public interface RequestCreator {
@@ -194,4 +196,11 @@ default Function<IndexTemplatesExistRequest, Request> templatesExist() {
194196
default Function<DeleteIndexTemplateRequest, Request> deleteTemplate() {
195197
return RequestConverters::deleteTemplate;
196198
}
199+
200+
/**
201+
* @since 4.2
202+
*/
203+
default Function<GetFieldMappingsRequest, Request> getFieldMapping() {
204+
return RequestConverters::getFieldMapping;
205+
}
197206
}

src/main/java/org/springframework/data/elasticsearch/client/util/RequestConverters.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import org.elasticsearch.client.RethrottleRequest;
7272
import org.elasticsearch.client.core.CountRequest;
7373
import org.elasticsearch.client.indices.AnalyzeRequest;
74+
import org.elasticsearch.client.indices.GetFieldMappingsRequest;
7475
import org.elasticsearch.client.indices.GetIndexTemplatesRequest;
7576
import org.elasticsearch.client.indices.IndexTemplatesExistRequest;
7677
import org.elasticsearch.client.indices.PutIndexTemplateRequest;
@@ -115,6 +116,7 @@
115116
*
116117
* @author Christoph Strobl
117118
* @author Peter-Josef Meisch
119+
* @author Farid Faoudi
118120
* @since 3.2
119121
*/
120122
@SuppressWarnings("JavadocReference")
@@ -891,6 +893,24 @@ public static Request deleteTemplate(DeleteIndexTemplateRequest deleteIndexTempl
891893
return request;
892894
}
893895

896+
public static Request getFieldMapping(GetFieldMappingsRequest getFieldMappingsRequest) {
897+
String[] indices = getFieldMappingsRequest.indices() == null ? Strings.EMPTY_ARRAY : getFieldMappingsRequest.indices();
898+
String[] fields = getFieldMappingsRequest.fields() == null ? Strings.EMPTY_ARRAY : getFieldMappingsRequest.fields();
899+
900+
final String endpoint = new EndpointBuilder().addCommaSeparatedPathParts(indices)
901+
.addPathPartAsIs("_mapping").addPathPartAsIs("field")
902+
.addCommaSeparatedPathParts(fields)
903+
.build();
904+
905+
Request request = new Request(HttpMethod.GET.name(), endpoint);
906+
907+
RequestConverters.Params parameters = new Params(request);
908+
parameters.withIndicesOptions(getFieldMappingsRequest.indicesOptions());
909+
parameters.withIncludeDefaults(getFieldMappingsRequest.includeDefaults());
910+
parameters.withIncludeTypeName(false);
911+
return request;
912+
}
913+
894914
static HttpEntity createEntity(ToXContent toXContent, XContentType xContentType) {
895915

896916
try {

src/test/java/org/springframework/data/elasticsearch/client/reactive/ReactiveElasticsearchClientIntegrationTests.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818
import static org.assertj.core.api.Assertions.*;
1919

2020
import lombok.SneakyThrows;
21+
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
2122
import reactor.core.publisher.Mono;
2223
import reactor.test.StepVerifier;
2324

2425
import java.time.Duration;
2526
import java.util.Arrays;
2627
import java.util.Collections;
28+
import java.util.HashMap;
2729
import java.util.LinkedHashMap;
2830
import java.util.Map;
2931
import java.util.UUID;
@@ -73,6 +75,7 @@
7375
* @author Henrique Amaral
7476
* @author Russell Parry
7577
* @author Thomas Geese
78+
* @author Farid Faoudi
7679
*/
7780
@SpringIntegrationTest
7881
@ContextConfiguration(classes = { ReactiveElasticsearchClientIntegrationTests.Config.class })
@@ -721,6 +724,61 @@ public void suggestReturnsSuggestionResults() {
721724
.verifyComplete();
722725
}
723726

727+
@Test // #1640
728+
void getFieldMapping() {
729+
730+
operations.indexOps(IndexCoordinates.of(INDEX_I)).create().block();
731+
732+
Map<String, Object> properties = new HashMap<>();
733+
properties.put("message1", Collections.singletonMap("type", "text"));
734+
properties.put("message2", Collections.singletonMap("type", "keyword"));
735+
736+
Map<String, Object> jsonMap = Collections.singletonMap("properties", properties);
737+
738+
final PutMappingRequest putMappingRequest = new PutMappingRequest(INDEX_I)
739+
.source(jsonMap);
740+
741+
client.indices().putMapping(putMappingRequest).block();
742+
743+
client.indices().getFieldMapping(request -> request.indices(INDEX_I).fields("message1", "message2"))
744+
.as(StepVerifier::create)
745+
.consumeNextWith(it -> {
746+
assertThat(it.mappings().get(INDEX_I).keySet().size()).isEqualTo(2);
747+
assertThat(it.mappings().get(INDEX_I).get("message1").sourceAsMap()).isEqualTo(Collections.singletonMap("message1", Collections.singletonMap("type", "text")));
748+
assertThat(it.mappings().get(INDEX_I).get("message2").sourceAsMap()).isEqualTo(Collections.singletonMap("message2", Collections.singletonMap("type", "keyword")));
749+
})
750+
.verifyComplete();
751+
}
752+
753+
@Test // #1640
754+
void getFieldMappingNonExistingField() {
755+
756+
operations.indexOps(IndexCoordinates.of(INDEX_I)).create().block();
757+
758+
Map<String, Object> jsonMap = Collections.singletonMap("properties",
759+
Collections.singletonMap("message", Collections.singletonMap("type", "text")));
760+
761+
final PutMappingRequest putMappingRequest = new PutMappingRequest(INDEX_I)
762+
.source(jsonMap);
763+
764+
client.indices().putMapping(putMappingRequest).block();
765+
766+
client.indices().getFieldMapping(request -> request.indices(INDEX_I).fields("message1"))
767+
.as(StepVerifier::create)
768+
.consumeNextWith(it -> {
769+
assertThat(it.mappings().get(INDEX_I).keySet().size()).isZero();
770+
})
771+
.verifyComplete();
772+
}
773+
774+
@Test // #1640
775+
void getFieldMappingNonExistingIndex() {
776+
777+
client.indices().getFieldMapping(request -> request.indices(INDEX_I).fields("message1"))
778+
.as(StepVerifier::create)
779+
.verifyError(ElasticsearchStatusException.class);
780+
}
781+
724782
@Test // DATAES-796
725783
@DisplayName("should return the whole SearchResponse")
726784
void shouldReturnTheWholeSearchResponse() {

0 commit comments

Comments
 (0)