You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2020/09/27 09:09:34 UTC
[shardingsphere] branch master updated: Reuse one routeContext
instance in decorator (#7621)
This is an automated email from the ASF dual-hosted git repository.
zhangyonglun 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 a239f0e Reuse one routeContext instance in decorator (#7621)
a239f0e is described below
commit a239f0eb8f9c1c14e815908e52b12031852ca17a
Author: Liang Zhang <te...@163.com>
AuthorDate: Sun Sep 27 17:09:15 2020 +0800
Reuse one routeContext instance in decorator (#7621)
* Reuse routeContext in decorator
* Remove dependencies of RouteContext's second constructor
* Change RouteDecorator.decorate to void
* Change UnconfiguredSchemaRouteDecorator.decorate to void
* Remove useless RouteContext's constructor
---
.../engine/ConsensusReplicationRouteDecorator.java | 8 ++---
.../PrimaryReplicaReplicationRouteDecorator.java | 10 +++---
...rimaryReplicaReplicationRouteDecoratorTest.java | 41 +++++++++++-----------
.../shadow/route/engine/ShadowRouteDecorator.java | 22 +++++++-----
.../route/engine/ShadowRouteDecoratorTest.java | 36 +++++++++----------
.../route/engine/ShardingRouteDecorator.java | 6 ++--
.../engine/type/standard/AbstractSQLRouteTest.java | 21 +++++------
.../infra/rewrite/SQLRewriteEntryTest.java | 7 ++--
.../shardingsphere/infra/route/DataNodeRouter.java | 6 ++--
.../infra/route/context/RouteContext.java | 17 ---------
.../infra/route/decorator/RouteDecorator.java | 3 +-
.../UnconfiguredSchemaRouteDecorator.java | 4 +--
.../fixture/decorator/RouteDecoratorFixture.java | 8 ++---
.../decorator/RouteFailureDecoratorFixture.java | 2 +-
14 files changed, 85 insertions(+), 106 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationRouteDecorator.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationRouteDecorator.java
index 336d7f5..bd5961d 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationRouteDecorator.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationRouteDecorator.java
@@ -39,7 +39,7 @@ import java.util.Optional;
public final class ConsensusReplicationRouteDecorator implements RouteDecorator<ConsensusReplicationRule> {
@Override
- public RouteContext decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final ConsensusReplicationRule consensusReplicationRule, final ConfigurationProperties props) {
+ public void decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final ConsensusReplicationRule consensusReplicationRule, final ConfigurationProperties props) {
Map<String, ConsensusReplicationGroup> replicaGroups = new HashMap<>();
String schemaName = metaData.getSchemaName();
SQLStatementContext<?> sqlStatementContext = routeContext.getSqlStatementContext();
@@ -48,8 +48,8 @@ public final class ConsensusReplicationRouteDecorator implements RouteDecorator<
ConsensusReplicationGroup replicaGroup = new ConsensusReplicationGroup(replicaRoutingRule.getPhysicsTable(), replicaRoutingRule.getReplicaGroupId(), replicaRoutingRule.getReplicaPeers(),
replicaRoutingRule.getDataSourceName());
replicaGroups.put(ConsensusReplicationGroup.BLANK_CONSENSUS_REPLICATION_GROUP_KEY, replicaGroup);
- return new RouteContext(
- routeContext, routeContext.getRouteResult(), new ConsensusReplicationRouteStageContext(schemaName, replicaGroups, sqlStatementContext.isReadOnly()), getTypeClass());
+ routeContext.addNextRouteStageContext(getTypeClass(), new ConsensusReplicationRouteStageContext(schemaName, replicaGroups, sqlStatementContext.isReadOnly()));
+ return;
}
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
Collection<RouteMapper> routeMappers = each.getTableMappers();
@@ -62,7 +62,7 @@ public final class ConsensusReplicationRouteDecorator implements RouteDecorator<
routeReplicaGroups(routeMappers, consensusReplicationRule, replicaGroups);
}
}
- return new RouteContext(routeContext, routeContext.getRouteResult(), new ConsensusReplicationRouteStageContext(schemaName, replicaGroups, sqlStatementContext.isReadOnly()), getTypeClass());
+ routeContext.addNextRouteStageContext(getTypeClass(), new ConsensusReplicationRouteStageContext(schemaName, replicaGroups, sqlStatementContext.isReadOnly()));
}
private void routeReplicaGroups(final Collection<RouteMapper> routeMappers, final ConsensusReplicationRule replicaRule, final Map<String, ConsensusReplicationGroup> replicaGroups) {
diff --git a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/main/java/org/apache/shardingsphere/replication/primaryreplica/route/engine/PrimaryReplicaReplicationRouteDecorator.java b/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/main/java/org/apache/shardingsphere/replication/primaryreplica/route/engine/PrimaryReplicaReplicationRouteDecorator.java
index a5c4e75..ab6ddde 100644
--- a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/main/java/org/apache/shardingsphere/replication/primaryreplica/route/engine/PrimaryReplicaReplicationRouteDecorator.java
+++ b/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/main/java/org/apache/shardingsphere/replication/primaryreplica/route/engine/PrimaryReplicaReplicationRouteDecorator.java
@@ -23,7 +23,6 @@ import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.route.context.DefaultRouteStageContext;
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.route.context.RouteMapper;
-import org.apache.shardingsphere.infra.route.context.RouteResult;
import org.apache.shardingsphere.infra.route.context.RouteUnit;
import org.apache.shardingsphere.infra.route.decorator.RouteDecorator;
import org.apache.shardingsphere.replication.primaryreplica.constant.PrimaryReplicaReplicationOrder;
@@ -42,12 +41,12 @@ import java.util.Optional;
public final class PrimaryReplicaReplicationRouteDecorator implements RouteDecorator<PrimaryReplicaReplicationRule> {
@Override
- public RouteContext decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final PrimaryReplicaReplicationRule rule, final ConfigurationProperties props) {
+ public void decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final PrimaryReplicaReplicationRule rule, final ConfigurationProperties props) {
if (routeContext.getRouteResult().getRouteUnits().isEmpty()) {
String dataSourceName = new PrimaryReplicaReplicationDataSourceRouter(rule.getSingleDataSourceRule()).route(routeContext.getSqlStatementContext().getSqlStatement());
- RouteResult routeResult = new RouteResult();
- routeResult.getRouteUnits().add(new RouteUnit(new RouteMapper(DefaultSchema.LOGIC_NAME, dataSourceName), Collections.emptyList()));
- return new RouteContext(routeContext, routeResult, new DefaultRouteStageContext(), getTypeClass());
+ routeContext.getRouteResult().getRouteUnits().add(new RouteUnit(new RouteMapper(DefaultSchema.LOGIC_NAME, dataSourceName), Collections.emptyList()));
+ routeContext.addNextRouteStageContext(getTypeClass(), new DefaultRouteStageContext());
+ return;
}
Collection<RouteUnit> toBeRemoved = new LinkedList<>();
Collection<RouteUnit> toBeAdded = new LinkedList<>();
@@ -62,7 +61,6 @@ public final class PrimaryReplicaReplicationRouteDecorator implements RouteDecor
}
routeContext.getRouteResult().getRouteUnits().removeAll(toBeRemoved);
routeContext.getRouteResult().getRouteUnits().addAll(toBeAdded);
- return routeContext;
}
@Override
diff --git a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/test/java/org/apache/shardingsphere/replication/primaryreplica/route/engine/PrimaryReplicaReplicationRouteDecoratorTest.java b/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/test/java/org/apache/shardingsphere/replication/primaryreplica/route/engine/PrimaryReplicaReplicationRouteDecorat [...]
index 147663b..89fee39 100644
--- a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/test/java/org/apache/shardingsphere/replication/primaryreplica/route/engine/PrimaryReplicaReplicationRouteDecoratorTest.java
+++ b/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/test/java/org/apache/shardingsphere/replication/primaryreplica/route/engine/PrimaryReplicaReplicationRouteDecoratorTest.java
@@ -94,8 +94,8 @@ public final class PrimaryReplicaReplicationRouteDecoratorTest {
@Test
public void assertDecorateToPrimary() {
- RouteContext routeContext = mockSQLRouteContext(insertStatement);
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
+ RouteContext actual = mockSQLRouteContext(insertStatement);
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(NON_PRIMARY_REPLICA_DATASOURCE_NAME));
assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
@@ -103,17 +103,17 @@ public final class PrimaryReplicaReplicationRouteDecoratorTest {
@Test
public void assertDecorateToPrimaryWithoutRouteUnits() {
- RouteContext routeContext = mockSQLRouteContextWithoutRouteUnits(insertStatement);
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
+ RouteContext actual = mockSQLRouteContextWithoutRouteUnits(insertStatement);
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
}
@Test
public void assertDecorateToReplica() {
- RouteContext routeContext = mockSQLRouteContext(selectStatement);
+ RouteContext actual = mockSQLRouteContext(selectStatement);
when(selectStatement.getLock()).thenReturn(Optional.empty());
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(NON_PRIMARY_REPLICA_DATASOURCE_NAME));
assertThat(routedDataSourceNames.next(), is(REPLICA_DATASOURCE));
@@ -121,18 +121,18 @@ public final class PrimaryReplicaReplicationRouteDecoratorTest {
@Test
public void assertDecorateToReplicaWithoutRouteUnits() {
- RouteContext routeContext = mockSQLRouteContextWithoutRouteUnits(selectStatement);
+ RouteContext actual = mockSQLRouteContextWithoutRouteUnits(selectStatement);
when(selectStatement.getLock()).thenReturn(Optional.empty());
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(REPLICA_DATASOURCE));
}
@Test
public void assertLockDecorateToPrimary() {
- RouteContext routeContext = mockSQLRouteContext(selectStatement);
+ RouteContext actual = mockSQLRouteContext(selectStatement);
when(selectStatement.getLock()).thenReturn(Optional.of(mock(LockSegment.class)));
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(NON_PRIMARY_REPLICA_DATASOURCE_NAME));
assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
@@ -140,17 +140,17 @@ public final class PrimaryReplicaReplicationRouteDecoratorTest {
@Test
public void assertLockDecorateToPrimaryWithoutRouteUnits() {
- RouteContext routeContext = mockSQLRouteContextWithoutRouteUnits(selectStatement);
+ RouteContext actual = mockSQLRouteContextWithoutRouteUnits(selectStatement);
when(selectStatement.getLock()).thenReturn(Optional.of(mock(LockSegment.class)));
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
}
@Test
public void assertDecorateToPrimaryWithoutRouteUnitsAndWithParameters() {
- RouteContext routeContext = mockSQLRouteContextWithoutRouteUnitsAndWithParameters(insertStatement);
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
+ RouteContext actual = mockSQLRouteContextWithoutRouteUnitsAndWithParameters(insertStatement);
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
assertThat(actual.getParameters().get(0), is("true"));
@@ -158,15 +158,16 @@ public final class PrimaryReplicaReplicationRouteDecoratorTest {
private RouteContext mockSQLRouteContext(final SQLStatement sqlStatement) {
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
- return new RouteContext(new RouteContext(sqlStatementContext, Collections.emptyList()), mockRouteResult(), null, null);
+ RouteContext result = new RouteContext(sqlStatementContext, Collections.emptyList());
+ mockRouteResult(result.getRouteResult());
+ result.addNextRouteStageContext(null, null);
+ return result;
}
- private RouteResult mockRouteResult() {
- RouteResult result = new RouteResult();
+ private void mockRouteResult(final RouteResult routeResult) {
RouteUnit routeUnit = new RouteUnit(new RouteMapper(DATASOURCE_NAME, DATASOURCE_NAME), Collections.singletonList(new RouteMapper("table", "table_0")));
- result.getRouteUnits().add(routeUnit);
- result.getRouteUnits().add(new RouteUnit(new RouteMapper(NON_PRIMARY_REPLICA_DATASOURCE_NAME, NON_PRIMARY_REPLICA_DATASOURCE_NAME), Collections.emptyList()));
- return result;
+ routeResult.getRouteUnits().add(routeUnit);
+ routeResult.getRouteUnits().add(new RouteUnit(new RouteMapper(NON_PRIMARY_REPLICA_DATASOURCE_NAME, NON_PRIMARY_REPLICA_DATASOURCE_NAME), Collections.emptyList()));
}
private RouteContext mockSQLRouteContextWithoutRouteUnits(final SQLStatement sqlStatement) {
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteDecorator.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteDecorator.java
index 1e29f56..2b8be16 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteDecorator.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteDecorator.java
@@ -45,30 +45,35 @@ import java.util.List;
public final class ShadowRouteDecorator implements RouteDecorator<ShadowRule> {
@Override
- public RouteContext decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final ShadowRule shadowRule, final ConfigurationProperties props) {
- return routeContext.getRouteResult().getRouteUnits().isEmpty() ? getRouteContext(routeContext, shadowRule) : getRouteContextWithRouteResult(routeContext, shadowRule);
+ public void decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final ShadowRule shadowRule, final ConfigurationProperties props) {
+ if (routeContext.getRouteResult().getRouteUnits().isEmpty()) {
+ decorateRouteContext(routeContext, shadowRule);
+ return;
+ }
+ decorateRouteContextWithRouteResult(routeContext, shadowRule);
}
- private RouteContext getRouteContext(final RouteContext routeContext, final ShadowRule shadowRule) {
+ private void decorateRouteContext(final RouteContext routeContext, final ShadowRule shadowRule) {
SQLStatementContext<?> sqlStatementContext = routeContext.getSqlStatementContext();
SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
- RouteResult routeResult = new RouteResult();
+ RouteResult routeResult = routeContext.getRouteResult();
if (!(sqlStatement instanceof DMLStatement)) {
shadowRule.getShadowMappings().forEach((key, value) -> {
routeResult.getRouteUnits().add(new RouteUnit(new RouteMapper(key, key), Collections.emptyList()));
routeResult.getRouteUnits().add(new RouteUnit(new RouteMapper(value, value), Collections.emptyList()));
});
- return new RouteContext(routeContext, routeResult, new DefaultRouteStageContext(), getTypeClass());
+ routeContext.addNextRouteStageContext(getTypeClass(), new DefaultRouteStageContext());
+ return;
}
if (isShadow(routeContext, shadowRule)) {
shadowRule.getShadowMappings().values().forEach(each -> routeResult.getRouteUnits().add(new RouteUnit(new RouteMapper(each, each), Collections.emptyList())));
} else {
shadowRule.getShadowMappings().keySet().forEach(each -> routeResult.getRouteUnits().add(new RouteUnit(new RouteMapper(each, each), Collections.emptyList())));
}
- return new RouteContext(routeContext, routeResult, new DefaultRouteStageContext(), getTypeClass());
+ routeContext.addNextRouteStageContext(getTypeClass(), new DefaultRouteStageContext());
}
- private RouteContext getRouteContextWithRouteResult(final RouteContext routeContext, final ShadowRule shadowRule) {
+ private void decorateRouteContextWithRouteResult(final RouteContext routeContext, final ShadowRule shadowRule) {
SQLStatement sqlStatement = routeContext.getSqlStatementContext().getSqlStatement();
Collection<RouteUnit> toBeAdded = new LinkedList<>();
if (!(sqlStatement instanceof DMLStatement)) {
@@ -77,7 +82,7 @@ public final class ShadowRouteDecorator implements RouteDecorator<ShadowRule> {
toBeAdded.add(new RouteUnit(new RouteMapper(each.getDataSourceMapper().getLogicName(), shadowDataSourceName), each.getTableMappers()));
}
routeContext.getRouteResult().getRouteUnits().addAll(toBeAdded);
- return routeContext;
+ return;
}
Collection<RouteUnit> toBeRemoved = new LinkedList<>();
if (isShadow(routeContext, shadowRule)) {
@@ -89,7 +94,6 @@ public final class ShadowRouteDecorator implements RouteDecorator<ShadowRule> {
}
routeContext.getRouteResult().getRouteUnits().removeAll(toBeRemoved);
routeContext.getRouteResult().getRouteUnits().addAll(toBeAdded);
- return routeContext;
}
private boolean isShadow(final RouteContext routeContext, final ShadowRule shadowRule) {
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteDecoratorTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteDecoratorTest.java
index 452a625..29b3cfb 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteDecoratorTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteDecoratorTest.java
@@ -80,24 +80,24 @@ public final class ShadowRouteDecoratorTest {
@Test
public void assertDecorateToShadowWithOutRouteUnit() {
- RouteContext routeContext = mockSQLRouteContextForShadow();
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
+ RouteContext actual = mockSQLRouteContextForShadow();
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(SHADOW_DATASOURCE));
}
@Test
public void assertDecorateToActualWithOutRouteUnit() {
- RouteContext routeContext = mockSQLRouteContext();
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
+ RouteContext actual = mockSQLRouteContext();
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(ACTUAL_DATASOURCE));
}
@Test
public void assertNonDMLStatementWithOutRouteUnit() {
- RouteContext routeContext = mockNonDMLSQLRouteContext();
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
+ RouteContext actual = mockNonDMLSQLRouteContext();
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
assertThat(actual.getRouteResult().getRouteUnits().size(), is(2));
assertTrue(actual.getRouteResult().getActualDataSourceNames().contains(SHADOW_DATASOURCE));
assertTrue(actual.getRouteResult().getActualDataSourceNames().contains(ACTUAL_DATASOURCE));
@@ -105,27 +105,27 @@ public final class ShadowRouteDecoratorTest {
@Test
public void assertDecorateToShadowWithRouteUnit() {
- RouteContext routeContext = mockSQLRouteContextForShadow();
- routeContext.getRouteResult().getRouteUnits().add(mockRouteUnit());
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
+ RouteContext actual = mockSQLRouteContextForShadow();
+ actual.getRouteResult().getRouteUnits().add(mockRouteUnit());
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
assertThat(actual.getRouteResult().getRouteUnits().size(), is(1));
assertTrue(actual.getRouteResult().getActualDataSourceNames().contains(SHADOW_DATASOURCE));
}
@Test
public void assertDecorateToActualWithRouteUnit() {
- RouteContext routeContext = mockSQLRouteContext();
- routeContext.getRouteResult().getRouteUnits().add(mockRouteUnit());
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
+ RouteContext actual = mockSQLRouteContext();
+ actual.getRouteResult().getRouteUnits().add(mockRouteUnit());
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(ACTUAL_DATASOURCE));
}
@Test
public void assertNonDMLStatementWithRouteUnit() {
- RouteContext routeContext = mockNonDMLSQLRouteContext();
- routeContext.getRouteResult().getRouteUnits().add(mockRouteUnit());
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
+ RouteContext actual = mockNonDMLSQLRouteContext();
+ actual.getRouteResult().getRouteUnits().add(mockRouteUnit());
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
assertThat(actual.getRouteResult().getRouteUnits().size(), is(2));
assertTrue(actual.getRouteResult().getActualDataSourceNames().contains(SHADOW_DATASOURCE));
assertTrue(actual.getRouteResult().getActualDataSourceNames().contains(ACTUAL_DATASOURCE));
@@ -133,9 +133,9 @@ public final class ShadowRouteDecoratorTest {
@Test
public void assertTableMapperWithRouteUnit() {
- RouteContext routeContext = mockSQLRouteContextForShadow();
- routeContext.getRouteResult().getRouteUnits().add(mockRouteUnit());
- RouteContext actual = routeDecorator.decorate(routeContext, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
+ RouteContext actual = mockSQLRouteContextForShadow();
+ actual.getRouteResult().getRouteUnits().add(mockRouteUnit());
+ routeDecorator.decorate(actual, mock(ShardingSphereMetaData.class), shadowRule, new ConfigurationProperties(new Properties()));
assertThat(actual.getRouteResult().getRouteUnits().size(), is(1));
assertTrue(actual.getRouteResult().getActualDataSourceNames().contains(SHADOW_DATASOURCE));
Collection<RouteMapper> tableMappers = actual.getRouteResult().getRouteUnits().iterator().next().getTableMappers();
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingRouteDecorator.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingRouteDecorator.java
index 721a266..52d6eb7 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingRouteDecorator.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingRouteDecorator.java
@@ -59,7 +59,7 @@ public final class ShardingRouteDecorator implements RouteDecorator<ShardingRule
@SuppressWarnings({"rawtypes", "unchecked"})
@Override
- public RouteContext decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final ShardingRule shardingRule, final ConfigurationProperties props) {
+ public void decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final ShardingRule shardingRule, final ConfigurationProperties props) {
SQLStatementContext<?> sqlStatementContext = routeContext.getSqlStatementContext();
List<Object> parameters = routeContext.getParameters();
SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
@@ -74,7 +74,9 @@ public final class ShardingRouteDecorator implements RouteDecorator<ShardingRule
ShardingRouteEngine shardingRouteEngine = ShardingRouteEngineFactory.newInstance(shardingRule, metaData, sqlStatementContext, shardingConditions, props);
RouteResult routeResult = shardingRouteEngine.route(shardingRule);
shardingStatementValidator.ifPresent(validator -> validator.postValidate(sqlStatement, routeResult));
- return new RouteContext(routeContext, routeResult, new DefaultRouteStageContext(), getTypeClass());
+ routeContext.getRouteResult().getOriginalDataNodes().addAll(routeResult.getOriginalDataNodes());
+ routeContext.getRouteResult().getRouteUnits().addAll(routeResult.getRouteUnits());
+ routeContext.addNextRouteStageContext(getTypeClass(), new DefaultRouteStageContext());
}
private ShardingConditions getShardingConditions(final List<Object> parameters,
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
index 2241662..1f5603e 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
@@ -17,14 +17,6 @@
package org.apache.shardingsphere.sharding.route.engine.type.standard;
-import org.apache.shardingsphere.sharding.rule.ShardingRule;
-import org.apache.shardingsphere.sharding.route.engine.ShardingRouteDecorator;
-import org.apache.shardingsphere.sharding.route.fixture.AbstractRoutingEngineTest;
-import org.apache.shardingsphere.sql.parser.engine.StandardSQLParserEngine;
-import org.apache.shardingsphere.sql.parser.engine.SQLParserEngineFactory;
-import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
-import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
-import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.infra.config.DatabaseAccessConfiguration;
import org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.infra.database.type.DatabaseTypes;
@@ -33,6 +25,13 @@ import org.apache.shardingsphere.infra.metadata.datasource.DataSourceMetaDatas;
import org.apache.shardingsphere.infra.metadata.schema.RuleSchemaMetaData;
import org.apache.shardingsphere.infra.route.DataNodeRouter;
import org.apache.shardingsphere.infra.route.context.RouteContext;
+import org.apache.shardingsphere.sharding.route.fixture.AbstractRoutingEngineTest;
+import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
+import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
+import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
+import org.apache.shardingsphere.sql.parser.engine.SQLParserEngineFactory;
+import org.apache.shardingsphere.sql.parser.engine.StandardSQLParserEngine;
import java.sql.Types;
import java.util.Arrays;
@@ -53,9 +52,7 @@ public abstract class AbstractSQLRouteTest extends AbstractRoutingEngineTest {
ShardingSphereMetaData metaData = new ShardingSphereMetaData(buildDataSourceMetas(), buildRuleSchemaMetaData(), "sharding_db");
ConfigurationProperties props = new ConfigurationProperties(new Properties());
StandardSQLParserEngine standardSqlParserEngine = SQLParserEngineFactory.getSQLParserEngine("MySQL");
- RouteContext routeContext = new DataNodeRouter(metaData, props, Collections.singletonList(shardingRule)).route(standardSqlParserEngine.parse(sql, false), sql, parameters);
- ShardingRouteDecorator shardingRouteDecorator = new ShardingRouteDecorator();
- RouteContext result = shardingRouteDecorator.decorate(routeContext, metaData, shardingRule, props);
+ RouteContext result = new DataNodeRouter(metaData, props, Collections.singletonList(shardingRule)).route(standardSqlParserEngine.parse(sql, false), sql, parameters);
assertThat(result.getRouteResult().getRouteUnits().size(), is(1));
return result;
}
@@ -83,7 +80,7 @@ public abstract class AbstractSQLRouteTest extends AbstractRoutingEngineTest {
new ColumnMetaData("c_date", Types.TIMESTAMP, "timestamp", false, false, false)), Collections.emptySet()));
tableMetaDataMap.put("t_other", new TableMetaData(Collections.singletonList(new ColumnMetaData("order_id", Types.INTEGER, "int", true, false, false)), Collections.emptySet()));
Map<String, Collection<String>> unconfiguredSchemaMetaDataMap = new HashMap<>(1, 1);
- unconfiguredSchemaMetaDataMap.put("ds_0", Arrays.asList("t_category"));
+ unconfiguredSchemaMetaDataMap.put("ds_0", Collections.singletonList("t_category"));
return new RuleSchemaMetaData(new SchemaMetaData(tableMetaDataMap), unconfiguredSchemaMetaDataMap);
}
}
diff --git a/shardingsphere-infra/shardingsphere-infra-rewrite/shardingsphere-infra-rewrite-engine/src/test/java/org/apache/shardingsphere/infra/rewrite/SQLRewriteEntryTest.java b/shardingsphere-infra/shardingsphere-infra-rewrite/shardingsphere-infra-rewrite-engine/src/test/java/org/apache/shardingsphere/infra/rewrite/SQLRewriteEntryTest.java
index 0b2dcc7..16907f4 100644
--- a/shardingsphere-infra/shardingsphere-infra-rewrite/shardingsphere-infra-rewrite-engine/src/test/java/org/apache/shardingsphere/infra/rewrite/SQLRewriteEntryTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-rewrite/shardingsphere-infra-rewrite-engine/src/test/java/org/apache/shardingsphere/infra/rewrite/SQLRewriteEntryTest.java
@@ -21,7 +21,6 @@ import org.apache.shardingsphere.infra.config.properties.ConfigurationProperties
import org.apache.shardingsphere.infra.rewrite.engine.result.GenericSQLRewriteResult;
import org.apache.shardingsphere.infra.rewrite.engine.result.RouteSQLRewriteResult;
import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.infra.route.context.RouteResult;
import org.apache.shardingsphere.infra.route.context.RouteUnit;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
@@ -58,9 +57,9 @@ public final class SQLRewriteEntryTest {
@Test
public void assertRewriteForRouteSQLRewriteResult() {
SQLRewriteEntry sqlRewriteEntry = new SQLRewriteEntry(metaData, props, Collections.emptyList());
- RouteResult routeResult = new RouteResult();
- routeResult.getRouteUnits().addAll(Arrays.asList(mock(RouteUnit.class), mock(RouteUnit.class)));
- RouteContext routeContext = new RouteContext(new RouteContext(mock(SQLStatementContext.class), Collections.singletonList(1)), routeResult, null, null);
+ RouteContext routeContext = new RouteContext(mock(SQLStatementContext.class), Collections.singletonList(1));
+ routeContext.getRouteResult().getRouteUnits().addAll(Arrays.asList(mock(RouteUnit.class), mock(RouteUnit.class)));
+ routeContext.addNextRouteStageContext(null, null);
RouteSQLRewriteResult sqlRewriteResult = (RouteSQLRewriteResult) sqlRewriteEntry.rewrite("SELECT ?", Collections.singletonList(1), routeContext);
assertThat(sqlRewriteResult.getSqlRewriteUnits().size(), is(2));
}
diff --git a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/DataNodeRouter.java b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/DataNodeRouter.java
index 7fb3901..65ac303 100644
--- a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/DataNodeRouter.java
+++ b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/DataNodeRouter.java
@@ -87,9 +87,9 @@ public final class DataNodeRouter {
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(metaData.getRuleSchemaMetaData().getSchemaMetaData(), parameters, sqlStatement);
RouteContext result = new RouteContext(sqlStatementContext, parameters);
for (Entry<ShardingSphereRule, RouteDecorator> entry : decorators.entrySet()) {
- result = entry.getValue().decorate(result, metaData, entry.getKey(), props);
+ entry.getValue().decorate(result, metaData, entry.getKey(), props);
}
- return new UnconfiguredSchemaRouteDecorator().decorate(result, metaData);
+ new UnconfiguredSchemaRouteDecorator().decorate(result, metaData);
+ return result;
}
-
}
diff --git a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/context/RouteContext.java b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/context/RouteContext.java
index d30e72b..d62c93f 100644
--- a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/context/RouteContext.java
+++ b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/context/RouteContext.java
@@ -45,23 +45,6 @@ public final class RouteContext {
routeResult = new RouteResult();
}
- public RouteContext(final RouteContext parent, final RouteResult routeResult, final RouteStageContext nextRouteStageContext, final Class<? extends ShardingSphereRule> ruleType) {
- sqlStatementContext = parent.sqlStatementContext;
- parameters = parent.parameters;
- this.routeResult = routeResult;
- addBeforeRouteStageContexts(parent.routeStageContexts);
- addNextRouteStageContext(ruleType, nextRouteStageContext);
- }
-
- /**
- * Add before route stage context.
- *
- * @param beforeRouteStageContexts before route stage contexts
- */
- public void addBeforeRouteStageContexts(final Map<Class<? extends ShardingSphereRule>, RouteStageContext> beforeRouteStageContexts) {
- routeStageContexts.putAll(beforeRouteStageContexts);
- }
-
/**
* Add next route stage context.
*
diff --git a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/decorator/RouteDecorator.java b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/decorator/RouteDecorator.java
index 0c7e6dc..ae5efbf 100644
--- a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/decorator/RouteDecorator.java
+++ b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/decorator/RouteDecorator.java
@@ -37,7 +37,6 @@ public interface RouteDecorator<T extends ShardingSphereRule> extends OrderedSPI
* @param metaData meta data of ShardingSphere
* @param rule rule
* @param props configuration properties
- * @return decorated route context
*/
- RouteContext decorate(RouteContext routeContext, ShardingSphereMetaData metaData, T rule, ConfigurationProperties props);
+ void decorate(RouteContext routeContext, ShardingSphereMetaData metaData, T rule, ConfigurationProperties props);
}
diff --git a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/decorator/UnconfiguredSchemaRouteDecorator.java b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/decorator/UnconfiguredSchemaRouteDecorator.java
index bf3d8a7..587fd63 100644
--- a/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/decorator/UnconfiguredSchemaRouteDecorator.java
+++ b/shardingsphere-infra/shardingsphere-infra-route/src/main/java/org/apache/shardingsphere/infra/route/decorator/UnconfiguredSchemaRouteDecorator.java
@@ -36,15 +36,13 @@ public final class UnconfiguredSchemaRouteDecorator {
*
* @param routeContext route context
* @param metaData meta data of ShardingSphere
- * @return decorated route context
*/
- public RouteContext decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData) {
+ public void decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData) {
if (isNeedUnconfiguredSchema(routeContext.getSqlStatementContext().getSqlStatement())) {
for (String each : metaData.getRuleSchemaMetaData().getUnconfiguredSchemaMetaDataMap().keySet()) {
routeContext.getRouteResult().getRouteUnits().add(new RouteUnit(new RouteMapper(each, each), Collections.emptyList()));
}
}
- return routeContext;
}
// TODO use dynamic config to judge UnconfiguredSchema
diff --git a/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/fixture/decorator/RouteDecoratorFixture.java b/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/fixture/decorator/RouteDecoratorFixture.java
index d250d7a..7f82c8e 100644
--- a/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/fixture/decorator/RouteDecoratorFixture.java
+++ b/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/fixture/decorator/RouteDecoratorFixture.java
@@ -22,7 +22,6 @@ import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.route.context.DefaultRouteStageContext;
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.route.context.RouteMapper;
-import org.apache.shardingsphere.infra.route.context.RouteResult;
import org.apache.shardingsphere.infra.route.context.RouteUnit;
import org.apache.shardingsphere.infra.route.decorator.RouteDecorator;
import org.apache.shardingsphere.infra.route.fixture.rule.RouteRuleFixture;
@@ -32,10 +31,9 @@ import java.util.Collections;
public final class RouteDecoratorFixture implements RouteDecorator<RouteRuleFixture> {
@Override
- public RouteContext decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final RouteRuleFixture rule, final ConfigurationProperties props) {
- RouteResult routeResult = new RouteResult();
- routeResult.getRouteUnits().add(new RouteUnit(new RouteMapper("ds", "ds_0"), Collections.emptyList()));
- return new RouteContext(routeContext, routeResult, new DefaultRouteStageContext(), getTypeClass());
+ public void decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final RouteRuleFixture rule, final ConfigurationProperties props) {
+ routeContext.getRouteResult().getRouteUnits().add(new RouteUnit(new RouteMapper("ds", "ds_0"), Collections.emptyList()));
+ routeContext.addNextRouteStageContext(getTypeClass(), new DefaultRouteStageContext());
}
@Override
diff --git a/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/fixture/decorator/RouteFailureDecoratorFixture.java b/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/fixture/decorator/RouteFailureDecoratorFixture.java
index 8ec1559..0938a2e 100644
--- a/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/fixture/decorator/RouteFailureDecoratorFixture.java
+++ b/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/fixture/decorator/RouteFailureDecoratorFixture.java
@@ -26,7 +26,7 @@ import org.apache.shardingsphere.infra.route.fixture.rule.RouteFailureRuleFixtur
public final class RouteFailureDecoratorFixture implements RouteDecorator<RouteFailureRuleFixture> {
@Override
- public RouteContext decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final RouteFailureRuleFixture rule, final ConfigurationProperties props) {
+ public void decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final RouteFailureRuleFixture rule, final ConfigurationProperties props) {
throw new UnsupportedOperationException("Route failure.");
}