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.");
     }