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

zhangliang 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 940540af1d0 Add more test cases on ShardingSQLFederationDecider 
(#33712)
940540af1d0 is described below

commit 940540af1d0332012863fec2b02cd6d462d411ee
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Nov 18 20:16:43 2024 +0800

    Add more test cases on ShardingSQLFederationDecider (#33712)
---
 .../decider/ShardingSQLFederationDecider.java      |  11 +-
 .../shardingsphere/sharding/rule/ShardingRule.java |   1 +
 .../decider/ShardingSQLFederationDeciderTest.java  | 200 +++++++++++----------
 3 files changed, 119 insertions(+), 93 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 436be746662..9f7e6ad6126 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
@@ -44,7 +44,7 @@ public final class ShardingSQLFederationDecider implements 
SQLFederationDecider<
         if (tableNames.isEmpty()) {
             return false;
         }
-        includedDataNodes.addAll(getTableDataNodes(rule, tableNames, 
database));
+        includedDataNodes.addAll(getTableDataNodes(rule, database, 
tableNames));
         if (selectStatementContext.isContainsSubquery() || 
selectStatementContext.isContainsHaving()
                 || selectStatementContext.isContainsCombine() || 
selectStatementContext.isContainsPartialDistinctAggregation()) {
             return true;
@@ -52,13 +52,18 @@ public final class ShardingSQLFederationDecider implements 
SQLFederationDecider<
         if (!selectStatementContext.isContainsJoinQuery() || 
rule.isAllTablesInSameDataSource(tableNames)) {
             return false;
         }
-        if (1 == tableNames.size() && 
selectStatementContext.isContainsJoinQuery() && 
!rule.isAllBindingTables(database, selectStatementContext, tableNames)) {
+        if (isSelfJoinWithoutShardingColumn(selectStatementContext, rule, 
database, tableNames)) {
             return true;
         }
         return tableNames.size() > 1 && !rule.isAllBindingTables(database, 
selectStatementContext, tableNames);
     }
     
-    private Collection<DataNode> getTableDataNodes(final ShardingRule rule, 
final Collection<String> tableNames, final ShardingSphereDatabase database) {
+    private boolean isSelfJoinWithoutShardingColumn(final 
SelectStatementContext selectStatementContext,
+                                                    final ShardingRule rule, 
final ShardingSphereDatabase database, final Collection<String> tableNames) {
+        return 1 == tableNames.size() && 
selectStatementContext.isContainsJoinQuery() && 
!rule.isAllBindingTables(database, selectStatementContext, tableNames);
+    }
+    
+    private Collection<DataNode> getTableDataNodes(final ShardingRule rule, 
final ShardingSphereDatabase database, final Collection<String> tableNames) {
         Collection<DataNode> result = new HashSet<>();
         for (String each : tableNames) {
             rule.findShardingTable(each).ifPresent(optional -> 
result.addAll(new 
DataNodes(database.getRuleMetaData().getRules()).getDataNodes(each)));
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
index ffeb6588265..bc2160bd4c5 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
@@ -338,6 +338,7 @@ public final class ShardingRule implements DatabaseRule {
      * @param logicTableNames logic table names
      * @return whether logic table is all binding tables
      */
+    // TODO rename the method name, add sharding condition judgement in method 
name @duanzhengqiang
     public boolean isAllBindingTables(final ShardingSphereDatabase database, 
final SQLStatementContext sqlStatementContext, final Collection<String> 
logicTableNames) {
         if (!(sqlStatementContext instanceof SelectStatementContext && 
((SelectStatementContext) sqlStatementContext).isContainsJoinQuery())) {
             return isAllBindingTables(logicTableNames);
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 81b63babb01..2cd9d471b2f 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
@@ -18,16 +18,19 @@
 package org.apache.shardingsphere.sharding.decider;
 
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
-import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.DataNodeRuleAttribute;
+import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sharding.rule.BindingTableRule;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import org.apache.shardingsphere.sharding.rule.ShardingTable;
+import org.apache.shardingsphere.sqlfederation.spi.SQLFederationDecider;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
@@ -46,158 +49,175 @@ import static org.mockito.Mockito.when;
 
 class ShardingSQLFederationDeciderTest {
     
+    private ShardingSQLFederationDecider decider;
+    
+    @BeforeEach
+    void setUp() {
+        decider = (ShardingSQLFederationDecider) 
OrderedSPILoader.getServicesByClass(SQLFederationDecider.class, 
Collections.singleton(ShardingRule.class)).get(ShardingRule.class);
+    }
+    
     @Test
-    void assertDecideWhenNotContainsShardingTable() {
+    void assertDecideWithoutShardingTable() {
         ShardingRule rule = mock(ShardingRule.class);
-        when(rule.getShardingLogicTableNames(Arrays.asList("t_order", 
"t_order_item"))).thenReturn(Collections.emptyList());
-        
when(rule.findShardingTable("t_order")).thenReturn(Optional.of(mock(ShardingTable.class)));
-        
when(rule.findShardingTable("t_order_item")).thenReturn(Optional.of(mock(ShardingTable.class)));
+        when(rule.getShardingLogicTableNames(Arrays.asList("foo_tbl", 
"bar_tbl"))).thenReturn(Collections.emptyList());
+        
when(rule.findShardingTable("foo_tbl")).thenReturn(Optional.of(mock(ShardingTable.class)));
+        
when(rule.findShardingTable("bar_tbl")).thenReturn(Optional.of(mock(ShardingTable.class)));
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertFalse(new ShardingSQLFederationDecider().decide(
-                createStatementContext(), Collections.emptyList(), 
mock(RuleMetaData.class), mock(ShardingSphereDatabase.class), rule, 
includedDataNodes));
+        assertFalse(decider.decide(createSQLStatementContext(), 
Collections.emptyList(), mock(RuleMetaData.class), 
mock(ShardingSphereDatabase.class), rule, includedDataNodes));
         assertTrue(includedDataNodes.isEmpty());
     }
     
     @Test
-    void assertDecideWhenContainsSameShardingCondition() {
-        SelectStatementContext select = createStatementContext();
-        when(select.isContainsSubquery()).thenReturn(true);
+    void assertDecideWithSubquery() {
+        SelectStatementContext sqlStatementContext = 
createSQLStatementContext();
+        when(sqlStatementContext.isContainsSubquery()).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        ShardingRule shardingRule = createShardingRule();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
+        ShardingRule rule = createShardingRule();
+        assertTrue(decider.decide(sqlStatementContext, 
Collections.emptyList(), mock(RuleMetaData.class), createDatabase(rule), rule, 
includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
-    void assertDecideWhenContainsSubquery() {
-        SelectStatementContext select = createStatementContext();
-        when(select.isContainsSubquery()).thenReturn(true);
+    void assertDecideWithHaving() {
+        SelectStatementContext sqlStatementContext = 
createSQLStatementContext();
+        when(sqlStatementContext.isContainsHaving()).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        ShardingRule shardingRule = createShardingRule();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
+        ShardingRule rule = createShardingRule();
+        assertTrue(decider.decide(sqlStatementContext, 
Collections.emptyList(), mock(RuleMetaData.class), createDatabase(rule), rule, 
includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
-    void assertDecideWhenContainsHaving() {
-        SelectStatementContext select = createStatementContext();
-        when(select.isContainsHaving()).thenReturn(true);
+    void assertDecideWithCombine() {
+        SelectStatementContext sqlStatementContext = 
createSQLStatementContext();
+        when(sqlStatementContext.isContainsCombine()).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        ShardingRule shardingRule = createShardingRule();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
+        ShardingRule rule = createShardingRule();
+        assertTrue(decider.decide(sqlStatementContext, 
Collections.emptyList(), mock(RuleMetaData.class), createDatabase(rule), rule, 
includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
-    void assertDecideWhenContainsCombine() {
-        SelectStatementContext select = createStatementContext();
-        when(select.isContainsCombine()).thenReturn(true);
+    void assertDecideWithPartialDistinctAggregation() {
+        SelectStatementContext sqlStatementContext = 
createSQLStatementContext();
+        
when(sqlStatementContext.isContainsPartialDistinctAggregation()).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        ShardingRule shardingRule = createShardingRule();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
+        ShardingRule rule = createShardingRule();
+        assertTrue(decider.decide(sqlStatementContext, 
Collections.emptyList(), mock(RuleMetaData.class), createDatabase(rule), rule, 
includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
-    void assertDecideWhenContainsPartialDistinctAggregation() {
-        SelectStatementContext select = createStatementContext();
-        when(select.isContainsPartialDistinctAggregation()).thenReturn(true);
+    void assertDecideWithoutJoinQuery() {
+        SelectStatementContext sqlStatementContext = 
createSQLStatementContext();
+        ShardingRule rule = createShardingRule();
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        ShardingRule shardingRule = createShardingRule();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
+        assertFalse(decider.decide(sqlStatementContext, 
Collections.emptyList(), mock(RuleMetaData.class), createDatabase(rule), rule, 
includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
-    void assertDecideWhenAllTablesInSameDataSource() {
-        SelectStatementContext select = createStatementContext();
-        when(select.isContainsJoinQuery()).thenReturn(true);
-        ShardingRule shardingRule = createShardingRule();
-        when(shardingRule.isAllTablesInSameDataSource(Arrays.asList("t_order", 
"t_order_item"))).thenReturn(true);
+    void assertDecideWithAllTablesInSameDataSource() {
+        SelectStatementContext sqlStatementContext = 
createSQLStatementContext();
+        when(sqlStatementContext.isContainsJoinQuery()).thenReturn(true);
+        ShardingRule rule = createShardingRule();
+        ShardingSphereDatabase database = createDatabase(rule);
+        when(rule.isAllTablesInSameDataSource(Arrays.asList("foo_tbl", 
"bar_tbl"))).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertFalse(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
+        assertFalse(decider.decide(sqlStatementContext, 
Collections.emptyList(), mock(RuleMetaData.class), database, rule, 
includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
     @Test
-    void assertDecideWhenAllTablesIsBindingTables() {
-        SelectStatementContext select = createStatementContext();
-        when(select.isContainsJoinQuery()).thenReturn(true);
-        ShardingRule shardingRule = createShardingRule();
-        ShardingSphereDatabase database = createDatabase(shardingRule);
-        when(shardingRule.isAllBindingTables(database, select, 
Arrays.asList("t_order", "t_order_item"))).thenReturn(true);
+    void assertDecideWithSelfJoinWithoutShardingColumn() {
+        SelectStatementContext sqlStatementContext = 
createSQLStatementContext();
+        
when(sqlStatementContext.getTablesContext().getTableNames()).thenReturn(Collections.singleton("foo_tbl"));
+        when(sqlStatementContext.isContainsJoinQuery()).thenReturn(true);
+        ShardingRule rule = createShardingRule();
+        
when(rule.getShardingLogicTableNames(Collections.singleton("foo_tbl"))).thenReturn(Collections.singleton("foo_tbl"));
+        ShardingSphereDatabase database = createDatabase(rule);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertFalse(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), database, shardingRule, 
includedDataNodes));
-        assertThat(includedDataNodes.size(), is(4));
+        assertTrue(decider.decide(sqlStatementContext, 
Collections.emptyList(), mock(RuleMetaData.class), database, rule, 
includedDataNodes));
+        assertThat(includedDataNodes.size(), is(2));
     }
     
     @Test
-    void assertDecideWhenAllTablesIsNotBindingTables() {
-        SelectStatementContext select = createStatementContext();
-        when(select.isContainsJoinQuery()).thenReturn(true);
-        ShardingRule shardingRule = createShardingRule();
-        ShardingSphereDatabase database = createDatabase(shardingRule);
-        when(shardingRule.isAllBindingTables(database, select, 
Arrays.asList("t_order", "t_order_item"))).thenReturn(false);
+    void assertDecideWithNotSelfJoin() {
+        SelectStatementContext sqlStatementContext = 
createSQLStatementContext();
+        
when(sqlStatementContext.getTablesContext().getTableNames()).thenReturn(Collections.singleton("foo_tbl"));
+        ShardingRule rule = createShardingRule();
+        
when(rule.getShardingLogicTableNames(Collections.singleton("foo_tbl"))).thenReturn(Collections.singleton("foo_tbl"));
+        ShardingSphereDatabase database = createDatabase(rule);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), database, shardingRule, 
includedDataNodes));
-        assertThat(includedDataNodes.size(), is(4));
+        assertFalse(decider.decide(sqlStatementContext, 
Collections.emptyList(), mock(RuleMetaData.class), database, rule, 
includedDataNodes));
+        assertThat(includedDataNodes.size(), is(2));
     }
     
     @Test
-    void assertDecideWhenContainsOnlyOneTable() {
-        SelectStatementContext select = createStatementContext();
-        
when(select.getTablesContext().getTableNames()).thenReturn(Collections.singletonList("t_order"));
-        when(select.isContainsJoinQuery()).thenReturn(true);
-        ShardingRule shardingRule = createShardingRule();
-        
when(shardingRule.getShardingLogicTableNames(Collections.singletonList("t_order"))).thenReturn(Collections.singletonList("t_order"));
-        ShardingSphereDatabase database = createDatabase(shardingRule);
-        when(shardingRule.isAllBindingTables(database, select, 
Collections.singletonList("t_order"))).thenReturn(false);
+    void assertDecideWithSelfJoinAndShardingColumn() {
+        SelectStatementContext sqlStatementContext = 
createSQLStatementContext();
+        
when(sqlStatementContext.getTablesContext().getTableNames()).thenReturn(Collections.singleton("foo_tbl"));
+        when(sqlStatementContext.isContainsJoinQuery()).thenReturn(true);
+        ShardingRule rule = createShardingRule();
+        
when(rule.getShardingLogicTableNames(Collections.singleton("foo_tbl"))).thenReturn(Collections.singleton("foo_tbl"));
+        ShardingSphereDatabase database = createDatabase(rule);
+        when(rule.isAllBindingTables(database, sqlStatementContext, 
Collections.singleton("foo_tbl"))).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), database, shardingRule, 
includedDataNodes));
+        assertFalse(decider.decide(sqlStatementContext, 
Collections.emptyList(), mock(RuleMetaData.class), database, rule, 
includedDataNodes));
         assertThat(includedDataNodes.size(), is(2));
     }
     
     @Test
-    void assertDecideWhenAllTablesIsNotBindingTablesAndContainsPagination() {
-        SelectStatementContext select = createStatementContext();
-        when(select.isContainsJoinQuery()).thenReturn(true);
-        when(select.getPaginationContext().isHasPagination()).thenReturn(true);
-        ShardingRule shardingRule = createShardingRule();
-        ShardingSphereDatabase database = createDatabase(shardingRule);
-        when(shardingRule.isAllBindingTables(database, select, 
Arrays.asList("t_order", "t_order_item"))).thenReturn(false);
+    void assertDecideWithAllBindingTables() {
+        SelectStatementContext sqlStatementContext = 
createSQLStatementContext();
+        when(sqlStatementContext.isContainsJoinQuery()).thenReturn(true);
+        ShardingRule rule = createShardingRule();
+        ShardingSphereDatabase database = createDatabase(rule);
+        when(rule.isAllBindingTables(database, sqlStatementContext, 
Arrays.asList("foo_tbl", "bar_tbl"))).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), database, shardingRule, 
includedDataNodes));
+        assertFalse(decider.decide(sqlStatementContext, 
Collections.emptyList(), mock(RuleMetaData.class), database, rule, 
includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
-    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(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
-        return result;
+    @Test
+    void assertDecideWithNotAllBindingTables() {
+        SelectStatementContext sqlStatementContext = 
createSQLStatementContext();
+        when(sqlStatementContext.isContainsJoinQuery()).thenReturn(true);
+        ShardingRule rule = createShardingRule();
+        ShardingSphereDatabase database = createDatabase(rule);
+        Collection<DataNode> includedDataNodes = new HashSet<>();
+        assertTrue(decider.decide(sqlStatementContext, 
Collections.emptyList(), mock(RuleMetaData.class), database, rule, 
includedDataNodes));
+        assertThat(includedDataNodes.size(), is(4));
     }
     
-    private ShardingSphereDatabase createDatabase(final ShardingRule 
shardingRule) {
-        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        when(result.getName()).thenReturn(DefaultDatabase.LOGIC_NAME);
-        
when(result.getRuleMetaData().getRules()).thenReturn(Collections.singletonList(shardingRule));
+    private SelectStatementContext createSQLStatementContext() {
+        SelectStatementContext result = mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS);
+        
when(result.getTablesContext().getTableNames()).thenReturn(Arrays.asList("foo_tbl",
 "bar_tbl"));
+        
when(result.getDatabaseType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
         return result;
     }
     
     private ShardingRule createShardingRule() {
         ShardingRule result = mock(ShardingRule.class, RETURNS_DEEP_STUBS);
-        when(result.getShardingLogicTableNames(Arrays.asList("t_order", 
"t_order_item"))).thenReturn(Arrays.asList("t_order", "t_order_item"));
+        when(result.getShardingLogicTableNames(Arrays.asList("foo_tbl", 
"bar_tbl"))).thenReturn(Arrays.asList("foo_tbl", "bar_tbl"));
         DataNodeRuleAttribute dataNodeRuleAttribute = 
mock(DataNodeRuleAttribute.class);
-        
when(result.getAttributes().findAttribute(DataNodeRuleAttribute.class)).thenReturn(Optional.of(dataNodeRuleAttribute));
-        
when(dataNodeRuleAttribute.getDataNodesByTableName("t_order")).thenReturn(Arrays.asList(new
 DataNode("ds_0", "t_order"), new DataNode("ds_1", "t_order")));
-        
when(dataNodeRuleAttribute.getDataNodesByTableName("t_order_item")).thenReturn(Arrays.asList(new
 DataNode("ds_0", "t_order_item"), new DataNode("ds_1", "t_order_item")));
-        
when(result.findShardingTable("t_order")).thenReturn(Optional.of(mock(ShardingTable.class)));
-        
when(result.findShardingTable("t_order_item")).thenReturn(Optional.of(mock(ShardingTable.class)));
+        
when(dataNodeRuleAttribute.getDataNodesByTableName("foo_tbl")).thenReturn(Arrays.asList(new
 DataNode("ds_0", "foo_tbl"), new DataNode("ds_1", "foo_tbl")));
+        
when(dataNodeRuleAttribute.getDataNodesByTableName("bar_tbl")).thenReturn(Arrays.asList(new
 DataNode("ds_0", "bar_tbl"), new DataNode("ds_1", "bar_tbl")));
+        when(result.getAttributes()).thenReturn(new 
RuleAttributes(dataNodeRuleAttribute));
+        
when(result.findShardingTable("foo_tbl")).thenReturn(Optional.of(mock(ShardingTable.class)));
+        
when(result.findShardingTable("bar_tbl")).thenReturn(Optional.of(mock(ShardingTable.class)));
         BindingTableRule bindingTableRule = mock(BindingTableRule.class);
-        when(bindingTableRule.hasLogicTable("t_order")).thenReturn(true);
-        when(bindingTableRule.hasLogicTable("t_order_item")).thenReturn(true);
-        
when(result.findBindingTableRule("t_order")).thenReturn(Optional.of(bindingTableRule));
-        
when(result.findBindingTableRule("t_order_item")).thenReturn(Optional.of(bindingTableRule));
+        when(bindingTableRule.hasLogicTable("foo_tbl")).thenReturn(true);
+        when(bindingTableRule.hasLogicTable("bar_tbl")).thenReturn(true);
+        
when(result.findBindingTableRule("foo_tbl")).thenReturn(Optional.of(bindingTableRule));
+        
when(result.findBindingTableRule("bar_tbl")).thenReturn(Optional.of(bindingTableRule));
+        return result;
+    }
+    
+    private ShardingSphereDatabase createDatabase(final ShardingRule rule) {
+        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        when(result.getName()).thenReturn("foo_db");
+        when(result.getRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.singleton(rule)));
         return result;
     }
 }

Reply via email to