Skip to content

Commit 929d97f

Browse files
authored
Add function to get index information
Original Pull Request spring-projects#1693 Closes spring-projects#1646
1 parent 43b3035 commit 929d97f

16 files changed

+610
-61
lines changed

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

+20-12
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,6 @@
1515
*/
1616
package org.springframework.data.elasticsearch.client.reactive;
1717

18-
import io.netty.channel.ChannelOption;
19-
import io.netty.handler.ssl.ApplicationProtocolConfig;
20-
import io.netty.handler.ssl.ClientAuth;
21-
import io.netty.handler.ssl.IdentityCipherSuiteFilter;
22-
import io.netty.handler.ssl.JdkSslContext;
23-
import io.netty.handler.timeout.ReadTimeoutHandler;
24-
import io.netty.handler.timeout.WriteTimeoutHandler;
25-
import reactor.core.publisher.Flux;
26-
import reactor.core.publisher.Mono;
27-
import reactor.netty.http.client.HttpClient;
28-
import reactor.netty.transport.ProxyProvider;
29-
3018
import java.io.IOException;
3119
import java.lang.reflect.Method;
3220
import java.net.ConnectException;
@@ -86,6 +74,7 @@
8674
import org.elasticsearch.client.Request;
8775
import org.elasticsearch.client.indices.GetFieldMappingsRequest;
8876
import org.elasticsearch.client.indices.GetFieldMappingsResponse;
77+
import org.elasticsearch.client.indices.GetIndexResponse;
8978
import org.elasticsearch.client.indices.GetIndexTemplatesRequest;
9079
import org.elasticsearch.client.indices.GetIndexTemplatesResponse;
9180
import org.elasticsearch.client.indices.IndexTemplatesExistRequest;
@@ -131,6 +120,18 @@
131120
import org.springframework.web.reactive.function.client.WebClient;
132121
import org.springframework.web.reactive.function.client.WebClient.RequestBodySpec;
133122

123+
import io.netty.channel.ChannelOption;
124+
import io.netty.handler.ssl.ApplicationProtocolConfig;
125+
import io.netty.handler.ssl.ClientAuth;
126+
import io.netty.handler.ssl.IdentityCipherSuiteFilter;
127+
import io.netty.handler.ssl.JdkSslContext;
128+
import io.netty.handler.timeout.ReadTimeoutHandler;
129+
import io.netty.handler.timeout.WriteTimeoutHandler;
130+
import reactor.core.publisher.Flux;
131+
import reactor.core.publisher.Mono;
132+
import reactor.netty.http.client.HttpClient;
133+
import reactor.netty.transport.ProxyProvider;
134+
134135
/**
135136
* A {@link WebClient} based {@link ReactiveElasticsearchClient} that connects to an Elasticsearch cluster using HTTP.
136137
*
@@ -144,6 +145,7 @@
144145
* @author Thomas Geese
145146
* @author Brian Clozel
146147
* @author Farid Faoudi
148+
* @author George Popides
147149
* @since 3.2
148150
* @see ClientConfiguration
149151
* @see ReactiveRestClients
@@ -757,6 +759,12 @@ public Mono<Boolean> deleteTemplate(HttpHeaders headers, DeleteIndexTemplateRequ
757759
.map(AcknowledgedResponse::isAcknowledged).next();
758760
}
759761

762+
@Override
763+
public Mono<GetIndexResponse> getIndex(HttpHeaders headers, org.elasticsearch.client.indices.GetIndexRequest getIndexRequest) {
764+
return sendRequest(getIndexRequest, requestCreator.getIndex(), GetIndexResponse.class, headers)
765+
.next();
766+
}
767+
760768
// endregion
761769

762770
// region helper functions

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

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.data.elasticsearch.client.reactive;
1717

18+
import org.elasticsearch.client.indices.GetIndexResponse;
1819
import reactor.core.publisher.Flux;
1920
import reactor.core.publisher.Mono;
2021

@@ -1456,5 +1457,7 @@ default Mono<Boolean> deleteTemplate(DeleteIndexTemplateRequest deleteIndexTempl
14561457
* @since 4.1
14571458
*/
14581459
Mono<Boolean> deleteTemplate(HttpHeaders headers, DeleteIndexTemplateRequest deleteIndexTemplateRequest);
1460+
1461+
Mono<GetIndexResponse> getIndex(HttpHeaders headers, org.elasticsearch.client.indices.GetIndexRequest getIndexRequest);
14591462
}
14601463
}

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

