Skip to content

Commit c57e1d8

Browse files
committed
Removed random access to ResultSet
1 parent 2d6a5ee commit c57e1d8

13 files changed

+121
-102
lines changed

jdbc/src/main/java/tech/ydb/jdbc/YdbStatement.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,6 @@ public interface YdbStatement extends Statement {
3535

3636
YdbValidator getValidator() throws SQLException;
3737

38-
/**
39-
* Cant return previous results sets after {@link #getMoreResults()} traverse,
40-
* in case previous rows were not removed by providing {@link Statement#CLOSE_ALL_RESULTS}
41-
* or {@link Statement#CLOSE_CURRENT_RESULT}
42-
*
43-
* @param resultSetIndex index
44-
* @return optional result (if traversed before) with {@link #getMoreResults()}
45-
* @throws SQLException when trying to get result set on closed connection
46-
*/
47-
YdbResultSet getResultSetAt(int resultSetIndex) throws SQLException;
48-
4938
@Override
5039
YdbResultSet executeQuery(String sql) throws SQLException;
5140

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

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

99
import tech.ydb.jdbc.YdbResultSet;
1010
import tech.ydb.jdbc.YdbStatement;
11-
import tech.ydb.jdbc.impl.FixedResultSetImpl;
11+
import tech.ydb.jdbc.impl.YdbQueryResult;
12+
import tech.ydb.jdbc.impl.YdbStaticResultSet;
1213
import tech.ydb.jdbc.query.QueryType;
1314
import tech.ydb.jdbc.query.YdbQuery;
1415
import tech.ydb.table.SessionRetryContext;
@@ -44,7 +45,7 @@ public YdbQueryResult executeSchemeQuery(YdbStatement statement, YdbQuery query)
4445
() -> retryCtx.supplyStatus(session -> session.executeSchemeQuery(yql, settings))
4546
);
4647

47-
return YdbQueryResult.fromResults(query, Collections.emptyList());
48+
return new StaticQueryResult(query, Collections.emptyList());
4849
}
4950

5051
@Override
@@ -58,7 +59,7 @@ public YdbQueryResult executeBulkUpsert(YdbStatement statement, YdbQuery query,
5859
() -> retryCtx.supplyStatus(session -> session.executeBulkUpsert(tablePath, rows))
5960
);
6061

61-
return YdbQueryResult.fromResults(query, Collections.emptyList());
62+
return new StaticQueryResult(query, Collections.emptyList());
6263
}
6364

6465
@Override
@@ -83,7 +84,7 @@ public YdbQueryResult executeScanQuery(YdbStatement statement, YdbQuery query, S
8384
})
8485
);
8586

86-
YdbResultSet rs = new FixedResultSetImpl(statement, ProtoValueReaders.forResultSets(resultSets));
87-
return YdbQueryResult.fromResults(query, Collections.singletonList(rs));
87+
YdbResultSet rs = new YdbStaticResultSet(statement, ProtoValueReaders.forResultSets(resultSets));
88+
return new StaticQueryResult(query, Collections.singletonList(rs));
8889
}
8990
}

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
import tech.ydb.jdbc.YdbResultSet;
1919
import tech.ydb.jdbc.YdbStatement;
2020
import tech.ydb.jdbc.exception.ExceptionFactory;
21-
import tech.ydb.jdbc.impl.FixedResultSetImpl;
21+
import tech.ydb.jdbc.impl.YdbQueryResult;
22+
import tech.ydb.jdbc.impl.YdbStaticResultSet;
2223
import tech.ydb.jdbc.query.QueryType;
2324
import tech.ydb.jdbc.query.YdbQuery;
2425
import tech.ydb.query.QueryClient;
@@ -222,8 +223,8 @@ public YdbQueryResult executeDataQuery(
222223
validator.addStatusIssues(result.getIssueList());
223224

224225
List<YdbResultSet> rsList = new ArrayList<>();
225-
result.forEach(rsr -> rsList.add(new FixedResultSetImpl(statement, rsr)));
226-
return YdbQueryResult.fromResults(query, rsList);
226+
result.forEach(rsr -> rsList.add(new YdbStaticResultSet(statement, rsr)));
227+
return new StaticQueryResult(query, rsList);
227228
} finally {
228229
if (!tx.isActive()) {
229230
cleanTx();
@@ -248,7 +249,7 @@ public YdbQueryResult executeSchemeQuery(YdbStatement statement, YdbQuery query)
248249
);
249250
}
250251

251-
return YdbQueryResult.fromResults(query, Collections.emptyList());
252+
return new StaticQueryResult(query, Collections.emptyList());
252253
}
253254

