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