33
33
import org .springframework .data .projection .ProjectionFactory ;
34
34
import org .springframework .data .repository .query .Parameter ;
35
35
import org .springframework .data .repository .query .Parameters ;
36
- import org .springframework .data .repository .query .QueryMethodEvaluationContextProvider ;
37
36
import org .springframework .data .repository .query .RepositoryQuery ;
38
- import org .springframework .data .repository .query .SpelEvaluator ;
39
37
import org .springframework .data .repository .query .SpelQueryContext ;
40
- import org .springframework .data .repository .query .SpelQueryContext .SpelExtractor ;
38
+ import org .springframework .data .repository .query .ValueExpressionDelegate ;
39
+ import org .springframework .data .repository .query .ValueExpressionQueryRewriter ;
41
40
import org .springframework .lang .Nullable ;
42
41
import org .springframework .util .Assert ;
43
42
import org .springframework .util .StringUtils ;
@@ -65,24 +64,22 @@ final class ReactiveStringBasedNeo4jQuery extends AbstractReactiveNeo4jQuery {
65
64
static final SpelQueryContext SPEL_QUERY_CONTEXT = SpelQueryContext
66
65
.of (ReactiveStringBasedNeo4jQuery ::parameterNameSource , ReactiveStringBasedNeo4jQuery ::replacementSource );
67
66
68
- /**
69
- * Used to evaluate the expression found while parsing the cypher template of this query against the actual parameters
70
- * with the help of the formal parameters during the building of the {@link PreparedQuery}.
71
- */
72
- private final SpelEvaluator spelEvaluator ;
67
+ private final ValueExpressionQueryRewriter .EvaluatingValueExpressionQueryRewriter queryRewriter ;
68
+
69
+ private final ValueExpressionQueryRewriter .QueryExpressionEvaluator parsedQuery ;
73
70
74
71
/**
75
72
* Create a {@link ReactiveStringBasedNeo4jQuery} for a query method that is annotated with {@link Query @Query}. The
76
73
* annotation is expected to have a value.
77
74
*
78
75
* @param neo4jOperations reactive Neo4j operations
79
76
* @param mappingContext a Neo4jMappingContext instance
80
- * @param evaluationContextProvider a QueryMethodEvaluationContextProvider instance
77
+ * @param delegate a ValueExpressionDelegate instance
81
78
* @param queryMethod the query method
82
79
* @return A new instance of a String based Neo4j query.
83
80
*/
84
81
static ReactiveStringBasedNeo4jQuery create (ReactiveNeo4jOperations neo4jOperations ,
85
- Neo4jMappingContext mappingContext , QueryMethodEvaluationContextProvider evaluationContextProvider ,
82
+ Neo4jMappingContext mappingContext , ValueExpressionDelegate delegate ,
86
83
Neo4jQueryMethod queryMethod , ProjectionFactory factory ) {
87
84
88
85
Query queryAnnotation = queryMethod .getQueryAnnotation ()
@@ -91,7 +88,7 @@ static ReactiveStringBasedNeo4jQuery create(ReactiveNeo4jOperations neo4jOperati
91
88
String cypherTemplate = Optional .ofNullable (queryAnnotation .value ()).filter (StringUtils ::hasText )
92
89
.orElseThrow (() -> new MappingException ("Expected @Query annotation to have a value, but it did not" ));
93
90
94
- return new ReactiveStringBasedNeo4jQuery (neo4jOperations , mappingContext , evaluationContextProvider , queryMethod ,
91
+ return new ReactiveStringBasedNeo4jQuery (neo4jOperations , mappingContext , delegate , queryMethod ,
95
92
cypherTemplate , Neo4jQueryType .fromDefinition (queryAnnotation ), factory );
96
93
}
97
94
@@ -100,30 +97,30 @@ static ReactiveStringBasedNeo4jQuery create(ReactiveNeo4jOperations neo4jOperati
100
97
*
101
98
* @param neo4jOperations reactive Neo4j operations
102
99
* @param mappingContext a Neo4jMappingContext instance
103
- * @param evaluationContextProvider a QueryMethodEvaluationContextProvider instance
100
+ * @param delegate a ValueExpressionDelegate instance
104
101
* @param queryMethod the query method
105
102
* @param cypherTemplate The template to use.
106
103
* @return A new instance of a String based Neo4j query.
107
104
*/
108
105
static ReactiveStringBasedNeo4jQuery create (ReactiveNeo4jOperations neo4jOperations ,
109
- Neo4jMappingContext mappingContext , QueryMethodEvaluationContextProvider evaluationContextProvider ,
106
+ Neo4jMappingContext mappingContext , ValueExpressionDelegate delegate ,
110
107
Neo4jQueryMethod queryMethod , String cypherTemplate , ProjectionFactory factory ) {
111
108
112
109
Assert .hasText (cypherTemplate , "Cannot create String based Neo4j query without a cypher template" );
113
110
114
- return new ReactiveStringBasedNeo4jQuery (neo4jOperations , mappingContext , evaluationContextProvider , queryMethod ,
111
+ return new ReactiveStringBasedNeo4jQuery (neo4jOperations , mappingContext , delegate , queryMethod ,
115
112
cypherTemplate , Neo4jQueryType .DEFAULT , factory );
116
113
}
117
114
118
115
private ReactiveStringBasedNeo4jQuery (ReactiveNeo4jOperations neo4jOperations , Neo4jMappingContext mappingContext ,
119
- QueryMethodEvaluationContextProvider evaluationContextProvider , Neo4jQueryMethod queryMethod ,
116
+ ValueExpressionDelegate delegate , Neo4jQueryMethod queryMethod ,
120
117
String cypherTemplate , Neo4jQueryType queryType , ProjectionFactory factory ) {
121
118
122
119
super (neo4jOperations , mappingContext , queryMethod , queryType , factory );
123
120
124
- cypherTemplate = Neo4jSpelSupport . renderQueryIfExpressionOrReturnQuery ( cypherTemplate , mappingContext , queryMethod . getEntityInformation (), SPEL_EXPRESSION_PARSER );
125
- SpelExtractor spelExtractor = SPEL_QUERY_CONTEXT . parse ( cypherTemplate );
126
- this .spelEvaluator = new SpelEvaluator ( evaluationContextProvider , queryMethod .getParameters (), spelExtractor );
121
+ this . queryRewriter = ValueExpressionQueryRewriter . of ( delegate ,
122
+ StringBasedNeo4jQuery :: parameterNameSource , StringBasedNeo4jQuery :: replacementSource );
123
+ this .parsedQuery = queryRewriter . parse ( cypherTemplate , queryMethod .getParameters ());
127
124
}
128
125
129
126
@ Override
@@ -134,7 +131,7 @@ protected <T extends Object> PreparedQuery<T> prepareQuery(Class<T> returnedType
134
131
Map <String , Object > boundParameters = bindParameters (parameterAccessor );
135
132
QueryContext queryContext = new QueryContext (
136
133
queryMethod .getRepositoryName () + "." + queryMethod .getName (),
137
- spelEvaluator .getQueryString (),
134
+ parsedQuery .getQueryString (),
138
135
boundParameters
139
136
);
140
137
@@ -153,7 +150,7 @@ Map<String, Object> bindParameters(Neo4jParameterAccessor parameterAccessor) {
153
150
Map <String , Object > resolvedParameters = new HashMap <>();
154
151
155
152
// Values from the parameter accessor can only get converted after evaluation
156
- for (Map .Entry <String , Object > evaluatedParam : spelEvaluator .evaluate (parameterAccessor .getValues ()).entrySet ()) {
153
+ for (Map .Entry <String , Object > evaluatedParam : parsedQuery .evaluate (parameterAccessor .getValues ()).entrySet ()) {
157
154
Object value = evaluatedParam .getValue ();
158
155
if (!(evaluatedParam .getValue () instanceof Neo4jSpelSupport .LiteralReplacement )) {
159
156
Neo4jQuerySupport .logParameterIfNull (evaluatedParam .getKey (), value );
0 commit comments