254255
@Override
@@ -274,7 +275,7 @@ public YdbQueryResult executeExplainQuery(YdbStatement statement, YdbQuery query
274275
throw new SQLException("No explain data");
275276
}
276277

277-
return YdbQueryResult.fromExplain(statement, res.getStats().getQueryAst(), res.getStats().getQueryPlan());
278+
return new StaticQueryResult(statement, res.getStats().getQueryAst(), res.getStats().getQueryPlan());
278279
}
279280
}
280281

jdbc/src/main/java/tech/ydb/jdbc/context/YdbQueryResult.java renamed to jdbc/src/main/java/tech/ydb/jdbc/context/StaticQueryResult.java

Lines changed: 45 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
import tech.ydb.jdbc.YdbResultSet;
1111
import tech.ydb.jdbc.YdbStatement;
1212
import tech.ydb.jdbc.common.FixedResultSetFactory;
13-
import tech.ydb.jdbc.impl.FixedResultSetImpl;
13+
import tech.ydb.jdbc.impl.YdbQueryResult;
14+
import tech.ydb.jdbc.impl.YdbStaticResultSet;
1415
import tech.ydb.jdbc.query.QueryStatement;
1516
import tech.ydb.jdbc.query.YdbQuery;
1617
import tech.ydb.table.result.ResultSetReader;
@@ -19,9 +20,7 @@
1920
*
2021
* @author Aleksandr Gorshenin
2122
*/
22-
public class YdbQueryResult {
23-
public static final YdbQueryResult EMPTY = new YdbQueryResult(null);
24-
23+
public class StaticQueryResult implements YdbQueryResult {
2524
private static final FixedResultSetFactory EXPLAIN_RS_FACTORY = FixedResultSetFactory.newBuilder()
2625
.addTextColumn(YdbConst.EXPLAIN_COLUMN_AST)
2726
.addTextColumn(YdbConst.EXPLAIN_COLUMN_PLAN)
@@ -49,15 +48,52 @@ private static class ExpressionResult {
4948
private final List<ExpressionResult> results;
5049
private int resultIndex;
5150

52-
YdbQueryResult(List<ExpressionResult> results) {
53-
this.results = results;
51+
public StaticQueryResult(YdbQuery query, List<YdbResultSet> list) {
52+
this.results = new ArrayList<>();
5453
this.resultIndex = 0;
54+
55+
int idx = 0;
56+
for (QueryStatement exp: query.getStatements()) {
57+
if (exp.isDDL()) {
58+
results.add(NO_UPDATED);
59+
continue;
60+
}
61+
if (exp.hasUpdateCount()) {
62+
results.add(HAS_UPDATED);
63+
continue;
64+
}
65+
66+
if (exp.hasResults() && idx < list.size()) {
67+
results.add(new ExpressionResult(list.get(idx)));
68+
idx++;
69+
}
70+
}
71+
72+
while (idx < list.size()) {
73+
results.add(new ExpressionResult(list.get(idx)));
74+
idx++;
75+
}
5576
}
5677

78+
public StaticQueryResult(YdbStatement statement, String ast, String plan) {
79+
ResultSetReader result = EXPLAIN_RS_FACTORY.createResultSet()
80+
.newRow()
81+
.withTextValue(YdbConst.EXPLAIN_COLUMN_AST, ast)
82+
.withTextValue(YdbConst.EXPLAIN_COLUMN_PLAN, plan)
83+
.build()
84+
.build();
85+
86+
YdbResultSet rs = new YdbStaticResultSet(statement, result);
87+
this.results = Collections.singletonList(new ExpressionResult(rs));
88+
this.resultIndex = 0;
89+
}
90+
91+
@Override
5792
public void close() {
5893
// nothing
5994
}
6095

96+
@Override
6197
public boolean hasResultSets() {
6298
if (results == null || resultIndex >= results.size()) {
6399
return false;
@@ -66,6 +102,7 @@ public boolean hasResultSets() {
66102
return results.get(resultIndex).resultSet != null;
67103
}
68104

105+
@Override
69106
public int getUpdateCount() {
70107
if (results == null || resultIndex >= results.size()) {
71108
return -1;
@@ -74,20 +111,15 @@ public int getUpdateCount() {
74111
return results.get(resultIndex).updateCount;
75112
}
76113

114+
@Override
77115
public YdbResultSet getCurrentResultSet() {
78116
if (results == null || resultIndex >= results.size()) {
79117
return null;
80118
}
81119
return results.get(resultIndex).resultSet;
82120
}
83121

84-
public YdbResultSet getResultSet(int index) {
85-
if (results == null || index < 0 || index >= results.size()) {
86-
return null;
87-
}
88-
return results.get(index).resultSet;
89-
}
90-
122+
@Override
91123
public boolean getMoreResults(int current) throws SQLException {
92124
if (results == null || resultIndex >= results.size()) {
93125
return false;
@@ -111,42 +143,4 @@ public boolean getMoreResults(int current) throws SQLException {
111143
resultIndex += 1;
112144
return hasResultSets();
113145
}
114-
115-
public static YdbQueryResult fromResults(YdbQuery query, List<YdbResultSet> rsList) {
116-
List<ExpressionResult> results = new ArrayList<>();
117-
int idx = 0;
118-
for (QueryStatement exp: query.getStatements()) {
119-
if (exp.isDDL()) {
120-
results.add(NO_UPDATED);
121-
continue;
122-
}
123-
if (exp.hasUpdateCount()) {
124-
results.add(HAS_UPDATED);
125-
continue;
126-
}
127-
128-
if (exp.hasResults() && idx < rsList.size()) {
129-
results.add(new ExpressionResult(rsList.get(idx)));
130-
idx++;
131-
}
132-
}
133-
134-
while (idx < rsList.size()) {
135-
results.add(new ExpressionResult(rsList.get(idx)));
136-
idx++;
137-
}
138-
139-
return new YdbQueryResult(results);
140-
}
141-
142-
public static YdbQueryResult fromExplain(YdbStatement statement, String ast, String plan) {
143-
ResultSetReader result = EXPLAIN_RS_FACTORY.createResultSet()
144-
.newRow()
145-
.withTextValue(YdbConst.EXPLAIN_COLUMN_AST, ast)
146-
.withTextValue(YdbConst.EXPLAIN_COLUMN_PLAN, plan)
147-
.build()
148-
.build();
149-
YdbResultSet rs = new FixedResultSetImpl(statement, result);
150-
return new YdbQueryResult(Collections.singletonList(new ExpressionResult(rs)));
151-
}
152146
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
import tech.ydb.jdbc.YdbResultSet;
1414
import tech.ydb.jdbc.YdbStatement;
1515
import tech.ydb.jdbc.exception.ExceptionFactory;
16-
import tech.ydb.jdbc.impl.FixedResultSetImpl;
16+
import tech.ydb.jdbc.impl.YdbQueryResult;
17+
import tech.ydb.jdbc.impl.YdbStaticResultSet;
1718
import tech.ydb.jdbc.query.QueryType;
1819
import tech.ydb.jdbc.query.YdbQuery;
1920
import tech.ydb.table.Session;
@@ -188,7 +189,7 @@ public YdbQueryResult executeExplainQuery(YdbStatement statement, YdbQuery query
188189
try (Session session = createNewTableSession(validator)) {
189190
String msg = QueryType.EXPLAIN_QUERY + " >>\n" + yql;
190191
ExplainDataQueryResult res = validator.call(msg, () -> session.explainDataQuery(yql, settings));
191-
return YdbQueryResult.fromExplain(statement, res.getQueryAst(), res.getQueryPlan());
192+
return new StaticQueryResult(statement, res.getQueryAst(), res.getQueryPlan());
192193
}
193194
}
194195

@@ -214,10 +215,10 @@ public YdbQueryResult executeDataQuery(YdbStatement statement, YdbQuery query, S
214215
throw new SQLException(msg);
215216
}
216217

217-
readers.add(new FixedResultSetImpl(statement, rs));
218+
readers.add(new YdbStaticResultSet(statement, rs));
218219
}
219220

220-
return YdbQueryResult.fromResults(query, readers);
221+
return new StaticQueryResult(query, readers);
221222
} catch (SQLException | RuntimeException ex) {
222223
updateState(tx.withRollback(session));
223224
throw ex;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import tech.ydb.jdbc.YdbConst;
66
import tech.ydb.jdbc.YdbStatement;
7+
import tech.ydb.jdbc.impl.YdbQueryResult;
78
import tech.ydb.jdbc.query.YdbQuery;
89
import tech.ydb.table.query.Params;
910
import tech.ydb.table.values.ListValue;

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import tech.ydb.jdbc.YdbResultSet;
1515
import tech.ydb.jdbc.YdbStatement;
1616
import tech.ydb.jdbc.context.QueryStat;
17+
import tech.ydb.jdbc.context.StaticQueryResult;
1718
import tech.ydb.jdbc.context.YdbContext;
18-
import tech.ydb.jdbc.context.YdbQueryResult;
1919
import tech.ydb.jdbc.context.YdbValidator;
2020
import tech.ydb.jdbc.query.YdbQuery;
2121
import tech.ydb.jdbc.settings.FakeTxMode;
@@ -130,12 +130,6 @@ public YdbResultSet getResultSet() throws SQLException {
130130
return state.getCurrentResultSet();
131131
}
132132

133-
@Override
134-
public YdbResultSet getResultSetAt(int resultSetIndex) throws SQLException {
135-
ensureOpened();
136-
return state.getResultSet(resultSetIndex);
137-
}
138-
139133
@Override
140134
public boolean getMoreResults(int current) throws SQLException {
141135
ensureOpened();
@@ -161,7 +155,7 @@ protected void cleanState() throws SQLException {
161155
state = YdbQueryResult.EMPTY;
162156
}
163157

164-
protected boolean updateState(YdbQueryResult result) {
158+
protected boolean updateState(YdbQueryResult result) throws SQLException {
165159
state = result == null ? YdbQueryResult.EMPTY : result;
166160
return state.hasResultSets();
167161
}
@@ -197,8 +191,8 @@ protected YdbQueryResult executeDataQuery(YdbQuery query, String yql, Params par
197191
YdbContext ctx = connection.getCtx();
198192
if (ctx.queryStatsEnabled()) {
199193
if (QueryStat.isPrint(yql)) {
200-
YdbResultSet rs = new FixedResultSetImpl(this, QueryStat.toResultSetReader(ctx.getQueryStats()));
201-
return YdbQueryResult.fromResults(query, Collections.singletonList(rs));
194+
YdbResultSet rs = new YdbStaticResultSet(this, QueryStat.toResultSetReader(ctx.getQueryStats()));
195+
return new StaticQueryResult(query, Collections.singletonList(rs));
202196
}
203197
if (QueryStat.isReset(yql)) {
204198
getConnection().getCtx().resetQueryStats();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,12 +1369,12 @@ private TableDescription describeTable(String table) throws SQLException {
13691369

13701370
private ResultSet emptyResultSet(FixedResultSetFactory factory) {
13711371
YdbStatementImpl statement = new YdbStatementImpl(connection, ResultSet.TYPE_SCROLL_INSENSITIVE);
1372-
return new FixedResultSetImpl(statement, factory.createResultSet().build());
1372+
return new YdbStaticResultSet(statement, factory.createResultSet().build());
13731373
}
13741374

13751375
private ResultSet resultSet(ResultSetReader rsReader) {
13761376
YdbStatementImpl statement = new YdbStatementImpl(connection, ResultSet.TYPE_SCROLL_INSENSITIVE);
1377-
return new FixedResultSetImpl(statement, rsReader);
1377+
return new YdbStaticResultSet(statement, rsReader);
13781378
}
13791379

13801380
private boolean isMatchedCatalog(String catalog) {

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import tech.ydb.jdbc.YdbPreparedStatement;
3232
import tech.ydb.jdbc.YdbResultSet;
3333
import tech.ydb.jdbc.common.MappingSetters;
34-
import tech.ydb.jdbc.context.YdbQueryResult;
3534
import tech.ydb.jdbc.query.QueryType;
3635
import tech.ydb.jdbc.query.YdbPreparedQuery;
3736
import tech.ydb.jdbc.query.YdbQuery;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package tech.ydb.jdbc.impl;
2+
3+
import java.sql.SQLException;
4+
5+
import tech.ydb.jdbc.YdbResultSet;
6+
7+
/**
8+
*
9+
* @author Aleksandr Gorshenin
10+
*/
11+
public interface YdbQueryResult {
12+
YdbQueryResult EMPTY = new YdbQueryResult() {
13+
@Override
14+
public int getUpdateCount() throws SQLException {
15+
return -1;
16+
}
17+
18+
@Override
19+
public YdbResultSet getCurrentResultSet() throws SQLException {
20+
return null;
21+
}
22+
23+
@Override
24+
public boolean hasResultSets() throws SQLException {
25+
return false;
26+
}
27+
28+
@Override
29+
public boolean getMoreResults(int current) throws SQLException {
30+
return false;
31+
}
32+
33+
@Override
34+
public void close() throws SQLException { }
35+
};
36+
37+
int getUpdateCount() throws SQLException;
38+
YdbResultSet getCurrentResultSet() throws SQLException;
39+
40+
boolean hasResultSets() throws SQLException;
41+
boolean getMoreResults(int current) throws SQLException;
42+
43+
void close() throws SQLException;
44+
}

0 commit comments

Comments
 (0)