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) {