Skip to content

Commit 49548cc

Browse files
authored
Rewrite options to control query special modes (#74)
2 parents f0fe9c5 + 59ab5e4 commit 49548cc

File tree

8 files changed

+183
-73
lines changed

8 files changed

+183
-73
lines changed

jdbc/src/main/java/tech/ydb/jdbc/query/YdbQuery.java

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,17 @@ public class YdbQuery {
1515
private final String originQuery;
1616
private final String preparedYQL;
1717
private final List<QueryStatement> statements;
18-
private final YqlBatcher batch;
18+
private final YqlBatcher batcher;
1919

2020
private final QueryType type;
2121
private final boolean isPlainYQL;
2222

23-
YdbQuery(String originQuery, String preparedYQL, List<QueryStatement> stats, QueryType type) {
24-
this(originQuery, preparedYQL, stats, null, type);
25-
}
26-
27-
YdbQuery(String originQuery, String preparedYQL, List<QueryStatement> stats, YqlBatcher batch, QueryType type) {
23+
YdbQuery(String originQuery, String preparedYQL, List<QueryStatement> stats, YqlBatcher batcher, QueryType type) {
2824
this.originQuery = originQuery;
2925
this.preparedYQL = preparedYQL;
3026
this.statements = stats;
3127
this.type = type;
32-
this.batch = batch;
28+
this.batcher = batcher;
3329

3430
boolean hasJdbcParamters = false;
3531
for (QueryStatement st: statements) {
@@ -43,7 +39,7 @@ public QueryType getType() {
4339
}
4440

4541
public YqlBatcher getYqlBatcher() {
46-
return batch;
42+
return batcher.isValidBatch() ? batcher : null;
4743
}
4844

4945
public boolean isPlainYQL() {
@@ -66,32 +62,29 @@ public static YdbQuery parseQuery(String query, YdbQueryProperties opts) throws
6662
YdbQueryParser parser = new YdbQueryParser(opts.isDetectQueryType(), opts.isDetectJdbcParameters());
6763
String preparedYQL = parser.parseSQL(query);
6864

69-
QueryType type = opts.getForcedQueryType();
70-
if (type == null) {
71-
type = parser.detectQueryType();
72-
YqlBatcher batcher = parser.getYqlBatcher();
73-
74-
if (opts.isForcedScanAndBulks()) {
75-
if (batcher.isValidBatch()) {
76-
if (batcher.getCommand() == YqlBatcher.Cmd.UPSERT) {
77-
type = QueryType.BULK_QUERY;
78-
}
79-
if (batcher.getCommand() == YqlBatcher.Cmd.INSERT) {
80-
parser.getYqlBatcher().setForcedUpsert();
81-
type = QueryType.BULK_QUERY;
82-
}
83-
}
65+
QueryType type = null;
66+
YqlBatcher batcher = parser.getYqlBatcher();
67+
List<QueryStatement> statements = parser.getStatements();
8468

85-
if (parser.getStatements().size() == 1 && parser.getStatements().get(0).getCmd() == QueryCmd.SELECT) {
69+
if (batcher.isValidBatch()) {
70+
if (batcher.getCommand() == YqlBatcher.Cmd.INSERT && opts.isReplaceInsertToUpsert()) {
71+
batcher.setForcedUpsert();
72+
}
73+
if (batcher.getCommand() == YqlBatcher.Cmd.UPSERT && opts.isForceBulkUpsert()) {
74+
type = QueryType.BULK_QUERY;
75+
}
76+
} else {
77+
if (opts.isForceScanSelect() && statements.size() == 1 && statements.get(0).getCmd() == QueryCmd.SELECT) {
78+
if (parser.detectQueryType() == QueryType.DATA_QUERY) { // Only data queries may be converter to SCAN
8679
type = QueryType.SCAN_QUERY;
8780
}
8881
}
8982
}
9083

91-
if (parser.getYqlBatcher().isValidBatch()) {
92-
return new YdbQuery(query, preparedYQL, parser.getStatements(), parser.getYqlBatcher(), type);
84+
if (type == null) {
85+
type = parser.detectQueryType();
9386
}
9487

95-
return new YdbQuery(query, preparedYQL, parser.getStatements(), type);
88+
return new YdbQuery(query, preparedYQL, statements, batcher, type);
9689
}
9790
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,10 @@ public DriverPropertyInfo[] toPropertyInfo() throws SQLException {
184184
YdbQueryProperties.DISABLE_DETECT_SQL_OPERATIONS.toInfo(properties),
185185
YdbQueryProperties.DISABLE_JDBC_PARAMETERS.toInfo(properties),
186186
YdbQueryProperties.DISABLE_JDBC_PARAMETERS_DECLARE.toInfo(properties),
187-
YdbQueryProperties.FORCE_QUERY_MODE.toInfo(properties),
188-
YdbQueryProperties.FORCE_SCAN_BULKS.toInfo(properties),
187+
188+
YdbQueryProperties.REPLACE_INSERT_TO_UPSERT.toInfo(properties),
189+
YdbQueryProperties.FORCE_BULK_UPSERT.toInfo(properties),
190+
YdbQueryProperties.FORCE_SCAN_SELECT.toInfo(properties),
189191
};
190192
}
191193

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

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import java.sql.SQLException;
44
import java.util.Properties;
5+
import java.util.logging.Logger;
56

7+
import tech.ydb.jdbc.YdbDriver;
68
import tech.ydb.jdbc.query.QueryType;
79

810

@@ -12,6 +14,8 @@
1214
* @author Aleksandr Gorshenin
1315
*/
1416
public class YdbQueryProperties {
17+
private static final Logger LOGGER = Logger.getLogger(YdbDriver.class.getName());
18+
1519
static final YdbProperty<Boolean> DISABLE_DETECT_SQL_OPERATIONS = YdbProperty.bool("disableDetectSqlOperations",
1620
"Disable detecting SQL operation based on SQL keywords", false);
1721

@@ -27,23 +31,33 @@ public class YdbQueryProperties {
2731
static final YdbProperty<Boolean> DISABLE_JDBC_PARAMETERS_DECLARE = YdbProperty.bool("disableJdbcParameterDeclare",
2832
"Disable enforce DECLARE section for JDBC parameters '?'", false);
2933

30-
static final YdbProperty<QueryType> FORCE_QUERY_MODE = YdbProperty.enums("forceQueryMode", QueryType.class,
31-
"Force usage one of query modes (DATA_QUERY, SCAN_QUERY, SCHEME_QUERY or EXPLAIN_QUERYn) for all statements"
34+
@Deprecated
35+
private static final YdbProperty<QueryType> FORCE_QUERY_MODE = YdbProperty.enums("forceQueryMode", QueryType.class,
36+
"Force usage one of query modes (DATA_QUERY, SCAN_QUERY, SCHEME_QUERY or EXPLAIN_QUERY) for all statements"
3237
);
33-
static final YdbProperty<Boolean> FORCE_SCAN_BULKS = YdbProperty.bool("forceScanAndBulk",
38+
@Deprecated
39+
private static final YdbProperty<Boolean> FORCE_SCAN_BULKS = YdbProperty.bool("forceScanAndBulk",
3440
"Force usage of bulk upserts instead of upserts/inserts and scan query for selects",
3541
false
3642
);
3743

44+
static final YdbProperty<Boolean> REPLACE_INSERT_TO_UPSERT = YdbProperty.bool("replaceInsertByUpsert",
45+
"Convert all INSERT statements to UPSERT statements", false);
46+
static final YdbProperty<Boolean> FORCE_BULK_UPSERT = YdbProperty.bool("forceBulkUpsert",
47+
"Execute all UPSERT statements as BulkUpserts", false);
48+
static final YdbProperty<Boolean> FORCE_SCAN_SELECT = YdbProperty.bool("forceScanSelect",
49+
"Execute all SELECT statements as ScanQuery", false);
50+
3851
private final boolean isDetectQueryType;
3952
private final boolean isDetectJdbcParameters;
4053
private final boolean isDeclareJdbcParameters;
4154

4255
private final boolean isPrepareDataQueries;
4356
private final boolean isDetectBatchQueries;
4457

45-
private final QueryType forcedType;
46-
private final boolean isForcedScanAndBulks;
58+
private final boolean isReplaceInsertToUpsert;
59+
private final boolean isForceBulkUpsert;
60+
private final boolean isForceScanSelect;
4761

4862
public YdbQueryProperties(YdbConfig config) throws SQLException {
4963
Properties props = config.getProperties();
@@ -63,8 +77,24 @@ public YdbQueryProperties(YdbConfig config) throws SQLException {
6377
this.isDeclareJdbcParameters = !disableSqlOperationsDetect && !disableJdbcParametersParse
6478
&& !disableJdbcParametersDeclare;
6579

66-
this.forcedType = FORCE_QUERY_MODE.readValue(props).getValue();
67-
this.isForcedScanAndBulks = FORCE_SCAN_BULKS.readValue(props).getValue();
80+
81+
YdbValue<QueryType> forcedType = FORCE_QUERY_MODE.readValue(props);
82+
if (forcedType.hasValue()) {
83+
LOGGER.warning("Option 'forceQueryMode' is deprecated and will be removed in next versions. "
84+
+ "Use options 'forceScanSelect' and 'forceBulkUpsert' instead");
85+
}
86+
YdbValue<Boolean> forceScanAndBulk = FORCE_SCAN_BULKS.readValue(props);
87+
if (forceScanAndBulk.hasValue()) {
88+
LOGGER.warning("Option 'forceScanAndBulk' is deprecated and will be removed in next versions. "
89+
+ "Use options 'replaceInsertByUpsert', 'forceScanSelect' and 'forceBulkUpsert' instead");
90+
}
91+
92+
this.isReplaceInsertToUpsert = REPLACE_INSERT_TO_UPSERT.readValue(props)
93+
.getValueOrOther(forceScanAndBulk.getValue());
94+
this.isForceBulkUpsert = FORCE_BULK_UPSERT.readValue(props)
95+
.getValueOrOther(forceScanAndBulk.getValue() || forcedType.getValue() == QueryType.BULK_QUERY);
96+
this.isForceScanSelect = FORCE_SCAN_SELECT.readValue(props)
97+
.getValueOrOther(forceScanAndBulk.getValue() || forcedType.getValue() == QueryType.SCAN_QUERY);
6898
}
6999

70100
public boolean isDetectQueryType() {
@@ -87,11 +117,15 @@ public boolean isDetectBatchQueries() {
87117
return isDetectBatchQueries;
88118
}
89119

90-
public QueryType getForcedQueryType() {
91-
return forcedType;
120+
public boolean isReplaceInsertToUpsert() {
121+
return isReplaceInsertToUpsert;
122+
}
123+
124+
public boolean isForceBulkUpsert() {
125+
return isForceBulkUpsert;
92126
}
93127

94-
public boolean isForcedScanAndBulks() {
95-
return isForcedScanAndBulks;
128+
public boolean isForceScanSelect() {
129+
return isForceScanSelect;
96130
}
97131
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ public T getValue() {
1717
return value;
1818
}
1919

20+
public T getValueOrOther(T other) {
21+
return isPresent ? value : other;
22+
}
23+
2024
public boolean hasValue() {
2125
return isPresent;
2226
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,12 @@ public void customQueriesTest() throws SQLException {
216216

217217
@Test
218218
public void forceScanAndBulkTest() throws SQLException {
219-
try (Connection conn = DriverManager.getConnection(jdbcURL.withArg("forceScanAndBulk", "true").build())) {
219+
try (Connection conn = DriverManager.getConnection(jdbcURL
220+
.withArg("replaceInsertByUpsert", "true")
221+
.withArg("forceBulkUpsert", "true")
222+
.withArg("forceScanSelect", "true")
223+
.build()
224+
)) {
220225
try {
221226
conn.createStatement().execute(DROP_TABLE);
222227
} catch (SQLException e) {

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@ public class YdbDriverTablesTest {
2828

2929
private static final JdbcUrlHelper jdbcURL = new JdbcUrlHelper(ydb);
3030

31-
private final static String ERROR_SCAN_QUERY =
32-
"Scan query should have a single result set. (S_ERROR)";
33-
3431
private final static String ERROR_BULK_UNSUPPORTED =
3532
"BULK mode is available only for prepared statement with one UPSERT";
3633

@@ -206,7 +203,12 @@ public void customQueriesTest() throws SQLException {
206203

207204
@Test
208205
public void forceScanAndBulkTest() throws SQLException {
209-
try (Connection conn = DriverManager.getConnection(jdbcURL.withArg("forceScanAndBulk", "true").build())) {
206+
try (Connection conn = DriverManager.getConnection(jdbcURL
207+
.withArg("replaceInsertByUpsert", "true")
208+
.withArg("forceBulkUpsert", "true")
209+
.withArg("forceScanSelect", "true")
210+
.build()
211+
)) {
210212
try {
211213
conn.createStatement().execute(DROP_TABLE);
212214
} catch (SQLException e) {

0 commit comments

Comments
 (0)