From 4163b3c89df0e86048a0e89bc94aa09d86fdc440 Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Sat, 14 May 2022 18:59:42 +0200 Subject: [PATCH] Use Elasticsearch 8.2.2. --- pom.xml | 4 +- .../elasticsearch/client/RestClients.java | 3 +- .../client/elc/ElasticsearchClients.java | 15 +++++ .../client/elc/ElasticsearchTemplate.java | 6 +- .../elc/ReactiveElasticsearchTemplate.java | 6 +- .../client/elc/RequestConverter.java | 21 +++--- .../client/elc/ResponseConverter.java | 16 ++--- .../elasticsearch/client/elc/TypeUtils.java | 17 +++-- .../client/reactive/WebClientProvider.java | 10 +++ .../core/AbstractElasticsearchTemplate.java | 10 +-- ...AbstractReactiveElasticsearchTemplate.java | 6 +- .../core/ElasticsearchRestTemplate.java | 6 +- .../core/ReactiveElasticsearchTemplate.java | 6 +- .../SimpleElasticsearchPersistentEntity.java | 23 +++---- .../NewElasticsearchClientDevelopment.java | 10 ++- .../elasticsearch/client/elc/DevTests.java | 65 +++++++++++++++---- .../ElasticsearchELCIntegrationTests.java | 2 +- .../core/ElasticsearchIntegrationTests.java | 1 + ...ctiveElasticsearchELCIntegrationTests.java | 6 ++ ...ReactiveElasticsearchIntegrationTests.java | 5 +- .../RuntimeFieldsELCIntegrationTests.java | 5 ++ .../core/RuntimeFieldsIntegrationTests.java | 5 +- .../core/geo/GeoELCIntegrationTests.java | 5 ++ .../core/geo/GeoIntegrationTests.java | 16 ++++- .../core/geo/GeoJsonELCIntegrationTests.java | 17 ++++- .../geo/GeoJsonERHLCIntegrationTests.java | 18 ++++- .../elasticsearch/core/geo/GeoJsonEntity.java | 2 +- .../core/geo/GeoJsonIntegrationTests.java | 47 ++++++-------- .../IndexTemplateELCIntegrationTests.java | 7 +- .../IndexTemplateERHLCIntegrationTests.java | 3 +- .../index/IndexTemplateIntegrationTests.java | 14 +++- .../MappingBuilderELCIntegrationTests.java | 2 +- .../IndexOperationsELCIntegrationTests.java | 4 +- .../IndexOperationsIntegrationTests.java | 2 + ...iveIndexOperationsELCIntegrationTests.java | 6 +- ...activeIndexOperationsIntegrationTests.java | 44 ++++++------- ...pleElasticsearchPersistentEntityTests.java | 27 ++++++-- .../CompletionELCIntegrationTests.java | 2 +- .../ReactiveSuggestELCIntegrationTests.java | 2 +- ...MethodRepositoryERHLCIntegrationTests.java | 5 ++ ...ustomMethodRepositoryIntegrationTests.java | 12 +++- .../testcontainers-elasticsearch.properties | 6 +- 42 files changed, 337 insertions(+), 152 deletions(-) diff --git a/pom.xml b/pom.xml index 1eec82e2c..c4fe1db23 100644 --- a/pom.xml +++ b/pom.xml @@ -21,8 +21,8 @@ 7.17.3 - 7.17.3 - 2.17.1 + 8.2.2 + 2.17.2 4.1.65.Final 3.0.0-SNAPSHOT 1.16.2 diff --git a/src/main/java/org/springframework/data/elasticsearch/client/RestClients.java b/src/main/java/org/springframework/data/elasticsearch/client/RestClients.java index 866822943..8d059e5e3 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/RestClients.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/RestClients.java @@ -43,6 +43,7 @@ import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.RestHighLevelClientBuilder; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.util.Assert; @@ -132,7 +133,7 @@ public static ElasticsearchRestClient create(ClientConfiguration clientConfigura return clientBuilder; }); - RestHighLevelClient client = new RestHighLevelClient(builder); + RestHighLevelClient client = new RestHighLevelClientBuilder(builder.build()).setApiCompatibilityMode(true).build(); return () -> client; } diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClients.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClients.java index cc845b111..53d434fb0 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClients.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClients.java @@ -19,6 +19,7 @@ import co.elastic.clients.json.jackson.JacksonJsonpMapper; import co.elastic.clients.transport.ElasticsearchTransport; import co.elastic.clients.transport.TransportOptions; +import co.elastic.clients.transport.Version; import co.elastic.clients.transport.rest_client.RestClientOptions; import co.elastic.clients.transport.rest_client.RestClientTransport; @@ -41,8 +42,10 @@ import org.apache.http.HttpResponseInterceptor; import org.apache.http.client.config.RequestConfig; import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.entity.ContentType; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.apache.http.message.BasicHeader; +import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HttpContext; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestClient; @@ -242,6 +245,18 @@ private static ElasticsearchTransport getElasticsearchTransport(RestClient restC TransportOptions.Builder transportOptionsBuilder = transportOptions != null ? transportOptions.toBuilder() : new RestClientOptions(RequestOptions.DEFAULT).toBuilder(); + + // need to add the compatibility header, this is only done automatically when not passing in custom options. + // code copied from RestClientTransport as it is not available outside the package + ContentType jsonContentType = null; + if (Version.VERSION == null) { + jsonContentType = ContentType.APPLICATION_JSON; + } else { + jsonContentType = ContentType.create("application/vnd.elasticsearch+json", + new BasicNameValuePair("compatible-with", String.valueOf(Version.VERSION.major()))); + } + transportOptionsBuilder.addHeader("Accept", jsonContentType.toString()); + TransportOptions transportOptionsWithHeader = transportOptionsBuilder .addHeader(X_SPRING_DATA_ELASTICSEARCH_CLIENT, clientType).build(); diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java index 8f1111354..99fc7a4ba 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java @@ -273,18 +273,18 @@ public List doBulkOperation(List queries, BulkOptio // endregion @Override - protected String getClusterVersion() { + public String getClusterVersion() { return execute(client -> client.info().version().number()); } @Override - protected String getVendor() { + public String getVendor() { return "Elasticsearch"; } @Override - protected String getRuntimeLibraryVersion() { + public String getRuntimeLibraryVersion() { return Version.VERSION.toString(); } diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java index 0c9d41520..c7a3b0702 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java @@ -413,17 +413,17 @@ public Flux> aggregate(Query query, Class e // endregion @Override - protected Mono getVendor() { + public Mono getVendor() { return Mono.just("Elasticsearch"); } @Override - protected Mono getRuntimeLibraryVersion() { + public Mono getRuntimeLibraryVersion() { return Mono.just(Version.VERSION != null ? Version.VERSION.toString() : "null"); } @Override - protected Mono getClusterVersion() { + public Mono getClusterVersion() { return Mono.from(execute(ReactiveElasticsearchClient::info)).map(infoResponse -> infoResponse.version().number()); } diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java index fec2d1ac4..78df81450 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java @@ -820,7 +820,7 @@ public co.elastic.clients.elasticsearch.core.ReindexRequest reindex(ReindexReque .refresh(reindexRequest.getRefresh()) // .requireAlias(reindexRequest.getRequireAlias()) // .requestsPerSecond(reindexRequest.getRequestsPerSecond()) // - .slices(reindexRequest.getSlices()); + .slices(slices(reindexRequest.getSlices())); return builder.build(); } @@ -963,24 +963,24 @@ public UpdateByQueryRequest documentUpdateByQueryRequest(UpdateQuery updateQuery .pipeline(updateQuery.getPipeline()) // .requestsPerSecond( updateQuery.getRequestsPerSecond() != null ? updateQuery.getRequestsPerSecond().longValue() : null) // - .slices(updateQuery.getSlices() != null ? Long.valueOf(updateQuery.getSlices()) : null) // - ; + .slices(slices(updateQuery.getSlices() != null ? Long.valueOf(updateQuery.getSlices()) : null)); if (updateQuery.getAbortOnVersionConflict() != null) { ub.conflicts(updateQuery.getAbortOnVersionConflict() ? Conflicts.Abort : Conflicts.Proceed); } - if (updateQuery.getBatchSize() != null) { - ub.size(Long.valueOf(updateQuery.getBatchSize())); - } - if (updateQuery.getQuery() != null) { Query queryQuery = updateQuery.getQuery(); + + if (updateQuery.getBatchSize() != null) { + ((BaseQuery) queryQuery).setMaxResults(updateQuery.getBatchSize()); + } ub.query(getQuery(queryQuery, null)); // no indicesOptions available like in old client ub.scroll(time(queryQuery.getScrollTime())); + } // no maxRetries available like in old client @@ -1164,11 +1164,11 @@ private void prepareSearchRequest(Query query, @Nullable Class clazz, Ind if (!query.getRuntimeFields().isEmpty()) { - Map runtimeMappings = new HashMap<>(); + Map> runtimeMappings = new HashMap<>(); query.getRuntimeFields().forEach(runtimeField -> { - runtimeMappings.put(runtimeField.getName(), RuntimeField.of(rt -> rt // + runtimeMappings.put(runtimeField.getName(), Collections.singletonList(RuntimeField.of(rt -> rt // .type(RuntimeFieldType._DESERIALIZER.parse(runtimeField.getType())) // - .script(s -> s.inline(is -> is.source(runtimeField.getScript()))))); + .script(s -> s.inline(is -> is.source(runtimeField.getScript())))))); }); builder.runtimeMappings(runtimeMappings); } @@ -1328,6 +1328,7 @@ private co.elastic.clients.elasticsearch._types.query_dsl.Query getQuery(@Nullab } else { throw new IllegalArgumentException("unhandled Query implementation " + query.getClass().getName()); } + return esQuery; } diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ResponseConverter.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ResponseConverter.java index ab43811d4..67341b449 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ResponseConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ResponseConverter.java @@ -90,7 +90,7 @@ public ClusterHealth clusterHealth(HealthResponse healthResponse) { .withNumberOfPendingTasks(healthResponse.numberOfPendingTasks()) // .withRelocatingShards(healthResponse.relocatingShards()) // .withStatus(healthResponse.status().toString()) // - .withTaskMaxWaitingTimeMillis(Long.parseLong(healthResponse.taskMaxWaitingInQueueMillis())) // + .withTaskMaxWaitingTimeMillis(healthResponse.taskMaxWaitingInQueueMillis().toEpochMilli()) // .withTimedOut(healthResponse.timedOut()) // .withUnassignedShards(healthResponse.unassignedShards()) // .build(); // @@ -144,11 +144,11 @@ public Document indicesGetMapping(GetMappingResponse getMappingResponse, IndexCo if (indexMappingRecord == null) { if (mappings.size() != 1) { - LOGGER.warn("no mapping returned for index {}", indexCoordinates.getIndexName()); - return Document.create(); - } - String index = mappings.keySet().iterator().next(); - indexMappingRecord = mappings.get(index); + LOGGER.warn("no mapping returned for index {}", indexCoordinates.getIndexName()); + return Document.create(); + } + String index = mappings.keySet().iterator().next(); + indexMappingRecord = mappings.get(index); } return Document.parse(toJson(indexMappingRecord.mappings(), jsonpMapper)); @@ -277,9 +277,9 @@ public ReindexResponse reindexResponse(co.elastic.clients.elasticsearch.core.Rei .withNoops(reindexResponse.noops()) // .withBulkRetries(reindexResponse.retries().bulk()) // .withSearchRetries(reindexResponse.retries().search()) // - .withThrottledMillis(Long.parseLong(reindexResponse.throttledMillis())) // + .withThrottledMillis(reindexResponse.throttledMillis().toEpochMilli()) // .withRequestsPerSecond(reindexResponse.requestsPerSecond()) // - .withThrottledUntilMillis(Long.parseLong(reindexResponse.throttledUntilMillis())).withFailures(failures) // + .withThrottledUntilMillis(reindexResponse.throttledUntilMillis().toEpochMilli()).withFailures(failures) // .build(); } diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/TypeUtils.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/TypeUtils.java index f68533a82..9e96d98be 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/TypeUtils.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/TypeUtils.java @@ -18,7 +18,6 @@ import co.elastic.clients.elasticsearch._types.*; import co.elastic.clients.elasticsearch._types.mapping.FieldType; import co.elastic.clients.elasticsearch.core.search.BoundaryScanner; -import co.elastic.clients.elasticsearch.core.search.BuiltinHighlighterType; import co.elastic.clients.elasticsearch.core.search.HighlighterEncoder; import co.elastic.clients.elasticsearch.core.search.HighlighterFragmenter; import co.elastic.clients.elasticsearch.core.search.HighlighterOrder; @@ -170,11 +169,11 @@ static HighlighterType highlighterType(@Nullable String value) { if (value != null) { switch (value.toLowerCase()) { case "unified": - return HighlighterType.of(b -> b.builtin(BuiltinHighlighterType.Unified)); + return HighlighterType.Unified; case "plain": - return HighlighterType.of(b -> b.builtin(BuiltinHighlighterType.Plain)); + return HighlighterType.Plain; case "fvh": - return HighlighterType.of(b -> b.builtin(BuiltinHighlighterType.FastVector)); + return HighlighterType.FastVector; default: return null; } @@ -308,6 +307,16 @@ static SearchType searchType(@Nullable Query.SearchType searchType) { return null; } + @Nullable + static Slices slices(@Nullable Long count) { + + if (count == null) { + return null; + } + + return Slices.of(s -> s.value(Math.toIntExact(count))); + } + @Nullable static SortMode sortMode(Order.Mode mode) { diff --git a/src/main/java/org/springframework/data/elasticsearch/client/reactive/WebClientProvider.java b/src/main/java/org/springframework/data/elasticsearch/client/reactive/WebClientProvider.java index 44ea51ed5..01da85fd2 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/reactive/WebClientProvider.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/reactive/WebClientProvider.java @@ -257,6 +257,16 @@ static WebClientProvider getWebClientProvider(ClientConfiguration clientConfigur if (suppliedHeaders != null && suppliedHeaders != HttpHeaders.EMPTY) { httpHeaders.addAll(suppliedHeaders); } + + // this WebClientProvider is built with ES 7 and not used on 8 anymore + httpHeaders.add("Accept", "application/vnd.elasticsearch+json;compatible-with=7"); + + var contentTypeHeader = "Content-Type"; + if (httpHeaders.containsKey(contentTypeHeader)) { + httpHeaders.remove(contentTypeHeader); + } + httpHeaders.add(contentTypeHeader, "application/vnd.elasticsearch+json;compatible-with=7"); + })); return provider; diff --git a/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java index 6980e41dd..07ace4c68 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java @@ -145,8 +145,8 @@ public void setApplicationContext(ApplicationContext applicationContext) throws /** * Set the {@link EntityCallbacks} instance to use when invoking {@link EntityCallbacks callbacks} like the - * {@link org.springframework.data.elasticsearch.core.event.BeforeConvertCallback}. - * Overrides potentially existing {@link EntityCallbacks}. + * {@link org.springframework.data.elasticsearch.core.event.BeforeConvertCallback}. Overrides potentially existing + * {@link EntityCallbacks}. * * @param entityCallbacks must not be {@literal null}. * @throws IllegalArgumentException if the given instance is {@literal null}. @@ -588,19 +588,19 @@ protected SearchDocumentResponse.EntityCreator getEntityCreator(ReadDocum * @return the version as string if it can be retrieved */ @Nullable - abstract protected String getClusterVersion(); + public abstract String getClusterVersion(); /** * @return the vendor name of the used cluster and client library * @since 4.3 */ - abstract protected String getVendor(); + public abstract String getVendor(); /** * @return the version of the used client runtime library. * @since 4.3 */ - abstract protected String getRuntimeLibraryVersion(); + public abstract String getRuntimeLibraryVersion(); // endregion diff --git a/src/main/java/org/springframework/data/elasticsearch/core/AbstractReactiveElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/AbstractReactiveElasticsearchTemplate.java index bd2974ffd..83b834d98 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/AbstractReactiveElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/AbstractReactiveElasticsearchTemplate.java @@ -611,15 +611,15 @@ public ElasticsearchPersistentEntity getPersistentEntityFor(@Nullable Class getVendor(); + public abstract Mono getVendor(); /** * @return the version of the used client runtime library. * @since 4.3 */ - abstract protected Mono getRuntimeLibraryVersion(); + public abstract Mono getRuntimeLibraryVersion(); - abstract protected Mono getClusterVersion(); + public abstract Mono getClusterVersion(); /** * Value class to capture client independent information from a response to an index request. diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplate.java index 2eb74cf44..ecce20f0d 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplate.java @@ -607,7 +607,7 @@ private RuntimeException translateException(Exception exception) { // region helper methods @Override - protected String getClusterVersion() { + public String getClusterVersion() { try { return execute(client -> client.info(RequestOptions.DEFAULT)).getVersion().getNumber(); } catch (Exception ignored) {} @@ -629,12 +629,12 @@ public Query idsQuery(List ids) { } @Override - protected String getVendor() { + public String getVendor() { return "Elasticsearch"; } @Override - protected String getRuntimeLibraryVersion() { + public String getRuntimeLibraryVersion() { return Version.CURRENT.toString(); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplate.java index ae3a86c1d..e29864a65 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplate.java @@ -676,7 +676,7 @@ protected SearchRequest prepareSearchRequest(SearchRequest request, boolean useS // region Helper methods @Override - protected Mono getClusterVersion() { + public Mono getClusterVersion() { try { return Mono.from(execute(ReactiveElasticsearchClient::info)) .map(mainResponse -> mainResponse.getVersion().toString()); @@ -689,7 +689,7 @@ protected Mono getClusterVersion() { * @since 4.3 */ @Override - protected Mono getVendor() { + public Mono getVendor() { return Mono.just("Elasticsearch"); } @@ -698,7 +698,7 @@ protected Mono getVendor() { * @since 4.3 */ @Override - protected Mono getRuntimeLibraryVersion() { + public Mono getRuntimeLibraryVersion() { return Mono.just(Version.CURRENT.toString()); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntity.java b/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntity.java index e63f24ded..4028efb74 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntity.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntity.java @@ -510,36 +510,37 @@ Settings toSettings() { return new Settings(); } - Settings settings = new Settings() // - .append("index.number_of_shards", String.valueOf(shards)) - .append("index.number_of_replicas", String.valueOf(replicas)); + var index = new Settings() // + .append("number_of_shards", String.valueOf(shards)) // + .append("number_of_replicas", String.valueOf(replicas)); if (refreshIntervall != null) { - settings.append("index.refresh_interval", refreshIntervall); + index.append("refresh_interval", refreshIntervall); } if (indexStoreType != null) { - settings.append("index.store.type", indexStoreType); + index.append("store", new Settings().append("type", indexStoreType)); } if (sortFields != null && sortFields.length > 0) { - settings.append("index.sort.field", sortFields); + var sort = new Settings().append("field", sortFields); if (sortOrders != null && sortOrders.length > 0) { - settings.append("index.sort.order", sortOrders); + sort.append("order", sortOrders); } if (sortModes != null && sortModes.length > 0) { - settings.append("index.sort.mode", sortModes); + sort.append("mode", sortModes); } if (sortMissingValues != null && sortMissingValues.length > 0) { - settings.append("index.sort.missing", sortMissingValues); + sort.append("missing", sortMissingValues); } - } - return settings; // + index.append("sort", sort); + } + return new Settings().append("index", index); // } } diff --git a/src/test/java/org/springframework/data/elasticsearch/NewElasticsearchClientDevelopment.java b/src/test/java/org/springframework/data/elasticsearch/NewElasticsearchClientDevelopment.java index 5c098ccd9..7e2d229d3 100644 --- a/src/test/java/org/springframework/data/elasticsearch/NewElasticsearchClientDevelopment.java +++ b/src/test/java/org/springframework/data/elasticsearch/NewElasticsearchClientDevelopment.java @@ -16,19 +16,17 @@ package org.springframework.data.elasticsearch; /** - * TODO remove when the new Elasticsearch client is fully working + * TODO remove when the new Elasticsearch client is fully working and the old client is removed * * @author Peter-Josef Meisch */ public interface NewElasticsearchClientDevelopment { - boolean forceEnable = false; - - default boolean usesNewElasticsearchClient() { + default boolean newElasticsearchClient() { return false; } - default boolean newElasticsearchClient() { - return !forceEnable && usesNewElasticsearchClient(); + default boolean oldElasticsearchClient() { + return !newElasticsearchClient(); } } diff --git a/src/test/java/org/springframework/data/elasticsearch/client/elc/DevTests.java b/src/test/java/org/springframework/data/elasticsearch/client/elc/DevTests.java index b0c3e9819..07ba20822 100644 --- a/src/test/java/org/springframework/data/elasticsearch/client/elc/DevTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/client/elc/DevTests.java @@ -19,6 +19,9 @@ import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch._types.FieldValue; +import co.elastic.clients.elasticsearch._types.Script; +import co.elastic.clients.elasticsearch._types.mapping.RuntimeField; +import co.elastic.clients.elasticsearch._types.mapping.RuntimeFieldType; import co.elastic.clients.elasticsearch._types.mapping.TypeMapping; import co.elastic.clients.elasticsearch.cluster.HealthRequest; import co.elastic.clients.elasticsearch.cluster.HealthResponse; @@ -36,6 +39,7 @@ import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Collections; import java.util.Objects; import java.util.function.Function; @@ -83,22 +87,29 @@ void someTest() throws IOException { ElasticsearchClient client = imperativeElasticsearchClient; - String index = "testindex"; +String index = "testindex"; - Person person = new Person("42", new Name("Ford", "Prefect")); +var p = new Product("p1", 42.0); - if (LOGGER.isInfoEnabled()) { - LOGGER.info(String.format("Person: %s", person)); - } - - IndexRequest indexRequest = IndexRequest.of(b -> b.index(index).id(person.id).document(person)); +client.index(ir -> ir // + .index(index)// + .document(p)); - client.index(indexRequest); - client.search(srb -> srb.index(index).trackTotalHits(thb -> thb.enabled(false)), Person.class); +client.indices().flush(f -> f.index(index)); - ReactiveClient asyncClient = new ReactiveClient(client._transport()); +RuntimeField runtimeField = RuntimeField.of(rf -> rf // + .type(RuntimeFieldType.Double) // + .script(Script.of(s -> s // + .inline(i -> i. // + source("emit(doc['price'].value * 1.19)") // + ) // + )) // +); // - asyncClient.index(indexRequest).block(); +client.search(sr -> sr // + .index(index) // + .runtimeMappings("priceWithTax", Collections.singletonList(runtimeField)), // + Person.class); // } static class ReactiveClient { @@ -113,6 +124,36 @@ public Mono index(IndexRequest request) { } } + static class Product { + @Nullable String id; + @Nullable Double price; + + public Product() {} + + public Product(@Nullable String id, @Nullable Double price) { + this.id = id; + this.price = price; + } + + @Nullable + public String getId() { + return id; + } + + public void setId(@Nullable String id) { + this.id = id; + } + + @Nullable + public Double getPrice() { + return price; + } + + public void setPrice(@Nullable Double price) { + this.price = price; + } + } + static class Person { @Nullable String id; @Nullable Name name; @@ -327,7 +368,7 @@ private ResponseBody searchReactive(SearchRequest searchRequest) { private ClientConfiguration clientConfiguration() { return ClientConfiguration.builder() // - .connectedTo("localhost:9200")// + .connectedTo("thranduil.local.:9200")// .withBasicAuth("elastic", "hcraescitsale").withProxy("localhost:8080") // .withHeaders(() -> { HttpHeaders headers = new HttpHeaders(); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchELCIntegrationTests.java index dd7cd018d..89253b901 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchELCIntegrationTests.java @@ -61,7 +61,7 @@ IndexNameProvider indexNameProvider() { } @Override - public boolean usesNewElasticsearchClient() { + public boolean newElasticsearchClient() { return true; } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java index 20bcb1c79..a58cc2b01 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java @@ -2783,6 +2783,7 @@ public void shouldNotIncludeDefaultsGetIndexSettings() { assertThat(settings).doesNotContainKey("index.max_result_window"); } + @DisabledIf(value = "newElasticsearchClient", disabledReason = "todo #2165, ES issue 286") @Test // DATAES-709 public void shouldIncludeDefaultsOnGetIndexSettings() { diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchELCIntegrationTests.java index 80ed21033..5af02c1f7 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchELCIntegrationTests.java @@ -56,6 +56,12 @@ IndexNameProvider indexNameProvider() { return new IndexNameProvider("reactive-template"); } } + + @Override + public boolean newElasticsearchClient() { + return true; + } + @Override protected Query getTermsAggsQuery(String aggsName, String aggsField) { return ELCQueries.getTermsAggsQuery(aggsName, aggsField); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchIntegrationTests.java index fae7ab12d..6aaf1ac41 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchIntegrationTests.java @@ -45,6 +45,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; import org.skyscreamer.jsonassert.JSONAssert; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -54,6 +55,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; +import org.springframework.data.elasticsearch.NewElasticsearchClientDevelopment; import org.springframework.data.elasticsearch.RestStatusException; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; @@ -88,7 +90,7 @@ */ @SuppressWarnings("SpringJavaAutowiredMembersInspection") @SpringIntegrationTest -public abstract class ReactiveElasticsearchIntegrationTests { +public abstract class ReactiveElasticsearchIntegrationTests implements NewElasticsearchClientDevelopment { @Autowired private ReactiveElasticsearchOperations operations; @Autowired private IndexNameProvider indexNameProvider; @@ -1072,6 +1074,7 @@ void shouldReturnExplanationWhenRequested() { }).verifyComplete(); } + @DisabledIf(value = "newElasticsearchClient", disabledReason = "todo #2165, ES issue 286") @Test // #1646, #1718 @DisplayName("should return a list of info for specific index") void shouldReturnInformationListOfAllIndices() { diff --git a/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsELCIntegrationTests.java index 417554f4a..b232fa31e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsELCIntegrationTests.java @@ -37,4 +37,9 @@ IndexNameProvider indexNameProvider() { return new IndexNameProvider("runtime-fields-rest-template"); } } + + @Override + public boolean newElasticsearchClient() { + return true; + } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsIntegrationTests.java index 06dbf157e..55800c2a1 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsIntegrationTests.java @@ -21,8 +21,10 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.NewElasticsearchClientDevelopment; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; @@ -38,7 +40,7 @@ * @author Peter-Josef Meisch */ @SpringIntegrationTest -public abstract class RuntimeFieldsIntegrationTests { +public abstract class RuntimeFieldsIntegrationTests implements NewElasticsearchClientDevelopment { @Autowired private ElasticsearchOperations operations; @Autowired protected IndexNameProvider indexNameProvider; @@ -58,6 +60,7 @@ void cleanup() { operations.indexOps(IndexCoordinates.of(indexNameProvider.getPrefix() + "*")).delete(); } + @DisabledIf(value = "newElasticsearchClient", disabledReason = "todo #2171, ES issue 298") @Test // #1971 @DisplayName("should use runtime-field from query in search") void shouldUseRuntimeFieldFromQueryInSearch() { diff --git a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoELCIntegrationTests.java index 05742ca77..b1dcf322e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoELCIntegrationTests.java @@ -45,6 +45,11 @@ IndexNameProvider indexNameProvider() { } } + @Override + public boolean newElasticsearchClient() { + return true; + } + @Override protected Query nativeQueryForBoundingBox(String fieldName, double top, double left, double bottom, double right) { return NativeQuery.builder() // diff --git a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoIntegrationTests.java index 95a76292a..e56fc67b7 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoIntegrationTests.java @@ -23,10 +23,13 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.NewElasticsearchClientDevelopment; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.GeoPointField; +import org.springframework.data.elasticsearch.core.AbstractElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.SearchHits; @@ -53,11 +56,16 @@ * Latitude , max Longitude , max Latitude */ @SpringIntegrationTest -public abstract class GeoIntegrationTests { +public abstract class GeoIntegrationTests implements NewElasticsearchClientDevelopment { @Autowired private ElasticsearchOperations operations; @Autowired private IndexNameProvider indexNameProvider; + boolean rhlcWithCluster8() { + var clusterVersion = ((AbstractElasticsearchTemplate) operations).getClusterVersion(); + return (oldElasticsearchClient() && clusterVersion != null && clusterVersion.startsWith("8")); + } + @BeforeEach public void before() { indexNameProvider.increment(); @@ -219,6 +227,7 @@ public void shouldFindAnnotatedGeoMarkersInRangeForGivenCriteriaQueryUsingGeohas assertThat(geoAuthorsForGeoCriteria).hasSize(3); } + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test public void shouldFindAllMarkersForNativeSearchQuery() { @@ -236,6 +245,7 @@ public void shouldFindAllMarkersForNativeSearchQuery() { protected abstract Query nativeQueryForBoundingBox(String fieldName, double top, double left, double bottom, double right); + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeoBox() { @@ -254,6 +264,7 @@ public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeoBox() { .containsExactlyInAnyOrder("def", "ghi"); } + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeohash() { @@ -272,6 +283,7 @@ public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeohash() { .containsExactlyInAnyOrder("def", "ghi"); } + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeoPoints() { @@ -290,6 +302,7 @@ public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeoPoints() { .containsExactlyInAnyOrder("def", "ghi"); } + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingPoints() { @@ -308,6 +321,7 @@ public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingPoints() { .containsExactlyInAnyOrder("def", "ghi"); } + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test public void shouldFindLocationWithGeoHashPrefix() { diff --git a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonELCIntegrationTests.java index 9995237ae..03de9bc21 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonELCIntegrationTests.java @@ -16,13 +16,26 @@ package org.springframework.data.elasticsearch.core.geo; import org.junit.jupiter.api.DisplayName; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchTemplateConfiguration; +import org.springframework.data.elasticsearch.utils.IndexNameProvider; import org.springframework.test.context.ContextConfiguration; /** * @author Peter-Josef Meisch * @since 4.4 */ -@ContextConfiguration(classes = { ElasticsearchTemplateConfiguration.class }) +@ContextConfiguration(classes = { GeoJsonELCIntegrationTests.Config.class }) @DisplayName("GeoJson integration test with ElasticsearchClient") -public class GeoJsonELCIntegrationTests extends GeoJsonIntegrationTests {} +public class GeoJsonELCIntegrationTests extends GeoJsonIntegrationTests { + @Configuration + @Import({ ElasticsearchTemplateConfiguration.class }) + static class Config { + @Bean + IndexNameProvider indexNameProvider() { + return new IndexNameProvider("geojson-integration"); + } + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonERHLCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonERHLCIntegrationTests.java index 958d83f17..2a629bac1 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonERHLCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonERHLCIntegrationTests.java @@ -16,12 +16,26 @@ package org.springframework.data.elasticsearch.core.geo; import org.junit.jupiter.api.DisplayName; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchRestTemplateConfiguration; +import org.springframework.data.elasticsearch.utils.IndexNameProvider; import org.springframework.test.context.ContextConfiguration; /** * @author Peter-Josef Meisch */ -@ContextConfiguration(classes = { ElasticsearchRestTemplateConfiguration.class }) +@ContextConfiguration(classes = { GeoJsonERHLCIntegrationTests.Config.class }) @DisplayName("GeoJson integration test with RestHighLevelClient") -public class GeoJsonERHLCIntegrationTests extends GeoJsonIntegrationTests {} +public class GeoJsonERHLCIntegrationTests extends GeoJsonIntegrationTests { + @Configuration + @Import({ ElasticsearchRestTemplateConfiguration.class }) + static class Config { + @Bean + IndexNameProvider indexNameProvider() { + return new IndexNameProvider("geojson-integration-es7"); + } + } + +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonEntity.java b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonEntity.java index 7c93f3bac..5e7c3ac0a 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonEntity.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonEntity.java @@ -23,7 +23,7 @@ /** * this class contains each GeoJson type as explicit type and as GeoJson interface. Used by several test classes */ -@Document(indexName = "geojson-index") +@Document(indexName = "#{@indexNameProvider.indexName()}-geojson") public class GeoJsonEntity { @Nullable @Id private String id; diff --git a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonIntegrationTests.java index 998ced193..9b9f3bbab 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/geo/GeoJsonIntegrationTests.java @@ -19,20 +19,21 @@ import java.util.Arrays; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.elasticsearch.core.IndexOperations; import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.Criteria; import org.springframework.data.elasticsearch.core.query.CriteriaQuery; import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest; +import org.springframework.data.elasticsearch.utils.IndexNameProvider; import org.springframework.data.geo.Point; import org.springframework.lang.Nullable; @@ -44,7 +45,21 @@ abstract class GeoJsonIntegrationTests { @Autowired private ElasticsearchOperations operations; - private IndexOperations indexOps; + @Autowired private IndexNameProvider indexNameProvider; + + @BeforeEach + public void before() { + indexNameProvider.increment(); + operations.indexOps(Area.class).createWithMapping(); + operations.indexOps(GeoJsonEntity.class).createWithMapping(); + operations.save(Arrays.asList(area10To20, area30To40)); + } + + @Test + @Order(java.lang.Integer.MAX_VALUE) + void cleanup() { + operations.indexOps(IndexCoordinates.of("*" + indexNameProvider.getPrefix() + "*")).delete(); + } // region data @@ -89,29 +104,6 @@ abstract class GeoJsonIntegrationTests { private final Area area32To37 = new Area("area32To37", geoShape30To40); // endregion - // region setup - @BeforeEach - void setUp() { - indexOps = operations.indexOps(GeoJsonEntity.class); - indexOps.delete(); - indexOps.create(); - indexOps.putMapping(); - - IndexOperations indexOpsArea = operations.indexOps(Area.class); - indexOpsArea.delete(); - indexOpsArea.create(); - indexOpsArea.putMapping(); - - operations.save(Arrays.asList(area10To20, area30To40)); - indexOpsArea.refresh(); - } - - @AfterEach - void tearDown() { - indexOps.delete(); - } - // endregion - // region tests @Test // DATAES-930 @DisplayName("should write and read an entity with GeoJson properties") @@ -149,7 +141,6 @@ void shouldWriteAndReadAnEntityWithGeoJsonProperties() { entity.setGeometryCollection2(geoJsonGeometryCollection); operations.save(entity); - indexOps.refresh(); GeoJsonEntity result = operations.get("42", GeoJsonEntity.class); @@ -202,7 +193,7 @@ void shouldFindContainsObjectsWithCriteriaQuery() { // endregion // region test classes - @Document(indexName = "areas") + @Document(indexName = "#{@indexNameProvider.indexName()}-area") static class Area { @Nullable @Id private String id; diff --git a/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateELCIntegrationTests.java index f7d3de0dc..625f5a16e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateELCIntegrationTests.java @@ -23,4 +23,9 @@ * @since 4.4 */ @ContextConfiguration(classes = { ElasticsearchTemplateConfiguration.class }) -public class IndexTemplateELCIntegrationTests extends IndexTemplateIntegrationTests {} +public class IndexTemplateELCIntegrationTests extends IndexTemplateIntegrationTests { + @Override + public boolean newElasticsearchClient() { + return true; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateERHLCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateERHLCIntegrationTests.java index 3bb251cb7..e7828ddd8 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateERHLCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateERHLCIntegrationTests.java @@ -22,4 +22,5 @@ * @author Peter-Josef Meisch */ @ContextConfiguration(classes = { ElasticsearchRestTemplateConfiguration.class }) -public class IndexTemplateERHLCIntegrationTests extends IndexTemplateIntegrationTests {} +public class IndexTemplateERHLCIntegrationTests extends IndexTemplateIntegrationTests { +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateIntegrationTests.java index a275349e3..6bae8d826 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/index/IndexTemplateIntegrationTests.java @@ -23,12 +23,15 @@ import org.json.JSONException; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.NewElasticsearchClientDevelopment; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.data.elasticsearch.annotations.Setting; +import org.springframework.data.elasticsearch.core.AbstractElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.IndexOperations; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; @@ -39,10 +42,16 @@ * @author Peter-Josef Meisch */ @SpringIntegrationTest -public abstract class IndexTemplateIntegrationTests { +public abstract class IndexTemplateIntegrationTests implements NewElasticsearchClientDevelopment { @Autowired ElasticsearchOperations operations; + boolean rhlcWithCluster8() { + var clusterVersion = ((AbstractElasticsearchTemplate) operations).getClusterVersion(); + return (oldElasticsearchClient() && clusterVersion != null && clusterVersion.startsWith("8")); + } + + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test // DATAES-612 void shouldCreateTemplate() { @@ -76,6 +85,7 @@ void shouldReturnNullOnNonExistingGetTemplate() { assertThat(templateData).isNull(); } + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test // DATAES-612 void shouldGetTemplate() throws JSONException { IndexOperations indexOps = operations.indexOps(IndexCoordinates.of("dont-care")); @@ -101,7 +111,7 @@ void shouldGetTemplate() throws JSONException { assertThat(templateData).isNotNull(); assertThat(templateData.getIndexPatterns()).containsExactlyInAnyOrder(putTemplateRequest.getIndexPatterns()); - assertEquals(settings.toJson(), templateData.getSettings().toJson(), false); + assertEquals(settings.flatten().toJson(), templateData.getSettings().toJson(), false); assertEquals(mapping.toJson(), templateData.getMapping().toJson(), false); Map aliases = templateData.getAliases(); assertThat(aliases).hasSize(2); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderELCIntegrationTests.java index 6fbfd2e24..0fcf4567a 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderELCIntegrationTests.java @@ -39,7 +39,7 @@ IndexNameProvider indexNameProvider() { } @Override - public boolean usesNewElasticsearchClient() { + public boolean newElasticsearchClient() { return true; } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/indices/IndexOperationsELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/indices/IndexOperationsELCIntegrationTests.java index a035bb5d7..7dfd87f6f 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/indices/IndexOperationsELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/indices/IndexOperationsELCIntegrationTests.java @@ -33,12 +33,12 @@ public class IndexOperationsELCIntegrationTests extends IndexOperationsIntegrati static class Config { @Bean IndexNameProvider indexNameProvider() { - return new IndexNameProvider("indexoperations-es"); + return new IndexNameProvider("indexoperations"); } } @Override - public boolean usesNewElasticsearchClient() { + public boolean newElasticsearchClient() { return true; } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/indices/IndexOperationsIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/indices/IndexOperationsIntegrationTests.java index e69ee61eb..17b5654a1 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/indices/IndexOperationsIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/indices/IndexOperationsIntegrationTests.java @@ -25,6 +25,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; import org.skyscreamer.jsonassert.JSONAssert; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; @@ -70,6 +71,7 @@ void cleanup() { operations.indexOps(IndexCoordinates.of(indexNameProvider.getPrefix() + "*")).delete(); } + @DisabledIf(value = "newElasticsearchClient", disabledReason = "todo #2165, ES issue 286") @Test // #1646, #1718 @DisplayName("should return a list of info for specific index") void shouldReturnInformationList() throws JSONException { diff --git a/src/test/java/org/springframework/data/elasticsearch/core/indices/ReactiveIndexOperationsELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/indices/ReactiveIndexOperationsELCIntegrationTests.java index fa981d2c5..6fc55aead 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/indices/ReactiveIndexOperationsELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/indices/ReactiveIndexOperationsELCIntegrationTests.java @@ -27,7 +27,6 @@ */ @ContextConfiguration(classes = { ReactiveIndexOperationsELCIntegrationTests.Config.class }) public class ReactiveIndexOperationsELCIntegrationTests extends ReactiveIndexOperationsIntegrationTests { - @Configuration @Import({ ReactiveElasticsearchTemplateConfiguration.class }) static class Config { @@ -36,4 +35,9 @@ IndexNameProvider indexNameProvider() { return new IndexNameProvider("reactive-indexoperations"); } } + + @Override + public boolean newElasticsearchClient() { + return true; + } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/indices/ReactiveIndexOperationsIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/indices/ReactiveIndexOperationsIntegrationTests.java index d9d308f20..8534928b2 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/indices/ReactiveIndexOperationsIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/indices/ReactiveIndexOperationsIntegrationTests.java @@ -31,26 +31,20 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.NewElasticsearchClientDevelopment; import org.springframework.data.elasticsearch.annotations.DateFormat; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.data.elasticsearch.annotations.Mapping; import org.springframework.data.elasticsearch.annotations.Setting; +import org.springframework.data.elasticsearch.core.AbstractReactiveElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations; import org.springframework.data.elasticsearch.core.ReactiveIndexOperations; -import org.springframework.data.elasticsearch.core.index.AliasAction; -import org.springframework.data.elasticsearch.core.index.AliasActionParameters; -import org.springframework.data.elasticsearch.core.index.AliasActions; -import org.springframework.data.elasticsearch.core.index.AliasData; -import org.springframework.data.elasticsearch.core.index.DeleteTemplateRequest; -import org.springframework.data.elasticsearch.core.index.ExistsTemplateRequest; -import org.springframework.data.elasticsearch.core.index.GetTemplateRequest; -import org.springframework.data.elasticsearch.core.index.PutTemplateRequest; -import org.springframework.data.elasticsearch.core.index.Settings; -import org.springframework.data.elasticsearch.core.index.TemplateData; +import org.springframework.data.elasticsearch.core.index.*; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest; import org.springframework.data.elasticsearch.utils.IndexNameProvider; @@ -60,12 +54,17 @@ * @author Peter-Josef Meisch */ @SpringIntegrationTest -public abstract class ReactiveIndexOperationsIntegrationTests { +public abstract class ReactiveIndexOperationsIntegrationTests implements NewElasticsearchClientDevelopment { @Autowired private ReactiveElasticsearchOperations operations; @Autowired private IndexNameProvider indexNameProvider; private ReactiveIndexOperations indexOperations; + boolean rhlcWithCluster8() { + var clusterVersion = ((AbstractReactiveElasticsearchTemplate) operations).getClusterVersion().block(); + return (oldElasticsearchClient() && clusterVersion != null && clusterVersion.startsWith("8")); + } + @BeforeEach void setUp() { indexNameProvider.increment(); @@ -124,11 +123,11 @@ void shouldCreateIndexForEntity() { @Test // DATAES-678 void shouldCreateIndexWithGivenSettings() { - org.springframework.data.elasticsearch.core.document.Document requiredSettings = org.springframework.data.elasticsearch.core.document.Document - .create(); - requiredSettings.put("index.number_of_replicas", 3); - requiredSettings.put("index.number_of_shards", 4); - requiredSettings.put("index.refresh_interval", "5s"); + var index = new Settings() // + .append("number_of_replicas", 3) // + .append("number_of_shards", 4)// + .append("refresh_interval", "5s"); + var requiredSettings = new Settings().append("index", index); indexOperations.create(requiredSettings) // .as(StepVerifier::create) // @@ -136,9 +135,10 @@ void shouldCreateIndexWithGivenSettings() { .verifyComplete(); indexOperations.getSettings().as(StepVerifier::create).consumeNextWith(settings -> { - assertThat(settings.get("index.number_of_replicas")).isEqualTo("3"); - assertThat(settings.get("index.number_of_shards")).isEqualTo("4"); - assertThat(settings.get("index.refresh_interval")).isEqualTo("5s"); + var flattened = settings.flatten(); + assertThat(flattened.get("index.number_of_replicas")).isEqualTo("3"); + assertThat(flattened.get("index.number_of_shards")).isEqualTo("4"); + assertThat(flattened.get("index.refresh_interval")).isEqualTo("5s"); }).verifyComplete(); } @@ -359,6 +359,7 @@ void shouldGetAliasData() { .verifyComplete(); } + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test // DATAES-612 void shouldPutTemplate() { @@ -391,6 +392,7 @@ void shouldReturnNullOnNonExistingGetTemplate() { .verifyComplete(); } + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test // DATAES-612 void shouldGetTemplate() throws JSONException { @@ -417,10 +419,8 @@ void shouldGetTemplate() throws JSONException { SoftAssertions softly = new SoftAssertions(); softly.assertThat(templateData).isNotNull(); softly.assertThat(templateData.getIndexPatterns()).containsExactlyInAnyOrder(putTemplateRequest.getIndexPatterns()); - assertEquals(settings.toJson(), templateData.getSettings().toJson(), false); - + assertEquals(settings.flatten().toJson(), templateData.getSettings().toJson(), false); assertEquals(mapping.toJson(), templateData.getMapping().toJson(), false); - Map aliases = templateData.getAliases(); softly.assertThat(aliases).hasSize(2); AliasData alias1 = aliases.get("alias1"); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntityTests.java b/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntityTests.java index 3ba22a3b8..197d0bb03 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntityTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntityTests.java @@ -177,16 +177,29 @@ void shouldErrorIfIndexSortingParametersDoNotHaveTheSameNumberOfArguments() { .isInstanceOf(IllegalArgumentException.class); } - @Test // #1719 + @Test // #1719, #2158 @DisplayName("should write sort parameters to Settings object") void shouldWriteSortParametersToSettingsObject() throws JSONException { - String expected = "{\n" + // - " \"index.sort.field\": [\"second_field\", \"first_field\"],\n" + // - " \"index.sort.mode\": [\"max\", \"min\"],\n" + // - " \"index.sort.order\": [\"desc\",\"asc\"],\n" + // - " \"index.sort.missing\": [\"_last\",\"_first\"]\n" + // - "}\n"; // + String expected = """ + { + "index": { + "sort": { + "field": [ + "second_field", + "first_field" + ], + "mode": [ + "max", + "min" + ], + "missing": [ + "_last", + "_first" + ] + } + } + } """; ElasticsearchPersistentEntity entity = elasticsearchConverter.get().getMappingContext() .getRequiredPersistentEntity(SettingsValidSortParameterSizes.class); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/suggest/CompletionELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/suggest/CompletionELCIntegrationTests.java index 00b675833..a020bb39d 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/suggest/CompletionELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/suggest/CompletionELCIntegrationTests.java @@ -47,7 +47,7 @@ IndexNameProvider indexNameProvider() { } @Override - public boolean usesNewElasticsearchClient() { + public boolean newElasticsearchClient() { return true; } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/suggest/ReactiveSuggestELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/suggest/ReactiveSuggestELCIntegrationTests.java index b15dac6ea..cb07c6535 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/suggest/ReactiveSuggestELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/suggest/ReactiveSuggestELCIntegrationTests.java @@ -45,7 +45,7 @@ IndexNameProvider indexNameProvider() { } @Override - public boolean usesNewElasticsearchClient() { + public boolean newElasticsearchClient() { return true; } diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryERHLCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryERHLCIntegrationTests.java index 92051ec99..6805329f8 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryERHLCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryERHLCIntegrationTests.java @@ -42,4 +42,9 @@ IndexNameProvider indexNameProvider() { return new IndexNameProvider("custom-method-repository-es7"); } } + + @Override + public boolean newElasticsearchClient() { + return false; + } } diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryIntegrationTests.java index 145ce57d8..1d3feef59 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryIntegrationTests.java @@ -32,6 +32,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Version; @@ -40,12 +41,14 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Order; +import org.springframework.data.elasticsearch.NewElasticsearchClientDevelopment; import org.springframework.data.elasticsearch.annotations.CountQuery; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.Highlight; import org.springframework.data.elasticsearch.annotations.HighlightField; import org.springframework.data.elasticsearch.annotations.Query; +import org.springframework.data.elasticsearch.core.AbstractElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.SearchHits; @@ -75,7 +78,7 @@ * @author James Mudd */ @SpringIntegrationTest -public abstract class CustomMethodRepositoryIntegrationTests { +public abstract class CustomMethodRepositoryIntegrationTests implements NewElasticsearchClientDevelopment { @Autowired private IndexNameProvider indexNameProvider; @Autowired private SampleCustomMethodRepository repository; @@ -83,6 +86,11 @@ public abstract class CustomMethodRepositoryIntegrationTests { @Autowired ElasticsearchOperations operations; + boolean rhlcWithCluster8() { + var clusterVersion = ((AbstractElasticsearchTemplate) operations).getClusterVersion(); + return (oldElasticsearchClient() && clusterVersion != null && clusterVersion.startsWith("8")); + } + @BeforeEach public void before() { @@ -806,6 +814,7 @@ public void shouldExecuteCustomMethodWithWithinPoint() { assertThat(page.getTotalElements()).isEqualTo(1L); } + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test public void shouldExecuteCustomMethodWithNearBox() { @@ -1365,6 +1374,7 @@ public void shouldCountCustomMethodWithWithinPoint() { assertThat(count).isEqualTo(1L); } + @DisabledIf(value = "rhlcWithCluster8", disabledReason = "RHLC fails to parse response from ES 8.2") @Test // DATAES-106 public void shouldCountCustomMethodWithNearBox() { diff --git a/src/test/resources/testcontainers-elasticsearch.properties b/src/test/resources/testcontainers-elasticsearch.properties index 94557e34b..9529d120e 100644 --- a/src/test/resources/testcontainers-elasticsearch.properties +++ b/src/test/resources/testcontainers-elasticsearch.properties @@ -15,10 +15,14 @@ # # sde.testcontainers.image-name=docker.elastic.co/elasticsearch/elasticsearch -sde.testcontainers.image-version=7.17.3 +sde.testcontainers.image-version=8.2.2 # # # needed as we do a DELETE /* at the end of the tests, will be required from 8.0 on, produces a warning since 7.13 # action.destructive_requires_name=false reindex.remote.whitelist=localhost:9200 +# +# we do not want to complicate the test setup with the security features, makes it harder for debugging, proxyuing +xpack.security.enabled=false +xpack.security.http.ssl.enabled=false