mirror of
https://github.com/spring-projects/spring-data-elasticsearch.git
synced 2025-08-04 16:43:27 +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 {
|
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
22
pom.xml
@ -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>
|
||||||
|
@ -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
|
||||||
|
@ -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");
|
||||||
|
@ -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()) {
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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("*")));
|
||||||
}
|
}
|
||||||
|
@ -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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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");
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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());
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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)
|
||||||
|
@ -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");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user