Skip to content

Commit 9f6bbee

Browse files
committed
Added option usePrefixPath
1 parent dab1ae0 commit 9f6bbee

File tree

9 files changed

+77
-17
lines changed

9 files changed

+77
-17
lines changed

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,17 @@ public abstract class BaseYdbExecutor implements YdbExecutor {
3333
private final SessionRetryContext retryCtx;
3434
private final Duration sessionTimeout;
3535
private final TableClient tableClient;
36+
3637
private final AtomicReference<YdbQueryResult> currResult;
3738
protected final boolean traceEnabled;
39+
protected final String prefixPragma;
3840

3941
public BaseYdbExecutor(YdbContext ctx) {
4042
this.retryCtx = ctx.getRetryCtx();
4143
this.traceEnabled = ctx.isTxTracerEnabled();
4244
this.sessionTimeout = ctx.getOperationProperties().getSessionTimeout();
4345
this.tableClient = ctx.getTableClient();
46+
this.prefixPragma = ctx.getPrefixPragma();
4447
this.currResult = new AtomicReference<>();
4548
}
4649

@@ -91,7 +94,7 @@ public YdbTracer trace(String message) {
9194
public YdbQueryResult executeSchemeQuery(YdbStatement statement, YdbQuery query) throws SQLException {
9295
ensureOpened();
9396

94-
String yql = query.getPreparedYql();
97+
String yql = prefixPragma + query.getPreparedYql();
9598
YdbContext ctx = statement.getConnection().getCtx();
9699
YdbValidator validator = statement.getValidator();
97100

@@ -114,7 +117,7 @@ public YdbQueryResult executeBulkUpsert(YdbStatement statement, YdbQuery query,
114117
throws SQLException {
115118
ensureOpened();
116119

117-
String yql = query.getPreparedYql();
120+
String yql = prefixPragma + query.getPreparedYql();
118121
YdbValidator validator = statement.getValidator();
119122
YdbTracer tracer = trace("--> bulk upsert >>\n" + yql);
120123
validator.execute(QueryType.BULK_QUERY + " >>\n" + yql, tracer,
@@ -129,17 +132,19 @@ public YdbQueryResult executeBulkUpsert(YdbStatement statement, YdbQuery query,
129132
}
130133

131134
@Override
132-
public YdbQueryResult executeScanQuery(YdbStatement statement, YdbQuery query, String yql, Params params)
135+
public YdbQueryResult executeScanQuery(YdbStatement statement, YdbQuery query, String preparedYql, Params params)
133136
throws SQLException {
134137
ensureOpened();
135138

139+
String yql = prefixPragma + preparedYql;
136140
YdbContext ctx = statement.getConnection().getCtx();
137141
YdbValidator validator = statement.getValidator();
138142
Duration scanQueryTimeout = ctx.getOperationProperties().getScanQueryTimeout();
139143
ExecuteScanQuerySettings settings = ExecuteScanQuerySettings.newBuilder()
140144
.withRequestTimeout(scanQueryTimeout)
141145
.build();
142146
String msg = QueryType.SCAN_QUERY + " >>\n" + yql;
147+
143148
final YdbTracer tracer = trace("--> scan query >>\n" + yql);
144149
final Session session = createNewTableSession(validator);
145150

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ public void rollback(YdbContext ctx, YdbValidator validator) throws SQLException
231231

232232
@Override
233233
public YdbQueryResult executeDataQuery(
234-
YdbStatement statement, YdbQuery query, String yql, Params params, long timeout, boolean keepInCache
234+
YdbStatement statement, YdbQuery query, String preparedYql, Params params, long timeout, boolean keepInCache
235235
) throws SQLException {
236236
ensureOpened();
237237

@@ -254,6 +254,8 @@ public YdbQueryResult executeDataQuery(
254254

255255
final QueryTransaction localTx = nextTx;
256256

257+
String yql = prefixPragma + preparedYql;
258+
257259
if (useStreamResultSet) {
258260
YdbTracer tracer = trace("--> stream query >>\n" + yql);
259261
String msg = "STREAM_QUERY >>\n" + yql;
@@ -347,7 +349,7 @@ public void onNextPart(QueryResultPart part) {
347349
public YdbQueryResult executeSchemeQuery(YdbStatement statement, YdbQuery query) throws SQLException {
348350
ensureOpened();
349351

350-
String yql = query.getPreparedYql();
352+
String yql = prefixPragma + query.getPreparedYql();
351353
YdbContext ctx = statement.getConnection().getCtx();
352354
YdbValidator validator = statement.getValidator();
353355

@@ -373,7 +375,7 @@ public YdbQueryResult executeSchemeQuery(YdbStatement statement, YdbQuery query)
373375
public YdbQueryResult executeExplainQuery(YdbStatement statement, YdbQuery query) throws SQLException {
374376
ensureOpened();
375377

376-
String yql = query.getPreparedYql();
378+
String yql = prefixPragma + query.getPreparedYql();
377379
YdbContext ctx = statement.getConnection().getCtx();
378380
YdbValidator validator = statement.getValidator();
379381

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ public YdbQueryResult executeExplainQuery(YdbStatement statement, YdbQuery query
180180

181181
YdbContext ctx = statement.getConnection().getCtx();
182182
YdbValidator validator = statement.getValidator();
183-
String yql = query.getPreparedYql();
183+
String yql = prefixPragma + query.getPreparedYql();
184184
YdbTracer tracer = trace("--> explain >>\n" + yql);
185185

186186
ExplainDataQuerySettings settings = ctx.withDefaultTimeout(new ExplainDataQuerySettings());
@@ -196,12 +196,13 @@ public YdbQueryResult executeExplainQuery(YdbStatement statement, YdbQuery query
196196
}
197197

198198
@Override
199-
public YdbQueryResult executeDataQuery(YdbStatement statement, YdbQuery query, String yql, Params params,
199+
public YdbQueryResult executeDataQuery(YdbStatement statement, YdbQuery query, String preparedYql, Params params,
200200
long timeout, boolean keepInCache) throws SQLException {
201201
ensureOpened();
202202

203203
YdbValidator validator = statement.getValidator();
204-
final Session session = tx.getSession(validator);
204+
Session session = tx.getSession(validator);
205+
String yql = prefixPragma + preparedYql;
205206
YdbTracer tracer = trace("--> data query >>\n" + yql);
206207
try {
207208
DataQueryResult result = validator.call(

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public class YdbContext implements AutoCloseable {
7474
private final QueryClientImpl queryClient;
7575
private final SchemeClient schemeClient;
7676
private final SessionRetryContext retryCtx;
77+
private final String prefixPath;
78+
private final String prefixPragma;
7779

7880
private final Cache<String, YdbQuery> queriesCache;
7981
private final Cache<String, QueryStat> statsCache;
@@ -120,6 +122,14 @@ private YdbContext(
120122
queryParamsCache = null;
121123
tableDescribeCache = null;
122124
}
125+
126+
if (config.hasPrefixPath()) {
127+
prefixPath = joined(transport.getDatabase(), config.getPrefixPath());
128+
prefixPragma = "PRAGMA TablePathPrefix = \"" + prefixPath + "\";\n";
129+
} else {
130+
prefixPath = transport.getDatabase();
131+
prefixPragma = "";
132+
}
123133
}
124134

125135
/**
@@ -131,8 +141,16 @@ public GrpcTransport getGrpcTransport() {
131141
return grpcTransport;
132142
}
133143

134-
public String getDatabase() {
135-
return grpcTransport.getDatabase();
144+
private String joined(String path1, String path2) {
145+
return path1.endsWith("/") || path2.startsWith("/") ? path1 + path2 : path1 + "/" + path2;
146+
}
147+
148+
public String getPrefixPath() {
149+
return prefixPath;
150+
}
151+
152+
String getPrefixPragma() {
153+
return prefixPragma;
136154
}
137155

138156
public SchemeClient getSchemeClient() {
@@ -372,8 +390,7 @@ public YdbPreparedQuery findOrPrepareParams(YdbQuery query, YdbPrepareMode mode)
372390
}
373391

374392
if (query.getYqlBatcher() != null && (mode == YdbPrepareMode.AUTO || type == QueryType.BULK_QUERY)) {
375-
String tableName = query.getYqlBatcher().getTableName();
376-
String tablePath = tableName.startsWith("/") ? tableName : getDatabase() + "/" + tableName;
393+
String tablePath = joined(getPrefixPath(), query.getYqlBatcher().getTableName());
377394
TableDescription description = tableDescribeCache.getIfPresent(tablePath);
378395
if (description == null) {
379396
DescribeTableSettings settings = withDefaultTimeout(new DescribeTableSettings());

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,7 +1315,7 @@ private List<String> listTables(String tableNamePattern) throws SQLException {
13151315
}
13161316

13171317
private List<String> listTables(Predicate<String> filter) throws SQLException {
1318-
String databaseWithSuffix = withSuffix(connection.getCtx().getDatabase());
1318+
String databaseWithSuffix = withSuffix(connection.getCtx().getPrefixPath());
13191319
return tables(databaseWithSuffix, databaseWithSuffix, filter);
13201320
}
13211321

@@ -1352,7 +1352,7 @@ private List<String> tables(String databasePrefix, String path, Predicate<String
13521352
private TableDescription describeTable(String table) throws SQLException {
13531353
DescribeTableSettings settings = connection.getCtx().withDefaultTimeout(new DescribeTableSettings());
13541354

1355-
String databaseWithSuffix = withSuffix(connection.getCtx().getDatabase());
1355+
String databaseWithSuffix = withSuffix(connection.getCtx().getPrefixPath());
13561356

13571357
return validator.call("Describe table " + table, null, () -> executor
13581358
.describeTable(databaseWithSuffix + table, settings)

jdbc/src/main/java/tech/ydb/jdbc/settings/YdbConfig.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ public class YdbConfig {
4040
static final YdbProperty<Boolean> USE_QUERY_SERVICE = YdbProperty.bool("useQueryService",
4141
"Use QueryService instead of TableService", false
4242
);
43+
44+
static final YdbProperty<String> USE_PREFIX_PATH = YdbProperty.string("usePrefixPath",
45+
"Add prefix path to all operations performed by driver");
46+
4347
static final YdbProperty<Boolean> FULLSCAN_DETECTOR_ENABLED = YdbProperty.bool(
4448
"jdbcFullScanDetector", "Enable analizator for collecting query stats", false
4549
);
@@ -57,7 +61,10 @@ public class YdbConfig {
5761
private final Properties properties;
5862
private final boolean isCacheConnectionsInDriver;
5963
private final int preparedStatementsCacheSize;
64+
6065
private final boolean useQueryService;
66+
private final YdbValue<String> usePrefixPath;
67+
6168
private final boolean fullScanDetectorEnabled;
6269
private final boolean txTracerEnabled;
6370

@@ -72,7 +79,10 @@ private YdbConfig(
7279
this.properties = props;
7380
this.isCacheConnectionsInDriver = CACHE_CONNECTIONS_IN_DRIVER.readValue(props).getValue();
7481
this.preparedStatementsCacheSize = Math.max(0, PREPARED_STATEMENT_CACHE_SIZE.readValue(props).getValue());
82+
7583
this.useQueryService = USE_QUERY_SERVICE.readValue(props).getValue();
84+
this.usePrefixPath = USE_PREFIX_PATH.readValue(props);
85+
7686
this.fullScanDetectorEnabled = FULLSCAN_DETECTOR_ENABLED.readValue(props).getValue();
7787
this.txTracerEnabled = TRANSACTION_TRACER.readValue(props).getValue();
7888
}
@@ -105,6 +115,14 @@ public boolean isUseQueryService() {
105115
return this.useQueryService;
106116
}
107117

118+
public boolean hasPrefixPath() {
119+
return usePrefixPath.hasValue();
120+
}
121+
122+
public String getPrefixPath() {
123+
return usePrefixPath.getValue();
124+
}
125+
108126
public boolean isFullScanDetectorEnabled() {
109127
return fullScanDetectorEnabled;
110128
}
@@ -159,6 +177,7 @@ public DriverPropertyInfo[] toPropertyInfo() throws SQLException {
159177
YdbConfig.CACHE_CONNECTIONS_IN_DRIVER.toInfo(properties),
160178
YdbConfig.PREPARED_STATEMENT_CACHE_SIZE.toInfo(properties),
161179
YdbConfig.USE_QUERY_SERVICE.toInfo(properties),
180+
YdbConfig.USE_PREFIX_PATH.toInfo(properties),
162181

163182
YdbConnectionProperties.LOCAL_DATACENTER.toInfo(properties),
164183
YdbConnectionProperties.USE_SECURE_CONNECTION.toInfo(properties),

jdbc/src/test/java/tech/ydb/jdbc/YdbDriverTablesTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@ public class YdbDriverTablesTest {
2626
@RegisterExtension
2727
private static final YdbHelperExtension ydb = new YdbHelperExtension();
2828

29-
private static final JdbcUrlHelper jdbcURL = new JdbcUrlHelper(ydb).withArg("enableTxTracer", "true");
29+
private static final JdbcUrlHelper jdbcURL = new JdbcUrlHelper(ydb)
30+
.withArg("enableTxTracer", "true")
31+
.withArg("usePrefixPath", "jdbc_oltp");
3032

3133
private final static String ERROR_BULK_UNSUPPORTED =
3234
"BULK mode is available only for prepared statement with one UPSERT";
3335

3436
private final static String CREATE_TABLE = ""
35-
+ "CREATE TABLE simple_table("
37+
+ "CREATE TABLE simple_table ("
3638
+ " id Int32 NOT NULL,"
3739
+ " value Text,"
3840
+ " date Date,"

jdbc/src/test/java/tech/ydb/jdbc/impl/YdbDatabaseMetaDataImplTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,18 @@ public void getTables() throws SQLException {
515515
tables.check(metaData.getTables(null, null, "dir1/t1", asArray(SYSTEM_TABLE_TYPE)))
516516
.assertMetaColumns()
517517
.assertNoRows();
518+
519+
// Custom prefix path
520+
try (Connection conn = jdbc.createCustomConnection("usePrefixPath", "dir2")) {
521+
DatabaseMetaData prefixedMetaData = conn.getMetaData();
522+
523+
// read all tables
524+
rs = tables.check(prefixedMetaData.getTables(null, null, null, null))
525+
.assertMetaColumns();
526+
rs.nextRow(tableName.eq("dir1/t1"), tableType.eq(TABLE_TYPE));
527+
rs.nextRow(tableName.eq("t2"), tableType.eq(TABLE_TYPE));
528+
rs.assertNoRows();
529+
}
518530
}
519531

520532
@Test

jdbc/src/test/java/tech/ydb/jdbc/settings/YdbDriverProperitesTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@ static DriverPropertyInfo[] defaultPropertyInfo(@Nullable String localDatacenter
306306
new DriverPropertyInfo("cacheConnectionsInDriver", "true"),
307307
new DriverPropertyInfo("preparedStatementCacheQueries", "256"),
308308
new DriverPropertyInfo("useQueryService", "false"),
309+
new DriverPropertyInfo("usePrefixPath", ""),
309310
new DriverPropertyInfo("localDatacenter", localDatacenter),
310311
new DriverPropertyInfo("secureConnection", ""),
311312
new DriverPropertyInfo("secureConnectionCertificate", ""),
@@ -348,6 +349,7 @@ static DriverPropertyInfo[] customizedPropertyInfo() {
348349
new DriverPropertyInfo("cacheConnectionsInDriver", "false"),
349350
new DriverPropertyInfo("preparedStatementCacheQueries", "100"),
350351
new DriverPropertyInfo("useQueryService", "true"),
352+
new DriverPropertyInfo("usePrefixPath", "/demo/oltp"),
351353
new DriverPropertyInfo("localDatacenter", "sas"),
352354
new DriverPropertyInfo("secureConnection", "true"),
353355
new DriverPropertyInfo("secureConnectionCertificate", "classpath:data/certificate.txt"),

0 commit comments

Comments
 (0)