diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractElasticsearchRepositoryQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractElasticsearchRepositoryQuery.java index be7ca9f17..aa4f84e08 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractElasticsearchRepositoryQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractElasticsearchRepositoryQuery.java @@ -25,9 +25,9 @@ import org.springframework.data.elasticsearch.core.query.DeleteQuery; import org.springframework.data.elasticsearch.core.query.Query; import org.springframework.data.elasticsearch.core.query.SearchTemplateQuery; +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; @@ -50,11 +50,11 @@ 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) { + ValueEvaluationContextProvider evaluationContextProvider) { Assert.notNull(queryMethod, "queryMethod must not be null"); Assert.notNull(elasticsearchOperations, "elasticsearchOperations must not be null"); diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractReactiveElasticsearchRepositoryQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractReactiveElasticsearchRepositoryQuery.java index 384743562..6bd79fb90 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractReactiveElasticsearchRepositoryQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractReactiveElasticsearchRepositoryQuery.java @@ -15,6 +15,7 @@ */ package org.springframework.data.elasticsearch.repository.query; +import org.springframework.data.expression.ValueEvaluationContextProvider; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -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"); diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java index c3efcd47d..f06eba308 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java @@ -16,12 +16,7 @@ package org.springframework.data.elasticsearch.repository.query; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; -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.parser.PartTree; +import org.springframework.data.repository.query.ValueExpressionDelegate; /** * ElasticsearchPartQuery @@ -37,7 +32,8 @@ */ @Deprecated(forRemoval = true) public class ElasticsearchPartQuery extends RepositoryPartQuery { - public ElasticsearchPartQuery(ElasticsearchQueryMethod method, ElasticsearchOperations elasticsearchOperations, QueryMethodEvaluationContextProvider evaluationContextProvider) { - super(method, elasticsearchOperations, evaluationContextProvider); + public ElasticsearchPartQuery(ElasticsearchQueryMethod method, ElasticsearchOperations elasticsearchOperations, + ValueExpressionDelegate valueExpressionDelegate) { + super(method, elasticsearchOperations, valueExpressionDelegate); } } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchQueryMethod.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchQueryMethod.java index 6a3608bec..5433a3bd6 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchQueryMethod.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchQueryMethod.java @@ -44,6 +44,7 @@ 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; @@ -105,13 +106,6 @@ public ElasticsearchQueryMethod(Method method, RepositoryMetadata repositoryMeta 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); @@ -331,7 +325,7 @@ public boolean hasCountQueryAnnotation() { @Nullable SourceFilter getSourceFilter(ElasticsearchParametersParameterAccessor parameterAccessor, ElasticsearchConverter converter, - QueryMethodEvaluationContextProvider evaluationContextProvider) { + ValueEvaluationContextProvider evaluationContextProvider) { if (sourceFilters == null || (sourceFilters.includes().length == 0 && sourceFilters.excludes().length == 0)) { return null; @@ -354,7 +348,7 @@ SourceFilter getSourceFilter(ElasticsearchParametersParameterAccessor parameterA } private String[] mapParameters(String[] source, ElasticsearchParametersParameterAccessor parameterAccessor, - ConversionService conversionService, QueryMethodEvaluationContextProvider evaluationContextProvider) { + ConversionService conversionService, ValueEvaluationContextProvider evaluationContextProvider) { List fieldNames = new ArrayList<>(); @@ -407,7 +401,7 @@ private Class potentiallyUnwrapReturnTypeFor(RepositoryMetadata metadata, Met void addSpecialMethodParameters(BaseQuery query, ElasticsearchParametersParameterAccessor parameterAccessor, ElasticsearchConverter elasticsearchConverter, - QueryMethodEvaluationContextProvider evaluationContextProvider) { + ValueEvaluationContextProvider evaluationContextProvider) { if (hasAnnotatedHighlight()) { var highlightQuery = getAnnotatedHighlightQuery(new HighlightConverter(parameterAccessor, diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java index f9c1a830a..32f7d32a7 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java @@ -16,7 +16,7 @@ package org.springframework.data.elasticsearch.repository.query; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; +import org.springframework.data.repository.query.ValueExpressionDelegate; /** * ElasticsearchStringQuery @@ -32,7 +32,7 @@ @Deprecated(since = "5.5", forRemoval = true) public class ElasticsearchStringQuery extends RepositoryStringQuery { public ElasticsearchStringQuery(ElasticsearchQueryMethod queryMethod, ElasticsearchOperations elasticsearchOperations, - String queryString, QueryMethodEvaluationContextProvider evaluationContextProvider) { - super(queryMethod, elasticsearchOperations, queryString, evaluationContextProvider); + String queryString, ValueExpressionDelegate valueExpressionDelegate) { + super(queryMethod, elasticsearchOperations, queryString, valueExpressionDelegate); } } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/HighlightConverter.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/HighlightConverter.java index 843aadecd..21b134b2b 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/HighlightConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/HighlightConverter.java @@ -25,8 +25,8 @@ 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,13 @@ 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) { + ConversionService conversionService, + ValueEvaluationContextProvider evaluationContextProvider, + QueryMethod queryMethod) { Assert.notNull(parameterAccessor, "parameterAccessor must not be null"); Assert.notNull(conversionService, "conversionService must not be null"); diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchQueryMethod.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchQueryMethod.java index 320ff5cf6..422eb46db 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchQueryMethod.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchQueryMethod.java @@ -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.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 ReactiveElasticsearchQueryMethod(Method method, RepositoryMetadata metada 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 ReactiveElasticsearchQueryMethod(Method method, RepositoryMetadata metada 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)); } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQuery.java index 63651bb1c..f636a566d 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQuery.java @@ -16,7 +16,7 @@ package org.springframework.data.elasticsearch.repository.query; import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations; -import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; +import org.springframework.data.repository.query.ValueExpressionDelegate; /** * @author Christoph Strobl @@ -29,12 +29,12 @@ public class ReactiveElasticsearchStringQuery extends ReactiveRepositoryStringQuery { public ReactiveElasticsearchStringQuery(ReactiveElasticsearchQueryMethod queryMethod, - ReactiveElasticsearchOperations operations, QueryMethodEvaluationContextProvider evaluationContextProvider) { - super(queryMethod, operations, evaluationContextProvider); + ReactiveElasticsearchOperations operations, ValueExpressionDelegate valueExpressionDelegate) { + super(queryMethod, operations, valueExpressionDelegate); } public ReactiveElasticsearchStringQuery(String query, ReactiveElasticsearchQueryMethod queryMethod, - ReactiveElasticsearchOperations operations, QueryMethodEvaluationContextProvider evaluationContextProvider) { - super(query, queryMethod, operations, evaluationContextProvider); + ReactiveElasticsearchOperations operations, ValueExpressionDelegate valueExpressionDelegate) { + super(query, queryMethod, operations, valueExpressionDelegate); } } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactivePartTreeElasticsearchQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactivePartTreeElasticsearchQuery.java index 1b16e2e5a..417106457 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactivePartTreeElasticsearchQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactivePartTreeElasticsearchQuery.java @@ -19,8 +19,8 @@ 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; /** @@ -35,8 +35,9 @@ public class ReactivePartTreeElasticsearchQuery extends AbstractReactiveElastics public ReactivePartTreeElasticsearchQuery(ReactiveElasticsearchQueryMethod queryMethod, ReactiveElasticsearchOperations elasticsearchOperations, - QueryMethodEvaluationContextProvider evaluationContextProvider) { - super(queryMethod, elasticsearchOperations, evaluationContextProvider); + ValueExpressionDelegate valueExpressionDelegate) { + super(queryMethod, elasticsearchOperations, + valueExpressionDelegate.createValueContextProvider(queryMethod.getParameters())); ResultProcessor processor = queryMethod.getResultProcessor(); this.tree = new PartTree(queryMethod.getName(), processor.getReturnedType().getDomainType()); diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositorySearchTemplateQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositorySearchTemplateQuery.java index e6ba93826..12e09eebf 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositorySearchTemplateQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositorySearchTemplateQuery.java @@ -18,11 +18,10 @@ import java.util.LinkedHashMap; import java.util.Map; -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations; import org.springframework.data.elasticsearch.core.query.BaseQuery; import org.springframework.data.elasticsearch.core.query.SearchTemplateQuery; -import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; +import org.springframework.data.repository.query.ValueExpressionDelegate; import org.springframework.util.Assert; /** @@ -37,9 +36,11 @@ public class ReactiveRepositorySearchTemplateQuery extends AbstractReactiveElast private Map params; public ReactiveRepositorySearchTemplateQuery(ReactiveElasticsearchQueryMethod queryMethod, - ReactiveElasticsearchOperations elasticsearchOperations, QueryMethodEvaluationContextProvider evaluationContextProvider, - String id) { - super(queryMethod, elasticsearchOperations, evaluationContextProvider); + ReactiveElasticsearchOperations elasticsearchOperations, + ValueExpressionDelegate valueExpressionDelegate, + String id) { + super(queryMethod, elasticsearchOperations, + valueExpressionDelegate.createValueContextProvider(queryMethod.getParameters())); Assert.hasLength(id, "id must not be null or empty"); this.id = id; } @@ -84,9 +85,9 @@ protected BaseQuery createQuery(ElasticsearchParametersParameterAccessor paramet } }); - return SearchTemplateQuery.builder() - .withId(id) - .withParams(searchTemplateParameters) + return SearchTemplateQuery.builder() + .withId(id) + .withParams(searchTemplateParameters) .build(); } } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositoryStringQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositoryStringQuery.java index f6ea14d35..11e3b81ec 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositoryStringQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositoryStringQuery.java @@ -21,10 +21,12 @@ 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; /** * Was originally named ReactiveElasticsearchStringQuery. + * * @author Christoph Strobl * @author Taylor Ono * @author Haibo Liu @@ -33,23 +35,20 @@ public class ReactiveRepositoryStringQuery extends AbstractReactiveElasticsearchRepositoryQuery { private final String query; - private final QueryMethodEvaluationContextProvider evaluationContextProvider; public ReactiveRepositoryStringQuery(ReactiveElasticsearchQueryMethod queryMethod, - ReactiveElasticsearchOperations operations, QueryMethodEvaluationContextProvider evaluationContextProvider) { + ReactiveElasticsearchOperations operations, ValueExpressionDelegate valueExpressionDelegate) { - this(queryMethod.getAnnotatedQuery(), queryMethod, operations, evaluationContextProvider); + this(queryMethod.getAnnotatedQuery(), queryMethod, operations, valueExpressionDelegate); } public ReactiveRepositoryStringQuery(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 diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositoryPartQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositoryPartQuery.java index 1fe4b60b2..578a30e9c 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositoryPartQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositoryPartQuery.java @@ -20,12 +20,12 @@ 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; /** - * A repository query that is built from the the method name in the repository definition. - * Was originally named ElasticsearchPartQuery. + * A repository query that is built from the the method name in the repository definition. Was originally named + * ElasticsearchPartQuery. * * @author Rizwan Idrees * @author Mohsin Husen @@ -41,8 +41,9 @@ public class RepositoryPartQuery extends AbstractElasticsearchRepositoryQuery { private final MappingContext mappingContext; public RepositoryPartQuery(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(); } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositorySearchTemplateQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositorySearchTemplateQuery.java index e42dacd5e..ddec6e2f0 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositorySearchTemplateQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositorySearchTemplateQuery.java @@ -21,7 +21,7 @@ import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.query.BaseQuery; import org.springframework.data.elasticsearch.core.query.SearchTemplateQuery; -import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; +import org.springframework.data.repository.query.ValueExpressionDelegate; import org.springframework.util.Assert; /** @@ -36,9 +36,10 @@ public class RepositorySearchTemplateQuery extends AbstractElasticsearchReposito private Map params; public RepositorySearchTemplateQuery(ElasticsearchQueryMethod queryMethod, - ElasticsearchOperations elasticsearchOperations, QueryMethodEvaluationContextProvider evaluationContextProvider, + ElasticsearchOperations elasticsearchOperations, ValueExpressionDelegate valueExpressionDelegate, String id) { - super(queryMethod, elasticsearchOperations, evaluationContextProvider); + super(queryMethod, elasticsearchOperations, + valueExpressionDelegate.createValueContextProvider(queryMethod.getParameters())); Assert.hasLength(id, "id must not be null or empty"); this.id = id; } @@ -78,9 +79,9 @@ protected BaseQuery createQuery(ElasticsearchParametersParameterAccessor paramet } }); - return SearchTemplateQuery.builder() - .withId(id) - .withParams(searchTemplateParameters) + return SearchTemplateQuery.builder() + .withId(id) + .withParams(searchTemplateParameters) .build(); } } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositoryStringQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositoryStringQuery.java index e1f53053a..1b768b6ea 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositoryStringQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/RepositoryStringQuery.java @@ -5,12 +5,11 @@ 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; /** - * A repository query that is defined by a String containing the query. - * Was originally named ElasticsearchStringQuery. + * A repository query that is defined by a String containing the query. Was originally named ElasticsearchStringQuery. * * @author Rizwan Idrees * @author Mohsin Husen @@ -20,39 +19,39 @@ * @author Haibo Liu */ public class RepositoryStringQuery extends AbstractElasticsearchRepositoryQuery { - private final String queryString; + private final String queryString; - public RepositoryStringQuery(ElasticsearchQueryMethod queryMethod, ElasticsearchOperations elasticsearchOperations, - String queryString, QueryMethodEvaluationContextProvider evaluationContextProvider) { - super(queryMethod, elasticsearchOperations, evaluationContextProvider); + public RepositoryStringQuery(ElasticsearchQueryMethod queryMethod, ElasticsearchOperations elasticsearchOperations, + 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"); + Assert.notNull(queryString, "Query cannot be empty"); - this.queryString = queryString; - } + this.queryString = queryString; + } - @Override - public boolean isCountQuery() { - return queryMethod.hasCountQueryAnnotation(); - } + @Override + public boolean isCountQuery() { + return queryMethod.hasCountQueryAnnotation(); + } - @Override - protected boolean isDeleteQuery() { - return false; - } + @Override + protected boolean isDeleteQuery() { + return false; + } - @Override - protected boolean isExistsQuery() { - return false; - } + @Override + protected boolean isExistsQuery() { + return false; + } - protected BaseQuery createQuery(ElasticsearchParametersParameterAccessor parameterAccessor) { - ConversionService conversionService = elasticsearchOperations.getElasticsearchConverter().getConversionService(); - var processed = new QueryStringProcessor(queryString, queryMethod, conversionService, evaluationContextProvider) - .createQuery(parameterAccessor); + protected BaseQuery createQuery(ElasticsearchParametersParameterAccessor parameterAccessor) { + ConversionService conversionService = elasticsearchOperations.getElasticsearchConverter().getConversionService(); + var processed = new QueryStringProcessor(queryString, queryMethod, conversionService, evaluationContextProvider) + .createQuery(parameterAccessor); - return new StringQuery(processed) - .addSort(parameterAccessor.getSort()); - } + return new StringQuery(processed) + .addSort(parameterAccessor.getSort()); + } } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchRepositoryFactory.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchRepositoryFactory.java index fb4ccf3ff..0d899bbed 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchRepositoryFactory.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/ElasticsearchRepositoryFactory.java @@ -38,8 +38,8 @@ 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; @@ -97,16 +97,16 @@ private static boolean isQueryDslRepository(Class repositoryInterface) { @Override protected Optional 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; } /* @@ -124,16 +124,16 @@ public RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, if (namedQueries.hasQuery(namedQueryName)) { String namedQuery = namedQueries.getQuery(namedQueryName); return new RepositoryStringQuery(queryMethod, elasticsearchOperations, namedQuery, - evaluationContextProvider); + valueExpressionDelegate); } else if (queryMethod.hasAnnotatedQuery()) { return new RepositoryStringQuery(queryMethod, elasticsearchOperations, queryMethod.getAnnotatedQuery(), - evaluationContextProvider); + valueExpressionDelegate); } else if (queryMethod.hasAnnotatedSearchTemplateQuery()) { var searchTemplateQuery = queryMethod.getAnnotatedSearchTemplateQuery(); - return new RepositorySearchTemplateQuery(queryMethod, elasticsearchOperations, evaluationContextProvider, + return new RepositorySearchTemplateQuery(queryMethod, elasticsearchOperations, valueExpressionDelegate, searchTemplateQuery.id()); } - return new RepositoryPartQuery(queryMethod, elasticsearchOperations, evaluationContextProvider); + return new RepositoryPartQuery(queryMethod, elasticsearchOperations, valueExpressionDelegate); } } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/QueryStringProcessor.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/QueryStringProcessor.java index bf0080991..b8cfa930b 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/QueryStringProcessor.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/QueryStringProcessor.java @@ -18,6 +18,7 @@ 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 +35,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"); diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/ReactiveElasticsearchRepositoryFactory.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/ReactiveElasticsearchRepositoryFactory.java index a4808c78f..7e2607e6e 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/ReactiveElasticsearchRepositoryFactory.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/ReactiveElasticsearchRepositoryFactory.java @@ -26,7 +26,6 @@ import org.springframework.data.elasticsearch.repository.query.ReactivePartTreeElasticsearchQuery; import org.springframework.data.elasticsearch.repository.query.ReactiveRepositorySearchTemplateQuery; import org.springframework.data.elasticsearch.repository.query.ReactiveRepositoryStringQuery; -import org.springframework.data.elasticsearch.repository.query.RepositorySearchTemplateQuery; import org.springframework.data.elasticsearch.repository.support.querybyexample.ReactiveQueryByExampleElasticsearchExecutor; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.projection.ProjectionFactory; @@ -38,9 +37,9 @@ 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; @@ -94,14 +93,10 @@ protected Object getTargetRepository(RepositoryInformation information) { return getTargetRepositoryViaReflection(information, entityInformation, operations); } - /* - * (non-Javadoc) - * @see org.springframework.data.repository.core.support.RepositoryFactorySupport#getQueryLookupStrategy(org.springframework.data.repository.query.QueryLookupStrategy.Key, org.springframework.data.repository.query.EvaluationContextProvider) - */ @Override protected Optional getQueryLookupStrategy(@Nullable Key key, - QueryMethodEvaluationContextProvider evaluationContextProvider) { - return Optional.of(new ElasticsearchQueryLookupStrategy(operations, evaluationContextProvider, mappingContext)); + ValueExpressionDelegate valueExpressionDelegate) { + return Optional.of(new ElasticsearchQueryLookupStrategy(operations, valueExpressionDelegate, mappingContext)); } /* @@ -132,19 +127,19 @@ protected RepositoryMetadata getRepositoryMetadata(Class repositoryInterface) private static class ElasticsearchQueryLookupStrategy implements QueryLookupStrategy { private final ReactiveElasticsearchOperations operations; - private final QueryMethodEvaluationContextProvider evaluationContextProvider; + private final ValueExpressionDelegate valueExpressionDelegate; private final MappingContext, ElasticsearchPersistentProperty> mappingContext; public ElasticsearchQueryLookupStrategy(ReactiveElasticsearchOperations operations, - QueryMethodEvaluationContextProvider evaluationContextProvider, + ValueExpressionDelegate valueExpressionDelegate, MappingContext, ElasticsearchPersistentProperty> mappingContext) { Assert.notNull(operations, "operations must not be null"); - Assert.notNull(evaluationContextProvider, "evaluationContextProvider must not be null"); + Assert.notNull(valueExpressionDelegate, "evaluationContextProvider must not be null"); Assert.notNull(mappingContext, "mappingContext must not be null"); this.operations = operations; - this.evaluationContextProvider = evaluationContextProvider; + this.valueExpressionDelegate = valueExpressionDelegate; this.mappingContext = mappingContext; } @@ -164,15 +159,15 @@ public RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, String namedQuery = namedQueries.getQuery(namedQueryName); return new ReactiveRepositoryStringQuery(namedQuery, queryMethod, operations, - evaluationContextProvider); + valueExpressionDelegate); } else if (queryMethod.hasAnnotatedQuery()) { - return new ReactiveRepositoryStringQuery(queryMethod, operations, evaluationContextProvider); + return new ReactiveRepositoryStringQuery(queryMethod, operations, valueExpressionDelegate); } else if (queryMethod.hasAnnotatedSearchTemplateQuery()) { var searchTemplateQuery = queryMethod.getAnnotatedSearchTemplateQuery(); - return new ReactiveRepositorySearchTemplateQuery(queryMethod, operations, evaluationContextProvider, + return new ReactiveRepositorySearchTemplateQuery(queryMethod, operations, valueExpressionDelegate, searchTemplateQuery.id()); } else { - return new ReactivePartTreeElasticsearchQuery(queryMethod, operations, evaluationContextProvider); + return new ReactivePartTreeElasticsearchQuery(queryMethod, operations, valueExpressionDelegate); } } } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/spel/QueryStringSpELEvaluator.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/spel/QueryStringSpELEvaluator.java index 3d691d313..e40fa11dc 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/spel/QueryStringSpELEvaluator.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/spel/QueryStringSpELEvaluator.java @@ -24,8 +24,8 @@ 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 String evaluate() { 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); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/query/RepositoryPartQueryIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/query/RepositoryPartQueryIntegrationTests.java index 5a55d9c86..65485868f 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/query/RepositoryPartQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/query/RepositoryPartQueryIntegrationTests.java @@ -36,6 +36,7 @@ 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 +648,7 @@ private String getQueryString(String methodName, Class[] parameterClasses, Ob new DefaultRepositoryMetadata(SampleRepository.class), new SpelAwareProxyProjectionFactory(), operations.getElasticsearchConverter().getMappingContext()); RepositoryPartQuery partQuery = new RepositoryPartQuery(queryMethod, operations, - QueryMethodEvaluationContextProvider.DEFAULT); + ValueExpressionDelegate.create()); Query query = partQuery.createQuery(parameters); return buildQueryString(query, Book.class); } diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositorySearchTemplateQueryUnitTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositorySearchTemplateQueryUnitTests.java index af144dbc3..9572e8e3b 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositorySearchTemplateQueryUnitTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositorySearchTemplateQueryUnitTests.java @@ -28,7 +28,7 @@ import org.springframework.data.elasticsearch.core.SearchHits; import org.springframework.data.elasticsearch.core.query.Query; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; -import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; +import org.springframework.data.repository.query.ValueExpressionDelegate; import org.springframework.lang.Nullable; public class ReactiveRepositorySearchTemplateQueryUnitTests extends ReactiveRepositoryQueryUnitTestsBase { @@ -71,7 +71,7 @@ private Query createQuery(String methodName, Object... args) throws NoSuchMethod } private ReactiveRepositorySearchTemplateQuery queryForMethod(ReactiveElasticsearchQueryMethod queryMethod) { - return new ReactiveRepositorySearchTemplateQuery(queryMethod, operations, QueryMethodEvaluationContextProvider.DEFAULT, + return new ReactiveRepositorySearchTemplateQuery(queryMethod, operations, ValueExpressionDelegate.create(), queryMethod.getAnnotatedSearchTemplateQuery().id()); } // endregion diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositoryStringQueryUnitTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositoryStringQueryUnitTests.java index 11d7d6939..536dde273 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositoryStringQueryUnitTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveRepositoryStringQueryUnitTests.java @@ -17,6 +17,7 @@ import static org.assertj.core.api.Assertions.*; +import org.springframework.data.repository.query.ValueExpressionDelegate; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -419,7 +420,7 @@ private ReactiveRepositoryStringQuery createQueryForMethod(String name, Class private ReactiveRepositoryStringQuery queryForMethod(ReactiveElasticsearchQueryMethod queryMethod) { return new ReactiveRepositoryStringQuery(queryMethod, operations, - QueryMethodEvaluationContextProvider.DEFAULT); + ValueExpressionDelegate.create()); } private interface SampleRepository extends Repository { diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/query/RepositorySearchTemplateQueryUnitTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/query/RepositorySearchTemplateQueryUnitTests.java index 1b0f62109..b3c346bf2 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/query/RepositorySearchTemplateQueryUnitTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/query/RepositorySearchTemplateQueryUnitTests.java @@ -28,7 +28,7 @@ import org.springframework.data.elasticsearch.core.SearchHits; import org.springframework.data.elasticsearch.core.query.Query; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; -import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; +import org.springframework.data.repository.query.ValueExpressionDelegate; import org.springframework.lang.Nullable; public class RepositorySearchTemplateQueryUnitTests extends RepositoryQueryUnitTestsBase { @@ -71,7 +71,7 @@ private Query createQuery(String methodName, Object... args) throws NoSuchMethod } private RepositorySearchTemplateQuery queryForMethod(ElasticsearchQueryMethod queryMethod) { - return new RepositorySearchTemplateQuery(queryMethod, operations, QueryMethodEvaluationContextProvider.DEFAULT, + return new RepositorySearchTemplateQuery(queryMethod, operations, ValueExpressionDelegate.create(), queryMethod.getAnnotatedSearchTemplateQuery().id()); } // endregion diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/query/RepositoryStringQueryUnitTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/query/RepositoryStringQueryUnitTests.java index eebc20a04..68c36d7ca 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/query/RepositoryStringQueryUnitTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/query/RepositoryStringQueryUnitTests.java @@ -43,7 +43,7 @@ import org.springframework.data.elasticsearch.core.query.StringQuery; import org.springframework.data.elasticsearch.repositories.custommethod.QueryParameter; import org.springframework.data.repository.Repository; -import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; +import org.springframework.data.repository.query.ValueExpressionDelegate; import org.springframework.lang.Nullable; /** @@ -407,7 +407,7 @@ void shouldUseConverterOnParameters() throws NoSuchMethodException { private RepositoryStringQuery queryForMethod(ElasticsearchQueryMethod queryMethod) { return new RepositoryStringQuery(queryMethod, operations, queryMethod.getAnnotatedQuery(), - QueryMethodEvaluationContextProvider.DEFAULT); + ValueExpressionDelegate.create()); } private interface SampleRepository extends Repository {