This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 e4697ae8a27 Refactor broadcast sql router (#33530)
e4697ae8a27 is described below
commit e4697ae8a276839811a8ee4f2f3af205f47d5f6d
Author: ZhangCheng <[email protected]>
AuthorDate: Mon Nov 4 15:36:06 2024 +0800
Refactor broadcast sql router (#33530)
---
.../broadcast/route/BroadcastSQLRouter.java | 34 +++++++++-------------
1 file changed, 14 insertions(+), 20 deletions(-)
diff --git
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouter.java
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouter.java
index 3922375cda0..fb732d9edec 100644
---
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouter.java
+++
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouter.java
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.broadcast.route;
import org.apache.shardingsphere.broadcast.constant.BroadcastOrder;
import
org.apache.shardingsphere.broadcast.route.engine.BroadcastRouteEngineFactory;
+import
org.apache.shardingsphere.broadcast.route.engine.type.broadcast.BroadcastDatabaseBroadcastRouteEngine;
+import
org.apache.shardingsphere.broadcast.route.engine.type.broadcast.BroadcastInstanceBroadcastRouteEngine;
import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
@@ -66,9 +68,7 @@ public final class BroadcastSQLRouter implements
EntranceSQLRouter<BroadcastRule
@Override
public RouteContext createRouteContext(final QueryContext queryContext,
final RuleMetaData globalRuleMetaData,
final ShardingSphereDatabase
database, final BroadcastRule rule, final ConfigurationProperties props) {
- RouteContext result = new RouteContext();
- BroadcastRouteEngineFactory.newInstance(rule, database,
queryContext).route(result, rule);
- return result;
+ return BroadcastRouteEngineFactory.newInstance(rule, database,
queryContext).route(new RouteContext(), rule);
}
@Override
@@ -81,21 +81,21 @@ public final class BroadcastSQLRouter implements
EntranceSQLRouter<BroadcastRule
} else if (sqlStatement instanceof DDLStatement) {
decorateRouteContextWhenDDLStatement(routeContext, queryContext,
database, rule);
} else if (sqlStatement instanceof DALStatement &&
isResourceGroupStatement(sqlStatement)) {
- routeToAllDatabaseInstances(routeContext, database, rule);
+ doInstanceBroadcastRoute(routeContext, database, rule);
} else if (sqlStatement instanceof DCLStatement &&
!isDCLForSingleTable(queryContext.getSqlStatementContext())) {
- routeToAllDatabaseInstances(routeContext, database, rule);
+ doInstanceBroadcastRoute(routeContext, database, rule);
}
}
private void decorateRouteContextWhenTCLStatement(final RouteContext
routeContext, final BroadcastRule rule) {
- routeToAllDatabases(routeContext, rule);
+ doDatabaseBroadcastRoute(routeContext, rule);
}
private void decorateRouteContextWhenDDLStatement(final RouteContext
routeContext, final QueryContext queryContext, final ShardingSphereDatabase
database, final BroadcastRule rule) {
SQLStatementContext sqlStatementContext =
queryContext.getSqlStatementContext();
if (sqlStatementContext instanceof CursorAvailable) {
if (sqlStatementContext instanceof CloseStatementContext &&
((CloseStatementContext) sqlStatementContext).getSqlStatement().isCloseAll()) {
- routeToAllDatabases(routeContext, rule);
+ doDatabaseBroadcastRoute(routeContext, rule);
}
return;
}
@@ -106,17 +106,17 @@ public final class BroadcastSQLRouter implements
EntranceSQLRouter<BroadcastRule
boolean functionStatement = sqlStatement instanceof
CreateFunctionStatement || sqlStatement instanceof AlterFunctionStatement ||
sqlStatement instanceof DropFunctionStatement;
boolean procedureStatement = sqlStatement instanceof
CreateProcedureStatement || sqlStatement instanceof AlterProcedureStatement ||
sqlStatement instanceof DropProcedureStatement;
if (functionStatement || procedureStatement) {
- routeToAllDatabases(routeContext, rule);
+ doDatabaseBroadcastRoute(routeContext, rule);
return;
}
// TODO BEGIN extract db route logic to common database router, eg:
DCL in instance route @duanzhengqiang
if (sqlStatement instanceof CreateTablespaceStatement || sqlStatement
instanceof AlterTablespaceStatement || sqlStatement instanceof
DropTablespaceStatement) {
- routeToAllDatabaseInstances(routeContext, database, rule);
+ doInstanceBroadcastRoute(routeContext, database, rule);
}
// TODO END extract db route logic to common database router, eg: DCL
in instance route
Collection<String> tableNames = sqlStatementContext instanceof
TableAvailable ? getTableNames((TableAvailable) sqlStatementContext) :
Collections.emptyList();
if (rule.isAllBroadcastTables(tableNames)) {
- routeToAllDatabaseInstances(routeContext, database, rule);
+ doInstanceBroadcastRoute(routeContext, database, rule);
}
}
@@ -152,20 +152,14 @@ public final class BroadcastSQLRouter implements
EntranceSQLRouter<BroadcastRule
return false;
}
- private void routeToAllDatabases(final RouteContext routeContext, final
BroadcastRule rule) {
+ private void doDatabaseBroadcastRoute(final RouteContext routeContext,
final BroadcastRule rule) {
routeContext.getRouteUnits().clear();
- for (String each : rule.getDataSourceNames()) {
- routeContext.getRouteUnits().add(new RouteUnit(new
RouteMapper(each, each), Collections.emptyList()));
- }
+ routeContext.getRouteUnits().addAll(new
BroadcastDatabaseBroadcastRouteEngine().route(new RouteContext(),
rule).getRouteUnits());
}
- private void routeToAllDatabaseInstances(final RouteContext routeContext,
final ShardingSphereDatabase database, final BroadcastRule rule) {
+ private void doInstanceBroadcastRoute(final RouteContext routeContext,
final ShardingSphereDatabase database, final BroadcastRule rule) {
routeContext.getRouteUnits().clear();
- for (String each : rule.getDataSourceNames()) {
- if
(database.getResourceMetaData().getAllInstanceDataSourceNames().contains(each))
{
- routeContext.getRouteUnits().add(new RouteUnit(new
RouteMapper(each, each), Collections.emptyList()));
- }
- }
+ routeContext.getRouteUnits().addAll(new
BroadcastInstanceBroadcastRouteEngine(database.getResourceMetaData()).route(new
RouteContext(), rule).getRouteUnits());
}
@Override