You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ch...@apache.org on 2025/03/18 11:17:28 UTC

(shardingsphere) branch master updated: Fix merging sharding conditions of same table in binding rule (#35029)

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

chengzhang 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 705c10752ac Fix merging sharding conditions of same table in binding rule (#35029)
705c10752ac is described below

commit 705c10752acd98578c8409c276cad2b0dc84eaf7
Author: ZhangCheng <ch...@apache.org>
AuthorDate: Tue Mar 18 19:17:20 2025 +0800

    Fix merging sharding conditions of same table in binding rule (#35029)
---
 .../route/engine/condition/ShardingConditions.java |  2 +-
 .../engine/condition/ShardingConditionsTest.java   | 24 ++++++++++++++++++++--
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/ShardingConditions.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/ShardingConditions.java
index 29c6d6794e6..55b774b1822 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/ShardingConditions.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/ShardingConditions.java
@@ -204,7 +204,7 @@ public final class ShardingConditions {
     
     private boolean isBindingTable(final ShardingRule shardingRule, final ShardingConditionValue shardingValue1, final ShardingConditionValue shardingValue2) {
         Optional<BindingTableRule> bindingRule = shardingRule.findBindingTableRule(shardingValue1.getTableName());
-        return bindingRule.isPresent() && bindingRule.get().hasLogicTable(shardingValue2.getTableName());
+        return bindingRule.isPresent() && !shardingValue1.getTableName().equals(shardingValue2.getTableName()) && bindingRule.get().hasLogicTable(shardingValue2.getTableName());
     }
     
     private boolean isSameShardingConditionValue(final ShardingRule shardingRule, final ShardingConditionValue shardingValue1, final ShardingConditionValue shardingValue2) {
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/ShardingConditionsTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/ShardingConditionsTest.java
index aa9c9c21b75..722f2261610 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/ShardingConditionsTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/ShardingConditionsTest.java
@@ -21,19 +21,23 @@ import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementCont
 import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.sharding.route.engine.condition.value.ListShardingConditionValue;
 import org.apache.shardingsphere.sharding.route.engine.condition.value.ShardingConditionValue;
+import org.apache.shardingsphere.sharding.rule.BindingTableRule;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import org.apache.shardingsphere.sharding.rule.ShardingTable;
 import org.junit.jupiter.api.Test;
 
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.is;
-import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 class ShardingConditionsTest {
     
@@ -73,6 +77,18 @@ class ShardingConditionsTest {
         assertThat(multipleShardingConditions.getConditions().size(), is(2));
     }
     
+    @Test
+    void assertMergeWithBindingTables() {
+        ShardingRule shardingRule = mock(ShardingRule.class);
+        BindingTableRule bindingShardingRule = new BindingTableRule();
+        bindingShardingRule.getShardingTables().put("t_order", mock(ShardingTable.class));
+        bindingShardingRule.getShardingTables().put("t_order_item", mock(ShardingTable.class));
+        when(shardingRule.findBindingTableRule("t_order")).thenReturn(Optional.of(bindingShardingRule));
+        ShardingConditions multipleShardingConditions = createMultipleShardingConditions(shardingRule);
+        multipleShardingConditions.merge();
+        assertThat(multipleShardingConditions.getConditions().size(), is(2));
+    }
+    
     private ShardingConditions createSingleShardingConditions() {
         List<ShardingCondition> result = new LinkedList<>();
         ShardingConditionValue shardingConditionValue = new ListShardingConditionValue<>("order_id", "t_order", Collections.singleton(1L));
@@ -84,6 +100,10 @@ class ShardingConditionsTest {
     }
     
     private ShardingConditions createMultipleShardingConditions() {
+        return createMultipleShardingConditions(mock(ShardingRule.class));
+    }
+    
+    private ShardingConditions createMultipleShardingConditions(final ShardingRule shardingRule) {
         List<ShardingCondition> result = new LinkedList<>();
         ShardingConditionValue shardingConditionValue1 = new ListShardingConditionValue<>("user_id", "t_order", Collections.singleton(1L));
         ShardingConditionValue shardingConditionValue2 = new ListShardingConditionValue<>("order_id", "t_order", Collections.singleton(1L));
@@ -94,6 +114,6 @@ class ShardingConditionsTest {
         result.add(shardingCondition);
         result.add(shardingCondition2);
         SelectStatementContext sqlStatementContext = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
-        return new ShardingConditions(result, sqlStatementContext, mock(ShardingRule.class));
+        return new ShardingConditions(result, sqlStatementContext, shardingRule);
     }
 }