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 <[email protected]>
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)));
}
}