diff --git a/README.md b/README.md index 8c058170..03e85b32 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ The Spring Data OpenSearch follows the release model of the Spring Data Elastics | Spring Data Release Train | Spring Data OpenSearch | Spring Data Elasticsearch | OpenSearch Server | OpenSearch Client | Spring Framework | Spring Boot | JDK | |---------------------------|------------------------|----------------------------|-------------------|---------------------|------------------|----------------|-----------------------| +| 2025.1 | 3.0.x | 6.0.x | 2.x / 3.x | 3.0.x and above | 7.0.x | 4.0.x | 21+ | | 2025.0 | 2.0.x | 5.5.x | 2.x / 3.x | 3.0.x and above | 6.2.x | 3.5.x | 21+ | | 2025.0 | 1.8.x | 5.5.x | 1.x / 2.x / 3.x | 2.10.x and above | 6.2.x | 3.5.x | 17+ | | 2025.0 | 1.7.x | 5.5.x | 1.x / 2.x / 3.x | 2.10.x and above | 6.2.x | 3.5.x | 17+ | diff --git a/settings.gradle.kts b/settings.gradle.kts index de82e2e9..2f3ffd20 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -15,10 +15,10 @@ dependencyResolutionManagement { } create("springLibs") { - version("spring", "6.2.12") - version("spring-boot", "3.5.7") - library("data-commons", "org.springframework.data:spring-data-commons:3.5.5") - library("data-elasticsearch", "org.springframework.data:spring-data-elasticsearch:5.5.5") + version("spring", "7.0.0-RC3") + version("spring-boot", "4.0.0-RC2") + library("data-commons", "org.springframework.data:spring-data-commons:4.0.0-RC2") + library("data-elasticsearch", "org.springframework.data:spring-data-elasticsearch:6.0.0-RC2") library("web", "org.springframework", "spring-web").versionRef("spring") library("webflux", "org.springframework", "spring-webflux").versionRef("spring") library("context", "org.springframework", "spring-context").versionRef("spring") @@ -28,10 +28,13 @@ dependencyResolutionManagement { library("boot-webflux", "org.springframework.boot", "spring-boot-starter-webflux").versionRef("spring-boot") library("boot-autoconfigure", "org.springframework.boot", "spring-boot-autoconfigure").versionRef("spring-boot") library("boot-docker-compose", "org.springframework.boot", "spring-boot-docker-compose").versionRef("spring-boot") + library("boot-elasticsearch", "org.springframework.boot", "spring-boot-elasticsearch").versionRef("spring-boot") + library("boot-data-elasticsearch", "org.springframework.boot", "spring-boot-data-elasticsearch").versionRef("spring-boot") library("boot-test", "org.springframework.boot", "spring-boot-test").versionRef("spring-boot") library("boot-test-autoconfigure", "org.springframework.boot", "spring-boot-test-autoconfigure").versionRef("spring-boot") + library("boot-test-cache", "org.springframework.boot", "spring-boot-cache-test").versionRef("spring-boot") library("boot-testcontainers", "org.springframework.boot", "spring-boot-testcontainers").versionRef("spring-boot") - library("projectreactor", "io.projectreactor:reactor-test:3.7.12") + library("projectreactor", "io.projectreactor:reactor-test:3.8.0-RC1") plugin("spring-boot", "org.springframework.boot").versionRef("spring-boot") } @@ -76,12 +79,18 @@ pluginManagement { maven { url = uri("https://repo.spring.io/release/") } + maven { + url = uri("https://repo.spring.io/milestone/") + } } } dependencyResolutionManagement { repositories { mavenCentral() + maven { + url = uri("https://repo.spring.io/milestone/") + } } } diff --git a/spring-data-opensearch-examples/spring-boot-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java b/spring-data-opensearch-examples/spring-boot-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java index 6c64e9d1..4d414f8f 100644 --- a/spring-data-opensearch-examples/spring-boot-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java +++ b/spring-data-opensearch-examples/spring-boot-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java @@ -7,9 +7,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; +import org.springframework.boot.data.elasticsearch.autoconfigure.DataElasticsearchAutoConfiguration; -@SpringBootApplication(exclude = ElasticsearchDataAutoConfiguration.class) +@SpringBootApplication(exclude = DataElasticsearchAutoConfiguration.class) public class MarketplaceApplication { public static void main(String[] args) { SpringApplication.run(MarketplaceConfiguration.class, args); diff --git a/spring-data-opensearch-examples/spring-boot-java-client-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java b/spring-data-opensearch-examples/spring-boot-java-client-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java index 6c64e9d1..4d414f8f 100644 --- a/spring-data-opensearch-examples/spring-boot-java-client-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java +++ b/spring-data-opensearch-examples/spring-boot-java-client-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java @@ -7,9 +7,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; +import org.springframework.boot.data.elasticsearch.autoconfigure.DataElasticsearchAutoConfiguration; -@SpringBootApplication(exclude = ElasticsearchDataAutoConfiguration.class) +@SpringBootApplication(exclude = DataElasticsearchAutoConfiguration.class) public class MarketplaceApplication { public static void main(String[] args) { SpringApplication.run(MarketplaceConfiguration.class, args); diff --git a/spring-data-opensearch-examples/spring-boot-reactive-client-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java b/spring-data-opensearch-examples/spring-boot-reactive-client-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java index 6c64e9d1..4d414f8f 100644 --- a/spring-data-opensearch-examples/spring-boot-reactive-client-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java +++ b/spring-data-opensearch-examples/spring-boot-reactive-client-gradle/src/main/java/org/opensearch/data/example/MarketplaceApplication.java @@ -7,9 +7,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; +import org.springframework.boot.data.elasticsearch.autoconfigure.DataElasticsearchAutoConfiguration; -@SpringBootApplication(exclude = ElasticsearchDataAutoConfiguration.class) +@SpringBootApplication(exclude = DataElasticsearchAutoConfiguration.class) public class MarketplaceApplication { public static void main(String[] args) { SpringApplication.run(MarketplaceConfiguration.class, args); diff --git a/spring-data-opensearch-starter/build.gradle.kts b/spring-data-opensearch-starter/build.gradle.kts index a3f09c1c..bb7dce2c 100644 --- a/spring-data-opensearch-starter/build.gradle.kts +++ b/spring-data-opensearch-starter/build.gradle.kts @@ -19,6 +19,8 @@ buildscript { dependencies { api(springLibs.boot.autoconfigure) api(project(":spring-data-opensearch")) + api(springLibs.boot.data.elasticsearch) + api(springLibs.boot.elasticsearch) implementation(opensearchLibs.client) { exclude("commons-logging", "commons-logging") exclude("org.slf4j", "slf4j-api") diff --git a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchClientAutoConfiguration.java b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchClientAutoConfiguration.java index 9a602593..dce18606 100644 --- a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchClientAutoConfiguration.java +++ b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchClientAutoConfiguration.java @@ -13,13 +13,13 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration; import org.springframework.context.annotation.Import; /** * {@link EnableAutoConfiguration Auto-configuration} for OpenSearch's Java client. */ -@AutoConfiguration(after = { JsonbAutoConfiguration.class, OpenSearchRestClientAutoConfiguration.class }) +@AutoConfiguration(after = { OpenSearchRestClientAutoConfiguration.class }, + afterName = { "org.springframework.boot.jsonb.autoconfigure.JsonbAutoConfiguration" }) @ConditionalOnBean(RestClient.class) @ConditionalOnClass(OpenSearchClient.class) @Import({ JsonpMapperConfiguration.class, OpenSearchTransportConfiguration.class, OpenSearchClientConfiguration.class }) diff --git a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchProperties.java b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchProperties.java index a3c803a1..f22057a7 100644 --- a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchProperties.java +++ b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchProperties.java @@ -9,13 +9,13 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchProperties.Restclient; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.elasticsearch.autoconfigure.ElasticsearchProperties.Restclient; /** * OpenSearch client configuration properties. * - * Adaptation of the {@link org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchProperties} to + * Adaptation of the {@link org.springframework.boot.elasticsearch.autoconfigure.ElasticsearchProperties} to * the needs of OpenSearch. */ @ConfigurationProperties("opensearch") diff --git a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientAutoConfiguration.java b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientAutoConfiguration.java index 40e47fd1..ea07fc73 100644 --- a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientAutoConfiguration.java +++ b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientAutoConfiguration.java @@ -21,7 +21,7 @@ /** * {@link EnableAutoConfiguration Auto-configuration} for OpenSearch REST clients. * - * Adaptation of the {@link org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration} to + * Adaptation of the {@link org.springframework.boot.elasticsearch.autoconfigure.ElasticsearchRestClientAutoConfiguration} to * the needs of OpenSearch. */ @AutoConfiguration diff --git a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientConfigurations.java b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientConfigurations.java index 400fdb40..5350427f 100644 --- a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientConfigurations.java +++ b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientConfigurations.java @@ -8,6 +8,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.time.Duration; +import java.util.Objects; import javax.net.ssl.SSLContext; import org.apache.hc.client5.http.auth.AuthScope; import org.apache.hc.client5.http.auth.Credentials; @@ -56,7 +57,7 @@ static class RestClientBuilderConfiguration { } @Bean - RestClientBuilderCustomizer defaultRestClientBuilderCustomizer(OpenSearchProperties properties, ObjectProvider sslBundles) { + RestClientBuilderCustomizer defaultOpensearchRestClientBuilderCustomizer(OpenSearchProperties properties, ObjectProvider sslBundles) { return new DefaultRestClientBuilderCustomizer(properties, this.connectionDetails, sslBundles); } @@ -132,7 +133,7 @@ static class RestClientSnifferConfiguration { @ConditionalOnMissingBean Sniffer opensearchSniffer(RestClient client, OpenSearchProperties properties) { SnifferBuilder builder = Sniffer.builder(client); - PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); + PropertyMapper map = PropertyMapper.get(); Duration interval = properties.getRestclient().getSniffer().getInterval(); map.from(interval).asInt(Duration::toMillis).to(builder::setSniffIntervalMillis); Duration delayAfterFailure = properties.getRestclient().getSniffer().getDelayAfterFailure(); @@ -176,12 +177,12 @@ public void customize(HttpAsyncClientBuilder builder) { @Override public void customize(RequestConfig.Builder builder) { map.from(this.properties::getConnectionTimeout) - .whenNonNull() + .whenNot(Objects::isNull) .asInt(Duration::toMillis) .as(Timeout::ofMilliseconds) .to(builder::setConnectTimeout); map.from(this.properties::getConnectionTimeout) - .whenNonNull() + .whenNot(Objects::isNull) .asInt(Duration::toMillis) .as(Timeout::ofMilliseconds) .to(builder::setConnectionRequestTimeout); diff --git a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/RestClientBuilderCustomizer.java b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/RestClientBuilderCustomizer.java index 8b91d57d..d806daed 100644 --- a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/RestClientBuilderCustomizer.java +++ b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/RestClientBuilderCustomizer.java @@ -15,7 +15,7 @@ * {@link org.opensearch.client.RestClient} via a {@link RestClientBuilder} whilst * retaining default auto-configuration. * - * Adaptation of the {@link org.springframework.boot.autoconfigure.elasticsearch.RestClientBuilderCustomizer} to + * Adaptation of the {@link org.springframework.boot.elasticsearch.autoconfigure.Rest5ClientBuilderCustomizer} to * the needs of OpenSearch. */ @FunctionalInterface diff --git a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataAutoConfiguration.java b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataAutoConfiguration.java index 763b8814..7f98b18f 100644 --- a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataAutoConfiguration.java +++ b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataAutoConfiguration.java @@ -17,7 +17,7 @@ /** * {@link EnableAutoConfiguration Auto-configuration} for Spring Data's OpenSearch support. * - * Adaptation of the {@link org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration} to + * Adaptation of the {@link org.springframework.boot.data.elasticsearch.autoconfigure.DataElasticsearchAutoConfiguration} to * the needs of OpenSearch. */ @AutoConfiguration(after = {OpenSearchClientAutoConfiguration.class, OpenSearchRestClientAutoConfiguration.class}) diff --git a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataConfiguration.java b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataConfiguration.java index 2ebdcd4c..5f8be4b0 100644 --- a/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataConfiguration.java +++ b/spring-data-opensearch-starter/src/main/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataConfiguration.java @@ -13,7 +13,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.domain.EntityScanner; +import org.springframework.boot.persistence.autoconfigure.EntityScanner; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-data-opensearch-starter/src/test/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientAutoConfigurationTests.java b/spring-data-opensearch-starter/src/test/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientAutoConfigurationTests.java index 69eb8a2d..8cbdef8f 100644 --- a/spring-data-opensearch-starter/src/test/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientAutoConfigurationTests.java +++ b/spring-data-opensearch-starter/src/test/java/org/opensearch/spring/boot/autoconfigure/OpenSearchRestClientAutoConfigurationTests.java @@ -29,8 +29,8 @@ import org.opensearch.client.sniff.Sniffer; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration; import org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration; +import org.springframework.boot.elasticsearch.autoconfigure.ElasticsearchRestClientAutoConfiguration; import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; diff --git a/spring-data-opensearch-starter/src/test/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataAutoConfigurationIntegrationTests.java b/spring-data-opensearch-starter/src/test/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataAutoConfigurationIntegrationTests.java index f1a4d06f..35ba3d53 100644 --- a/spring-data-opensearch-starter/src/test/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataAutoConfigurationIntegrationTests.java +++ b/spring-data-opensearch-starter/src/test/java/org/opensearch/spring/boot/autoconfigure/data/OpenSearchDataAutoConfigurationIntegrationTests.java @@ -26,7 +26,7 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.boot.autoconfigure.AutoConfigurationPackages; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration; +import org.springframework.boot.data.elasticsearch.autoconfigure.DataElasticsearchRepositoriesAutoConfiguration; import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Configuration; @@ -56,7 +56,7 @@ class OpenSearchDataAutoConfigurationIntegrationTests extends AbstractOpenSearch void defaultRepositoryConfiguration() { this.contextRunner .withUserConfiguration(TestConfiguration.class) - .withConfiguration(AutoConfigurations.of(ElasticsearchRepositoriesAutoConfiguration.class)) + .withConfiguration(AutoConfigurations.of(DataElasticsearchRepositoriesAutoConfiguration.class)) .run((context) -> assertThat(context) .doesNotHaveBean(OpenSearchTemplate.class) .hasSingleBean(ProductOpenSearchRepository.class) @@ -68,7 +68,7 @@ void javaClientRepositoryConfiguration() { this.contextRunner .withClassLoader(new FilteredClassLoader(RestHighLevelClient.class)) .withUserConfiguration(TestConfiguration.class) - .withConfiguration(AutoConfigurations.of(OpenSearchClientAutoConfiguration.class, ElasticsearchRepositoriesAutoConfiguration.class)) + .withConfiguration(AutoConfigurations.of(OpenSearchClientAutoConfiguration.class, DataElasticsearchRepositoriesAutoConfiguration.class)) .run((context) -> assertThat(context) .hasSingleBean(OpenSearchTemplate.class) .hasSingleBean(ProductOpenSearchRepository.class)); @@ -94,7 +94,7 @@ void noRepositoryConfiguration() { .withInitializer(context -> AutoConfigurationPackages.register( (BeanDefinitionRegistry) context.getBeanFactory(), "org.opensearch.spring.boot.autoconfigure.data.empty")) - .withConfiguration(AutoConfigurations.of(ElasticsearchRepositoriesAutoConfiguration.class)) + .withConfiguration(AutoConfigurations.of(DataElasticsearchRepositoriesAutoConfiguration.class)) .run((context) -> assertThat(context).hasSingleBean(OpenSearchRestTemplate.class)); } @@ -102,7 +102,7 @@ void noRepositoryConfiguration() { void doesNotTriggerDefaultRepositoryDetectionIfCustomized() { this.contextRunner .withUserConfiguration(CustomizedConfiguration.class) - .withConfiguration(AutoConfigurations.of(ElasticsearchRepositoriesAutoConfiguration.class)) + .withConfiguration(AutoConfigurations.of(DataElasticsearchRepositoriesAutoConfiguration.class)) .run((context) -> assertThat(context) .hasSingleBean(ProductRepository.class)); } diff --git a/spring-data-opensearch-test-autoconfigure/build.gradle.kts b/spring-data-opensearch-test-autoconfigure/build.gradle.kts index bacfd754..adce3644 100644 --- a/spring-data-opensearch-test-autoconfigure/build.gradle.kts +++ b/spring-data-opensearch-test-autoconfigure/build.gradle.kts @@ -20,6 +20,7 @@ dependencies { implementation(project(":spring-data-opensearch-starter")) implementation(libs.jupiter) implementation(springLibs.boot.test.autoconfigure) + implementation(springLibs.boot.test.cache) implementation(springLibs.test) } diff --git a/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/AutoConfigureDataOpenSearch.java b/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/AutoConfigureDataOpenSearch.java index b070de98..fe639c3d 100644 --- a/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/AutoConfigureDataOpenSearch.java +++ b/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/AutoConfigureDataOpenSearch.java @@ -12,7 +12,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; +import org.springframework.boot.data.elasticsearch.autoconfigure.DataElasticsearchAutoConfiguration; /** * {@link ImportAutoConfiguration Auto-configuration imports} for typical Data OpenSearch tests. @@ -23,5 +23,5 @@ @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited -@ImportAutoConfiguration(exclude = ElasticsearchDataAutoConfiguration.class) +@ImportAutoConfiguration(exclude = DataElasticsearchAutoConfiguration.class) public @interface AutoConfigureDataOpenSearch {} diff --git a/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/DataOpenSearchTest.java b/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/DataOpenSearchTest.java index 2989d89d..a636919d 100644 --- a/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/DataOpenSearchTest.java +++ b/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/DataOpenSearchTest.java @@ -12,9 +12,9 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.cache.test.autoconfigure.AutoConfigureCache; import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration; -import org.springframework.boot.test.autoconfigure.core.AutoConfigureCache; -import org.springframework.boot.test.autoconfigure.filter.TypeExcludeFilters; +import org.springframework.boot.test.context.filter.annotation.TypeExcludeFilters; import org.springframework.test.context.BootstrapWith; import org.springframework.test.context.junit.jupiter.SpringExtension; diff --git a/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/OpenSearchTypeExcludeFilter.java b/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/OpenSearchTypeExcludeFilter.java index 6cb46c4f..6306eca8 100644 --- a/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/OpenSearchTypeExcludeFilter.java +++ b/spring-data-opensearch-test-autoconfigure/src/main/java/org/opensearch/spring/boot/autoconfigure/test/OpenSearchTypeExcludeFilter.java @@ -6,7 +6,7 @@ package org.opensearch.spring.boot.autoconfigure.test; import org.springframework.boot.context.TypeExcludeFilter; -import org.springframework.boot.test.autoconfigure.filter.StandardAnnotationCustomizableTypeExcludeFilter; +import org.springframework.boot.test.context.filter.annotation.StandardAnnotationCustomizableTypeExcludeFilter; /** * {@link TypeExcludeFilter} for {@link DataElasticsearchTest}. diff --git a/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/DocumentAdapters.java b/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/DocumentAdapters.java index 7afb7f1c..844b4a67 100644 --- a/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/DocumentAdapters.java +++ b/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/DocumentAdapters.java @@ -190,7 +190,7 @@ public static SearchDocument from(SearchHit source) { NestedMetaData nestedMetaData = from(source.getNestedIdentity()); Explanation explanation = from(source.getExplanation()); - List matchedQueries = from(source.getMatchedQueries()); + Map matchedQueries = from(source.getMatchedQueriesAndScores()); BytesReference sourceRef = source.getSourceRef(); Map sourceFields = source.getFields(); @@ -263,8 +263,11 @@ private static NestedMetaData from(@Nullable SearchHit.NestedIdentity nestedIden } @Nullable - private static List from(@Nullable String[] matchedQueries) { - return matchedQueries == null ? null : Arrays.asList(matchedQueries); + private static Map from(@Nullable Map matchedQueries) { + return matchedQueries == null ? null : matchedQueries + .entrySet() + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, v -> v.getValue().doubleValue())); } /** @@ -539,7 +542,7 @@ static class SearchDocumentAdapter implements SearchDocument { private final Explanation explanation; @Nullable - private final List matchedQueries; + private final Map matchedQueries; SearchDocumentAdapter( Document delegate, @@ -550,7 +553,7 @@ static class SearchDocumentAdapter implements SearchDocument { Map innerHits, @Nullable NestedMetaData nestedMetaData, @Nullable Explanation explanation, - @Nullable List matchedQueries) { + @Nullable Map matchedQueries) { this.delegate = delegate; this.score = score; @@ -751,7 +754,7 @@ public Explanation getExplanation() { @Override @Nullable - public List getMatchedQueries() { + public Map getMatchedQueries() { return matchedQueries; } diff --git a/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/RequestFactory.java b/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/RequestFactory.java index 93ffbdc6..23201630 100644 --- a/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/RequestFactory.java +++ b/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/RequestFactory.java @@ -115,7 +115,6 @@ import org.springframework.data.elasticsearch.core.query.Query; import org.springframework.data.elasticsearch.core.query.RescorerQuery; import org.springframework.data.elasticsearch.core.query.RescorerQuery.ScoreMode; -import org.springframework.data.elasticsearch.core.query.ScriptType; import org.springframework.data.elasticsearch.core.query.SourceFilter; import org.springframework.data.elasticsearch.core.query.StringQuery; import org.springframework.data.elasticsearch.core.query.UpdateQuery; @@ -1143,7 +1142,7 @@ public UpdateRequest updateRequest(UpdateQuery query, IndexCoordinates index) { params = new HashMap<>(); } Script script = - new Script(getScriptType(query.getScriptType()), query.getLang(), query.getScript(), params); + new Script(getScriptType(query.getScript()), query.getLang(), query.getScript(), params); updateRequest.script(script); } @@ -1438,9 +1437,8 @@ private boolean hasSeqNoPrimaryTermProperty(@Nullable Class entityClass) { return entity.hasSeqNoPrimaryTermProperty(); } - private org.opensearch.script.ScriptType getScriptType(@Nullable ScriptType scriptType) { - - if (scriptType == null || ScriptType.INLINE.equals(scriptType)) { + private org.opensearch.script.ScriptType getScriptType(@Nullable String script) { + if (script != null) { return org.opensearch.script.ScriptType.INLINE; } else { return org.opensearch.script.ScriptType.STORED; @@ -1449,16 +1447,14 @@ private org.opensearch.script.ScriptType getScriptType(@Nullable ScriptType scri @Nullable private Script getScript(UpdateQuery query) { - if (ScriptType.STORED.equals(query.getScriptType()) && query.getScriptName() != null) { + if (query.getScriptName() != null) { /* stored */ final Map params = Optional.ofNullable(query.getParams()).orElse(new HashMap<>()); - return new Script(getScriptType(ScriptType.STORED), null, query.getScriptName(), params); - } - - if (ScriptType.INLINE.equals(query.getScriptType()) && query.getScript() != null) { + return new Script(getScriptType(query.getScript()), null, query.getScriptName(), params); + } else if (query.getScript() != null) { /* inline */ final Map params = Optional.ofNullable(query.getParams()).orElse(new HashMap<>()); - return new Script(getScriptType(ScriptType.INLINE), query.getLang(), query.getScript(), params); + return new Script(getScriptType(query.getScript()), query.getLang(), query.getScript(), params); } return null; diff --git a/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/ResponseConverter.java b/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/ResponseConverter.java index 9e357964..cb938ef8 100644 --- a/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/ResponseConverter.java +++ b/spring-data-opensearch/src/main/java/org/opensearch/data/client/orhlc/ResponseConverter.java @@ -433,7 +433,7 @@ public static ByQueryResponse.Failure byQueryResponseFailureOf(BulkItemResponse. */ public static ByQueryResponse.SearchFailure byQueryResponseSearchFailureOf( ScrollableHitSource.SearchFailure searchFailure) { - return ByQueryResponse.SearchFailure.builder() // + return ByQueryResponse.SearchFailure.builder(searchFailure.getReason()) // .withReason(searchFailure.getReason()) // .withIndex(searchFailure.getIndex()) // .withNodeId(searchFailure.getNodeId()) // diff --git a/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/DocumentAdapters.java b/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/DocumentAdapters.java index 8dc43c73..ad0382e5 100644 --- a/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/DocumentAdapters.java +++ b/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/DocumentAdapters.java @@ -138,7 +138,9 @@ public static SearchDocument from(Hit hit, JsonpMapper jsonpMapper) { float score = hit.score() != null ? hit.score().floatValue() : Float.NaN; return new SearchDocumentAdapter(document, score, hit.sort().stream().toArray(), - documentFields, highlightFields, innerHits, nestedMetaData, explanation, matchedQueries, hit.routing()); + documentFields, highlightFields, innerHits, nestedMetaData, explanation, + matchedQueries.stream().collect(Collectors.toMap(k -> k, v -> Double.NaN /* no scores */)), + hit.routing()); } public static SearchDocument from(CompletionSuggestOption completionSuggestOption) { diff --git a/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/RequestConverter.java b/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/RequestConverter.java index 8adb10f9..ad747e15 100644 --- a/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/RequestConverter.java +++ b/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/RequestConverter.java @@ -776,14 +776,14 @@ private org.opensearch.client.opensearch._types.Script getScript(@Nullable Scrip scriptData.params().forEach((key, value) -> params.put(key, JsonData.of(value, jsonpMapper))); } return org.opensearch.client.opensearch._types.Script.of(sb -> { - if (scriptData.type() == ScriptType.INLINE) { + if (scriptData.script() != null) { /* inline */ sb.inline(is -> is // .lang(fn -> fn.custom(scriptData.language())) // .source(scriptData.script()) // .params(params)); // - } else if (scriptData.type() == ScriptType.STORED) { + } else { /* stored */ sb.stored(ss -> ss // - .id(scriptData.script()) // + .id(scriptData.scriptName()) // .params(params) // ); } @@ -1121,14 +1121,15 @@ public DeleteByQueryRequest documentDeleteByQueryRequest(Query query, @Nullable } uqb.script(sb -> { - if (query.getScriptType() == ScriptType.INLINE) { + // inline + if (query.getScript() != null) { sb.inline(is -> is // .lang(fn -> fn.custom(query.getLang())) // .source(query.getScript()) // .params(params)); // - } else if (query.getScriptType() == ScriptType.STORED) { + } else { /* stored */ sb.stored(ss -> ss // - .id(query.getScript()) // + .id(query.getScriptName()) // .params(params) // ); } @@ -2073,7 +2074,6 @@ private VersionType retrieveVersionTypeFromPersistentEntity(@Nullable Class c case INTERNAL -> VersionType.Internal; case EXTERNAL -> VersionType.External; case EXTERNAL_GTE -> VersionType.ExternalGte; - case FORCE -> VersionType.Force; }; } } diff --git a/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/TypeUtils.java b/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/TypeUtils.java index f07b45cc..73b5eb34 100644 --- a/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/TypeUtils.java +++ b/spring-data-opensearch/src/main/java/org/opensearch/data/client/osc/TypeUtils.java @@ -405,7 +405,6 @@ static VersionType versionType( case INTERNAL -> VersionType.Internal; case EXTERNAL -> VersionType.External; case EXTERNAL_GTE -> VersionType.ExternalGte; - case FORCE -> VersionType.Force; }; } diff --git a/spring-data-opensearch/src/test/java/org/opensearch/data/client/core/document/DocumentAdaptersUnitTests.java b/spring-data-opensearch/src/test/java/org/opensearch/data/client/core/document/DocumentAdaptersUnitTests.java index 930b4eca..be19aba9 100644 --- a/spring-data-opensearch/src/test/java/org/opensearch/data/client/core/document/DocumentAdaptersUnitTests.java +++ b/spring-data-opensearch/src/test/java/org/opensearch/data/client/core/document/DocumentAdaptersUnitTests.java @@ -259,9 +259,9 @@ void shouldAdaptReturnedMatchedQueries() { SearchDocument searchDocument = DocumentAdapters.from(searchHit); - List matchedQueries = searchDocument.getMatchedQueries(); + Map matchedQueries = searchDocument.getMatchedQueries(); assertThat(matchedQueries).isNotNull(); assertThat(matchedQueries).hasSize(2); - assertThat(matchedQueries).isEqualTo(Arrays.asList("query1", "query2")); + assertThat(matchedQueries).isEqualTo(Map.of("query1", Double.NaN, "query2", Double.NaN)); } } diff --git a/spring-data-opensearch/src/test/java/org/opensearch/data/client/orhlc/OpenSearchORHLCIntegrationTests.java b/spring-data-opensearch/src/test/java/org/opensearch/data/client/orhlc/OpenSearchORHLCIntegrationTests.java index 10955f76..063d38ba 100644 --- a/spring-data-opensearch/src/test/java/org/opensearch/data/client/orhlc/OpenSearchORHLCIntegrationTests.java +++ b/spring-data-opensearch/src/test/java/org/opensearch/data/client/orhlc/OpenSearchORHLCIntegrationTests.java @@ -50,7 +50,6 @@ import org.springframework.data.elasticsearch.core.query.IndicesOptions; import org.springframework.data.elasticsearch.core.query.Query; import org.springframework.data.elasticsearch.core.query.RescorerQuery; -import org.springframework.data.elasticsearch.core.query.ScriptType; import org.springframework.data.elasticsearch.core.query.UpdateQuery; import org.springframework.data.elasticsearch.utils.IndexNameProvider; import org.springframework.lang.Nullable; @@ -211,10 +210,9 @@ void shouldUseAllOptionsFromUpdateQuery() { org.springframework.data.elasticsearch.core.document.Document.from(doc); UpdateQuery updateQuery = UpdateQuery.builder("1") // .withDocument(document) // - .withIfSeqNo(42) // - .withIfPrimaryTerm(13) // + .withIfSeqNo(42L) // + .withIfPrimaryTerm(13L) // .withScript("script") // - .withScriptType(ScriptType.INLINE) .withLang("lang") // .withRefreshPolicy(RefreshPolicy.WAIT_UNTIL) // .withRetryOnConflict(7) // @@ -259,7 +257,6 @@ void shouldUseAllOptionsFromUpdateByQuery() throws JSONException { .withRequestsPerSecond(5F) // .withShouldStoreResult(false) // .withSlices(4) // - .withScriptType(ScriptType.INLINE) // .withScript("script") // .withLang("painless") // .build(); // diff --git a/spring-data-opensearch/src/test/java/org/opensearch/data/client/osc/DocumentAdaptersUnitTests.java b/spring-data-opensearch/src/test/java/org/opensearch/data/client/osc/DocumentAdaptersUnitTests.java index c01f6c85..4bb41cf6 100644 --- a/spring-data-opensearch/src/test/java/org/opensearch/data/client/osc/DocumentAdaptersUnitTests.java +++ b/spring-data-opensearch/src/test/java/org/opensearch/data/client/osc/DocumentAdaptersUnitTests.java @@ -15,9 +15,9 @@ */ package org.opensearch.data.client.osc; -import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Map; import org.assertj.core.api.SoftAssertions; import org.assertj.core.data.Offset; import org.junit.jupiter.api.DisplayName; @@ -154,10 +154,10 @@ void shouldAdaptReturnedMatchedQueries() { SoftAssertions softly = new SoftAssertions(); - List matchedQueries = searchDocument.getMatchedQueries(); + Map matchedQueries = searchDocument.getMatchedQueries(); softly.assertThat(matchedQueries).isNotNull(); softly.assertThat(matchedQueries).hasSize(2); - softly.assertThat(matchedQueries).isEqualTo(Arrays.asList("query1", "query2")); + softly.assertThat(matchedQueries).isEqualTo(Map.of("query1", Double.NaN, "query2", Double.NaN)); softly.assertAll(); } } diff --git a/spring-data-opensearch/src/test/java/org/opensearch/data/client/osc/OpenSearchOSCIntegrationTests.java b/spring-data-opensearch/src/test/java/org/opensearch/data/client/osc/OpenSearchOSCIntegrationTests.java index 32c7aedc..753dfe2f 100644 --- a/spring-data-opensearch/src/test/java/org/opensearch/data/client/osc/OpenSearchOSCIntegrationTests.java +++ b/spring-data-opensearch/src/test/java/org/opensearch/data/client/osc/OpenSearchOSCIntegrationTests.java @@ -44,7 +44,6 @@ import org.springframework.data.elasticsearch.core.query.Query; import org.springframework.data.elasticsearch.core.query.RescorerQuery; import org.springframework.data.elasticsearch.core.query.ScriptData; -import org.springframework.data.elasticsearch.core.query.ScriptType; import org.springframework.data.elasticsearch.core.query.ScriptedField; import org.springframework.data.elasticsearch.utils.IndexNameProvider; import org.springframework.lang.Nullable; @@ -186,7 +185,7 @@ protected Query getMatchAllQueryWithIncludesAndInlineExpressionScript(@Nullable return nativeQueryBuilder.withScriptedField(new ScriptedField( // fieldName, // - new ScriptData(ScriptType.INLINE, "expression", script, null, params))) // + new ScriptData("expression", script, null, params))) // .build(); } diff --git a/spring-data-opensearch/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java b/spring-data-opensearch/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java index 6aec3316..6d8c4fcf 100755 --- a/spring-data-opensearch/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java +++ b/spring-data-opensearch/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchIntegrationTests.java @@ -1606,7 +1606,6 @@ void shouldDoUpdateByQueryForExistingDocument() { final Query query = operations.matchAllQuery(); final UpdateQuery updateQuery = UpdateQuery.builder(query) - .withScriptType(org.springframework.data.elasticsearch.core.query.ScriptType.INLINE) .withScript("ctx._source['message'] = params['newMessage']").withLang("painless") .withParams(Collections.singletonMap("newMessage", messageAfterUpdate)).withAbortOnVersionConflict(true) .build(); diff --git a/version.properties b/version.properties index a80dc365..4950f0de 100644 --- a/version.properties +++ b/version.properties @@ -1 +1 @@ -version=2.0.3 +version=3.0.0