mirror of
https://github.com/spring-projects/spring-data-elasticsearch.git
synced 2025-08-04 00:23:26 +00:00
Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0fa2839d73 | ||
|
89d2eafc56 | ||
|
ea66638f50 | ||
|
9cf060b396 | ||
|
5d36e611ab | ||
|
f8e91485ca | ||
|
7828778e4b |
2
Jenkinsfile
vendored
2
Jenkinsfile
vendored
@ -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
22
pom.xml
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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");
|
||||
|
@ -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()) {
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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("*")));
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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");
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
|
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user