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 7dda3775394 Reduce SQLFederationDeciderContext usage scope (#25504)
7dda3775394 is described below

commit 7dda3775394ea47925c3dd36dce02b480ee8dc33
Author: Liang Zhang <[email protected]>
AuthorDate: Sun May 7 13:36:56 2023 +0800

    Reduce SQLFederationDeciderContext usage scope (#25504)
---
 .../binder/decider/SQLFederationDecideEngine.java  | 23 +++++++++----------
 .../engine/SQLFederationDecideEngineTest.java      | 19 +++++-----------
 .../statement/ShardingSpherePreparedStatement.java | 26 ++++++++++------------
 .../core/statement/ShardingSphereStatement.java    | 24 +++++++++-----------
 .../single/decider/SingleSQLFederationDecider.java |  8 +++----
 .../proxy/backend/connector/DatabaseConnector.java |  8 +++----
 .../handler/distsql/rul/sql/PreviewHandler.java    | 15 ++++++++-----
 7 files changed, 56 insertions(+), 67 deletions(-)

diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecideEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecideEngine.java
index 7f954b7da1d..f5e498e1280 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecideEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDecideEngine.java
@@ -48,33 +48,32 @@ public final class SQLFederationDecideEngine {
     }
     
     /**
-     * Decide.
+     * Decide use SQL federation or not.
      * 
      * @param sqlStatementContext SQL statement context
      * @param parameters SQL parameters
-     * @param globalRuleMetaData global rule meta data
      * @param database ShardingSphere database
-     * @return SQL federation decider context
+     * @param globalRuleMetaData global rule meta data
+     * @return use SQL federation or not
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
-    public SQLFederationDeciderContext decide(final SQLStatementContext<?> 
sqlStatementContext,
-                                              final List<Object> parameters, 
final ShardingSphereRuleMetaData globalRuleMetaData, final 
ShardingSphereDatabase database) {
-        SQLFederationDeciderContext result = new SQLFederationDeciderContext();
+    public boolean decide(final SQLStatementContext<?> sqlStatementContext, 
final List<Object> parameters,
+                          final ShardingSphereDatabase database, final 
ShardingSphereRuleMetaData globalRuleMetaData) {
         // TODO BEGIN: move this logic to SQLFederationDecider implement class 
when we remove sql federation type
         if (isQuerySystemSchema(sqlStatementContext, database)) {
-            result.setUseSQLFederation(true);
-            return result;
+            return true;
         }
         // TODO END
         if (isFederationDisabled || !(sqlStatementContext instanceof 
SelectStatementContext)) {
-            return result;
+            return false;
         }
+        SQLFederationDeciderContext context = new 
SQLFederationDeciderContext();
         for (Entry<ShardingSphereRule, SQLFederationDecider> entry : 
deciders.entrySet()) {
-            if (!result.isUseSQLFederation()) {
-                entry.getValue().decide(result, (SelectStatementContext) 
sqlStatementContext, parameters, globalRuleMetaData, database, entry.getKey());
+            if (!context.isUseSQLFederation()) {
+                entry.getValue().decide(context, (SelectStatementContext) 
sqlStatementContext, parameters, globalRuleMetaData, database, entry.getKey());
             }
         }
-        return result;
+        return context.isUseSQLFederation();
     }
     
     private boolean isQuerySystemSchema(final SQLStatementContext<?> 
sqlStatementContext, final ShardingSphereDatabase database) {
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDecideEngineTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDecideEngineTest.java
index 5a0ff9cdd0a..99117c6550d 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDecideEngineTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/decider/engine/SQLFederationDecideEngineTest.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.infra.binder.decider.engine;
 
 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;
@@ -57,8 +56,7 @@ class SQLFederationDecideEngineTest {
         
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 = 
engine.decide(sqlStatementContext, Collections.emptyList(), 
mock(ShardingSphereRuleMetaData.class), database);
-        assertTrue(actual.isUseSQLFederation());
+        assertTrue(engine.decide(sqlStatementContext, Collections.emptyList(), 
database, mock(ShardingSphereRuleMetaData.class)));
     }
     
     @Test
@@ -67,8 +65,7 @@ class SQLFederationDecideEngineTest {
         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 = 
engine.decide(mock(CommonSQLStatementContext.class), Collections.emptyList(), 
mock(ShardingSphereRuleMetaData.class), database);
-        assertFalse(actual.isUseSQLFederation());
+        assertFalse(engine.decide(mock(CommonSQLStatementContext.class), 
Collections.emptyList(), database, mock(ShardingSphereRuleMetaData.class)));
     }
     
     @Test
@@ -78,8 +75,7 @@ class SQLFederationDecideEngineTest {
                 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 = 
engine.decide(mock(CommonSQLStatementContext.class), Collections.emptyList(), 
mock(ShardingSphereRuleMetaData.class), database);
-        assertFalse(actual.isUseSQLFederation());
+        assertFalse(engine.decide(mock(CommonSQLStatementContext.class), 
Collections.emptyList(), database, mock(ShardingSphereRuleMetaData.class)));
     }
     
     @Test
@@ -89,8 +85,7 @@ class SQLFederationDecideEngineTest {
                 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 = 
engine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS), 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
-        assertTrue(actual.isUseSQLFederation());
+        assertTrue(engine.decide(mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS), Collections.emptyList(), database, 
mock(ShardingSphereRuleMetaData.class)));
     }
     
     @Test
@@ -100,8 +95,7 @@ class SQLFederationDecideEngineTest {
                 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 = 
engine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS), 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
-        assertFalse(actual.isUseSQLFederation());
+        assertFalse(engine.decide(mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS), Collections.emptyList(), database, 
mock(ShardingSphereRuleMetaData.class)));
     }
     
     @Test
@@ -111,7 +105,6 @@ class SQLFederationDecideEngineTest {
                 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 = 
engine.decide(mock(SelectStatementContext.class, RETURNS_DEEP_STUBS), 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database);
-        assertTrue(actual.isUseSQLFederation());
+        assertTrue(engine.decide(mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS), Collections.emptyList(), database, 
mock(ShardingSphereRuleMetaData.class)));
     }
 }
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 3351bb49664..78998eb5ce3 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
@@ -32,10 +32,8 @@ import 
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResult
 import 
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSetUtils;
 import 
org.apache.shardingsphere.driver.jdbc.core.statement.metadata.ShardingSphereParameterMetaData;
 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.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;
@@ -80,11 +78,12 @@ import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRule
 import org.apache.shardingsphere.infra.parser.SQLParserEngine;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.ColumnContainedRule;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.RawExecutionRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.StorageConnectorReusableRule;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -165,7 +164,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
     
     private String trafficInstanceId;
     
-    private SQLFederationDeciderContext deciderContext;
+    private boolean useFederation;
     
     public ShardingSpherePreparedStatement(final ShardingSphereConnection 
connection, final String sql) throws SQLException {
         this(connection, sql, ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT, false, null);
@@ -260,9 +259,9 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
                 JDBCExecutionUnit executionUnit = 
createTrafficExecutionUnit(trafficInstanceId, queryContext);
                 return executor.getTrafficExecutor().execute(executionUnit, 
(statement, sql) -> ((PreparedStatement) statement).executeQuery());
             }
-            deciderContext = decide(queryContext,
-                    metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps(), 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()));
-            if (deciderContext.isUseSQLFederation()) {
+            useFederation = decide(queryContext,
+                    
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()), 
metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps());
+            if (useFederation) {
                 return executeFederationQuery(queryContext);
             }
             executionContext = createExecutionContext(queryContext);
@@ -284,9 +283,8 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         return result;
     }
     
-    private static SQLFederationDeciderContext decide(final QueryContext 
queryContext,
-                                                      final 
ShardingSphereRuleMetaData globalRuleMetaData, final ConfigurationProperties 
props, final ShardingSphereDatabase database) {
-        return new 
SQLFederationDecideEngine(database.getRuleMetaData().getRules(), 
props).decide(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), globalRuleMetaData, database);
+    private boolean decide(final QueryContext queryContext, final 
ShardingSphereDatabase database, final ShardingSphereRuleMetaData 
globalRuleMetaData, final ConfigurationProperties props) {
+        return new 
SQLFederationDecideEngine(database.getRuleMetaData().getRules(), 
props).decide(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), database, globalRuleMetaData);
     }
     
     private JDBCExecutionUnit createTrafficExecutionUnit(final String 
trafficInstanceId, final QueryContext queryContext) throws SQLException {
@@ -427,9 +425,9 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
                 JDBCExecutionUnit executionUnit = 
createTrafficExecutionUnit(trafficInstanceId, queryContext);
                 return executor.getTrafficExecutor().execute(executionUnit, 
(statement, sql) -> ((PreparedStatement) statement).execute());
             }
-            deciderContext = decide(queryContext,
-                    metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps(), 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()));
-            if (deciderContext.isUseSQLFederation()) {
+            useFederation = decide(queryContext,
+                    
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()), 
metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps());
+            if (useFederation) {
                 ResultSet resultSet = executeFederationQuery(queryContext);
                 return null != resultSet;
             }
@@ -540,7 +538,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         if (null != trafficInstanceId) {
             return executor.getTrafficExecutor().getResultSet();
         }
-        if (null != deciderContext && deciderContext.isUseSQLFederation()) {
+        if (useFederation) {
             return executor.getFederationExecutor().getResultSet();
         }
         if (executionContext.getSqlStatementContext() instanceof 
SelectStatementContext || 
executionContext.getSqlStatementContext().getSqlStatement() instanceof 
DALStatement) {
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 2462ee03ffc..370c498efec 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
@@ -32,9 +32,7 @@ import 
org.apache.shardingsphere.driver.jdbc.core.resultset.GeneratedKeysResultS
 import 
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSet;
 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.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;
@@ -80,6 +78,7 @@ import 
org.apache.shardingsphere.infra.rule.identifier.type.ColumnContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.RawExecutionRule;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -140,7 +139,7 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     
     private String trafficInstanceId;
     
-    private SQLFederationDeciderContext deciderContext;
+    private boolean useFederation;
     
     public ShardingSphereStatement(final ShardingSphereConnection connection) {
         this(connection, ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
@@ -176,9 +175,9 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
                 JDBCExecutionUnit executionUnit = 
createTrafficExecutionUnit(trafficInstanceId, queryContext);
                 return executor.getTrafficExecutor().execute(executionUnit, 
Statement::executeQuery);
             }
-            deciderContext = decide(queryContext,
-                    metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps(), 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()));
-            if (deciderContext.isUseSQLFederation()) {
+            useFederation = decide(queryContext,
+                    
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()), 
metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps());
+            if (useFederation) {
                 return executeFederationQuery(queryContext);
             }
             executionContext = createExecutionContext(queryContext);
@@ -198,9 +197,8 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         return result;
     }
     
-    private static SQLFederationDeciderContext decide(final QueryContext 
queryContext,
-                                                      final 
ShardingSphereRuleMetaData globalRuleMetaData, final ConfigurationProperties 
props, final ShardingSphereDatabase database) {
-        return new 
SQLFederationDecideEngine(database.getRuleMetaData().getRules(), 
props).decide(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), globalRuleMetaData, database);
+    private boolean decide(final QueryContext queryContext, final 
ShardingSphereDatabase database, final ShardingSphereRuleMetaData 
globalRuleMetaData, final ConfigurationProperties props) {
+        return new 
SQLFederationDecideEngine(database.getRuleMetaData().getRules(), 
props).decide(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), database, globalRuleMetaData);
     }
     
     private Optional<String> getInstanceIdAndSet(final QueryContext 
queryContext) {
@@ -466,9 +464,9 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
                 JDBCExecutionUnit executionUnit = 
createTrafficExecutionUnit(trafficInstanceId, queryContext);
                 return executor.getTrafficExecutor().execute(executionUnit, 
trafficCallback);
             }
-            deciderContext = decide(queryContext,
-                    metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps(), 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()));
-            if (deciderContext.isUseSQLFederation()) {
+            useFederation = decide(queryContext,
+                    
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()), 
metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps());
+            if (useFederation) {
                 ResultSet resultSet = executeFederationQuery(queryContext);
                 return null != resultSet;
             }
@@ -625,7 +623,7 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         if (null != trafficInstanceId) {
             return executor.getTrafficExecutor().getResultSet();
         }
-        if (null != deciderContext && deciderContext.isUseSQLFederation()) {
+        if (useFederation) {
             return executor.getFederationExecutor().getResultSet();
         }
         if (executionContext.getSqlStatementContext() instanceof 
SelectStatementContext || 
executionContext.getSqlStatementContext().getSqlStatement() instanceof 
DALStatement) {
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 1a2084f31f4..4a5766b3b5d 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
@@ -58,13 +58,13 @@ public final class SingleSQLFederationDecider implements 
SQLFederationDecider<Si
         addTableDataNodes(deciderContext, rule, singleTableNames);
     }
     
-    private static void addTableDataNodes(final SQLFederationDeciderContext 
deciderContext, final SingleRule rule, final Collection<QualifiedTable> 
singleTableNames) {
+    private void addTableDataNodes(final SQLFederationDeciderContext 
deciderContext, final SingleRule rule, final Collection<QualifiedTable> 
singleTableNames) {
         for (QualifiedTable each : singleTableNames) {
             rule.findSingleTableDataNode(each.getSchemaName(), 
each.getTableName()).ifPresent(optional -> 
deciderContext.getDataNodes().add(optional));
         }
     }
     
-    private static boolean isAllTablesInSameDataSource(final 
SQLFederationDeciderContext deciderContext, final SingleRule rule, final 
Collection<QualifiedTable> singleTableNames) {
+    private boolean isAllTablesInSameDataSource(final 
SQLFederationDeciderContext deciderContext, final SingleRule rule, final 
Collection<QualifiedTable> singleTableNames) {
         if (!rule.isSingleTablesInSameDataSource(singleTableNames)) {
             return false;
         }
@@ -81,7 +81,7 @@ public final class SingleSQLFederationDecider implements 
SQLFederationDecider<Si
         return true;
     }
     
-    private static Collection<QualifiedTable> getSingleTableNames(final 
SQLStatementContext<?> sqlStatementContext,
+    private Collection<QualifiedTable> getSingleTableNames(final 
SQLStatementContext<?> sqlStatementContext,
                                                                   final 
ShardingSphereDatabase database, final SingleRule rule) {
         DatabaseType databaseType = sqlStatementContext.getDatabaseType();
         Collection<QualifiedTable> result = getQualifiedTables(database, 
databaseType, sqlStatementContext.getTablesContext().getTables());
@@ -91,7 +91,7 @@ public final class SingleSQLFederationDecider implements 
SQLFederationDecider<Si
         return rule.getSingleTableNames(result);
     }
     
-    private static Collection<QualifiedTable> getQualifiedTables(final 
ShardingSphereDatabase database, final DatabaseType databaseType, final 
Collection<SimpleTableSegment> tableSegments) {
+    private Collection<QualifiedTable> getQualifiedTables(final 
ShardingSphereDatabase database, final DatabaseType databaseType, final 
Collection<SimpleTableSegment> tableSegments) {
         Collection<QualifiedTable> result = new LinkedList<>();
         String schemaName = 
DatabaseTypeEngine.getDefaultSchemaName(databaseType, database.getName());
         for (SimpleTableSegment each : tableSegments) {
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 5b5ae52925d..22e875c0d9f 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
@@ -19,9 +19,7 @@ package org.apache.shardingsphere.proxy.backend.connector;
 
 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.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;
@@ -52,6 +50,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.util.SystemSchem
 import 
org.apache.shardingsphere.infra.rule.identifier.type.ColumnContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
 import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -198,9 +197,8 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
     @Override
     public ResponseHeader execute() throws SQLException {
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        SQLFederationDeciderContext deciderContext = new 
SQLFederationDecideEngine(database.getRuleMetaData().getRules(), 
metaDataContexts.getMetaData().getProps())
-                .decide(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), 
metaDataContexts.getMetaData().getGlobalRuleMetaData(), database);
-        if (deciderContext.isUseSQLFederation()) {
+        if (new 
SQLFederationDecideEngine(database.getRuleMetaData().getRules(), 
metaDataContexts.getMetaData().getProps())
+                .decide(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), database, 
metaDataContexts.getMetaData().getGlobalRuleMetaData())) {
             prepareFederationExecutor();
             ResultSet resultSet = doExecuteFederation(queryContext, 
metaDataContexts);
             return processExecuteFederation(resultSet, 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 c362c174bb1..e43e918a7fe 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
@@ -22,10 +22,8 @@ import com.google.common.base.Strings;
 import 
org.apache.shardingsphere.dialect.exception.syntax.database.NoDatabaseSelectedException;
 import 
org.apache.shardingsphere.dialect.exception.syntax.database.UnknownDatabaseException;
 import 
org.apache.shardingsphere.distsql.parser.statement.rul.sql.PreviewStatement;
-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.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;
@@ -49,6 +47,7 @@ import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.Statemen
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
 import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -107,10 +106,8 @@ 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 
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)
+        Collection<ExecutionUnit> executionUnits = 
isUseFederation(queryContext, database, metaDataContexts, props)
+                ? getFederationExecutionUnits(queryContext, databaseName, 
metaDataContexts)
                 : kernelProcessor.generateExecutionContext(queryContext, 
database, globalRuleMetaData, props, 
getConnectionSession().getConnectionContext()).getExecutionUnits();
         return 
executionUnits.stream().map(this::buildRow).collect(Collectors.toList());
     }
@@ -125,6 +122,12 @@ public final class PreviewHandler extends 
SQLRULBackendHandler<PreviewStatement>
         ((CursorDefinitionAware) 
sqlStatementContext).setUpCursorDefinition(cursorStatementContext);
     }
     
+    private boolean isUseFederation(final QueryContext queryContext, final 
ShardingSphereDatabase database, final MetaDataContexts metaDataContexts, final 
ConfigurationProperties props) {
+        SQLFederationDecideEngine engine = new 
SQLFederationDecideEngine(database.getRuleMetaData().getRules(), props);
+        return engine.decide(queryContext.getSqlStatementContext(), 
queryContext.getParameters(),
+                
metaDataContexts.getMetaData().getDatabase(getConnectionSession().getDatabaseName()),
 metaDataContexts.getMetaData().getGlobalRuleMetaData());
+    }
+    
     private LocalDataQueryResultRow buildRow(final ExecutionUnit unit) {
         return new LocalDataQueryResultRow(unit.getDataSourceName(), 
unit.getSqlUnit().getSql());
     }

Reply via email to