未验证 提交 e15bdace 编写于 作者: L Liang Zhang 提交者: GitHub

Use single table rule in SingleTableRoutingEngine (#8136)

* Remove data source name from NoSuchTableException

* Use single table rule in SingleTableRoutingEngine
上级 87af778b
......@@ -48,7 +48,7 @@ public enum MySQLServerErrorCode implements SQLErrorCode {
ER_TABLE_EXISTS_ERROR(1050, "42S01", "Table '%s' already exists"),
ER_NO_SUCH_TABLE(1146, "42S02", "Table '%s.%s' doesn't exist"),
ER_NO_SUCH_TABLE(1146, "42S02", "Table '%s' doesn't exist"),
ER_NOT_SUPPORTED_YET(1235, "42000", "This version of ShardingProxy doesn't yet support this SQL. '%s'"),
......
......@@ -19,16 +19,15 @@ package org.apache.shardingsphere.sharding.metadata;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurationException;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.builder.loader.SchemaMetaDataLoader;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import org.apache.shardingsphere.sharding.rule.SingleTableRule;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
......@@ -43,13 +42,11 @@ public final class SingleTableRuleLoader {
*
* @param databaseType database type
* @param dataSourceMap data source map
* @param shardingRule sharding rule
* @param excludedTables exclude table names
* @return single table rule map
* @throws SQLException SQL exception
*/
@SuppressWarnings("CollectionWithoutInitialCapacity")
public static Map<String, SingleTableRule> load(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap, final ShardingRule shardingRule) throws SQLException {
Collection<String> excludedTables = getExcludedTables(shardingRule);
public static Map<String, SingleTableRule> load(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap, final Collection<String> excludedTables) {
Map<String, SingleTableRule> result = new HashMap<>();
for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
result.putAll(load(databaseType, entry.getKey(), entry.getValue(), excludedTables));
......@@ -58,8 +55,13 @@ public final class SingleTableRuleLoader {
}
private static Map<String, SingleTableRule> load(final DatabaseType databaseType,
final String dataSourceName, final DataSource dataSource, final Collection<String> excludedTables) throws SQLException {
Collection<String> tables = SchemaMetaDataLoader.loadAllTableNames(dataSource, databaseType);
final String dataSourceName, final DataSource dataSource, final Collection<String> excludedTables) {
Collection<String> tables;
try {
tables = SchemaMetaDataLoader.loadAllTableNames(dataSource, databaseType);
} catch (final SQLException ex) {
throw new ShardingSphereConfigurationException("Can not load table: ", ex.getMessage());
}
Map<String, SingleTableRule> result = new HashMap<>(tables.size(), 1);
for (String each : tables) {
if (!excludedTables.contains(each)) {
......@@ -68,10 +70,4 @@ public final class SingleTableRuleLoader {
}
return result;
}
private static Collection<String> getExcludedTables(final ShardingRule shardingRule) {
Collection<String> result = new HashSet<>(shardingRule.getTables());
result.addAll(shardingRule.getAllActualTables());
return result;
}
}
......@@ -41,11 +41,13 @@ import org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShard
import org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.api.sharding.ShardingAutoTableAlgorithm;
import org.apache.shardingsphere.sharding.metadata.SingleTableRuleLoader;
import org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm;
import org.apache.shardingsphere.sharding.spi.ShardingAlgorithm;
import javax.sql.DataSource;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
......@@ -77,6 +79,8 @@ public final class ShardingRule implements DataNodeContainedRule, TableContained
private final Collection<BindingTableRule> bindingTableRules;
private final Collection<String> broadcastTables;
private final Map<String, SingleTableRule> singleTableRules;
@Getter(AccessLevel.NONE)
private final ShardingStrategyConfiguration defaultDatabaseShardingStrategyConfig;
......@@ -96,6 +100,7 @@ public final class ShardingRule implements DataNodeContainedRule, TableContained
tableRules.addAll(createAutoTableRules(config.getAutoTables(), config.getDefaultKeyGenerateStrategy()));
broadcastTables = config.getBroadcastTables();
bindingTableRules = createBindingTableRules(config.getBindingTableGroups());
singleTableRules = SingleTableRuleLoader.load(databaseType, dataSourceMap, getExcludedTables());
defaultDatabaseShardingStrategyConfig = null == config.getDefaultDatabaseShardingStrategy() ? new NoneShardingStrategyConfiguration() : config.getDefaultDatabaseShardingStrategy();
defaultTableShardingStrategyConfig = null == config.getDefaultTableShardingStrategy() ? new NoneShardingStrategyConfiguration() : config.getDefaultTableShardingStrategy();
defaultKeyGenerateAlgorithm = null == config.getDefaultKeyGenerateStrategy()
......@@ -112,6 +117,7 @@ public final class ShardingRule implements DataNodeContainedRule, TableContained
tableRules.addAll(createAutoTableRules(config.getAutoTables(), config.getDefaultKeyGenerateStrategy()));
broadcastTables = config.getBroadcastTables();
bindingTableRules = createBindingTableRules(config.getBindingTableGroups());
singleTableRules = SingleTableRuleLoader.load(databaseType, dataSourceMap, getExcludedTables());
defaultDatabaseShardingStrategyConfig = null == config.getDefaultDatabaseShardingStrategy() ? new NoneShardingStrategyConfiguration() : config.getDefaultDatabaseShardingStrategy();
defaultTableShardingStrategyConfig = null == config.getDefaultTableShardingStrategy() ? new NoneShardingStrategyConfiguration() : config.getDefaultTableShardingStrategy();
defaultKeyGenerateAlgorithm = null == config.getDefaultKeyGenerateStrategy()
......@@ -163,6 +169,12 @@ public final class ShardingRule implements DataNodeContainedRule, TableContained
return new BindingTableRule(Splitter.on(",").trimResults().splitToList(bindingTableGroup).stream().map(this::getTableRule).collect(Collectors.toList()));
}
private Collection<String> getExcludedTables() {
Collection<String> result = new HashSet<>(getTables());
result.addAll(getAllActualTables());
return result;
}
/**
* Get database sharding strategy configuration.
*
......
......@@ -43,6 +43,7 @@ import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
public final class ShardingRuleTest {
......@@ -343,8 +344,8 @@ public final class ShardingRuleTest {
private Map<String, DataSource> createDataSourceMap() {
Map<String, DataSource> result = new HashMap<>(2, 1);
result.put("ds_0", mock(DataSource.class));
result.put("ds_1", mock(DataSource.class));
result.put("ds_0", mock(DataSource.class, RETURNS_DEEP_STUBS));
result.put("ds_1", mock(DataSource.class, RETURNS_DEEP_STUBS));
return result;
}
......
......@@ -30,6 +30,7 @@ import java.util.Collections;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
public final class AlgorithmProvidedShardingRuleBuilderTest {
......@@ -44,7 +45,7 @@ public final class AlgorithmProvidedShardingRuleBuilderTest {
AlgorithmProvidedShardingRuleConfiguration ruleConfig = mock(AlgorithmProvidedShardingRuleConfiguration.class);
ShardingSphereRuleBuilder builder = OrderedSPIRegistry.getRegisteredServices(Collections.singletonList(ruleConfig), ShardingSphereRuleBuilder.class).get(ruleConfig);
((AlgorithmProvidedShardingRuleBuilder) builder).setDatabaseType(mock(DatabaseType.class));
((AlgorithmProvidedShardingRuleBuilder) builder).setDataSourceMap(Collections.singletonMap("name", mock(DataSource.class)));
((AlgorithmProvidedShardingRuleBuilder) builder).setDataSourceMap(Collections.singletonMap("name", mock(DataSource.class, RETURNS_DEEP_STUBS)));
assertThat(builder.build(ruleConfig), instanceOf(ShardingRule.class));
}
}
......@@ -30,6 +30,7 @@ import java.util.Collections;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
public final class ShardingRuleBuilderTest {
......@@ -44,7 +45,7 @@ public final class ShardingRuleBuilderTest {
ShardingRuleConfiguration ruleConfig = mock(ShardingRuleConfiguration.class);
ShardingSphereRuleBuilder builder = OrderedSPIRegistry.getRegisteredServices(Collections.singletonList(ruleConfig), ShardingSphereRuleBuilder.class).get(ruleConfig);
((ShardingRuleBuilder) builder).setDatabaseType(mock(DatabaseType.class));
((ShardingRuleBuilder) builder).setDataSourceMap(Collections.singletonMap("name", mock(DataSource.class)));
((ShardingRuleBuilder) builder).setDataSourceMap(Collections.singletonMap("name", mock(DataSource.class, RETURNS_DEEP_STUBS)));
assertThat(builder.build(ruleConfig), instanceOf(ShardingRule.class));
}
}
......@@ -36,6 +36,7 @@ import java.util.Map;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
......@@ -55,7 +56,7 @@ public final class ShowCreateTableMergedResultTest {
ShardingTableRuleConfiguration tableRuleConfig = new ShardingTableRuleConfiguration("table", "ds.table_${0..2}");
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTables().add(tableRuleConfig);
return new ShardingRule(shardingRuleConfig, mock(DatabaseType.class), Collections.singletonMap("ds", mock(DataSource.class)));
return new ShardingRule(shardingRuleConfig, mock(DatabaseType.class), Collections.singletonMap("ds", mock(DataSource.class, RETURNS_DEEP_STUBS)));
}
private ShardingSphereSchema buildSchema() {
......
......@@ -36,6 +36,7 @@ import java.util.Map;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
......@@ -55,7 +56,7 @@ public final class ShowTablesMergedResultTest {
ShardingTableRuleConfiguration tableRuleConfig = new ShardingTableRuleConfiguration("table", "ds.table_${0..2}");
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTables().add(tableRuleConfig);
return new ShardingRule(shardingRuleConfig, mock(DatabaseType.class), Collections.singletonMap("ds", mock(DataSource.class)));
return new ShardingRule(shardingRuleConfig, mock(DatabaseType.class), Collections.singletonMap("ds", mock(DataSource.class, RETURNS_DEEP_STUBS)));
}
private ShardingSphereSchema buildSchema() {
......
......@@ -28,13 +28,10 @@ public final class NoSuchTableException extends ShardingSphereException {
private static final long serialVersionUID = 8311953084941769743L;
private final String databaseName;
private final String tableName;
public NoSuchTableException(final String databaseName, final String tableName) {
super(String.format("Table '%s.%s' doesn't exist", databaseName, tableName));
this.databaseName = databaseName;
public NoSuchTableException(final String tableName) {
super(String.format("Table '%s' doesn't exist", tableName));
this.tableName = tableName;
}
}
......@@ -93,7 +93,7 @@ public final class ShardingRouteEngineFactory {
return new ShardingUnicastRoutingEngine(tableNames);
}
if (!shardingRule.tableRuleExists(tableNames)) {
return new SingleTableRoutingEngine(tableNames, metaData.getSchema(), sqlStatement);
return new SingleTableRoutingEngine(tableNames, sqlStatement);
}
return getShardingRoutingEngine(shardingRule, shardingConditions, tableNames, props);
}
......@@ -107,7 +107,7 @@ public final class ShardingRouteEngineFactory {
}
Collection<String> tableNames = sqlStatementContext.getTablesContext().getTableNames();
if (!tableNames.isEmpty() && !shardingRule.tableRuleExists(tableNames)) {
return new SingleTableRoutingEngine(tableNames, metaData.getSchema(), sqlStatement);
return new SingleTableRoutingEngine(tableNames, sqlStatement);
}
return new ShardingTableBroadcastRoutingEngine(metaData.getSchema(), sqlStatementContext);
}
......@@ -121,7 +121,7 @@ public final class ShardingRouteEngineFactory {
return new ShardingDatabaseBroadcastRoutingEngine();
}
if (!tableNames.isEmpty() && !shardingRule.tableRuleExists(tableNames)) {
return new SingleTableRoutingEngine(tableNames, metaData.getSchema(), sqlStatement);
return new SingleTableRoutingEngine(tableNames, sqlStatement);
}
if (!tableNames.isEmpty()) {
return new ShardingUnicastRoutingEngine(tableNames);
......@@ -134,7 +134,7 @@ public final class ShardingRouteEngineFactory {
Collection<String> tableNames = sqlStatementContext.getTablesContext().getTableNames();
return shardingRule.tableRuleExists(tableNames)
? new ShardingTableBroadcastRoutingEngine(metaData.getSchema(), sqlStatementContext)
: new SingleTableRoutingEngine(tableNames, metaData.getSchema(), sqlStatementContext.getSqlStatement());
: new SingleTableRoutingEngine(tableNames, sqlStatementContext.getSqlStatement());
} else {
return new ShardingInstanceBroadcastRoutingEngine(metaData.getResource().getDataSourcesMetaData());
}
......
......@@ -20,7 +20,6 @@ package org.apache.shardingsphere.sharding.route.engine.type.single;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.exception.ShardingSphereException;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.route.context.RouteMapper;
import org.apache.shardingsphere.infra.route.context.RouteUnit;
......@@ -43,13 +42,11 @@ public final class SingleTableRoutingEngine implements ShardingRouteEngine {
private final Collection<String> logicTables;
private final ShardingSphereSchema schema;
private final SQLStatement sqlStatement;
@Override
public void route(final RouteContext routeContext, final ShardingRule shardingRule) {
Optional<String> dataSourceName = sqlStatement instanceof CreateTableStatement ? getRandomDataSourceName(shardingRule.getDataSourceNames()) : findDataSourceName();
Optional<String> dataSourceName = sqlStatement instanceof CreateTableStatement ? getRandomDataSourceName(shardingRule.getDataSourceNames()) : findDataSourceNameOfSingleTable(shardingRule);
if (!dataSourceName.isPresent()) {
throw new ShardingSphereException("Can not route tables for `%s`, please make sure the tables are in same schema.", logicTables);
}
......@@ -57,11 +54,10 @@ public final class SingleTableRoutingEngine implements ShardingRouteEngine {
routeContext.getRouteUnits().add(new RouteUnit(new RouteMapper(dataSourceName.get(), dataSourceName.get()), routingTables));
}
// TODO maybe enhance here, only return one data source for multiple tables for now
private Optional<String> findDataSourceName() {
private Optional<String> findDataSourceNameOfSingleTable(final ShardingRule shardingRule) {
for (String each : logicTables) {
if (schema.containsTable(each)) {
return Optional.of(schema.get(each).getAddressingDataSources().iterator().next());
if (shardingRule.getSingleTableRules().containsKey(each)) {
return Optional.of(shardingRule.getSingleTableRules().get(each).getDataSourceName());
}
}
return Optional.empty();
......
......@@ -57,8 +57,7 @@ public abstract class ShardingDDLStatementValidator<T extends DDLStatement> impl
for (SimpleTableSegment each : tables) {
String tableName = each.getTableName().getIdentifier().getValue();
if (!schema.containsTable(tableName)) {
String dataSourceName = schema.get(tableName).getAddressingDataSources().iterator().next();
throw new NoSuchTableException(dataSourceName, tableName);
throw new NoSuchTableException(tableName);
}
}
}
......
......@@ -29,6 +29,7 @@ import org.apache.shardingsphere.sharding.route.engine.condition.ShardingConditi
import org.apache.shardingsphere.sharding.route.engine.condition.value.ListShardingConditionValue;
import org.apache.shardingsphere.sharding.route.engine.condition.value.ShardingConditionValue;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import org.apache.shardingsphere.sharding.rule.SingleTableRule;
import javax.sql.DataSource;
import java.util.ArrayList;
......@@ -38,6 +39,7 @@ import java.util.List;
import java.util.Map;
import java.util.Properties;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
public abstract class AbstractRoutingEngineTest {
......@@ -133,7 +135,9 @@ public abstract class AbstractRoutingEngineTest {
props3.setProperty("algorithm-expression", "t_user_${user_id % 2}");
shardingRuleConfig.getShardingAlgorithms().put("t_user_inline", new ShardingSphereAlgorithmConfiguration("INLINE", props3));
shardingRuleConfig.getShardingAlgorithms().put("hint_test", new ShardingSphereAlgorithmConfiguration("HINT_TEST", new Properties()));
return new ShardingRule(shardingRuleConfig, mock(DatabaseType.class), createDataSourceMapWithMain());
ShardingRule result = new ShardingRule(shardingRuleConfig, mock(DatabaseType.class), createDataSourceMapWithMain());
result.getSingleTableRules().put("t_category", new SingleTableRule("t_category", "ds_0"));
return result;
}
private ShardingTableRuleConfiguration createInlineTableRuleConfig(final String tableName, final String actualDataNodes, final String algorithmExpression, final String dsAlgorithmExpression) {
......@@ -176,16 +180,16 @@ public abstract class AbstractRoutingEngineTest {
private Map<String, DataSource> createDataSourceMap() {
Map<String, DataSource> result = new HashMap<>(2, 1);
result.put("ds_0", mock(DataSource.class));
result.put("ds_1", mock(DataSource.class));
result.put("ds_0", mock(DataSource.class, RETURNS_DEEP_STUBS));
result.put("ds_1", mock(DataSource.class, RETURNS_DEEP_STUBS));
return result;
}
private Map<String, DataSource> createDataSourceMapWithMain() {
Map<String, DataSource> result = new HashMap<>(3, 1);
result.put("ds_0", mock(DataSource.class));
result.put("ds_1", mock(DataSource.class));
result.put("main", mock(DataSource.class));
result.put("ds_0", mock(DataSource.class, RETURNS_DEEP_STUBS));
result.put("ds_1", mock(DataSource.class, RETURNS_DEEP_STUBS));
result.put("main", mock(DataSource.class, RETURNS_DEEP_STUBS));
return result;
}
}
......@@ -33,6 +33,7 @@ import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
public final class ShardingDatabaseBroadcastRoutingEngineTest {
......@@ -53,8 +54,8 @@ public final class ShardingDatabaseBroadcastRoutingEngineTest {
private Map<String, DataSource> createDataSourceMap() {
Map<String, DataSource> result = new HashMap<>(2, 1);
result.put("ds_0", mock(DataSource.class));
result.put("ds_1", mock(DataSource.class));
result.put("ds_0", mock(DataSource.class, RETURNS_DEEP_STUBS));
result.put("ds_1", mock(DataSource.class, RETURNS_DEEP_STUBS));
return result;
}
}
......@@ -51,6 +51,7 @@ import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
......@@ -91,8 +92,8 @@ public final class ShardingTableBroadcastRoutingEngineTest {
private Map<String, DataSource> createDataSourceMap() {
Map<String, DataSource> result = new HashMap<>(2, 1);
result.put("ds0", mock(DataSource.class));
result.put("ds1", mock(DataSource.class));
result.put("ds0", mock(DataSource.class, RETURNS_DEEP_STUBS));
result.put("ds1", mock(DataSource.class, RETURNS_DEEP_STUBS));
return result;
}
......
......@@ -18,13 +18,12 @@
package org.apache.shardingsphere.sharding.route.engine.type.single;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.route.context.RouteMapper;
import org.apache.shardingsphere.infra.route.context.RouteUnit;
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import org.apache.shardingsphere.sharding.rule.SingleTableRule;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.ddl.MySQLCreateTableStatement;
import org.junit.Test;
......@@ -38,15 +37,18 @@ import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
public final class SingleTableRoutingEngineTest {
@Test
public void assertRoute() {
SingleTableRoutingEngine singleTableRoutingEngine = new SingleTableRoutingEngine(Arrays.asList("t_order", "t_order_item"), buildSchema(), null);
SingleTableRoutingEngine singleTableRoutingEngine = new SingleTableRoutingEngine(Arrays.asList("t_order", "t_order_item"), null);
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
ShardingRule shardingRule = new ShardingRule(shardingRuleConfig, mock(DatabaseType.class), createDataSourceMap());
shardingRule.getSingleTableRules().put("t_order", new SingleTableRule("t_order", "ds_0"));
shardingRule.getSingleTableRules().put("t_order_item", new SingleTableRule("t_order_item", "ds_0"));
RouteContext routeContext = new RouteContext();
singleTableRoutingEngine.route(routeContext, shardingRule);
List<RouteUnit> routeUnits = new ArrayList<>(routeContext.getRouteUnits());
......@@ -64,7 +66,7 @@ public final class SingleTableRoutingEngineTest {
@Test
public void assertRouteWithoutShardingRule() {
SingleTableRoutingEngine singleTableRoutingEngine = new SingleTableRoutingEngine(Arrays.asList("t_order", "t_order_item"), buildSchema(), new MySQLCreateTableStatement());
SingleTableRoutingEngine singleTableRoutingEngine = new SingleTableRoutingEngine(Arrays.asList("t_order", "t_order_item"), new MySQLCreateTableStatement());
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
ShardingRule shardingRule = new ShardingRule(shardingRuleConfig, mock(DatabaseType.class), createDataSourceMap());
RouteContext routeContext = new RouteContext();
......@@ -81,23 +83,10 @@ public final class SingleTableRoutingEngineTest {
assertThat(tableMapper1.getLogicName(), is("t_order_item"));
}
private ShardingSphereSchema buildSchema() {
Map<String, TableMetaData> tables = new HashMap<>(2, 1);
tables.put("t_order", buildTableMetaData());
tables.put("t_order_item", buildTableMetaData());
return new ShardingSphereSchema(tables);
}
private TableMetaData buildTableMetaData() {
TableMetaData result = new TableMetaData();
result.getAddressingDataSources().add("ds_0");
return result;
}
private Map<String, DataSource> createDataSourceMap() {
Map<String, DataSource> result = new HashMap<>(2, 1);
result.put("ds_0", mock(DataSource.class));
result.put("ds_1", mock(DataSource.class));
result.put("ds_0", mock(DataSource.class, RETURNS_DEEP_STUBS));
result.put("ds_1", mock(DataSource.class, RETURNS_DEEP_STUBS));
return result;
}
}
......@@ -36,6 +36,7 @@ import java.util.Set;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
public final class ShardingUnicastRoutingEngineTest {
......@@ -88,7 +89,7 @@ public final class ShardingUnicastRoutingEngineTest {
@Test(expected = ShardingSphereConfigurationException.class)
public void assertRouteForWithNoIntersection() {
Set<String> sets = new HashSet<>();
Set<String> sets = new HashSet<>(3, 1);
sets.add("t_order");
sets.add("t_config");
sets.add("t_product");
......@@ -107,9 +108,9 @@ public final class ShardingUnicastRoutingEngineTest {
private Map<String, DataSource> createDataSourceMap() {
Map<String, DataSource> result = new HashMap<>(3, 1);
result.put("ds_0", mock(DataSource.class));
result.put("ds_1", mock(DataSource.class));
result.put("ds_2", mock(DataSource.class));
result.put("ds_0", mock(DataSource.class, RETURNS_DEEP_STUBS));
result.put("ds_1", mock(DataSource.class, RETURNS_DEEP_STUBS));
result.put("ds_2", mock(DataSource.class, RETURNS_DEEP_STUBS));
return result;
}
}
......@@ -96,7 +96,8 @@ public final class ShardingSphereDatabaseMetaDataTest {
ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class, RETURNS_DEEP_STUBS);
when(metaDataContexts.getDefaultMetaData()).thenReturn(metaData);
when(metaData.getResource().getCachedDatabaseMetaData()).thenReturn(cachedDatabaseMetaData);
when(metaData.getRuleMetaData().getRules()).thenReturn(Collections.singletonList(mockShardingRule()));
ShardingRule shardingRule = mockShardingRule();
when(metaData.getRuleMetaData().getRules()).thenReturn(Collections.singleton(shardingRule));
shardingSphereDatabaseMetaData = new ShardingSphereDatabaseMetaData(shardingSphereConnection);
}
......@@ -104,7 +105,7 @@ public final class ShardingSphereDatabaseMetaDataTest {
ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
ShardingTableRuleConfiguration shardingTableRuleConfig = new ShardingTableRuleConfiguration(TABLE_NAME, DATA_SOURCE_NAME + "." + TABLE_NAME);
ruleConfig.setTables(Collections.singletonList(shardingTableRuleConfig));
return new ShardingRule(ruleConfig, mock(DatabaseType.class), Collections.singletonMap(DATA_SOURCE_NAME, mock(DataSource.class)));
return new ShardingRule(ruleConfig, mock(DatabaseType.class), Collections.singletonMap(DATA_SOURCE_NAME, mock(DataSource.class, RETURNS_DEEP_STUBS)));
}
@Test
......
......@@ -81,7 +81,7 @@ public final class MySQLErrPacketFactory {
return new MySQLErrPacket(1, MySQLServerErrorCode.ER_TABLE_EXISTS_ERROR, ((TableExistsException) cause).getTableName());
}
if (cause instanceof NoSuchTableException) {
return new MySQLErrPacket(1, MySQLServerErrorCode.ER_NO_SUCH_TABLE, ((NoSuchTableException) cause).getDatabaseName(), ((NoSuchTableException) cause).getTableName());
return new MySQLErrPacket(1, MySQLServerErrorCode.ER_NO_SUCH_TABLE, ((NoSuchTableException) cause).getTableName());
}
if (cause instanceof CircuitBreakException) {
return new MySQLErrPacket(1, CommonErrorCode.CIRCUIT_BREAK_MODE);
......
......@@ -154,11 +154,11 @@ public final class MySQLErrPacketFactoryTest {
@Test
public void assertNewInstanceWithNoSuchTableException() {
MySQLErrPacket actual = MySQLErrPacketFactory.newInstance(new NoSuchTableException("ds_0", "table_name"));
MySQLErrPacket actual = MySQLErrPacketFactory.newInstance(new NoSuchTableException("table_name"));
assertThat(actual.getSequenceId(), is(1));
assertThat(actual.getErrorCode(), is(1146));
assertThat(actual.getSqlState(), is("42S02"));
assertThat(actual.getErrorMessage(), is("Table 'ds_0.table_name' doesn't exist"));
assertThat(actual.getErrorMessage(), is("Table 'table_name' doesn't exist"));
}
@Test
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册