This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 422c4bca025 Refactor RouteSQLRewriteEngine (#31893)
422c4bca025 is described below
commit 422c4bca025ed6bbe1a7b11a0662288fc7f1f989
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Jun 27 15:17:02 2024 +0800
Refactor RouteSQLRewriteEngine (#31893)
---
.../rewrite/engine/RouteSQLRewriteEngine.java | 67 ++++++++++++----------
1 file changed, 37 insertions(+), 30 deletions(-)
diff --git
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
index 00d9daf110b..2ac5c96181c 100644
---
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
+++
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.infra.rewrite.engine;
import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
@@ -49,6 +50,7 @@ import java.util.Map.Entry;
/**
* Route SQL rewrite engine.
*/
+@HighFrequencyInvocation
@RequiredArgsConstructor
public final class RouteSQLRewriteEngine {
@@ -67,16 +69,43 @@ public final class RouteSQLRewriteEngine {
* @return SQL rewrite result
*/
public RouteSQLRewriteResult rewrite(final SQLRewriteContext
sqlRewriteContext, final RouteContext routeContext, final QueryContext
queryContext) {
- Map<RouteUnit, SQLRewriteUnit> sqlRewriteUnits = new
LinkedHashMap<>(routeContext.getRouteUnits().size(), 1F);
+ return new RouteSQLRewriteResult(translate(queryContext,
createSQLRewriteUnits(sqlRewriteContext, routeContext)));
+ }
+
+ private Map<RouteUnit, SQLRewriteUnit> createSQLRewriteUnits(final
SQLRewriteContext sqlRewriteContext, final RouteContext routeContext) {
+ Map<RouteUnit, SQLRewriteUnit> result = new
LinkedHashMap<>(routeContext.getRouteUnits().size(), 1F);
for (Entry<String, Collection<RouteUnit>> entry :
aggregateRouteUnitGroups(routeContext.getRouteUnits()).entrySet()) {
Collection<RouteUnit> routeUnits = entry.getValue();
if
(isNeedAggregateRewrite(sqlRewriteContext.getSqlStatementContext(),
routeUnits)) {
- sqlRewriteUnits.put(routeUnits.iterator().next(),
createSQLRewriteUnit(sqlRewriteContext, routeContext, routeUnits));
+ result.put(routeUnits.iterator().next(),
createSQLRewriteUnit(sqlRewriteContext, routeContext, routeUnits));
} else {
- addSQLRewriteUnits(sqlRewriteUnits, sqlRewriteContext,
routeContext, routeUnits);
+ for (RouteUnit each : routeUnits) {
+ result.put(each, createSQLRewriteUnit(sqlRewriteContext,
routeContext, each));
+ }
}
}
- return new RouteSQLRewriteResult(translate(queryContext,
sqlRewriteUnits));
+ return result;
+ }
+
+ private Map<String, Collection<RouteUnit>> aggregateRouteUnitGroups(final
Collection<RouteUnit> routeUnits) {
+ Map<String, Collection<RouteUnit>> result = new
LinkedHashMap<>(routeUnits.size(), 1F);
+ for (RouteUnit each : routeUnits) {
+ result.computeIfAbsent(each.getDataSourceMapper().getActualName(),
unused -> new LinkedList<>()).add(each);
+ }
+ return result;
+ }
+
+ private boolean isNeedAggregateRewrite(final SQLStatementContext
sqlStatementContext, final Collection<RouteUnit> routeUnits) {
+ if (!(sqlStatementContext instanceof SelectStatementContext) || 1 ==
routeUnits.size()) {
+ return false;
+ }
+ SelectStatementContext statementContext = (SelectStatementContext)
sqlStatementContext;
+ boolean containsSubqueryJoinQuery =
statementContext.isContainsSubquery() || statementContext.isContainsJoinQuery();
+ boolean containsOrderByLimitClause =
!statementContext.getOrderByContext().getItems().isEmpty() ||
statementContext.getPaginationContext().isHasPagination();
+ boolean containsLockClause =
statementContext.getSqlStatement().getLock().isPresent();
+ boolean result = !containsSubqueryJoinQuery &&
!containsOrderByLimitClause && !containsLockClause;
+ statementContext.setNeedAggregateRewrite(result);
+ return result;
}
private SQLRewriteUnit createSQLRewriteUnit(final SQLRewriteContext
sqlRewriteContext, final RouteContext routeContext, final Collection<RouteUnit>
routeUnits) {
@@ -94,34 +123,12 @@ public final class RouteSQLRewriteEngine {
return new SQLRewriteUnit(String.join(" UNION ALL ", sql), params);
}
- private void addSQLRewriteUnits(final Map<RouteUnit, SQLRewriteUnit>
sqlRewriteUnits, final SQLRewriteContext sqlRewriteContext,
- final RouteContext routeContext, final
Collection<RouteUnit> routeUnits) {
- for (RouteUnit each : routeUnits) {
- sqlRewriteUnits.put(each, new SQLRewriteUnit(new
RouteSQLBuilder(sqlRewriteContext.getSql(), sqlRewriteContext.getSqlTokens(),
each).toSQL(),
- getParameters(sqlRewriteContext.getParameterBuilder(),
routeContext, each)));
- }
- }
-
- private boolean isNeedAggregateRewrite(final SQLStatementContext
sqlStatementContext, final Collection<RouteUnit> routeUnits) {
- if (!(sqlStatementContext instanceof SelectStatementContext) ||
routeUnits.size() == 1) {
- return false;
- }
- SelectStatementContext statementContext = (SelectStatementContext)
sqlStatementContext;
- boolean containsSubqueryJoinQuery =
statementContext.isContainsSubquery() || statementContext.isContainsJoinQuery();
- boolean containsOrderByLimitClause =
!statementContext.getOrderByContext().getItems().isEmpty() ||
statementContext.getPaginationContext().isHasPagination();
- boolean containsLockClause =
statementContext.getSqlStatement().getLock().isPresent();
- boolean needAggregateRewrite = !containsSubqueryJoinQuery &&
!containsOrderByLimitClause && !containsLockClause;
- statementContext.setNeedAggregateRewrite(needAggregateRewrite);
- return needAggregateRewrite;
+ private SQLRewriteUnit createSQLRewriteUnit(final SQLRewriteContext
sqlRewriteContext, final RouteContext routeContext, final RouteUnit routeUnit) {
+ return new SQLRewriteUnit(getActualSQL(sqlRewriteContext, routeUnit),
getParameters(sqlRewriteContext.getParameterBuilder(), routeContext,
routeUnit));
}
- private Map<String, Collection<RouteUnit>> aggregateRouteUnitGroups(final
Collection<RouteUnit> routeUnits) {
- Map<String, Collection<RouteUnit>> result = new
LinkedHashMap<>(routeUnits.size(), 1F);
- for (RouteUnit each : routeUnits) {
- String dataSourceName = each.getDataSourceMapper().getActualName();
- result.computeIfAbsent(dataSourceName, unused -> new
LinkedList<>()).add(each);
- }
- return result;
+ private String getActualSQL(final SQLRewriteContext sqlRewriteContext,
final RouteUnit routeUnit) {
+ return new RouteSQLBuilder(sqlRewriteContext.getSql(),
sqlRewriteContext.getSqlTokens(), routeUnit).toSQL();
}
private List<Object> getParameters(final ParameterBuilder paramBuilder,
final RouteContext routeContext, final RouteUnit routeUnit) {