Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingStatement.java +1 −1 Original line number Diff line number Diff line Loading @@ -275,7 +275,7 @@ public class ShardingStatement extends AbstractStatementAdapter { private StatementExecutor generateExecutor(final String sql) throws SQLException { StatementExecutor result = new StatementExecutor(shardingConnection.getShardingContext().getExecutorEngine()); SQLRouteResult sqlRouteResult = new SQLRouter(shardingConnection.getShardingContext().getRouteEngine()).route(sql); SQLRouteResult sqlRouteResult = new SQLRouter(shardingConnection.getShardingContext()).route(sql); if (sqlRouteResult.getSqlContext() instanceof InsertSQLContext) { generatedKeyContext = ((InsertSQLContext) sqlRouteResult.getSqlContext()).getGeneratedKeyContext(); } else { Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java +3 −11 Original line number Diff line number Diff line Loading @@ -49,8 +49,6 @@ public final class SQLRewriteEngine { private final LimitContext limit; private SQLBuilder sqlBuilder; public SQLRewriteEngine(final String originalSQL, final SQLContext sqlContext) { this.originalSQL = originalSQL; sqlTokens.addAll(sqlContext.getSqlTokens()); Loading @@ -66,13 +64,6 @@ public final class SQLRewriteEngine { * @return SQL构建器 */ public SQLBuilder rewrite() { if (null == sqlBuilder) { sqlBuilder = rewriteInternal(); } return sqlBuilder; } private SQLBuilder rewriteInternal() { SQLBuilder result = new SQLBuilder(); if (sqlTokens.isEmpty()) { result.append(originalSQL); Loading Loading @@ -143,9 +134,10 @@ public final class SQLRewriteEngine { /** * 修订SQL和参数. * * @param sqlBuilder SQL构建器 * @param parameters 参数 */ public void amend(final List<Object> parameters) { public void amend(final SQLBuilder sqlBuilder, final List<Object> parameters) { if (limit.getOffsetParameterIndex() > -1) { parameters.set(limit.getOffsetParameterIndex(), limit.getOffset()); } else { Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/RouteEngine.java +9 −5 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SelectSQLContext import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableContext; import com.dangdang.ddframe.rdb.sharding.rewrite.DerivedColumnUtils; import com.dangdang.ddframe.rdb.sharding.rewrite.GenerateKeysUtils; import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder; import com.dangdang.ddframe.rdb.sharding.rewrite.SQLRewriteEngine; import com.dangdang.ddframe.rdb.sharding.router.binding.BindingTablesRouter; import com.dangdang.ddframe.rdb.sharding.router.database.DatabaseRouter; Loading @@ -38,6 +39,7 @@ import com.dangdang.ddframe.rdb.sharding.router.single.SingleTableRouter; import com.google.common.base.Function; import com.google.common.collect.Collections2; import com.google.common.collect.Sets; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; Loading @@ -53,6 +55,7 @@ import java.util.Set; @Slf4j public final class RouteEngine { @Getter private final ShardingRule shardingRule; private final DatabaseType databaseType; Loading @@ -72,20 +75,21 @@ public final class RouteEngine { if (result instanceof SelectSQLContext) { DerivedColumnUtils.appendDerivedColumns((SelectSQLContext) result); } if (null != result.getLimitContext()) { result.getLimitContext().processParameters(parameters); } return result; } SQLRouteResult route(final String logicSQL, final SQLContext sqlContext, final List<Object> parameters) { Context context = MetricsContext.start("Route SQL"); if (null != sqlContext.getLimitContext()) { sqlContext.getLimitContext().processParameters(parameters); } SQLRouteResult result = new SQLRouteResult(sqlContext); RoutingResult routingResult = route(sqlContext.getConditionContext(), sqlContext, parameters); SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(logicSQL, sqlContext); result.getExecutionUnits().addAll(routingResult.getSQLExecutionUnits(rewriteEngine.rewrite())); SQLBuilder sqlBuilder = rewriteEngine.rewrite(); result.getExecutionUnits().addAll(routingResult.getSQLExecutionUnits(sqlBuilder)); if (null != sqlContext.getLimitContext() && 1 == result.getExecutionUnits().size()) { rewriteEngine.amend(parameters); rewriteEngine.amend(sqlBuilder, parameters); } MetricsContext.stop(context); log.debug("final route result is {} target", result.getExecutionUnits().size()); Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouter.java +5 −2 Original line number Diff line number Diff line Loading @@ -17,8 +17,8 @@ package com.dangdang.ddframe.rdb.sharding.router; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLContext; import lombok.RequiredArgsConstructor; import java.util.Collections; Loading @@ -27,11 +27,14 @@ import java.util.Collections; * * @author zhangiang */ @RequiredArgsConstructor public final class SQLRouter { private final RouteEngine routeEngine; public SQLRouter(final ShardingContext shardingContext) { routeEngine = shardingContext.getRouteEngine(); } /** * SQL路由. * Loading sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/router/AbstractBaseRouteSqlTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -75,7 +75,8 @@ public abstract class AbstractBaseRouteSqlTest { protected void assertMultipleTargetsWithoutParameter( final String originSql, final int expectedSize, final Collection<String> targetDataSources, final Collection<String> targetSQLs) { SQLRouteResult actual = new SQLRouter(new RouteEngine(getShardingRule(), DatabaseType.MySQL)).route(originSql); ShardingContext shardingContext = new ShardingContext(getShardingRule(), new RouteEngine(getShardingRule(), DatabaseType.MySQL), null); SQLRouteResult actual = new SQLRouter(shardingContext).route(originSql); assertThat(actual.getExecutionUnits().size(), is(expectedSize)); Set<String> actualDataSources = new HashSet<>(Collections2.transform(actual.getExecutionUnits(), new Function<SQLExecutionUnit, String>() { Loading Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingStatement.java +1 −1 Original line number Diff line number Diff line Loading @@ -275,7 +275,7 @@ public class ShardingStatement extends AbstractStatementAdapter { private StatementExecutor generateExecutor(final String sql) throws SQLException { StatementExecutor result = new StatementExecutor(shardingConnection.getShardingContext().getExecutorEngine()); SQLRouteResult sqlRouteResult = new SQLRouter(shardingConnection.getShardingContext().getRouteEngine()).route(sql); SQLRouteResult sqlRouteResult = new SQLRouter(shardingConnection.getShardingContext()).route(sql); if (sqlRouteResult.getSqlContext() instanceof InsertSQLContext) { generatedKeyContext = ((InsertSQLContext) sqlRouteResult.getSqlContext()).getGeneratedKeyContext(); } else { Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java +3 −11 Original line number Diff line number Diff line Loading @@ -49,8 +49,6 @@ public final class SQLRewriteEngine { private final LimitContext limit; private SQLBuilder sqlBuilder; public SQLRewriteEngine(final String originalSQL, final SQLContext sqlContext) { this.originalSQL = originalSQL; sqlTokens.addAll(sqlContext.getSqlTokens()); Loading @@ -66,13 +64,6 @@ public final class SQLRewriteEngine { * @return SQL构建器 */ public SQLBuilder rewrite() { if (null == sqlBuilder) { sqlBuilder = rewriteInternal(); } return sqlBuilder; } private SQLBuilder rewriteInternal() { SQLBuilder result = new SQLBuilder(); if (sqlTokens.isEmpty()) { result.append(originalSQL); Loading Loading @@ -143,9 +134,10 @@ public final class SQLRewriteEngine { /** * 修订SQL和参数. * * @param sqlBuilder SQL构建器 * @param parameters 参数 */ public void amend(final List<Object> parameters) { public void amend(final SQLBuilder sqlBuilder, final List<Object> parameters) { if (limit.getOffsetParameterIndex() > -1) { parameters.set(limit.getOffsetParameterIndex(), limit.getOffset()); } else { Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/RouteEngine.java +9 −5 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SelectSQLContext import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableContext; import com.dangdang.ddframe.rdb.sharding.rewrite.DerivedColumnUtils; import com.dangdang.ddframe.rdb.sharding.rewrite.GenerateKeysUtils; import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder; import com.dangdang.ddframe.rdb.sharding.rewrite.SQLRewriteEngine; import com.dangdang.ddframe.rdb.sharding.router.binding.BindingTablesRouter; import com.dangdang.ddframe.rdb.sharding.router.database.DatabaseRouter; Loading @@ -38,6 +39,7 @@ import com.dangdang.ddframe.rdb.sharding.router.single.SingleTableRouter; import com.google.common.base.Function; import com.google.common.collect.Collections2; import com.google.common.collect.Sets; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; Loading @@ -53,6 +55,7 @@ import java.util.Set; @Slf4j public final class RouteEngine { @Getter private final ShardingRule shardingRule; private final DatabaseType databaseType; Loading @@ -72,20 +75,21 @@ public final class RouteEngine { if (result instanceof SelectSQLContext) { DerivedColumnUtils.appendDerivedColumns((SelectSQLContext) result); } if (null != result.getLimitContext()) { result.getLimitContext().processParameters(parameters); } return result; } SQLRouteResult route(final String logicSQL, final SQLContext sqlContext, final List<Object> parameters) { Context context = MetricsContext.start("Route SQL"); if (null != sqlContext.getLimitContext()) { sqlContext.getLimitContext().processParameters(parameters); } SQLRouteResult result = new SQLRouteResult(sqlContext); RoutingResult routingResult = route(sqlContext.getConditionContext(), sqlContext, parameters); SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(logicSQL, sqlContext); result.getExecutionUnits().addAll(routingResult.getSQLExecutionUnits(rewriteEngine.rewrite())); SQLBuilder sqlBuilder = rewriteEngine.rewrite(); result.getExecutionUnits().addAll(routingResult.getSQLExecutionUnits(sqlBuilder)); if (null != sqlContext.getLimitContext() && 1 == result.getExecutionUnits().size()) { rewriteEngine.amend(parameters); rewriteEngine.amend(sqlBuilder, parameters); } MetricsContext.stop(context); log.debug("final route result is {} target", result.getExecutionUnits().size()); Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouter.java +5 −2 Original line number Diff line number Diff line Loading @@ -17,8 +17,8 @@ package com.dangdang.ddframe.rdb.sharding.router; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLContext; import lombok.RequiredArgsConstructor; import java.util.Collections; Loading @@ -27,11 +27,14 @@ import java.util.Collections; * * @author zhangiang */ @RequiredArgsConstructor public final class SQLRouter { private final RouteEngine routeEngine; public SQLRouter(final ShardingContext shardingContext) { routeEngine = shardingContext.getRouteEngine(); } /** * SQL路由. * Loading
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/router/AbstractBaseRouteSqlTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -75,7 +75,8 @@ public abstract class AbstractBaseRouteSqlTest { protected void assertMultipleTargetsWithoutParameter( final String originSql, final int expectedSize, final Collection<String> targetDataSources, final Collection<String> targetSQLs) { SQLRouteResult actual = new SQLRouter(new RouteEngine(getShardingRule(), DatabaseType.MySQL)).route(originSql); ShardingContext shardingContext = new ShardingContext(getShardingRule(), new RouteEngine(getShardingRule(), DatabaseType.MySQL), null); SQLRouteResult actual = new SQLRouter(shardingContext).route(originSql); assertThat(actual.getExecutionUnits().size(), is(expectedSize)); Set<String> actualDataSources = new HashSet<>(Collections2.transform(actual.getExecutionUnits(), new Function<SQLExecutionUnit, String>() { Loading