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 <[email protected]>
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.");
}