提交 f6213bed 编写于 作者: T terrymanu

for #1864, decouple ShardingRule & Column

上级 7472df30
......@@ -56,15 +56,16 @@ public final class GeneratedKey {
}
private static Optional<GeneratedKey> createGeneratedKey(final ShardingRule shardingRule, final InsertStatement insertStatement) {
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName());
return generateKeyColumn.isPresent()
? Optional.of(createGeneratedKey(shardingRule, generateKeyColumn.get(), insertStatement.getInsertValues().getInsertValues().size())) : Optional.<GeneratedKey>absent();
String tableName = insertStatement.getTables().getSingleTableName();
Optional<String> generateKeyColumnName = shardingRule.findGenerateKeyColumnName(tableName);
return generateKeyColumnName.isPresent()
? Optional.of(createGeneratedKey(shardingRule, generateKeyColumnName.get(), tableName, insertStatement.getInsertValues().getInsertValues().size())) : Optional.<GeneratedKey>absent();
}
private static GeneratedKey createGeneratedKey(final ShardingRule shardingRule, final Column generateKeyColumn, final int insertValueSize) {
GeneratedKey result = new GeneratedKey(generateKeyColumn);
private static GeneratedKey createGeneratedKey(final ShardingRule shardingRule, final String generateKeyColumnName, final String generateKeyTableName, final int insertValueSize) {
GeneratedKey result = new GeneratedKey(new Column(generateKeyColumnName, generateKeyTableName));
for (int i = 0; i < insertValueSize; i++) {
result.getGeneratedKeys().add(shardingRule.generateKey(generateKeyColumn.getTableName()));
result.getGeneratedKeys().add(shardingRule.generateKey(generateKeyTableName));
}
return result;
}
......
......@@ -137,14 +137,15 @@ public final class InsertOptimizeEngine implements OptimizeEngine {
}
private boolean isNeededToAppendGeneratedKey() {
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName());
return generateKeyColumn.isPresent() && !insertStatement.getColumns().contains(generateKeyColumn.get());
String tableName = insertStatement.getTables().getSingleTableName();
Optional<String> generateKeyColumn = shardingRule.findGenerateKeyColumnName(tableName);
return generateKeyColumn.isPresent() && !insertStatement.getColumns().contains(new Column(generateKeyColumn.get(), tableName));
}
private void fillInsertStatementWithGeneratedKeyName(final InsertValuesToken insertValuesToken) {
String generatedKeyName = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName()).get().getName();
insertValuesToken.getColumnNames().add(generatedKeyName);
fillInsertStatementWithColumnName(insertValuesToken, generatedKeyName);
String generateKeyColumnName = shardingRule.findGenerateKeyColumnName(insertStatement.getTables().getSingleTableName()).get();
insertValuesToken.getColumnNames().add(generateKeyColumnName);
fillInsertStatementWithColumnName(insertValuesToken, generateKeyColumnName);
}
private void fillInsertStatementWithColumnName(final InsertValuesToken insertValuesToken, final String columnName) {
......@@ -204,9 +205,12 @@ public final class InsertOptimizeEngine implements OptimizeEngine {
}
private void fillShardingCondition(final ShardingCondition shardingCondition, final Comparable<?> currentGeneratedKey) {
Column generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName()).get();
if (shardingRule.isShardingColumn(generateKeyColumn)) {
shardingCondition.getShardingValues().add(new ListRouteValue<>(generateKeyColumn, new GeneratedKeyCondition(generateKeyColumn, -1, currentGeneratedKey).getConditionValues(parameters)));
String tableName = insertStatement.getTables().getSingleTableName();
String generateKeyColumnName = shardingRule.findGenerateKeyColumnName(tableName).get();
if (shardingRule.isShardingColumn(generateKeyColumnName, tableName)) {
Column generateKeyColumn = new Column(generateKeyColumnName, tableName);
List<Comparable<?>> conditionValues = new GeneratedKeyCondition(generateKeyColumn, -1, currentGeneratedKey).getConditionValues(parameters);
shardingCondition.getShardingValues().add(new ListRouteValue<>(generateKeyColumn, conditionValues));
}
insertStatement.setContainGenerateKey(true);
}
......
......@@ -112,7 +112,7 @@ public final class OrConditionFiller implements SQLSegmentShardingFiller<OrCondi
continue;
}
Column column = new Column(condition.getColumn().getName(), getTableName(shardingTableMetaData, shardingRule, sqlStatement, condition));
if (isShardingCondition(condition.getOperator()) && shardingRule.isShardingColumn(column)) {
if (isShardingCondition(condition.getOperator()) && shardingRule.isShardingColumn(column.getName(), column.getTableName())) {
shardingCondition.add(condition);
needSharding = true;
}
......@@ -175,16 +175,7 @@ public final class OrConditionFiller implements SQLSegmentShardingFiller<OrCondi
}
private boolean isShardingCondition(final String operator) {
if (Symbol.EQ.getLiterals().equals(operator)) {
return true;
}
if (ShardingOperator.IN.name().equals(operator)) {
return true;
}
if (ShardingOperator.BETWEEN.name().equals(operator)) {
return true;
}
return false;
return Symbol.EQ.getLiterals().equals(operator) || ShardingOperator.IN.name().equals(operator) || ShardingOperator.BETWEEN.name().equals(operator);
}
// TODO hongjun: find table from parent select statement, should find table in subquery level only
......
......@@ -74,11 +74,11 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
}
String tableName = insertStatement.getTables().getSingleTableName();
int index = 0;
Optional<Column> shardingColumn = shardingRule.findGenerateKeyColumn(tableName);
Optional<String> generateKeyColumnName = shardingRule.findGenerateKeyColumnName(tableName);
for (ColumnSegment each : sqlSegment.getColumns()) {
Column column = new Column(each.getName(), tableName);
insertStatement.getColumns().add(column);
if (shardingColumn.isPresent() && shardingColumn.get().getName().equalsIgnoreCase(each.getName())) {
if (generateKeyColumnName.isPresent() && generateKeyColumnName.get().equalsIgnoreCase(each.getName())) {
insertStatement.setGenerateKeyColumnIndex(index);
}
if (each.getOwner().isPresent() && tableName.equals(each.getOwner().get())) {
......@@ -97,9 +97,9 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
ItemsToken columnsToken = new ItemsToken(startIndex);
columnsToken.setFirstOfItemsSpecial(true);
if (shardingTableMetaData.containsTable(tableName)) {
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName());
Optional<String> generateKeyColumnName = shardingRule.findGenerateKeyColumnName(insertStatement.getTables().getSingleTableName());
for (String each : shardingTableMetaData.getAllColumnNames(tableName)) {
if (generateKeyColumn.isPresent() && generateKeyColumn.get().getName().equalsIgnoreCase(each)) {
if (generateKeyColumnName.isPresent() && generateKeyColumnName.get().equalsIgnoreCase(each)) {
insertStatement.setGenerateKeyColumnIndex(count);
}
Column column = new Column(each, tableName);
......@@ -134,7 +134,7 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
Iterator<Column> iterator = insertStatement.getColumns().iterator();
for (CommonExpressionSegment commonExpressionSegment : each.getValues()) {
Column column = iterator.next();
boolean shardingColumn = shardingRule.isShardingColumn(column);
boolean shardingColumn = shardingRule.isShardingColumn(column.getName(), column.getTableName());
SQLExpression sqlExpression = commonExpressionSegment.convertToSQLExpression(sql).get();
insertValue.getColumnValues().add(sqlExpression);
if (shardingColumn) {
......@@ -154,12 +154,12 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
}
private void removeGenerateKeyColumn(final InsertStatement insertStatement, final ShardingRule shardingRule, final int valueCount) {
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName());
if (generateKeyColumn.isPresent() && valueCount < insertStatement.getColumns().size()) {
Optional<String> generateKeyColumnName = shardingRule.findGenerateKeyColumnName(insertStatement.getTables().getSingleTableName());
if (generateKeyColumnName.isPresent() && valueCount < insertStatement.getColumns().size()) {
List<ItemsToken> itemsTokens = insertStatement.getItemsTokens();
insertStatement.getColumns().remove(new Column(generateKeyColumn.get().getName(), insertStatement.getTables().getSingleTableName()));
insertStatement.getColumns().remove(new Column(generateKeyColumnName.get(), insertStatement.getTables().getSingleTableName()));
for (ItemsToken each : itemsTokens) {
each.getItems().remove(generateKeyColumn.get().getName());
each.getItems().remove(generateKeyColumnName.get());
insertStatement.setGenerateKeyColumnIndex(-1);
}
}
......@@ -177,16 +177,16 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
private void processGeneratedKey(final ShardingRule shardingRule, final InsertStatement insertStatement) {
String tableName = insertStatement.getTables().getSingleTableName();
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(tableName);
if (-1 != insertStatement.getGenerateKeyColumnIndex() || !generateKeyColumn.isPresent()) {
Optional<String> generateKeyColumnName = shardingRule.findGenerateKeyColumnName(tableName);
if (-1 != insertStatement.getGenerateKeyColumnIndex() || !generateKeyColumnName.isPresent()) {
return;
}
if (DefaultKeyword.VALUES.equals(insertStatement.getInsertValues().getInsertValues().get(0).getType())) {
if (!insertStatement.getItemsTokens().isEmpty()) {
insertStatement.getItemsTokens().get(0).getItems().add(generateKeyColumn.get().getName());
insertStatement.getItemsTokens().get(0).getItems().add(generateKeyColumnName.get());
} else {
ItemsToken columnsToken = new ItemsToken(insertStatement.getColumnsListLastIndex());
columnsToken.getItems().add(generateKeyColumn.get().getName());
columnsToken.getItems().add(generateKeyColumnName.get());
insertStatement.addSQLToken(columnsToken);
}
}
......@@ -194,9 +194,8 @@ public final class InsertFiller implements SQLSegmentShardingFiller<InsertSegmen
private void processDuplicateKey(final ShardingRule shardingRule, final InsertSegment insertSegment, final String tableName) {
for (String each : insertSegment.getDuplicateKeyColumns()) {
if (shardingRule.isShardingColumn(new Column(SQLUtil.getExactlyValue(each), tableName))) {
throw new SQLParsingException("INSERT INTO .... ON DUPLICATE KEY UPDATE can not support on sharding column, token is '%s', literals is '%s'.",
Literals.IDENTIFIER, each);
if (shardingRule.isShardingColumn(SQLUtil.getExactlyValue(each), tableName)) {
throw new SQLParsingException("INSERT INTO .... ON DUPLICATE KEY UPDATE can not support on sharding column, token is '%s', literals is '%s'.", Literals.IDENTIFIER, each);
}
}
}
......
......@@ -68,12 +68,12 @@ public final class InsertColumnsClauseParser implements SQLClauseParser {
*/
public void parse(final InsertStatement insertStatement, final ShardingTableMetaData shardingTableMetaData) {
String tableName = insertStatement.getTables().getSingleTableName();
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(tableName);
Optional<String> generateKeyColumnName = shardingRule.findGenerateKeyColumnName(tableName);
insertStatement.getColumns().addAll(lexerEngine.equalAny(Symbol.LEFT_PAREN)
? parseWithColumn(insertStatement, tableName, generateKeyColumn) : parseWithoutColumn(insertStatement, shardingTableMetaData, tableName, generateKeyColumn));
? parseWithColumn(insertStatement, tableName, generateKeyColumnName) : parseWithoutColumn(insertStatement, shardingTableMetaData, tableName, generateKeyColumnName));
}
private Collection<Column> parseWithColumn(final InsertStatement insertStatement, final String tableName, final Optional<Column> generateKeyColumn) {
private Collection<Column> parseWithColumn(final InsertStatement insertStatement, final String tableName, final Optional<String> generateKeyColumnName) {
int count = 0;
Collection<Column> result = new LinkedList<>();
do {
......@@ -91,7 +91,7 @@ public final class InsertColumnsClauseParser implements SQLClauseParser {
}
Preconditions.checkNotNull(columnName);
result.add(new Column(columnName, tableName));
if (generateKeyColumn.isPresent() && generateKeyColumn.get().getName().equalsIgnoreCase(columnName)) {
if (generateKeyColumnName.isPresent() && generateKeyColumnName.get().equalsIgnoreCase(columnName)) {
insertStatement.setGenerateKeyColumnIndex(count);
}
count++;
......@@ -102,7 +102,7 @@ public final class InsertColumnsClauseParser implements SQLClauseParser {
}
private Collection<Column> parseWithoutColumn(
final InsertStatement insertStatement, final ShardingTableMetaData shardingTableMetaData, final String tableName, final Optional<Column> generateKeyColumn) {
final InsertStatement insertStatement, final ShardingTableMetaData shardingTableMetaData, final String tableName, final Optional<String> generateKeyColumn) {
int count = 0;
int beginPosition = lexerEngine.getCurrentToken().getEndPosition() - lexerEngine.getCurrentToken().getLiterals().length() - 1;
insertStatement.addSQLToken(new InsertColumnToken(beginPosition, "("));
......@@ -112,7 +112,7 @@ public final class InsertColumnsClauseParser implements SQLClauseParser {
if (shardingTableMetaData.containsTable(tableName)) {
for (String each : shardingTableMetaData.getAllColumnNames(tableName)) {
result.add(new Column(each, tableName));
if (generateKeyColumn.isPresent() && generateKeyColumn.get().getName().equalsIgnoreCase(each)) {
if (generateKeyColumn.isPresent() && generateKeyColumn.get().equalsIgnoreCase(each)) {
insertStatement.setGenerateKeyColumnIndex(count);
}
columnsToken.getItems().add(each);
......
......@@ -62,7 +62,7 @@ public abstract class InsertDuplicateKeyUpdateClauseParser implements SQLClauseP
lexerEngine.accept(DefaultKeyword.UPDATE);
do {
Column column = new Column(SQLUtil.getExactlyValue(lexerEngine.getCurrentToken().getLiterals()), insertStatement.getTables().getSingleTableName());
if (shardingRule.isShardingColumn(column)) {
if (shardingRule.isShardingColumn(column.getName(), column.getTableName())) {
throw new SQLParsingException("INSERT INTO .... ON DUPLICATE KEY UPDATE can not support on sharding column, token is '%s', literals is '%s'.",
lexerEngine.getCurrentToken().getType(), lexerEngine.getCurrentToken().getLiterals());
}
......
......@@ -79,7 +79,7 @@ public abstract class InsertSetClauseParser implements SQLClauseParser {
int beginPosition = lexerEngine.getCurrentToken().getEndPosition() - lexerEngine.getCurrentToken().getLiterals().length();
insertStatement.addSQLToken(new InsertValuesToken(beginPosition, DefaultKeyword.SET));
String tableName = insertStatement.getTables().getSingleTableName();
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(tableName);
Optional<String> generateKeyColumnName = shardingRule.findGenerateKeyColumnName(tableName);
int count = 0;
do {
SQLExpression left = basicExpressionParser.parse(insertStatement);
......@@ -94,12 +94,13 @@ public abstract class InsertSetClauseParser implements SQLClauseParser {
column = new Column(SQLUtil.getExactlyValue(((SQLIgnoreExpression) left).getExpression()), insertStatement.getTables().getSingleTableName());
}
Preconditions.checkNotNull(column);
if (generateKeyColumn.isPresent() && generateKeyColumn.get().getName().equalsIgnoreCase(column.getName())) {
if (generateKeyColumnName.isPresent() && generateKeyColumnName.get().equalsIgnoreCase(column.getName())) {
insertStatement.setGenerateKeyColumnIndex(count);
}
lexerEngine.accept(Symbol.EQ);
SQLExpression right = basicExpressionParser.parse(insertStatement);
if (shardingRule.isShardingColumn(column) && (right instanceof SQLNumberExpression || right instanceof SQLTextExpression || right instanceof SQLPlaceholderExpression)) {
if (shardingRule.isShardingColumn(column.getName(), column.getTableName())
&& (right instanceof SQLNumberExpression || right instanceof SQLTextExpression || right instanceof SQLPlaceholderExpression)) {
insertStatement.getRouteConditions().add(new Condition(column, right));
}
count++;
......
......@@ -107,7 +107,7 @@ public abstract class InsertValuesClauseParser implements SQLClauseParser {
AndCondition andCondition = new AndCondition();
for (Column each : insertStatement.getColumns()) {
SQLExpression sqlExpression = sqlExpressions.get(count);
if (shardingRule.isShardingColumn(each)) {
if (shardingRule.isShardingColumn(each.getName(), each.getTableName())) {
if (!(sqlExpression instanceof SQLNumberExpression || sqlExpression instanceof SQLTextExpression || sqlExpression instanceof SQLPlaceholderExpression)) {
throw new SQLParsingException("INSERT INTO can not support complex expression value on sharding column '%s'.", each.getName());
}
......@@ -128,12 +128,12 @@ public abstract class InsertValuesClauseParser implements SQLClauseParser {
}
private void removeGenerateKeyColumn(final InsertStatement insertStatement, final int valueCount) {
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName());
if (generateKeyColumn.isPresent() && valueCount < insertStatement.getColumns().size()) {
Optional<String> generateKeyColumnName = shardingRule.findGenerateKeyColumnName(insertStatement.getTables().getSingleTableName());
if (generateKeyColumnName.isPresent() && valueCount < insertStatement.getColumns().size()) {
List<ItemsToken> itemsTokens = insertStatement.getItemsTokens();
insertStatement.getColumns().remove(new Column(generateKeyColumn.get().getName(), insertStatement.getTables().getSingleTableName()));
insertStatement.getColumns().remove(new Column(generateKeyColumnName.get(), insertStatement.getTables().getSingleTableName()));
for (ItemsToken each : itemsTokens) {
each.getItems().remove(generateKeyColumn.get().getName());
each.getItems().remove(generateKeyColumnName.get());
insertStatement.setGenerateKeyColumnIndex(-1);
}
}
......
......@@ -214,7 +214,7 @@ public abstract class WhereClauseParser implements SQLClauseParser {
}
if (right instanceof SQLNumberExpression || right instanceof SQLTextExpression || right instanceof SQLPlaceholderExpression) {
Optional<Column> column = find(sqlStatement.getTables(), left);
if (column.isPresent() && shardingRule.isShardingColumn(column.get())) {
if (column.isPresent() && shardingRule.isShardingColumn(column.get().getName(), column.get().getTableName())) {
return new Condition(column.get(), right);
}
}
......@@ -239,7 +239,7 @@ public abstract class WhereClauseParser implements SQLClauseParser {
}
if (!hasComplexExpression) {
Optional<Column> column = find(sqlStatement.getTables(), left);
if (column.isPresent() && shardingRule.isShardingColumn(column.get())) {
if (column.isPresent() && shardingRule.isShardingColumn(column.get().getName(), column.get().getTableName())) {
return new Condition(column.get(), rights);
}
}
......@@ -266,7 +266,7 @@ public abstract class WhereClauseParser implements SQLClauseParser {
}
if (!hasComplexExpression) {
Optional<Column> column = find(sqlStatement.getTables(), left);
if (column.isPresent() && shardingRule.isShardingColumn(column.get())) {
if (column.isPresent() && shardingRule.isShardingColumn(column.get().getName(), column.get().getTableName())) {
return new Condition(column.get(), rights.get(0), rights.get(1));
}
}
......
......@@ -25,7 +25,6 @@ import org.apache.shardingsphere.core.parsing.lexer.LexerEngine;
import org.apache.shardingsphere.core.parsing.lexer.token.DefaultKeyword;
import org.apache.shardingsphere.core.parsing.lexer.token.Symbol;
import org.apache.shardingsphere.core.parsing.parser.clause.facade.AbstractInsertClauseParserFacade;
import org.apache.shardingsphere.core.parsing.parser.context.condition.Column;
import org.apache.shardingsphere.core.parsing.parser.sql.SQLParser;
import org.apache.shardingsphere.core.parsing.parser.sql.dml.DMLStatement;
import org.apache.shardingsphere.core.parsing.parser.token.ItemsToken;
......@@ -77,16 +76,16 @@ public abstract class AbstractInsertParser implements SQLParser {
private void processGeneratedKey(final InsertStatement insertStatement) {
String tableName = insertStatement.getTables().getSingleTableName();
Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(tableName);
if (-1 != insertStatement.getGenerateKeyColumnIndex() || !generateKeyColumn.isPresent()) {
Optional<String> generateKeyColumnName = shardingRule.findGenerateKeyColumnName(tableName);
if (-1 != insertStatement.getGenerateKeyColumnIndex() || !generateKeyColumnName.isPresent()) {
return;
}
if (DefaultKeyword.VALUES.equals(insertStatement.getInsertValues().getInsertValues().get(0).getType())) {
if (!insertStatement.getItemsTokens().isEmpty()) {
insertStatement.getItemsTokens().get(0).getItems().add(generateKeyColumn.get().getName());
insertStatement.getItemsTokens().get(0).getItems().add(generateKeyColumnName.get());
} else {
ItemsToken columnsToken = new ItemsToken(insertStatement.getColumnsListLastIndex());
columnsToken.getItems().add(generateKeyColumn.get().getName());
columnsToken.getItems().add(generateKeyColumnName.get());
insertStatement.addSQLToken(columnsToken);
}
}
......
......@@ -33,7 +33,6 @@ import org.apache.shardingsphere.core.encrypt.ShardingEncryptorEngine;
import org.apache.shardingsphere.core.encrypt.ShardingEncryptorStrategy;
import org.apache.shardingsphere.core.exception.ShardingConfigurationException;
import org.apache.shardingsphere.core.exception.ShardingException;
import org.apache.shardingsphere.core.parsing.parser.context.condition.Column;
import org.apache.shardingsphere.core.routing.strategy.ShardingStrategy;
import org.apache.shardingsphere.core.routing.strategy.ShardingStrategyFactory;
import org.apache.shardingsphere.core.routing.strategy.hint.HintShardingStrategy;
......@@ -325,32 +324,33 @@ public class ShardingRule implements SQLStatementFillerRule {
/**
* Judge is sharding column or not.
*
* @param column column object
* @param columnName column name
* @param tableName table name
* @return is sharding column or not
*/
public boolean isShardingColumn(final Column column) {
public boolean isShardingColumn(final String columnName, final String tableName) {
for (TableRule each : tableRules) {
if (each.getLogicTable().equalsIgnoreCase(column.getTableName()) && isShardingColumn(each, column)) {
if (each.getLogicTable().equalsIgnoreCase(tableName) && isShardingColumn(each, columnName)) {
return true;
}
}
return false;
}
private boolean isShardingColumn(final TableRule tableRule, final Column column) {
return getDatabaseShardingStrategy(tableRule).getShardingColumns().contains(column.getName()) || getTableShardingStrategy(tableRule).getShardingColumns().contains(column.getName());
private boolean isShardingColumn(final TableRule tableRule, final String columnName) {
return getDatabaseShardingStrategy(tableRule).getShardingColumns().contains(columnName) || getTableShardingStrategy(tableRule).getShardingColumns().contains(columnName);
}
/**
* Find column of generated key.
* Find column name of generated key.
*
* @param logicTableName logic table name
* @return generated key's column
* @return column name of generated key
*/
public Optional<Column> findGenerateKeyColumn(final String logicTableName) {
public Optional<String> findGenerateKeyColumnName(final String logicTableName) {
for (TableRule each : tableRules) {
if (each.getLogicTable().equalsIgnoreCase(logicTableName) && null != each.getGenerateKeyColumn()) {
return Optional.of(new Column(each.getGenerateKeyColumn(), logicTableName));
return Optional.of(each.getGenerateKeyColumn());
}
}
return Optional.absent();
......
......@@ -18,7 +18,6 @@
package org.apache.shardingsphere.core.keygen;
import com.google.common.base.Optional;
import org.apache.shardingsphere.core.parsing.parser.context.condition.Column;
import org.apache.shardingsphere.core.parsing.parser.context.condition.GeneratedKeyCondition;
import org.apache.shardingsphere.core.parsing.parser.context.insertvalue.InsertValue;
import org.apache.shardingsphere.core.parsing.parser.context.insertvalue.InsertValues;
......@@ -59,14 +58,14 @@ public final class GeneratedKeyTest {
@Test
public void assertGetGenerateKeyWhenCreateWithoutGenerateKeyColumnConfiguration() {
mockGetGenerateKeyWhenCreate();
when(shardingRule.findGenerateKeyColumn("tbl")).thenReturn(Optional.<Column>absent());
when(shardingRule.findGenerateKeyColumnName("tbl")).thenReturn(Optional.<String>absent());
assertFalse(GeneratedKey.getGenerateKey(shardingRule, Collections.<Object>singletonList(1), insertStatement).isPresent());
}
@Test
public void assertGetGenerateKeyWhenCreateWithGenerateKeyColumnConfiguration() {
mockGetGenerateKeyWhenCreate();
when(shardingRule.findGenerateKeyColumn("tbl")).thenReturn(Optional.of(new Column("id", "tbl")));
when(shardingRule.findGenerateKeyColumnName("tbl")).thenReturn(Optional.of("id"));
Optional<GeneratedKey> actual = GeneratedKey.getGenerateKey(shardingRule, Collections.<Object>singletonList(1), insertStatement);
assertTrue(actual.isPresent());
assertThat(actual.get().getGeneratedKeys().size(), is(1));
......
......@@ -28,7 +28,6 @@ import org.apache.shardingsphere.core.exception.ShardingConfigurationException;
import org.apache.shardingsphere.core.fixture.PreciseShardingAlgorithmFixture;
import org.apache.shardingsphere.core.keygen.fixture.IncrementShardingKeyGenerator;
import org.apache.shardingsphere.core.keygen.impl.SnowflakeShardingKeyGenerator;
import org.apache.shardingsphere.core.parsing.parser.context.condition.Column;
import org.apache.shardingsphere.core.routing.strategy.inline.InlineShardingStrategy;
import org.apache.shardingsphere.core.routing.strategy.none.NoneShardingStrategy;
import org.hamcrest.CoreMatchers;
......@@ -237,7 +236,7 @@ public final class ShardingRuleTest {
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(createTableRuleConfigWithAllStrategies());
shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("column", new PreciseShardingAlgorithmFixture()));
assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn(new Column("column", "LOGIC_TABLE")));
assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn("column", "LOGIC_TABLE"));
}
@Test
......@@ -245,38 +244,38 @@ public final class ShardingRuleTest {
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(createTableRuleConfigWithAllStrategies());
shardingRuleConfig.setDefaultTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("column", new PreciseShardingAlgorithmFixture()));
assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn(new Column("column", "LOGIC_TABLE")));
assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn("column", "LOGIC_TABLE"));
}
@Test
public void assertIsShardingColumnForDatabaseShardingStrategy() {
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(createTableRuleConfigWithAllStrategies());
assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn(new Column("column", "logic_Table")));
assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn("column", "logic_Table"));
}
@Test
public void assertIsShardingColumnForTableShardingStrategy() {
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(createTableRuleConfigWithTableStrategies());
assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn(new Column("column", "logic_Table")));
assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn("column", "logic_Table"));
}
@Test
public void assertIsNotShardingColumn() {
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(createTableRuleConfigWithAllStrategies());
assertFalse(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn(new Column("column", "other_Table")));
assertFalse(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn("column", "other_Table"));
}
@Test
public void assertFindGenerateKeyColumn() {
assertTrue(createMaximumShardingRule().findGenerateKeyColumn("logic_table").isPresent());
assertTrue(createMaximumShardingRule().findGenerateKeyColumnName("logic_table").isPresent());
}
@Test
public void assertNotFindGenerateKeyColumn() {
assertFalse(createMinimumShardingRule().findGenerateKeyColumn("sub_logic_table").isPresent());
assertFalse(createMinimumShardingRule().findGenerateKeyColumnName("sub_logic_table").isPresent());
}
@Test(expected = ShardingConfigurationException.class)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册