Compare commits

...

7 Commits

Author SHA1 Message Date
Christoph Strobl
0fa2839d73
Release version 6.0 M1 (2025.1.0).
See #3006
2025-01-24 10:48:55 +01:00
Christoph Strobl
89d2eafc56
Prepare 6.0 M1 (2025.1.0).
See #3006
2025-01-24 10:48:00 +01:00
Mark Paluch
ea66638f50
Adopt to changes in Spring Framework 7.
See #3038
2025-01-14 10:51:18 +01:00
Peter-Josef Meisch
9cf060b396
Update versions documentation
Signed-off-by: Peter-Josef Meisch <pj.meisch@sothawo.com>

# Conflicts:
#	src/main/antora/modules/ROOT/pages/elasticsearch/versions.adoc

# Conflicts:
#	src/main/antora/modules/ROOT/pages/elasticsearch/versions.adoc
2025-01-14 10:51:18 +01:00
Mark Paluch
5d36e611ab
Adopt to deprecation removals in Commons.
Closes #3008
2025-01-14 10:51:18 +01:00
Mark Paluch
f8e91485ca
After release cleanups.
See #3006
2025-01-14 10:51:17 +01:00
Mark Paluch
7828778e4b
Prepare next development iteration.
See #3006
2025-01-14 10:51:17 +01:00
21 changed files with 91 additions and 122 deletions

2
Jenkinsfile vendored
View File

