Skip to content

Commit

Permalink
Added separate implementation of explainQuery for QueryService
Browse files Browse the repository at this point in the history
  • Loading branch information
alex268 committed Jul 10, 2024
1 parent 1f73cb2 commit a9cc7dc
Show file tree
Hide file tree
Showing 8 changed files with 79 additions and 25 deletions.
4 changes: 2 additions & 2 deletions jdbc/src/main/java/tech/ydb/jdbc/YdbConnection.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@

import tech.ydb.jdbc.context.YdbContext;
import tech.ydb.jdbc.context.YdbValidator;
import tech.ydb.jdbc.query.ExplainedQuery;
import tech.ydb.jdbc.query.YdbQuery;
import tech.ydb.table.query.ExplainDataQueryResult;
import tech.ydb.table.query.Params;
import tech.ydb.table.result.ResultSetReader;

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

@Override
YdbDatabaseMetaData getMetaData() throws SQLException;
Expand Down
15 changes: 0 additions & 15 deletions jdbc/src/main/java/tech/ydb/jdbc/context/BaseYdbExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,11 @@
import tech.ydb.jdbc.query.YdbQuery;
import tech.ydb.table.Session;
import tech.ydb.table.TableClient;
import tech.ydb.table.query.ExplainDataQueryResult;
import tech.ydb.table.query.Params;
import tech.ydb.table.result.ResultSetReader;
import tech.ydb.table.result.impl.ProtoValueReaders;
import tech.ydb.table.settings.ExecuteScanQuerySettings;
import tech.ydb.table.settings.ExecuteSchemeQuerySettings;
import tech.ydb.table.settings.ExplainDataQuerySettings;

