Skip to content

Commit

Permalink
For #525 3th.
Browse files Browse the repository at this point in the history
  • Loading branch information
haocao committed Jan 3, 2018
1 parent eec4c94 commit 16eb573
Show file tree
Hide file tree
Showing 13 changed files with 128 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ public abstract class AbstractSQLStatement implements SQLStatement {

private int parametersIndex;

private boolean containsTableName = true;

@Override
public final SQLType getType() {
return type;
Expand All @@ -59,4 +61,14 @@ public final SQLType getType() {
public int increaseParametersIndex() {
return ++parametersIndex;
}

@Override
public void setContainsTableName(final boolean containsTableName) {
this.containsTableName = containsTableName;
}

@Override
public boolean containsTableName() {
return this.containsTableName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,16 @@ public interface SQLStatement {
* @return 增加后的索引偏移量
*/
int increaseParametersIndex();

/**
* Set contain table name.
*/
void setContainsTableName(boolean containsTableName);

/**
* Adjust contains table name is empty or not.
*
* @return table name is empty or not
*/
boolean containsTableName();
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import io.shardingjdbc.core.parsing.parser.sql.SQLParser;
import io.shardingjdbc.core.parsing.parser.sql.ddl.DDLStatement;
import io.shardingjdbc.core.parsing.parser.token.IndexToken;
import io.shardingjdbc.core.parsing.parser.token.SQLToken;
import io.shardingjdbc.core.rule.ShardingRule;
import lombok.AccessLevel;
import lombok.Getter;
Expand Down Expand Up @@ -64,6 +65,11 @@ public DDLStatement parse() {
throw new SQLParsingException("Can't support other DROP grammar unless DROP TABLE, DROP INDEX.");
}
tableReferencesClauseParser.parse(result, true);
for (SQLToken each : result.getSqlTokens()) {
if (each instanceof IndexToken && result.getSqlTokens().size() == 1) {
result.setContainsTableName(false);
}
}
return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@

package io.shardingjdbc.core.routing.router;

import io.shardingjdbc.core.parsing.parser.sql.ddl.DDLStatement;
import io.shardingjdbc.core.routing.type.all.DatabaseAllRoutingEngine;
import io.shardingjdbc.core.routing.type.none.NoneTableRoutingEngine;
import io.shardingjdbc.core.rule.ShardingRule;
import io.shardingjdbc.core.constant.DatabaseType;
import io.shardingjdbc.core.jdbc.core.ShardingContext;
Expand Down Expand Up @@ -109,7 +111,9 @@ public SQLRouteResult route(final String logicSQL, final List<Object> parameters
private RoutingResult route(final List<Object> parameters, final SQLStatement sqlStatement) {
Collection<String> tableNames = sqlStatement.getTables().getTableNames();
RoutingEngine routingEngine;
if (tableNames.isEmpty()) {
if (sqlStatement instanceof DDLStatement && !sqlStatement.containsTableName() && tableNames.size() == 0) {
routingEngine = new NoneTableRoutingEngine(shardingRule, parameters, sqlStatement);
} else if (tableNames.isEmpty()) {
routingEngine = new DatabaseAllRoutingEngine(shardingRule.getDataSourceMap());
} else if (1 == tableNames.size() || shardingRule.isAllBindingTables(tableNames) || shardingRule.isAllInDefaultDataSource(tableNames)) {
routingEngine = new SimpleRoutingEngine(shardingRule, parameters, tableNames.iterator().next(), sqlStatement);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
* Copyright 1999-2015 dangdang.com.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* </p>
*/

package io.shardingjdbc.core.routing.type.none;

import com.google.common.base.Preconditions;
import io.shardingjdbc.core.parsing.parser.sql.SQLStatement;
import io.shardingjdbc.core.parsing.parser.token.IndexToken;
import io.shardingjdbc.core.routing.type.RoutingEngine;
import io.shardingjdbc.core.routing.type.RoutingResult;
import io.shardingjdbc.core.routing.type.simple.SimpleRoutingEngine;
import io.shardingjdbc.core.rule.ShardingRule;
import io.shardingjdbc.core.rule.TableRule;
import lombok.RequiredArgsConstructor;

import java.util.List;

/**
* None table routing engine.
*
* @author caohao
*/
@RequiredArgsConstructor
public final class NoneTableRoutingEngine implements RoutingEngine {

private final ShardingRule shardingRule;

private final List<Object> parameters;

private final SQLStatement sqlStatement;

@Override
public RoutingResult route() {
return new SimpleRoutingEngine(shardingRule, parameters, getLogicTableName(), sqlStatement).route();
}

private String getLogicTableName() {
Preconditions.checkState(sqlStatement.getSqlTokens().size() == 1);
IndexToken indexToken = (IndexToken) sqlStatement.getSqlTokens().get(0);
String indexName = indexToken.getIndexName();
String logicTableName = "";
for (TableRule each : shardingRule.getTableRules()) {
if (indexName.equals(each.getLogicIndex())) {
logicTableName = each.getLogicTable();
}
}
return logicTableName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,19 +71,20 @@ protected final Map<DatabaseType, ShardingDataSource> getDataSources() throws SQ
final ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration();
orderTableRuleConfig.setLogicTable("t_order");
orderTableRuleConfig.setLogicIndex("t_order_index");
List<String> orderActualDataNodes = new LinkedList<>();
for (String dataSourceName : entry.getValue().keySet()) {
orderActualDataNodes.add(dataSourceName + ".t_order_${0..9}");
}
orderTableRuleConfig.setActualDataNodes(Joiner.on(",").join(orderActualDataNodes));
shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);
TableRuleConfiguration orderItemTableRuleConfig = new TableRuleConfiguration();
orderItemTableRuleConfig.setLogicTable("t_order_item");
List<String> orderItemActualDataNodes = new LinkedList<>();
for (String dataSourceName : entry.getValue().keySet()) {
orderItemActualDataNodes.add(dataSourceName + ".t_order_item_${0..9}");
}
orderItemTableRuleConfig.setActualDataNodes(Joiner.on(",").join(orderItemActualDataNodes));
orderItemTableRuleConfig.setLogicTable("t_order_item");
orderItemTableRuleConfig.setKeyGeneratorClass("item_id");
shardingRuleConfig.getTableRuleConfigs().add(orderItemTableRuleConfig);
TableRuleConfiguration logTableRuleConfig = new TableRuleConfiguration();
Expand All @@ -101,7 +102,7 @@ protected final Map<DatabaseType, ShardingDataSource> getDataSources() throws SQ

@Before
public void initDDLTables() throws SQLException {
if (getSql().startsWith("ALTER") || getSql().startsWith("TRUNCATE") || getSql().startsWith("DROP TABLE") || getSql().startsWith("CREATE INDEX") || getSql().startsWith("CREATE UNIQUE INDEX")) {
if (getSql().startsWith("ALTER") || getSql().startsWith("TRUNCATE") || getSql().startsWith("DROP TABLE") || getSql().startsWith("CREATE UNIQUE INDEX")) {
if (getSql().contains("TEMP")) {
executeSql("CREATE TEMPORARY TABLE t_temp_log(id int, status varchar(10))");
} else {
Expand All @@ -116,7 +117,11 @@ public void initDDLTables() throws SQLException {

@After
public void cleanupDdlTables() throws SQLException {
if (getSql().startsWith("CREATE") || getSql().startsWith("ALTER") || getSql().startsWith("TRUNCATE") || getSql().startsWith("DROP INDEX")) {
if (getSql().startsWith("CREATE UNIQUE INDEX")) {
executeSql("DROP TABLE t_log");
} else if (getSql().startsWith("CREATE INDEX")) {
executeSql("DROP INDEX t_order_index");
} else if (getSql().startsWith("ALTER") || getSql().startsWith("TRUNCATE") || getSql().startsWith("CREATE") || getSql().startsWith("DROP INDEX")) {
if (getSql().contains("TEMP")) {
executeSql("DROP TABLE t_temp_log");
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
</sql>
<sql id="assertCreateIndex">
<sharding-rule value="tbl">
<data expected="index/tbl.xml" />
<data expected="index/tbl_sharding.xml" />
</sharding-rule>
</sql>
<sql id="assertCreateUniqueIndex">
Expand Down
12 changes: 5 additions & 7 deletions sharding-jdbc-core/src/test/resources/integrate/assert/drop.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,14 @@
<data expected="drop/tbl.xml" />
</sharding-rule>
</sql>
<!--
<sql id="assertDropIndexWithoutOn">
<sharding-rule value="tbl">
<data expected="drop/tbl.xml" />
</sharding-rule>
</sql>
-->
<!--<sql id="assertDropIndexIfExists">-->
<!--<sharding-rule value="tbl">-->
<!--<data expected="drop/tbl.xml" />-->
<!--</sharding-rule>-->
<!--</sql>-->
<sql id="assertDropIndexIfExists">
<sharding-rule value="tbl">
<data expected="drop/tbl.xml" />
</sharding-rule>
</sql>
</sqls>
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
<dataset>
<t_log />
</dataset>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<dataset>
<t_order_0 />
<t_order_1 />
<t_order_2 />
<t_order_3 />
<t_order_4 />
<t_order_5 />
<t_order_6 />
<t_order_7 />
<t_order_8 />
<t_order_9 />
</dataset>
2 changes: 1 addition & 1 deletion sharding-jdbc-core/src/test/resources/sql/ddl/create.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
<sql id="assertCreateGlobalTemporaryTable" value="CREATE GLOBAL TEMPORARY TABLE t_temp_log(id int, status varchar(10))" type="Oracle,PostgreSQL" />
<sql id="assertCreateLocalTempTable" value="CREATE LOCAL TEMP TABLE t_temp_log(id int, status varchar(10))" type="PostgreSQL" />
<sql id="assertCreateUnloggedTable" value="CREATE UNLOGGED TABLE t_log(id int, status varchar(10))" type="PostgreSQL" />
<sql id="assertCreateIndex" value="CREATE INDEX t_log_index ON t_log (id)" />
<sql id="assertCreateIndex" value="CREATE INDEX t_order_index ON t_order (user_id)" />
<sql id="assertCreateUniqueIndex" value="CREATE UNIQUE INDEX t_log_index ON t_log (id)" />
</sqls>
2 changes: 1 addition & 1 deletion sharding-jdbc-core/src/test/resources/sql/ddl/drop.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
<sql id="assertDropTableCascadeConstraintsAndPurge" value="DROP TABLE t_log CASCADE CONSTRAINTS PURGE" type="Oracle" />
<sql id="assertDropIndex" value="DROP INDEX t_log_index ON t_log" type="MySQL,SQLServer" />
<sql id="assertDropIndexWithoutOn" value="DROP INDEX t_log_index" type="PostgreSQL,Oracle" />
<sql id="assertDropIndexIfExists" value="DROP INDEX IF EXISTS t_log_index" type="PostgreSQL" />
<sql id="assertDropIndexIfExists" value="DROP INDEX IF EXISTS t_order_index" type="PostgreSQL" />
</sqls>
2 changes: 1 addition & 1 deletion sharding-jdbc-core/src/test/resources/sql/dql/select.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<sql id="assertSelectIterator" value="SELECT t.* FROM t_order_item t WHERE t.item_id IN (%s, %s)" />
<sql id="assertSelectNoShardingTable" value="SELECT i.* FROM t_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id ORDER BY i.item_id" />
<sql id="assertSelectLikeWithCount" value="SELECT count(0) as orders_count FROM `t_order` o WHERE o.status LIKE CONCAT('%%', %s, '%%') AND o.`user_id` IN (%s, %s) AND o.`order_id` BETWEEN %s AND %s" type="MySQL,H2" />
<sql id="assertSelectWithBindingTable" value="SELECT i.* FROM t_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id WHERE o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s ORDER BY i.item_id" />
<sql id="assertSelectWithBindingTable" value="SELECT i.* FROM T_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id WHERE o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s ORDER BY i.item_id" />
<sql id="assertSelectWithBindingTableAndConfigTable" value="SELECT i.* FROM t_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id JOIN t_config c ON o.status = c.status WHERE o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s AND c.status = %s ORDER BY i.item_id" />
<sql id="assertSelectCountWithBindingTable" value="SELECT COUNT(*) AS items_count FROM t_order o, t_order_item i WHERE o.user_id = i.user_id AND o.order_id = i.order_id AND o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s" />
<sql id="assertSelectCountWithBindingTableWithJoin" value="SELECT COUNT(*) AS items_count FROM t_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id WHERE o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s" />
Expand Down

0 comments on commit 16eb573

Please sign in to comment.