17
17
18
18
import reactor .core .publisher .Mono ;
19
19
20
+ import org .springframework .core .env .StandardEnvironment ;
20
21
import org .springframework .data .cassandra .core .ReactiveCassandraOperations ;
21
22
import org .springframework .data .cassandra .repository .Query ;
22
- import org .springframework .data .mapping .model .SpELExpressionEvaluator ;
23
+ import org .springframework .data .expression .ReactiveValueEvaluationContextProvider ;
24
+ import org .springframework .data .expression .ValueEvaluationContextProvider ;
25
+ import org .springframework .data .expression .ValueExpressionParser ;
26
+ import org .springframework .data .mapping .model .ValueExpressionEvaluator ;
23
27
import org .springframework .data .repository .query .QueryMethodEvaluationContextProvider ;
28
+ import org .springframework .data .repository .query .QueryMethodValueEvaluationContextAccessor ;
24
29
import org .springframework .data .repository .query .ReactiveQueryMethodEvaluationContextProvider ;
30
+ import org .springframework .data .repository .query .ValueExpressionDelegate ;
25
31
import org .springframework .data .spel .ExpressionDependencies ;
26
32
import org .springframework .expression .ExpressionParser ;
27
33
import org .springframework .expression .spel .standard .SpelExpressionParser ;
@@ -51,8 +57,9 @@ public class ReactiveStringBasedCassandraQuery extends AbstractReactiveCassandra
51
57
52
58
private final boolean isExistsQuery ;
53
59
54
- private final ExpressionParser expressionParser ;
55
- private final ReactiveQueryMethodEvaluationContextProvider evaluationContextProvider ;
60
+ private final ValueExpressionDelegate delegate ;
61
+
62
+ private final ReactiveValueEvaluationContextProvider valueEvaluationContextProvider ;
56
63
57
64
/**
58
65
* Create a new {@link ReactiveStringBasedCassandraQuery} for the given {@link CassandraQueryMethod},
@@ -66,7 +73,9 @@ public class ReactiveStringBasedCassandraQuery extends AbstractReactiveCassandra
66
73
* {@link org.springframework.expression.spel.support.StandardEvaluationContext}.
67
74
* @see org.springframework.data.cassandra.repository.query.ReactiveCassandraQueryMethod
68
75
* @see org.springframework.data.cassandra.core.ReactiveCassandraOperations
76
+ * @deprecated since 4.4, use the constructors accepting {@link ValueExpressionDelegate} instead.
69
77
*/
78
+ @ Deprecated (since = "4.4" )
70
79
public ReactiveStringBasedCassandraQuery (ReactiveCassandraQueryMethod queryMethod ,
71
80
ReactiveCassandraOperations operations , ExpressionParser expressionParser ,
72
81
ReactiveQueryMethodEvaluationContextProvider evaluationContextProvider ) {
@@ -86,19 +95,59 @@ public ReactiveStringBasedCassandraQuery(ReactiveCassandraQueryMethod queryMetho
86
95
* {@link org.springframework.expression.spel.support.StandardEvaluationContext}.
87
96
* @see org.springframework.data.cassandra.repository.query.ReactiveCassandraQueryMethod
88
97
* @see org.springframework.data.cassandra.core.ReactiveCassandraOperations
98
+ * @deprecated since 4.4, use the constructors accepting {@link ValueExpressionDelegate} instead.
89
99
*/
100
+ @ Deprecated (since = "4.4" )
90
101
public ReactiveStringBasedCassandraQuery (String query , ReactiveCassandraQueryMethod method ,
91
102
ReactiveCassandraOperations operations , ExpressionParser expressionParser ,
92
103
ReactiveQueryMethodEvaluationContextProvider evaluationContextProvider ) {
93
104
105
+ this (query , method , operations , new ValueExpressionDelegate (new QueryMethodValueEvaluationContextAccessor (new StandardEnvironment (), evaluationContextProvider .getEvaluationContextProvider ()), ValueExpressionParser .create (() -> expressionParser )));
106
+ }
107
+
108
+ /**
109
+ * Create a new {@link ReactiveStringBasedCassandraQuery} for the given {@link CassandraQueryMethod},
110
+ * {@link ReactiveCassandraOperations}, {@link ValueExpressionDelegate}
111
+ *
112
+ * @param queryMethod {@link ReactiveCassandraQueryMethod} on which this query is based.
113
+ * @param operations {@link ReactiveCassandraOperations} used to perform data access in Cassandra.
114
+ * @param delegate {@link ValueExpressionDelegate} used to parse expressions in the query.
115
+ * @see org.springframework.data.cassandra.repository.query.ReactiveCassandraQueryMethod
116
+ * @see org.springframework.data.cassandra.core.ReactiveCassandraOperations
117
+ * @since 4.4
118
+ */
119
+ public ReactiveStringBasedCassandraQuery (ReactiveCassandraQueryMethod queryMethod ,
120
+ ReactiveCassandraOperations operations , ValueExpressionDelegate delegate ) {
121
+
122
+ this (queryMethod .getRequiredAnnotatedQuery (), queryMethod , operations , delegate );
123
+ }
124
+
125
+ /**
126
+ * Create a new {@link ReactiveStringBasedCassandraQuery} for the given {@code query}, {@link CassandraQueryMethod},
127
+ * {@link ReactiveCassandraOperations}, {@link ValueExpressionDelegate}
128
+ *
129
+ * @param method {@link ReactiveCassandraQueryMethod} on which this query is based.
130
+ * @param operations {@link ReactiveCassandraOperations} used to perform data access in Cassandra.
131
+ * @param delegate {@link SpelExpressionParser} used to parse expressions in the query.
132
+ * @see org.springframework.data.cassandra.repository.query.ReactiveCassandraQueryMethod
133
+ * @see org.springframework.data.cassandra.core.ReactiveCassandraOperations
134
+ * @since 4.4
135
+ */
136
+ public ReactiveStringBasedCassandraQuery (String query , ReactiveCassandraQueryMethod method ,
137
+ ReactiveCassandraOperations operations , ValueExpressionDelegate delegate ) {
138
+
94
139
super (method , operations );
95
140
96
141
Assert .hasText (query , "Query must not be empty" );
97
142
98
- this .expressionParser = expressionParser ;
99
- this .evaluationContextProvider = evaluationContextProvider ;
143
+ this .delegate = delegate ;
100
144
101
- this .stringBasedQuery = new StringBasedQuery (query , method .getParameters (), expressionParser );
145
+ this .stringBasedQuery = new StringBasedQuery (query , method .getParameters (), delegate );
146
+
147
+ ValueEvaluationContextProvider valueContextProvider = delegate .createValueContextProvider (
148
+ method .getParameters ());
149
+ Assert .isInstanceOf (ReactiveValueEvaluationContextProvider .class , valueContextProvider , "ValueEvaluationContextProvider must be reactive" );
150
+ this .valueEvaluationContextProvider = (ReactiveValueEvaluationContextProvider ) valueContextProvider ;
102
151
103
152
if (method .hasAnnotatedQuery ()) {
104
153
@@ -126,10 +175,9 @@ public Mono<SimpleStatement> createQuery(CassandraParameterAccessor parameterAcc
126
175
StringBasedQuery query = getStringBasedQuery ();
127
176
ConvertingParameterAccessor parameterAccessorToUse = new ConvertingParameterAccessor (
128
177
getReactiveCassandraOperations ().getConverter (), parameterAccessor );
129
- Mono <SpELExpressionEvaluator > spelEvaluator = getSpelEvaluatorFor (query .getExpressionDependencies (),
130
- parameterAccessorToUse );
131
178
132
- return spelEvaluator .map (it -> getQueryStatementCreator ().select (query , parameterAccessorToUse , it ));
179
+ return getValueExpressionEvaluatorLater (query .getExpressionDependencies (), parameterAccessor )
180
+ .map (it -> getQueryStatementCreator ().select (query , parameterAccessorToUse , it ));
133
181
}
134
182
135
183
@ Override
@@ -152,21 +200,9 @@ protected boolean isModifyingQuery() {
152
200
return false ;
153
201
}
154
202
155
- /**
156
- * Obtain a {@link Mono publisher} emitting the {@link SpELExpressionEvaluator} suitable to evaluate expressions
157
- * backed by the given dependencies.
158
- *
159
- * @param dependencies must not be {@literal null}.
160
- * @param accessor must not be {@literal null}.
161
- * @return a {@link Mono} emitting the {@link SpELExpressionEvaluator} when ready.
162
- */
163
- private Mono <SpELExpressionEvaluator > getSpelEvaluatorFor (ExpressionDependencies dependencies ,
203
+ private Mono <ValueExpressionEvaluator > getValueExpressionEvaluatorLater (ExpressionDependencies dependencies ,
164
204
CassandraParameterAccessor accessor ) {
165
-
166
- return evaluationContextProvider
167
- .getEvaluationContextLater (getQueryMethod ().getParameters (), accessor .getValues (), dependencies )
168
- .map (evaluationContext -> (SpELExpressionEvaluator ) new DefaultSpELExpressionEvaluator (expressionParser ,
169
- evaluationContext ))
170
- .defaultIfEmpty (DefaultSpELExpressionEvaluator .unsupported ());
205
+ return valueEvaluationContextProvider .getEvaluationContextLater (accessor .getValues (), dependencies )
206
+ .map (evaluationContext -> new ValueExpressionDelegateValueExpressionEvaluator (delegate , valueExpression -> evaluationContext ));
171
207
}
172
208
}
0 commit comments