From 012cd50288c56d1994a352e66ad39c639ca9ac02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Ho=C3=9F?= Date: Fri, 2 Apr 2021 20:30:09 +0200 Subject: [PATCH] fix #1 support unnamed parameters --- .../yosql/codegen/files/SqlFileParser.java | 30 +++++++++++++++---- .../yosql/dao/jdbc/JdbcFieldsGenerator.java | 2 +- .../src/main/yosql/user/queryUnnamedUser.sql | 13 ++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 yosql-examples/yosql-examples-maven/yosql-examples-maven-jdbc-java16/src/main/yosql/user/queryUnnamedUser.sql diff --git a/yosql-codegen/yosql-codegen-files/src/main/java/wtf/metio/yosql/codegen/files/SqlFileParser.java b/yosql-codegen/yosql-codegen-files/src/main/java/wtf/metio/yosql/codegen/files/SqlFileParser.java index 643b064ef..32f51e694 100644 --- a/yosql-codegen/yosql-codegen-files/src/main/java/wtf/metio/yosql/codegen/files/SqlFileParser.java +++ b/yosql-codegen/yosql-codegen-files/src/main/java/wtf/metio/yosql/codegen/files/SqlFileParser.java @@ -23,10 +23,12 @@ @FunctionalInterface public interface SqlFileParser { - /** The regex to extract parameters out of SQL statements. */ - String PARAMETER_REGEX = "(? parse(Path pathToFile); /** + * Extracts parameter indices from a given SQL statement. + * * @param sqlStatement - * The SQL statement to use. + * The raw SQL statement to parse. * @return Extracted parameters and their indices. */ default Map> extractParameterIndices(final String sqlStatement) { + final var namedIndices = parseNamedParameters(sqlStatement); + namedIndices.putAll(parseParameters(sqlStatement)); + return Map.copyOf(namedIndices); + } + + private Map> parseNamedParameters(final String sqlStatement) { final Map> indices = new LinkedHashMap<>(); - final Matcher matcher = PARAMETER_PATTERN.matcher(sqlStatement); + final Matcher matcher = NAMED_PARAMETER_PATTERN.matcher(sqlStatement); int counter = 1; while (matcher.find()) { final String parameterName = matcher.group().substring(1); @@ -54,4 +64,14 @@ default Map> extractParameterIndices(final String sqlState return indices; } + private Map> parseParameters(final String sqlStatement) { + final Map> indices = new LinkedHashMap<>(); + final Matcher matcher = PARAMETER_PATTERN.matcher(sqlStatement); + int counter = 1; + while (matcher.find()) { + indices.computeIfAbsent("unnamedParameters", string -> new ArrayList<>(3)).add(counter++); + } + return indices; + } + } diff --git a/yosql-dao/yosql-dao-jdbc/src/main/java/wtf/metio/yosql/dao/jdbc/JdbcFieldsGenerator.java b/yosql-dao/yosql-dao-jdbc/src/main/java/wtf/metio/yosql/dao/jdbc/JdbcFieldsGenerator.java index 0eed7b528..3da9ae640 100644 --- a/yosql-dao/yosql-dao-jdbc/src/main/java/wtf/metio/yosql/dao/jdbc/JdbcFieldsGenerator.java +++ b/yosql-dao/yosql-dao-jdbc/src/main/java/wtf/metio/yosql/dao/jdbc/JdbcFieldsGenerator.java @@ -137,7 +137,7 @@ private FieldSpec asConstantSqlField(final SqlStatement sqlStatement) { } private static String replaceNamedParameters(final String rawSqlStatement) { - return rawSqlStatement.replaceAll(SqlFileParser.PARAMETER_PATTERN.pattern(), "?"); + return rawSqlStatement.replaceAll(SqlFileParser.NAMED_PARAMETER_PATTERN.pattern(), "?"); } private FieldSpec asConstantSqlParameterIndexField(final SqlStatement sqlStatement) { diff --git a/yosql-examples/yosql-examples-maven/yosql-examples-maven-jdbc-java16/src/main/yosql/user/queryUnnamedUser.sql b/yosql-examples/yosql-examples-maven/yosql-examples-maven-jdbc-java16/src/main/yosql/user/queryUnnamedUser.sql new file mode 100644 index 000000000..3200b0134 --- /dev/null +++ b/yosql-examples/yosql-examples-maven/yosql-examples-maven-jdbc-java16/src/main/yosql/user/queryUnnamedUser.sql @@ -0,0 +1,13 @@ +/* + * This file is part of yosql. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://creativecommons.org/publicdomain/zero/1.0/. No part of yosql, + * including this file, may be copied, modified, propagated, or distributed except according to the terms contained + * in the LICENSE file. + */ + +-- returningMode: ONE +select * +from users +where name = ? + and id = :userId +;