Skip to content

Commit c080c10

Browse files
committed
Replaced with Regex
1 parent 8db7d97 commit c080c10

File tree

11 files changed

+79
-92
lines changed

11 files changed

+79
-92
lines changed

database/database-annotation-processor/src/main/java/ru/tinkoff/kora/database/annotation/processor/QueryWithParameters.java

Lines changed: 28 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@
1414
import java.util.Collection;
1515
import java.util.List;
1616
import java.util.Optional;
17+
import java.util.regex.Pattern;
1718

1819
public record QueryWithParameters(String rawQuery, List<QueryParameter> parameters) {
1920

20-
public record QueryParameter(String sqlParameterName, int methodIndex, List<Integer> queryIndexes, List<Integer> sqlIndexes) {}
21+
public record QueryParameter(String sqlParameterName, int methodIndex, List<QueryIndex> queryIndexes, List<Integer> sqlIndexes) {
22+
23+
public record QueryIndex(int start, int end) { }
24+
}
2125

2226
@Nullable
2327
public QueryParameter find(String name) {
@@ -104,7 +108,7 @@ public static QueryWithParameters parse(Filer filer,
104108
.toList();
105109

106110
params = params.stream()
107-
.map(p -> new QueryParameter(p.sqlParameterName(), p.methodIndex(), p.sqlIndexes(), p.sqlIndexes()
111+
.map(p -> new QueryParameter(p.sqlParameterName(), p.methodIndex(), p.queryIndexes(), p.sqlIndexes()
108112
.stream()
109113
.map(paramsNumbers::indexOf)
110114
.toList()
@@ -116,48 +120,38 @@ public static QueryWithParameters parse(Filer filer,
116120

117121

118122
private static Optional<QueryParameter> parseSimpleParameter(String rawSql, int methodParameterNumber, String sqlParameterName) {
119-
int index = -1;
120-
var result = new ArrayList<Integer>();
121-
while ((index = rawSql.indexOf(":" + sqlParameterName, index + 1)) >= 0) {
122-
if (index != 0 && rawSql.charAt(index - 1) == ':') {
123-
continue;
124-
}
125-
126-
var indexAfter = index + sqlParameterName.length() + 1;
127-
if (rawSql.length() >= indexAfter + 1) {
128-
var charAfter = rawSql.charAt(indexAfter);
129-
if (Character.isAlphabetic(charAfter) || charAfter == '_' || charAfter == '$' || Character.isDigit(charAfter)) {
130-
continue;
131-
}
132-
}
133-
result.add(index);
123+
var result = new ArrayList<QueryParameter.QueryIndex>();
124+
var pattern = Pattern.compile("[\\s\\n,(](?<param>:" + sqlParameterName + ")(?=[\\s\\n,:)]|$)");
125+
var matcher = pattern.matcher(rawSql);
126+
while (matcher.find()) {
127+
var mr = matcher.toMatchResult();
128+
var start = mr.start(1);
129+
var end = mr.end();
130+
result.add(new QueryParameter.QueryIndex(start, end));
134131
}
135132

136133
return (result.isEmpty())
137134
? Optional.empty()
138-
: Optional.of(new QueryParameter(sqlParameterName, methodParameterNumber, result, result));
135+
: Optional.of(new QueryParameter(sqlParameterName, methodParameterNumber, result, result.stream()
136+
.map(QueryParameter.QueryIndex::start)
137+
.toList()));
139138
}
140139

141140
private static Optional<QueryParameter> parseEntityDirectParameter(String rawSql, int methodParameterNumber, String sqlParameterName) {
142-
int index = -1;
143-
var result = new ArrayList<Integer>();
144-
while ((index = rawSql.indexOf(":" + sqlParameterName, index + 1)) >= 0) {
145-
if (index != 0 && rawSql.charAt(index - 1) == ':') {
146-
continue;
147-
}
148-
149-
var indexAfter = index + sqlParameterName.length() + 1;
150-
if (rawSql.length() >= indexAfter + 1) {
151-
var charAfter = rawSql.charAt(indexAfter);
152-
if ('.' == charAfter || Character.isAlphabetic(charAfter) || charAfter == '_' || charAfter == '$' || Character.isDigit(charAfter)) {
153-
continue;
154-
}
155-
}
156-
result.add(index);
141+
var result = new ArrayList<QueryParameter.QueryIndex>();
142+
var pattern = Pattern.compile("[\\s\\n,(](?<param>:" + sqlParameterName + ")(?=[\\s\\n,:)]|$)");
143+
var matcher = pattern.matcher(rawSql);
144+
while (matcher.find()) {
145+
var mr = matcher.toMatchResult();
146+
var start = mr.start(1);
147+
var end = mr.end();
148+
result.add(new QueryParameter.QueryIndex(start, end));
157149
}
158150

159151
return (result.isEmpty())
160152
? Optional.empty()
161-
: Optional.of(new QueryParameter(sqlParameterName, methodParameterNumber, result, result));
153+
: Optional.of(new QueryParameter(sqlParameterName, methodParameterNumber, result, result.stream()
154+
.map(QueryParameter.QueryIndex::start)
155+
.toList()));
162156
}
163157
}

database/database-annotation-processor/src/main/java/ru/tinkoff/kora/database/annotation/processor/cassandra/CassandraRepositoryGenerator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,17 @@ public TypeSpec generate(TypeElement repositoryElement, TypeSpec.Builder type, M
7070
return type.addMethod(constructor.build()).build();
7171
}
7272

73-
private record QueryReplace(int index, String name) {}
73+
private record QueryReplace(int start, int end, String name) {}
7474

7575
private MethodSpec generate(TypeSpec.Builder type, int methodNumber, ExecutableElement method, ExecutableType methodType, QueryWithParameters query, List<QueryParameter> parameters, @Nullable String resultMapperName, FieldFactory parameterMappers) {
7676
var sql = query.rawQuery();
7777
List<QueryReplace> replaceParams = query.parameters().stream()
78-
.flatMap(p -> p.queryIndexes().stream().map(i -> new QueryReplace(i, p.sqlParameterName())))
79-
.sorted(Comparator.comparingInt(QueryReplace::index))
78+
.flatMap(p -> p.queryIndexes().stream().map(i -> new QueryReplace(i.start(), i.end(), p.sqlParameterName())))
79+
.sorted(Comparator.comparingInt(QueryReplace::start))
8080
.toList();
8181
int sqlIndexDiff = 0;
8282
for (var parameter : replaceParams) {
83-
int queryIndexAdjusted = parameter.index() - sqlIndexDiff;
83+
int queryIndexAdjusted = parameter.start() - sqlIndexDiff;
8484
sql = sql.substring(0, queryIndexAdjusted) + "?" + sql.substring(queryIndexAdjusted + parameter.name().length() + 1);
8585
sqlIndexDiff += parameter.name().length();
8686
}

database/database-annotation-processor/src/main/java/ru/tinkoff/kora/database/annotation/processor/jdbc/JdbcRepositoryGenerator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,18 +123,18 @@ public ClassName repositoryInterface() {
123123
return JdbcTypes.JDBC_REPOSITORY;
124124
}
125125

126-
private record QueryReplace(int index, String name) {}
126+
private record QueryReplace(int start, int end, String name) {}
127127

128128
public MethodSpec generate(TypeElement repositoryElement, TypeSpec.Builder type, int methodNumber, ExecutableElement method, ExecutableType methodType, QueryWithParameters query, List<QueryParameter> parameters, @Nullable String resultMapperName, FieldFactory parameterMappers) {
129129
var batchParam = parameters.stream().filter(QueryParameter.BatchParameter.class::isInstance).findFirst().orElse(null);
130130
var sql = query.rawQuery();
131131
List<QueryReplace> replaceParams = query.parameters().stream()
132-
.flatMap(p -> p.queryIndexes().stream().map(i -> new QueryReplace(i, p.sqlParameterName())))
133-
.sorted(Comparator.comparingInt(QueryReplace::index))
132+
.flatMap(p -> p.queryIndexes().stream().map(i -> new QueryReplace(i.start(), i.end(), p.sqlParameterName())))
133+
.sorted(Comparator.comparingInt(QueryReplace::start))
134134
.toList();
135135
int sqlIndexDiff = 0;
136136
for (var parameter : replaceParams) {
137-
int queryIndexAdjusted = parameter.index() - sqlIndexDiff;
137+
int queryIndexAdjusted = parameter.start() - sqlIndexDiff;
138138
sql = sql.substring(0, queryIndexAdjusted) + "?" + sql.substring(queryIndexAdjusted + parameter.name().length() + 1);
139139
sqlIndexDiff += parameter.name().length();
140140
}

database/database-annotation-processor/src/main/java/ru/tinkoff/kora/database/annotation/processor/r2dbc/R2dbcRepositoryGenerator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public TypeSpec generate(TypeElement repositoryElement, TypeSpec.Builder type, M
7070
return type.addMethod(constructor.build()).build();
7171
}
7272

73-
private record QueryReplace(int index, int sqlIndex, String name) {}
73+
private record QueryReplace(int start, int end, int sqlIndex, String name) {}
7474

7575
private MethodSpec generate(TypeSpec.Builder type, int methodNumber, ExecutableElement method, ExecutableType methodType, QueryWithParameters query, List<QueryParameter> parameters, @Nullable String resultMapperName, FieldFactory parameterMappers) {
7676
final boolean generatedKeys = AnnotationUtils.isAnnotationPresent(method, DbUtils.ID_ANNOTATION);
@@ -82,15 +82,15 @@ private MethodSpec generate(TypeSpec.Builder type, int methodNumber, ExecutableE
8282
for (int i = 0; i < p.queryIndexes().size(); i++) {
8383
var queryIndex = p.queryIndexes().get(i);
8484
var sqlIndex = p.sqlIndexes().get(i);
85-
replaces.add(new QueryReplace(queryIndex, sqlIndex, p.sqlParameterName()));
85+
replaces.add(new QueryReplace(queryIndex.start(), queryIndex.end(), sqlIndex, p.sqlParameterName()));
8686
}
8787
return replaces.stream();
8888
})
89-
.sorted(Comparator.comparingInt(QueryReplace::index))
89+
.sorted(Comparator.comparingInt(QueryReplace::start))
9090
.toList();
9191
int sqlIndexDiff = 0;
9292
for (var parameter : replaceParams) {
93-
int queryIndexAdjusted = parameter.index() - sqlIndexDiff;
93+
int queryIndexAdjusted = parameter.start() - sqlIndexDiff;
9494
int index = parameter.sqlIndex() + 1;
9595
sql = sql.substring(0, queryIndexAdjusted) + "$" + index + sql.substring(queryIndexAdjusted + parameter.name().length() + 1);
9696
sqlIndexDiff += (parameter.name().length() - String.valueOf(index).length());

database/database-annotation-processor/src/main/java/ru/tinkoff/kora/database/annotation/processor/vertx/VertxRepositoryGenerator.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,22 @@ public TypeSpec generate(TypeElement repositoryElement, TypeSpec.Builder type, M
7070
return type.addMethod(constructor.build()).build();
7171
}
7272

73-
private record QueryReplace(int index, int paramIndex, String name) {}
73+
private record QueryReplace(int start, int end, int paramIndex, String name) {}
7474

7575
private MethodSpec generate(TypeSpec.Builder type, int methodNumber, ExecutableElement method, ExecutableType methodType, QueryWithParameters query, List<QueryParameter> parameters, @Nullable String resultMapperName, FieldFactory parameterMappers) {
7676
var sql = query.rawQuery();
7777

7878
List<QueryReplace> replaceParams = new ArrayList<>();
7979
for (int i = 0; i < query.parameters().size(); i++) {
8080
var parameter = query.parameters().get(i);
81-
for (Integer queryIndex : parameter.queryIndexes()) {
82-
replaceParams.add(new QueryReplace(queryIndex, i + 1, parameter.sqlParameterName()));
81+
for (var queryIndex : parameter.queryIndexes()) {
82+
replaceParams.add(new QueryReplace(queryIndex.start(), queryIndex.end(), i + 1, parameter.sqlParameterName()));
8383
}
8484
}
85-
replaceParams.sort(Comparator.comparingInt(QueryReplace::index));
85+
replaceParams.sort(Comparator.comparingInt(QueryReplace::start));
8686
int sqlIndexDiff = 0;
8787
for (var parameter : replaceParams) {
88-
int queryIndexAdjusted = parameter.index() - sqlIndexDiff;
88+
int queryIndexAdjusted = parameter.start() - sqlIndexDiff;
8989
sql = sql.substring(0, queryIndexAdjusted) + "$" + parameter.paramIndex() + sql.substring(queryIndexAdjusted + parameter.name().length() + 1);
9090
sqlIndexDiff += (parameter.name().length() - String.valueOf(parameter.paramIndex()).length());
9191
}

database/database-symbol-processor/src/main/kotlin/ru/tinkoff/kora/database/symbol/processor/QueryWithParameters.kt

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ import com.google.devtools.ksp.symbol.KSFunctionDeclaration
44
import ru.tinkoff.kora.ksp.common.exception.ProcessingErrorException
55
import java.io.BufferedInputStream
66
import java.nio.charset.Charset
7+
import java.util.regex.Pattern
78

89
data class QueryWithParameters(val rawQuery: String, val parameters: List<QueryParameter>) {
910

10-
data class QueryParameter(val sqlParameterName: String, val methodIndex: Int, val sqlIndexes: List<Int>, val queryIndexes: List<Int>)
11+
data class QueryParameter(val sqlParameterName: String, val methodIndex: Int, val sqlIndexes: List<Int>, val queryIndexes: List<QueryIndex>)
12+
13+
data class QueryIndex(val start: Int, val end: Int)
1114

1215
fun find(name: String): QueryParameter? {
1316
for (parameter in parameters) {
@@ -93,50 +96,39 @@ data class QueryWithParameters(val rawQuery: String, val parameters: List<QueryP
9396
p.sqlParameterName,
9497
p.methodIndex,
9598
p.sqlIndexes.map { paramsNumbers.indexOf(it) },
96-
p.sqlIndexes)
99+
p.queryIndexes
100+
)
97101
}
98102

99103
return QueryWithParameters(rawSql, processedParams)
100104
}
101105

102106
private fun parseSimpleParameter(rawSql: String, methodParameterNumber: Int, sqlParameterName: String): QueryParameter {
103-
var index = -1
104-
val result = ArrayList<Int>()
105-
while (rawSql.indexOf(":$sqlParameterName", index + 1).also { index = it } >= 0) {
106-
if (index != 0 && rawSql[index - 1] == ':') {
107-
continue
108-
}
109-
110-
val indexAfter = index + sqlParameterName.length + 1
111-
if (rawSql.length >= indexAfter + 1) {
112-
val charAfter = rawSql[indexAfter]
113-
if (Character.isAlphabetic(charAfter.code) || charAfter == '_' || charAfter == '$' || Character.isDigit(charAfter)) {
114-
continue
115-
}
116-
}
117-
result.add(index)
107+
val result = ArrayList<QueryIndex>()
108+
val pattern = Pattern.compile("[\\s\\n,(](?<param>:$sqlParameterName)(?=[\\s\\n,:)]|$)")
109+
val matcher = pattern.matcher(rawSql)
110+
while (matcher.find()) {
111+
val mr = matcher.toMatchResult()
112+
val start = mr.start(1)
113+
val end = mr.end()
114+
result.add(QueryIndex(start, end))
118115
}
119-
return QueryParameter(sqlParameterName, methodParameterNumber, result, result)
116+
117+
return QueryParameter(sqlParameterName, methodParameterNumber, result.map { it.start }, result)
120118
}
121119

122120
private fun parseEntityDirectParameter(rawSql: String, methodParameterNumber: Int, sqlParameterName: String): QueryParameter {
123-
var index = -1
124-
val result = ArrayList<Int>()
125-
while (rawSql.indexOf(":$sqlParameterName", index + 1).also { index = it } >= 0) {
126-
if (index != 0 && rawSql[index - 1] == ':') {
127-
continue
128-
}
129-
130-
val indexAfter = index + sqlParameterName.length + 1
131-
if (rawSql.length >= indexAfter + 1) {
132-
val charAfter = rawSql[indexAfter]
133-
if ('.' == charAfter || Character.isAlphabetic(charAfter.code) || charAfter == '_' || charAfter == '$' || Character.isDigit(charAfter)) {
134-
continue
135-
}
136-
}
137-
result.add(index)
121+
val result = ArrayList<QueryIndex>()
122+
val pattern = Pattern.compile("[\\s\\n,(](?<param>:$sqlParameterName)(?=[\\s\\n,:)]|$)")
123+
val matcher = pattern.matcher(rawSql)
124+
while (matcher.find()) {
125+
val mr = matcher.toMatchResult()
126+
val start = mr.start(1)
127+
val end = mr.end()
128+
result.add(QueryIndex(start, end))
138129
}
139-
return QueryParameter(sqlParameterName, methodParameterNumber, result, result)
130+
131+
return QueryParameter(sqlParameterName, methodParameterNumber, result.map { it.start }, result)
140132
}
141133
}
142134
}

database/database-symbol-processor/src/main/kotlin/ru/tinkoff/kora/database/symbol/processor/cassandra/CassandraRepositoryGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class CassandraRepositoryGenerator(private val resolver: Resolver) : RepositoryG
7777
var sql = query.rawQuery
7878

7979
val replaceParams = query.parameters
80-
.flatMap { p -> p.queryIndexes.map { i -> QueryReplace(i, p.sqlParameterName) } }
80+
.flatMap { p -> p.queryIndexes.map { i -> QueryReplace(i.start, p.sqlParameterName) } }
8181
.sortedBy { it.index }
8282
.toList()
8383
var sqlIndexDiff = 0

database/database-symbol-processor/src/main/kotlin/ru/tinkoff/kora/database/symbol/processor/jdbc/JdbcRepositoryGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class JdbcRepositoryGenerator(private val resolver: Resolver) : RepositoryGenera
8282
var sql = query.rawQuery
8383

8484
val replaceParams = query.parameters
85-
.flatMap { p -> p.queryIndexes.map { i -> QueryReplace(i, p.sqlParameterName) } }
85+
.flatMap { p -> p.queryIndexes.map { i -> QueryReplace(i.start, p.sqlParameterName) } }
8686
.sortedBy { it.index }
8787
.toList()
8888
var sqlIndexDiff = 0

database/database-symbol-processor/src/main/kotlin/ru/tinkoff/kora/database/symbol/processor/r2dbc/R2DbcRepositoryGenerator.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ class R2DbcRepositoryGenerator(val resolver: Resolver) : RepositoryGenerator {
8181
.flatMap { p ->
8282
val replaces = mutableListOf<QueryReplace>()
8383
for (i in p.queryIndexes.indices) {
84-
val queryIndex: Int = p.queryIndexes.get(i)
85-
val sqlIndex: Int = p.sqlIndexes.get(i)
86-
replaces.add(QueryReplace(queryIndex, sqlIndex, p.sqlParameterName))
84+
val queryIndex = p.queryIndexes.get(i)
85+
val sqlIndex = p.sqlIndexes.get(i)
86+
replaces.add(QueryReplace(queryIndex.start, sqlIndex, p.sqlParameterName))
8787
}
8888
replaces.asSequence()
8989
}

database/database-symbol-processor/src/main/kotlin/ru/tinkoff/kora/database/symbol/processor/vertx/VertxRepositoryGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class VertxRepositoryGenerator(private val resolver: Resolver, private val kspLo
8080
for (i in query.parameters.indices) {
8181
val parameter = query.parameters[i]
8282
for (queryIndex in parameter.queryIndexes) {
83-
replaceParams.add(QueryReplace(queryIndex, i + 1, parameter.sqlParameterName))
83+
replaceParams.add(QueryReplace(queryIndex.start, i + 1, parameter.sqlParameterName))
8484
}
8585
}
8686
replaceParams.sortBy { it.index }

0 commit comments

Comments
 (0)