From 25efa6d2c6f4bb7335ffe51f5fed602f8382dbb8 Mon Sep 17 00:00:00 2001 From: haocao Date: Fri, 29 Dec 2017 19:06:21 +0800 Subject: [PATCH] For #525 2th. --- .../shardingjdbc/core/rewrite/SQLBuilder.java | 8 +++++++- .../core/rewrite/SQLRewriteEngine.java | 8 +++++++- .../shardingjdbc/core/rule/ShardingRule.java | 19 +++++++++++++++++++ .../AbstractShardingTableOnlyTest.java | 10 +++++++++- .../test/resources/integrate/assert/drop.xml | 17 +++++++++++++++++ 5 files changed, 59 insertions(+), 3 deletions(-) diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLBuilder.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLBuilder.java index 48e711f594283..4ae1e54294d01 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLBuilder.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLBuilder.java @@ -17,6 +17,7 @@ package io.shardingjdbc.core.rewrite; +import com.google.common.base.Strings; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -91,7 +92,12 @@ public String toSQL(final Map tableTokens) { result.append(tableTokens.get(((TableToken) each).tableName)); } else if (each instanceof IndexToken) { IndexToken indexToken = (IndexToken) each; - result.append(indexToken.indexName + "_" + tableTokens.get(indexToken.tableName)); + result.append(indexToken.indexName); + String tableName = tableTokens.get(indexToken.tableName); + if (!Strings.isNullOrEmpty(tableName)) { + result.append("_"); + result.append(tableName); + } } else { result.append(each); } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLRewriteEngine.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLRewriteEngine.java index 74770b5505a09..f1849d281e6d4 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLRewriteEngine.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLRewriteEngine.java @@ -18,6 +18,7 @@ package io.shardingjdbc.core.rewrite; import com.google.common.base.Optional; +import com.google.common.base.Strings; import io.shardingjdbc.core.constant.DatabaseType; import io.shardingjdbc.core.parsing.lexer.token.DefaultKeyword; import io.shardingjdbc.core.parsing.parser.context.OrderItem; @@ -132,7 +133,12 @@ private void appendTableToken(final SQLBuilder sqlBuilder, final TableToken tabl } private void appendIndexToken(final SQLBuilder sqlBuilder, final IndexToken indexToken, final int count, final List sqlTokens) { - sqlBuilder.appendIndex(indexToken.getIndexName(), indexToken.getTableName()); + String indexName = indexToken.getIndexName(); + String logicTableName = indexToken.getTableName(); + if (Strings.isNullOrEmpty(logicTableName)) { + logicTableName = shardingRule.getLogicTableName(indexName); + } + sqlBuilder.appendIndex(indexName, logicTableName); int beginPosition = indexToken.getBeginPosition() + indexToken.getOriginalLiterals().length(); appendRest(sqlBuilder, count, sqlTokens, beginPosition); } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rule/ShardingRule.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rule/ShardingRule.java index b3fdb29d6015a..e7f99bfc0b77d 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rule/ShardingRule.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rule/ShardingRule.java @@ -284,4 +284,23 @@ public Number generateKey(final String logicTableName) { } return defaultKeyGenerator.generateKey(); } + + /** + * Get logic table name base on logic index name. + * + * @param logicIndexName logic index name + * @return logic table name + */ + public String getLogicTableName(final String logicIndexName) { + String result = ""; + for (TableRule each : tableRules) { + if (logicIndexName.equals(each.getLogicIndex())) { + result = each.getLogicTable(); + } + } + if (Strings.isNullOrEmpty(result)) { + throw new ShardingJdbcException("Cannot find logic table name with logic index name: '%s'", logicIndexName); + } + return result; + } } diff --git a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingTableOnlyTest.java b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingTableOnlyTest.java index 8fd801dfe1828..1540f4fa89a03 100644 --- a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingTableOnlyTest.java +++ b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingTableOnlyTest.java @@ -86,6 +86,10 @@ protected final Map getDataSources() throws SQ orderItemTableRuleConfig.setActualDataNodes(Joiner.on(",").join(orderItemActualDataNodes)); orderItemTableRuleConfig.setKeyGeneratorClass("item_id"); shardingRuleConfig.getTableRuleConfigs().add(orderItemTableRuleConfig); + TableRuleConfiguration logTableRuleConfig = new TableRuleConfiguration(); + logTableRuleConfig.setLogicIndex("t_log_index"); + logTableRuleConfig.setLogicTable("t_log"); + shardingRuleConfig.getTableRuleConfigs().add(logTableRuleConfig); shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item"); shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new NoneShardingStrategyConfiguration()); shardingRuleConfig.setDefaultTableShardingStrategyConfig( @@ -104,11 +108,15 @@ public void initDDLTables() throws SQLException { executeSql("CREATE TABLE t_log(id int, status varchar(10))"); } } + if (getSql().startsWith("DROP INDEX")) { + executeSql("CREATE TABLE t_log(id int, status varchar(10))"); + executeSql("CREATE INDEX t_log_index ON t_log(status)"); + } } @After public void cleanupDdlTables() throws SQLException { - if (getSql().startsWith("CREATE TABLE") || getSql().startsWith("ALTER") || getSql().startsWith("TRUNCATE") || getSql().startsWith("CREATE INDEX") || getSql().startsWith("CREATE UNIQUE INDEX")) { + if (getSql().startsWith("CREATE") || getSql().startsWith("ALTER") || getSql().startsWith("TRUNCATE") || getSql().startsWith("DROP INDEX")) { if (getSql().contains("TEMP")) { executeSql("DROP TABLE t_temp_log"); } else { diff --git a/sharding-jdbc-core/src/test/resources/integrate/assert/drop.xml b/sharding-jdbc-core/src/test/resources/integrate/assert/drop.xml index 96f428d84d12c..c2912c116ee6f 100644 --- a/sharding-jdbc-core/src/test/resources/integrate/assert/drop.xml +++ b/sharding-jdbc-core/src/test/resources/integrate/assert/drop.xml @@ -25,4 +25,21 @@ + + + + + + + + + + +