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