Skip to content

Commit aae2e3f

Browse files
authored
Updated QueryService implementation (#55)
2 parents cdc77d0 + a9cc7dc commit aae2e3f

File tree

9 files changed

+80
-25
lines changed

9 files changed

+80
-25
lines changed

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

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

99
import tech.ydb.jdbc.context.YdbContext;
1010
import tech.ydb.jdbc.context.YdbValidator;
11+
import tech.ydb.jdbc.query.ExplainedQuery;
1112
import tech.ydb.jdbc.query.YdbQuery;
12-
import tech.ydb.table.query.ExplainDataQueryResult;
1313
import tech.ydb.table.query.Params;
1414
import tech.ydb.table.result.ResultSetReader;
1515

@@ -76,7 +76,7 @@ List<ResultSetReader> executeDataQuery(YdbQuery query, YdbValidator validator,
7676
* and {@link YdbConst#EXPLAIN_COLUMN_PLAN}
7777
* @throws SQLException if query cannot be explained
7878
*/
79-
ExplainDataQueryResult executeExplainQuery(YdbQuery query, YdbValidator validator) throws SQLException;
79+
ExplainedQuery executeExplainQuery(YdbQuery query, YdbValidator validator) throws SQLException;
8080

8181
@Override
8282
YdbDatabaseMetaData getMetaData() throws SQLException;

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

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,11 @@
1212
import tech.ydb.jdbc.query.YdbQuery;
1313
import tech.ydb.table.Session;
1414
import tech.ydb.table.TableClient;
15-
import tech.ydb.table.query.ExplainDataQueryResult;
1615
import tech.ydb.table.query.Params;
1716
import tech.ydb.table.result.ResultSetReader;
1817
import tech.ydb.table.result.impl.ProtoValueReaders;
1918
import tech.ydb.table.settings.ExecuteScanQuerySettings;
2019
import tech.ydb.table.settings.ExecuteSchemeQuerySettings;
21-
import tech.ydb.table.settings.ExplainDataQuerySettings;
2220

2321
/**
2422
*
@@ -54,19 +52,6 @@ public void executeSchemeQuery(YdbContext ctx, YdbValidator validator, YdbQuery
5452
}
5553
}
5654

57-
@Override
58-
public ExplainDataQueryResult executeExplainQuery(YdbContext ctx, YdbValidator validator, YdbQuery query)
59-
throws SQLException {
60-
ensureOpened();
61-
62-
String yql = query.getYqlQuery(null);
63-
ExplainDataQuerySettings settings = ctx.withDefaultTimeout(new ExplainDataQuerySettings());
64-
try (Session session = createNewTableSession(validator)) {
65-
String msg = QueryType.EXPLAIN_QUERY + " >>\n" + yql;
66-
return validator.call(msg, () -> session.explainDataQuery(yql, settings));
67-
}
68-
}
69-
7055
@Override
7156
public ResultSetReader executeScanQuery(YdbContext ctx, YdbValidator validator, YdbQuery query, Params params)
7257
throws SQLException {

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,18 @@
1515
import tech.ydb.core.UnexpectedResultException;
1616
import tech.ydb.jdbc.YdbConst;
1717
import tech.ydb.jdbc.exception.ExceptionFactory;
18+
import tech.ydb.jdbc.query.ExplainedQuery;
1819
import tech.ydb.jdbc.query.QueryType;
1920
import tech.ydb.jdbc.query.YdbQuery;
2021
import tech.ydb.query.QueryClient;
2122
import tech.ydb.query.QuerySession;
2223
import tech.ydb.query.QueryStream;
2324
import tech.ydb.query.QueryTransaction;
25+
import tech.ydb.query.result.QueryInfo;
2426
import tech.ydb.query.result.QueryResultPart;
2527
import tech.ydb.query.settings.CommitTransactionSettings;
2628
import tech.ydb.query.settings.ExecuteQuerySettings;
29+
import tech.ydb.query.settings.QueryExecMode;
2730
import tech.ydb.query.settings.RollbackTransactionSettings;
2831
import tech.ydb.query.tools.QueryReader;
2932
import tech.ydb.table.query.Params;
@@ -227,6 +230,8 @@ public List<ResultSetReader> executeDataQuery(
227230

228231
@Override
229232
public void executeSchemeQuery(YdbContext ctx, YdbValidator validator, YdbQuery query) throws SQLException {
233+
ensureOpened();
234+
230235
// Scheme query does not affect transactions or result sets
231236
ExecuteQuerySettings settings = ctx.withRequestTimeout(ExecuteQuerySettings.newBuilder()).build();
232237
final String yql = query.getYqlQuery(null);
@@ -239,6 +244,30 @@ public void executeSchemeQuery(YdbContext ctx, YdbValidator validator, YdbQuery
239244
}
240245
}
241246

247+
@Override
248+
public ExplainedQuery executeExplainQuery(YdbContext ctx, YdbValidator validator, YdbQuery query)
249+
throws SQLException {
250+
ensureOpened();
251+
252+
// Scheme query does not affect transactions or result sets
253+
ExecuteQuerySettings settings = ctx.withRequestTimeout(ExecuteQuerySettings.newBuilder())
254+
.withExecMode(QueryExecMode.EXPLAIN)
255+
.build();
256+
final String yql = query.getYqlQuery(null);
257+
258+
try (QuerySession session = createNewQuerySession(validator)) {
259+
QueryInfo res = validator.call(QueryType.EXPLAIN_QUERY + " >>\n" + yql, () -> session
260+
.createQuery(yql, TxMode.NONE, Params.empty(), settings)
261+
.execute(new IssueHandler(validator))
262+
);
263+
264+
if (!res.hasStats()) {
265+
throw new SQLException("No explain data");
266+
}
267+
return new ExplainedQuery(res.getStats().getQueryAst(), res.getStats().getQueryPlan());
268+
}
269+
}
270+
242271
private class IssueHandler implements QueryStream.PartsHandler {
243272
private final YdbValidator validator;
244273

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,17 @@
88
import java.util.List;
99

1010
import tech.ydb.jdbc.YdbConst;
11+
import tech.ydb.jdbc.query.ExplainedQuery;
1112
import tech.ydb.jdbc.query.QueryType;
1213
import tech.ydb.jdbc.query.YdbQuery;
1314
import tech.ydb.table.Session;
1415
import tech.ydb.table.query.DataQueryResult;
16+
import tech.ydb.table.query.ExplainDataQueryResult;
1517
import tech.ydb.table.query.Params;
1618
import tech.ydb.table.result.ResultSetReader;
1719
import tech.ydb.table.settings.CommitTxSettings;
1820
import tech.ydb.table.settings.ExecuteDataQuerySettings;
21+
import tech.ydb.table.settings.ExplainDataQuerySettings;
1922
import tech.ydb.table.settings.KeepAliveSessionSettings;
2023
import tech.ydb.table.settings.RollbackTxSettings;
2124
import tech.ydb.table.transaction.TxControl;
@@ -151,6 +154,20 @@ private ExecuteDataQuerySettings dataQuerySettings(long timeout, boolean keepInC
151154
return settings;
152155
}
153156

157+
@Override
158+
public ExplainedQuery executeExplainQuery(YdbContext ctx, YdbValidator validator, YdbQuery query)
159+
throws SQLException {
160+
ensureOpened();
161+
162+
String yql = query.getYqlQuery(null);
163+
ExplainDataQuerySettings settings = ctx.withDefaultTimeout(new ExplainDataQuerySettings());
164+
try (Session session = createNewTableSession(validator)) {
165+
String msg = QueryType.EXPLAIN_QUERY + " >>\n" + yql;
166+
ExplainDataQueryResult res = validator.call(msg, () -> session.explainDataQuery(yql, settings));
167+
return new ExplainedQuery(res.getQueryAst(), res.getQueryPlan());
168+
}
169+
}
170+
154171
@Override
155172
public List<ResultSetReader> executeDataQuery(
156173
YdbContext ctx, YdbValidator validator, YdbQuery query, long timeout, boolean keepInCache, Params params

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ public YdbOperationProperties getOperationProperties() {
154154
public void close() {
155155
try {
156156
schemeClient.close();
157+
queryClient.close();
157158
tableClient.close();
158159
grpcTransport.close();
159160
} catch (Exception e) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import java.util.List;
55

66
import tech.ydb.jdbc.YdbConst;
7+
import tech.ydb.jdbc.query.ExplainedQuery;
78
import tech.ydb.jdbc.query.YdbQuery;
8-
import tech.ydb.table.query.ExplainDataQueryResult;
99
import tech.ydb.table.query.Params;
1010
import tech.ydb.table.result.ResultSetReader;
1111

@@ -41,7 +41,7 @@ List<ResultSetReader> executeDataQuery(YdbContext ctx, YdbValidator validator, Y
4141
ResultSetReader executeScanQuery(YdbContext ctx, YdbValidator validator, YdbQuery query, Params params)
4242
throws SQLException;
4343

44-
ExplainDataQueryResult executeExplainQuery(YdbContext ctx, YdbValidator validator, YdbQuery query)
44+
ExplainedQuery executeExplainQuery(YdbContext ctx, YdbValidator validator, YdbQuery query)
4545
throws SQLException;
4646

4747
void commit(YdbContext ctx, YdbValidator validator) throws SQLException;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
import tech.ydb.jdbc.YdbStatement;
1818
import tech.ydb.jdbc.common.FixedResultSetFactory;
1919
import tech.ydb.jdbc.context.YdbValidator;
20+
import tech.ydb.jdbc.query.ExplainedQuery;
2021
import tech.ydb.jdbc.query.YdbExpression;
2122
import tech.ydb.jdbc.query.YdbQuery;
2223
import tech.ydb.jdbc.settings.YdbOperationProperties;
23-
import tech.ydb.table.query.ExplainDataQueryResult;
2424
import tech.ydb.table.query.Params;
2525
import tech.ydb.table.result.ResultSetReader;
2626

@@ -177,12 +177,12 @@ protected List<YdbResult> executeSchemeQuery(YdbQuery query) throws SQLException
177177
}
178178

179179
protected List<YdbResult> executeExplainQuery(YdbQuery query) throws SQLException {
180-
ExplainDataQueryResult explainDataQuery = connection.executeExplainQuery(query, validator);
180+
ExplainedQuery explainedQuery = connection.executeExplainQuery(query, validator);
181181

182182
ResultSetReader result = EXPLAIN_RS_FACTORY.createResultSet()
183183
.newRow()
184-
.withTextValue(YdbConst.EXPLAIN_COLUMN_AST, explainDataQuery.getQueryAst())
185-
.withTextValue(YdbConst.EXPLAIN_COLUMN_PLAN, explainDataQuery.getQueryPlan())
184+
.withTextValue(YdbConst.EXPLAIN_COLUMN_AST, explainedQuery.getAst())
185+
.withTextValue(YdbConst.EXPLAIN_COLUMN_PLAN, explainedQuery.getPlan())
186186
.build()
187187
.build();
188188

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@
3131
import tech.ydb.jdbc.context.YdbContext;
3232
import tech.ydb.jdbc.context.YdbExecutor;
3333
import tech.ydb.jdbc.context.YdbValidator;
34+
import tech.ydb.jdbc.query.ExplainedQuery;
3435
import tech.ydb.jdbc.query.JdbcParams;
3536
import tech.ydb.jdbc.query.QueryType;
3637
import tech.ydb.jdbc.query.YdbQuery;
3738
import tech.ydb.jdbc.settings.FakeTxMode;
3839
import tech.ydb.jdbc.settings.YdbOperationProperties;
39-
import tech.ydb.table.query.ExplainDataQueryResult;
4040
import tech.ydb.table.query.Params;
4141
import tech.ydb.table.result.ResultSetReader;
4242

@@ -232,7 +232,7 @@ public ResultSetReader executeScanQuery(YdbQuery query, YdbValidator validator,
232232
}
233233

234234
@Override
235-
public ExplainDataQueryResult executeExplainQuery(YdbQuery query, YdbValidator validator) throws SQLException {
235+
public ExplainedQuery executeExplainQuery(YdbQuery query, YdbValidator validator) throws SQLException {
236236
return executor.executeExplainQuery(ctx, validator, query);
237237
}
238238

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package tech.ydb.jdbc.query;
2+
3+
/**
4+
*
5+
* @author Aleksandr Gorshenin
6+
*/
7+
public class ExplainedQuery {
8+
private final String ast;
9+
private final String plan;
10+
11+
public ExplainedQuery(String ast, String plan) {
12+
this.ast = ast;
13+
this.plan = plan;
14+
}
15+
16+
public String getAst() {
17+
return this.ast;
18+
}
19+
20+
public String getPlan() {
21+
return this.plan;
22+
}
23+
}

0 commit comments

Comments
 (0)