Skip to content

Commit

Permalink
refactor ShardingRule
Browse files Browse the repository at this point in the history
  • Loading branch information
terrymanu committed Jan 14, 2019
1 parent 1bc672f commit 9f941f3
Show file tree
Hide file tree
Showing 11 changed files with 121 additions and 133 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import io.shardingsphere.core.routing.router.sharding.GeneratedKey;
import io.shardingsphere.core.rule.ShardingRule;
import lombok.RequiredArgsConstructor;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
Expand Down Expand Up @@ -82,7 +83,7 @@ private Iterator<Comparable<?>> createGeneratedKeys() {
}

private boolean isNeededToAppendGeneratedKey() {
return -1 == insertStatement.getGenerateKeyColumnIndex() && shardingRule.getGenerateKeyColumn(insertStatement.getTables().getSingleTableName()).isPresent();
return -1 == insertStatement.getGenerateKeyColumnIndex() && shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName()).isPresent();
}

private List<Object> getCurrentParameters(final int beginCount, final int increment) {
Expand All @@ -92,7 +93,7 @@ private List<Object> getCurrentParameters(final int beginCount, final int increm
}

private InsertShardingCondition getInsertShardingCondition(final Comparable<?> currentGeneratedKey, final InsertValue insertValue, final List<Object> currentParameters) {
Column generateKeyColumn = shardingRule.getGenerateKeyColumn(insertStatement.getTables().getSingleTableName()).get();
Column generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName()).get();
String expression = getExpression(insertValue, currentGeneratedKey, generateKeyColumn, currentParameters);
InsertShardingCondition result = new InsertShardingCondition(expression, currentParameters);
result.getShardingValues().add(getShardingCondition(generateKeyColumn, currentGeneratedKey));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public InsertColumnsClauseParser(final ShardingRule shardingRule, final LexerEng
*/
public void parse(final InsertStatement insertStatement, final ShardingTableMetaData shardingTableMetaData) {
String tableName = insertStatement.getTables().getSingleTableName();
Optional<Column> generateKeyColumn = shardingRule.getGenerateKeyColumn(tableName);
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(tableName);
insertStatement.getColumns().addAll(lexerEngine.equalAny(Symbol.LEFT_PAREN)
? parseWithColumn(insertStatement, tableName, generateKeyColumn) : parseWithoutColumn(insertStatement, shardingTableMetaData, tableName, generateKeyColumn));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public void parse(final InsertStatement insertStatement) {
int beginPosition = lexerEngine.getCurrentToken().getEndPosition() - lexerEngine.getCurrentToken().getLiterals().length();
insertStatement.addSQLToken(new InsertValuesToken(beginPosition, insertStatement.getTables().getSingleTableName()));
String tableName = insertStatement.getTables().getSingleTableName();
Optional<Column> generateKeyColumn = shardingRule.getGenerateKeyColumn(tableName);
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(tableName);
int count = 0;
do {
SQLExpression left = basicExpressionParser.parse(insertStatement);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ private void parseValues(final InsertStatement insertStatement) {
}

private void removeGenerateKeyColumn(final InsertStatement insertStatement, final int valueCount) {
Optional<Column> generateKeyColumn = shardingRule.getGenerateKeyColumn(insertStatement.getTables().getSingleTableName());
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName());
if (generateKeyColumn.isPresent() && valueCount < insertStatement.getColumns().size()) {
List<ItemsToken> itemsTokens = insertStatement.getItemsTokens();
insertStatement.getColumns().remove(new Column(generateKeyColumn.get().getName(), insertStatement.getTables().getSingleTableName()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ private void parseForceIndex(final String tableName, final SQLStatement sqlState
lexerEngine.skipIfEqual(Symbol.COMMA);
String literals = lexerEngine.getCurrentToken().getLiterals();
Preconditions.checkState(!Symbol.RIGHT_PAREN.getLiterals().equals(literals), "There is an error in the vicinity of the force index syntax.");
if (shardingRule.isLogicIndex(literals, tableName)) {
if (literals.equals(shardingRule.getTableRule(tableName).getLogicIndex())) {
int beginPosition = lexerEngine.getCurrentToken().getEndPosition() - literals.length();
sqlStatement.addSQLToken(new IndexToken(beginPosition, literals, tableName));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public final DMLStatement parse() {

private void processGeneratedKey(final InsertStatement insertStatement) {
String tableName = insertStatement.getTables().getSingleTableName();
Optional<Column> generateKeyColumn = shardingRule.getGenerateKeyColumn(tableName);
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(tableName);
if (-1 != insertStatement.getGenerateKeyColumnIndex() || !generateKeyColumn.isPresent()) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ private void appendTablePlaceholder(final TablePlaceholder tablePlaceholder, fin

private void appendSchemaPlaceholder(final ShardingRule shardingRule, final ShardingDataSourceMetaData shardingDataSourceMetaData,
final String actualTableName, final StringBuilder stringBuilder) {
stringBuilder.append(shardingDataSourceMetaData.getActualDataSourceMetaData(shardingRule.getActualDataSourceNameByActualTableName(actualTableName)).getSchemeName());
stringBuilder.append(shardingDataSourceMetaData.getActualDataSourceMetaData(shardingRule.getActualDataSourceName(actualTableName)).getSchemeName());
}

private void appendIndexPlaceholder(final IndexPlaceholder indexPlaceholder, final String actualTableName, final StringBuilder stringBuilder) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ private Optional<GeneratedKey> getGenerateKey(final List<Object> parameters, fin
if (!tableRule.isPresent()) {
return Optional.absent();
}
Optional<Column> generateKeyColumn = shardingRule.getGenerateKeyColumn(logicTableName);
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(logicTableName);
if (generateKeyColumn.isPresent()) {
result = new GeneratedKey(generateKeyColumn.get());
for (int i = 0; i < insertStatement.getInsertValues().getInsertValues().size(); i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,15 @@ public RoutingResult route() {
result.getTableUnits().getTableUnits().add(new TableUnit(shardingRule.getShardingDataSourceNames().getDataSourceNames().iterator().next()));
} else if (1 == logicTables.size()) {
String logicTableName = logicTables.iterator().next();
DataNode dataNode = shardingRule.findDataNode(logicTableName);
DataNode dataNode = shardingRule.getDataNode(logicTableName);
TableUnit tableUnit = new TableUnit(dataNode.getDataSourceName());
tableUnit.getRoutingTables().add(new RoutingTable(logicTableName, dataNode.getTableName()));
result.getTableUnits().getTableUnits().add(tableUnit);
} else {
String dataSourceName = null;
List<RoutingTable> routingTables = new ArrayList<>(logicTables.size());
for (String each : logicTables) {
DataNode dataNode = shardingRule.findDataNode(dataSourceName, each);
DataNode dataNode = shardingRule.getDataNode(dataSourceName, each);
routingTables.add(new RoutingTable(each, dataNode.getTableName()));
if (null == dataSourceName) {
dataSourceName = dataNode.getDataSourceName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ public Optional<TableRule> findTableRuleByActualTable(final String actualTableNa
}

/**
* Get table rule though logic table name.
* Get table rule.
*
* @param logicTableName logic table name
* @return table rule
Expand Down Expand Up @@ -313,12 +313,12 @@ private boolean isShardingColumn(final TableRule tableRule, final Column column)
}

/**
* Get column of generated key.
* Find column of generated key.
*
* @param logicTableName logic table name
* @return generated key's column
*/
public Optional<Column> getGenerateKeyColumn(final String logicTableName) {
public Optional<Column> findGenerateKeyColumn(final String logicTableName) {
for (TableRule each : tableRules) {
if (each.getLogicTable().equalsIgnoreCase(logicTableName) && null != each.getGenerateKeyColumn()) {
return Optional.of(new Column(each.getGenerateKeyColumn(), logicTableName));
Expand Down Expand Up @@ -363,8 +363,9 @@ public String getLogicTableName(final String logicIndexName) {
* @param logicTableName logic table name
* @return data node
*/
public DataNode findDataNode(final String logicTableName) {
return findDataNode(null, logicTableName);
public DataNode getDataNode(final String logicTableName) {
TableRule tableRule = getTableRule(logicTableName);
return tableRule.getActualDataNodes().get(0);
}

/**
Expand All @@ -374,29 +375,14 @@ public DataNode findDataNode(final String logicTableName) {
* @param logicTableName logic table name
* @return data node
*/
public DataNode findDataNode(final String dataSourceName, final String logicTableName) {
public DataNode getDataNode(final String dataSourceName, final String logicTableName) {
TableRule tableRule = getTableRule(logicTableName);
for (DataNode each : tableRule.getActualDataNodes()) {
if (shardingDataSourceNames.getDataSourceNames().contains(each.getDataSourceName()) && (null == dataSourceName || each.getDataSourceName().equals(dataSourceName))) {
if (shardingDataSourceNames.getDataSourceNames().contains(each.getDataSourceName()) && each.getDataSourceName().equals(dataSourceName)) {
return each;
}
}
if (null == dataSourceName) {
throw new ShardingConfigurationException("Cannot find actual data node for logic table name: '%s'", logicTableName);
} else {
throw new ShardingConfigurationException("Cannot find actual data node for data source name: '%s' and logic table name: '%s'", dataSourceName, logicTableName);
}
}

/**
* Judge is logic index or not.
*
* @param logicIndexName logic index name
* @param logicTableName logic table name
* @return is logic index or not
*/
public boolean isLogicIndex(final String logicIndexName, final String logicTableName) {
return logicIndexName.equals(getTableRule(logicTableName).getLogicIndex());
throw new ShardingConfigurationException("Cannot find actual data node for data source name: '%s' and logic table name: '%s'", dataSourceName, logicTableName);
}

/**
Expand All @@ -407,20 +393,21 @@ public boolean isLogicIndex(final String logicIndexName, final String logicTable
* @return actual default data source name
*/
public Optional<String> findActualDefaultDataSourceName() {
String result = shardingDataSourceNames.getDefaultDataSourceName();
if (Strings.isNullOrEmpty(result)) {
String defaultDataSourceName = shardingDataSourceNames.getDefaultDataSourceName();
if (Strings.isNullOrEmpty(defaultDataSourceName)) {
return Optional.absent();
}
return Optional.of(getMasterDataSourceName(result));
Optional<String> masterDefaultDataSourceName = findMasterDataSourceName(defaultDataSourceName);
return masterDefaultDataSourceName.isPresent() ? masterDefaultDataSourceName : Optional.of(defaultDataSourceName);
}

private String getMasterDataSourceName(final String masterSlaveRuleName) {
private Optional<String> findMasterDataSourceName(final String masterSlaveRuleName) {
for (MasterSlaveRule each : masterSlaveRules) {
if (each.getName().equals(masterSlaveRuleName)) {
return each.getMasterDataSourceName();
return Optional.of(each.getMasterDataSourceName());
}
}
return masterSlaveRuleName;
return Optional.absent();
}

/**
Expand All @@ -439,12 +426,12 @@ public Optional<MasterSlaveRule> findMasterSlaveRule(final String dataSourceName
}

/**
* Get actual data source name by actual table name.
* Get actual data source name.
*
* @param actualTableName actual table name
* @return actual data source name
*/
public String getActualDataSourceNameByActualTableName(final String actualTableName) {
public String getActualDataSourceName(final String actualTableName) {
Optional<TableRule> tableRule = findTableRuleByActualTable(actualTableName);
if (tableRule.isPresent()) {
return tableRule.get().getActualDatasourceNames().iterator().next();
Expand Down

0 comments on commit 9f941f3

Please sign in to comment.