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);
}
}