Skip to content

Commit 6cc21d0

Browse files
committed
feature: query execution interceptor
1 parent 555e9d9 commit 6cc21d0

File tree

9 files changed

+363
-4
lines changed

9 files changed

+363
-4
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.sql.Statement;
55

66
import tech.ydb.jdbc.context.YdbValidator;
7+
import tech.ydb.table.query.stats.QueryStatsCollectionMode;
78

89
public interface YdbStatement extends Statement {
910
/**
@@ -58,4 +59,8 @@ public interface YdbStatement extends Statement {
5859

5960
@Override
6061
int getMaxRows();
62+
63+
void setStatsCollectionMode(QueryStatsCollectionMode mode);
64+
65+
QueryStatsCollectionMode getStatsCollectionMode();
6166
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import tech.ydb.query.settings.CommitTransactionSettings;
3333
import tech.ydb.query.settings.ExecuteQuerySettings;
3434
import tech.ydb.query.settings.QueryExecMode;
35+
import tech.ydb.query.settings.QueryStatsMode;
3536
import tech.ydb.query.settings.RollbackTransactionSettings;
3637
import tech.ydb.query.tools.QueryReader;
3738
import tech.ydb.table.query.Params;
@@ -233,6 +234,7 @@ protected YdbQueryResult executeQueryImpl(YdbStatement statement, YdbQuery query
233234

234235
int timeout = statement.getQueryTimeout();
235236
ExecuteQuerySettings.Builder settings = ExecuteQuerySettings.newBuilder();
237+
settings = settings.withStatsMode(QueryStatsMode.valueOf(statement.getStatsCollectionMode().name()));
236238
if (timeout > 0) {
237239
settings = settings.withRequestTimeout(timeout, TimeUnit.SECONDS);
238240
}
@@ -300,7 +302,10 @@ public void onClose(Status status, Throwable th) {
300302
for (int idx = 0; idx < readers.length; idx++) {
301303
readers[idx] = new YdbResultSetMemory(types, statement, result.getResultSet(idx));
302304
}
303-
return updateCurrentResult(new YdbQueryResultStatic(query, readers));
305+
306+
YdbQueryResultStatic queryResult = new YdbQueryResultStatic(query, readers);
307+
queryResult.setQueryStats(result.getQueryInfo().getStats());
308+
return updateCurrentResult(queryResult);
304309
} finally {
305310
if (!localTx.isActive()) {
306311
if (tx.compareAndSet(localTx, null)) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public String getPreparedYQL() {
6666
return preparedYQL;
6767
}
6868

69-
public String getAat() {
69+
public String getAst() {
7070
return ast;
7171
}
7272

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ private ExecuteDataQuerySettings dataQuerySettings(YdbStatement statement) {
173173
settings = settings.disableQueryCache();
174174
}
175175

176+
settings = settings.setCollectStats(statement.getStatsCollectionMode());
177+
176178
return settings;
177179
}
178180

@@ -231,7 +233,9 @@ protected YdbQueryResult executeQueryImpl(YdbStatement statement, YdbQuery query
231233
readers[idx] = new YdbResultSetMemory(types, statement, rs);
232234
}
233235

234-
return updateCurrentResult(new YdbQueryResultStatic(query, readers));
236+
YdbQueryResultStatic queryResult = new YdbQueryResultStatic(query, readers);
237+
queryResult.setQueryStats(result.getQueryStats());
238+
return updateCurrentResult(queryResult);
235239
} catch (SQLException | RuntimeException ex) {
236240
updateState(tx.withRollback(session));
237241
throw ex;

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.sql.SQLException;
44
import java.time.Duration;
55
import java.util.Collection;
6+
import java.util.Iterator;
7+
import java.util.ServiceLoader;
68
import java.util.concurrent.Executors;
79
import java.util.concurrent.atomic.AtomicInteger;
810
import java.util.logging.Level;
@@ -23,6 +25,7 @@
2325
import tech.ydb.jdbc.settings.YdbConnectionProperties;
2426
import tech.ydb.jdbc.settings.YdbOperationProperties;
2527
import tech.ydb.jdbc.settings.YdbQueryProperties;
28+
import tech.ydb.jdbc.spi.YDBQueryExtensionService;
2629
import tech.ydb.query.QueryClient;
2730
import tech.ydb.query.impl.QueryClientImpl;
2831
import tech.ydb.scheme.SchemeClient;
@@ -58,6 +61,8 @@ public class YdbContext implements AutoCloseable {
5861
private final boolean autoResizeSessionPool;
5962
private final AtomicInteger connectionsCount = new AtomicInteger();
6063

64+
private YDBQueryExtensionService queryExtensionService = null;
65+
6166
private YdbContext(
6267
YdbConfig config,
6368
YdbOperationProperties operationProperties,
@@ -96,6 +101,13 @@ private YdbContext(
96101
this.cache = new YdbCache(this,
97102
queryProperties, config.getPreparedStatementsCachecSize(), config.isFullScanDetectorEnabled());
98103
}
104+
105+
Iterator<YDBQueryExtensionService> extLoaderIterator = ServiceLoader
106+
.load(YDBQueryExtensionService.class)
107+
.iterator();
108+
if (extLoaderIterator.hasNext()) {
109+
queryExtensionService = extLoaderIterator.next();
110+
}
99111
}
100112

101113
public YdbTypes getTypes() {
@@ -312,4 +324,8 @@ public YdbQuery parseYdbQuery(QueryKey key) throws SQLException {
312324
public YdbPreparedQuery prepareYdbQuery(YdbQuery query, YdbPrepareMode mode) throws SQLException {
313325
return cache.prepareYdbQuery(query, mode);
314326
}
327+
328+
public YDBQueryExtensionService getQueryExtensionService() {
329+
return queryExtensionService;
330+
}
315331
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.sql.SQLException;
55

66
import tech.ydb.jdbc.YdbResultSet;
7+
import tech.ydb.jdbc.query.UnifiedQueryStats;
78
import tech.ydb.jdbc.query.YdbQuery;
89

910
/**
@@ -12,6 +13,7 @@
1213
*/
1314
public class YdbQueryResultStatic extends YdbQueryResultBase {
1415
private final YdbResultSet[] rs;
16+
private UnifiedQueryStats queryStats;
1517

1618
public YdbQueryResultStatic(YdbQuery query, YdbResultSet... rs) {
1719
super(query, rs != null ? rs.length : 0);
@@ -33,4 +35,20 @@ protected void closeResultSet(int index) throws SQLException {
3335
}
3436
rs[index].close();
3537
}
38+
39+
public UnifiedQueryStats getQueryStats() {
40+
return queryStats;
41+
}
42+
43+
public void setQueryStats(tech.ydb.table.query.stats.QueryStats src) {
44+
if (src != null) {
45+
queryStats = new UnifiedQueryStats(src);
46+
}
47+
}
48+
49+
public void setQueryStats(tech.ydb.query.result.QueryStats src) {
50+
if (src != null) {
51+
queryStats = new UnifiedQueryStats(src);
52+
}
53+
}
3654
}

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
import tech.ydb.jdbc.query.YdbQuery;
2020
import tech.ydb.jdbc.settings.FakeTxMode;
2121
import tech.ydb.jdbc.settings.YdbOperationProperties;
22+
import tech.ydb.jdbc.spi.YDBQueryExtensionService;
2223
import tech.ydb.table.query.Params;
24+
import tech.ydb.table.query.stats.QueryStatsCollectionMode;
2325
import tech.ydb.table.result.ResultSetReader;
2426
import tech.ydb.table.values.ListValue;
2527

@@ -41,6 +43,7 @@ public abstract class YdbStatementBase implements YdbStatement {
4143
private int queryTimeout;
4244
private boolean isPoolable;
4345
private boolean isClosed = false;
46+
private QueryStatsCollectionMode statsMode = QueryStatsCollectionMode.NONE;
4447

4548
/** @see Statement#getMaxRows() */
4649
private int maxRows = 0; // no limit
@@ -203,7 +206,20 @@ protected YdbQueryResult executeDataQuery(YdbQuery query, String yql, Params par
203206
}
204207

205208
ctx.traceQueryByFullScanDetector(query, yql);
206-
return connection.getExecutor().executeDataQuery(this, query, yql, params);
209+
210+
YDBQueryExtensionService ext = ctx.getQueryExtensionService();
211+
if (ext != null) {
212+
ext.dataQueryPreExecute(ctx, this, query, yql, params);
213+
}
214+
215+
YdbQueryResult result;
216+
result = connection.getExecutor().executeDataQuery(this, query, yql, params);
217+
218+
if (ext != null) {
219+
ext.dataQueryPostExecute(ctx, this, query, yql, params, result);
220+
}
221+
222+
return result;
207223
}
208224

209225
protected YdbQueryResult executeSchemeQuery(YdbQuery query) throws SQLException {
@@ -319,4 +335,14 @@ public int getFetchSize() {
319335
public int getResultSetConcurrency() {
320336
return ResultSet.CONCUR_READ_ONLY;
321337
}
338+
339+
@Override
340+
public QueryStatsCollectionMode getStatsCollectionMode() {
341+
return statsMode;
342+
}
343+
344+
@Override
345+
public void setStatsCollectionMode(QueryStatsCollectionMode mode) {
346+
this.statsMode = mode == null ? QueryStatsCollectionMode.NONE : mode;
347+
}
322348
}

0 commit comments

Comments
 (0)