diff --git a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/CommonQueryBinder.java b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/CommonQueryBinder.java index 5a7eb79749daf2..50df71063aaeab 100644 --- a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/CommonQueryBinder.java +++ b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/CommonQueryBinder.java @@ -6,9 +6,12 @@ import java.time.format.DateTimeFormatter; import java.util.Date; -class CommonQueryBinder { +final class CommonQueryBinder { - public static final String ISO_DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS"; + static final String ISO_DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS"; + + private CommonQueryBinder() { + } static String replace(String query, String oldChars, Object value) { return query.replace(oldChars, escape(value)); diff --git a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/MongoParserVisitor.java b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/MongoParserVisitor.java index c1109703c1ede2..1c093b86611b6f 100644 --- a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/MongoParserVisitor.java +++ b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/MongoParserVisitor.java @@ -7,9 +7,11 @@ class MongoParserVisitor extends HqlParserBaseVisitor { private Map replacementMap; + private Map parameterMaps; - public MongoParserVisitor(Map replacementMap) { + public MongoParserVisitor(Map replacementMap, Map parameterMaps) { this.replacementMap = replacementMap; + this.parameterMaps = parameterMaps; } @Override @@ -84,7 +86,13 @@ public String visitLiteralExpression(HqlParser.LiteralExpressionContext ctx) { @Override public String visitParameterExpression(HqlParser.ParameterExpressionContext ctx) { // this will match parameters used by PanacheQL : '?1' for index based or ':key' for named one. - return ctx.getText(); + if (parameterMaps.containsKey(ctx.getText())) { + Object value = parameterMaps.get(ctx.getText()); + return CommonQueryBinder.escape(value); + } else { + // we return the parameter to avoid an exception but the query will be invalid + return ctx.getText(); + } } @Override diff --git a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/PanacheQlQueryBinder.java b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/PanacheQlQueryBinder.java index 1920a35095cea1..0110cc8ab93b64 100644 --- a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/PanacheQlQueryBinder.java +++ b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/PanacheQlQueryBinder.java @@ -25,25 +25,25 @@ public static String bindQuery(Class clazz, String query, Object[] params) { } //classic query - String bindQuery = prepareQuery(query, replacementMap); + Map parameterMaps = new HashMap<>(); for (int i = 1; i <= params.length; i++) { String bindParamsKey = "?" + i; - bindQuery = CommonQueryBinder.replace(bindQuery, bindParamsKey, params[i - 1]); + parameterMaps.put(bindParamsKey, params[i - 1]); } - return bindQuery; + return prepareQuery(query, replacementMap, parameterMaps); } public static String bindQuery(Class clazz, String query, Map params) { Map replacementMap = extractReplacementMap(clazz); - String bindQuery = prepareQuery(query, replacementMap); + Map parameterMaps = new HashMap<>(); for (Map.Entry entry : params.entrySet()) { String bindParamsKey = ":" + entry.getKey(); - bindQuery = CommonQueryBinder.replace(bindQuery, bindParamsKey, entry.getValue()); + parameterMaps.put(bindParamsKey, entry.getValue()); } - return bindQuery; + return prepareQuery(query, replacementMap, parameterMaps); } private static String replaceField(String field, Map replacementMap) { @@ -72,14 +72,12 @@ private static Map extractReplacementMap(Class clazz) { return replacementMap; } - private static String prepareQuery(String query, Map replacementMap) { + private static String prepareQuery(String query, Map replacementMap, Map parameterMaps) { HqlLexer lexer = new HqlLexer(CharStreams.fromString(query)); CommonTokenStream tokens = new CommonTokenStream(lexer); HqlParser parser = new HqlParser(tokens); HqlParser.PredicateContext predicate = parser.predicate(); - HqlParserBaseVisitor visitor = new MongoParserVisitor(replacementMap); - // implementaton idea: instead of using a visitor of String we can use a visitor of Document to avoid parsing - // the resulting mongo query + HqlParserBaseVisitor visitor = new MongoParserVisitor(replacementMap, parameterMaps); return "{" + predicate.accept(visitor) + "}"; } }