/**
*
Expand Down Expand Up @@ -54,19 +52,6 @@ public void executeSchemeQuery(YdbContext ctx, YdbValidator validator, YdbQuery
}
}

@Override
public ExplainDataQueryResult executeExplainQuery(YdbContext ctx, YdbValidator validator, YdbQuery query)
throws SQLException {
ensureOpened();

String yql = query.getYqlQuery(null);
ExplainDataQuerySettings settings = ctx.withDefaultTimeout(new ExplainDataQuerySettings());
try (Session session = createNewTableSession(validator)) {
String msg = QueryType.EXPLAIN_QUERY + " >>\n" + yql;
return validator.call(msg, () -> session.explainDataQuery(yql, settings));
}
}

@Override
public ResultSetReader executeScanQuery(YdbContext ctx, YdbValidator validator, YdbQuery query, Params params)
throws SQLException {
Expand Down
29 changes: 29 additions & 0 deletions jdbc/src/main/java/tech/ydb/jdbc/context/QueryServiceExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,18 @@
import tech.ydb.core.UnexpectedResultException;
import tech.ydb.jdbc.YdbConst;
import tech.ydb.jdbc.exception.ExceptionFactory;
import tech.ydb.jdbc.query.ExplainedQuery;
import tech.ydb.jdbc.query.QueryType;
import tech.ydb.jdbc.query.YdbQuery;
import tech.ydb.query.QueryClient;
import tech.ydb.query.QuerySession;
import tech.ydb.query.QueryStream;
import tech.ydb.query.QueryTransaction;
import tech.ydb.query.result.QueryInfo;
import tech.ydb.query.result.QueryResultPart;
import tech.ydb.query.settings.CommitTransactionSettings;
import tech.ydb.query.settings.ExecuteQuerySettings;
import tech.ydb.query.settings.QueryExecMode;
import tech.ydb.query.settings.RollbackTransactionSettings;
import tech.ydb.query.tools.QueryReader;
import tech.ydb.table.query.Params;
Expand Down Expand Up @@ -227,6 +230,8 @@ public List<ResultSetReader> executeDataQuery(

@Override
public void executeSchemeQuery(YdbContext ctx, YdbValidator validator, YdbQuery query) throws SQLException {
ensureOpened();

// Scheme query does not affect transactions or result sets
ExecuteQuerySettings settings = ctx.withRequestTimeout(ExecuteQuerySettings.newBuilder()).build();
final String yql = query.getYqlQuery(null);
Expand All @@ -239,6 +244,30 @@ public void executeSchemeQuery(YdbContext ctx, YdbValidator validator, YdbQuery
}
}

@Override
public ExplainedQuery executeExplainQuery(YdbContext ctx, YdbValidator validator, YdbQuery query)
throws SQLException {
ensureOpened();

// Scheme query does not affect transactions or result sets
ExecuteQuerySettings settings = ctx.withRequestTimeout(ExecuteQuerySettings.newBuilder())
.withExecMode(QueryExecMode.EXPLAIN)
.build();
final String yql = query.getYqlQuery(null);

try (QuerySession session = createNewQuerySession(validator)) {
QueryInfo res = validator.call(QueryType.EXPLAIN_QUERY + " >>\n" + yql, () -> session
.createQuery(yql, TxMode.NONE, Params.empty(), settings)
.execute(new IssueHandler(validator))
);

if (!res.hasStats()) {
throw new SQLException("No explain data");
}
return new ExplainedQuery(res.getStats().getQueryAst(), res.getStats().getQueryPlan());
}
}

private class IssueHandler implements QueryStream.PartsHandler {
private final YdbValidator validator;

Expand Down
17 changes: 17 additions & 0 deletions jdbc/src/main/java/tech/ydb/jdbc/context/TableServiceExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,17 @@
import java.util.List;

import tech.ydb.jdbc.YdbConst;
import tech.ydb.jdbc.query.ExplainedQuery;
import tech.ydb.jdbc.query.QueryType;
import tech.ydb.jdbc.query.YdbQuery;
import tech.ydb.table.Session;
import tech.ydb.table.query.DataQueryResult;
import tech.ydb.table.query.ExplainDataQueryResult;
import tech.ydb.table.query.Params;
import tech.ydb.table.result.ResultSetReader;
import tech.ydb.table.settings.CommitTxSettings;
import tech.ydb.table.settings.ExecuteDataQuerySettings;
import tech.ydb.table.settings.ExplainDataQuerySettings;
import tech.ydb.table.settings.KeepAliveSessionSettings;
import tech.ydb.table.settings.RollbackTxSettings;
import tech.ydb.table.transaction.TxControl;
Expand Down Expand Up @@ -151,6 +154,20 @@ private ExecuteDataQuerySettings dataQuerySettings(long timeout, boolean keepInC
return settings;
}

@Override
public ExplainedQuery executeExplainQuery(YdbContext ctx, YdbValidator validator, YdbQuery query)
throws SQLException {
ensureOpened();

String yql = query.getYqlQuery(null);
ExplainDataQuerySettings settings = ctx.withDefaultTimeout(new ExplainDataQuerySettings());
try (Session session = createNewTableSession(validator)) {
String msg = QueryType.EXPLAIN_QUERY + " >>\n" + yql;
ExplainDataQueryResult res = validator.call(msg, () -> session.explainDataQuery(yql, settings));
return new ExplainedQuery(res.getQueryAst(), res.getQueryPlan());
}
}

@Override
public List<ResultSetReader> executeDataQuery(
YdbContext ctx, YdbValidator validator, YdbQuery query, long timeout, boolean keepInCache, Params params
Expand Down
4 changes: 2 additions & 2 deletions jdbc/src/main/java/tech/ydb/jdbc/context/YdbExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import java.util.List;

import tech.ydb.jdbc.YdbConst;
import tech.ydb.jdbc.query.ExplainedQuery;
import tech.ydb.jdbc.query.YdbQuery;
import tech.ydb.table.query.ExplainDataQueryResult;
import tech.ydb.table.query.Params;
import tech.ydb.table.result.ResultSetReader;

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

ExplainDataQueryResult executeExplainQuery(YdbContext ctx, YdbValidator validator, YdbQuery query)
ExplainedQuery executeExplainQuery(YdbContext ctx, YdbValidator validator, YdbQuery query)
throws SQLException;

void commit(YdbContext ctx, YdbValidator validator) throws SQLException;
Expand Down
8 changes: 4 additions & 4 deletions jdbc/src/main/java/tech/ydb/jdbc/impl/BaseYdbStatement.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
import tech.ydb.jdbc.YdbStatement;
import tech.ydb.jdbc.common.FixedResultSetFactory;
import tech.ydb.jdbc.context.YdbValidator;
import tech.ydb.jdbc.query.ExplainedQuery;
import tech.ydb.jdbc.query.YdbExpression;
import tech.ydb.jdbc.query.YdbQuery;
import tech.ydb.jdbc.settings.YdbOperationProperties;
import tech.ydb.table.query.ExplainDataQueryResult;
import tech.ydb.table.query.Params;
import tech.ydb.table.result.ResultSetReader;

Expand Down Expand Up @@ -177,12 +177,12 @@ protected List<YdbResult> executeSchemeQuery(YdbQuery query) throws SQLException
}

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

ResultSetReader result = EXPLAIN_RS_FACTORY.createResultSet()
.newRow()
.withTextValue(YdbConst.EXPLAIN_COLUMN_AST, explainDataQuery.getQueryAst())
.withTextValue(YdbConst.EXPLAIN_COLUMN_PLAN, explainDataQuery.getQueryPlan())
.withTextValue(YdbConst.EXPLAIN_COLUMN_AST, explainedQuery.getAst())
.withTextValue(YdbConst.EXPLAIN_COLUMN_PLAN, explainedQuery.getPlan())
.build()
.build();

Expand Down
4 changes: 2 additions & 2 deletions jdbc/src/main/java/tech/ydb/jdbc/impl/YdbConnectionImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@
import tech.ydb.jdbc.context.YdbContext;
import tech.ydb.jdbc.context.YdbExecutor;
import tech.ydb.jdbc.context.YdbValidator;
import tech.ydb.jdbc.query.ExplainedQuery;
import tech.ydb.jdbc.query.JdbcParams;
import tech.ydb.jdbc.query.QueryType;
import tech.ydb.jdbc.query.YdbQuery;
import tech.ydb.jdbc.settings.FakeTxMode;
import tech.ydb.jdbc.settings.YdbOperationProperties;
import tech.ydb.table.query.ExplainDataQueryResult;
import tech.ydb.table.query.Params;
import tech.ydb.table.result.ResultSetReader;

Expand Down Expand Up @@ -232,7 +232,7 @@ public ResultSetReader executeScanQuery(YdbQuery query, YdbValidator validator,
}

@Override
public ExplainDataQueryResult executeExplainQuery(YdbQuery query, YdbValidator validator) throws SQLException {
public ExplainedQuery executeExplainQuery(YdbQuery query, YdbValidator validator) throws SQLException {
return executor.executeExplainQuery(ctx, validator, query);
}

Expand Down
23 changes: 23 additions & 0 deletions jdbc/src/main/java/tech/ydb/jdbc/query/ExplainedQuery.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package tech.ydb.jdbc.query;

/**
*
* @author Aleksandr Gorshenin
*/
public class ExplainedQuery {
private final String ast;
private final String plan;

public ExplainedQuery(String ast, String plan) {
this.ast = ast;
this.plan = plan;
}

public String getAst() {
return this.ast;
}

public String getPlan() {
return this.plan;
}
}

0 comments on commit a9cc7dc

Please sign in to comment.