Skip to content

Commit 43df1e0

Browse files
committed
Add factory method overload to ValueExpressionQueryRewriter to return a EvaluatingValueExpressionQueryRewriter directly.
1 parent 5c290bb commit 43df1e0

File tree

3 files changed

+41
-17
lines changed

3 files changed

+41
-17
lines changed

src/main/java/org/springframework/data/repository/query/ValueExpressionDelegate.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ public static ValueExpressionDelegate create() {
6464
ValueExpressionParser.create());
6565
}
6666

67+
public ValueExpressionParser getValueExpressionParser() {
68+
return valueExpressionParser;
69+
}
70+
71+
public QueryMethodValueEvaluationContextAccessor getEvaluationContextAccessor() {
72+
return contextAccessor;
73+
}
74+
6775
/**
6876
* Creates a {@link ValueEvaluationContextProvider} for query method {@link Parameters} for later creation of a
6977
* {@link ValueEvaluationContext} based on the actual method parameter values. The resulting
@@ -76,10 +84,6 @@ public ValueEvaluationContextProvider createValueContextProvider(Parameters<?, ?
7684
return contextAccessor.create(parameters);
7785
}
7886

79-
public ValueExpressionParser getValueExpressionParser() {
80-
return valueExpressionParser;
81-
}
82-
8387
@Override
8488
public ValueExpression parse(String expressionString) throws ParseException {
8589
return valueExpressionParser.parse(expressionString);

src/main/java/org/springframework/data/repository/query/ValueExpressionQueryRewriter.java

+26-8
Original file line numberDiff line numberDiff line change
@@ -98,21 +98,39 @@ private ValueExpressionQueryRewriter(ValueExpressionParser expressionParser,
9898
}
9999

100100
/**
101-
* Creates a new {@link ValueExpressionQueryRewriter} using the given {@link ValueExpressionParser} and rewrite
102-
* functions.
101+
* Creates a new ValueExpressionQueryRewriter using the given {@link ValueExpressionParser} and rewrite functions.
103102
*
104103
* @param expressionParser the expression parser to use.
105104
* @param parameterNameSource function to generate parameter names. Typically, a function of the form
106105
* {@code (index, expression) -> "__some_placeholder_" + index}.
107106
* @param replacementSource function to generate replacements. Typically, a concatenation of the prefix and the
108107
* parameter name such as {@code String::concat}.
109-
* @return
108+
* @return a ValueExpressionQueryRewriter instance to rewrite queries and extract parsed {@link ValueExpression}s.
110109
*/
111110
public static ValueExpressionQueryRewriter of(ValueExpressionParser expressionParser,
112111
BiFunction<Integer, String, String> parameterNameSource, BiFunction<String, String, String> replacementSource) {
113112
return new ValueExpressionQueryRewriter(expressionParser, parameterNameSource, replacementSource);
114113
}
115114

115+
/**
116+
* Creates a new EvaluatingValueExpressionQueryRewriter using the given {@link ValueExpressionDelegate} and rewrite
117+
* functions.
118+
*
119+
* @param delegate the ValueExpressionDelegate to use for parsing and to obtain EvaluationContextAccessor from.
120+
* @param parameterNameSource function to generate parameter names. Typically, a function of the form
121+
* {@code (index, expression) -> "__some_placeholder_" + index}.
122+
* @param replacementSource function to generate replacements. Typically, a concatenation of the prefix and the
123+
* parameter name such as {@code String::concat}.
124+
* @return a EvaluatingValueExpressionQueryRewriter instance to rewrite queries and extract parsed
125+
* {@link ValueExpression}s.
126+
* @since 3.4
127+
*/
128+
public static EvaluatingValueExpressionQueryRewriter of(ValueExpressionDelegate delegate,
129+
BiFunction<Integer, String, String> parameterNameSource, BiFunction<String, String, String> replacementSource) {
130+
return of((ValueExpressionParser) delegate, parameterNameSource, replacementSource)
131+
.withEvaluationContextAccessor(delegate.getEvaluationContextAccessor());
132+
}
133+
116134
/**
117135
* Parses the query for {@link org.springframework.data.expression.ValueExpression value expressions} using the
118136
* pattern:
@@ -137,15 +155,15 @@ public ParsedQuery parse(String query) {
137155
* Creates a {@link EvaluatingValueExpressionQueryRewriter} from the current one and the given
138156
* {@link QueryMethodValueEvaluationContextAccessor}.
139157
*
140-
* @param factory must not be {@literal null}.
141-
* @return
158+
* @param accessor must not be {@literal null}.
159+
* @return EvaluatingValueExpressionQueryRewriter instance to rewrite and evaluate Value Expressions.
142160
*/
143161
public EvaluatingValueExpressionQueryRewriter withEvaluationContextAccessor(
144-
QueryMethodValueEvaluationContextAccessor factory) {
162+
QueryMethodValueEvaluationContextAccessor accessor) {
145163

146-
Assert.notNull(factory, "QueryMethodValueEvaluationContextAccessor must not be null");
164+
Assert.notNull(accessor, "QueryMethodValueEvaluationContextAccessor must not be null");
147165

148-
return new EvaluatingValueExpressionQueryRewriter(expressionParser, factory, parameterNameSource,
166+
return new EvaluatingValueExpressionQueryRewriter(expressionParser, accessor, parameterNameSource,
149167
replacementSource);
150168
}
151169

src/test/java/org/springframework/data/repository/query/ValueExpressionQueryRewriterUnitTests.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ void findsAndReplacesExpressions() {
7474
Tuple.tuple("EPP2", "${three}"), //
7575
Tuple.tuple("EPP3", "${four}") //
7676
);
77-
7877
}
7978

8079
@Test // GH-3049
@@ -113,17 +112,20 @@ private void checkNoExpressionIsFound(String query) {
113112
@Test // GH-3049
114113
void shouldEvaluateExpression() throws Exception {
115114

116-
ValueExpressionQueryRewriter rewriter = ValueExpressionQueryRewriter.of(PARSER, PARAMETER_NAME_SOURCE,
117-
REPLACEMENT_SOURCE);
118115
StandardEnvironment environment = new StandardEnvironment();
119116
environment.getPropertySources().addFirst(new MapPropertySource("synthetic", Map.of("foo", "world")));
120117

121-
QueryMethodValueEvaluationContextAccessor factory = new QueryMethodValueEvaluationContextAccessor(environment,
118+
QueryMethodValueEvaluationContextAccessor contextAccessor = new QueryMethodValueEvaluationContextAccessor(
119+
environment,
122120
EvaluationContextProvider.DEFAULT);
123121

122+
ValueExpressionDelegate delegate = new ValueExpressionDelegate(contextAccessor, PARSER);
123+
ValueExpressionQueryRewriter.EvaluatingValueExpressionQueryRewriter rewriter = ValueExpressionQueryRewriter
124+
.of(delegate, PARAMETER_NAME_SOURCE, REPLACEMENT_SOURCE);
125+
124126
Method method = ValueExpressionQueryRewriterUnitTests.MyRepository.class.getDeclaredMethod("simpleExpression",
125127
String.class);
126-
var extractor = rewriter.withEvaluationContextAccessor(factory).parse("SELECT :#{#value}, :${foo}",
128+
var extractor = rewriter.parse("SELECT :#{#value}, :${foo}",
127129
new DefaultParameters(ParametersSource.of(method)));
128130

129131
assertThat(extractor.getQueryString()).isEqualTo("SELECT :EPP0, :EPP1");

0 commit comments

Comments
 (0)