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 {
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 {

22
pom.xml
View File

@ -5,12 +5,12 @@
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>5.5.0-SNAPSHOT</version>
<version>6.0.0-M1</version>
<parent>
<groupId>org.springframework.data.build</groupId>
<artifactId>spring-data-parent</artifactId>
<version>3.5.0-SNAPSHOT</version>
<version>4.0.0-M1</version>
</parent>
<name>Spring Data Elasticsearch</name>
@ -18,7 +18,7 @@
<url>https://github.com/spring-projects/spring-data-elasticsearch</url>
<properties>
<springdata.commons>3.5.0-SNAPSHOT</springdata.commons>
<springdata.commons>4.0.0-M1</springdata.commons>
<!-- version of the ElasticsearchClient -->
<elasticsearch-java>8.17.0</elasticsearch-java>
@ -450,20 +450,8 @@
</profiles>
<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>
</project>

View File

@ -6,6 +6,7 @@ The following table shows the Elasticsearch and Spring versions that are used by
[cols="^,^,^,^",options="header"]
|===
| 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
| 2024.1 | 5.4.x | 8.15.5 | 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.DeleteQuery;
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.QueryMethod;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
import org.springframework.data.repository.query.RepositoryQuery;
import org.springframework.data.repository.query.ResultProcessor;
import org.springframework.data.util.StreamUtils;
@ -49,11 +49,10 @@ public abstract class AbstractElasticsearchRepositoryQuery implements Repository
protected ElasticsearchQueryMethod queryMethod;
protected final ElasticsearchOperations elasticsearchOperations;
protected final ElasticsearchConverter elasticsearchConverter;
protected final QueryMethodEvaluationContextProvider evaluationContextProvider;
protected final ValueEvaluationContextProvider evaluationContextProvider;
public AbstractElasticsearchRepositoryQuery(ElasticsearchQueryMethod queryMethod,
ElasticsearchOperations elasticsearchOperations,
QueryMethodEvaluationContextProvider evaluationContextProvider) {
ElasticsearchOperations elasticsearchOperations, ValueEvaluationContextProvider evaluationContextProvider) {
Assert.notNull(queryMethod, "queryMethod 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 org.reactivestreams.Publisher;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations;
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.repository.query.ReactiveElasticsearchQueryExecution.ResultProcessingConverter;
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.repository.query.ParameterAccessor;
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.ResultProcessor;
import org.springframework.util.Assert;
@ -52,11 +53,11 @@ abstract class AbstractReactiveElasticsearchRepositoryQuery implements Repositor
protected final ReactiveElasticsearchQueryMethod queryMethod;
private final ReactiveElasticsearchOperations elasticsearchOperations;
protected final QueryMethodEvaluationContextProvider evaluationContextProvider;
protected final ValueEvaluationContextProvider evaluationContextProvider;
AbstractReactiveElasticsearchRepositoryQuery(ReactiveElasticsearchQueryMethod queryMethod,
ReactiveElasticsearchOperations elasticsearchOperations,
QueryMethodEvaluationContextProvider evaluationContextProvider) {
ValueEvaluationContextProvider evaluationContextProvider) {
Assert.notNull(queryMethod, "queryMethod must not be null");
Assert.notNull(elasticsearchOperations, "elasticsearchOperations must not be null");
@ -135,8 +136,7 @@ abstract class AbstractReactiveElasticsearchRepositoryQuery implements Repositor
if (isDeleteQuery()) {
return (query, type, targetType, indexCoordinates) -> operations
.delete(DeleteQuery.builder(query).build(), type, indexCoordinates)
.map(ByQueryResponse::getDeleted);
.delete(DeleteQuery.builder(query).build(), type, indexCoordinates).map(ByQueryResponse::getDeleted);
} else if (isCountQuery()) {
return (query, type, targetType, indexCoordinates) -> operations.count(query, type, indexCoordinates);
} 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.repository.query.parser.ElasticsearchQueryCreator;
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;
/**
@ -40,8 +40,8 @@ public class ElasticsearchPartQuery extends AbstractElasticsearchRepositoryQuery
private final MappingContext<?, ElasticsearchPersistentProperty> mappingContext;
public ElasticsearchPartQuery(ElasticsearchQueryMethod method, ElasticsearchOperations elasticsearchOperations,
QueryMethodEvaluationContextProvider evaluationContextProvider) {
super(method, elasticsearchOperations, evaluationContextProvider);
ValueExpressionDelegate valueExpressionDelegate) {
super(method, elasticsearchOperations, valueExpressionDelegate.createValueContextProvider(method.getParameters()));
this.tree = new PartTree(queryMethod.getName(), queryMethod.getResultProcessor().getReturnedType().getDomainType());
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.SourceFilter;
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.projection.ProjectionFactory;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.query.Parameters;
import org.springframework.data.repository.query.ParametersSource;
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.ReactiveWrapperConverters;
import org.springframework.data.util.TypeInformation;
@ -102,13 +102,6 @@ public class ElasticsearchQueryMethod extends QueryMethod {
verifyCountQueryTypes();
}
@SuppressWarnings("removal")
@Override
@Deprecated
protected Parameters<?, ?> createParameters(Method method, TypeInformation<?> domainType) {
return new ElasticsearchParameters(ParametersSource.of(method));
}
@Override
protected Parameters<?, ?> createParameters(ParametersSource parametersSource) {
return new ElasticsearchParameters(parametersSource);
@ -302,8 +295,7 @@ public class ElasticsearchQueryMethod extends QueryMethod {
*/
@Nullable
SourceFilter getSourceFilter(ElasticsearchParametersParameterAccessor parameterAccessor,
ElasticsearchConverter converter,
QueryMethodEvaluationContextProvider evaluationContextProvider) {
ElasticsearchConverter converter, ValueEvaluationContextProvider evaluationContextProvider) {
if (sourceFilters == null || (sourceFilters.includes().length == 0 && sourceFilters.excludes().length == 0)) {
return null;
@ -313,20 +305,20 @@ public class ElasticsearchQueryMethod extends QueryMethod {
FetchSourceFilterBuilder fetchSourceFilterBuilder = new FetchSourceFilterBuilder();
if (sourceFilters.includes().length > 0) {
fetchSourceFilterBuilder.withIncludes(mapParameters(sourceFilters.includes(), parameterAccessor,
conversionService, evaluationContextProvider));
fetchSourceFilterBuilder.withIncludes(
mapParameters(sourceFilters.includes(), parameterAccessor, conversionService, evaluationContextProvider));
}
if (sourceFilters.excludes().length > 0) {
fetchSourceFilterBuilder.withExcludes(mapParameters(sourceFilters.excludes(), parameterAccessor,
conversionService, evaluationContextProvider));
fetchSourceFilterBuilder.withExcludes(
mapParameters(sourceFilters.excludes(), parameterAccessor, conversionService, evaluationContextProvider));
}
return fetchSourceFilterBuilder.build();
}
private String[] mapParameters(String[] source, ElasticsearchParametersParameterAccessor parameterAccessor,
ConversionService conversionService, QueryMethodEvaluationContextProvider evaluationContextProvider) {
ConversionService conversionService, ValueEvaluationContextProvider evaluationContextProvider) {
List<String> fieldNames = new ArrayList<>();
@ -378,8 +370,7 @@ public class ElasticsearchQueryMethod extends QueryMethod {
}
void addMethodParameter(BaseQuery query, ElasticsearchParametersParameterAccessor parameterAccessor,
ElasticsearchConverter elasticsearchConverter,
QueryMethodEvaluationContextProvider evaluationContextProvider) {
ElasticsearchConverter elasticsearchConverter, ValueEvaluationContextProvider evaluationContextProvider) {
if (hasAnnotatedHighlight()) {
var highlightQuery = getAnnotatedHighlightQuery(new HighlightConverter(parameterAccessor,
@ -415,8 +406,7 @@ public class ElasticsearchQueryMethod extends QueryMethod {
});
var needToAddSourceFilter = sourceFilter == null
&& !(methodParameters.getRuntimeFields().isEmpty()
&& methodParameters.getScriptedFields().isEmpty());
&& !(methodParameters.getRuntimeFields().isEmpty() && methodParameters.getScriptedFields().isEmpty());
if (needToAddSourceFilter) {
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.StringQuery;
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;
/**
@ -38,11 +38,11 @@ public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQue
private final String queryString;
public ElasticsearchStringQuery(ElasticsearchQueryMethod queryMethod, ElasticsearchOperations elasticsearchOperations,
String queryString, QueryMethodEvaluationContextProvider evaluationContextProvider) {
super(queryMethod, elasticsearchOperations, evaluationContextProvider);
String queryString, ValueExpressionDelegate valueExpressionDelegate) {
super(queryMethod, elasticsearchOperations,
valueExpressionDelegate.createValueContextProvider(queryMethod.getParameters()));
Assert.notNull(queryString, "Query cannot be empty");
Assert.notNull(evaluationContextProvider, "ExpressionEvaluationContextProvider must not be null");
this.queryString = queryString;
}
@ -67,8 +67,7 @@ public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQue
var processed = new QueryStringProcessor(queryString, queryMethod, conversionService, evaluationContextProvider)
.createQuery(parameterAccessor);
return new StringQuery(processed)
.addSort(parameterAccessor.getSort());
return new StringQuery(processed).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.HighlightParameters;
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.QueryMethodEvaluationContextProvider;
import org.springframework.util.Assert;
/**
@ -38,13 +38,11 @@ public class HighlightConverter {
private final ElasticsearchParametersParameterAccessor parameterAccessor;
private final ConversionService conversionService;
private final QueryMethodEvaluationContextProvider evaluationContextProvider;
private final ValueEvaluationContextProvider evaluationContextProvider;
private final QueryMethod queryMethod;
HighlightConverter(ElasticsearchParametersParameterAccessor parameterAccessor,
ConversionService conversionService,
QueryMethodEvaluationContextProvider evaluationContextProvider,
QueryMethod queryMethod) {
HighlightConverter(ElasticsearchParametersParameterAccessor parameterAccessor, ConversionService conversionService,
ValueEvaluationContextProvider evaluationContextProvider, QueryMethod queryMethod) {
Assert.notNull(parameterAccessor, "parameterAccessor 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;
import static org.springframework.data.repository.util.ClassUtils.*;
import reactor.core.publisher.Mono;
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.util.Lazy;
import org.springframework.data.util.ReactiveWrappers;
import org.springframework.data.util.ReflectionUtils;
import org.springframework.data.util.TypeInformation;
import org.springframework.util.ClassUtils;
@ -55,7 +54,7 @@ public class ReactiveElasticsearchQueryMethod extends ElasticsearchQueryMethod {
super(method, metadata, factory, mappingContext);
if (hasParameterOfType(method, Pageable.class)) {
if (ReflectionUtils.hasParameterOfType(method, Pageable.class)) {
TypeInformation<?> returnType = TypeInformation.fromReturnTypeOf(method);
boolean multiWrapper = ReactiveWrappers.isMultiValueType(returnType.getType());
@ -75,7 +74,7 @@ public class ReactiveElasticsearchQueryMethod extends ElasticsearchQueryMethod {
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. "
+ "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.StringQuery;
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;
/**
@ -32,23 +32,20 @@ import org.springframework.util.Assert;
public class ReactiveElasticsearchStringQuery extends AbstractReactiveElasticsearchRepositoryQuery {
private final String query;
private final QueryMethodEvaluationContextProvider evaluationContextProvider;
public ReactiveElasticsearchStringQuery(ReactiveElasticsearchQueryMethod queryMethod,
ReactiveElasticsearchOperations operations, QueryMethodEvaluationContextProvider evaluationContextProvider) {
ReactiveElasticsearchOperations operations, ValueExpressionDelegate evaluationContextProvider) {
this(queryMethod.getAnnotatedQuery(), queryMethod, operations, evaluationContextProvider);
}
public ReactiveElasticsearchStringQuery(String query, ReactiveElasticsearchQueryMethod queryMethod,
ReactiveElasticsearchOperations operations, QueryMethodEvaluationContextProvider evaluationContextProvider) {
super(queryMethod, operations, evaluationContextProvider);
ReactiveElasticsearchOperations operations, ValueExpressionDelegate valueExpressionDelegate) {
super(queryMethod, operations, valueExpressionDelegate.createValueContextProvider(queryMethod.getParameters()));
Assert.notNull(query, "query must not be null");
Assert.notNull(evaluationContextProvider, "evaluationContextProvider must not be null");
this.query = query;
this.evaluationContextProvider = evaluationContextProvider;
}
@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.CriteriaQuery;
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.ValueExpressionDelegate;
import org.springframework.data.repository.query.parser.PartTree;
/**
@ -34,9 +34,9 @@ public class ReactivePartTreeElasticsearchQuery extends AbstractReactiveElastics
private final PartTree tree;
public ReactivePartTreeElasticsearchQuery(ReactiveElasticsearchQueryMethod queryMethod,
ReactiveElasticsearchOperations elasticsearchOperations,
QueryMethodEvaluationContextProvider evaluationContextProvider) {
super(queryMethod, elasticsearchOperations, evaluationContextProvider);
ReactiveElasticsearchOperations elasticsearchOperations, ValueExpressionDelegate valueExpressionDelegate) {
super(queryMethod, elasticsearchOperations,
valueExpressionDelegate.createValueContextProvider(queryMethod.getParameters()));
ResultProcessor processor = queryMethod.getResultProcessor();
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.QueryLookupStrategy;
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.ValueExpressionDelegate;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@ -96,16 +96,16 @@ public class ElasticsearchRepositoryFactory extends RepositoryFactorySupport {
@Override
protected Optional<QueryLookupStrategy> getQueryLookupStrategy(@Nullable Key key,
QueryMethodEvaluationContextProvider evaluationContextProvider) {
return Optional.of(new ElasticsearchQueryLookupStrategy(evaluationContextProvider));
ValueExpressionDelegate valueExpressionDelegate) {
return Optional.of(new ElasticsearchQueryLookupStrategy(valueExpressionDelegate));
}
private class ElasticsearchQueryLookupStrategy implements QueryLookupStrategy {
private final QueryMethodEvaluationContextProvider evaluationContextProvider;
private final ValueExpressionDelegate valueExpressionDelegate;
ElasticsearchQueryLookupStrategy(QueryMethodEvaluationContextProvider evaluationContextProvider) {
this.evaluationContextProvider = evaluationContextProvider;
ElasticsearchQueryLookupStrategy(ValueExpressionDelegate valueExpressionDelegate) {
this.valueExpressionDelegate = valueExpressionDelegate;
}
/*
@ -122,13 +122,12 @@ public class ElasticsearchRepositoryFactory extends RepositoryFactorySupport {
if (namedQueries.hasQuery(namedQueryName)) {
String namedQuery = namedQueries.getQuery(namedQueryName);
return new ElasticsearchStringQuery(queryMethod, elasticsearchOperations, namedQuery,
evaluationContextProvider);
return new ElasticsearchStringQuery(queryMethod, elasticsearchOperations, namedQuery, valueExpressionDelegate);
} else if (queryMethod.hasAnnotatedQuery()) {
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.data.elasticsearch.repository.query.ElasticsearchParametersParameterAccessor;
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.QueryMethodEvaluationContextProvider;
import org.springframework.util.Assert;
/**
@ -34,10 +34,10 @@ public class QueryStringProcessor {
private final String query;
private final QueryMethod queryMethod;
private final ConversionService conversionService;
private final QueryMethodEvaluationContextProvider evaluationContextProvider;
private final ValueEvaluationContextProvider evaluationContextProvider;
public QueryStringProcessor(String query, QueryMethod queryMethod, ConversionService conversionService,
QueryMethodEvaluationContextProvider evaluationContextProvider) {
ValueEvaluationContextProvider evaluationContextProvider) {
Assert.notNull(query, "query must not be null");
Assert.notNull(queryMethod, "queryMethod must not be null");
@ -57,8 +57,8 @@ public class QueryStringProcessor {
* @return processed string
*/
public String createQuery(ElasticsearchParametersParameterAccessor parameterAccessor) {
String queryString = new QueryStringPlaceholderReplacer(conversionService)
.replacePlaceholders(query, parameterAccessor);
String queryString = new QueryStringPlaceholderReplacer(conversionService).replacePlaceholders(query,
parameterAccessor);
QueryStringSpELEvaluator evaluator = new QueryStringSpELEvaluator(queryString, parameterAccessor, queryMethod,
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.query.QueryLookupStrategy;
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.RepositoryQuery;
import org.springframework.data.repository.query.ValueExpressionDelegate;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@ -98,8 +98,8 @@ public class ReactiveElasticsearchRepositoryFactory extends ReactiveRepositoryFa
*/
@Override
protected Optional<QueryLookupStrategy> getQueryLookupStrategy(@Nullable Key key,
QueryMethodEvaluationContextProvider evaluationContextProvider) {
return Optional.of(new ElasticsearchQueryLookupStrategy(operations, evaluationContextProvider, mappingContext));
ValueExpressionDelegate valueExpressionDelegate) {
return Optional.of(new ElasticsearchQueryLookupStrategy(operations, valueExpressionDelegate, mappingContext));
}
/*
@ -130,19 +130,19 @@ public class ReactiveElasticsearchRepositoryFactory extends ReactiveRepositoryFa
private static class ElasticsearchQueryLookupStrategy implements QueryLookupStrategy {
private final ReactiveElasticsearchOperations operations;
private final QueryMethodEvaluationContextProvider evaluationContextProvider;
private final ValueExpressionDelegate valueExpressionDelegate;
private final MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext;
public ElasticsearchQueryLookupStrategy(ReactiveElasticsearchOperations operations,
QueryMethodEvaluationContextProvider evaluationContextProvider,
ValueExpressionDelegate valueExpressionDelegate,
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext) {
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");
this.operations = operations;
this.evaluationContextProvider = evaluationContextProvider;
this.valueExpressionDelegate = valueExpressionDelegate;
this.mappingContext = mappingContext;
}
@ -161,12 +161,11 @@ public class ReactiveElasticsearchRepositoryFactory extends ReactiveRepositoryFa
if (namedQueries.hasQuery(namedQueryName)) {
String namedQuery = namedQueries.getQuery(namedQueryName);
return new ReactiveElasticsearchStringQuery(namedQuery, queryMethod, operations,
evaluationContextProvider);
return new ReactiveElasticsearchStringQuery(namedQuery, queryMethod, operations, valueExpressionDelegate);
} else if (queryMethod.hasAnnotatedQuery()) {
return new ReactiveElasticsearchStringQuery(queryMethod, operations, evaluationContextProvider);
return new ReactiveElasticsearchStringQuery(queryMethod, operations, valueExpressionDelegate);
} 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.ElasticsearchQueryValueConversionService;
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.QueryMethodEvaluationContextProvider;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ParserContext;
@ -53,11 +53,11 @@ public class QueryStringSpELEvaluator {
private final String queryString;
private final ElasticsearchParametersParameterAccessor parameterAccessor;
private final QueryMethod queryMethod;
private final QueryMethodEvaluationContextProvider evaluationContextProvider;
private final ValueEvaluationContextProvider evaluationContextProvider;
private final TypeConverter elasticsearchSpELTypeConverter;
public QueryStringSpELEvaluator(String queryString, ElasticsearchParametersParameterAccessor parameterAccessor,
QueryMethod queryMethod, QueryMethodEvaluationContextProvider evaluationContextProvider,
QueryMethod queryMethod, ValueEvaluationContextProvider evaluationContextProvider,
ConversionService conversionService) {
Assert.notNull(queryString, "queryString must not be null");
@ -83,8 +83,8 @@ public class QueryStringSpELEvaluator {
Expression expr = getQueryExpression(queryString);
if (expr != null) {
EvaluationContext context = evaluationContextProvider.getEvaluationContext(parameterAccessor.getParameters(),
parameterAccessor.getValues());
EvaluationContext context = evaluationContextProvider.getEvaluationContext(parameterAccessor.getValues())
.getRequiredEvaluationContext();
if (context instanceof StandardEvaluationContext standardEvaluationContext) {
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.
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.projection.SpelAwareProxyProjectionFactory;
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;
/**
@ -647,7 +647,7 @@ public abstract class ElasticsearchPartQueryIntegrationTests {
new DefaultRepositoryMetadata(SampleRepository.class), new SpelAwareProxyProjectionFactory(),
operations.getElasticsearchConverter().getMappingContext());
ElasticsearchPartQuery partQuery = new ElasticsearchPartQuery(queryMethod, operations,
QueryMethodEvaluationContextProvider.DEFAULT);
ValueExpressionDelegate.create());
Query query = partQuery.createQuery(parameters);
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.repository.Repository;
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;
/**
@ -111,8 +111,7 @@ public class ElasticsearchStringQueryUnitTests extends ElasticsearchStringQueryU
@Test
public void shouldReplaceParametersSpELWithQuotes() throws Exception {
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByNameSpEL",
"hello \"world\"");
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByNameSpEL", "hello \"world\"");
String expected = """
{
"bool":{
@ -342,8 +341,8 @@ public class ElasticsearchStringQueryUnitTests extends ElasticsearchStringQueryU
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByNameIn", params);
assertThat(query).isInstanceOf(StringQuery.class);
assertThat(((StringQuery) query).getSource()).isEqualTo(
"{ 'bool' : { 'must' : { 'terms' : { 'name' : [\"param\\\\1\",\"param\\\\2\"] } } } }");
assertThat(((StringQuery) query).getSource())
.isEqualTo("{ 'bool' : { 'must' : { 'terms' : { 'name' : [\"param\\\\1\",\"param\\\\2\"] } } } }");
}
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) {
return new ElasticsearchStringQuery(queryMethod, operations, queryMethod.getAnnotatedQuery(),
QueryMethodEvaluationContextProvider.DEFAULT);
ValueExpressionDelegate.create());
}
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.skyscreamer.jsonassert.JSONAssert;
import org.skyscreamer.jsonassert.JSONCompareMode;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
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.repository.Repository;
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;
/**
@ -112,8 +113,7 @@ public class ReactiveElasticsearchStringQueryUnitTests extends ElasticsearchStri
@Test
public void shouldReplaceParametersSpELWithQuotes() throws Exception {
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByNameSpEL",
"hello \"world\"");
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByNameSpEL", "hello \"world\"");
String expected = """
{
"bool":{
@ -374,8 +374,7 @@ public class ReactiveElasticsearchStringQueryUnitTests extends ElasticsearchStri
}
private ReactiveElasticsearchStringQuery queryForMethod(ReactiveElasticsearchQueryMethod queryMethod) {
return new ReactiveElasticsearchStringQuery(queryMethod, operations,
QueryMethodEvaluationContextProvider.DEFAULT);
return new ReactiveElasticsearchStringQuery(queryMethod, operations, ValueExpressionDelegate.create());
}
private ReactiveElasticsearchQueryMethod getQueryMethod(String name, Class<?>... parameters)

View File

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