Skip to content

Commit 34da375

Browse files
committed
Polishing.
Remove unused DefaultSpELExpressionEvaluator. Use caching variant of ValueExpressionDelegate. Remove unused RepositoryFactory methods. Simplify ValueExpressionDelegateValueExpressionEvaluator to ContextualValueExpressionEvaluator. See #1522 Original pull request: #1523
1 parent 9ebd3db commit 34da375

9 files changed

+50
-156
lines changed
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,30 @@
1515
*/
1616
package org.springframework.data.cassandra.repository.query;
1717

18-
import java.util.function.Function;
19-
2018
import org.springframework.data.expression.ValueEvaluationContext;
2119
import org.springframework.data.expression.ValueExpression;
20+
import org.springframework.data.expression.ValueExpressionParser;
2221
import org.springframework.data.mapping.model.ValueExpressionEvaluator;
23-
import org.springframework.data.repository.query.ValueExpressionDelegate;
2422

25-
class ValueExpressionDelegateValueExpressionEvaluator implements ValueExpressionEvaluator {
23+
/**
24+
* @author Marcin Grzejszczak
25+
* @author Mark Paluch
26+
*/
27+
class ContextualValueExpressionEvaluator implements ValueExpressionEvaluator {
2628

27-
private final ValueExpressionDelegate delegate;
28-
private final Function<ValueExpression, ValueEvaluationContext> expressionToContext;
29+
private final ValueExpressionParser parser;
2930

30-
ValueExpressionDelegateValueExpressionEvaluator(ValueExpressionDelegate delegate, Function<ValueExpression, ValueEvaluationContext> expressionToContext) {
31-
this.delegate = delegate;
32-
this.expressionToContext = expressionToContext;
31+
public ContextualValueExpressionEvaluator(ValueExpressionParser parser, ValueEvaluationContext evaluationContext) {
32+
this.parser = parser;
33+
this.evaluationContext = evaluationContext;
3334
}
3435

36+
private final ValueEvaluationContext evaluationContext;
37+
3538
@SuppressWarnings("unchecked")
3639
@Override
3740
public <T> T evaluate(String expressionString) {
38-
ValueExpression expression = delegate.parse(expressionString);
39-
return (T) expression.evaluate(expressionToContext.apply(expression));
41+
ValueExpression expression = parser.parse(expressionString);
42+
return (T) expression.evaluate(evaluationContext);
4043
}
4144
}

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/DefaultSpELExpressionEvaluator.java

-68
This file was deleted.

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/ReactiveStringBasedCassandraQuery.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
* index-based and expression parameters that are resolved during query execution.
4444
*
4545
* @author Mark Paluch
46+
* @author Marcin Grzejszczak
4647
* @see org.springframework.data.cassandra.repository.Query
4748
* @see org.springframework.data.cassandra.repository.query.AbstractReactiveCassandraQuery
4849
* @since 2.0
@@ -203,6 +204,6 @@ protected boolean isModifyingQuery() {
203204
private Mono<ValueExpressionEvaluator> getValueExpressionEvaluatorLater(ExpressionDependencies dependencies,
204205
CassandraParameterAccessor accessor) {
205206
return valueEvaluationContextProvider.getEvaluationContextLater(accessor.getValues(), dependencies)
206-
.map(evaluationContext -> new ValueExpressionDelegateValueExpressionEvaluator(delegate, valueExpression -> evaluationContext));
207+
.map(evaluationContext -> new ContextualValueExpressionEvaluator(delegate, evaluationContext));
207208
}
208209
}

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/StringBasedCassandraQuery.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
*
3838
* @author Matthew Adams
3939
* @author Mark Paluch
40+
* @author Marcin Grzejszczak
4041
* @see org.springframework.data.cassandra.repository.Query
4142
* @see org.springframework.data.cassandra.repository.query.AbstractCassandraQuery
4243
*/
@@ -159,7 +160,8 @@ public SimpleStatement createQuery(CassandraParameterAccessor parameterAccessor)
159160
ValueEvaluationContext evaluationContext = valueExpressionDelegate.createValueContextProvider(
160161
getQueryMethod().getParameters()).getEvaluationContext(parameterAccessorToUse.getValues(), query.getExpressionDependencies());
161162

162-
return getQueryStatementCreator().select(query, parameterAccessorToUse, new ValueExpressionDelegateValueExpressionEvaluator(valueExpressionDelegate, valueExpression -> evaluationContext));
163+
return getQueryStatementCreator().select(query, parameterAccessorToUse,
164+
new ContextualValueExpressionEvaluator(valueExpressionDelegate, evaluationContext));
163165
}
164166

165167
@Override

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/StringBasedQuery.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.ArrayList;
1919
import java.util.List;
20+
import java.util.Map;
2021
import java.util.Set;
2122
import java.util.TreeMap;
2223
import java.util.regex.Matcher;
@@ -36,6 +37,7 @@
3637
* String-based Query abstracting a CQL query with parameter bindings.
3738
*
3839
* @author Mark Paluch
40+
* @author Marcin Grzejszczak
3941
* @since 2.0
4042
*/
4143
class StringBasedQuery {
@@ -270,9 +272,9 @@ private static boolean isValueExpression(Matcher matcher) {
270272
}
271273

272274
@Nullable
273-
private static Matcher findNextBindingOrExpression(String input, int position) {
275+
private static Matcher findNextBindingOrExpression(String input, int startPosition) {
274276

275-
List<Matcher> matchers = new ArrayList<>();
277+
List<Matcher> matchers = new ArrayList<>(6);
276278

277279
matchers.add(INDEX_PARAMETER_BINDING_PATTERN.matcher(input));
278280
matchers.add(NAMED_PARAMETER_BINDING_PATTERN.matcher(input));
@@ -281,10 +283,10 @@ private static Matcher findNextBindingOrExpression(String input, int position) {
281283
matchers.add(INDEX_BASED_PROPERTY_PLACEHOLDER_PATTERN.matcher(input));
282284
matchers.add(NAME_BASED_PROPERTY_PLACEHOLDER_PATTERN.matcher(input));
283285

284-
TreeMap<Integer, Matcher> matcherMap = new TreeMap<>();
286+
Map<Integer, Matcher> matcherMap = new TreeMap<>();
285287

286288
for (Matcher matcher : matchers) {
287-
if (matcher.find(position)) {
289+
if (matcher.find(startPosition)) {
288290
matcherMap.put(matcher.start(), matcher);
289291
}
290292
}

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/CassandraRepositoryFactory.java

+10-31
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.util.Optional;
2020

2121
import org.springframework.beans.factory.BeanFactory;
22-
import org.springframework.core.env.StandardEnvironment;
2322
import org.springframework.data.cassandra.core.CassandraOperations;
2423
import org.springframework.data.cassandra.core.mapping.CassandraPersistentEntity;
2524
import org.springframework.data.cassandra.core.mapping.CassandraPersistentProperty;
@@ -28,21 +27,17 @@
2827
import org.springframework.data.cassandra.repository.query.CassandraQueryMethod;
2928
import org.springframework.data.cassandra.repository.query.PartTreeCassandraQuery;
3029
import org.springframework.data.cassandra.repository.query.StringBasedCassandraQuery;
31-
import org.springframework.data.expression.ValueExpressionParser;
3230
import org.springframework.data.mapping.context.MappingContext;
3331
import org.springframework.data.projection.ProjectionFactory;
3432
import org.springframework.data.repository.core.NamedQueries;
3533
import org.springframework.data.repository.core.RepositoryInformation;
3634
import org.springframework.data.repository.core.RepositoryMetadata;
3735
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
36+
import org.springframework.data.repository.query.CachingValueExpressionDelegate;
3837
import org.springframework.data.repository.query.QueryLookupStrategy;
3938
import org.springframework.data.repository.query.QueryLookupStrategy.Key;
40-
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
41-
import org.springframework.data.repository.query.QueryMethodValueEvaluationContextAccessor;
4239
import org.springframework.data.repository.query.RepositoryQuery;
4340
import org.springframework.data.repository.query.ValueExpressionDelegate;
44-
import org.springframework.expression.spel.standard.SpelExpressionParser;
45-
import org.springframework.lang.Nullable;
4641
import org.springframework.util.Assert;
4742

4843
/**
@@ -56,8 +51,6 @@
5651
*/
5752
public class CassandraRepositoryFactory extends RepositoryFactorySupport {
5853

59-
private static final ValueExpressionParser EXPRESSION_PARSER = ValueExpressionParser.create(SpelExpressionParser::new);
60-
6154
private final MappingContext<? extends CassandraPersistentEntity<?>, CassandraPersistentProperty> mappingContext;
6255

6356
private final CassandraOperations operations;
@@ -102,33 +95,19 @@ public <T, ID> CassandraEntityInformation<T, ID> getEntityInformation(Class<T> d
10295
return new MappingCassandraEntityInformation<>((CassandraPersistentEntity<T>) entity, operations.getConverter());
10396
}
10497

105-
@Override protected Optional<QueryLookupStrategy> getQueryLookupStrategy(Key key,
106-
ValueExpressionDelegate valueExpressionDelegate) {
107-
return Optional.of(new CassandraQueryLookupStrategy(operations, valueExpressionDelegate, mappingContext));
108-
}
109-
11098
@Override
111-
protected Optional<QueryLookupStrategy> getQueryLookupStrategy(@Nullable Key key,
112-
QueryMethodEvaluationContextProvider evaluationContextProvider) {
113-
return Optional.of(new CassandraQueryLookupStrategy(operations, new ValueExpressionDelegate(new QueryMethodValueEvaluationContextAccessor(new StandardEnvironment(), evaluationContextProvider.getEvaluationContextProvider()), EXPRESSION_PARSER), mappingContext));
99+
protected Optional<QueryLookupStrategy> getQueryLookupStrategy(Key key,
100+
ValueExpressionDelegate valueExpressionDelegate) {
101+
return Optional.of(new CassandraQueryLookupStrategy(operations,
102+
new CachingValueExpressionDelegate(valueExpressionDelegate), mappingContext));
114103
}
115104

116-
private static class CassandraQueryLookupStrategy implements QueryLookupStrategy {
117105

118-
private final ValueExpressionDelegate valueExpressionDelegate;
119-
120-
private final MappingContext<? extends CassandraPersistentEntity<?>, CassandraPersistentProperty> mappingContext;
121-
122-
private final CassandraOperations operations;
123-
124-
CassandraQueryLookupStrategy(CassandraOperations operations,
125-
ValueExpressionDelegate valueExpressionDelegate,
126-
MappingContext<? extends CassandraPersistentEntity<?>, CassandraPersistentProperty> mappingContext) {
127-
128-
this.operations = operations;
129-
this.valueExpressionDelegate = valueExpressionDelegate;
130-
this.mappingContext = mappingContext;
131-
}
106+
private record CassandraQueryLookupStrategy(CassandraOperations operations,
107+
ValueExpressionDelegate valueExpressionDelegate,
108+
MappingContext<? extends CassandraPersistentEntity<?>, CassandraPersistentProperty> mappingContext)
109+
implements
110+
QueryLookupStrategy {
132111

133112
@Override
134113
public RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, ProjectionFactory factory,

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/ReactiveCassandraRepositoryFactory.java

+10-35
Original file line numberDiff line numberDiff line change
@@ -19,42 +19,35 @@
1919
import java.util.Optional;
2020

2121
import org.springframework.beans.factory.BeanFactory;
22-
import org.springframework.core.env.StandardEnvironment;
2322
import org.springframework.data.cassandra.core.ReactiveCassandraOperations;
2423
import org.springframework.data.cassandra.core.mapping.CassandraPersistentEntity;
2524
import org.springframework.data.cassandra.core.mapping.CassandraPersistentProperty;
2625
import org.springframework.data.cassandra.repository.query.CassandraEntityInformation;
2726
import org.springframework.data.cassandra.repository.query.ReactiveCassandraQueryMethod;
2827
import org.springframework.data.cassandra.repository.query.ReactivePartTreeCassandraQuery;
2928
import org.springframework.data.cassandra.repository.query.ReactiveStringBasedCassandraQuery;
30-
import org.springframework.data.expression.ValueExpressionParser;
3129
import org.springframework.data.mapping.context.MappingContext;
3230
import org.springframework.data.projection.ProjectionFactory;
3331
import org.springframework.data.repository.core.NamedQueries;
3432
import org.springframework.data.repository.core.RepositoryInformation;
3533
import org.springframework.data.repository.core.RepositoryMetadata;
3634
import org.springframework.data.repository.core.support.ReactiveRepositoryFactorySupport;
35+
import org.springframework.data.repository.query.CachingValueExpressionDelegate;
3736
import org.springframework.data.repository.query.QueryLookupStrategy;
3837
import org.springframework.data.repository.query.QueryLookupStrategy.Key;
39-
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
40-
import org.springframework.data.repository.query.QueryMethodValueEvaluationContextAccessor;
41-
import org.springframework.data.repository.query.ReactiveQueryMethodEvaluationContextProvider;
4238
import org.springframework.data.repository.query.RepositoryQuery;
4339
import org.springframework.data.repository.query.ValueExpressionDelegate;
44-
import org.springframework.expression.spel.standard.SpelExpressionParser;
45-
import org.springframework.lang.Nullable;
4640
import org.springframework.util.Assert;
4741

4842
/**
4943
* Factory to create {@link org.springframework.data.cassandra.repository.ReactiveCassandraRepository} instances.
5044
*
5145
* @author Mark Paluch
46+
* @author Marcin Grzejszczak
5247
* @since 2.0
5348
*/
5449
public class ReactiveCassandraRepositoryFactory extends ReactiveRepositoryFactorySupport {
5550

56-
private static final ValueExpressionParser EXPRESSION_PARSER = ValueExpressionParser.create(SpelExpressionParser::new);
57-
5851
private final ReactiveCassandraOperations operations;
5952

6053
private final MappingContext<? extends CassandraPersistentEntity<?>, ? extends CassandraPersistentProperty> mappingContext;
@@ -70,8 +63,6 @@ public ReactiveCassandraRepositoryFactory(ReactiveCassandraOperations cassandraO
7063

7164
this.operations = cassandraOperations;
7265
this.mappingContext = cassandraOperations.getConverter().getMappingContext();
73-
74-
setEvaluationContextProvider(ReactiveQueryMethodEvaluationContextProvider.DEFAULT);
7566
}
7667

7768
@Override
@@ -92,15 +83,11 @@ protected Object getTargetRepository(RepositoryInformation information) {
9283
return getTargetRepositoryViaReflection(information, entityInformation, operations);
9384
}
9485

95-
@Override protected Optional<QueryLookupStrategy> getQueryLookupStrategy(Key key,
96-
ValueExpressionDelegate valueExpressionDelegate) {
97-
return Optional.of(new CassandraQueryLookupStrategy(operations, valueExpressionDelegate, mappingContext));
98-
}
99-
10086
@Override
101-
protected Optional<QueryLookupStrategy> getQueryLookupStrategy(@Nullable Key key,
102-
QueryMethodEvaluationContextProvider evaluationContextProvider) {
103-
return Optional.of(new CassandraQueryLookupStrategy(operations, new ValueExpressionDelegate(new QueryMethodValueEvaluationContextAccessor(new StandardEnvironment(), evaluationContextProvider.getEvaluationContextProvider()), EXPRESSION_PARSER), mappingContext));
87+
protected Optional<QueryLookupStrategy> getQueryLookupStrategy(Key key,
88+
ValueExpressionDelegate valueExpressionDelegate) {
89+
return Optional.of(new CassandraQueryLookupStrategy(operations,
90+
new CachingValueExpressionDelegate(valueExpressionDelegate), mappingContext));
10491
}
10592

10693
@SuppressWarnings("unchecked")
@@ -117,22 +104,10 @@ public <T, ID> CassandraEntityInformation<T, ID> getEntityInformation(Class<T> d
117104
*
118105
* @author Mark Paluch
119106
*/
120-
private static class CassandraQueryLookupStrategy implements QueryLookupStrategy {
121-
122-
private final ValueExpressionDelegate delegate;
123-
124-
private final ReactiveCassandraOperations operations;
125-
126-
private final MappingContext<? extends CassandraPersistentEntity<?>, ? extends CassandraPersistentProperty> mappingContext;
127-
128-
CassandraQueryLookupStrategy(ReactiveCassandraOperations operations,
129-
ValueExpressionDelegate delegate,
130-
MappingContext<? extends CassandraPersistentEntity<?>, ? extends CassandraPersistentProperty> mappingContext) {
131-
132-
this.delegate = delegate;
133-
this.operations = operations;
134-
this.mappingContext = mappingContext;
135-
}
107+
private record CassandraQueryLookupStrategy(ReactiveCassandraOperations operations, ValueExpressionDelegate delegate,
108+
MappingContext<? extends CassandraPersistentEntity<?>, ? extends CassandraPersistentProperty> mappingContext)
109+
implements
110+
QueryLookupStrategy {
136111

137112
@Override
138113
public RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, ProjectionFactory factory,

0 commit comments

Comments
 (0)