You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2024/11/03 15:06:55 UTC

(shardingsphere) branch master updated: Add ShadowRouteContextDecorator (#33518)

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 <zh...@apache.org>
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) {