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 1d233ad4df0 Remove SQLFederationDeciderContext (#25508)
1d233ad4df0 is described below

commit 1d233ad4df01481ebcb6eced67925cbaba9dfee5
Author: Liang Zhang <[email protected]>
AuthorDate: Mon May 8 01:05:01 2023 +0800

    Remove SQLFederationDeciderContext (#25508)
    
    * Remove SQLFederationDeciderContext
---
 .../decider/ShardingSQLFederationDecider.java      | 27 +++---
 .../decider/ShardingSQLFederationDeciderTest.java  | 95 ++++++++--------------
 .../binder/decider/SQLFederationDecideEngine.java  | 11 ++-
 .../infra/binder/decider/SQLFederationDecider.java | 11 ++-
 .../decider/SQLFederationDeciderContext.java       | 37 ---------
 .../decider/SQLFederationDeciderMatchFixture.java  |  9 +-
 .../SQLFederationDeciderNotMatchFixture.java       |  8 +-
 .../single/decider/SingleSQLFederationDecider.java | 65 +++++++--------
 .../decider/SingleSQLFederationDeciderTest.java    | 49 ++++-------
 9 files changed, 123 insertions(+), 189 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 9f4123ba70a..5f4c25f62fe 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,9 +18,9 @@
 package org.apache.shardingsphere.sharding.decider;
 
 import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-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.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.sharding.constant.ShardingOrder;
@@ -30,6 +30,7 @@ import 
org.apache.shardingsphere.sharding.route.engine.condition.engine.Sharding
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 
 /**
@@ -38,33 +39,33 @@ import java.util.List;
 public final class ShardingSQLFederationDecider implements 
SQLFederationDecider<ShardingRule> {
     
     @Override
-    public void decide(final SQLFederationDeciderContext deciderContext, final 
SelectStatementContext selectStatementContext, final List<Object> parameters,
-                       final ShardingSphereRuleMetaData globalRuleMetaData, 
final ShardingSphereDatabase database, final ShardingRule rule) {
+    public boolean decide(final SelectStatementContext selectStatementContext, 
final List<Object> parameters,
+                          final ShardingSphereRuleMetaData globalRuleMetaData, 
final ShardingSphereDatabase database, final ShardingRule rule, final 
Collection<DataNode> includedDataNodes) {
         Collection<String> tableNames = 
rule.getShardingLogicTableNames(selectStatementContext.getTablesContext().getTableNames());
         if (tableNames.isEmpty()) {
-            return;
+            return false;
         }
-        addTableDataNodes(deciderContext, rule, tableNames);
+        includedDataNodes.addAll(getTableDataNodes(rule, tableNames));
         ShardingConditions shardingConditions = 
getMergedShardingConditions(selectStatementContext, parameters, 
globalRuleMetaData, database, rule);
         if (shardingConditions.isNeedMerge() && 
shardingConditions.isSameShardingCondition()) {
-            return;
+            return false;
         }
         if (selectStatementContext.isContainsSubquery() || 
selectStatementContext.isContainsHaving()
                 || selectStatementContext.isContainsCombine() || 
selectStatementContext.isContainsPartialDistinctAggregation()) {
-            deciderContext.setUseSQLFederation(true);
-            return;
+            return true;
         }
         if (!selectStatementContext.isContainsJoinQuery() || 
rule.isAllTablesInSameDataSource(tableNames)) {
-            return;
+            return false;
         }
-        boolean allBindingTables = tableNames.size() > 1 && 
rule.isAllBindingTables(database, selectStatementContext, tableNames);
-        deciderContext.setUseSQLFederation(tableNames.size() > 1 && 
!allBindingTables);
+        return tableNames.size() <= 1 || !rule.isAllBindingTables(database, 
selectStatementContext, tableNames);
     }
     
-    private void addTableDataNodes(final SQLFederationDeciderContext 
deciderContext, final ShardingRule rule, final Collection<String> tableNames) {
+    private Collection<DataNode> getTableDataNodes(final ShardingRule rule, 
final Collection<String> tableNames) {
+        Collection<DataNode> result = new HashSet<>();
         for (String each : tableNames) {
-            rule.findTableRule(each).ifPresent(optional -> 
deciderContext.getDataNodes().addAll(optional.getActualDataNodes()));
+            rule.findTableRule(each).ifPresent(optional -> 
result.addAll(optional.getActualDataNodes()));
         }
+        return result;
     }
     
     private ShardingConditions getMergedShardingConditions(final 
SQLStatementContext<?> sqlStatementContext, final List<Object> parameters,
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 d00b23ea06d..6466af9bd83 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,6 @@
 
 package org.apache.shardingsphere.sharding.decider;
 
-import 
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.database.DefaultDatabase;
 import 
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
@@ -30,7 +29,9 @@ import org.apache.shardingsphere.sharding.rule.TableRule;
 import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Optional;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -45,114 +46,92 @@ class ShardingSQLFederationDeciderTest {
     
     @Test
     void assertDecideWhenNotContainsShardingTable() {
-        ShardingSQLFederationDecider federationDecider = new 
ShardingSQLFederationDecider();
-        SelectStatementContext select = createStatementContext();
         ShardingRule rule = mock(ShardingRule.class);
         when(rule.getShardingLogicTableNames(Arrays.asList("t_order", 
"t_order_item"))).thenReturn(Collections.emptyList());
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        federationDecider.decide(actual, select,
-                Collections.emptyList(), 
mock(ShardingSphereRuleMetaData.class), mock(ShardingSphereDatabase.class), 
rule);
-        assertTrue(actual.getDataNodes().isEmpty());
-        assertFalse(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertFalse(new ShardingSQLFederationDecider().decide(
+                createStatementContext(), Collections.emptyList(), 
mock(ShardingSphereRuleMetaData.class), mock(ShardingSphereDatabase.class), 
rule, includedDataNodes));
+        assertTrue(includedDataNodes.isEmpty());
     }
     
     @Test
     void assertDecideWhenContainsSameShardingCondition() {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsSubquery()).thenReturn(true);
-        SQLFederationDeciderContext deciderContext = new 
SQLFederationDeciderContext();
-        new ShardingSQLFederationDecider().decide(deciderContext,
-                select, Collections.emptyList(), 
mock(ShardingSphereRuleMetaData.class), createDatabase(), createShardingRule());
-        assertThat(deciderContext.getDataNodes().size(), is(4));
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), 
createDatabase(), createShardingRule(), includedDataNodes));
+        assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
     void assertDecideWhenContainsSubquery() {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsSubquery()).thenReturn(true);
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        ShardingSQLFederationDecider federationDecider = new 
ShardingSQLFederationDecider();
-        federationDecider.decide(actual, select, Collections.emptyList(),
-                mock(ShardingSphereRuleMetaData.class), createDatabase(), 
createShardingRule());
-        assertThat(actual.getDataNodes().size(), is(4));
-        assertTrue(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), 
createDatabase(), createShardingRule(), includedDataNodes));
+        assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
     void assertDecideWhenContainsHaving() {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsHaving()).thenReturn(true);
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        ShardingSQLFederationDecider federationDecider = new 
ShardingSQLFederationDecider();
-        federationDecider.decide(actual, select, Collections.emptyList(),
-                mock(ShardingSphereRuleMetaData.class), createDatabase(), 
createShardingRule());
-        assertThat(actual.getDataNodes().size(), is(4));
-        assertTrue(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), 
createDatabase(), createShardingRule(), includedDataNodes));
+        assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
     void assertDecideWhenContainsCombine() {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsCombine()).thenReturn(true);
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        ShardingSQLFederationDecider federationDecider = new 
ShardingSQLFederationDecider();
-        federationDecider.decide(actual, select, Collections.emptyList(),
-                mock(ShardingSphereRuleMetaData.class), createDatabase(), 
createShardingRule());
-        assertThat(actual.getDataNodes().size(), is(4));
-        assertTrue(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), 
createDatabase(), createShardingRule(), includedDataNodes));
+        assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
     void assertDecideWhenContainsPartialDistinctAggregation() {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsPartialDistinctAggregation()).thenReturn(true);
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        ShardingSQLFederationDecider federationDecider = new 
ShardingSQLFederationDecider();
-        federationDecider.decide(actual, select, Collections.emptyList(),
-                mock(ShardingSphereRuleMetaData.class), createDatabase(), 
createShardingRule());
-        assertThat(actual.getDataNodes().size(), is(4));
-        assertTrue(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), 
createDatabase(), createShardingRule(), includedDataNodes));
+        assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
     void assertDecideWhenAllTablesInSameDataSource() {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsJoinQuery()).thenReturn(true);
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        ShardingSQLFederationDecider federationDecider = new 
ShardingSQLFederationDecider();
         ShardingRule shardingRule = createShardingRule();
         when(shardingRule.isAllTablesInSameDataSource(Arrays.asList("t_order", 
"t_order_item"))).thenReturn(true);
-        federationDecider.decide(actual, select, Collections.emptyList(), 
mock(ShardingSphereRuleMetaData.class), createDatabase(), shardingRule);
-        assertThat(actual.getDataNodes().size(), is(4));
-        assertFalse(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertFalse(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), 
createDatabase(), shardingRule, includedDataNodes));
+        assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
     void assertDecideWhenAllTablesIsBindingTables() {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsJoinQuery()).thenReturn(true);
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        ShardingSQLFederationDecider federationDecider = new 
ShardingSQLFederationDecider();
         ShardingRule shardingRule = createShardingRule();
         ShardingSphereDatabase database = createDatabase();
         when(shardingRule.isAllBindingTables(database, select, 
Arrays.asList("t_order", "t_order_item"))).thenReturn(true);
-        federationDecider.decide(actual, select, Collections.emptyList(), 
mock(ShardingSphereRuleMetaData.class), database, shardingRule);
-        assertThat(actual.getDataNodes().size(), is(4));
-        assertFalse(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertFalse(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database, 
shardingRule, includedDataNodes));
+        assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
     void assertDecideWhenAllTablesIsNotBindingTables() {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsJoinQuery()).thenReturn(true);
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        ShardingSQLFederationDecider federationDecider = new 
ShardingSQLFederationDecider();
         ShardingRule shardingRule = createShardingRule();
         ShardingSphereDatabase database = createDatabase();
         when(shardingRule.isAllBindingTables(database, select, 
Arrays.asList("t_order", "t_order_item"))).thenReturn(false);
-        federationDecider.decide(actual, select, Collections.emptyList(), 
mock(ShardingSphereRuleMetaData.class), database, shardingRule);
-        assertThat(actual.getDataNodes().size(), is(4));
-        assertTrue(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database, 
shardingRule, includedDataNodes));
+        assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
@@ -160,30 +139,28 @@ class ShardingSQLFederationDeciderTest {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsJoinQuery()).thenReturn(true);
         when(select.getPaginationContext().isHasPagination()).thenReturn(true);
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        ShardingSQLFederationDecider federationDecider = new 
ShardingSQLFederationDecider();
         ShardingRule shardingRule = createShardingRule();
         ShardingSphereDatabase database = createDatabase();
         when(shardingRule.isAllBindingTables(database, select, 
Arrays.asList("t_order", "t_order_item"))).thenReturn(false);
-        federationDecider.decide(actual, select, Collections.emptyList(), 
mock(ShardingSphereRuleMetaData.class), database, shardingRule);
-        assertThat(actual.getDataNodes().size(), is(4));
-        assertTrue(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), database, 
shardingRule, includedDataNodes));
+        assertThat(includedDataNodes.size(), is(4));
     }
     
-    private static SelectStatementContext createStatementContext() {
+    private SelectStatementContext createStatementContext() {
         SelectStatementContext result = mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS);
         
when(result.getTablesContext().getTableNames()).thenReturn(Arrays.asList("t_order",
 "t_order_item"));
         when(result.getDatabaseType()).thenReturn(new 
PostgreSQLDatabaseType());
         return result;
     }
     
-    private static ShardingSphereDatabase createDatabase() {
+    private ShardingSphereDatabase createDatabase() {
         ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
         when(result.getName()).thenReturn(DefaultDatabase.LOGIC_NAME);
         return result;
     }
     
-    private static ShardingRule createShardingRule() {
+    private ShardingRule createShardingRule() {
         ShardingRule result = mock(ShardingRule.class);
         when(result.getShardingLogicTableNames(Arrays.asList("t_order", 
"t_order_item"))).thenReturn(Arrays.asList("t_order", "t_order_item"));
         TableRule tableRule = mock(TableRule.class);
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 f5e498e1280..3719c5e906c 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
@@ -21,6 +21,7 @@ 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.config.props.ConfigurationPropertyKey;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.util.SystemSchemaUtils;
@@ -28,6 +29,7 @@ import 
org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPILoader;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -67,13 +69,14 @@ public final class SQLFederationDecideEngine {
         if (isFederationDisabled || !(sqlStatementContext instanceof 
SelectStatementContext)) {
             return false;
         }
-        SQLFederationDeciderContext context = new 
SQLFederationDeciderContext();
+        Collection<DataNode> includedDataNodes = new HashSet<>();
         for (Entry<ShardingSphereRule, SQLFederationDecider> entry : 
deciders.entrySet()) {
-            if (!context.isUseSQLFederation()) {
-                entry.getValue().decide(context, (SelectStatementContext) 
sqlStatementContext, parameters, globalRuleMetaData, database, entry.getKey());
+            boolean isUseSQLFederation = 
entry.getValue().decide((SelectStatementContext) sqlStatementContext, 
parameters, globalRuleMetaData, database, entry.getKey(), includedDataNodes);
+            if (isUseSQLFederation) {
+                return true;
             }
         }
-        return context.isUseSQLFederation();
+        return false;
     }
     
     private boolean isQuerySystemSchema(final SQLStatementContext<?> 
sqlStatementContext, final ShardingSphereDatabase 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 d845cbe058e..cb49fd45ab8 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
@@ -18,12 +18,14 @@
 package org.apache.shardingsphere.infra.binder.decider;
 
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 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.Collection;
 import java.util.List;
 
 /**
@@ -35,15 +37,16 @@ import java.util.List;
 public interface SQLFederationDecider<T extends ShardingSphereRule> extends 
OrderedSPI<T> {
     
     /**
-     * Judge whether to use sql federation engine.
+     * Judge whether to use SQL federation.
      *
-     * @param deciderContext decider context
      * @param selectStatementContext select statement context
      * @param parameters parameters
      * @param globalRuleMetaData global rule meta data
      * @param database database
      * @param rule rule
+     * @param includedDataNodes included data nodes
+     * @return use SQL federation or not
      */
-    void decide(SQLFederationDeciderContext deciderContext, 
SelectStatementContext selectStatementContext,
-                List<Object> parameters, ShardingSphereRuleMetaData 
globalRuleMetaData, ShardingSphereDatabase database, T rule);
+    boolean decide(SelectStatementContext selectStatementContext, List<Object> 
parameters,
+                   ShardingSphereRuleMetaData globalRuleMetaData, 
ShardingSphereDatabase database, T rule, Collection<DataNode> 
includedDataNodes);
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDeciderContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDeciderContext.java
deleted file mode 100644
index 6852319ec1e..00000000000
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/decider/SQLFederationDeciderContext.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.infra.binder.decider;
-
-import lombok.Getter;
-import lombok.Setter;
-import org.apache.shardingsphere.infra.datanode.DataNode;
-
-import java.util.Collection;
-import java.util.LinkedHashSet;
-
-/**
- * SQL federation decider context.
- */
-@Getter
-public final class SQLFederationDeciderContext {
-    
-    private final Collection<DataNode> dataNodes = new LinkedHashSet<>();
-    
-    @Setter
-    private boolean useSQLFederation;
-}
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 69dc5970f70..95c881dcdb8 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,20 +18,21 @@
 package org.apache.shardingsphere.infra.binder.decider.fixture.decider;
 
 import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-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.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 
+import java.util.Collection;
 import java.util.List;
 
 public final class SQLFederationDeciderMatchFixture implements 
SQLFederationDecider<SQLFederationDeciderRuleMatchFixture> {
     
     @Override
-    public void decide(final SQLFederationDeciderContext deciderContext, final 
SelectStatementContext selectStatementContext, final List<Object> parameters,
-                       final ShardingSphereRuleMetaData globalRuleMetaData, 
final ShardingSphereDatabase database, final 
SQLFederationDeciderRuleMatchFixture rule) {
-        deciderContext.setUseSQLFederation(true);
+    public boolean decide(final SelectStatementContext selectStatementContext, 
final List<Object> parameters, final ShardingSphereRuleMetaData 
globalRuleMetaData,
+                          final ShardingSphereDatabase database, final 
SQLFederationDeciderRuleMatchFixture rule, final Collection<DataNode> 
includedDataNodes) {
+        return true;
     }
     
     @Override
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 ffc6f4ce981..48c9cc85ef7 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,19 +18,21 @@
 package org.apache.shardingsphere.infra.binder.decider.fixture.decider;
 
 import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-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.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 
+import java.util.Collection;
 import java.util.List;
 
 public final class SQLFederationDeciderNotMatchFixture implements 
SQLFederationDecider<SQLFederationDeciderRuleNotMatchFixture> {
     
     @Override
-    public void decide(final SQLFederationDeciderContext deciderContext, final 
SelectStatementContext selectStatementContext, final List<Object> parameters,
-                       final ShardingSphereRuleMetaData globalRuleMetaData, 
final ShardingSphereDatabase database, final 
SQLFederationDeciderRuleNotMatchFixture rule) {
+    public boolean decide(final SelectStatementContext selectStatementContext, 
final List<Object> parameters, final ShardingSphereRuleMetaData 
globalRuleMetaData,
+                          final ShardingSphereDatabase database, final 
SQLFederationDeciderRuleNotMatchFixture rule, final Collection<DataNode> 
includedDataNodes) {
+        return false;
     }
     
     @Override
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 22a7f45db57..dac5367f0cc 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,6 @@
 package org.apache.shardingsphere.single.decider;
 
 import org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
-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;
@@ -34,6 +33,7 @@ import org.apache.shardingsphere.single.rule.SingleRule;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Optional;
@@ -44,45 +44,21 @@ import java.util.Optional;
 public final class SingleSQLFederationDecider implements 
SQLFederationDecider<SingleRule> {
     
     @Override
-    public void decide(final SQLFederationDeciderContext deciderContext, final 
SelectStatementContext selectStatementContext, final List<Object> parameters,
-                       final ShardingSphereRuleMetaData globalRuleMetaData, 
final ShardingSphereDatabase database, final SingleRule rule) {
+    public boolean decide(final SelectStatementContext selectStatementContext, 
final List<Object> parameters,
+                          final ShardingSphereRuleMetaData globalRuleMetaData, 
final ShardingSphereDatabase database, final SingleRule rule, final 
Collection<DataNode> includedDataNodes) {
         Collection<QualifiedTable> singleTableNames = 
getSingleTableNames(selectStatementContext, database, rule);
         if (singleTableNames.isEmpty()) {
-            return;
-        }
-        if (containsView(database, singleTableNames)) {
-            deciderContext.setUseSQLFederation(true);
-            return;
-        }
-        
deciderContext.setUseSQLFederation(!isAllTablesInSameDataSource(deciderContext, 
rule, singleTableNames));
-        addTableDataNodes(deciderContext, rule, 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 boolean isAllTablesInSameDataSource(final 
SQLFederationDeciderContext deciderContext, final SingleRule rule, final 
Collection<QualifiedTable> singleTableNames) {
-        if (!rule.isSingleTablesInSameDataSource(singleTableNames)) {
             return false;
         }
-        QualifiedTable sampleTable = singleTableNames.iterator().next();
-        Optional<DataNode> dataNode = 
rule.findSingleTableDataNode(sampleTable.getSchemaName(), 
sampleTable.getTableName());
-        if (!dataNode.isPresent()) {
+        if (containsView(database, singleTableNames)) {
             return true;
         }
-        for (DataNode each : deciderContext.getDataNodes()) {
-            if 
(!each.getDataSourceName().equalsIgnoreCase(dataNode.get().getDataSourceName()))
 {
-                return false;
-            }
-        }
-        return true;
+        boolean isAllTablesInSameDataSource = 
isAllTablesInSameDataSource(includedDataNodes, rule, singleTableNames);
+        includedDataNodes.addAll(getTableDataNodes(rule, singleTableNames));
+        return !isAllTablesInSameDataSource;
     }
     
-    private Collection<QualifiedTable> getSingleTableNames(final 
SQLStatementContext<?> sqlStatementContext,
-                                                           final 
ShardingSphereDatabase database, final SingleRule rule) {
+    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());
         if (result.isEmpty() && sqlStatementContext instanceof IndexAvailable) 
{
@@ -110,6 +86,31 @@ public final class SingleSQLFederationDecider implements 
SQLFederationDecider<Si
         return false;
     }
     
+    private boolean isAllTablesInSameDataSource(final Collection<DataNode> 
includedDataNodes, final SingleRule rule, final Collection<QualifiedTable> 
singleTableNames) {
+        if (!rule.isSingleTablesInSameDataSource(singleTableNames)) {
+            return false;
+        }
+        QualifiedTable sampleTable = singleTableNames.iterator().next();
+        Optional<DataNode> dataNode = 
rule.findSingleTableDataNode(sampleTable.getSchemaName(), 
sampleTable.getTableName());
+        if (!dataNode.isPresent()) {
+            return true;
+        }
+        for (DataNode each : includedDataNodes) {
+            if 
(!each.getDataSourceName().equalsIgnoreCase(dataNode.get().getDataSourceName()))
 {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    private Collection<DataNode> getTableDataNodes(final SingleRule rule, 
final Collection<QualifiedTable> singleTableNames) {
+        Collection<DataNode> result = new HashSet<>();
+        for (QualifiedTable each : singleTableNames) {
+            rule.findSingleTableDataNode(each.getSchemaName(), 
each.getTableName()).ifPresent(result::add);
+        }
+        return result;
+    }
+    
     @Override
     public int getOrder() {
         return SingleOrder.ORDER;
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 6da43c6f676..72e57550f23 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,6 @@
 
 package org.apache.shardingsphere.single.decider;
 
-import 
org.apache.shardingsphere.infra.binder.decider.SQLFederationDeciderContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.database.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
@@ -32,6 +31,7 @@ import org.junit.jupiter.api.Test;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Optional;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -47,13 +47,10 @@ class SingleSQLFederationDeciderTest {
     
     @Test
     void assertDecideWhenNotContainsSingleTable() {
-        SingleSQLFederationDecider federationDecider = new 
SingleSQLFederationDecider();
         SelectStatementContext select = createStatementContext();
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        federationDecider.decide(actual, select, Collections.emptyList(),
-                mock(ShardingSphereRuleMetaData.class), createDatabase(), 
mock(SingleRule.class));
-        assertTrue(actual.getDataNodes().isEmpty());
-        assertFalse(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertFalse(new SingleSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), 
createDatabase(), mock(SingleRule.class), includedDataNodes));
+        assertTrue(includedDataNodes.isEmpty());
     }
     
     @Test
@@ -62,12 +59,9 @@ class SingleSQLFederationDeciderTest {
         SingleRule rule = createSingleRule(qualifiedTables);
         
when(rule.isSingleTablesInSameDataSource(qualifiedTables)).thenReturn(true);
         SelectStatementContext select = createStatementContext();
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        SingleSQLFederationDecider federationDecider = new 
SingleSQLFederationDecider();
-        federationDecider.decide(actual, select, Collections.emptyList(),
-                mock(ShardingSphereRuleMetaData.class), createDatabase(), 
rule);
-        assertThat(actual.getDataNodes().size(), is(2));
-        assertFalse(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertFalse(new SingleSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), 
createDatabase(), rule, includedDataNodes));
+        assertThat(includedDataNodes.size(), is(2));
     }
     
     @Test
@@ -76,12 +70,9 @@ class SingleSQLFederationDeciderTest {
         SingleRule rule = createSingleRule(qualifiedTables);
         
when(rule.isSingleTablesInSameDataSource(qualifiedTables)).thenReturn(false);
         SelectStatementContext select = createStatementContext();
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        SingleSQLFederationDecider federationDecider = new 
SingleSQLFederationDecider();
-        federationDecider.decide(actual, select, Collections.emptyList(),
-                mock(ShardingSphereRuleMetaData.class), createDatabase(), 
rule);
-        assertThat(actual.getDataNodes().size(), is(2));
-        assertTrue(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertTrue(new SingleSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), 
createDatabase(), rule, includedDataNodes));
+        assertThat(includedDataNodes.size(), is(2));
     }
     
     @Test
@@ -90,13 +81,9 @@ class SingleSQLFederationDeciderTest {
         SingleRule rule = createSingleRule(qualifiedTables);
         
when(rule.isSingleTablesInSameDataSource(qualifiedTables)).thenReturn(true);
         SelectStatementContext select = createStatementContext();
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        actual.getDataNodes().add(new DataNode("ds_0", "t_user"));
-        SingleSQLFederationDecider federationDecider = new 
SingleSQLFederationDecider();
-        federationDecider.decide(actual, select, Collections.emptyList(),
-                mock(ShardingSphereRuleMetaData.class), createDatabase(), 
rule);
-        assertThat(actual.getDataNodes().size(), is(3));
-        assertFalse(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new 
HashSet<>(Collections.singleton(new DataNode("ds_0", "t_user")));
+        assertFalse(new SingleSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), 
createDatabase(), rule, includedDataNodes));
+        assertThat(includedDataNodes.size(), is(3));
     }
     
     @Test
@@ -105,13 +92,9 @@ class SingleSQLFederationDeciderTest {
         SingleRule rule = createSingleRule(qualifiedTables);
         
when(rule.isSingleTablesInSameDataSource(qualifiedTables)).thenReturn(true);
         SelectStatementContext select = createStatementContext();
-        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
-        actual.getDataNodes().add(new DataNode("ds_1", "t_user"));
-        SingleSQLFederationDecider federationDecider = new 
SingleSQLFederationDecider();
-        federationDecider.decide(actual, select, Collections.emptyList(),
-                mock(ShardingSphereRuleMetaData.class), createDatabase(), 
rule);
-        assertThat(actual.getDataNodes().size(), is(3));
-        assertTrue(actual.isUseSQLFederation());
+        Collection<DataNode> includedDataNodes = new 
HashSet<>(Collections.singleton(new DataNode("ds_1", "t_user")));
+        assertTrue(new SingleSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(ShardingSphereRuleMetaData.class), 
createDatabase(), rule, includedDataNodes));
+        assertThat(includedDataNodes.size(), is(3));
     }
     
     private SingleRule createSingleRule(final Collection<QualifiedTable> 
qualifiedTables) {


Reply via email to