You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/07/13 14:19:27 UTC

[shardingsphere] branch master updated: Code optimization for shardingsphere-shadow project. (#11282) (#11285)

This is an automated email from the ASF dual-hosted git repository.

panjuan 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 6618aa1  Code optimization for shardingsphere-shadow project. (#11282) (#11285)
6618aa1 is described below

commit 6618aa1459c53a676f07890989ae9a636b54a1e8
Author: gin <ja...@163.com>
AuthorDate: Tue Jul 13 22:18:55 2021 +0800

    Code optimization for shardingsphere-shadow project. (#11282) (#11285)
    
    * Add junit test method for ShadowConditionEngine
    
    * Optimize the code under the rewrite package
    
    * Fix code format
    
    * Optimize the readability of ShadowSQLRouter.
    
    * Streamline the code in ShadowSQLRewriteContextDecorator.
    
    * Streamline the code in class ShadowSQLRewriteContextDecorator.
---
 .../context/ShadowSQLRewriteContextDecorator.java  | 23 ++++++++--
 .../rewrite/parameter/ShadowParameterRewriter.java |  4 ++
 .../impl/ShadowInsertValueParameterRewriter.java   | 42 ++++++++++-------
 .../generator/BaseShadowSQLTokenGenerator.java     |  4 ++
 .../impl/RemoveShadowColumnTokenGenerator.java     | 34 +++++++-------
 .../impl/ShadowInsertValuesTokenGenerator.java     |  7 ++-
 .../shadow/route/ShadowSQLRouter.java              | 52 ++++++++++++++--------
 .../condition/ShadowConditionEngineTest.java       |  9 ++++
 8 files changed, 120 insertions(+), 55 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/context/ShadowSQLRewriteContextDecorator.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/context/ShadowSQLRewriteContextDecorator.java
index 4ea7f3f..cd5da23 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/context/ShadowSQLRewriteContextDecorator.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/context/ShadowSQLRewriteContextDecorator.java
@@ -17,9 +17,11 @@
 
 package org.apache.shardingsphere.shadow.rewrite.context;
 
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import org.apache.shardingsphere.infra.rewrite.context.SQLRewriteContext;
 import org.apache.shardingsphere.infra.rewrite.context.SQLRewriteContextDecorator;
+import org.apache.shardingsphere.infra.rewrite.parameter.builder.ParameterBuilder;
 import org.apache.shardingsphere.infra.rewrite.parameter.rewriter.ParameterRewriter;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.shadow.constant.ShadowOrder;
@@ -27,20 +29,33 @@ import org.apache.shardingsphere.shadow.rewrite.parameter.ShadowParameterRewrite
 import org.apache.shardingsphere.shadow.rewrite.token.ShadowTokenGenerateBuilder;
 import org.apache.shardingsphere.shadow.rule.ShadowRule;
 
+import java.util.List;
+
 /**
  * SQL rewrite context decorator for shadow.
  */
 public final class ShadowSQLRewriteContextDecorator implements SQLRewriteContextDecorator<ShadowRule> {
     
-    @SuppressWarnings("unchecked")
     @Override
     public void decorate(final ShadowRule shadowRule, final ConfigurationProperties props, final SQLRewriteContext sqlRewriteContext, final RouteContext routeContext) {
+        doShadowDecorate(shadowRule, sqlRewriteContext);
+    }
+    
+    private void doShadowDecorate(final ShadowRule shadowRule, final SQLRewriteContext sqlRewriteContext) {
+        doParameterRewriter(shadowRule, sqlRewriteContext);
+        sqlRewriteContext.addSQLTokenGenerators(new ShadowTokenGenerateBuilder(shadowRule).getSQLTokenGenerators());
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void doParameterRewriter(final ShadowRule shadowRule, final SQLRewriteContext sqlRewriteContext) {
+        List<Object> parameters = sqlRewriteContext.getParameters();
+        SQLStatementContext<?> sqlStatementContext = sqlRewriteContext.getSqlStatementContext();
         for (ParameterRewriter each : new ShadowParameterRewriterBuilder(shadowRule).getParameterRewriters(sqlRewriteContext.getSchema())) {
-            if (!sqlRewriteContext.getParameters().isEmpty() && each.isNeedRewrite(sqlRewriteContext.getSqlStatementContext())) {
-                each.rewrite(sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getSqlStatementContext(), sqlRewriteContext.getParameters());
+            if (!parameters.isEmpty() && each.isNeedRewrite(sqlStatementContext)) {
+                ParameterBuilder parameterBuilder = sqlRewriteContext.getParameterBuilder();
+                each.rewrite(parameterBuilder, sqlStatementContext, parameters);
             }
         }
-        sqlRewriteContext.addSQLTokenGenerators(new ShadowTokenGenerateBuilder(shadowRule).getSQLTokenGenerators());
     }
     
     @Override
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/parameter/ShadowParameterRewriter.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/parameter/ShadowParameterRewriter.java
index 17f4d1a..29e2ddd 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/parameter/ShadowParameterRewriter.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/parameter/ShadowParameterRewriter.java
@@ -41,4 +41,8 @@ public abstract class ShadowParameterRewriter<T extends SQLStatementContext> imp
     }
     
     protected abstract boolean isNeedRewriteForShadow(SQLStatementContext sqlStatementContext);
+    
+    protected String getShadowColumn() {
+        return shadowRule.getColumn();
+    }
 }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/parameter/impl/ShadowInsertValueParameterRewriter.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/parameter/impl/ShadowInsertValueParameterRewriter.java
index 1caa684..1ae70c6 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/parameter/impl/ShadowInsertValueParameterRewriter.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/parameter/impl/ShadowInsertValueParameterRewriter.java
@@ -19,12 +19,11 @@ package org.apache.shardingsphere.shadow.rewrite.parameter.impl;
 
 import org.apache.shardingsphere.infra.rewrite.parameter.builder.ParameterBuilder;
 import org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.GroupedParameterBuilder;
-import org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.StandardParameterBuilder;
 import org.apache.shardingsphere.shadow.rewrite.parameter.ShadowParameterRewriter;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
 
-import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 
 /**
@@ -34,31 +33,40 @@ public final class ShadowInsertValueParameterRewriter extends ShadowParameterRew
     
     @Override
     protected boolean isNeedRewriteForShadow(final SQLStatementContext sqlStatementContext) {
-        return sqlStatementContext instanceof InsertStatementContext && ((InsertStatementContext) sqlStatementContext).getInsertColumnNames().contains(getShadowRule().getColumn());
+        if (sqlStatementContext instanceof InsertStatementContext) {
+            InsertStatementContext insertStatementContext = (InsertStatementContext) sqlStatementContext;
+            return insertStatementContext.getInsertColumnNames().contains(getShadowColumn());
+        }
+        return false;
     }
     
     @Override
     public void rewrite(final ParameterBuilder parameterBuilder, final InsertStatementContext insertStatementContext, final List<Object> parameters) {
-        String columnName = getShadowRule().getColumn();
-        int columnIndex = getColumnIndex((GroupedParameterBuilder) parameterBuilder, insertStatementContext, columnName);
+        doShadowRewrite(parameterBuilder, insertStatementContext);
+    }
+
+    private void doShadowRewrite(final ParameterBuilder parameterBuilder, final InsertStatementContext insertStatementContext) {
+        GroupedParameterBuilder groupedParameterBuilder;
+        if (parameterBuilder instanceof GroupedParameterBuilder) {
+            groupedParameterBuilder = (GroupedParameterBuilder) parameterBuilder;
+            int columnIndex = getShadowColumnIndex(groupedParameterBuilder, insertStatementContext);
+            addRemovedParametersForShadow(groupedParameterBuilder, insertStatementContext, columnIndex);
+        }
+    }
+
+    private void addRemovedParametersForShadow(final GroupedParameterBuilder groupedParameterBuilder, final InsertStatementContext insertStatementContext, final int columnIndex) {
         int count = 0;
         for (List<Object> each : insertStatementContext.getGroupedParameters()) {
             if (!each.isEmpty()) {
-                StandardParameterBuilder standardParameterBuilder = ((GroupedParameterBuilder) parameterBuilder).getParameterBuilders().get(count);
-                standardParameterBuilder.addRemovedParameters(columnIndex);
+                groupedParameterBuilder.getParameterBuilders().get(count).addRemovedParameters(columnIndex);
             }
             count++;
         }
     }
-    
-    private int getColumnIndex(final GroupedParameterBuilder parameterBuilder, final InsertStatementContext insertStatementContext, final String shadowColumnName) {
-        List<String> columnNames;
-        if (parameterBuilder.getDerivedColumnName().isPresent()) {
-            columnNames = new ArrayList<>(insertStatementContext.getColumnNames());
-            columnNames.remove(parameterBuilder.getDerivedColumnName().get());
-        } else {
-            columnNames = insertStatementContext.getColumnNames();
-        }
-        return columnNames.indexOf(shadowColumnName);
+
+    private int getShadowColumnIndex(final GroupedParameterBuilder groupedParameterBuilder, final InsertStatementContext insertStatementContext) {
+        List<String> columnNames = new LinkedList<>(insertStatementContext.getColumnNames());
+        groupedParameterBuilder.getDerivedColumnName().ifPresent(columnNames::remove);
+        return columnNames.indexOf(getShadowColumn());
     }
 }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/BaseShadowSQLTokenGenerator.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/BaseShadowSQLTokenGenerator.java
index f9feb7d..677da63 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/BaseShadowSQLTokenGenerator.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/BaseShadowSQLTokenGenerator.java
@@ -39,4 +39,8 @@ public abstract class BaseShadowSQLTokenGenerator implements SQLTokenGenerator,
     }
     
     protected abstract boolean isGenerateSQLTokenForShadow(SQLStatementContext sqlStatementContext);
+    
+    protected String getShadowColumn() {
+        return shadowRule.getColumn();
+    }
 }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/RemoveShadowColumnTokenGenerator.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/RemoveShadowColumnTokenGenerator.java
index dddd7c2..32c8e4e 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/RemoveShadowColumnTokenGenerator.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/RemoveShadowColumnTokenGenerator.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.shadow.rewrite.token.generator.impl;
 
-import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.infra.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
 import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic.RemoveToken;
 import org.apache.shardingsphere.shadow.rewrite.token.generator.BaseShadowSQLTokenGenerator;
@@ -38,28 +37,33 @@ public final class RemoveShadowColumnTokenGenerator extends BaseShadowSQLTokenGe
     
     @Override
     protected boolean isGenerateSQLTokenForShadow(final SQLStatementContext sqlStatementContext) {
-        if (!(sqlStatementContext instanceof InsertStatementContext)) {
-            return false;
+        InsertStatementContext insertStatementContext;
+        if (sqlStatementContext instanceof InsertStatementContext) {
+            insertStatementContext = (InsertStatementContext) sqlStatementContext;
+            Optional<InsertColumnsSegment> insertColumnsSegment = insertStatementContext.getSqlStatement().getInsertColumns();
+            return insertColumnsSegment.isPresent() && !insertColumnsSegment.get().getColumns().isEmpty();
         }
-        Optional<InsertColumnsSegment> insertColumnsSegment = (((InsertStatementContext) sqlStatementContext).getSqlStatement()).getInsertColumns();
-        return insertColumnsSegment.isPresent() && !insertColumnsSegment.get().getColumns().isEmpty();
+        return false;
     }
     
     @Override
     public Collection<RemoveToken> generateSQLTokens(final InsertStatementContext insertStatementContext) {
         Optional<InsertColumnsSegment> sqlSegment = insertStatementContext.getSqlStatement().getInsertColumns();
-        Preconditions.checkState(sqlSegment.isPresent());
         Collection<RemoveToken> result = new LinkedList<>();
-        List<ColumnSegment> columns = (LinkedList<ColumnSegment>) sqlSegment.get().getColumns();
-        for (int i = 0; i < columns.size(); i++) {
-            if (getShadowRule().getColumn().equals(columns.get(i).getIdentifier().getValue())) {
-                if (i == 0) {
-                    result.add(new RemoveToken(columns.get(0).getStartIndex(), columns.get(i + 1).getStartIndex() - 1));
-                } else {
-                    result.add(new RemoveToken(columns.get(i - 1).getStopIndex() + 1, columns.get(i).getStopIndex()));
-                }
+        sqlSegment.ifPresent(insertColumnsSegment -> generateRemoveTokenForShadow(insertColumnsSegment, result));
+        return result;
+    }
+    
+    private void generateRemoveTokenForShadow(final InsertColumnsSegment insertColumnsSegment, final Collection<RemoveToken> removeTokens) {
+        List<ColumnSegment> columnSegments = (LinkedList<ColumnSegment>) insertColumnsSegment.getColumns();
+        String shadowColumn = getShadowColumn();
+        for (int i = 0; i < columnSegments.size(); i++) {
+            ColumnSegment columnSegment = columnSegments.get(i);
+            if (shadowColumn.equals(columnSegment.getIdentifier().getValue())) {
+                RemoveToken removeToken = i == 0 ? new RemoveToken(columnSegments.get(i).getStartIndex(), columnSegments.get(i + 1).getStartIndex() - 1)
+                        : new RemoveToken(columnSegments.get(i - 1).getStopIndex() + 1, columnSegments.get(i).getStopIndex());
+                removeTokens.add(removeToken);
             }
         }
-        return result;
     }
 }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/ShadowInsertValuesTokenGenerator.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/ShadowInsertValuesTokenGenerator.java
index fe39426..cf3057d 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/ShadowInsertValuesTokenGenerator.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/ShadowInsertValuesTokenGenerator.java
@@ -45,7 +45,12 @@ public final class ShadowInsertValuesTokenGenerator extends BaseShadowSQLTokenGe
     
     @Override
     protected boolean isGenerateSQLTokenForShadow(final SQLStatementContext sqlStatementContext) {
-        return sqlStatementContext instanceof InsertStatementContext && ((InsertStatementContext) sqlStatementContext).getInsertColumnNames().contains(getShadowRule().getColumn());
+        InsertStatementContext insertStatementContext;
+        if (sqlStatementContext instanceof InsertStatementContext) {
+            insertStatementContext = (InsertStatementContext) sqlStatementContext;
+            return insertStatementContext.getInsertColumnNames().contains(getShadowColumn());
+        }
+        return false;
     }
     
     @Override
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/ShadowSQLRouter.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/ShadowSQLRouter.java
index ee851bb..c1951aa 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/ShadowSQLRouter.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/ShadowSQLRouter.java
@@ -30,12 +30,14 @@ import org.apache.shardingsphere.shadow.route.judge.ShadowDataSourceJudgeEngine;
 import org.apache.shardingsphere.shadow.route.judge.impl.PreparedShadowDataSourceJudgeEngine;
 import org.apache.shardingsphere.shadow.route.judge.impl.SimpleShadowDataSourceJudgeEngine;
 import org.apache.shardingsphere.shadow.rule.ShadowRule;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DMLStatement;
 
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Shadow SQL router.
@@ -44,22 +46,42 @@ public final class ShadowSQLRouter implements SQLRouter<ShadowRule> {
     
     @Override
     public RouteContext createRouteContext(final LogicSQL logicSQL, final ShardingSphereMetaData metaData, final ShadowRule rule, final ConfigurationProperties props) {
-        RouteContext result = new RouteContext();
-        if (!(logicSQL.getSqlStatementContext().getSqlStatement() instanceof DMLStatement)) {
-            rule.getShadowMappings().forEach((key, value) -> {
-                result.getRouteUnits().add(new RouteUnit(new RouteMapper(key, key), Collections.emptyList()));
-                result.getRouteUnits().add(new RouteUnit(new RouteMapper(value, value), Collections.emptyList()));
-            });
-            return result;
-        }
-        if (isShadow(logicSQL.getSqlStatementContext(), logicSQL.getParameters(), rule)) {
-            rule.getShadowMappings().values().forEach(each -> result.getRouteUnits().add(new RouteUnit(new RouteMapper(each, each), Collections.emptyList())));
+        SQLStatement sqlStatement = logicSQL.getSqlStatementContext().getSqlStatement();
+        return sqlStatement instanceof DMLStatement ? createRouteContextInDML(logicSQL, rule) : createRouteContextWithoutDML(rule);
+    }
+    
+    private RouteContext createRouteContextWithoutDML(final ShadowRule rule) {
+        final RouteContext result = new RouteContext();
+        rule.getShadowMappings().forEach((key, value) -> {
+            result.getRouteUnits().add(createRouteUnit(key, key));
+            result.getRouteUnits().add(createRouteUnit(value, value));
+        });
+        return result;
+    }
+    
+    private RouteContext createRouteContextInDML(final LogicSQL logicSQL, final ShadowRule rule) {
+        final RouteContext result = new RouteContext();
+        Map<String, String> shadowMappings = rule.getShadowMappings();
+        if (isShadow(logicSQL, rule)) {
+            shadowMappings.values().forEach(each -> result.getRouteUnits().add(createRouteUnit(each, each)));
         } else {
-            rule.getShadowMappings().keySet().forEach(each -> result.getRouteUnits().add(new RouteUnit(new RouteMapper(each, each), Collections.emptyList())));
+            shadowMappings.keySet().forEach(each -> result.getRouteUnits().add(createRouteUnit(each, each)));
         }
         return result;
     }
     
+    private boolean isShadow(final LogicSQL logicSQL, final ShadowRule rule) {
+        final SQLStatementContext<?> sqlStatementContext = logicSQL.getSqlStatementContext();
+        final List<Object> parameters = logicSQL.getParameters();
+        ShadowDataSourceJudgeEngine shadowDataSourceRouter = parameters.isEmpty()
+                ? new SimpleShadowDataSourceJudgeEngine(rule, sqlStatementContext) : new PreparedShadowDataSourceJudgeEngine(rule, sqlStatementContext, parameters);
+        return shadowDataSourceRouter.isShadow();
+    }
+    
+    private RouteUnit createRouteUnit(final String logicName, final String actualName) {
+        return new RouteUnit(new RouteMapper(logicName, actualName), Collections.emptyList());
+    }
+    
     @Override
     public void decorateRouteContext(final RouteContext routeContext,
                                      final LogicSQL logicSQL, final ShardingSphereMetaData metaData, final ShadowRule rule, final ConfigurationProperties props) {
@@ -73,7 +95,7 @@ public final class ShadowSQLRouter implements SQLRouter<ShadowRule> {
             return;
         }
         Collection<RouteUnit> toBeRemoved = new LinkedList<>();
-        if (isShadow(logicSQL.getSqlStatementContext(), logicSQL.getParameters(), rule)) {
+        if (isShadow(logicSQL, rule)) {
             for (RouteUnit each : routeContext.getRouteUnits()) {
                 toBeRemoved.add(each);
                 String shadowDataSourceName = rule.getShadowMappings().get(each.getDataSourceMapper().getActualName());
@@ -84,12 +106,6 @@ public final class ShadowSQLRouter implements SQLRouter<ShadowRule> {
         routeContext.getRouteUnits().addAll(toBeAdded);
     }
     
-    private boolean isShadow(final SQLStatementContext<?> sqlStatementContext, final List<Object> parameters, final ShadowRule rule) {
-        ShadowDataSourceJudgeEngine shadowDataSourceRouter = parameters.isEmpty()
-                ? new SimpleShadowDataSourceJudgeEngine(rule, sqlStatementContext) : new PreparedShadowDataSourceJudgeEngine(rule, sqlStatementContext, parameters);
-        return shadowDataSourceRouter.isShadow();
-    }
-    
     @Override
     public int getOrder() {
         return ShadowOrder.ORDER;
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/condition/ShadowConditionEngineTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/condition/ShadowConditionEngineTest.java
index 5c62764..f83308a 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/condition/ShadowConditionEngineTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/condition/ShadowConditionEngineTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.shadow.condition;
 
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.shadow.rule.ShadowRule;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
 import org.junit.Test;
 
@@ -24,7 +26,9 @@ import java.util.Collections;
 import java.util.List;
 
 import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
 
 public final class ShadowConditionEngineTest {
     
@@ -34,4 +38,9 @@ public final class ShadowConditionEngineTest {
         assertThat(actual.size(), is(1));
         assertThat(actual.get(0), is(1));
     }
+
+    @Test
+    public void assertCreateShadowCondition() {
+        assertFalse(new ShadowConditionEngine(mock(ShadowRule.class)).createShadowCondition(mock(SQLStatementContext.class)).isPresent());
+    }
 }