+2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
/**
4141
* @author Roman Puchkovskiy
4242
* @author Farid Faoudi
43+
* @author George Popides
4344
* @since 4.0
4445
*/
4546
public interface RequestCreator {
@@ -149,6 +150,7 @@ default Function<CountRequest, Request> count() {
149150
return RequestConverters::count;
150151
}
151152

153+
default Function<org.elasticsearch.client.indices.GetIndexRequest, Request> getIndex() { return RequestConverters::getIndex; }
152154
/**
153155
* @since 4.1
154156
*/

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

+16
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,22 @@ public static Request getIndex(GetIndexRequest getIndexRequest) {
692692
return request;
693693
}
694694

695+
public static Request getIndex(org.elasticsearch.client.indices.GetIndexRequest getIndexRequest) {
696+
String[] indices = getIndexRequest.indices() == null ? Strings.EMPTY_ARRAY : getIndexRequest.indices();
697+
698+
String endpoint = endpoint(indices);
699+
Request request = new Request(HttpMethod.GET.name(), endpoint);
700+
701+
Params params = new Params(request);
702+
params.withIndicesOptions(getIndexRequest.indicesOptions());
703+
params.withLocal(getIndexRequest.local());
704+
params.withIncludeDefaults(getIndexRequest.includeDefaults());
705+
params.withHuman(getIndexRequest.humanReadable());
706+
params.withMasterTimeout(getIndexRequest.masterNodeTimeout());
707+
708+
return request;
709+
}
710+
695711
public static Request indexDelete(DeleteIndexRequest deleteIndexRequest) {
696712
String endpoint = RequestConverters.endpoint(deleteIndexRequest.indices());
697713
Request request = new Request(HttpMethod.DELETE.name(), endpoint);

Diff for: src/main/java/org/springframework/data/elasticsearch/core/AbstractDefaultIndexOperations.java

+4
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,12 @@ abstract class AbstractDefaultIndexOperations implements IndexOperations {
5454

5555
protected final ElasticsearchConverter elasticsearchConverter;
5656
protected final RequestFactory requestFactory;
57+
protected final ResponseConverter responseConverter;
5758

5859
@Nullable protected final Class<?> boundClass;
5960
@Nullable private final IndexCoordinates boundIndex;
6061

62+
6163
public AbstractDefaultIndexOperations(ElasticsearchConverter elasticsearchConverter, Class<?> boundClass) {
6264

6365
Assert.notNull(boundClass, "boundClass may not be null");
@@ -66,6 +68,7 @@ public AbstractDefaultIndexOperations(ElasticsearchConverter elasticsearchConver
6668
requestFactory = new RequestFactory(elasticsearchConverter);
6769
this.boundClass = boundClass;
6870
this.boundIndex = null;
71+
this.responseConverter = new ResponseConverter();
6972
}
7073

7174
public AbstractDefaultIndexOperations(ElasticsearchConverter elasticsearchConverter, IndexCoordinates boundIndex) {
@@ -76,6 +79,7 @@ public AbstractDefaultIndexOperations(ElasticsearchConverter elasticsearchConver
7679
requestFactory = new RequestFactory(elasticsearchConverter);
7780
this.boundClass = null;
7881
this.boundIndex = boundIndex;
82+
this.responseConverter = new ResponseConverter();
7983
}
8084

8185
protected Class<?> checkForBoundClass() {

Diff for: src/main/java/org/springframework/data/elasticsearch/core/DefaultIndexOperations.java

+17-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.elasticsearch.client.RequestOptions;
3333
import org.elasticsearch.client.indices.CreateIndexRequest;
3434
import org.elasticsearch.client.indices.GetIndexRequest;
35+
import org.elasticsearch.client.indices.GetIndexResponse;
3536
import org.elasticsearch.client.indices.GetIndexTemplatesRequest;
3637
import org.elasticsearch.client.indices.GetIndexTemplatesResponse;
3738
import org.elasticsearch.client.indices.GetMappingsRequest;
@@ -51,6 +52,7 @@
5152
import org.springframework.data.elasticsearch.core.index.PutTemplateRequest;
5253
import org.springframework.data.elasticsearch.core.index.TemplateData;
5354
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
55+
import org.springframework.data.elasticsearch.core.mapping.IndexInformation;
5456
import org.springframework.data.elasticsearch.core.query.AliasQuery;
5557
import org.springframework.lang.Nullable;
5658
import org.springframework.util.Assert;
@@ -60,6 +62,7 @@
6062
*
6163
* @author Peter-Josef Meisch
6264
* @author Sascha Woo
65+
* @author George Popides
6366
* @since 4.0
6467
*/
6568
class DefaultIndexOperations extends AbstractDefaultIndexOperations implements IndexOperations {
@@ -175,7 +178,7 @@ protected Map<String, Set<AliasData>> doGetAliases(@Nullable String[] aliasNames
175178

176179
GetAliasesRequest getAliasesRequest = requestFactory.getAliasesRequest(aliasNames, indexNames);
177180

178-
return restTemplate.execute(client -> requestFactory
181+
return restTemplate.execute(client -> responseConverter
179182
.convertAliasesResponse(client.indices().getAlias(getAliasesRequest, RequestOptions.DEFAULT).getAliases()));
180183
}
181184

@@ -256,5 +259,18 @@ public boolean deleteTemplate(DeleteTemplateRequest deleteTemplateRequest) {
256259
client -> client.indices().deleteTemplate(deleteIndexTemplateRequest, RequestOptions.DEFAULT).isAcknowledged());
257260
}
258261

262+
@Override
263+
public List<IndexInformation> getInformation() {
264+
IndexCoordinates indexCoordinates = getIndexCoordinates();
265+
GetIndexRequest request = requestFactory.getIndexRequest(indexCoordinates);
266+
267+
return restTemplate.execute(
268+
client -> {
269+
GetIndexResponse getIndexResponse = client.indices().get(request, RequestOptions.DEFAULT);
270+
return responseConverter.indexInformationCollection(getIndexResponse);
271+
});
272+
}
273+
259274
// endregion
275+
260276
}

Diff for: src/main/java/org/springframework/data/elasticsearch/core/DefaultReactiveIndexOperations.java

+27-12
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
import static org.elasticsearch.client.Requests.*;
1919
import static org.springframework.util.StringUtils.*;
2020

21-
import reactor.core.publisher.Mono;
22-
2321
import java.util.Map;
2422
import java.util.Set;
2523

@@ -38,7 +36,6 @@
3836
import org.slf4j.Logger;
3937
import org.slf4j.LoggerFactory;
4038
import org.springframework.core.annotation.AnnotatedElementUtils;
41-
import org.springframework.core.annotation.AnnotationAttributes;
4239
import org.springframework.dao.InvalidDataAccessApiUsageException;
4340
import org.springframework.data.elasticsearch.NoSuchIndexException;
4441
import org.springframework.data.elasticsearch.annotations.Mapping;
@@ -55,11 +52,17 @@
5552
import org.springframework.data.elasticsearch.core.index.TemplateData;
5653
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
5754
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
55+
import org.springframework.data.elasticsearch.core.mapping.IndexInformation;
56+
import org.springframework.http.HttpHeaders;
5857
import org.springframework.lang.Nullable;
5958
import org.springframework.util.Assert;
6059

60+
import reactor.core.publisher.Flux;
61+
import reactor.core.publisher.Mono;
62+
6163
/**
6264
* @author Peter-Josef Meisch
65+
* @author George Popides
6366
* @since 4.1
6467
*/
6568
class DefaultReactiveIndexOperations implements ReactiveIndexOperations {
@@ -71,6 +74,7 @@ class DefaultReactiveIndexOperations implements ReactiveIndexOperations {
7174
private final RequestFactory requestFactory;
7275
private final ReactiveElasticsearchOperations operations;
7376
private final ElasticsearchConverter converter;
77+
private final ResponseConverter responseConverter;
7478

7579
public DefaultReactiveIndexOperations(ReactiveElasticsearchOperations operations, IndexCoordinates index) {
7680

@@ -80,6 +84,7 @@ public DefaultReactiveIndexOperations(ReactiveElasticsearchOperations operations
8084
this.operations = operations;
8185
this.converter = operations.getElasticsearchConverter();
8286
this.requestFactory = new RequestFactory(operations.getElasticsearchConverter());
87+
this.responseConverter = new ResponseConverter();
8388
this.boundClass = null;
8489
this.boundIndex = index;
8590
}
@@ -92,6 +97,7 @@ public DefaultReactiveIndexOperations(ReactiveElasticsearchOperations operations
9297
this.operations = operations;
9398
this.converter = operations.getElasticsearchConverter();
9499
this.requestFactory = new RequestFactory(operations.getElasticsearchConverter());
100+
this.responseConverter = new ResponseConverter();
95101
this.boundClass = clazz;
96102
this.boundIndex = getIndexCoordinatesFor(clazz);
97103
}
@@ -159,11 +165,11 @@ public Mono<Document> createMapping() {
159165
@Override
160166
public Mono<Document> createMapping(Class<?> clazz) {
161167

162-
Mapping mappingAnnotation = AnnotatedElementUtils.findMergedAnnotation(clazz, Mapping.class);
168+
Mapping mappingAnnotation = AnnotatedElementUtils.findMergedAnnotation(clazz, Mapping.class);
163169

164-
if (mappingAnnotation != null) {
165-
return loadDocument(mappingAnnotation.mappingPath(), "@Mapping");
166-
}
170+
if (mappingAnnotation != null) {
171+
return loadDocument(mappingAnnotation.mappingPath(), "@Mapping");
172+
}
167173

168174
String mapping = new MappingBuilder(converter).buildPropertyMapping(clazz);
169175
return Mono.just(Document.parse(mapping));
@@ -201,11 +207,11 @@ public Mono<Document> createSettings() {
201207
@Override
202208
public Mono<Document> createSettings(Class<?> clazz) {
203209

204-
Setting setting = AnnotatedElementUtils.findMergedAnnotation(clazz, Setting.class);
210+
Setting setting = AnnotatedElementUtils.findMergedAnnotation(clazz, Setting.class);
205211

206-
if (setting != null) {
207-
return loadDocument(setting.settingPath(), "@Setting");
208-
}
212+
if (setting != null) {
213+
return loadDocument(setting.settingPath(), "@Setting");
214+
}
209215

210216
return Mono.just(getRequiredPersistentEntity(clazz).getDefaultSettings());
211217
}
@@ -244,7 +250,7 @@ private Mono<Map<String, Set<AliasData>>> getAliases(@Nullable String[] aliasNam
244250

245251
GetAliasesRequest getAliasesRequest = requestFactory.getAliasesRequest(aliasNames, indexNames);
246252
return Mono.from(operations.executeWithIndicesClient(client -> client.getAliases(getAliasesRequest)))
247-
.map(GetAliasesResponse::getAliases).map(requestFactory::convertAliasesResponse);
253+
.map(GetAliasesResponse::getAliases).map(responseConverter::convertAliasesResponse);
248254
}
249255
// endregion
250256

@@ -304,6 +310,15 @@ public IndexCoordinates getIndexCoordinates() {
304310
return (boundClass != null) ? getIndexCoordinatesFor(boundClass) : boundIndex;
305311
}
306312

313+
@Override
314+
public Flux<IndexInformation> getInformation() {
315+
org.elasticsearch.client.indices.GetIndexRequest getIndexRequest = requestFactory.getIndexRequest(getIndexCoordinates());
316+
317+
return Mono.from(operations.executeWithIndicesClient(client ->
318+
client.getIndex(HttpHeaders.EMPTY, getIndexRequest).map(responseConverter::indexInformationCollection)))
319+
.flatMapMany(Flux::fromIterable);
320+
}
321+
307322
private IndexCoordinates getIndexCoordinatesFor(Class<?> clazz) {
308323
return operations.getElasticsearchConverter().getMappingContext().getRequiredPersistentEntity(clazz)
309324
.getIndexCoordinates();

Diff for: src/main/java/org/springframework/data/elasticsearch/core/DefaultTransportIndexOperations.java

+18-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
3030
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
3131
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
32+
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
33+
import org.elasticsearch.action.admin.indices.get.GetIndexResponse;
3234
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsRequest;
3335
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder;
3436
import org.elasticsearch.action.admin.indices.refresh.RefreshRequest;
@@ -57,6 +59,7 @@
5759
import org.springframework.data.elasticsearch.core.index.PutTemplateRequest;
5860
import org.springframework.data.elasticsearch.core.index.TemplateData;
5961
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
62+
import org.springframework.data.elasticsearch.core.mapping.IndexInformation;
6063
import org.springframework.data.elasticsearch.core.query.AliasQuery;
6164
import org.springframework.lang.Nullable;
6265
import org.springframework.util.Assert;
@@ -66,6 +69,7 @@
6669
*
6770
* @author Peter-Josef Meisch
6871
* @author Sascha Woo
72+
* @author George Popides
6973
* @since 4.0
7074
*/
7175
class DefaultTransportIndexOperations extends AbstractDefaultIndexOperations implements IndexOperations {
@@ -177,7 +181,7 @@ protected Map<String, Set<AliasData>> doGetAliases(@Nullable String[] aliasNames
177181

178182
Map<String, Set<AliasMetadata>> aliasesResponse = new LinkedHashMap<>();
179183
aliases.keysIt().forEachRemaining(index -> aliasesResponse.put(index, new HashSet<>(aliases.get(index))));
180-
return requestFactory.convertAliasesResponse(aliasesResponse);
184+
return responseConverter.convertAliasesResponse(aliasesResponse);
181185
}
182186

183187
@Override
@@ -243,7 +247,7 @@ public TemplateData getTemplate(GetTemplateRequest getTemplateRequest) {
243247
Iterator<String> keysItAliases = aliasesResponse.keysIt();
244248
while (keysItAliases.hasNext()) {
245249
String key = keysItAliases.next();
246-
aliases.put(key, requestFactory.convertAliasMetadata(aliasesResponse.get(key)));
250+
aliases.put(key, responseConverter.convertAliasMetadata(aliasesResponse.get(key)));
247251
}
248252

249253
Map<String, String> mappingsDoc = new LinkedHashMap<>();
@@ -296,4 +300,16 @@ public boolean deleteTemplate(DeleteTemplateRequest deleteTemplateRequest) {
296300
deleteTemplateRequest);
297301
return client.admin().indices().deleteTemplate(deleteIndexTemplateRequest).actionGet().isAcknowledged();
298302
}
303+
304+
@Override
305+
public List<IndexInformation> getInformation() {
306+
GetIndexRequest getIndexRequest = new GetIndexRequest();
307+
IndexCoordinates index = getIndexCoordinates();
308+
309+
getIndexRequest.indices(index.getIndexNames());
310+
311+
GetIndexResponse getIndexResponse = client.admin().indices().getIndex(getIndexRequest).actionGet();
312+
313+
return responseConverter.indexInformationCollection(getIndexResponse);
314+
}
299315
}

0 commit comments

Comments
 (0)