You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/08/26 10:48:40 UTC
[shardingsphere] branch master updated: optimize sharding route
logic and single table route logic (#12028)
This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 7f18db4 optimize sharding route logic and single table route logic (#12028)
7f18db4 is described below
commit 7f18db4a97c97aa9621591865b146e1c626ff068
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Thu Aug 26 18:48:04 2021 +0800
optimize sharding route logic and single table route logic (#12028)
* optimize sharding engine logic
* optimize sharding engine logic
* fix test
* fix test
* remove duplicate method call
---
.../engine/type/ShardingRouteEngineFactory.java | 37 ++++++++++++----------
.../ShardingTableBroadcastRoutingEngine.java | 15 ++++-----
.../federated/ShardingFederatedRoutingEngine.java | 2 +-
.../dml/impl/ShardingSelectStatementValidator.java | 2 +-
.../shardingsphere/sharding/rule/ShardingRule.java | 16 ++++------
.../type/ShardingRouteEngineFactoryTest.java | 11 +++----
.../ShardingTableBroadcastRoutingEngineTest.java | 26 ++++++++-------
.../infra/rule/single/SingleTableRule.java | 8 ++---
.../infra/route/SingleTableSQLRouter.java | 2 +-
.../engine/single/SingleTableRouteEngine.java | 5 +--
10 files changed, 61 insertions(+), 63 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
index 9372228..c759bc0 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
@@ -107,17 +107,17 @@ public final class ShardingRouteEngineFactory {
return new ShardingInstanceBroadcastRoutingEngine(metaData.getResource().getDataSourcesMetaData());
}
Collection<String> tableNames = sqlStatementContext instanceof TableAvailable
- ? ((TableAvailable) sqlStatementContext).getAllTables().stream().map(each -> each.getTableName().getIdentifier().getValue()).collect(Collectors.toList())
+ ? ((TableAvailable) sqlStatementContext).getAllTables().stream().map(each -> each.getTableName().getIdentifier().getValue()).collect(Collectors.toSet())
: sqlStatementContext.getTablesContext().getTableNames();
- if (!tableNames.isEmpty() && !shardingRule.tableRuleExists(tableNames)) {
+ Collection<String> shardingRuleTableNames = shardingRule.getShardingRuleTableNames(tableNames);
+ if (!tableNames.isEmpty() && shardingRuleTableNames.isEmpty()) {
return new ShardingIgnoreRoutingEngine();
}
- return new ShardingTableBroadcastRoutingEngine(metaData.getSchema(), sqlStatementContext);
+ return new ShardingTableBroadcastRoutingEngine(metaData.getSchema(), sqlStatementContext, shardingRuleTableNames);
}
private static ShardingRouteEngine getDALRoutingEngine(final ShardingRule shardingRule, final ShardingSphereMetaData metaData, final SQLStatementContext<?> sqlStatementContext) {
SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
- Collection<String> tableNames = sqlStatementContext.getTablesContext().getTableNames();
if (sqlStatement instanceof MySQLUseStatement) {
return new ShardingIgnoreRoutingEngine();
}
@@ -125,23 +125,26 @@ public final class ShardingRouteEngineFactory {
|| sqlStatement instanceof MySQLShowDatabasesStatement || sqlStatement instanceof PostgreSQLLoadStatement) {
return new ShardingDatabaseBroadcastRoutingEngine();
}
- if (!tableNames.isEmpty() && !shardingRule.tableRuleExists(tableNames)) {
+ Collection<String> tableNames = sqlStatementContext.getTablesContext().getTableNames();
+ Collection<String> shardingRuleTableNames = shardingRule.getShardingRuleTableNames(tableNames);
+ if (!tableNames.isEmpty() && shardingRuleTableNames.isEmpty()) {
return new ShardingIgnoreRoutingEngine();
}
if (sqlStatement instanceof AnalyzeTableStatement) {
- return tableNames.isEmpty() ? new ShardingDatabaseBroadcastRoutingEngine() : new ShardingTableBroadcastRoutingEngine(metaData.getSchema(), sqlStatementContext);
+ return shardingRuleTableNames.isEmpty() ? new ShardingDatabaseBroadcastRoutingEngine()
+ : new ShardingTableBroadcastRoutingEngine(metaData.getSchema(), sqlStatementContext, shardingRuleTableNames);
}
- if (!tableNames.isEmpty()) {
- return new ShardingUnicastRoutingEngine(tableNames);
+ if (!shardingRuleTableNames.isEmpty()) {
+ return new ShardingUnicastRoutingEngine(shardingRuleTableNames);
}
return new ShardingDataSourceGroupBroadcastRoutingEngine();
}
private static ShardingRouteEngine getDCLRoutingEngine(final ShardingRule shardingRule, final ShardingSphereMetaData metaData, final SQLStatementContext<?> sqlStatementContext) {
if (isDCLForSingleTable(sqlStatementContext)) {
- Collection<String> tableNames = sqlStatementContext.getTablesContext().getTableNames();
- return shardingRule.tableRuleExists(tableNames)
- ? new ShardingTableBroadcastRoutingEngine(metaData.getSchema(), sqlStatementContext)
+ Collection<String> shardingRuleTableNames = shardingRule.getShardingRuleTableNames(sqlStatementContext.getTablesContext().getTableNames());
+ return !shardingRuleTableNames.isEmpty()
+ ? new ShardingTableBroadcastRoutingEngine(metaData.getSchema(), sqlStatementContext, shardingRuleTableNames)
: new ShardingIgnoreRoutingEngine();
} else {
return new ShardingInstanceBroadcastRoutingEngine(metaData.getResource().getDataSourcesMetaData());
@@ -165,15 +168,15 @@ public final class ShardingRouteEngineFactory {
if (sqlStatementContext.getSqlStatement() instanceof DMLStatement && shardingConditions.isAlwaysFalse() || tableNames.isEmpty()) {
return new ShardingUnicastRoutingEngine(tableNames);
}
- if (!shardingRule.tableRuleExists(tableNames)) {
+ Collection<String> shardingRuleTableNames = shardingRule.getShardingRuleTableNames(tableNames);
+ if (shardingRuleTableNames.isEmpty()) {
return new ShardingIgnoreRoutingEngine();
}
- return getDQLRouteEngineForShardingTable(shardingRule, sqlStatementContext, shardingConditions, props);
+ return getDQLRouteEngineForShardingTable(shardingRule, sqlStatementContext, shardingConditions, shardingRuleTableNames, props);
}
- private static ShardingRouteEngine getDQLRouteEngineForShardingTable(final ShardingRule shardingRule, final SQLStatementContext<?> sqlStatementContext,
- final ShardingConditions shardingConditions, final ConfigurationProperties props) {
- Collection<String> tableNames = shardingRule.getShardingBroadcastTableNames(sqlStatementContext.getTablesContext().getTableNames());
+ private static ShardingRouteEngine getDQLRouteEngineForShardingTable(final ShardingRule shardingRule, final SQLStatementContext<?> sqlStatementContext,
+ final ShardingConditions shardingConditions, final Collection<String> tableNames, final ConfigurationProperties props) {
if (isShardingStandardQuery(sqlStatementContext, tableNames, shardingRule)) {
return new ShardingStandardRoutingEngine(getLogicTableName(shardingConditions, tableNames), shardingConditions, props);
}
@@ -191,7 +194,7 @@ public final class ShardingRouteEngineFactory {
private static boolean isShardingStandardQuery(final SQLStatementContext<?> sqlStatementContext, final Collection<String> tableNames, final ShardingRule shardingRule) {
boolean needExecuteByCalcite = sqlStatementContext instanceof SelectStatementContext && ((SelectStatementContext) sqlStatementContext).isNeedExecuteByCalcite();
- return !needExecuteByCalcite && (shardingRule.isAllShardingTables(tableNames) && 1 == tableNames.size() || shardingRule.isAllBindingTables(tableNames));
+ return !needExecuteByCalcite && (1 == tableNames.size() && shardingRule.isAllShardingTables(tableNames) || shardingRule.isAllBindingTables(tableNames));
}
private static boolean isShardingFederatedQuery(final SQLStatementContext<?> sqlStatementContext, final Collection<String> tableNames, final ShardingRule shardingRule) {
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngine.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngine.java
index e392e0c..9ab6897 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngine.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngine.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.sharding.route.engine.type.broadcast;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.type.IndexAvailable;
-import org.apache.shardingsphere.infra.binder.type.TableAvailable;
import org.apache.shardingsphere.infra.datanode.DataNode;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.route.context.RouteContext;
@@ -48,6 +47,8 @@ public final class ShardingTableBroadcastRoutingEngine implements ShardingRouteE
private final SQLStatementContext<?> sqlStatementContext;
+ private final Collection<String> shardingRuleTableNames;
+
@Override
public void route(final RouteContext routeContext, final ShardingRule shardingRule) {
Collection<String> logicTableNames = getLogicTableNames();
@@ -55,9 +56,8 @@ public final class ShardingTableBroadcastRoutingEngine implements ShardingRouteE
routeContext.getRouteUnits().addAll(getBroadcastTableRouteUnits(shardingRule, ""));
return;
}
- Collection<String> shardingLogicTableNames = shardingRule.getShardingLogicTableNames(logicTableNames);
- if (shardingLogicTableNames.size() > 1 && shardingRule.isAllBindingTables(shardingLogicTableNames)) {
- routeContext.getRouteUnits().addAll(getBindingTableRouteUnits(shardingRule, shardingLogicTableNames));
+ if (logicTableNames.size() > 1 && shardingRule.isAllBindingTables(logicTableNames)) {
+ routeContext.getRouteUnits().addAll(getBindingTableRouteUnits(shardingRule, logicTableNames));
} else {
Collection<RouteContext> routeContexts = getRouteContexts(shardingRule, logicTableNames);
RouteContext newRouteContext = new RouteContext();
@@ -102,11 +102,8 @@ public final class ShardingTableBroadcastRoutingEngine implements ShardingRouteE
}
private Collection<String> getLogicTableNames() {
- Collection<String> tableNamesInSQL = sqlStatementContext instanceof TableAvailable
- ? ((TableAvailable) sqlStatementContext).getAllTables().stream().map(each -> each.getTableName().getIdentifier().getValue()).collect(Collectors.toList())
- : sqlStatementContext.getTablesContext().getTableNames();
- if (!tableNamesInSQL.isEmpty()) {
- return tableNamesInSQL;
+ if (!shardingRuleTableNames.isEmpty()) {
+ return shardingRuleTableNames;
}
return sqlStatementContext instanceof IndexAvailable ? getTableNamesFromMetaData(((IndexAvailable) sqlStatementContext).getIndexes()) : Collections.emptyList();
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/federated/ShardingFederatedRoutingEngine.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/federated/ShardingFederatedRoutingEngine.java
index 8384f67..216df43 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/federated/ShardingFederatedRoutingEngine.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/federated/ShardingFederatedRoutingEngine.java
@@ -38,7 +38,7 @@ public final class ShardingFederatedRoutingEngine implements ShardingRouteEngine
@Override
public void route(final RouteContext routeContext, final ShardingRule shardingRule) {
- for (String each : shardingRule.getShardingBroadcastTableNames(logicTables)) {
+ for (String each : logicTables) {
fillRouteContext(routeContext, shardingRule, each);
}
routeContext.setFederated(true);
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingSelectStatementValidator.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingSelectStatementValidator.java
index 01ed72c..7b6d59f 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingSelectStatementValidator.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingSelectStatementValidator.java
@@ -41,7 +41,7 @@ public final class ShardingSelectStatementValidator extends ShardingDMLStatement
@Override
public void preValidate(final ShardingRule shardingRule, final SQLStatementContext<SelectStatement> sqlStatementContext,
final List<Object> parameters, final ShardingSphereSchema schema) {
- if (!sqlStatementContext.getSqlStatement().getUnionSegments().isEmpty() && !shardingRule.getShardingBroadcastTableNames(sqlStatementContext.getTablesContext().getTableNames()).isEmpty()) {
+ if (!sqlStatementContext.getSqlStatement().getUnionSegments().isEmpty() && !shardingRule.getShardingRuleTableNames(sqlStatementContext.getTablesContext().getTableNames()).isEmpty()) {
throw new ShardingSphereException("SELECT ... UNION statement can not support sharding tables or broadcast tables.");
}
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
index 8543067..60822a9 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
@@ -53,6 +53,7 @@ import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
import java.util.TreeSet;
import java.util.function.Function;
@@ -289,7 +290,7 @@ public final class ShardingRule implements FeatureRule, SchemaRule, DataNodeCont
* @return logic tables is all belong to broadcast encryptors or not
*/
public boolean isAllBroadcastTables(final Collection<String> logicTableNames) {
- return !logicTableNames.isEmpty() && logicTableNames.stream().allMatch(this::isBroadcastTable);
+ return !logicTableNames.isEmpty() && broadcastTables.containsAll(logicTableNames);
}
/**
@@ -329,11 +330,8 @@ public final class ShardingRule implements FeatureRule, SchemaRule, DataNodeCont
* @return whether all tables are in same data source or not
*/
public boolean isAllTablesInSameDataSource(final Collection<String> logicTableNames) {
- Collection<String> tableNames = new HashSet<>(logicTableNames);
- Collection<String> dataSourceNames = new HashSet<>();
- dataSourceNames.addAll(tableRules.values().stream().filter(each -> tableNames.contains(each.getLogicTable())).flatMap(each
- -> each.getActualDataNodes().stream()).map(DataNode::getDataSourceName).collect(Collectors.toSet()));
- dataSourceNames.addAll(broadcastTables.stream().filter(tableNames::contains).flatMap(each -> getDataSourceNames().stream()).collect(Collectors.toSet()));
+ Collection<String> dataSourceNames = logicTableNames.stream().map(each -> tableRules.get(each.toLowerCase()))
+ .filter(Objects::nonNull).flatMap(each -> each.getActualDatasourceNames().stream()).collect(Collectors.toSet());
return 1 == dataSourceNames.size();
}
@@ -437,12 +435,12 @@ public final class ShardingRule implements FeatureRule, SchemaRule, DataNodeCont
}
/**
- * Get sharding broadcast table names.
+ * Get sharding rule table names.
*
* @param logicTableNames logic table names
- * @return sharding broadcast table names
+ * @return sharding rule table names
*/
- public Collection<String> getShardingBroadcastTableNames(final Collection<String> logicTableNames) {
+ public Collection<String> getShardingRuleTableNames(final Collection<String> logicTableNames) {
return logicTableNames.stream().filter(each -> isShardingTable(each) || isBroadcastTable(each)).collect(Collectors.toCollection(LinkedList::new));
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
index 38c64f5..a74c282 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
@@ -118,7 +118,7 @@ public final class ShardingRouteEngineFactoryTest {
@Test
public void assertNewInstanceForDALWithTables() {
tableNames.add("tbl");
- when(shardingRule.tableRuleExists(tableNames)).thenReturn(true);
+ when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
DALStatement dalStatement = mock(DALStatement.class);
when(sqlStatementContext.getSqlStatement()).thenReturn(dalStatement);
ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(shardingRule, metaData, sqlStatementContext, shardingConditions, props);
@@ -248,8 +248,7 @@ public final class ShardingRouteEngineFactoryTest {
SQLStatement sqlStatement = mock(SQLStatement.class);
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
tableNames.add("");
- when(shardingRule.getShardingBroadcastTableNames(sqlStatementContext.getTablesContext().getTableNames())).thenReturn(tableNames);
- when(shardingRule.tableRuleExists(tableNames)).thenReturn(true);
+ when(shardingRule.getShardingRuleTableNames(sqlStatementContext.getTablesContext().getTableNames())).thenReturn(tableNames);
when(shardingRule.isAllShardingTables(tableNames)).thenReturn(true);
ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(shardingRule, metaData, sqlStatementContext, shardingConditions, props);
assertThat(actual, instanceOf(ShardingStandardRoutingEngine.class));
@@ -261,7 +260,7 @@ public final class ShardingRouteEngineFactoryTest {
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
tableNames.add("1");
tableNames.add("2");
- when(shardingRule.tableRuleExists(tableNames)).thenReturn(true);
+ when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(shardingRule, metaData, sqlStatementContext, shardingConditions, props);
assertThat(actual, instanceOf(ShardingComplexRoutingEngine.class));
}
@@ -271,7 +270,7 @@ public final class ShardingRouteEngineFactoryTest {
DALStatement dalStatement = mock(MySQLShowCreateTableStatement.class);
when(sqlStatementContext.getSqlStatement()).thenReturn(dalStatement);
tableNames.add("table_1");
- when(shardingRule.tableRuleExists(tableNames)).thenReturn(true);
+ when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(shardingRule, metaData, sqlStatementContext, shardingConditions, props);
assertThat(actual, instanceOf(ShardingUnicastRoutingEngine.class));
}
@@ -281,7 +280,7 @@ public final class ShardingRouteEngineFactoryTest {
DALStatement dalStatement = mock(MySQLShowColumnsStatement.class);
when(sqlStatementContext.getSqlStatement()).thenReturn(dalStatement);
tableNames.add("table_1");
- when(shardingRule.tableRuleExists(tableNames)).thenReturn(true);
+ when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(shardingRule, metaData, sqlStatementContext, shardingConditions, props);
assertThat(actual, instanceOf(ShardingUnicastRoutingEngine.class));
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngineTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngineTest.java
index ac183f4..5034e96 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngineTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngineTest.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.sharding.route.engine.type.broadcast;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.statement.ddl.DropIndexStatementContext;
import org.apache.shardingsphere.infra.binder.type.IndexAvailable;
-import org.apache.shardingsphere.infra.binder.type.TableAvailable;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.route.context.RouteMapper;
@@ -36,10 +35,10 @@ import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import javax.sql.DataSource;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
@@ -54,8 +53,9 @@ public final class ShardingTableBroadcastRoutingEngineTest extends AbstractRouti
@Test
public void assertRouteForEmptyTable() {
+ Collection<String> tableNames = Collections.emptyList();
ShardingTableBroadcastRoutingEngine shardingTableBroadcastRoutingEngine =
- new ShardingTableBroadcastRoutingEngine(mock(ShardingSphereSchema.class), createSQLStatementContext(Collections.emptyList()));
+ new ShardingTableBroadcastRoutingEngine(mock(ShardingSphereSchema.class), createSQLStatementContext(tableNames), tableNames);
RouteContext routeContext = new RouteContext();
shardingTableBroadcastRoutingEngine.route(routeContext, createShardingRule(false));
assertRouteUnitWithoutTables(routeContext);
@@ -63,8 +63,9 @@ public final class ShardingTableBroadcastRoutingEngineTest extends AbstractRouti
@Test
public void assertRouteForNormalTable() {
+ Collection<String> tableNames = Collections.singletonList("t_order");
ShardingTableBroadcastRoutingEngine shardingTableBroadcastRoutingEngine =
- new ShardingTableBroadcastRoutingEngine(mock(ShardingSphereSchema.class), createSQLStatementContext(Collections.singletonList("t_order")));
+ new ShardingTableBroadcastRoutingEngine(mock(ShardingSphereSchema.class), createSQLStatementContext(tableNames), tableNames);
RouteContext routeContext = new RouteContext();
shardingTableBroadcastRoutingEngine.route(routeContext, createShardingRule(false));
assertThat(routeContext.getActualDataSourceNames().size(), is(2));
@@ -78,8 +79,9 @@ public final class ShardingTableBroadcastRoutingEngineTest extends AbstractRouti
@Test
public void assertRouteForBroadcastTable() {
+ Collection<String> tableNames = Collections.singletonList("t_order");
ShardingTableBroadcastRoutingEngine shardingTableBroadcastRoutingEngine =
- new ShardingTableBroadcastRoutingEngine(mock(ShardingSphereSchema.class), createSQLStatementContext(Collections.singletonList("t_order")));
+ new ShardingTableBroadcastRoutingEngine(mock(ShardingSphereSchema.class), createSQLStatementContext(tableNames), tableNames);
RouteContext routeContext = new RouteContext();
shardingTableBroadcastRoutingEngine.route(routeContext, createShardingRule(true));
assertThat(routeContext.getActualDataSourceNames().size(), is(2));
@@ -97,10 +99,10 @@ public final class ShardingTableBroadcastRoutingEngineTest extends AbstractRouti
IndexSegment segment = mock(IndexSegment.class, RETURNS_DEEP_STUBS);
when(segment.getIdentifier().getValue()).thenReturn("t_order");
SQLStatementContext<DropIndexStatement> sqlStatementContext = mock(DropIndexStatementContext.class, RETURNS_DEEP_STUBS);
- when(sqlStatementContext.getTablesContext().getTableNames()).thenReturn(Collections.emptyList());
- when(((TableAvailable) sqlStatementContext).getAllTables()).thenReturn(Collections.emptyList());
+ Collection<String> tableNames = Collections.emptyList();
+ when(sqlStatementContext.getTablesContext().getTableNames()).thenReturn(tableNames);
when(((IndexAvailable) sqlStatementContext).getIndexes()).thenReturn(Collections.singletonList(segment));
- ShardingTableBroadcastRoutingEngine shardingTableBroadcastRoutingEngine = new ShardingTableBroadcastRoutingEngine(schema, sqlStatementContext);
+ ShardingTableBroadcastRoutingEngine shardingTableBroadcastRoutingEngine = new ShardingTableBroadcastRoutingEngine(schema, sqlStatementContext, tableNames);
RouteContext routeContext = new RouteContext();
shardingTableBroadcastRoutingEngine.route(routeContext, createShardingRule(false));
assertThat(routeContext.getActualDataSourceNames().size(), is(2));
@@ -118,9 +120,9 @@ public final class ShardingTableBroadcastRoutingEngineTest extends AbstractRouti
IndexSegment segment = mock(IndexSegment.class, RETURNS_DEEP_STUBS);
when(segment.getIdentifier().getValue()).thenReturn("t_order");
SQLStatementContext<DropIndexStatement> sqlStatementContext = mock(DropIndexStatementContext.class, RETURNS_DEEP_STUBS);
- when(sqlStatementContext.getTablesContext().getTableNames()).thenReturn(Collections.emptyList());
- when(((TableAvailable) sqlStatementContext).getAllTables()).thenReturn(Collections.emptyList());
- ShardingTableBroadcastRoutingEngine shardingTableBroadcastRoutingEngine = new ShardingTableBroadcastRoutingEngine(schema, sqlStatementContext);
+ Collection<String> tableNames = Collections.emptyList();
+ when(sqlStatementContext.getTablesContext().getTableNames()).thenReturn(tableNames);
+ ShardingTableBroadcastRoutingEngine shardingTableBroadcastRoutingEngine = new ShardingTableBroadcastRoutingEngine(schema, sqlStatementContext, tableNames);
RouteContext routeContext = new RouteContext();
shardingTableBroadcastRoutingEngine.route(routeContext, createShardingRule(false));
assertRouteUnitWithoutTables(routeContext);
@@ -138,7 +140,7 @@ public final class ShardingTableBroadcastRoutingEngineTest extends AbstractRouti
return new ShardingRule(shardingRuleConfiguration, dataSourceMap);
}
- private SQLStatementContext<?> createSQLStatementContext(final List<String> tableNames) {
+ private SQLStatementContext<?> createSQLStatementContext(final Collection<String> tableNames) {
SQLStatementContext<?> result = mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
when(result.getTablesContext().getTableNames()).thenReturn(tableNames);
return result;
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/single/SingleTableRule.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/single/SingleTableRule.java
index 6ac4d0f..67e33cf 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/single/SingleTableRule.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/single/SingleTableRule.java
@@ -31,11 +31,11 @@ import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
import javax.sql.DataSource;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
@@ -86,10 +86,8 @@ public final class SingleTableRule implements KernelRule, SchemaRule, DataNodeCo
* @return whether single table is in same data source or not
*/
public boolean isSingleTableInSameDataSource(final Collection<String> logicTableNames) {
- Set<String> singleTableNames = new HashSet<>(getSingleTableNames(logicTableNames));
- long dataSourceCount = singleTableDataNodes.keySet().stream().filter(singleTableNames::contains).map(each -> singleTableDataNodes.get(each).getDataSourceName())
- .collect(Collectors.toSet()).size();
- return dataSourceCount <= 1;
+ Set<String> dataSourceNames = logicTableNames.stream().map(singleTableDataNodes::get).filter(Objects::nonNull).map(SingleTableDataNode::getDataSourceName).collect(Collectors.toSet());
+ return dataSourceNames.size() <= 1;
}
/**
diff --git a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/SingleTableSQLRouter.java b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/SingleTableSQLRouter.java
index 38f3663..0b7b6d2 100644
--- a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/SingleTableSQLRouter.java
+++ b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/SingleTableSQLRouter.java
@@ -56,7 +56,7 @@ public final class SingleTableSQLRouter implements SQLRouter<SingleTableRule> {
private Collection<String> getSingleTableNames(final SQLStatementContext<?> sqlStatementContext, final SingleTableRule rule, final RouteContext result) {
Collection<String> tableNames = sqlStatementContext instanceof TableAvailable
- ? ((TableAvailable) sqlStatementContext).getAllTables().stream().map(each -> each.getTableName().getIdentifier().getValue()).collect(Collectors.toList())
+ ? ((TableAvailable) sqlStatementContext).getAllTables().stream().map(each -> each.getTableName().getIdentifier().getValue()).collect(Collectors.toSet())
: sqlStatementContext.getTablesContext().getTableNames();
return result.getRouteUnits().isEmpty() && sqlStatementContext.getSqlStatement() instanceof CreateTableStatement ? tableNames : rule.getSingleTableNames(tableNames);
}
diff --git a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/engine/single/SingleTableRouteEngine.java b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/engine/single/SingleTableRouteEngine.java
index caa242f..a1786e9 100644
--- a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/engine/single/SingleTableRouteEngine.java
+++ b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/engine/single/SingleTableRouteEngine.java
@@ -130,11 +130,12 @@ public final class SingleTableRouteEngine {
}
private void fillRouteContext(final SingleTableRule singleTableRule, final RouteContext routeContext, final Collection<String> logicTables) {
+ Map<String, SingleTableDataNode> singleTableDataNodes = singleTableRule.getSingleTableDataNodes();
for (String each : logicTables) {
- if (!singleTableRule.getSingleTableDataNodes().containsKey(each)) {
+ if (!singleTableDataNodes.containsKey(each)) {
throw new ShardingSphereException("`%s` single table does not exist.", each);
}
- String dataSource = singleTableRule.getSingleTableDataNodes().get(each).getDataSourceName();
+ String dataSource = singleTableDataNodes.get(each).getDataSourceName();
routeContext.putRouteUnit(new RouteMapper(dataSource, dataSource), Collections.singletonList(new RouteMapper(each, each)));
}
}