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 264f000ecc1 Optimize ShardingSQLFederationDecider logic to pass sql 
with same condition to kernel (#35763)
264f000ecc1 is described below

commit 264f000ecc1d0c05e157bc8e8aaeb7d103d0570a
Author: Zhengqiang Duan <duanzhengqi...@apache.org>
AuthorDate: Fri Jun 20 15:30:48 2025 +0800

    Optimize ShardingSQLFederationDecider logic to pass sql with same condition 
to kernel (#35763)
---
 .../decider/ShardingSQLFederationDecider.java      | 33 ++++++++++++++++++++--
 .../decider/ShardingSQLFederationDeciderTest.java  |  1 +
 2 files changed, 31 insertions(+), 3 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 160c40320c0..bcf0e3e1366 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
@@ -28,6 +28,9 @@ import 
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperation
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.sharding.constant.ShardingOrder;
+import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
+import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingConditions;
+import 
org.apache.shardingsphere.sharding.route.engine.condition.engine.ShardingConditionEngine;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import org.apache.shardingsphere.sqlfederation.spi.SQLFederationDecider;
 
@@ -45,23 +48,27 @@ public final class ShardingSQLFederationDecider implements 
SQLFederationDecider<
     public boolean decide(final SQLStatementContext sqlStatementContext, final 
List<Object> parameters,
                           final RuleMetaData globalRuleMetaData, final 
ShardingSphereDatabase database, final ShardingRule rule, final 
Collection<DataNode> includedDataNodes) {
         if (sqlStatementContext instanceof SelectStatementContext) {
-            return decide0((SelectStatementContext) sqlStatementContext, 
database, rule, includedDataNodes);
+            return decide0((SelectStatementContext) sqlStatementContext, 
parameters, globalRuleMetaData, database, rule, includedDataNodes);
         } else if (sqlStatementContext instanceof ExplainStatementContext) {
             ExplainStatementContext explainStatementContext = 
(ExplainStatementContext) sqlStatementContext;
             
ShardingSpherePreconditions.checkState(explainStatementContext.getExplainableSQLStatementContext()
 instanceof SelectStatementContext,
                     () -> new UnsupportedSQLOperationException(
                             String.format("unsupported Explain %s statement in 
sql federation", 
explainStatementContext.getSqlStatement().getExplainableSQLStatement())));
-            return decide0((SelectStatementContext) 
explainStatementContext.getExplainableSQLStatementContext(), database, rule, 
includedDataNodes);
+            return decide0((SelectStatementContext) 
explainStatementContext.getExplainableSQLStatementContext(), parameters, 
globalRuleMetaData, database, rule, includedDataNodes);
         }
         throw new UnsupportedSQLOperationException(String.format("unsupported 
SQL statement %s in sql federation", sqlStatementContext.getSqlStatement()));
     }
     
-    private boolean decide0(final SelectStatementContext 
selectStatementContext, final ShardingSphereDatabase database, final 
ShardingRule rule, final Collection<DataNode> includedDataNodes) {
+    private boolean decide0(final SelectStatementContext 
selectStatementContext, final List<Object> parameters, final RuleMetaData 
globalRuleMetaData, final ShardingSphereDatabase database,
+                            final ShardingRule rule, final 
Collection<DataNode> includedDataNodes) {
         Collection<String> tableNames = 
rule.getShardingLogicTableNames(selectStatementContext.getTablesContext().getTableNames());
         if (tableNames.isEmpty()) {
             return false;
         }
         includedDataNodes.addAll(getTableDataNodes(rule, database, 
tableNames));
+        if (isAllShardingTables(selectStatementContext, tableNames) && 
isAllSameShardingConditions(selectStatementContext, parameters, 
globalRuleMetaData, database, rule)) {
+            return false;
+        }
         if (selectStatementContext.isContainsSubquery() || 
selectStatementContext.isContainsHaving()
                 || selectStatementContext.isContainsCombine() || 
selectStatementContext.isContainsPartialDistinctAggregation()) {
             return true;
@@ -75,6 +82,26 @@ public final class ShardingSQLFederationDecider implements 
SQLFederationDecider<
         return tableNames.size() > 1 && 
!rule.isBindingTablesUseShardingColumnsJoin(selectStatementContext, tableNames);
     }
     
+    private boolean isAllSameShardingConditions(final SelectStatementContext 
selectStatementContext, final List<Object> parameters, final RuleMetaData 
globalRuleMetaData,
+                                                final ShardingSphereDatabase 
database, final ShardingRule rule) {
+        ShardingConditions shardingConditions = 
createShardingConditions(selectStatementContext, parameters, 
globalRuleMetaData, database, rule);
+        return shardingConditions.isSameShardingCondition();
+    }
+    
+    private boolean isAllShardingTables(final SelectStatementContext 
selectStatementContext, final Collection<String> tableNames) {
+        return tableNames.size() == 
selectStatementContext.getTablesContext().getTableNames().size();
+    }
+    
+    private ShardingConditions createShardingConditions(final 
SelectStatementContext selectStatementContext, final List<Object> parameters, 
final RuleMetaData globalRuleMetaData,
+                                                        final 
ShardingSphereDatabase database, final ShardingRule rule) {
+        List<ShardingCondition> shardingConditions = new 
ShardingConditionEngine(globalRuleMetaData, database, 
rule).createShardingConditions(selectStatementContext, parameters);
+        ShardingConditions result = new ShardingConditions(shardingConditions, 
selectStatementContext, rule);
+        if (result.isNeedMerge()) {
+            result.merge();
+        }
+        return result;
+    }
+    
     private boolean isSelfJoinWithoutShardingColumn(final 
SelectStatementContext selectStatementContext, final ShardingRule rule, final 
Collection<String> tableNames) {
         return 1 == tableNames.size() && 
selectStatementContext.isContainsJoinQuery() && 
!rule.isBindingTablesUseShardingColumnsJoin(selectStatementContext, tableNames);
     }
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 1c9428c7878..59387e8f9c4 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
@@ -194,6 +194,7 @@ class ShardingSQLFederationDeciderTest {
         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"));
+        
when(result.getSubqueryContexts().values()).thenReturn(Collections.emptyList());
         return result;
     }
     

Reply via email to