Skip to content

Commit

Permalink
For #529.
Browse files Browse the repository at this point in the history
  • Loading branch information
haocao committed Jan 9, 2018
1 parent c6f02f9 commit 4bb5702
Show file tree
Hide file tree
Showing 18 changed files with 230 additions and 77 deletions.
3 changes: 2 additions & 1 deletion RELEASE-NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
1. [ISSUE #520](https://github.com/shardingjdbc/sharding-jdbc/issues/520) 引入分表后,唯一键冲突时异常类型不再是DuplicateKeyException
1. [ISSUE #521](https://github.com/shardingjdbc/sharding-jdbc/issues/521) YAML文件中ShardingProperties设置无效
1. [ISSUE #522](https://github.com/shardingjdbc/sharding-jdbc/issues/522) 读写分离Slave库不需要执行DDL语句

1. [ISSUE #529](https://github.com/shardingjdbc/sharding-jdbc/issues/529) 表名大写无法查询

## 2.0.1

### 功能提升
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.TreeSet;

/**
* Tables collection.
Expand Down Expand Up @@ -79,7 +79,7 @@ public String getSingleTableName() {
* @return 表名称集合
*/
public Collection<String> getTableNames() {
Collection<String> result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
Collection<String> result = new HashSet<>(tables.size(), 1);
for (Table each : tables) {
result.add(each.getName());
}
Expand All @@ -99,7 +99,7 @@ public Optional<Table> find(final String tableNameOrAlias) {

private Optional<Table> findTableFromName(final String name) {
for (Table each : tables) {
if (each.getName().equalsIgnoreCase(name)) {
if (each.getName().equals(name)) {
return Optional.of(each);
}
}
Expand All @@ -108,7 +108,7 @@ private Optional<Table> findTableFromName(final String name) {

private Optional<Table> findTableFromAlias(final String alias) {
for (Table each : tables) {
if (each.getAlias().isPresent() && each.getAlias().get().equalsIgnoreCase(alias)) {
if (each.getAlias().isPresent() && each.getAlias().get().equals(alias)) {
return Optional.of(each);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public final class IndexToken implements SQLToken {
* @return index name
*/
public String getIndexName() {
return SQLUtil.getExactlyValue(originalLiterals).toLowerCase();
return SQLUtil.getExactlyValue(originalLiterals);
}

/**
Expand All @@ -54,6 +54,6 @@ public String getIndexName() {
* @return table name
*/
public String getTableName() {
return SQLUtil.getExactlyValue(tableName).toLowerCase();
return SQLUtil.getExactlyValue(tableName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,6 @@ public final class TableToken implements SQLToken {
* @return table name
*/
public String getTableName() {
return SQLUtil.getExactlyValue(originalLiterals).toLowerCase();
return SQLUtil.getExactlyValue(originalLiterals);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -127,14 +127,14 @@ public int compare(final SQLToken o1, final SQLToken o2) {
}

private void appendTableToken(final SQLBuilder sqlBuilder, final TableToken tableToken, final int count, final List<SQLToken> sqlTokens) {
sqlBuilder.appendTable(tableToken.getTableName());
sqlBuilder.appendTable(tableToken.getTableName().toLowerCase());
int beginPosition = tableToken.getBeginPosition() + tableToken.getOriginalLiterals().length();
appendRest(sqlBuilder, count, sqlTokens, beginPosition);
}

private void appendIndexToken(final SQLBuilder sqlBuilder, final IndexToken indexToken, final int count, final List<SQLToken> sqlTokens) {
String indexName = indexToken.getIndexName();
String logicTableName = indexToken.getTableName();
String indexName = indexToken.getIndexName().toLowerCase();
String logicTableName = indexToken.getTableName().toLowerCase();
if (Strings.isNullOrEmpty(logicTableName)) {
logicTableName = shardingRule.getLogicTableName(indexName);
}
Expand Down Expand Up @@ -220,9 +220,10 @@ public String generateSQL(final CartesianTableReference cartesianTableReference,
}

private Map<String, String> getTableTokens(final TableUnit tableUnit) {
String logicTableName = tableUnit.getLogicTableName().toLowerCase();
Map<String, String> tableTokens = new HashMap<>();
tableTokens.put(tableUnit.getLogicTableName(), tableUnit.getActualTableName());
Optional<BindingTableRule> bindingTableRule = shardingRule.findBindingTableRule(tableUnit.getLogicTableName());
tableTokens.put(logicTableName, tableUnit.getActualTableName());
Optional<BindingTableRule> bindingTableRule = shardingRule.findBindingTableRule(logicTableName);
if (bindingTableRule.isPresent()) {
tableTokens.putAll(getBindingTableTokens(tableUnit, bindingTableRule.get()));
}
Expand All @@ -232,8 +233,9 @@ private Map<String, String> getTableTokens(final TableUnit tableUnit) {
private Map<String, String> getTableTokens(final CartesianTableReference cartesianTableReference) {
Map<String, String> tableTokens = new HashMap<>();
for (TableUnit each : cartesianTableReference.getTableUnits()) {
tableTokens.put(each.getLogicTableName(), each.getActualTableName());
Optional<BindingTableRule> bindingTableRule = shardingRule.findBindingTableRule(each.getLogicTableName());
String logicTableName = each.getLogicTableName().toLowerCase();
tableTokens.put(logicTableName, each.getActualTableName());
Optional<BindingTableRule> bindingTableRule = shardingRule.findBindingTableRule(logicTableName);
if (bindingTableRule.isPresent()) {
tableTokens.putAll(getBindingTableTokens(each, bindingTableRule.get()));
}
Expand All @@ -244,8 +246,9 @@ private Map<String, String> getTableTokens(final CartesianTableReference cartesi
private Map<String, String> getBindingTableTokens(final TableUnit tableUnit, final BindingTableRule bindingTableRule) {
Map<String, String> result = new HashMap<>();
for (String eachTable : sqlStatement.getTables().getTableNames()) {
if (!eachTable.equalsIgnoreCase(tableUnit.getLogicTableName()) && bindingTableRule.hasLogicTable(eachTable)) {
result.put(eachTable, bindingTableRule.getBindingActualTable(tableUnit.getDataSourceName(), eachTable, tableUnit.getActualTableName()));
String tableName = eachTable.toLowerCase();
if (!tableName.equals(tableUnit.getLogicTableName().toLowerCase()) && bindingTableRule.hasLogicTable(tableName)) {
result.put(tableName, bindingTableRule.getBindingActualTable(tableUnit.getDataSourceName(), tableName, tableUnit.getActualTableName()));
}
}
return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

/**
* Route table unit collection.
Expand All @@ -50,7 +49,7 @@ public final class TableUnits {
* @return all data source names
*/
public Collection<String> getDataSourceNames() {
Collection<String> result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
Collection<String> result = new HashSet<>(tableUnits.size(), 1);
for (TableUnit each : tableUnits) {
result.add(each.getDataSourceName());
}
Expand Down Expand Up @@ -95,7 +94,7 @@ public List<Set<String>> getActualTableNameGroups(final String dataSourceName, f
}

private Set<String> getActualTableNames(final String dataSourceName, final String logicTableName) {
Set<String> result = new HashSet<>();
Set<String> result = new HashSet<>(tableUnits.size(), 1);
for (TableUnit each : tableUnits) {
if (each.getDataSourceName().equalsIgnoreCase(dataSourceName) && each.getLogicTableName().equalsIgnoreCase(logicTableName)) {
result.add(each.getActualTableName());
Expand All @@ -122,7 +121,7 @@ public Map<String, Set<String>> getDataSourceLogicTablesMap(final Collection<Str
}

private Set<String> getLogicTableNames(final String dataSourceName) {
Set<String> result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
Set<String> result = new HashSet<>(tableUnits.size(), 1);
for (TableUnit each : tableUnits) {
if (each.getDataSourceName().equalsIgnoreCase(dataSourceName)) {
result.addAll(Lists.transform(tableUnits, new Function<TableUnit, String>() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public final class BindingTableRule {
*/
public boolean hasLogicTable(final String logicTableName) {
for (TableRule each : tableRules) {
if (each.getLogicTable().equalsIgnoreCase(logicTableName)) {
if (each.getLogicTable().equals(logicTableName.toLowerCase())) {
return true;
}
}
Expand All @@ -72,8 +72,8 @@ public String getBindingActualTable(final String dataSource, final String logicT
}
Preconditions.checkState(-1 != index, String.format("Actual table [%s].[%s] is not in table config", dataSource, otherActualTable));
for (TableRule each : tableRules) {
if (each.getLogicTable().equalsIgnoreCase(logicTable)) {
return each.getActualDataNodes().get(index).getTableName();
if (each.getLogicTable().equals(logicTable.toLowerCase())) {
return each.getActualDataNodes().get(index).getTableName().toLowerCase();
}
}
throw new IllegalStateException(String.format("Cannot find binding actual table, data source: %s, logic table: %s, other actual table: %s", dataSource, logicTable, otherActualTable));
Expand All @@ -84,7 +84,7 @@ Collection<String> getAllLogicTables() {

@Override
public String apply(final TableRule input) {
return input.getLogicTable();
return input.getLogicTable().toLowerCase();
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

package io.shardingjdbc.core.rule;

import com.google.common.base.Optional;
import com.google.common.base.Strings;
import io.shardingjdbc.core.api.config.TableRuleConfiguration;
import io.shardingjdbc.core.api.config.strategy.NoneShardingStrategyConfiguration;
import io.shardingjdbc.core.exception.ShardingJdbcException;
Expand All @@ -25,19 +27,16 @@
import io.shardingjdbc.core.routing.strategy.ShardingStrategy;
import io.shardingjdbc.core.routing.strategy.none.NoneShardingStrategy;
import io.shardingjdbc.core.util.StringUtil;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;

/**
* Databases and tables sharding rule configuration.
Expand Down Expand Up @@ -97,7 +96,7 @@ private String getDefaultDataSourceName(final Map<String, DataSource> dataSource
*/
public Optional<TableRule> tryFindTableRule(final String logicTableName) {
for (TableRule each : tableRules) {
if (each.getLogicTable().equalsIgnoreCase(logicTableName)) {
if (each.getLogicTable().equals(logicTableName.toLowerCase())) {
return Optional.of(each);
}
}
Expand All @@ -111,12 +110,12 @@ public Optional<TableRule> tryFindTableRule(final String logicTableName) {
* @return table rule
*/
public TableRule getTableRule(final String logicTableName) {
Optional<TableRule> tableRule = tryFindTableRule(logicTableName);
Optional<TableRule> tableRule = tryFindTableRule(logicTableName.toLowerCase());
if (tableRule.isPresent()) {
return tableRule.get();
}
if (null != defaultDataSourceName) {
return createTableRuleWithDefaultDataSource(logicTableName);
return createTableRuleWithDefaultDataSource(logicTableName.toLowerCase());
}
throw new ShardingJdbcException("Cannot find table rule and default data source with logic table: '%s'", logicTableName);
}
Expand Down Expand Up @@ -166,10 +165,19 @@ public ShardingStrategy getTableShardingStrategy(final TableRule tableRule) {
* @return logic tables is all belong to binding tables or not
*/
public boolean isAllBindingTables(final Collection<String> logicTables) {
Collection<String> bindingTables = filterAllBindingTables(logicTables);
return !bindingTables.isEmpty() && bindingTables.containsAll(logicTables);
if (logicTables.isEmpty()) {
return false;
}
Optional<BindingTableRule> bindingTableRule = findBindingTableRule(logicTables);
if (!bindingTableRule.isPresent()) {
return false;
}
Collection<String> result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
result.addAll(bindingTableRule.get().getAllLogicTables());
return !result.isEmpty() && result.containsAll(logicTables);
}


/**
* Adjust logic tables is all belong to default data source.
*
Expand All @@ -185,25 +193,6 @@ public boolean isAllInDefaultDataSource(final Collection<String> logicTables) {
return !logicTables.isEmpty();
}

/**
* Filter all binding tables.
*
* @param logicTables names of logic tables
* @return names for filtered binding tables
*/
public Collection<String> filterAllBindingTables(final Collection<String> logicTables) {
if (logicTables.isEmpty()) {
return Collections.emptyList();
}
Optional<BindingTableRule> bindingTableRule = findBindingTableRule(logicTables);
if (!bindingTableRule.isPresent()) {
return Collections.emptyList();
}
Collection<String> result = new ArrayList<>(bindingTableRule.get().getAllLogicTables());
result.retainAll(logicTables);
return result;
}

private Optional<BindingTableRule> findBindingTableRule(final Collection<String> logicTables) {
for (String each : logicTables) {
Optional<BindingTableRule> result = findBindingTableRule(each);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,13 @@ public final class TableRule {
public TableRule(final String logicTable, final List<String> actualDataNodes, final Map<String, DataSource> dataSourceMap,
final ShardingStrategy databaseShardingStrategy, final ShardingStrategy tableShardingStrategy,
final String generateKeyColumn, final KeyGenerator keyGenerator, final String logicIndex) {
this.logicTable = logicTable;
this.logicTable = logicTable.toLowerCase();
this.actualDataNodes = null == actualDataNodes || actualDataNodes.isEmpty() ? generateDataNodes(logicTable, dataSourceMap) : generateDataNodes(actualDataNodes, dataSourceMap);
this.databaseShardingStrategy = databaseShardingStrategy;
this.tableShardingStrategy = tableShardingStrategy;
this.generateKeyColumn = generateKeyColumn;
this.keyGenerator = keyGenerator;
this.logicIndex = logicIndex;
this.logicIndex = null == logicIndex ? logicIndex : logicIndex.toLowerCase();
}

private List<DataNode> generateDataNodes(final String logicTable, final Map<String, DataSource> dataSourceMap) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public void assertGetBindingActualTablesFailureWhenNotFound() {

@Test
public void assertGetAllLogicTables() {
assertThat(createBindingTableRule().getAllLogicTables(), is((Collection<String>) Arrays.asList("logicTable", "subLogicTable")));
assertThat(createBindingTableRule().getAllLogicTables(), is((Collection<String>) Arrays.asList("logictable", "sublogictable")));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,19 @@

package io.shardingjdbc.core.rule;

import io.shardingjdbc.core.api.algorithm.fixture.TestPreciseShardingAlgorithm;
import io.shardingjdbc.core.api.config.ShardingRuleConfiguration;
import io.shardingjdbc.core.api.config.TableRuleConfiguration;
import io.shardingjdbc.core.api.config.strategy.NoneShardingStrategyConfiguration;
import io.shardingjdbc.core.api.config.strategy.ShardingStrategyConfiguration;
import io.shardingjdbc.core.api.config.strategy.StandardShardingStrategyConfiguration;
import io.shardingjdbc.core.api.algorithm.fixture.TestPreciseShardingAlgorithm;
import io.shardingjdbc.core.parsing.parser.context.condition.Column;
import io.shardingjdbc.core.routing.strategy.none.NoneShardingStrategy;
import org.junit.Test;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Expand Down Expand Up @@ -191,24 +190,6 @@ public void assertGetBindingTableRuleForFound() throws SQLException {
assertThat(actual.findBindingTableRule("logicTable").get().getTableRules().size(), is(2));
}

@Test
public void assertFilterAllBindingTablesWhenLogicTablesIsEmpty() throws SQLException {
assertThat(createShardingRule().filterAllBindingTables(Collections.<String>emptyList()), is((Collection<String>) Collections.<String>emptyList()));
}

@Test
public void assertFilterAllBindingTablesWhenBindingTableRuleIsNotFound() throws SQLException {
assertThat(createShardingRule().filterAllBindingTables(Collections.singletonList("newTable")), is((Collection<String>) Collections.<String>emptyList()));
}

@Test
public void assertFilterAllBindingTables() throws SQLException {
assertThat(createShardingRule().filterAllBindingTables(Collections.singletonList("logicTable")), is((Collection<String>) Collections.singletonList("logicTable")));
assertThat(createShardingRule().filterAllBindingTables(Collections.singletonList("subLogicTable")), is((Collection<String>) Collections.singletonList("subLogicTable")));
assertThat(createShardingRule().filterAllBindingTables(Arrays.asList("logicTable", "subLogicTable")), is((Collection<String>) Arrays.asList("logicTable", "subLogicTable")));
assertThat(createShardingRule().filterAllBindingTables(Arrays.asList("logicTable", "newTable", "subLogicTable")), is((Collection<String>) Arrays.asList("logicTable", "subLogicTable")));
}

@Test
public void assertIsAllBindingTableWhenLogicTablesIsEmpty() throws SQLException {
assertFalse(createShardingRule().isAllBindingTables(Collections.<String>emptyList()));
Expand All @@ -222,9 +203,17 @@ public void assertIsNotAllBindingTable() throws SQLException {

@Test
public void assertIsAllBindingTable() throws SQLException {

assertTrue(createShardingRule().isAllBindingTables(Collections.singletonList("logicTable")));
assertTrue(createShardingRule().isAllBindingTables(Collections.singletonList("logictable")));
assertTrue(createShardingRule().isAllBindingTables(Collections.singletonList("subLogicTable")));
assertTrue(createShardingRule().isAllBindingTables(Collections.singletonList("sublogictable")));
assertTrue(createShardingRule().isAllBindingTables(Arrays.asList("logicTable", "subLogicTable")));
assertTrue(createShardingRule().isAllBindingTables(Arrays.asList("logictable", "sublogicTable")));
assertFalse(createShardingRule().isAllBindingTables(Arrays.asList("logictable", "sublogicTable", "newtable")));

assertFalse(createShardingRule().isAllBindingTables(Collections.<String>emptyList()));
assertFalse(createShardingRule().isAllBindingTables(Collections.singletonList("newTable")));
}

@Test
Expand Down
Loading

0 comments on commit 4bb5702

Please sign in to comment.