Skip to content

Commit 024b63e

Browse files
committed
Add SQLUnit to wrapper sharding sql and parameters(增加SQLUnit包装分片后的sql语句和参数)
1 parent ecd0a9f commit 024b63e

File tree

16 files changed

+164
-91
lines changed

16 files changed

+164
-91
lines changed

sharding-core/src/main/java/io/shardingjdbc/core/rewrite/SQLBuilder.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
import io.shardingjdbc.core.rewrite.placeholder.SchemaPlaceholder;
2525
import io.shardingjdbc.core.rewrite.placeholder.ShardingPlaceholder;
2626
import io.shardingjdbc.core.rewrite.placeholder.TablePlaceholder;
27+
import io.shardingjdbc.core.routing.SQLUnit;
2728
import io.shardingjdbc.core.rule.ShardingRule;
2829
import io.shardingjdbc.core.rule.TableRule;
2930

31+
import java.util.Collections;
3032
import java.util.LinkedList;
3133
import java.util.List;
3234
import java.util.Map;
@@ -41,10 +43,17 @@ public final class SQLBuilder {
4143

4244
private final List<Object> segments;
4345

46+
private final List<Object> parameters;
47+
4448
private StringBuilder currentSegment;
4549

4650
public SQLBuilder() {
51+
this(Collections.emptyList());
52+
}
53+
54+
public SQLBuilder(final List<Object> parameters) {
4755
segments = new LinkedList<>();
56+
this.parameters = parameters;
4857
currentSegment = new StringBuilder();
4958
segments.add(currentSegment);
5059
}
@@ -70,13 +79,13 @@ public void appendPlaceholder(final ShardingPlaceholder shardingPlaceholder) {
7079
}
7180

7281
/**
73-
* Convert to SQL string.
82+
* Convert to SQL unit.
7483
*
7584
* @param logicAndActualTableMap logic and actual map
7685
* @param shardingRule sharding rule
77-
* @return SQL string
86+
* @return SQL unit
7887
*/
79-
public String toSQL(final Map<String, String> logicAndActualTableMap, final ShardingRule shardingRule) {
88+
public SQLUnit toSQL(final Map<String, String> logicAndActualTableMap, final ShardingRule shardingRule) {
8089
StringBuilder result = new StringBuilder();
8190
for (Object each : segments) {
8291
if (!(each instanceof ShardingPlaceholder)) {
@@ -107,6 +116,6 @@ public String toSQL(final Map<String, String> logicAndActualTableMap, final Shar
107116
result.append(each);
108117
}
109118
}
110-
return result.toString();
119+
return new SQLUnit(result.toString(), parameters);
111120
}
112121
}

sharding-core/src/main/java/io/shardingjdbc/core/rewrite/SQLRewriteEngine.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import io.shardingjdbc.core.rewrite.placeholder.IndexPlaceholder;
3939
import io.shardingjdbc.core.rewrite.placeholder.SchemaPlaceholder;
4040
import io.shardingjdbc.core.rewrite.placeholder.TablePlaceholder;
41+
import io.shardingjdbc.core.routing.SQLUnit;
4142
import io.shardingjdbc.core.routing.router.GeneratedKey;
4243
import io.shardingjdbc.core.routing.type.TableUnit;
4344
import io.shardingjdbc.core.routing.type.TableUnits;
@@ -59,6 +60,7 @@
5960
* <p>Rewrite logic SQL to actual SQL, should rewrite table name and optimize something.</p>
6061
*
6162
* @author zhangliang
63+
* @author maxiaoguang
6264
*/
6365
public final class SQLRewriteEngine {
6466

@@ -72,6 +74,8 @@ public final class SQLRewriteEngine {
7274

7375
private final SQLStatement sqlStatement;
7476

77+
private final List<Object> parameters;
78+
7579
private final GeneratedKey generatedKey;
7680

7781
/**
@@ -83,11 +87,12 @@ public final class SQLRewriteEngine {
8387
* @param sqlStatement SQL statement
8488
* @param generatedKey generated key
8589
*/
86-
public SQLRewriteEngine(final ShardingRule shardingRule, final String originalSQL, final DatabaseType databaseType, final SQLStatement sqlStatement, final GeneratedKey generatedKey) {
90+
public SQLRewriteEngine(final ShardingRule shardingRule, final String originalSQL, final DatabaseType databaseType, final SQLStatement sqlStatement, final List<Object> parameters, final GeneratedKey generatedKey) {
8791
this.shardingRule = shardingRule;
8892
this.originalSQL = originalSQL;
8993
this.databaseType = databaseType;
9094
this.sqlStatement = sqlStatement;
95+
this.parameters = parameters;
9196
this.generatedKey = generatedKey;
9297
sqlTokens.addAll(sqlStatement.getSqlTokens());
9398
}
@@ -99,7 +104,7 @@ public SQLRewriteEngine(final ShardingRule shardingRule, final String originalSQ
99104
* @return SQL builder
100105
*/
101106
public SQLBuilder rewrite(final boolean isRewriteLimit) {
102-
SQLBuilder result = new SQLBuilder();
107+
SQLBuilder result = new SQLBuilder(parameters);
103108
if (sqlTokens.isEmpty()) {
104109
result.appendLiterals(originalSQL);
105110
return result;
@@ -234,9 +239,9 @@ private void appendRest(final SQLBuilder sqlBuilder, final int count, final List
234239
*
235240
* @param tableUnits route table units
236241
* @param sqlBuilder SQL builder
237-
* @return SQL string
242+
* @return SQL unit
238243
*/
239-
public String generateSQL(final TableUnits tableUnits, final SQLBuilder sqlBuilder) {
244+
public SQLUnit generateSQL(final TableUnits tableUnits, final SQLBuilder sqlBuilder) {
240245
return sqlBuilder.toSQL(getTableTokens(tableUnits), shardingRule);
241246
}
242247

@@ -245,9 +250,9 @@ public String generateSQL(final TableUnits tableUnits, final SQLBuilder sqlBuild
245250
*
246251
* @param tableUnit route table unit
247252
* @param sqlBuilder SQL builder
248-
* @return SQL string
253+
* @return SQL unit
249254
*/
250-
public String generateSQL(final TableUnit tableUnit, final SQLBuilder sqlBuilder) {
255+
public SQLUnit generateSQL(final TableUnit tableUnit, final SQLBuilder sqlBuilder) {
251256
return sqlBuilder.toSQL(getTableTokens(tableUnit), shardingRule);
252257
}
253258

@@ -256,9 +261,9 @@ public String generateSQL(final TableUnit tableUnit, final SQLBuilder sqlBuilder
256261
*
257262
* @param cartesianTableReference cartesian table reference
258263
* @param sqlBuilder SQL builder
259-
* @return SQL string
264+
* @return SQL unit
260265
*/
261-
public String generateSQL(final CartesianTableReference cartesianTableReference, final SQLBuilder sqlBuilder) {
266+
public SQLUnit generateSQL(final CartesianTableReference cartesianTableReference, final SQLBuilder sqlBuilder) {
262267
return sqlBuilder.toSQL(getTableTokens(cartesianTableReference), shardingRule);
263268
}
264269

sharding-core/src/main/java/io/shardingjdbc/core/routing/SQLExecutionUnit.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
* SQL execution unit.
2727
*
2828
* @author gaohongtao
29+
* @author maxiaoguang
2930
*/
3031
@RequiredArgsConstructor
3132
@Getter
@@ -35,5 +36,5 @@ public final class SQLExecutionUnit {
3536

3637
private final String dataSource;
3738

38-
private final String sql;
39+
private final SQLUnit sqlUnit;
3940
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright 1999-2015 dangdang.com.
3+
* <p>
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
* </p>
16+
*/
17+
18+
package io.shardingjdbc.core.routing;
19+
20+
import lombok.EqualsAndHashCode;
21+
import lombok.Getter;
22+
import lombok.RequiredArgsConstructor;
23+
import lombok.ToString;
24+
25+
import java.util.List;
26+
27+
/**
28+
* SQL unit.
29+
*
30+
* @author maxiaoguang
31+
*/
32+
@RequiredArgsConstructor
33+
@Getter
34+
@EqualsAndHashCode(of = { "sql" })
35+
@ToString
36+
public class SQLUnit {
37+
38+
private final String sql;
39+
40+
private final List<Object> parameters;
41+
}

sharding-core/src/main/java/io/shardingjdbc/core/routing/router/DatabaseHintSQLRouter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.shardingjdbc.core.parsing.parser.sql.SQLStatement;
2222
import io.shardingjdbc.core.routing.SQLExecutionUnit;
2323
import io.shardingjdbc.core.routing.SQLRouteResult;
24+
import io.shardingjdbc.core.routing.SQLUnit;
2425
import io.shardingjdbc.core.routing.strategy.hint.HintShardingStrategy;
2526
import io.shardingjdbc.core.routing.type.RoutingResult;
2627
import io.shardingjdbc.core.routing.type.TableUnit;
@@ -35,6 +36,7 @@
3536
* SQL router for hint database only.
3637
*
3738
* @author zhangiang
39+
* @author maxiaoguang
3840
*/
3941
@RequiredArgsConstructor
4042
public final class DatabaseHintSQLRouter implements SQLRouter {
@@ -54,10 +56,10 @@ public SQLRouteResult route(final String logicSQL, final List<Object> parameters
5456
SQLRouteResult result = new SQLRouteResult(sqlStatement, null);
5557
RoutingResult routingResult = new DatabaseHintRoutingEngine(shardingRule.getDataSourceNames(), (HintShardingStrategy) shardingRule.getDefaultDatabaseShardingStrategy()).route();
5658
for (TableUnit each : routingResult.getTableUnits().getTableUnits()) {
57-
result.getExecutionUnits().add(new SQLExecutionUnit(each.getDataSourceName(), logicSQL));
59+
result.getExecutionUnits().add(new SQLExecutionUnit(each.getDataSourceName(), new SQLUnit(logicSQL, parameters)));
5860
}
5961
if (showSQL) {
60-
SQLLogger.logSQL(logicSQL, sqlStatement, result.getExecutionUnits(), parameters);
62+
SQLLogger.logSQL(logicSQL, sqlStatement, result.getExecutionUnits());
6163
}
6264
return result;
6365
}

sharding-core/src/main/java/io/shardingjdbc/core/routing/router/ParsingSQLRouter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.google.common.base.Preconditions;
2222
import io.shardingjdbc.core.constant.DatabaseType;
2323
import io.shardingjdbc.core.optimizer.OptimizeEngineFactory;
24+
import io.shardingjdbc.core.optimizer.condition.ShardingConditions;
2425
import io.shardingjdbc.core.parsing.SQLParsingEngine;
2526
import io.shardingjdbc.core.parsing.parser.context.condition.Column;
2627
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowDatabasesStatement;
@@ -36,7 +37,6 @@
3637
import io.shardingjdbc.core.rewrite.SQLRewriteEngine;
3738
import io.shardingjdbc.core.routing.SQLExecutionUnit;
3839
import io.shardingjdbc.core.routing.SQLRouteResult;
39-
import io.shardingjdbc.core.optimizer.condition.ShardingConditions;
4040
import io.shardingjdbc.core.routing.type.RoutingEngine;
4141
import io.shardingjdbc.core.routing.type.RoutingResult;
4242
import io.shardingjdbc.core.routing.type.TableUnit;
@@ -92,7 +92,7 @@ public SQLRouteResult route(final String logicSQL, final List<Object> parameters
9292
processGeneratedKey(parameters, generatedKey, sqlStatement.getTables().getSingleTableName(), result);
9393
}
9494
RoutingResult routingResult = route(parameters, sqlStatement, generatedKey);
95-
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, logicSQL, databaseType, sqlStatement, generatedKey);
95+
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, logicSQL, databaseType, sqlStatement, parameters, generatedKey);
9696
boolean isSingleRouting = routingResult.isSingleRouting();
9797
if (sqlStatement instanceof SelectStatement && null != ((SelectStatement) sqlStatement).getLimit()) {
9898
processLimit(parameters, (SelectStatement) sqlStatement, isSingleRouting);
@@ -112,7 +112,7 @@ public SQLRouteResult route(final String logicSQL, final List<Object> parameters
112112
}
113113
}
114114
if (showSQL) {
115-
SQLLogger.logSQL(logicSQL, sqlStatement, result.getExecutionUnits(), parameters);
115+
SQLLogger.logSQL(logicSQL, sqlStatement, result.getExecutionUnits());
116116
}
117117
return result;
118118
}

sharding-core/src/main/java/io/shardingjdbc/core/util/SQLLogger.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@
2424
import lombok.extern.slf4j.Slf4j;
2525

2626
import java.util.Collection;
27-
import java.util.List;
2827

2928
/**
3029
* SQL logger.
3130
*
32-
* @author zhangliang
31+
* @author zhangliang
32+
* @author maxiaoguang
3333
*/
3434
@Slf4j(topic = "Sharding-JDBC-SQL")
3535
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@@ -41,16 +41,15 @@ public final class SQLLogger {
4141
* @param logicSQL logic SQL
4242
* @param sqlStatement SQL statement
4343
* @param sqlExecutionUnits SQL execution units
44-
* @param parameters parameters for SQL placeholder
4544
*/
46-
public static void logSQL(final String logicSQL, final SQLStatement sqlStatement, final Collection<SQLExecutionUnit> sqlExecutionUnits, final List<Object> parameters) {
45+
public static void logSQL(final String logicSQL, final SQLStatement sqlStatement, final Collection<SQLExecutionUnit> sqlExecutionUnits) {
4746
log("Logic SQL: {}", logicSQL);
4847
log("SQLStatement: {}", sqlStatement);
4948
for (SQLExecutionUnit each : sqlExecutionUnits) {
50-
if (parameters.isEmpty()) {
51-
log("Actual SQL: {} ::: {}", each.getDataSource(), each.getSql());
49+
if (each.getSqlUnit().getParameters().isEmpty()) {
50+
log("Actual SQL: {} ::: {}", each.getDataSource(), each.getSqlUnit().getSql());
5251
} else {
53-
log("Actual SQL: {} ::: {} ::: {}", each.getDataSource(), each.getSql(), parameters);
52+
log("Actual SQL: {} ::: {} ::: {}", each.getDataSource(), each.getSqlUnit().getSql(), each.getSqlUnit().getParameters());
5453
}
5554
}
5655
}

sharding-core/src/test/java/io/shardingjdbc/core/rewrite/SQLBuilderTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void assertAppendLiteralsOnly() {
4545
sqlBuilder.appendLiterals(".id");
4646
sqlBuilder.appendLiterals(" FROM ");
4747
sqlBuilder.appendLiterals("table_x");
48-
assertThat(sqlBuilder.toSQL(Collections.<String, String>emptyMap(), null), is("SELECT table_x.id FROM table_x"));
48+
assertThat(sqlBuilder.toSQL(Collections.<String, String>emptyMap(), null).getSql(), is("SELECT table_x.id FROM table_x"));
4949
}
5050

5151
@Test
@@ -56,7 +56,7 @@ public void assertAppendTableWithoutTableToken() {
5656
sqlBuilder.appendLiterals(".id");
5757
sqlBuilder.appendLiterals(" FROM ");
5858
sqlBuilder.appendPlaceholder(new TablePlaceholder("table_x"));
59-
assertThat(sqlBuilder.toSQL(Collections.<String, String>emptyMap(), null), is("SELECT table_x.id FROM table_x"));
59+
assertThat(sqlBuilder.toSQL(Collections.<String, String>emptyMap(), null).getSql(), is("SELECT table_x.id FROM table_x"));
6060
}
6161

6262
@Test
@@ -69,7 +69,7 @@ public void assertAppendTableWithTableToken() {
6969
sqlBuilder.appendPlaceholder(new TablePlaceholder("table_x"));
7070
Map<String, String> tableTokens = new HashMap<>(1, 1);
7171
tableTokens.put("table_x", "table_x_1");
72-
assertThat(sqlBuilder.toSQL(tableTokens, null), is("SELECT table_x_1.id FROM table_x_1"));
72+
assertThat(sqlBuilder.toSQL(tableTokens, null).getSql(), is("SELECT table_x_1.id FROM table_x_1"));
7373
}
7474

7575
@Test
@@ -80,7 +80,7 @@ public void assertIndexPlaceholderAppendTableWithoutTableToken() {
8080
sqlBuilder.appendLiterals(" ON ");
8181
sqlBuilder.appendPlaceholder(new TablePlaceholder("table_x"));
8282
sqlBuilder.appendLiterals(" ('column')");
83-
assertThat(sqlBuilder.toSQL(Collections.<String, String>emptyMap(), null), is("CREATE INDEX index_name ON table_x ('column')"));
83+
assertThat(sqlBuilder.toSQL(Collections.<String, String>emptyMap(), null).getSql(), is("CREATE INDEX index_name ON table_x ('column')"));
8484
}
8585

8686
@Test
@@ -93,7 +93,7 @@ public void assertIndexPlaceholderAppendTableWithTableToken() {
9393
sqlBuilder.appendLiterals(" ('column')");
9494
Map<String, String> tableTokens = new HashMap<>(1, 1);
9595
tableTokens.put("table_x", "table_x_1");
96-
assertThat(sqlBuilder.toSQL(tableTokens, null), is("CREATE INDEX index_name_table_x_1 ON table_x_1 ('column')"));
96+
assertThat(sqlBuilder.toSQL(tableTokens, null).getSql(), is("CREATE INDEX index_name_table_x_1 ON table_x_1 ('column')"));
9797
}
9898

9999
@Test(expected = ShardingJdbcException.class)
@@ -117,7 +117,7 @@ public void assertSchemaPlaceholderAppendTableWithTableToken() {
117117
sqlBuilder.appendPlaceholder(new SchemaPlaceholder("ds", "table_0"));
118118
Map<String, String> tableTokens = new HashMap<>(1, 1);
119119
tableTokens.put("table_0", "table_1");
120-
assertThat(sqlBuilder.toSQL(tableTokens, createShardingRule()), is("SHOW CREATE TABLE table_1 ON ds0"));
120+
assertThat(sqlBuilder.toSQL(tableTokens, createShardingRule()).getSql(), is("SHOW CREATE TABLE table_1 ON ds0"));
121121
}
122122

123123
@Test

0 commit comments

Comments
 (0)