Skip to content

Commit d2fc35c

Browse files
committed
Updated impelemntation of jdbc parameters
1 parent e76945f commit d2fc35c

14 files changed

+158
-119
lines changed

jdbc/src/main/java/tech/ydb/jdbc/context/YdbContext.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import tech.ydb.jdbc.YdbConst;
2020
import tech.ydb.jdbc.YdbPrepareMode;
2121
import tech.ydb.jdbc.exception.ExceptionFactory;
22-
import tech.ydb.jdbc.query.JdbcParams;
22+
import tech.ydb.jdbc.query.YdbPreparedParams;
2323
import tech.ydb.jdbc.query.YdbQuery;
2424
import tech.ydb.jdbc.query.params.BatchedParams;
2525
import tech.ydb.jdbc.query.params.InMemoryParams;
@@ -270,11 +270,11 @@ public YdbQuery findOrParseYdbQuery(String sql) throws SQLException {
270270
return cached;
271271
}
272272

273-
public JdbcParams findOrCreateJdbcParams(YdbQuery query, YdbPrepareMode mode) throws SQLException {
274-
if (query.hasFreeParams()
273+
public YdbPreparedParams findOrPrepareParams(YdbQuery query, YdbPrepareMode mode) throws SQLException {
274+
if (!query.isPlainYQL()
275275
|| mode == YdbPrepareMode.IN_MEMORY
276-
|| !queryOptions.iPrepareDataQueries()) {
277-
return new InMemoryParams(query.getFreeParams());
276+
|| !queryOptions.isPrepareDataQueries()) {
277+
return new InMemoryParams(query.getStatements());
278278
}
279279

280280
String yql = query.withParams(null);

jdbc/src/main/java/tech/ydb/jdbc/impl/YdbConnectionImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
import tech.ydb.jdbc.context.YdbExecutor;
3333
import tech.ydb.jdbc.context.YdbValidator;
3434
import tech.ydb.jdbc.query.ExplainedQuery;
35-
import tech.ydb.jdbc.query.JdbcParams;
3635
import tech.ydb.jdbc.query.QueryType;
36+
import tech.ydb.jdbc.query.YdbPreparedParams;
3737
import tech.ydb.jdbc.query.YdbQuery;
3838
import tech.ydb.jdbc.settings.FakeTxMode;
3939
import tech.ydb.jdbc.settings.YdbOperationProperties;
@@ -311,7 +311,7 @@ private YdbPreparedStatement prepareStatement(String sql, int resultSetType, Ydb
311311
throw new SQLException(YdbConst.UNSUPPORTED_QUERY_TYPE_IN_PS + query.getType());
312312
}
313313

314-
JdbcParams params = ctx.findOrCreateJdbcParams(query, mode);
314+
YdbPreparedParams params = ctx.findOrPrepareParams(query, mode);
315315
return new YdbPreparedStatementImpl(this, query, params, resultSetType);
316316
}
317317

jdbc/src/main/java/tech/ydb/jdbc/impl/YdbParameterMetaDataImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
import tech.ydb.jdbc.YdbConst;
1010
import tech.ydb.jdbc.YdbParameterMetaData;
1111
import tech.ydb.jdbc.common.TypeDescription;
12-
import tech.ydb.jdbc.query.JdbcParams;
12+
import tech.ydb.jdbc.query.YdbPreparedParams;
1313

1414
public class YdbParameterMetaDataImpl implements YdbParameterMetaData {
15-
private final JdbcParams params;
15+
private final YdbPreparedParams params;
1616

17-
public YdbParameterMetaDataImpl(JdbcParams params) {
17+
public YdbParameterMetaDataImpl(YdbPreparedParams params) {
1818
this.params = params;
1919
}
2020

jdbc/src/main/java/tech/ydb/jdbc/impl/YdbPreparedStatementImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import tech.ydb.jdbc.YdbResultSet;
3434
import tech.ydb.jdbc.YdbTypes;
3535
import tech.ydb.jdbc.common.MappingSetters;
36-
import tech.ydb.jdbc.query.JdbcParams;
36+
import tech.ydb.jdbc.query.YdbPreparedParams;
3737
import tech.ydb.jdbc.query.YdbQuery;
3838
import tech.ydb.table.query.Params;
3939
import tech.ydb.table.values.Type;
@@ -42,11 +42,11 @@
4242
public class YdbPreparedStatementImpl extends BaseYdbStatement implements YdbPreparedStatement {
4343
private static final Logger LOGGER = Logger.getLogger(YdbPreparedStatementImpl.class.getName());
4444
private final YdbQuery query;
45-
private final JdbcParams params;
45+
private final YdbPreparedParams params;
4646
private final YdbTypes types;
4747

48-
public YdbPreparedStatementImpl(YdbConnection connection, YdbQuery query, JdbcParams params, int resultSetType) {
49-
super(LOGGER, connection, resultSetType, true); // is poolable by default
48+
public YdbPreparedStatementImpl(YdbConnection connection, YdbQuery query, YdbPreparedParams params, int rsType) {
49+
super(LOGGER, connection, rsType, true); // is poolable by default
5050

5151
this.query = Objects.requireNonNull(query);
5252
this.params = Objects.requireNonNull(params);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package tech.ydb.jdbc.query;
2+
3+
import tech.ydb.jdbc.common.TypeDescription;
4+
5+
/**
6+
*
7+
* @author Aleksandr Gorshenin
8+
*/
9+
public class ParamDescription {
10+
private final String name;
11+
private final String displayName;
12+
private final TypeDescription type;
13+
14+
public ParamDescription(String name, String displayName, TypeDescription type) {
15+
this.name = name;
16+
this.displayName = displayName;
17+
this.type = type;
18+
}
19+
20+
public ParamDescription(String name, TypeDescription type) {
21+
this(name, name, type);
22+
}
23+
24+
public String name() {
25+
return name;
26+
}
27+
28+
public String displayName() {
29+
return displayName;
30+
}
31+
32+
public TypeDescription type() {
33+
return type;
34+
}
35+
}

jdbc/src/main/java/tech/ydb/jdbc/query/QueryStatement.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@
33
import java.util.ArrayList;
44
import java.util.List;
55

6+
import tech.ydb.jdbc.common.TypeDescription;
7+
68
/**
79
*
810
* @author Aleksandr Gorshenin
911
*/
1012
public class QueryStatement {
1113
private final QueryType queryType;
1214
private final QueryCmd command;
13-
private final List<String> paramNames = new ArrayList<>();
15+
private final List<ParamDescription> parameters = new ArrayList<>();
1416
private boolean hasReturinng = false;
1517

1618
public QueryStatement(QueryType type, QueryCmd command) {
@@ -22,12 +24,12 @@ public QueryType getType() {
2224
return queryType;
2325
}
2426

25-
public List<String> getParamNames() {
26-
return paramNames;
27+
public List<ParamDescription> getParams() {
28+
return parameters;
2729
}
2830

29-
public void addParamName(String name) {
30-
this.paramNames.add(name);
31+
public void addParameter(String name, TypeDescription type) {
32+
this.parameters.add(new ParamDescription(name, type));
3133
}
3234

3335
public void setHasReturning(boolean hasReturning) {

jdbc/src/main/java/tech/ydb/jdbc/query/JdbcParams.java renamed to jdbc/src/main/java/tech/ydb/jdbc/query/YdbPreparedParams.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
*
1515
* @author Aleksandr Gorshenin
1616
*/
17-
public interface JdbcParams {
17+
public interface YdbPreparedParams {
1818
void clearParameters();
1919

2020
void setParam(int index, @Nullable Object obj, @Nonnull Type type) throws SQLException;

jdbc/src/main/java/tech/ydb/jdbc/query/YdbQuery.java

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import java.sql.SQLDataException;
66
import java.sql.SQLException;
7-
import java.util.ArrayList;
87
import java.util.List;
98
import java.util.Map;
109

@@ -23,8 +22,8 @@ public class YdbQuery {
2322
private final List<QueryStatement> statements;
2423

2524
private final QueryType type;
25+
private final boolean isPlainYQL;
2626
private final boolean isAutoDeclare;
27-
private final List<String> paramNames = new ArrayList<>();
2827

2928
YdbQuery(String originSQL, String preparedYQL, List<QueryStatement> stats, QueryType type, boolean isAutoDeclare) {
3029
this.originSQL = originSQL;
@@ -33,15 +32,21 @@ public class YdbQuery {
3332
this.type = type;
3433
this.isAutoDeclare = isAutoDeclare;
3534

36-
for (QueryStatement expression : stats) {
37-
paramNames.addAll(expression.getParamNames());
35+
boolean hasJdbcParamters = false;
36+
for (QueryStatement st: statements) {
37+
hasJdbcParamters = hasJdbcParamters || !st.getParams().isEmpty();
3838
}
39+
this.isPlainYQL = !hasJdbcParamters;
3940
}
4041

4142
public QueryType getType() {
4243
return type;
4344
}
4445

46+
public boolean isPlainYQL() {
47+
return isPlainYQL;
48+
}
49+
4550
public String getOriginSQL() {
4651
return originSQL;
4752
}
@@ -50,42 +55,36 @@ public List<QueryStatement> getStatements() {
5055
return statements;
5156
}
5257

53-
public boolean hasFreeParams() {
54-
return !paramNames.isEmpty();
55-
}
56-
57-
public List<String> getFreeParams() {
58-
return paramNames;
59-
}
60-
6158
public String withParams(Params params) throws SQLException {
62-
if (paramNames.isEmpty()) {
59+
if (isPlainYQL) {
6360
return preparedYQL;
6461
}
6562

6663
if (params == null) {
67-
if (!paramNames.isEmpty() && isAutoDeclare) {
64+
if (isAutoDeclare) {
65+
int paramCount = statements.stream().mapToInt(st -> st.getParams().size()).sum();
6866
// Comment in place where must be declare section
69-
return "-- DECLARE " + paramNames.size() + " PARAMETERS\n" + preparedYQL;
67+
return "-- DECLARE " + paramCount + " PARAMETERS\n" + preparedYQL;
7068
}
7169
return preparedYQL;
7270
}
7371

7472
StringBuilder yql = new StringBuilder();
7573
Map<String, Value<?>> values = params.values();
76-
for (int idx = 0; idx < paramNames.size(); idx += 1) {
77-
String prm = paramNames.get(idx);
78-
if (!values.containsKey(prm)) {
79-
throw new SQLDataException(YdbConst.MISSING_VALUE_FOR_PARAMETER + prm);
80-
}
81-
82-
if (isAutoDeclare) {
83-
String prmType = values.get(prm).getType().toString();
84-
yql.append("DECLARE ")
85-
.append(prm)
86-
.append(" AS ")
87-
.append(prmType)
88-
.append(";\n");
74+
for (QueryStatement st: statements) {
75+
for (ParamDescription prm: st.getParams()) {
76+
if (!values.containsKey(prm.name())) {
77+
throw new SQLDataException(YdbConst.MISSING_VALUE_FOR_PARAMETER + prm);
78+
}
79+
80+
if (isAutoDeclare) {
81+
String prmType = values.get(prm.name()).getType().toString();
82+
yql.append("DECLARE ")
83+
.append(prm.name())
84+
.append(" AS ")
85+
.append(prmType)
86+
.append(";\n");
87+
}
8988
}
9089
}
9190

jdbc/src/main/java/tech/ydb/jdbc/query/YdbQueryParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public String parseSQL(String origin) throws SQLException {
100100
i++; // make sure the coming ? is not treated as a bind
101101
} else {
102102
String binded = argNameGenerator.createArgName(origin);
103-
currStatement.addParamName(binded);
103+
currStatement.addParameter(binded, null);
104104
parsed.append(binded);
105105
}
106106
fragmentStart = i + 1;

jdbc/src/main/java/tech/ydb/jdbc/query/params/BatchedParams.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515

1616
import tech.ydb.jdbc.YdbConst;
1717
import tech.ydb.jdbc.common.TypeDescription;
18-
import tech.ydb.jdbc.query.JdbcParams;
18+
import tech.ydb.jdbc.query.ParamDescription;
19+
import tech.ydb.jdbc.query.YdbPreparedParams;
1920
import tech.ydb.table.query.Params;
2021
import tech.ydb.table.values.ListType;
2122
import tech.ydb.table.values.ListValue;
@@ -28,7 +29,7 @@
2829
*
2930
* @author Aleksandr Gorshenin
3031
*/
31-
public class BatchedParams implements JdbcParams {
32+
public class BatchedParams implements YdbPreparedParams {
3233
private final String batchParamName;
3334
private final Map<String, ParamDescription> paramsByName;
3435
private final ParamDescription[] params;
@@ -53,7 +54,7 @@ private BatchedParams(String listName, StructType structType) {
5354
if (types.containsKey(indexedName)) {
5455
String displayName = YdbConst.VARIABLE_PARAMETER_PREFIX + indexedName;
5556
TypeDescription typeDesc = TypeDescription.of(types.get(indexedName));
56-
ParamDescription paramDesc = new ParamDescription(idx, indexedName, displayName, typeDesc);
57+
ParamDescription paramDesc = new ParamDescription(indexedName, displayName, typeDesc);
5758

5859
params[idx] = paramDesc;
5960
paramsByName.put(indexedName, paramDesc);
@@ -75,7 +76,7 @@ private BatchedParams(String listName, StructType structType) {
7576

7677
String displayName = YdbConst.VARIABLE_PARAMETER_PREFIX + param;
7778
TypeDescription typeDesc = TypeDescription.of(types.get(param));
78-
ParamDescription paramDesc = new ParamDescription(idx, param, displayName, typeDesc);
79+
ParamDescription paramDesc = new ParamDescription(param, displayName, typeDesc);
7980

8081
params[idx] = paramDesc;
8182
paramsByName.put(param, paramDesc);
@@ -147,7 +148,7 @@ public void setParam(int index, Object obj, Type type) throws SQLException {
147148
throw new SQLException(YdbConst.PARAMETER_NUMBER_NOT_FOUND + index);
148149
}
149150
ParamDescription desc = params[index - 1];
150-
Value<?> value = desc.getValue(obj);
151+
Value<?> value = ValueFactory.readValue(desc.displayName(), obj, desc.type());
151152
currentValues.put(desc.name(), value);
152153
}
153154

@@ -157,7 +158,7 @@ public void setParam(String name, Object obj, Type type) throws SQLException {
157158
throw new SQLException(YdbConst.PARAMETER_NOT_FOUND + name);
158159
}
159160
ParamDescription desc = paramsByName.get(name);
160-
Value<?> value = desc.getValue(obj);
161+
Value<?> value = ValueFactory.readValue(desc.displayName(), obj, desc.type());
161162
currentValues.put(desc.name(), value);
162163
}
163164

0 commit comments

Comments
 (0)