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