This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 7bfa655d427 Optimize sharding tables route logic when execute cursor
statement (#18413)
7bfa655d427 is described below
commit 7bfa655d42754ec1144d26af7089962703d840e6
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Jun 17 20:07:59 2022 +0800
Optimize sharding tables route logic when execute cursor statement (#18413)
---
.../engine/type/ShardingRouteEngineFactory.java | 16 +++++++-
.../type/ShardingRouteEngineFactoryTest.java | 47 ++++++++++++++++++++++
2 files changed, 61 insertions(+), 2 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 0d141b0c000..77f4ae7750a 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
@@ -121,12 +121,24 @@ public final class ShardingRouteEngineFactory {
return new ShardingIgnoreRoutingEngine();
}
if (sqlStatementContext instanceof CursorAvailable) {
- return shardingRule.isAllBroadcastTables(shardingRuleTableNames) ?
new ShardingUnicastRoutingEngine(sqlStatementContext, shardingRuleTableNames)
- : new
ShardingStandardRoutingEngine(shardingRuleTableNames.iterator().next(),
shardingConditions, props);
+ return getCursorRouteEngine(shardingRule, database,
sqlStatementContext, shardingConditions, props, tableNames);
}
return new ShardingTableBroadcastRoutingEngine(database,
sqlStatementContext, shardingRuleTableNames);
}
+ private static ShardingRouteEngine getCursorRouteEngine(final ShardingRule
shardingRule, final ShardingSphereDatabase database, final
SQLStatementContext<?> sqlStatementContext,
+ final
ShardingConditions shardingConditions, final ConfigurationProperties props,
final Collection<String> tableNames) {
+ if (shardingRule.isAllBroadcastTables(tableNames)) {
+ return new ShardingUnicastRoutingEngine(sqlStatementContext,
tableNames);
+ }
+ Collection<String> logicTableNames =
shardingRule.getShardingLogicTableNames(tableNames);
+ boolean allBindingTables = logicTableNames.size() > 1 &&
shardingRule.isAllBindingTables(database, sqlStatementContext, logicTableNames);
+ if (isShardingStandardQuery(shardingRule, logicTableNames,
allBindingTables)) {
+ return new
ShardingStandardRoutingEngine(getLogicTableName(shardingConditions,
logicTableNames), shardingConditions, props);
+ }
+ return new ShardingIgnoreRoutingEngine();
+ }
+
private static ShardingRouteEngine getDALRoutingEngine(final ShardingRule
shardingRule, final ShardingSphereDatabase database, final
SQLStatementContext<?> sqlStatementContext) {
SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
if (sqlStatement instanceof MySQLUseStatement) {
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 07bd0dc0305..3cfc05ac012 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
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.sharding.route.engine.type;
import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dcl.GrantStatementContext;
+import
org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
@@ -56,6 +57,7 @@ import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQ
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowDatabasesStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLGrantStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLSelectStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.OpenGaussCursorStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dcl.OracleGrantStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dal.PostgreSQLSetStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dcl.PostgreSQLGrantStatement;
@@ -73,6 +75,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Properties;
+import java.util.stream.Collectors;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;
@@ -366,4 +369,48 @@ public final class ShardingRouteEngineFactoryTest {
ShardingRouteEngine actual =
ShardingRouteEngineFactory.newInstance(shardingRule, database,
sqlStatementContext, shardingConditions, props);
assertThat(actual, instanceOf(ShardingIgnoreRoutingEngine.class));
}
+
+ @Test
+ public void assertNewInstanceForCursorStatementWithBroadcastTable() {
+ CursorStatementContext cursorStatementContext =
mock(CursorStatementContext.class);
+ OpenGaussCursorStatement cursorStatement =
mock(OpenGaussCursorStatement.class);
+
when(cursorStatementContext.getSqlStatement()).thenReturn(cursorStatement);
+ Collection<SimpleTableSegment> tableSegments =
createSimpleTableSegments();
+ Collection<String> tableNames = tableSegments.stream().map(each ->
each.getTableName().getIdentifier().getValue()).collect(Collectors.toSet());
+ when(cursorStatementContext.getAllTables()).thenReturn(tableSegments);
+ when(shardingRule.isAllBroadcastTables(tableNames)).thenReturn(true);
+
when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
+ ShardingRouteEngine actual =
ShardingRouteEngineFactory.newInstance(shardingRule, database,
cursorStatementContext, shardingConditions, props);
+ assertThat(actual, instanceOf(ShardingUnicastRoutingEngine.class));
+ }
+
+ @Test
+ public void assertNewInstanceForCursorStatementWithShardingTable() {
+ CursorStatementContext cursorStatementContext =
mock(CursorStatementContext.class);
+ OpenGaussCursorStatement cursorStatement =
mock(OpenGaussCursorStatement.class);
+
when(cursorStatementContext.getSqlStatement()).thenReturn(cursorStatement);
+ Collection<SimpleTableSegment> tableSegments =
createSimpleTableSegments();
+ Collection<String> tableNames = tableSegments.stream().map(each ->
each.getTableName().getIdentifier().getValue()).collect(Collectors.toSet());
+ when(cursorStatementContext.getAllTables()).thenReturn(tableSegments);
+ when(shardingRule.isAllShardingTables(tableNames)).thenReturn(true);
+
when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
+
when(shardingRule.getShardingLogicTableNames(tableNames)).thenReturn(tableNames);
+ ShardingRouteEngine actual =
ShardingRouteEngineFactory.newInstance(shardingRule, database,
cursorStatementContext, shardingConditions, props);
+ assertThat(actual, instanceOf(ShardingStandardRoutingEngine.class));
+ }
+
+ @Test
+ public void assertNewInstanceForCursorStatementWithSingleTable() {
+ CursorStatementContext cursorStatementContext =
mock(CursorStatementContext.class);
+ OpenGaussCursorStatement cursorStatement =
mock(OpenGaussCursorStatement.class);
+
when(cursorStatementContext.getSqlStatement()).thenReturn(cursorStatement);
+ Collection<SimpleTableSegment> tableSegments =
createSimpleTableSegments();
+ when(cursorStatementContext.getAllTables()).thenReturn(tableSegments);
+ ShardingRouteEngine actual =
ShardingRouteEngineFactory.newInstance(shardingRule, database,
cursorStatementContext, shardingConditions, props);
+ assertThat(actual, instanceOf(ShardingIgnoreRoutingEngine.class));
+ }
+
+ private Collection<SimpleTableSegment> createSimpleTableSegments() {
+ return Collections.singletonList(new SimpleTableSegment(new
TableNameSegment(0, 0, new IdentifierValue("t_order"))));
+ }
}