Skip to content

Commit 8fe6fda

Browse files
committed
support conversion for ValueFunction
1 parent d43740e commit 8fe6fda

File tree

7 files changed

+37
-20
lines changed

7 files changed

+37
-20
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/QueryMapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ private Condition mapCondition(CriteriaDefinition criteria, MapSqlParameterSourc
310310
sqlType = getTypeHint(mappedValue, actualType.getType(), settableValue);
311311
} else if (criteria.getValue() instanceof ValueFunction valueFunction) {
312312

313-
mappedValue = valueFunction;
313+
mappedValue = valueFunction.transform(v -> convertValue(comparator, v, propertyField.getTypeHint()));
314314
sqlType = propertyField.getSqlType();
315315

316316
} else if (propertyField instanceof MetadataBackedField metadataBackedField //

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/EscapingParameterSource.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ public boolean hasValue(String paramName) {
4545
public Object getValue(String paramName) throws IllegalArgumentException {
4646

4747
Object value = parameterSource.getValue(paramName);
48-
if (value instanceof ValueFunction<?>) {
49-
return ((ValueFunction<?>) value).apply(escaper);
48+
if (value instanceof ValueFunction<?> valueFunction) {
49+
return valueFunction.apply(escaper);
5050
}
5151
return value;
5252
}

spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -373,12 +373,10 @@ private Condition mapCondition(CriteriaDefinition criteria, MutableBindings bind
373373

374374
mappedValue = convertValue(comparator, parameter.getValue(), propertyField.getTypeHint());
375375
typeHint = getTypeHint(mappedValue, actualType.getType(), parameter);
376-
} else if (criteria.getValue() instanceof ValueFunction) {
376+
} else if (criteria.getValue() instanceof ValueFunction<?> valueFunction) {
377377

378-
ValueFunction<Object> valueFunction = (ValueFunction<Object>) criteria.getValue();
379-
Object value = valueFunction.apply(getEscaper(comparator));
378+
mappedValue = valueFunction.transform(v -> convertValue(comparator, v, propertyField.getTypeHint())).apply(getEscaper(comparator));
380379

381-
mappedValue = convertValue(comparator, value, propertyField.getTypeHint());
382380
typeHint = actualType.getType();
383381
} else {
384382

spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/query/UpdateMapper.java

+3-7
Original file line numberDiff line numberDiff line change
@@ -111,18 +111,14 @@ private Assignment getAssignment(SqlIdentifier columnName, Object value, Mutable
111111
Object mappedValue;
112112
Class<?> typeHint;
113113

114-
if (value instanceof Parameter) {
115-
116-
Parameter parameter = (Parameter) value;
114+
if (value instanceof Parameter parameter) {
117115

118116
mappedValue = convertValue(parameter.getValue(), propertyField.getTypeHint());
119117
typeHint = getTypeHint(mappedValue, actualType.getType(), parameter);
120118

121-
} else if (value instanceof ValueFunction) {
122-
123-
ValueFunction<Object> valueFunction = (ValueFunction<Object>) value;
119+
} else if (value instanceof ValueFunction<?> valueFunction) {
124120

125-
mappedValue = convertValue(valueFunction.apply(Escaper.DEFAULT), propertyField.getTypeHint());
121+
mappedValue = valueFunction.transform(v -> convertValue(v, propertyField.getTypeHint())).apply(Escaper.DEFAULT);
126122

127123
if (mappedValue == null) {
128124
return Assignments.value(column, SQL.nullLiteral());

spring-data-relational/src/main/java/org/springframework/data/relational/core/query/ValueFunction.java

+12
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,16 @@ default Supplier<T> toSupplier(Escaper escaper) {
5656

5757
return () -> apply(escaper);
5858
}
59+
60+
/**
61+
* Transforms the inner value of the ValueFunction using the profided transformation.
62+
*
63+
* The default implementation just return the current {@literal ValueFunction}.
64+
* This is not a valid implementation and serves just to maintain backward compatibility.
65+
*
66+
* @param transformation to be applied to the underlying value.
67+
* @return a new {@literal ValueFunction}.
68+
* @since 3.2
69+
*/
70+
default ValueFunction<T> transform(Function<Object, Object> transformation) {return this;};
5971
}
+14-3
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,25 @@
2121

2222
import java.util.function.Function;
2323

24-
record SimpleValueFunction(Object value, Function<String, String> modifier) implements ValueFunction<String> {
24+
/**
25+
* Value function that has an underlying value and a modifier that gets applied after the escaper.
26+
*
27+
* @author Jens Schauder
28+
* @since 3.2
29+
*/
30+
record ModifyingValueFunction(Object value, Function<String, String> modifier) implements ValueFunction<String> {
2531

26-
static SimpleValueFunction of(Object value, Function<String, String> modifier) {
27-
return new SimpleValueFunction(value, modifier);
32+
static ModifyingValueFunction of(Object value, Function<String, String> modifier) {
33+
return new ModifyingValueFunction(value, modifier);
2834
}
2935

3036
@Override
3137
public String apply(Escaper escaper) {
3238
return modifier.apply(escaper.escape(value.toString()));
3339
}
40+
41+
@Override
42+
public ValueFunction<String> transform(Function<Object, Object> transformation) {
43+
return new ModifyingValueFunction(transformation.apply(value), modifier);
44+
}
3445
}

spring-data-relational/src/main/java/org/springframework/data/relational/repository/query/ParameterMetadataProvider.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,12 @@ protected Object prepareParameterValue(@Nullable Object value, Class<?> valueTyp
138138

139139
switch (partType) {
140140
case STARTING_WITH:
141-
return SimpleValueFunction.of(value, s -> s + "%");
141+
return ModifyingValueFunction.of(value, s -> s + "%");
142142
case ENDING_WITH:
143-
return SimpleValueFunction.of(value, s -> "%" + s);
143+
return ModifyingValueFunction.of(value, s -> "%" + s);
144144
case CONTAINING:
145145
case NOT_CONTAINING:
146-
return SimpleValueFunction.of(value, s -> "%" + s + "%");
146+
return ModifyingValueFunction.of(value, s -> "%" + s + "%");
147147
default:
148148
return value;
149149
}

0 commit comments

Comments
 (0)