From eba608ba86f12ef792b07962a1c85533f2b05efe Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 18 Jul 2025 12:42:02 +0200 Subject: [PATCH] Fix AOT evaluation code generation when method has no parameters. See #5006 Original pull request: #5005 --- .../repository/aot/AggregationBlocks.java | 8 +++++++- .../mongodb/repository/aot/MongoCodeBlocks.java | 16 ++++++++++++---- .../data/mongodb/repository/aot/QueryBlocks.java | 13 ++++++++++--- .../mongodb/repository/aot/UpdateBlocks.java | 11 ++++++++++- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AggregationBlocks.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AggregationBlocks.java index fabe4be73..e8dbffb19 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AggregationBlocks.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AggregationBlocks.java @@ -173,7 +173,13 @@ class AggregationBlocks { this.context = context; this.queryMethod = queryMethod; - this.parameterNames = StringUtils.collectionToDelimitedString(context.getAllParameterNames(), ", "); + String parameterNames = StringUtils.collectionToDelimitedString(context.getAllParameterNames(), ", "); + + if (StringUtils.hasText(parameterNames)) { + this.parameterNames = ", " + parameterNames; + } else { + this.parameterNames = ""; + } } AggregationCodeBlockBuilder stages(AggregationInteraction aggregation) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/MongoCodeBlocks.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/MongoCodeBlocks.java index 64a67c2bd..e887e0a11 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/MongoCodeBlocks.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/MongoCodeBlocks.java @@ -169,7 +169,7 @@ class MongoCodeBlocks { if (!StringUtils.hasText(source)) { builder.add("new $T()", Document.class); } else if (containsPlaceholder(source)) { - builder.add("bindParameters(ExpressionMarker.class.getEnclosingMethod(), $S, $L);\n", source, argNames); + builder.add("bindParameters(ExpressionMarker.class.getEnclosingMethod(), $S$L);\n", source, argNames); } else { builder.add("parse($S)", source); } @@ -183,7 +183,7 @@ class MongoCodeBlocks { if (!StringUtils.hasText(source)) { builder.addStatement("$1T $2L = new $1T()", Document.class, variableName); } else if (containsPlaceholder(source)) { - builder.add("$T $L = bindParameters(ExpressionMarker.class.getEnclosingMethod(), $S, $L);\n", Document.class, + builder.add("$T $L = bindParameters(ExpressionMarker.class.getEnclosingMethod(), $S$L);\n", Document.class, variableName, source, argNames); } else { builder.addStatement("$1T $2L = parse($3S)", Document.class, variableName, source); @@ -198,9 +198,17 @@ class MongoCodeBlocks { return CodeBlock.of("$L", number); } catch (IllegalArgumentException e) { + String parameterNames = StringUtils.collectionToDelimitedString(context.getAllParameterNames(), ", "); + + if (StringUtils.hasText(parameterNames)) { + parameterNames = ", " + parameterNames; + } else { + parameterNames = ""; + } + Builder builder = CodeBlock.builder(); - builder.add("($T) evaluate(ExpressionMarker.class.getEnclosingMethod(), $S, $L)", targetType, value, - StringUtils.collectionToDelimitedString(context.getAllParameterNames(), ", ")); + builder.add("($T) evaluate(ExpressionMarker.class.getEnclosingMethod(), $S$L)", targetType, value, + parameterNames); return builder.build(); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/QueryBlocks.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/QueryBlocks.java index cd30d48e8..0f3697b30 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/QueryBlocks.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/QueryBlocks.java @@ -146,7 +146,14 @@ class QueryBlocks { this.context = context; this.queryMethod = queryMethod; - this.parameterNames = StringUtils.collectionToDelimitedString(context.getAllParameterNames(), ", "); + + String parameterNames = StringUtils.collectionToDelimitedString(context.getAllParameterNames(), ", "); + + if (StringUtils.hasText(parameterNames)) { + this.parameterNames = ", " + parameterNames; + } else { + this.parameterNames = ""; + } } QueryCodeBlockBuilder filter(QueryInteraction query) { @@ -235,7 +242,7 @@ class QueryBlocks { } else { builder.addStatement( - "$L.collation(collationOf(evaluate(ExpressionMarker.class.getEnclosingMethod(), $S, $L)))", + "$L.collation(collationOf(evaluate(ExpressionMarker.class.getEnclosingMethod(), $S$L)))", queryVariableName, collationString, parameterNames); } } @@ -260,7 +267,7 @@ class QueryBlocks { return CodeBlock.of("new $T(new $T())", BasicQuery.class, Document.class); } else if (MongoCodeBlocks.containsPlaceholder(source)) { Builder builder = CodeBlock.builder(); - builder.add("createQuery(ExpressionMarker.class.getEnclosingMethod(), $S, $L)", source, parameterNames); + builder.add("createQuery(ExpressionMarker.class.getEnclosingMethod(), $S$L)", source, parameterNames); return builder.build(); } else { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/UpdateBlocks.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/UpdateBlocks.java index eef83629b..93d624ce2 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/UpdateBlocks.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/UpdateBlocks.java @@ -102,11 +102,20 @@ class UpdateBlocks { static class UpdateCodeBlockBuilder { private final AotQueryMethodGenerationContext context; + private final String parameterNames; private UpdateInteraction source; private String updateVariableName; public UpdateCodeBlockBuilder(AotQueryMethodGenerationContext context) { this.context = context; + + String parameterNames = StringUtils.collectionToDelimitedString(context.getAllParameterNames(), ", "); + + if (StringUtils.hasText(parameterNames)) { + this.parameterNames = ", " + parameterNames; + } else { + this.parameterNames = ""; + } } public UpdateCodeBlockBuilder update(UpdateInteraction update) { @@ -127,7 +136,7 @@ class UpdateBlocks { String tmpVariableName = updateVariableName + "Document"; builder.add( MongoCodeBlocks.renderExpressionToDocument(source.getUpdate().getUpdateString(), tmpVariableName, - StringUtils.collectionToDelimitedString(context.getAllParameterNames(), ", "))); + parameterNames)); builder.addStatement("$1T $2L = new $1T($3L)", BasicUpdate.class, updateVariableName, tmpVariableName); return builder.build();