1717
1818import reactor .core .publisher .Mono ;
1919
20+ import org .springframework .core .env .StandardEnvironment ;
2021import org .springframework .data .cassandra .core .ReactiveCassandraOperations ;
2122import 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 ;
2327import org .springframework .data .repository .query .QueryMethodEvaluationContextProvider ;
28+ import org .springframework .data .repository .query .QueryMethodValueEvaluationContextAccessor ;
2429import org .springframework .data .repository .query .ReactiveQueryMethodEvaluationContextProvider ;
30+ import org .springframework .data .repository .query .ValueExpressionDelegate ;
2531import org .springframework .data .spel .ExpressionDependencies ;
2632import org .springframework .expression .ExpressionParser ;
2733import org .springframework .expression .spel .standard .SpelExpressionParser ;
@@ -51,8 +57,9 @@ public class ReactiveStringBasedCassandraQuery extends AbstractReactiveCassandra
5157
5258 private final boolean isExistsQuery ;
5359
54- private final ExpressionParser expressionParser ;
55- private final ReactiveQueryMethodEvaluationContextProvider evaluationContextProvider ;
60+ private final ValueExpressionDelegate delegate ;
61+
62+ private final ReactiveValueEvaluationContextProvider valueEvaluationContextProvider ;
5663
5764 /**
5865 * Create a new {@link ReactiveStringBasedCassandraQuery} for the given {@link CassandraQueryMethod},
@@ -66,7 +73,9 @@ public class ReactiveStringBasedCassandraQuery extends AbstractReactiveCassandra
6673 * {@link org.springframework.expression.spel.support.StandardEvaluationContext}.
6774 * @see org.springframework.data.cassandra.repository.query.ReactiveCassandraQueryMethod
6875 * @see org.springframework.data.cassandra.core.ReactiveCassandraOperations
76+ * @deprecated since 4.4, use the constructors accepting {@link ValueExpressionDelegate} instead.
6977 */
78+ @ Deprecated (since = "4.4" )
7079 public ReactiveStringBasedCassandraQuery (ReactiveCassandraQueryMethod queryMethod ,
7180 ReactiveCassandraOperations operations , ExpressionParser expressionParser ,
7281 ReactiveQueryMethodEvaluationContextProvider evaluationContextProvider ) {
@@ -86,19 +95,59 @@ public ReactiveStringBasedCassandraQuery(ReactiveCassandraQueryMethod queryMetho
8695 * {@link org.springframework.expression.spel.support.StandardEvaluationContext}.
8796 * @see org.springframework.data.cassandra.repository.query.ReactiveCassandraQueryMethod
8897 * @see org.springframework.data.cassandra.core.ReactiveCassandraOperations
98+ * @deprecated since 4.4, use the constructors accepting {@link ValueExpressionDelegate} instead.
8999 */
100+ @ Deprecated (since = "4.4" )
90101 public ReactiveStringBasedCassandraQuery (String query , ReactiveCassandraQueryMethod method ,
91102 ReactiveCassandraOperations operations , ExpressionParser expressionParser ,
92103 ReactiveQueryMethodEvaluationContextProvider evaluationContextProvider ) {
93104
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+
94139 super (method , operations );
95140
96141 Assert .hasText (query , "Query must not be empty" );
97142
98- this .expressionParser = expressionParser ;
99- this .evaluationContextProvider = evaluationContextProvider ;
143+ this .delegate = delegate ;
100144
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 ;
102151
103152 if (method .hasAnnotatedQuery ()) {
104153
@@ -126,10 +175,9 @@ public Mono<SimpleStatement> createQuery(CassandraParameterAccessor parameterAcc
126175 StringBasedQuery query = getStringBasedQuery ();
127176 ConvertingParameterAccessor parameterAccessorToUse = new ConvertingParameterAccessor (
128177 getReactiveCassandraOperations ().getConverter (), parameterAccessor );
129- Mono <SpELExpressionEvaluator > spelEvaluator = getSpelEvaluatorFor (query .getExpressionDependencies (),
130- parameterAccessorToUse );
131178
132- return spelEvaluator .map (it -> getQueryStatementCreator ().select (query , parameterAccessorToUse , it ));
179+ return getValueExpressionEvaluatorLater (query .getExpressionDependencies (), parameterAccessor )
180+ .map (it -> getQueryStatementCreator ().select (query , parameterAccessorToUse , it ));
133181 }
134182
135183 @ Override
@@ -152,21 +200,9 @@ protected boolean isModifyingQuery() {
152200 return false ;
153201 }
154202
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 ,
164204 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 ));
171207 }
172208}
0 commit comments