You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by su...@apache.org on 2023/05/07 03:46:54 UTC

[shardingsphere] branch master updated: Refactor SQLFederationDecideEngine (#25502)

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

sunnianjun 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 903f8ef46d6 Refactor SQLFederationDecideEngine (#25502)
903f8ef46d6 is described below

commit 903f8ef46d64255a627abef50ab3dc9505482f66
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sun May 7 11:46:46 2023 +0800

    Refactor SQLFederationDecideEngine (#25502)
    
    * Refactor SQLFederationDecideEngine
---
 .../decider/ShardingSQLFederationDecider.java      | 16 ++++++------
 .../decider/ShardingSQLFederationDeciderTest.java  |  2 +-
 ...rEngine.java => SQLFederationDecideEngine.java} | 25 ++++++++-----------
 .../infra/binder/decider/SQLFederationDecider.java |  9 ++++---
 .../{context => }/SQLFederationDeciderContext.java |  2 +-
 ...est.java => SQLFederationDecideEngineTest.java} | 29 +++++++++++-----------
 .../decider/SQLFederationDeciderMatchFixture.java  |  6 ++---
 .../SQLFederationDeciderNotMatchFixture.java       |  6 ++---
 .../database/schema/util/SystemSchemaUtils.java    |  4 +--
 .../statement/ShardingSpherePreparedStatement.java |  7 +++---
 .../core/statement/ShardingSphereStatement.java    |  7 +++---
 .../single/decider/SingleSQLFederationDecider.java |  7 +++---
 .../decider/SingleSQLFederationDeciderTest.java    |  2 +-
 .../proxy/backend/connector/DatabaseConnector.java |  9 +++----
 .../handler/distsql/rul/sql/PreviewHandler.java    |  6 ++---
 15 files changed, 66 insertions(+), 71 deletions(-)

diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
index 06111e9c7c9..5bc359c5d60 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.sharding.decider;
 
 import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
@@ -39,26 +39,26 @@ import java.util.List;
 public final class ShardingSQLFederationDecider implements SQLFederationDecider<ShardingRule> {
     
     @Override
-    public void decide(final SQLFederationDeciderContext deciderContext, final SQLStatementContext<?> sqlStatementContext, final List<Object> parameters,
+    public void decide(final SQLFederationDeciderContext deciderContext, final SelectStatementContext selectStatementContext, final List<Object> parameters,
                        final ShardingSphereRuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, final ShardingRule rule, final ConfigurationProperties props) {
-        SelectStatementContext select = (SelectStatementContext) sqlStatementContext;
-        Collection<String> tableNames = rule.getShardingLogicTableNames(select.getTablesContext().getTableNames());
+        Collection<String> tableNames = rule.getShardingLogicTableNames(selectStatementContext.getTablesContext().getTableNames());
         if (tableNames.isEmpty()) {
             return;
         }
         addTableDataNodes(deciderContext, rule, tableNames);
-        ShardingConditions shardingConditions = getMergedShardingConditions(sqlStatementContext, parameters, globalRuleMetaData, database, rule);
+        ShardingConditions shardingConditions = getMergedShardingConditions(selectStatementContext, parameters, globalRuleMetaData, database, rule);
         if (shardingConditions.isNeedMerge() && shardingConditions.isSameShardingCondition()) {
             return;
         }
-        if (select.isContainsSubquery() || select.isContainsHaving() || select.isContainsCombine() || select.isContainsPartialDistinctAggregation()) {
+        if (selectStatementContext.isContainsSubquery() || selectStatementContext.isContainsHaving()
+                || selectStatementContext.isContainsCombine() || selectStatementContext.isContainsPartialDistinctAggregation()) {
             deciderContext.setUseSQLFederation(true);
             return;
         }
-        if (!select.isContainsJoinQuery() || rule.isAllTablesInSameDataSource(tableNames)) {
+        if (!selectStatementContext.isContainsJoinQuery() || rule.isAllTablesInSameDataSource(tableNames)) {
             return;
         }
-        boolean allBindingTables = tableNames.size() > 1 && rule.isAllBindingTables(database, select, tableNames);
+        boolean allBindingTables = tableNames.size() > 1 && rule.isAllBindingTables(database, selectStatementContext, tableNames);
         deciderContext.setUseSQLFederation(tableNames.size() > 1 && !allBindingTables);
     }
     
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
index 06c840e02ae..99cd0bd232f 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.sharding.decider;
 
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.DefaultDatabase;
diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDeciderEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecideEngine.java
similarity index 76%
rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDeciderEngine.java
rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecideEngine.java
index d64c9f1b71d..94d97075f4a 100644
--- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDeciderEngine.java
+++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecideEngine.java
@@ -15,10 +15,8 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.binder.decider.engine;
+package org.apache.shardingsphere.infra.binder.decider;
 
-import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
@@ -35,18 +33,18 @@ import java.util.Map;
 import java.util.Map.Entry;
 
 /**
- * SQL federation decider engine.
+ * SQL federation decide engine.
  */
-public final class SQLFederationDeciderEngine {
-    
-    private final ConfigurationProperties props;
+public final class SQLFederationDecideEngine {
     
     @SuppressWarnings("rawtypes")
     private final Map<ShardingSphereRule, SQLFederationDecider> deciders;
     
-    public SQLFederationDeciderEngine(final Collection<ShardingSphereRule> rules, final ConfigurationProperties props) {
-        this.props = props;
+    private final ConfigurationProperties props;
+    
+    public SQLFederationDecideEngine(final Collection<ShardingSphereRule> rules, final ConfigurationProperties props) {
         deciders = OrderedSPILoader.getServices(SQLFederationDecider.class, rules);
+        this.props = props;
     }
     
     /**
@@ -63,23 +61,22 @@ public final class SQLFederationDeciderEngine {
                                               final List<Object> parameters, final ShardingSphereRuleMetaData globalRuleMetaData, final ShardingSphereDatabase database) {
         SQLFederationDeciderContext result = new SQLFederationDeciderContext();
         // TODO move this logic to SQLFederationDecider implement class when we remove sql federation type
-        if (isSelectStatementContainsSystemSchema(sqlStatementContext, database)) {
+        if (isQuerySystemSchema(sqlStatementContext, database)) {
             result.setUseSQLFederation(true);
             return result;
         }
-        String sqlFederationType = props.getValue(ConfigurationPropertyKey.SQL_FEDERATION_TYPE);
-        if ("NONE".equals(sqlFederationType) || !(sqlStatementContext instanceof SelectStatementContext)) {
+        if (!(sqlStatementContext instanceof SelectStatementContext) || "NONE".equals(props.getValue(ConfigurationPropertyKey.SQL_FEDERATION_TYPE))) {
             return result;
         }
         for (Entry<ShardingSphereRule, SQLFederationDecider> entry : deciders.entrySet()) {
             if (!result.isUseSQLFederation()) {
-                entry.getValue().decide(result, sqlStatementContext, parameters, globalRuleMetaData, database, entry.getKey(), props);
+                entry.getValue().decide(result, (SelectStatementContext) sqlStatementContext, parameters, globalRuleMetaData, database, entry.getKey(), props);
             }
         }
         return result;
     }
     
-    private boolean isSelectStatementContainsSystemSchema(final SQLStatementContext<?> sqlStatementContext, final ShardingSphereDatabase database) {
+    private boolean isQuerySystemSchema(final SQLStatementContext<?> sqlStatementContext, final ShardingSphereDatabase database) {
         return sqlStatementContext instanceof SelectStatementContext
                 && SystemSchemaUtils.containsSystemSchema(sqlStatementContext.getDatabaseType(), sqlStatementContext.getTablesContext().getSchemaNames(), database);
     }
diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecider.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecider.java
index 2d79eb0da6d..92faf5d9e5a 100644
--- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecider.java
+++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecider.java
@@ -17,12 +17,12 @@
 
 package org.apache.shardingsphere.infra.binder.decider;
 
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
 import org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPI;
 
 import java.util.List;
@@ -32,19 +32,20 @@ import java.util.List;
  * 
  * @param <T> type of rule
  */
+@SingletonSPI
 public interface SQLFederationDecider<T extends ShardingSphereRule> extends OrderedSPI<T> {
     
     /**
      * Judge whether to use sql federation engine.
      *
      * @param deciderContext decider context
-     * @param sqlStatementContext SQL statement context
+     * @param selectStatementContext select statement context
      * @param parameters parameters
      * @param globalRuleMetaData global rule meta data
      * @param database database
      * @param rule rule
      * @param props props
      */
-    void decide(SQLFederationDeciderContext deciderContext, SQLStatementContext<?> sqlStatementContext, List<Object> parameters,
+    void decide(SQLFederationDeciderContext deciderContext, SelectStatementContext selectStatementContext, List<Object> parameters,
                 ShardingSphereRuleMetaData globalRuleMetaData, ShardingSphereDatabase database, T rule, ConfigurationProperties props);
 }
diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/context/SQLFederationDeciderContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDeciderContext.java
similarity index 94%
rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/context/SQLFederationDeciderContext.java
rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDeciderContext.java
index 857f669e264..6852319ec1e 100644
--- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/context/SQLFederationDeciderContext.java
+++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDeciderContext.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.binder.decider.context;
+package org.apache.shardingsphere.infra.binder.decider;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDeciderEngineTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDecideEngineTest.java
similarity index 77%
rename from infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDeciderEngineTest.java
rename to infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDecideEngineTest.java
index 9b9420d355c..5a0ff9cdd0a 100644
--- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDeciderEngineTest.java
+++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDecideEngineTest.java
@@ -17,7 +17,8 @@
 
 package org.apache.shardingsphere.infra.binder.decider.engine;
 
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecideEngine;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
 import org.apache.shardingsphere.infra.binder.decider.fixture.rule.SQLFederationDeciderRuleMatchFixture;
 import org.apache.shardingsphere.infra.binder.decider.fixture.rule.SQLFederationDeciderRuleNotMatchFixture;
 import org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
@@ -46,71 +47,71 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-class SQLFederationDeciderEngineTest {
+class SQLFederationDecideEngineTest {
     
     @Test
     void assertDecideWhenSelectStatementContainsSystemSchema() {
-        SQLFederationDeciderEngine deciderEngine = new SQLFederationDeciderEngine(Collections.emptyList(), new ConfigurationProperties(new Properties()));
+        SQLFederationDecideEngine engine = new SQLFederationDecideEngine(Collections.emptyList(), new ConfigurationProperties(new Properties()));
         SelectStatementContext sqlStatementContext = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         when(sqlStatementContext.getDatabaseType()).thenReturn(new MySQLDatabaseType());
         when(sqlStatementContext.getTablesContext().getSchemaNames()).thenReturn(Collections.singletonList("information_schema"));
         ShardingSphereDatabase database = new ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 mock(DatabaseType.class), mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), mock(ShardingSphereRuleMetaData.class), Collections.emptyMap());
-        SQLFederationDeciderContext actual = deciderEngine.decide(sqlStatementContext, Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
+        SQLFederationDeciderContext actual = engine.decide(sqlStatementContext, Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
         assertTrue(actual.isUseSQLFederation());
     }
     
     @Test
     void assertDecideWhenNotConfigSqlFederationEnabled() {
         Collection<ShardingSphereRule> rules = Collections.singletonList(new SQLFederationDeciderRuleMatchFixture());
-        SQLFederationDeciderEngine deciderEngine = new SQLFederationDeciderEngine(rules, new ConfigurationProperties(new Properties()));
+        SQLFederationDecideEngine engine = new SQLFederationDecideEngine(rules, new ConfigurationProperties(new Properties()));
         ShardingSphereDatabase database = new ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 mock(DatabaseType.class), mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new ShardingSphereRuleMetaData(rules), Collections.emptyMap());
-        SQLFederationDeciderContext actual = deciderEngine.decide(mock(CommonSQLStatementContext.class), Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
+        SQLFederationDeciderContext actual = engine.decide(mock(CommonSQLStatementContext.class), Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
         assertFalse(actual.isUseSQLFederation());
     }
     
     @Test
     void assertDecideWhenExecuteNotSelectStatement() {
         Collection<ShardingSphereRule> rules = Collections.singletonList(new SQLFederationDeciderRuleMatchFixture());
-        SQLFederationDeciderEngine deciderEngine = new SQLFederationDeciderEngine(rules,
+        SQLFederationDecideEngine engine = new SQLFederationDecideEngine(rules,
                 new ConfigurationProperties(PropertiesBuilder.build(new Property(ConfigurationPropertyKey.SQL_FEDERATION_TYPE.getKey(), "ORIGINAL"))));
         ShardingSphereDatabase database = new ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 mock(DatabaseType.class), mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new ShardingSphereRuleMetaData(rules), Collections.emptyMap());
-        SQLFederationDeciderContext actual = deciderEngine.decide(mock(CommonSQLStatementContext.class), Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
+        SQLFederationDeciderContext actual = engine.decide(mock(CommonSQLStatementContext.class), Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
         assertFalse(actual.isUseSQLFederation());
     }
     
     @Test
     void assertDecideWhenConfigSingleMatchedRule() {
         Collection<ShardingSphereRule> rules = Collections.singletonList(new SQLFederationDeciderRuleMatchFixture());
-        SQLFederationDeciderEngine deciderEngine = new SQLFederationDeciderEngine(rules,
+        SQLFederationDecideEngine engine = new SQLFederationDecideEngine(rules,
                 new ConfigurationProperties(PropertiesBuilder.build(new Property(ConfigurationPropertyKey.SQL_FEDERATION_TYPE.getKey(), "ORIGINAL"))));
         ShardingSphereDatabase database = new ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 mock(DatabaseType.class), mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new ShardingSphereRuleMetaData(rules), Collections.emptyMap());
-        SQLFederationDeciderContext actual = deciderEngine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS), Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
+        SQLFederationDeciderContext actual = engine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS), Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
         assertTrue(actual.isUseSQLFederation());
     }
     
     @Test
     void assertDecideWhenConfigSingleNotMatchedRule() {
         Collection<ShardingSphereRule> rules = Collections.singletonList(new SQLFederationDeciderRuleNotMatchFixture());
-        SQLFederationDeciderEngine deciderEngine = new SQLFederationDeciderEngine(rules,
+        SQLFederationDecideEngine engine = new SQLFederationDecideEngine(rules,
                 new ConfigurationProperties(PropertiesBuilder.build(new Property(ConfigurationPropertyKey.SQL_FEDERATION_TYPE.getKey(), "ORIGINAL"))));
         ShardingSphereDatabase database = new ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 mock(DatabaseType.class), mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new ShardingSphereRuleMetaData(rules), Collections.emptyMap());
-        SQLFederationDeciderContext actual = deciderEngine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS), Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
+        SQLFederationDeciderContext actual = engine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS), Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
         assertFalse(actual.isUseSQLFederation());
     }
     
     @Test
     void assertDecideWhenConfigMultiRule() {
         Collection<ShardingSphereRule> rules = Arrays.asList(new SQLFederationDeciderRuleNotMatchFixture(), new SQLFederationDeciderRuleMatchFixture());
-        SQLFederationDeciderEngine deciderEngine = new SQLFederationDeciderEngine(rules,
+        SQLFederationDecideEngine engine = new SQLFederationDecideEngine(rules,
                 new ConfigurationProperties(PropertiesBuilder.build(new Property(ConfigurationPropertyKey.SQL_FEDERATION_TYPE.getKey(), "ORIGINAL"))));
         ShardingSphereDatabase database = new ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 mock(DatabaseType.class), mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new ShardingSphereRuleMetaData(rules), Collections.emptyMap());
-        SQLFederationDeciderContext actual = deciderEngine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS), Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
+        SQLFederationDeciderContext actual = engine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS), Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
         assertTrue(actual.isUseSQLFederation());
     }
 }
diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderMatchFixture.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderMatchFixture.java
index 08341f3d76d..db0baa3b187 100644
--- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderMatchFixture.java
+++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderMatchFixture.java
@@ -18,9 +18,9 @@
 package org.apache.shardingsphere.infra.binder.decider.fixture.decider;
 
 import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
 import org.apache.shardingsphere.infra.binder.decider.fixture.rule.SQLFederationDeciderRuleMatchFixture;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
@@ -30,7 +30,7 @@ import java.util.List;
 public final class SQLFederationDeciderMatchFixture implements SQLFederationDecider<SQLFederationDeciderRuleMatchFixture> {
     
     @Override
-    public void decide(final SQLFederationDeciderContext deciderContext, final SQLStatementContext<?> sqlStatementContext, final List<Object> parameters,
+    public void decide(final SQLFederationDeciderContext deciderContext, final SelectStatementContext selectStatementContext, final List<Object> parameters,
                        final ShardingSphereRuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, final SQLFederationDeciderRuleMatchFixture rule,
                        final ConfigurationProperties props) {
         deciderContext.setUseSQLFederation(true);
diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderNotMatchFixture.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderNotMatchFixture.java
index e9068e40e73..4485b43c406 100644
--- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderNotMatchFixture.java
+++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/fixture/decider/SQLFederationDeciderNotMatchFixture.java
@@ -18,9 +18,9 @@
 package org.apache.shardingsphere.infra.binder.decider.fixture.decider;
 
 import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
 import org.apache.shardingsphere.infra.binder.decider.fixture.rule.SQLFederationDeciderRuleNotMatchFixture;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
@@ -30,7 +30,7 @@ import java.util.List;
 public final class SQLFederationDeciderNotMatchFixture implements SQLFederationDecider<SQLFederationDeciderRuleNotMatchFixture> {
     
     @Override
-    public void decide(final SQLFederationDeciderContext deciderContext, final SQLStatementContext<?> sqlStatementContext, final List<Object> parameters,
+    public void decide(final SQLFederationDeciderContext deciderContext, final SelectStatementContext selectStatementContext, final List<Object> parameters,
                        final ShardingSphereRuleMetaData globalRuleMetaData, final ShardingSphereDatabase database,
                        final SQLFederationDeciderRuleNotMatchFixture rule, final ConfigurationProperties props) {
     }
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtils.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtils.java
index 45e8132ad4f..13099561142 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtils.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtils.java
@@ -26,7 +26,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import java.util.Collection;
 
 /**
- * System schema utility class.
+ * System schema utility.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class SystemSchemaUtils {
@@ -34,7 +34,7 @@ public final class SystemSchemaUtils {
     /**
      * Judge whether SQL statement contains system schema or not.
      *
-     * @param databaseType databaseType
+     * @param databaseType database type
      * @param schemaNames schema names
      * @param database database
      * @return whether SQL statement contains system schema or not
diff --git a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 0bab8aef8e7..3351bb49664 100644
--- a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -35,8 +35,8 @@ import org.apache.shardingsphere.driver.jdbc.exception.syntax.EmptySQLException;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.aware.ParameterAware;
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
-import org.apache.shardingsphere.infra.binder.decider.engine.SQLFederationDeciderEngine;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecideEngine;
 import org.apache.shardingsphere.infra.binder.segment.insert.keygen.GeneratedKeyContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
@@ -286,8 +286,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
     
     private static SQLFederationDeciderContext decide(final QueryContext queryContext,
                                                       final ShardingSphereRuleMetaData globalRuleMetaData, final ConfigurationProperties props, final ShardingSphereDatabase database) {
-        SQLFederationDeciderEngine deciderEngine = new SQLFederationDeciderEngine(database.getRuleMetaData().getRules(), props);
-        return deciderEngine.decide(queryContext.getSqlStatementContext(), queryContext.getParameters(), globalRuleMetaData, database);
+        return new SQLFederationDecideEngine(database.getRuleMetaData().getRules(), props).decide(queryContext.getSqlStatementContext(), queryContext.getParameters(), globalRuleMetaData, database);
     }
     
     private JDBCExecutionUnit createTrafficExecutionUnit(final String trafficInstanceId, final QueryContext queryContext) throws SQLException {
diff --git a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 5bc8e4722ac..2462ee03ffc 100644
--- a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -34,8 +34,8 @@ import org.apache.shardingsphere.driver.jdbc.exception.syntax.EmptySQLException;
 import org.apache.shardingsphere.driver.jdbc.exception.transaction.JDBCTransactionAcrossDatabasesException;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
-import org.apache.shardingsphere.infra.binder.decider.engine.SQLFederationDeciderEngine;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecideEngine;
 import org.apache.shardingsphere.infra.binder.segment.insert.keygen.GeneratedKeyContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
@@ -200,8 +200,7 @@ public final class ShardingSphereStatement extends AbstractStatementAdapter {
     
     private static SQLFederationDeciderContext decide(final QueryContext queryContext,
                                                       final ShardingSphereRuleMetaData globalRuleMetaData, final ConfigurationProperties props, final ShardingSphereDatabase database) {
-        SQLFederationDeciderEngine deciderEngine = new SQLFederationDeciderEngine(database.getRuleMetaData().getRules(), props);
-        return deciderEngine.decide(queryContext.getSqlStatementContext(), queryContext.getParameters(), globalRuleMetaData, database);
+        return new SQLFederationDecideEngine(database.getRuleMetaData().getRules(), props).decide(queryContext.getSqlStatementContext(), queryContext.getParameters(), globalRuleMetaData, database);
     }
     
     private Optional<String> getInstanceIdAndSet(final QueryContext queryContext) {
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java
index 273652e5502..7dfc816aff0 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.single.decider;
 
 import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.binder.type.IndexAvailable;
@@ -45,10 +45,9 @@ import java.util.Optional;
 public final class SingleSQLFederationDecider implements SQLFederationDecider<SingleRule> {
     
     @Override
-    public void decide(final SQLFederationDeciderContext deciderContext, final SQLStatementContext<?> sqlStatementContext, final List<Object> parameters,
+    public void decide(final SQLFederationDeciderContext deciderContext, final SelectStatementContext selectStatementContext, final List<Object> parameters,
                        final ShardingSphereRuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, final SingleRule rule, final ConfigurationProperties props) {
-        SelectStatementContext select = (SelectStatementContext) sqlStatementContext;
-        Collection<QualifiedTable> singleTableNames = getSingleTableNames(select, database, rule);
+        Collection<QualifiedTable> singleTableNames = getSingleTableNames(selectStatementContext, database, rule);
         if (singleTableNames.isEmpty()) {
             return;
         }
diff --git a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDeciderTest.java b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDeciderTest.java
index 73c82edbddf..2bf0ad1d2fe 100644
--- a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDeciderTest.java
+++ b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDeciderTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.single.decider;
 
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.DefaultDatabase;
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
index d6553b8dea3..5b5ae52925d 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
@@ -21,8 +21,8 @@ import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.dialect.SQLExceptionTransformEngine;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.infra.binder.aware.CursorDefinitionAware;
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
-import org.apache.shardingsphere.infra.binder.decider.engine.SQLFederationDeciderEngine;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecideEngine;
 import org.apache.shardingsphere.infra.binder.segment.insert.keygen.GeneratedKeyContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.ddl.CloseStatementContext;
@@ -198,9 +198,8 @@ public final class DatabaseConnector implements DatabaseBackendHandler {
     @Override
     public ResponseHeader execute() throws SQLException {
         MetaDataContexts metaDataContexts = ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        SQLFederationDeciderContext deciderContext = new SQLFederationDeciderEngine(
-                database.getRuleMetaData().getRules(), metaDataContexts.getMetaData().getProps()).decide(queryContext.getSqlStatementContext(), queryContext.getParameters(),
-                        metaDataContexts.getMetaData().getGlobalRuleMetaData(), database);
+        SQLFederationDeciderContext deciderContext = new SQLFederationDecideEngine(database.getRuleMetaData().getRules(), metaDataContexts.getMetaData().getProps())
+                .decide(queryContext.getSqlStatementContext(), queryContext.getParameters(), metaDataContexts.getMetaData().getGlobalRuleMetaData(), database);
         if (deciderContext.isUseSQLFederation()) {
             prepareFederationExecutor();
             ResultSet resultSet = doExecuteFederation(queryContext, metaDataContexts);
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
index 76730b73ac7..c362c174bb1 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
@@ -25,8 +25,8 @@ import org.apache.shardingsphere.distsql.parser.statement.rul.sql.PreviewStateme
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.aware.CursorDefinitionAware;
-import org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
-import org.apache.shardingsphere.infra.binder.decider.engine.SQLFederationDeciderEngine;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
+import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecideEngine;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementContext;
 import org.apache.shardingsphere.infra.binder.type.CursorAvailable;
@@ -107,7 +107,7 @@ public final class PreviewHandler extends SQLRULBackendHandler<PreviewStatement>
         ShardingSphereDatabase database = ProxyContext.getInstance().getDatabase(getConnectionSession().getDatabaseName());
         ShardingSpherePreconditions.checkState(database.isComplete(), () -> new RuleNotExistedException(getConnectionSession().getDatabaseName()));
         ConfigurationProperties props = metaDataContexts.getMetaData().getProps();
-        SQLFederationDeciderContext deciderContext = new SQLFederationDeciderEngine(database.getRuleMetaData().getRules(), props)
+        SQLFederationDeciderContext deciderContext = new SQLFederationDecideEngine(database.getRuleMetaData().getRules(), props)
                 .decide(queryContext.getSqlStatementContext(), queryContext.getParameters(),
                         metaDataContexts.getMetaData().getGlobalRuleMetaData(), metaDataContexts.getMetaData().getDatabase(getConnectionSession().getDatabaseName()));
         Collection<ExecutionUnit> executionUnits = deciderContext.isUseSQLFederation() ? getFederationExecutionUnits(queryContext, databaseName, metaDataContexts)