This is an automated email from the ASF dual-hosted git repository.

jianglongtao 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 96848f52663 Add ShadowRouteContextDecorator (#33518)
96848f52663 is described below

commit 96848f52663a59d8ed9d02cdc4a062dd68e77dd2
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Nov 3 23:06:48 2024 +0800

    Add ShadowRouteContextDecorator (#33518)
    
    * Add ShadowRouteContextDecorator
    
    * Add ShadowRouteContextDecorator
---
 ...ngine.java => ShadowRouteContextDecorator.java} | 17 +++-----
 .../shadow/route/engine/ShadowRouteEngine.java     | 33 ---------------
 .../dml/AbstractShadowDMLStatementRouteEngine.java | 47 ++++++++++++----------
 .../dml/ShadowSelectStatementRouteEngine.java      |  2 +-
 .../impl/ShadowNonDMLStatementRouteEngine.java     |  3 +-
 5 files changed, 34 insertions(+), 68 deletions(-)

diff --git 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteEngine.java
 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteContextDecorator.java
similarity index 87%
copy from 
features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteEngine.java
copy to 
features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteContextDecorator.java
index 6e32191d80e..85b06be7d69 100644
--- 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteEngine.java
+++ 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteContextDecorator.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.shadow.route.engine;
 
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
@@ -28,17 +30,10 @@ import java.util.Map;
 import java.util.Optional;
 
 /**
- * Shadow route engine.
+ * Shadow route context decorator.
  */
-public interface ShadowRouteEngine {
-    
-    /**
-     * Route.
-     *
-     * @param routeContext route context
-     * @param rule shadow rule
-     */
-    void route(RouteContext routeContext, ShadowRule rule);
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class ShadowRouteContextDecorator {
     
     /**
      * Decorate route context.
@@ -47,7 +42,7 @@ public interface ShadowRouteEngine {
      * @param rule shadow rule
      * @param shadowDataSourceMappings shadow data source mappings
      */
-    default void decorateRouteContext(final RouteContext routeContext, final 
ShadowRule rule, final Map<String, String> shadowDataSourceMappings) {
+    public static void decorate(final RouteContext routeContext, final 
ShadowRule rule, final Map<String, String> shadowDataSourceMappings) {
         Collection<RouteUnit> toBeRemovedRouteUnit = new LinkedList<>();
         Collection<RouteUnit> toBeAddedRouteUnit = new LinkedList<>();
         for (RouteUnit each : routeContext.getRouteUnits()) {
diff --git 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteEngine.java
 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteEngine.java
index 6e32191d80e..c81a83124c7 100644
--- 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteEngine.java
+++ 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteEngine.java
@@ -18,15 +18,8 @@
 package org.apache.shardingsphere.shadow.route.engine;
 
 import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.infra.route.context.RouteMapper;
-import org.apache.shardingsphere.infra.route.context.RouteUnit;
 import org.apache.shardingsphere.shadow.rule.ShadowRule;
 
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Optional;
-
 /**
  * Shadow route engine.
  */
@@ -39,30 +32,4 @@ public interface ShadowRouteEngine {
      * @param rule shadow rule
      */
     void route(RouteContext routeContext, ShadowRule rule);
-    
-    /**
-     * Decorate route context.
-     *
-     * @param routeContext route context to be decorated
-     * @param rule shadow rule
-     * @param shadowDataSourceMappings shadow data source mappings
-     */
-    default void decorateRouteContext(final RouteContext routeContext, final 
ShadowRule rule, final Map<String, String> shadowDataSourceMappings) {
-        Collection<RouteUnit> toBeRemovedRouteUnit = new LinkedList<>();
-        Collection<RouteUnit> toBeAddedRouteUnit = new LinkedList<>();
-        for (RouteUnit each : routeContext.getRouteUnits()) {
-            String logicName = each.getDataSourceMapper().getLogicName();
-            String actualName = each.getDataSourceMapper().getActualName();
-            Optional<String> sourceDataSourceName = 
rule.getSourceDataSourceName(actualName);
-            if (sourceDataSourceName.isPresent()) {
-                String shadowDataSourceName = 
shadowDataSourceMappings.get(sourceDataSourceName.get());
-                toBeRemovedRouteUnit.add(each);
-                toBeAddedRouteUnit.add(null == shadowDataSourceName
-                        ? new RouteUnit(new RouteMapper(logicName, 
sourceDataSourceName.get()), each.getTableMappers())
-                        : new RouteUnit(new RouteMapper(logicName, 
shadowDataSourceName), each.getTableMappers()));
-            }
-        }
-        routeContext.getRouteUnits().removeAll(toBeRemovedRouteUnit);
-        routeContext.getRouteUnits().addAll(toBeAddedRouteUnit);
-    }
 }
diff --git 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java
 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java
index a7c92037a8d..e7d80712218 100644
--- 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java
+++ 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java
@@ -17,15 +17,15 @@
 
 package org.apache.shardingsphere.shadow.route.engine.dml;
 
-import lombok.AccessLevel;
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.shadow.condition.ShadowColumnCondition;
 import org.apache.shardingsphere.shadow.condition.ShadowDetermineCondition;
+import 
org.apache.shardingsphere.shadow.route.engine.ShadowRouteContextDecorator;
 import org.apache.shardingsphere.shadow.route.engine.ShadowRouteEngine;
 import 
org.apache.shardingsphere.shadow.route.engine.determiner.ColumnShadowAlgorithmDeterminer;
 import 
org.apache.shardingsphere.shadow.route.engine.determiner.HintShadowAlgorithmDeterminer;
@@ -45,25 +45,23 @@ import java.util.Optional;
 /**
  * Abstract shadow DML statement route engine.
  */
-@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
-@Getter
+@HighFrequencyInvocation
 public abstract class AbstractShadowDMLStatementRouteEngine implements 
ShadowRouteEngine {
     
-    private final SQLStatementContext sqlStatementContext;
-    
-    private final HintValueContext hintValueContext;
-    
     private final ShadowOperationType operationType;
     
-    private final Map<String, String> tableAliasNameMappings = new 
LinkedHashMap<>();
+    private final boolean isShadow;
     
-    @Override
-    public final void route(final RouteContext routeContext, final ShadowRule 
rule) {
-        
tableAliasNameMappings.putAll(getTableAliasNameMappings(((TableAvailable) 
sqlStatementContext).getTablesContext().getSimpleTables()));
-        decorateRouteContext(routeContext, rule, 
findShadowDataSourceMappings(rule));
+    @Getter
+    private final Map<String, String> tableAliasAndNameMappings;
+    
+    protected AbstractShadowDMLStatementRouteEngine(final SQLStatementContext 
sqlStatementContext, final HintValueContext hintValueContext, final 
ShadowOperationType operationType) {
+        this.operationType = operationType;
+        isShadow = hintValueContext.isShadow();
+        tableAliasAndNameMappings = 
getTableAliasAndNameMappings(((TableAvailable) 
sqlStatementContext).getTablesContext().getSimpleTables());
     }
     
-    private Map<String, String> getTableAliasNameMappings(final 
Collection<SimpleTableSegment> tableSegments) {
+    private Map<String, String> getTableAliasAndNameMappings(final 
Collection<SimpleTableSegment> tableSegments) {
         Map<String, String> result = new LinkedHashMap<>(tableSegments.size(), 
1F);
         for (SimpleTableSegment each : tableSegments) {
             String tableName = each.getTableName().getIdentifier().getValue();
@@ -73,12 +71,17 @@ public abstract class AbstractShadowDMLStatementRouteEngine 
implements ShadowRou
         return result;
     }
     
+    @Override
+    public final void route(final RouteContext routeContext, final ShadowRule 
rule) {
+        ShadowRouteContextDecorator.decorate(routeContext, rule, 
findShadowDataSourceMappings(rule));
+    }
+    
     private Map<String, String> findShadowDataSourceMappings(final ShadowRule 
rule) {
-        Collection<String> relatedShadowTables = 
rule.getRelatedShadowTables(tableAliasNameMappings.values());
+        Collection<String> relatedShadowTables = 
rule.getRelatedShadowTables(tableAliasAndNameMappings.values());
         if (relatedShadowTables.isEmpty() && isMatchDefaultAlgorithm(rule)) {
             return rule.getAllShadowDataSourceMappings();
         }
-        Map<String, String> result = findBySQLComments(rule, 
relatedShadowTables);
+        Map<String, String> result = findBySQLHints(rule, relatedShadowTables);
         return result.isEmpty() ? findByShadowColumn(rule, 
relatedShadowTables) : result;
     }
     
@@ -87,15 +90,15 @@ public abstract class AbstractShadowDMLStatementRouteEngine 
implements ShadowRou
         Optional<ShadowAlgorithm> defaultAlgorithm = 
rule.getDefaultShadowAlgorithm();
         if (defaultAlgorithm.isPresent() && defaultAlgorithm.get() instanceof 
HintShadowAlgorithm<?>) {
             ShadowDetermineCondition determineCondition = new 
ShadowDetermineCondition("", ShadowOperationType.HINT_MATCH);
-            return 
HintShadowAlgorithmDeterminer.isShadow((HintShadowAlgorithm<Comparable<?>>) 
defaultAlgorithm.get(), determineCondition, rule, hintValueContext.isShadow());
+            return 
HintShadowAlgorithmDeterminer.isShadow((HintShadowAlgorithm<Comparable<?>>) 
defaultAlgorithm.get(), determineCondition, rule, isShadow);
         }
         return false;
     }
     
-    private Map<String, String> findBySQLComments(final ShadowRule rule, final 
Collection<String> relatedShadowTables) {
+    private Map<String, String> findBySQLHints(final ShadowRule rule, final 
Collection<String> relatedShadowTables) {
         Map<String, String> result = new LinkedHashMap<>();
         for (String each : relatedShadowTables) {
-            if (isContainsShadowInSQLComments(rule, each, new 
ShadowDetermineCondition(each, operationType))) {
+            if (isContainsShadowInSQLHints(rule, each, new 
ShadowDetermineCondition(each, operationType))) {
                 result.putAll(rule.getRelatedShadowDataSourceMappings(each));
                 return result;
             }
@@ -103,9 +106,9 @@ public abstract class AbstractShadowDMLStatementRouteEngine 
implements ShadowRou
         return result;
     }
     
-    private boolean isContainsShadowInSQLComments(final ShadowRule rule, final 
String tableName, final ShadowDetermineCondition shadowCondition) {
+    private boolean isContainsShadowInSQLHints(final ShadowRule rule, final 
String tableName, final ShadowDetermineCondition shadowCondition) {
         for (HintShadowAlgorithm<Comparable<?>> each : 
rule.getRelatedHintShadowAlgorithms(tableName)) {
-            if (HintShadowAlgorithmDeterminer.isShadow(each, shadowCondition, 
rule, hintValueContext.isShadow())) {
+            if (HintShadowAlgorithmDeterminer.isShadow(each, shadowCondition, 
rule, isShadow)) {
                 return true;
             }
         }
@@ -156,6 +159,6 @@ public abstract class AbstractShadowDMLStatementRouteEngine 
implements ShadowRou
     protected abstract Collection<ShadowColumnCondition> 
getShadowColumnConditions(String shadowColumnName);
     
     protected final String getSingleTableName() {
-        return tableAliasNameMappings.entrySet().iterator().next().getValue();
+        return 
tableAliasAndNameMappings.entrySet().iterator().next().getValue();
     }
 }
diff --git 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRouteEngine.java
 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRouteEngine.java
index 49ef8e7cfbf..9b2fb561749 100644
--- 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRouteEngine.java
+++ 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRouteEngine.java
@@ -75,6 +75,6 @@ public final class ShadowSelectStatementRouteEngine extends 
AbstractShadowDMLSta
     
     private String extractOwnerName(final ColumnSegment columnSegment) {
         Optional<OwnerSegment> owner = columnSegment.getOwner();
-        return owner.isPresent() ? 
getTableAliasNameMappings().get(owner.get().getIdentifier().getValue()) : 
getTableAliasNameMappings().keySet().iterator().next();
+        return owner.isPresent() ? 
getTableAliasAndNameMappings().get(owner.get().getIdentifier().getValue()) : 
getTableAliasAndNameMappings().keySet().iterator().next();
     }
 }
diff --git 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRouteEngine.java
 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRouteEngine.java
index dfaa4700c40..716097a2814 100644
--- 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRouteEngine.java
+++ 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRouteEngine.java
@@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.shadow.condition.ShadowDetermineCondition;
+import 
org.apache.shardingsphere.shadow.route.engine.ShadowRouteContextDecorator;
 import org.apache.shardingsphere.shadow.route.engine.ShadowRouteEngine;
 import 
org.apache.shardingsphere.shadow.route.engine.determiner.HintShadowAlgorithmDeterminer;
 import org.apache.shardingsphere.shadow.rule.ShadowRule;
@@ -40,7 +41,7 @@ public final class ShadowNonDMLStatementRouteEngine 
implements ShadowRouteEngine
     
     @Override
     public void route(final RouteContext routeContext, final ShadowRule rule) {
-        decorateRouteContext(routeContext, rule, 
findShadowDataSourceMappings(rule));
+        ShadowRouteContextDecorator.decorate(routeContext, rule, 
findShadowDataSourceMappings(rule));
     }
     
     private Map<String, String> findShadowDataSourceMappings(final ShadowRule 
rule) {

Reply via email to