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

Reply via email to