@ -9,7 +9,7 @@ pipeline {
triggers { triggers {
pollSCM 'H/10 * * * *' pollSCM 'H/10 * * * *'
upstream(upstreamProjects: "spring-data-commons/main", threshold: hudson.model.Result.SUCCESS) upstream(upstreamProjects: "spring-data-commons/4.0.x", threshold: hudson.model.Result.SUCCESS)
} }
options { options {

22
pom.xml
View File

@ -5,12 +5,12 @@
<groupId>org.springframework.data</groupId> <groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId> <artifactId>spring-data-elasticsearch</artifactId>
<version>5.5.0-SNAPSHOT</version> <version>6.0.0-M1</version>
<parent> <parent>
<groupId>org.springframework.data.build</groupId> <groupId>org.springframework.data.build</groupId>
<artifactId>spring-data-parent</artifactId> <artifactId>spring-data-parent</artifactId>
<version>3.5.0-SNAPSHOT</version> <version>4.0.0-M1</version>
</parent> </parent>
<name>Spring Data Elasticsearch</name> <name>Spring Data Elasticsearch</name>
@ -18,7 +18,7 @@
<url>https://github.com/spring-projects/spring-data-elasticsearch</url> <url>https://github.com/spring-projects/spring-data-elasticsearch</url>
<properties> <properties>
<springdata.commons>3.5.0-SNAPSHOT</springdata.commons> <springdata.commons>4.0.0-M1</springdata.commons>
<!-- version of the ElasticsearchClient --> <!-- version of the ElasticsearchClient -->
<elasticsearch-java>8.17.0</elasticsearch-java> <elasticsearch-java>8.17.0</elasticsearch-java>
@ -450,20 +450,8 @@
</profiles> </profiles>
<repositories> <repositories>
<repository>
<id>spring-snapshot</id>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>spring-milestone</id>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories> </repositories>
</project> </project>

View File

@ -6,6 +6,7 @@ The following table shows the Elasticsearch and Spring versions that are used by
[cols="^,^,^,^",options="header"] [cols="^,^,^,^",options="header"]
|=== |===
| Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework | Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework
| 2025.1 (in development) | 6.0.x | 8.17.0 | 6.2.x
| 2025.0 (in development) | 5.5.x | 8.17.0 | 6.2.x | 2025.0 (in development) | 5.5.x | 8.17.0 | 6.2.x
| 2024.1 | 5.4.x | 8.15.5 | 6.1.x | 2024.1 | 5.4.x | 8.15.5 | 6.1.x
| 2024.0 | 5.3.x | 8.13.4 | 6.1.x | 2024.0 | 5.3.x | 8.13.4 | 6.1.x

View File

@ -24,9 +24,9 @@ import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.BaseQuery; import org.springframework.data.elasticsearch.core.query.BaseQuery;
import org.springframework.data.elasticsearch.core.query.DeleteQuery; import org.springframework.data.elasticsearch.core.query.DeleteQuery;
import org.springframework.data.elasticsearch.core.query.Query; import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.data.expression.ValueEvaluationContextProvider;
import org.springframework.data.repository.query.ParametersParameterAccessor; import org.springframework.data.repository.query.ParametersParameterAccessor;
import org.springframework.data.repository.query.QueryMethod; import org.springframework.data.repository.query.QueryMethod;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
import org.springframework.data.repository.query.RepositoryQuery; import org.springframework.data.repository.query.RepositoryQuery;
import org.springframework.data.repository.query.ResultProcessor; import org.springframework.data.repository.query.ResultProcessor;
import org.springframework.data.util.StreamUtils; import org.springframework.data.util.StreamUtils;
@ -49,11 +49,10 @@ public abstract class AbstractElasticsearchRepositoryQuery implements Repository
protected ElasticsearchQueryMethod queryMethod; protected ElasticsearchQueryMethod queryMethod;
protected final ElasticsearchOperations elasticsearchOperations; protected final ElasticsearchOperations elasticsearchOperations;
protected final ElasticsearchConverter elasticsearchConverter; protected final ElasticsearchConverter elasticsearchConverter;
protected final QueryMethodEvaluationContextProvider evaluationContextProvider; protected final ValueEvaluationContextProvider evaluationContextProvider;
public AbstractElasticsearchRepositoryQuery(ElasticsearchQueryMethod queryMethod, public AbstractElasticsearchRepositoryQuery(ElasticsearchQueryMethod queryMethod,
ElasticsearchOperations elasticsearchOperations, ElasticsearchOperations elasticsearchOperations, ValueEvaluationContextProvider evaluationContextProvider) {
QueryMethodEvaluationContextProvider evaluationContextProvider) {
Assert.notNull(queryMethod, "queryMethod must not be null"); Assert.notNull(queryMethod, "queryMethod must not be null");
Assert.notNull(elasticsearchOperations, "elasticsearchOperations must not be null"); Assert.notNull(elasticsearchOperations, "elasticsearchOperations must not be null");

View File

@ -19,6 +19,7 @@ import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import org.reactivestreams.Publisher; import org.reactivestreams.Publisher;
import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.Converter;
import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations; import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.SearchHit;
@ -32,10 +33,10 @@ import org.springframework.data.elasticsearch.core.query.DeleteQuery;
import org.springframework.data.elasticsearch.core.query.Query; import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.data.elasticsearch.repository.query.ReactiveElasticsearchQueryExecution.ResultProcessingConverter; import org.springframework.data.elasticsearch.repository.query.ReactiveElasticsearchQueryExecution.ResultProcessingConverter;
import org.springframework.data.elasticsearch.repository.query.ReactiveElasticsearchQueryExecution.ResultProcessingExecution; import org.springframework.data.elasticsearch.repository.query.ReactiveElasticsearchQueryExecution.ResultProcessingExecution;
import org.springframework.data.expression.ValueEvaluationContextProvider;
import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.repository.query.ParameterAccessor; import org.springframework.data.repository.query.ParameterAccessor;
import org.springframework.data.repository.query.QueryMethod; import org.springframework.data.repository.query.QueryMethod;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
import org.springframework.data.repository.query.RepositoryQuery; import org.springframework.data.repository.query.RepositoryQuery;
import org.springframework.data.repository.query.ResultProcessor; import org.springframework.data.repository.query.ResultProcessor;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -52,11 +53,11 @@ abstract class AbstractReactiveElasticsearchRepositoryQuery implements Repositor
protected final ReactiveElasticsearchQueryMethod queryMethod; protected final ReactiveElasticsearchQueryMethod queryMethod;
private final ReactiveElasticsearchOperations elasticsearchOperations; private final ReactiveElasticsearchOperations elasticsearchOperations;
protected final QueryMethodEvaluationContextProvider evaluationContextProvider; protected final ValueEvaluationContextProvider evaluationContextProvider;
AbstractReactiveElasticsearchRepositoryQuery(ReactiveElasticsearchQueryMethod queryMethod, AbstractReactiveElasticsearchRepositoryQuery(ReactiveElasticsearchQueryMethod queryMethod,
ReactiveElasticsearchOperations elasticsearchOperations, ReactiveElasticsearchOperations elasticsearchOperations,
QueryMethodEvaluationContextProvider evaluationContextProvider) { ValueEvaluationContextProvider evaluationContextProvider) {
Assert.notNull(queryMethod, "queryMethod must not be null"); Assert.notNull(queryMethod, "queryMethod must not be null");
Assert.notNull(elasticsearchOperations, "elasticsearchOperations must not be null"); Assert.notNull(elasticsearchOperations, "elasticsearchOperations must not be null");
@ -135,8 +136,7 @@ abstract class AbstractReactiveElasticsearchRepositoryQuery implements Repositor
if (isDeleteQuery()) { if (isDeleteQuery()) {
return (query, type, targetType, indexCoordinates) -> operations return (query, type, targetType, indexCoordinates) -> operations
.delete(DeleteQuery.builder(query).build(), type, indexCoordinates) .delete(DeleteQuery.builder(query).build(), type, indexCoordinates).map(ByQueryResponse::getDeleted);
.map(ByQueryResponse::getDeleted);
} else if (isCountQuery()) { } else if (isCountQuery()) {
return (query, type, targetType, indexCoordinates) -> operations.count(query, type, indexCoordinates); return (query, type, targetType, indexCoordinates) -> operations.count(query, type, indexCoordinates);
} else if (isExistsQuery()) { } else if (isExistsQuery()) {

View File

@ -20,7 +20,7 @@ import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersiste
import org.springframework.data.elasticsearch.core.query.BaseQuery; import org.springframework.data.elasticsearch.core.query.BaseQuery;
import org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator; import org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator;
import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; import org.springframework.data.repository.query.ValueExpressionDelegate;
import org.springframework.data.repository.query.parser.PartTree; import org.springframework.data.repository.query.parser.PartTree;
/** /**
@ -40,8 +40,8 @@ public class ElasticsearchPartQuery extends AbstractElasticsearchRepositoryQuery
private final MappingContext<?, ElasticsearchPersistentProperty> mappingContext; private final MappingContext<?, ElasticsearchPersistentProperty> mappingContext;
public ElasticsearchPartQuery(ElasticsearchQueryMethod method, ElasticsearchOperations elasticsearchOperations, public ElasticsearchPartQuery(ElasticsearchQueryMethod method, ElasticsearchOperations elasticsearchOperations,
QueryMethodEvaluationContextProvider evaluationContextProvider) { ValueExpressionDelegate valueExpressionDelegate) {
super(method, elasticsearchOperations, evaluationContextProvider); super(method, elasticsearchOperations, valueExpressionDelegate.createValueContextProvider(method.getParameters()));
this.tree = new PartTree(queryMethod.getName(), queryMethod.getResultProcessor().getReturnedType().getDomainType()); this.tree = new PartTree(queryMethod.getName(), queryMethod.getResultProcessor().getReturnedType().getDomainType());
this.mappingContext = elasticsearchConverter.getMappingContext(); this.mappingContext = elasticsearchConverter.getMappingContext();
} }

View File

@ -43,13 +43,13 @@ import org.springframework.data.elasticsearch.core.query.RuntimeField;
import org.springframework.data.elasticsearch.core.query.ScriptedField; import org.springframework.data.elasticsearch.core.query.ScriptedField;
import org.springframework.data.elasticsearch.core.query.SourceFilter; import org.springframework.data.elasticsearch.core.query.SourceFilter;
import org.springframework.data.elasticsearch.repository.support.QueryStringProcessor; import org.springframework.data.elasticsearch.repository.support.QueryStringProcessor;
import org.springframework.data.expression.ValueEvaluationContextProvider;
import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.projection.ProjectionFactory; import org.springframework.data.projection.ProjectionFactory;
import org.springframework.data.repository.core.RepositoryMetadata; import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.query.Parameters; import org.springframework.data.repository.query.Parameters;
import org.springframework.data.repository.query.ParametersSource; import org.springframework.data.repository.query.ParametersSource;
import org.springframework.data.repository.query.QueryMethod; import org.springframework.data.repository.query.QueryMethod;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
import org.springframework.data.repository.util.QueryExecutionConverters; import org.springframework.data.repository.util.QueryExecutionConverters;
import org.springframework.data.repository.util.ReactiveWrapperConverters; import org.springframework.data.repository.util.ReactiveWrapperConverters;
import org.springframework.data.util.TypeInformation; import org.springframework.data.util.TypeInformation;
@ -102,13 +102,6 @@ public class ElasticsearchQueryMethod extends QueryMethod {
verifyCountQueryTypes(); verifyCountQueryTypes();
} }
@SuppressWarnings("removal")
@Override
@Deprecated
protected Parameters<?, ?> createParameters(Method method, TypeInformation<?> domainType) {
return new ElasticsearchParameters(ParametersSource.of(method));
}
@Override @Override
protected Parameters<?, ?> createParameters(ParametersSource parametersSource) { protected Parameters<?, ?> createParameters(ParametersSource parametersSource) {
return new ElasticsearchParameters(parametersSource); return new ElasticsearchParameters(parametersSource);
@ -302,8 +295,7 @@ public class ElasticsearchQueryMethod extends QueryMethod {
*/ */
@Nullable @Nullable
SourceFilter getSourceFilter(ElasticsearchParametersParameterAccessor parameterAccessor, SourceFilter getSourceFilter(ElasticsearchParametersParameterAccessor parameterAccessor,
ElasticsearchConverter converter, ElasticsearchConverter converter, ValueEvaluationContextProvider evaluationContextProvider) {
QueryMethodEvaluationContextProvider evaluationContextProvider) {
if (sourceFilters == null || (sourceFilters.includes().length == 0 && sourceFilters.excludes().length == 0)) { if (sourceFilters == null || (sourceFilters.includes().length == 0 && sourceFilters.excludes().length == 0)) {
return null; return null;
@ -313,20 +305,20 @@ public class ElasticsearchQueryMethod extends QueryMethod {
FetchSourceFilterBuilder fetchSourceFilterBuilder = new FetchSourceFilterBuilder(); FetchSourceFilterBuilder fetchSourceFilterBuilder = new FetchSourceFilterBuilder();
if (sourceFilters.includes().length > 0) { if (sourceFilters.includes().length > 0) {
fetchSourceFilterBuilder.withIncludes(mapParameters(sourceFilters.includes(), parameterAccessor, fetchSourceFilterBuilder.withIncludes(
conversionService, evaluationContextProvider)); mapParameters(sourceFilters.includes(), parameterAccessor, conversionService, evaluationContextProvider));
} }
if (sourceFilters.excludes().length > 0) { if (sourceFilters.excludes().length > 0) {
fetchSourceFilterBuilder.withExcludes(mapParameters(sourceFilters.excludes(), parameterAccessor, fetchSourceFilterBuilder.withExcludes(
conversionService, evaluationContextProvider)); mapParameters(sourceFilters.excludes(), parameterAccessor, conversionService, evaluationContextProvider));
} }
return fetchSourceFilterBuilder.build(); return fetchSourceFilterBuilder.build();
} }
private String[] mapParameters(String[] source, ElasticsearchParametersParameterAccessor parameterAccessor, private String[] mapParameters(String[] source, ElasticsearchParametersParameterAccessor parameterAccessor,
ConversionService conversionService, QueryMethodEvaluationContextProvider evaluationContextProvider) { ConversionService conversionService, ValueEvaluationContextProvider evaluationContextProvider) {
List<String> fieldNames = new ArrayList<>(); List<String> fieldNames = new ArrayList<>();
@ -378,8 +370,7 @@ public class ElasticsearchQueryMethod extends QueryMethod {
} }
void addMethodParameter(BaseQuery query, ElasticsearchParametersParameterAccessor parameterAccessor, void addMethodParameter(BaseQuery query, ElasticsearchParametersParameterAccessor parameterAccessor,
ElasticsearchConverter elasticsearchConverter, ElasticsearchConverter elasticsearchConverter, ValueEvaluationContextProvider evaluationContextProvider) {
QueryMethodEvaluationContextProvider evaluationContextProvider) {
if (hasAnnotatedHighlight()) { if (hasAnnotatedHighlight()) {
var highlightQuery = getAnnotatedHighlightQuery(new HighlightConverter(parameterAccessor, var highlightQuery = getAnnotatedHighlightQuery(new HighlightConverter(parameterAccessor,
@ -415,8 +406,7 @@ public class ElasticsearchQueryMethod extends QueryMethod {
}); });
var needToAddSourceFilter = sourceFilter == null var needToAddSourceFilter = sourceFilter == null
&& !(methodParameters.getRuntimeFields().isEmpty() && !(methodParameters.getRuntimeFields().isEmpty() && methodParameters.getScriptedFields().isEmpty());
&& methodParameters.getScriptedFields().isEmpty());
if (needToAddSourceFilter) { if (needToAddSourceFilter) {
query.addSourceFilter(FetchSourceFilter.of(b -> b.withIncludes("*"))); query.addSourceFilter(FetchSourceFilter.of(b -> b.withIncludes("*")));
} }

View File

@ -20,7 +20,7 @@ import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.query.BaseQuery; import org.springframework.data.elasticsearch.core.query.BaseQuery;
import org.springframework.data.elasticsearch.core.query.StringQuery; import org.springframework.data.elasticsearch.core.query.StringQuery;
import org.springframework.data.elasticsearch.repository.support.QueryStringProcessor; import org.springframework.data.elasticsearch.repository.support.QueryStringProcessor;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; import org.springframework.data.repository.query.ValueExpressionDelegate;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
@ -38,11 +38,11 @@ public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQue
private final String queryString; private final String queryString;
public ElasticsearchStringQuery(ElasticsearchQueryMethod queryMethod, ElasticsearchOperations elasticsearchOperations, public ElasticsearchStringQuery(ElasticsearchQueryMethod queryMethod, ElasticsearchOperations elasticsearchOperations,
String queryString, QueryMethodEvaluationContextProvider evaluationContextProvider) { String queryString, ValueExpressionDelegate valueExpressionDelegate) {
super(queryMethod, elasticsearchOperations, evaluationContextProvider); super(queryMethod, elasticsearchOperations,
valueExpressionDelegate.createValueContextProvider(queryMethod.getParameters()));
Assert.notNull(queryString, "Query cannot be empty"); Assert.notNull(queryString, "Query cannot be empty");
Assert.notNull(evaluationContextProvider, "ExpressionEvaluationContextProvider must not be null");
this.queryString = queryString; this.queryString = queryString;
} }
@ -67,8 +67,7 @@ public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQue
var processed = new QueryStringProcessor(queryString, queryMethod, conversionService, evaluationContextProvider) var processed = new QueryStringProcessor(queryString, queryMethod, conversionService, evaluationContextProvider)
.createQuery(parameterAccessor); .createQuery(parameterAccessor);
return new StringQuery(processed) return new StringQuery(processed).addSort(parameterAccessor.getSort());
.addSort(parameterAccessor.getSort());
} }
} }

View File

@ -25,8 +25,8 @@ import org.springframework.data.elasticsearch.core.query.highlight.Highlight;
import org.springframework.data.elasticsearch.core.query.highlight.HighlightField; import org.springframework.data.elasticsearch.core.query.highlight.HighlightField;
import org.springframework.data.elasticsearch.core.query.highlight.HighlightParameters; import org.springframework.data.elasticsearch.core.query.highlight.HighlightParameters;
import org.springframework.data.elasticsearch.repository.support.QueryStringProcessor; import org.springframework.data.elasticsearch.repository.support.QueryStringProcessor;
import org.springframework.data.expression.ValueEvaluationContextProvider;
import org.springframework.data.repository.query.QueryMethod; import org.springframework.data.repository.query.QueryMethod;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
@ -38,13 +38,11 @@ public class HighlightConverter {
private final ElasticsearchParametersParameterAccessor parameterAccessor; private final ElasticsearchParametersParameterAccessor parameterAccessor;
private final ConversionService conversionService; private final ConversionService conversionService;
private final QueryMethodEvaluationContextProvider evaluationContextProvider; private final ValueEvaluationContextProvider evaluationContextProvider;
private final QueryMethod queryMethod; private final QueryMethod queryMethod;
HighlightConverter(ElasticsearchParametersParameterAccessor parameterAccessor, HighlightConverter(ElasticsearchParametersParameterAccessor parameterAccessor, ConversionService conversionService,
ConversionService conversionService, ValueEvaluationContextProvider evaluationContextProvider, QueryMethod queryMethod) {
QueryMethodEvaluationContextProvider evaluationContextProvider,
QueryMethod queryMethod) {
Assert.notNull(parameterAccessor, "parameterAccessor must not be null"); Assert.notNull(parameterAccessor, "parameterAccessor must not be null");
Assert.notNull(conversionService, "conversionService must not be null"); Assert.notNull(conversionService, "conversionService must not be null");

View File

@ -15,8 +15,6 @@
*/ */
package org.springframework.data.elasticsearch.repository.query; package org.springframework.data.elasticsearch.repository.query;
import static org.springframework.data.repository.util.ClassUtils.*;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -36,6 +34,7 @@ import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.util.ReactiveWrapperConverters; import org.springframework.data.repository.util.ReactiveWrapperConverters;
import org.springframework.data.util.Lazy; import org.springframework.data.util.Lazy;
import org.springframework.data.util.ReactiveWrappers; import org.springframework.data.util.ReactiveWrappers;
import org.springframework.data.util.ReflectionUtils;
import org.springframework.data.util.TypeInformation; import org.springframework.data.util.TypeInformation;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
@ -55,7 +54,7 @@ public class ReactiveElasticsearchQueryMethod extends ElasticsearchQueryMethod {
super(method, metadata, factory, mappingContext); super(method, metadata, factory, mappingContext);
if (hasParameterOfType(method, Pageable.class)) { if (ReflectionUtils.hasParameterOfType(method, Pageable.class)) {
TypeInformation<?> returnType = TypeInformation.fromReturnTypeOf(method); TypeInformation<?> returnType = TypeInformation.fromReturnTypeOf(method);
boolean multiWrapper = ReactiveWrappers.isMultiValueType(returnType.getType()); boolean multiWrapper = ReactiveWrappers.isMultiValueType(returnType.getType());
@ -75,7 +74,7 @@ public class ReactiveElasticsearchQueryMethod extends ElasticsearchQueryMethod {
method)); method));
} }
if (hasParameterOfType(method, Sort.class)) { if (ReflectionUtils.hasParameterOfType(method, Sort.class)) {
throw new IllegalStateException(String.format("Method must not have Pageable *and* Sort parameter. " throw new IllegalStateException(String.format("Method must not have Pageable *and* Sort parameter. "
+ "Use sorting capabilities on Pageable instead! Offending method: %s", method)); + "Use sorting capabilities on Pageable instead! Offending method: %s", method));
} }

View File

@ -20,7 +20,7 @@ import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperatio
import org.springframework.data.elasticsearch.core.query.BaseQuery; import org.springframework.data.elasticsearch.core.query.BaseQuery;
import org.springframework.data.elasticsearch.core.query.StringQuery; import org.springframework.data.elasticsearch.core.query.StringQuery;
import org.springframework.data.elasticsearch.repository.support.QueryStringProcessor; import org.springframework.data.elasticsearch.repository.support.QueryStringProcessor;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; import org.springframework.data.repository.query.ValueExpressionDelegate;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
@ -32,23 +32,20 @@ import org.springframework.util.Assert;
public class ReactiveElasticsearchStringQuery extends AbstractReactiveElasticsearchRepositoryQuery { public class ReactiveElasticsearchStringQuery extends AbstractReactiveElasticsearchRepositoryQuery {
private final String query; private final String query;
private final QueryMethodEvaluationContextProvider evaluationContextProvider;
public ReactiveElasticsearchStringQuery(ReactiveElasticsearchQueryMethod queryMethod, public ReactiveElasticsearchStringQuery(ReactiveElasticsearchQueryMethod queryMethod,
ReactiveElasticsearchOperations operations, QueryMethodEvaluationContextProvider evaluationContextProvider) { ReactiveElasticsearchOperations operations, ValueExpressionDelegate evaluationContextProvider) {
this(queryMethod.getAnnotatedQuery(), queryMethod, operations, evaluationContextProvider); this(queryMethod.getAnnotatedQuery(), queryMethod, operations, evaluationContextProvider);
} }
public ReactiveElasticsearchStringQuery(String query, ReactiveElasticsearchQueryMethod queryMethod, public ReactiveElasticsearchStringQuery(String query, ReactiveElasticsearchQueryMethod queryMethod,
ReactiveElasticsearchOperations operations, QueryMethodEvaluationContextProvider evaluationContextProvider) { ReactiveElasticsearchOperations operations, ValueExpressionDelegate valueExpressionDelegate) {
super(queryMethod, operations, evaluationContextProvider); super(queryMethod, operations, valueExpressionDelegate.createValueContextProvider(queryMethod.getParameters()));
Assert.notNull(query, "query must not be null"); Assert.notNull(query, "query must not be null");
Assert.notNull(evaluationContextProvider, "evaluationContextProvider must not be null");
this.query = query; this.query = query;
this.evaluationContextProvider = evaluationContextProvider;
} }
@Override @Override

View File

@ -19,8 +19,8 @@ import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperatio
import org.springframework.data.elasticsearch.core.query.BaseQuery; import org.springframework.data.elasticsearch.core.query.BaseQuery;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery; import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator; import org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
import org.springframework.data.repository.query.ResultProcessor; import org.springframework.data.repository.query.ResultProcessor;
import org.springframework.data.repository.query.ValueExpressionDelegate;
import org.springframework.data.repository.query.parser.PartTree; import org.springframework.data.repository.query.parser.PartTree;
/** /**
@ -34,9 +34,9 @@ public class ReactivePartTreeElasticsearchQuery extends AbstractReactiveElastics
private final PartTree tree; private final PartTree tree;
public ReactivePartTreeElasticsearchQuery(ReactiveElasticsearchQueryMethod queryMethod, public ReactivePartTreeElasticsearchQuery(ReactiveElasticsearchQueryMethod queryMethod,
ReactiveElasticsearchOperations elasticsearchOperations, ReactiveElasticsearchOperations elasticsearchOperations, ValueExpressionDelegate valueExpressionDelegate) {
QueryMethodEvaluationContextProvider evaluationContextProvider) { super(queryMethod, elasticsearchOperations,
super(queryMethod, elasticsearchOperations, evaluationContextProvider); valueExpressionDelegate.createValueContextProvider(queryMethod.getParameters()));
ResultProcessor processor = queryMethod.getResultProcessor(); ResultProcessor processor = queryMethod.getResultProcessor();
this.tree = new PartTree(queryMethod.getName(), processor.getReturnedType().getDomainType()); this.tree = new PartTree(queryMethod.getName(), processor.getReturnedType().getDomainType());

View File

@ -37,8 +37,8 @@ import org.springframework.data.repository.core.support.RepositoryFragment;
import org.springframework.data.repository.query.QueryByExampleExecutor; import org.springframework.data.repository.query.QueryByExampleExecutor;
import org.springframework.data.repository.query.QueryLookupStrategy; import org.springframework.data.repository.query.QueryLookupStrategy;
import org.springframework.data.repository.query.QueryLookupStrategy.Key; import org.springframework.data.repository.query.QueryLookupStrategy.Key;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
import org.springframework.data.repository.query.RepositoryQuery; import org.springframework.data.repository.query.RepositoryQuery;
import org.springframework.data.repository.query.ValueExpressionDelegate;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -96,16 +96,16 @@ public class ElasticsearchRepositoryFactory extends RepositoryFactorySupport {
@Override @Override
protected Optional<QueryLookupStrategy> getQueryLookupStrategy(@Nullable Key key, protected Optional<QueryLookupStrategy> getQueryLookupStrategy(@Nullable Key key,
QueryMethodEvaluationContextProvider evaluationContextProvider) { ValueExpressionDelegate valueExpressionDelegate) {
return Optional.of(new ElasticsearchQueryLookupStrategy(evaluationContextProvider)); return Optional.of(new ElasticsearchQueryLookupStrategy(valueExpressionDelegate));
} }
private class ElasticsearchQueryLookupStrategy implements QueryLookupStrategy { private class ElasticsearchQueryLookupStrategy implements QueryLookupStrategy {
private final QueryMethodEvaluationContextProvider evaluationContextProvider; private final ValueExpressionDelegate valueExpressionDelegate;
ElasticsearchQueryLookupStrategy(QueryMethodEvaluationContextProvider evaluationContextProvider) { ElasticsearchQueryLookupStrategy(ValueExpressionDelegate valueExpressionDelegate) {
this.evaluationContextProvider = evaluationContextProvider; this.valueExpressionDelegate = valueExpressionDelegate;
} }
/* /*
@ -122,13 +122,12 @@ public class ElasticsearchRepositoryFactory extends RepositoryFactorySupport {
if (namedQueries.hasQuery(namedQueryName)) { if (namedQueries.hasQuery(namedQueryName)) {
String namedQuery = namedQueries.getQuery(namedQueryName); String namedQuery = namedQueries.getQuery(namedQueryName);
return new ElasticsearchStringQuery(queryMethod, elasticsearchOperations, namedQuery, return new ElasticsearchStringQuery(queryMethod, elasticsearchOperations, namedQuery, valueExpressionDelegate);
evaluationContextProvider);
} else if (queryMethod.hasAnnotatedQuery()) { } else if (queryMethod.hasAnnotatedQuery()) {
return new ElasticsearchStringQuery(queryMethod, elasticsearchOperations, queryMethod.getAnnotatedQuery(), return new ElasticsearchStringQuery(queryMethod, elasticsearchOperations, queryMethod.getAnnotatedQuery(),
evaluationContextProvider); valueExpressionDelegate);
} }
return new ElasticsearchPartQuery(queryMethod, elasticsearchOperations, evaluationContextProvider); return new ElasticsearchPartQuery(queryMethod, elasticsearchOperations, valueExpressionDelegate);
} }
} }

View File

@ -18,8 +18,8 @@ package org.springframework.data.elasticsearch.repository.support;
import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.ConversionService;
import org.springframework.data.elasticsearch.repository.query.ElasticsearchParametersParameterAccessor; import org.springframework.data.elasticsearch.repository.query.ElasticsearchParametersParameterAccessor;
import org.springframework.data.elasticsearch.repository.support.spel.QueryStringSpELEvaluator; import org.springframework.data.elasticsearch.repository.support.spel.QueryStringSpELEvaluator;
import org.springframework.data.expression.ValueEvaluationContextProvider;
import org.springframework.data.repository.query.QueryMethod; import org.springframework.data.repository.query.QueryMethod;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
@ -34,10 +34,10 @@ public class QueryStringProcessor {
private final String query; private final String query;
private final QueryMethod queryMethod; private final QueryMethod queryMethod;
private final ConversionService conversionService; private final ConversionService conversionService;
private final QueryMethodEvaluationContextProvider evaluationContextProvider; private final ValueEvaluationContextProvider evaluationContextProvider;
public QueryStringProcessor(String query, QueryMethod queryMethod, ConversionService conversionService, public QueryStringProcessor(String query, QueryMethod queryMethod, ConversionService conversionService,
QueryMethodEvaluationContextProvider evaluationContextProvider) { ValueEvaluationContextProvider evaluationContextProvider) {
Assert.notNull(query, "query must not be null"); Assert.notNull(query, "query must not be null");
Assert.notNull(queryMethod, "queryMethod must not be null"); Assert.notNull(queryMethod, "queryMethod must not be null");
@ -57,8 +57,8 @@ public class QueryStringProcessor {
* @return processed string * @return processed string
*/ */
public String createQuery(ElasticsearchParametersParameterAccessor parameterAccessor) { public String createQuery(ElasticsearchParametersParameterAccessor parameterAccessor) {
String queryString = new QueryStringPlaceholderReplacer(conversionService) String queryString = new QueryStringPlaceholderReplacer(conversionService).replacePlaceholders(query,
.replacePlaceholders(query, parameterAccessor); parameterAccessor);
QueryStringSpELEvaluator evaluator = new QueryStringSpELEvaluator(queryString, parameterAccessor, queryMethod, QueryStringSpELEvaluator evaluator = new QueryStringSpELEvaluator(queryString, parameterAccessor, queryMethod,
evaluationContextProvider, conversionService); evaluationContextProvider, conversionService);

View File

@ -36,9 +36,9 @@ import org.springframework.data.repository.core.support.RepositoryComposition;
import org.springframework.data.repository.core.support.RepositoryFragment; import org.springframework.data.repository.core.support.RepositoryFragment;
import org.springframework.data.repository.query.QueryLookupStrategy; import org.springframework.data.repository.query.QueryLookupStrategy;
import org.springframework.data.repository.query.QueryLookupStrategy.Key; import org.springframework.data.repository.query.QueryLookupStrategy.Key;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
import org.springframework.data.repository.query.ReactiveQueryByExampleExecutor; import org.springframework.data.repository.query.ReactiveQueryByExampleExecutor;
import org.springframework.data.repository.query.RepositoryQuery; import org.springframework.data.repository.query.RepositoryQuery;
import org.springframework.data.repository.query.ValueExpressionDelegate;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -98,8 +98,8 @@ public class ReactiveElasticsearchRepositoryFactory extends ReactiveRepositoryFa
*/ */
@Override @Override
protected Optional<QueryLookupStrategy> getQueryLookupStrategy(@Nullable Key key, protected Optional<QueryLookupStrategy> getQueryLookupStrategy(@Nullable Key key,
QueryMethodEvaluationContextProvider evaluationContextProvider) { ValueExpressionDelegate valueExpressionDelegate) {
return Optional.of(new ElasticsearchQueryLookupStrategy(operations, evaluationContextProvider, mappingContext)); return Optional.of(new ElasticsearchQueryLookupStrategy(operations, valueExpressionDelegate, mappingContext));
} }
/* /*
@ -130,19 +130,19 @@ public class ReactiveElasticsearchRepositoryFactory extends ReactiveRepositoryFa
private static class ElasticsearchQueryLookupStrategy implements QueryLookupStrategy { private static class ElasticsearchQueryLookupStrategy implements QueryLookupStrategy {
private final ReactiveElasticsearchOperations operations; private final ReactiveElasticsearchOperations operations;
private final QueryMethodEvaluationContextProvider evaluationContextProvider; private final ValueExpressionDelegate valueExpressionDelegate;
private final MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext; private final MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext;
public ElasticsearchQueryLookupStrategy(ReactiveElasticsearchOperations operations, public ElasticsearchQueryLookupStrategy(ReactiveElasticsearchOperations operations,
QueryMethodEvaluationContextProvider evaluationContextProvider, ValueExpressionDelegate valueExpressionDelegate,
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext) { MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext) {
Assert.notNull(operations, "operations must not be null"); Assert.notNull(operations, "operations must not be null");
Assert.notNull(evaluationContextProvider, "evaluationContextProvider must not be null"); Assert.notNull(valueExpressionDelegate, "ValueExpressionDelegate must not be null");
Assert.notNull(mappingContext, "mappingContext must not be null"); Assert.notNull(mappingContext, "mappingContext must not be null");
this.operations = operations; this.operations = operations;
this.evaluationContextProvider = evaluationContextProvider; this.valueExpressionDelegate = valueExpressionDelegate;
this.mappingContext = mappingContext; this.mappingContext = mappingContext;
} }
@ -161,12 +161,11 @@ public class ReactiveElasticsearchRepositoryFactory extends ReactiveRepositoryFa
if (namedQueries.hasQuery(namedQueryName)) { if (namedQueries.hasQuery(namedQueryName)) {
String namedQuery = namedQueries.getQuery(namedQueryName); String namedQuery = namedQueries.getQuery(namedQueryName);
return new ReactiveElasticsearchStringQuery(namedQuery, queryMethod, operations, return new ReactiveElasticsearchStringQuery(namedQuery, queryMethod, operations, valueExpressionDelegate);
evaluationContextProvider);
} else if (queryMethod.hasAnnotatedQuery()) { } else if (queryMethod.hasAnnotatedQuery()) {
return new ReactiveElasticsearchStringQuery(queryMethod, operations, evaluationContextProvider); return new ReactiveElasticsearchStringQuery(queryMethod, operations, valueExpressionDelegate);
} else { } else {
return new ReactivePartTreeElasticsearchQuery(queryMethod, operations, evaluationContextProvider); return new ReactivePartTreeElasticsearchQuery(queryMethod, operations, valueExpressionDelegate);
} }
} }
} }

View File

@ -24,8 +24,8 @@ import org.springframework.data.elasticsearch.repository.query.ElasticsearchPara
import org.springframework.data.elasticsearch.repository.support.value.ElasticsearchCollectionValueToStringConverter; import org.springframework.data.elasticsearch.repository.support.value.ElasticsearchCollectionValueToStringConverter;
import org.springframework.data.elasticsearch.repository.support.value.ElasticsearchQueryValueConversionService; import org.springframework.data.elasticsearch.repository.support.value.ElasticsearchQueryValueConversionService;
import org.springframework.data.elasticsearch.repository.support.value.ElasticsearchStringValueToStringConverter; import org.springframework.data.elasticsearch.repository.support.value.ElasticsearchStringValueToStringConverter;
import org.springframework.data.expression.ValueEvaluationContextProvider;
import org.springframework.data.repository.query.QueryMethod; import org.springframework.data.repository.query.QueryMethod;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
import org.springframework.expression.EvaluationContext; import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression; import org.springframework.expression.Expression;
import org.springframework.expression.ParserContext; import org.springframework.expression.ParserContext;
@ -53,11 +53,11 @@ public class QueryStringSpELEvaluator {
private final String queryString; private final String queryString;
private final ElasticsearchParametersParameterAccessor parameterAccessor; private final ElasticsearchParametersParameterAccessor parameterAccessor;
private final QueryMethod queryMethod; private final QueryMethod queryMethod;
private final QueryMethodEvaluationContextProvider evaluationContextProvider; private final ValueEvaluationContextProvider evaluationContextProvider;
private final TypeConverter elasticsearchSpELTypeConverter; private final TypeConverter elasticsearchSpELTypeConverter;
public QueryStringSpELEvaluator(String queryString, ElasticsearchParametersParameterAccessor parameterAccessor, public QueryStringSpELEvaluator(String queryString, ElasticsearchParametersParameterAccessor parameterAccessor,
QueryMethod queryMethod, QueryMethodEvaluationContextProvider evaluationContextProvider, QueryMethod queryMethod, ValueEvaluationContextProvider evaluationContextProvider,
ConversionService conversionService) { ConversionService conversionService) {
Assert.notNull(queryString, "queryString must not be null"); Assert.notNull(queryString, "queryString must not be null");
@ -83,8 +83,8 @@ public class QueryStringSpELEvaluator {
Expression expr = getQueryExpression(queryString); Expression expr = getQueryExpression(queryString);
if (expr != null) { if (expr != null) {
EvaluationContext context = evaluationContextProvider.getEvaluationContext(parameterAccessor.getParameters(), EvaluationContext context = evaluationContextProvider.getEvaluationContext(parameterAccessor.getValues())
parameterAccessor.getValues()); .getRequiredEvaluationContext();
if (context instanceof StandardEvaluationContext standardEvaluationContext) { if (context instanceof StandardEvaluationContext standardEvaluationContext) {
standardEvaluationContext.setTypeConverter(elasticsearchSpELTypeConverter); standardEvaluationContext.setTypeConverter(elasticsearchSpELTypeConverter);

View File

@ -1,4 +1,4 @@
Spring Data Elasticsearch 5.4 GA (2024.1.0) Spring Data Elasticsearch 6.0 M1 (2025.1.0)
Copyright (c) [2013-2022] Pivotal Software, Inc. Copyright (c) [2013-2022] Pivotal Software, Inc.
This product is licensed to you under the Apache License, Version 2.0 (the "License"). This product is licensed to you under the Apache License, Version 2.0 (the "License").
@ -25,3 +25,4 @@ conditions of the subcomponent's license, as noted in the LICENSE file.

View File

@ -35,7 +35,7 @@ import org.springframework.data.elasticsearch.repository.query.ElasticsearchPart
import org.springframework.data.elasticsearch.repository.query.ElasticsearchQueryMethod; import org.springframework.data.elasticsearch.repository.query.ElasticsearchQueryMethod;
import org.springframework.data.projection.SpelAwareProxyProjectionFactory; import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; import org.springframework.data.repository.query.ValueExpressionDelegate;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
/** /**
@ -647,7 +647,7 @@ public abstract class ElasticsearchPartQueryIntegrationTests {
new DefaultRepositoryMetadata(SampleRepository.class), new SpelAwareProxyProjectionFactory(), new DefaultRepositoryMetadata(SampleRepository.class), new SpelAwareProxyProjectionFactory(),
operations.getElasticsearchConverter().getMappingContext()); operations.getElasticsearchConverter().getMappingContext());
ElasticsearchPartQuery partQuery = new ElasticsearchPartQuery(queryMethod, operations, ElasticsearchPartQuery partQuery = new ElasticsearchPartQuery(queryMethod, operations,
QueryMethodEvaluationContextProvider.DEFAULT); ValueExpressionDelegate.create());
Query query = partQuery.createQuery(parameters); Query query = partQuery.createQuery(parameters);
return buildQueryString(query, Book.class); return buildQueryString(query, Book.class);
} }

View File

@ -48,7 +48,7 @@ import org.springframework.data.elasticsearch.repositories.custommethod.QueryPar
import org.springframework.data.projection.SpelAwareProxyProjectionFactory; import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
import org.springframework.data.repository.Repository; import org.springframework.data.repository.Repository;
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; import org.springframework.data.repository.query.ValueExpressionDelegate;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
/** /**
@ -111,8 +111,7 @@ public class ElasticsearchStringQueryUnitTests extends ElasticsearchStringQueryU
@Test @Test
public void shouldReplaceParametersSpELWithQuotes() throws Exception { public void shouldReplaceParametersSpELWithQuotes() throws Exception {
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByNameSpEL", org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByNameSpEL", "hello \"world\"");
"hello \"world\"");
String expected = """ String expected = """
{ {
"bool":{ "bool":{
@ -342,8 +341,8 @@ public class ElasticsearchStringQueryUnitTests extends ElasticsearchStringQueryU
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByNameIn", params); org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByNameIn", params);
assertThat(query).isInstanceOf(StringQuery.class); assertThat(query).isInstanceOf(StringQuery.class);
assertThat(((StringQuery) query).getSource()).isEqualTo( assertThat(((StringQuery) query).getSource())
"{ 'bool' : { 'must' : { 'terms' : { 'name' : [\"param\\\\1\",\"param\\\\2\"] } } } }"); .isEqualTo("{ 'bool' : { 'must' : { 'terms' : { 'name' : [\"param\\\\1\",\"param\\\\2\"] } } } }");
} }
private org.springframework.data.elasticsearch.core.query.Query createQuery(String methodName, Object... args) private org.springframework.data.elasticsearch.core.query.Query createQuery(String methodName, Object... args)
@ -372,7 +371,7 @@ public class ElasticsearchStringQueryUnitTests extends ElasticsearchStringQueryU
private ElasticsearchStringQuery queryForMethod(ElasticsearchQueryMethod queryMethod) { private ElasticsearchStringQuery queryForMethod(ElasticsearchQueryMethod queryMethod) {
return new ElasticsearchStringQuery(queryMethod, operations, queryMethod.getAnnotatedQuery(), return new ElasticsearchStringQuery(queryMethod, operations, queryMethod.getAnnotatedQuery(),
QueryMethodEvaluationContextProvider.DEFAULT); ValueExpressionDelegate.create());
} }
private ElasticsearchQueryMethod getQueryMethod(String name, Class<?>... parameters) throws NoSuchMethodException { private ElasticsearchQueryMethod getQueryMethod(String name, Class<?>... parameters) throws NoSuchMethodException {

View File

@ -37,6 +37,7 @@ import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import org.skyscreamer.jsonassert.JSONAssert; import org.skyscreamer.jsonassert.JSONAssert;
import org.skyscreamer.jsonassert.JSONCompareMode; import org.skyscreamer.jsonassert.JSONCompareMode;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.Field;
@ -51,7 +52,7 @@ import org.springframework.data.elasticsearch.repositories.custommethod.QueryPar
import org.springframework.data.projection.SpelAwareProxyProjectionFactory; import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
import org.springframework.data.repository.Repository; import org.springframework.data.repository.Repository;
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; import org.springframework.data.repository.query.ValueExpressionDelegate;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
/** /**
@ -112,8 +113,7 @@ public class ReactiveElasticsearchStringQueryUnitTests extends ElasticsearchStri
@Test @Test
public void shouldReplaceParametersSpELWithQuotes() throws Exception { public void shouldReplaceParametersSpELWithQuotes() throws Exception {
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByNameSpEL", org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByNameSpEL", "hello \"world\"");
"hello \"world\"");
String expected = """ String expected = """
{ {
"bool":{ "bool":{
@ -374,8 +374,7 @@ public class ReactiveElasticsearchStringQueryUnitTests extends ElasticsearchStri
} }
private ReactiveElasticsearchStringQuery queryForMethod(ReactiveElasticsearchQueryMethod queryMethod) { private ReactiveElasticsearchStringQuery queryForMethod(ReactiveElasticsearchQueryMethod queryMethod) {
return new ReactiveElasticsearchStringQuery(queryMethod, operations, return new ReactiveElasticsearchStringQuery(queryMethod, operations, ValueExpressionDelegate.create());
QueryMethodEvaluationContextProvider.DEFAULT);
} }
private ReactiveElasticsearchQueryMethod getQueryMethod(String name, Class<?>... parameters) private ReactiveElasticsearchQueryMethod getQueryMethod(String name, Class<?>... parameters)

View File

@ -78,7 +78,8 @@ class HttpHeadersTest {
springHttpHeaders.add(headerName, "true"); springHttpHeaders.add(headerName, "true");
var httpHeaders = new HttpHeaders(); var httpHeaders = new HttpHeaders();
httpHeaders.addAll(springHttpHeaders);
springHttpHeaders.forEach(httpHeaders::addAll);
assertThat(httpHeaders.get(X_TEST_HEADER)).containsExactly("foo", "bar"); assertThat(httpHeaders.get(X_TEST_HEADER)).containsExactly("foo", "bar");
assertThat(httpHeaders.get(headerName)).containsExactly("true"); assertThat(httpHeaders.get(headerName)).containsExactly("true");