Skip to content

Commit 7e1b9f1

Browse files
committed
Update implementation of JdbcPrm
1 parent 5dcc992 commit 7e1b9f1

File tree

8 files changed

+223
-148
lines changed

8 files changed

+223
-148
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
import java.util.ArrayList;
55
import java.util.List;
6+
import java.util.function.Supplier;
67

7-
import tech.ydb.jdbc.query.params.JdbcParameter;
8+
import tech.ydb.jdbc.query.params.JdbcPrm;
89

910

1011
/**
@@ -14,7 +15,7 @@
1415
public class QueryStatement {
1516
private final QueryType queryType;
1617
private final QueryCmd command;
17-
private final List<JdbcParameter> parameters = new ArrayList<>();
18+
private final List<Supplier<JdbcPrm>> parameters = new ArrayList<>();
1819
private boolean hasReturinng = false;
1920

2021
public QueryStatement(QueryType custom, QueryType baseType, QueryCmd command) {
@@ -30,11 +31,11 @@ public QueryCmd getCmd() {
3031
return command;
3132
}
3233

33-
public List<JdbcParameter> getParams() {
34+
public List<Supplier<JdbcPrm>> getParams() {
3435
return parameters;
3536
}
3637

37-
public void addParameter(JdbcParameter prm) {
38+
public void addParameter(Supplier<JdbcPrm> prm) {
3839
this.parameters.add(prm);
3940
}
4041

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

Lines changed: 4 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
package tech.ydb.jdbc.query;
22

33

4-
import java.sql.SQLDataException;
54
import java.sql.SQLException;
65
import java.sql.SQLFeatureNotSupportedException;
76
import java.util.ArrayList;
87
import java.util.List;
9-
import java.util.Map;
108

119
import tech.ydb.jdbc.YdbConst;
12-
import tech.ydb.jdbc.common.TypeDescription;
13-
import tech.ydb.jdbc.query.params.JdbcParameter;
14-
import tech.ydb.table.values.PrimitiveType;
15-
import tech.ydb.table.values.Value;
10+
import tech.ydb.jdbc.query.params.SimpleJdbcPrm;
11+
import tech.ydb.jdbc.query.params.UInt64JdbcPrm;
1612

1713

1814
/**
@@ -121,7 +117,7 @@ public String parseSQL() throws SQLException {
121117
i++; // make sure the coming ? is not treated as a bind
122118
} else {
123119
String name = nextJdbcPrmName();
124-
statement.addParameter(new SimplePrm(name));
120+
statement.addParameter(SimpleJdbcPrm.withName(name));
125121
parsed.append(name);
126122
batcher.readParameter();
127123
}
@@ -301,7 +297,7 @@ private int parseOffsetLimitParameter(char[] query, int offset, QueryStatement s
301297
String name = nextJdbcPrmName();
302298
parsed.append(query, start, offset - start);
303299
parsed.append(name);
304-
st.addParameter(new ForcedTypePrm(name, TypeDescription.of(PrimitiveType.Uint64)));
300+
st.addParameter(UInt64JdbcPrm.withName(name));
305301
return offset + 1;
306302
case '-': // possibly -- style comment
307303
offset = parseLineComment(query, offset);
@@ -596,59 +592,4 @@ private static boolean parseInKeyword(char[] query, int offset, int length) {
596592
return (query[offset] | 32) == 'i'
597593
&& (query[offset + 1] | 32) == 'n';
598594
}
599-
600-
private static class SimplePrm implements JdbcParameter {
601-
private final String name;
602-
603-
SimplePrm(String name) {
604-
this.name = name;
605-
}
606-
607-
@Override
608-
public String getName() {
609-
return this.name;
610-
}
611-
612-
@Override
613-
public String getDeclare(Map<String, Value<?>> values) throws SQLDataException {
614-
if (!values.containsKey(name)) {
615-
throw new SQLDataException(YdbConst.MISSING_VALUE_FOR_PARAMETER + name);
616-
}
617-
String prmType = values.get(name).getType().toString();
618-
return "DECLARE " + name + " AS " + prmType + ";\n";
619-
}
620-
621-
@Override
622-
public TypeDescription getForcedType() {
623-
return null;
624-
}
625-
}
626-
627-
private static class ForcedTypePrm implements JdbcParameter {
628-
private final String name;
629-
private final TypeDescription type;
630-
631-
ForcedTypePrm(String name, TypeDescription type) {
632-
this.name = name;
633-
this.type = type;
634-
}
635-
636-
@Override
637-
public String getName() {
638-
return this.name;
639-
}
640-
641-
@Override
642-
public String getDeclare(Map<String, Value<?>> values) throws SQLDataException {
643-
if (!values.containsKey(name)) {
644-
throw new SQLDataException(YdbConst.MISSING_VALUE_FOR_PARAMETER + name);
645-
}
646-
return "DECLARE " + name + " AS " + type.ydbType().toString() + ";\n";
647-
}
648-
649-
@Override
650-
public TypeDescription getForcedType() {
651-
return type;
652-
}
653-
}
654595
}

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

Lines changed: 52 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,14 @@
77
import java.util.HashMap;
88
import java.util.List;
99
import java.util.Map;
10-
import java.util.function.Function;
11-
import java.util.stream.Collectors;
10+
import java.util.function.Supplier;
1211

1312
import tech.ydb.jdbc.YdbConst;
1413
import tech.ydb.jdbc.common.TypeDescription;
15-
import tech.ydb.jdbc.impl.YdbTypes;
14+
import tech.ydb.jdbc.query.QueryStatement;
1615
import tech.ydb.jdbc.query.YdbPreparedQuery;
1716
import tech.ydb.jdbc.query.YdbQuery;
1817
import tech.ydb.table.query.Params;
19-
import tech.ydb.table.values.Type;
20-
import tech.ydb.table.values.Value;
2118

2219

2320
/**
@@ -27,22 +24,32 @@
2724
public class InMemoryQuery implements YdbPreparedQuery {
2825
private final String yql;
2926
private final boolean isAutoDeclare;
30-
private final JdbcParameter[] parameters;
31-
private final Map<String, JdbcParameter> parametersByName;
32-
private final Map<String, Value<?>> paramValues;
27+
private final JdbcPrm[] parameters;
28+
private final Map<String, JdbcPrm> parametersByName;
3329
private final List<Params> batchList;
3430

3531
public InMemoryQuery(YdbQuery query, boolean isAutoDeclare) {
3632
this.yql = query.getPreparedYql();
3733
this.isAutoDeclare = isAutoDeclare;
38-
this.parameters = query.getStatements().stream()
39-
.flatMap(s -> s.getParams().stream())
40-
.toArray(JdbcParameter[]::new);
41-
this.parametersByName = query.getStatements().stream()
42-
.flatMap(s -> s.getParams().stream())
43-
.collect(Collectors.toMap(JdbcParameter::getName, Function.identity()));
44-
45-
this.paramValues = new HashMap<>();
34+
35+
int paramtersCount = 0;
36+
for (QueryStatement st: query.getStatements()) {
37+
paramtersCount += st.getParams().size();
38+
}
39+
this.parameters = new JdbcPrm[paramtersCount];
40+
41+
int idx = 0;
42+
for (QueryStatement st: query.getStatements()) {
43+
for (Supplier<JdbcPrm> prm: st.getParams()) {
44+
parameters[idx++] = prm.get();
45+
}
46+
}
47+
48+
this.parametersByName = new HashMap<>();
49+
for (JdbcPrm prm: this.parameters) {
50+
parametersByName.put(prm.getName(), prm);
51+
}
52+
4653
this.batchList = new ArrayList<>();
4754
}
4855

@@ -53,18 +60,21 @@ public String getQueryText(Params prms) throws SQLException {
5360
}
5461

5562
StringBuilder query = new StringBuilder();
56-
Map<String, Value<?>> values = prms.values();
57-
for (JdbcParameter prm: parameters) {
58-
query.append(prm.getDeclare(values));
59-
}
63+
prms.values().forEach((name, value) -> query
64+
.append("DECLARE ")
65+
.append(name)
66+
.append(" AS ")
67+
.append(value.getType().toString())
68+
.append(";\n")
69+
);
6070

6171
query.append(yql);
6272
return query.toString();
6373
}
6474

6575
@Override
6676
public int parametersCount() {
67-
return paramValues.size();
77+
return parameters.length;
6878
}
6979

7080
@Override
@@ -73,9 +83,13 @@ public int batchSize() {
7383
}
7484

7585
@Override
76-
public void addBatch() {
77-
batchList.add(Params.copyOf(paramValues));
78-
paramValues.clear();
86+
public void addBatch() throws SQLException {
87+
Params batch = Params.create();
88+
for (JdbcPrm prm: parameters) {
89+
prm.copyToParams(batch);
90+
prm.reset();
91+
}
92+
batchList.add(batch);
7993
}
8094

8195
@Override
@@ -85,7 +99,9 @@ public void clearBatch() {
8599

86100
@Override
87101
public void clearParameters() {
88-
paramValues.clear();
102+
for (JdbcPrm prm: parameters) {
103+
prm.reset();
104+
}
89105
}
90106

91107
@Override
@@ -94,8 +110,12 @@ public List<Params> getBatchParams() {
94110
}
95111

96112
@Override
97-
public Params getCurrentParams() {
98-
return Params.copyOf(paramValues);
113+
public Params getCurrentParams() throws SQLException {
114+
Params current = Params.create();
115+
for (JdbcPrm prm: parameters) {
116+
prm.copyToParams(current);
117+
}
118+
return current;
99119
}
100120

101121
@Override
@@ -111,17 +131,9 @@ public TypeDescription getDescription(int index) throws SQLException {
111131
if (index <= 0 || index > parameters.length) {
112132
throw new SQLException(YdbConst.PARAMETER_NUMBER_NOT_FOUND + index);
113133
}
114-
JdbcParameter p = parameters[index - 1];
115-
if (p.getForcedType() != null) {
116-
return p.getForcedType();
117-
}
118-
119-
Value<?> arg = paramValues.get(p.getName());
120-
if (arg != null) {
121-
return TypeDescription.of(arg.getType());
122-
}
123134

124-
return null;
135+
JdbcPrm p = parameters[index - 1];
136+
return p.getType();
125137
}
126138

127139
@Override
@@ -130,33 +142,15 @@ public void setParam(int index, Object obj, int sqlType) throws SQLException {
130142
throw new SQLException(YdbConst.PARAMETER_NUMBER_NOT_FOUND + index);
131143
}
132144

133-
setParam(parameters[index - 1], obj, sqlType);
145+
parameters[index - 1].setValue(obj, sqlType);
134146
}
135147

136148
@Override
137149
public void setParam(String name, Object obj, int sqlType) throws SQLException {
138-
JdbcParameter param = parametersByName.get(name);
150+
JdbcPrm param = parametersByName.get(name);
139151
if (param == null) {
140152
throw new SQLException(YdbConst.PARAMETER_NUMBER_NOT_FOUND + name);
141153
}
142-
setParam(param, obj, sqlType);
143-
}
144-
145-
private void setParam(JdbcParameter param, Object obj, int sqlType) throws SQLException {
146-
if (obj instanceof Value<?>) {
147-
paramValues.put(param.getName(), (Value<?>) obj);
148-
return;
149-
}
150-
151-
TypeDescription description = param.getForcedType();
152-
if (description == null) {
153-
Type type = YdbTypes.findType(obj, sqlType);
154-
if (type == null) {
155-
throw new SQLException(String.format(YdbConst.PARAMETER_TYPE_UNKNOWN, sqlType, obj));
156-
}
157-
description = TypeDescription.of(type);
158-
}
159-
160-
paramValues.put(param.getName(), ValueFactory.readValue(param.getName(), obj, description));
154+
param.setValue(obj, sqlType);
161155
}
162156
}

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

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package tech.ydb.jdbc.query.params;
2+
3+
4+
import java.sql.SQLException;
5+
6+
import tech.ydb.jdbc.common.TypeDescription;
7+
import tech.ydb.table.query.Params;
8+
9+
/**
10+
*
11+
* @author Aleksandr Gorshenin
12+
*/
13+
public interface JdbcPrm {
14+
String getName();
15+
TypeDescription getType();
16+
17+
void setValue(Object obj, int sqlType) throws SQLException;
18+
void copyToParams(Params params) throws SQLException;
19+
20+
void reset();
21+
}

0 commit comments

Comments
 (0)