diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilder.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilder.java index bbf2b52cc3b2e829e410f1a62648eeea3bb9f9ea..34c7b4467c3487ab6a683936a3844b6fec74cd0a 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilder.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilder.java @@ -96,7 +96,7 @@ public class SQLBuilder { * @param label 占位符 * @param token 实际的值 */ - public void buildSQL(final String label, final String token) { + public void amend(final String label, final String token) { if (!tokenMap.containsKey(label)) { return; } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java index f2633e0eb0911dfa10a1fb3b5411344453a9a01c..e096111b724d23952547203edeb013d7aca6324c 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java @@ -139,4 +139,22 @@ public final class SQLRewriteEngine { int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition(); sqlBuilder.append(originalSQL.substring(beginPosition, endPosition)); } + + /** + * 修订SQL和参数. + * + * @param parameters 参数 + */ + public void amend(final List parameters) { + if (limit.getOffsetParameterIndex() > -1) { + parameters.set(limit.getOffsetParameterIndex(), limit.getOffset()); + } else { + sqlBuilder.amend(OffsetLimitToken.OFFSET_NAME, String.valueOf(limit.getOffset())); + } + if (limit.getRowCountParameterIndex() > -1) { + parameters.set(limit.getRowCountParameterIndex(), limit.getRowCount()); + } else { + sqlBuilder.amend(RowCountLimitToken.COUNT_NAME, String.valueOf(limit.getRowCount())); + } + } } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java index afac2c998393239fff20ce1bc3a82444b21fd24f..d1cc5fbd29ce8097024906b9fee87f7abb51a1ad 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java @@ -26,17 +26,13 @@ import com.dangdang.ddframe.rdb.sharding.parsing.SQLParsingEngine; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ConditionContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.DeleteSQLContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.InsertSQLContext; -import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.LimitContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLContext; 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.parsing.parser.context.UpdateSQLContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException; -import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.OffsetLimitToken; -import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.RowCountLimitToken; 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; @@ -135,7 +131,9 @@ public final class SQLRouteEngine { RoutingResult routingResult = routeSQL(sqlContext.getConditionContext(), sqlContext, parameters); SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(logicSQL, sqlContext); result.getExecutionUnits().addAll(routingResult.getSQLExecutionUnits(sqlRewriteEngine.rewrite())); - amendSQLAccordingToRouteResult(parameters, result, sqlRewriteEngine); + if (null != sqlContext.getLimitContext() && 1 == result.getExecutionUnits().size()) { + sqlRewriteEngine.amend(parameters); + } MetricsContext.stop(context); log.debug("final route result is {} target", result.getExecutionUnits().size()); for (SQLExecutionUnit each : result.getExecutionUnits()) { @@ -165,21 +163,21 @@ public final class SQLRouteEngine { return new MixedTablesRouter(shardingRule, parameters, logicTables, conditionContext, sqlContext.getType()).route(); } - private void amendSQLAccordingToRouteResult(final List parameters, final SQLRouteResult sqlRouteResult, final SQLRewriteEngine sqlRewriteEngine) { - LimitContext limit = sqlRouteResult.getSqlContext().getLimitContext(); - SQLBuilder sqlBuilder = sqlRewriteEngine.rewrite(); - if (null == limit || 1 != sqlRouteResult.getExecutionUnits().size()) { - return; - } - if (limit.getOffsetParameterIndex() > -1) { - parameters.set(limit.getOffsetParameterIndex(), limit.getOffset()); - } else { - sqlBuilder.buildSQL(OffsetLimitToken.OFFSET_NAME, String.valueOf(limit.getOffset())); - } - if (limit.getRowCountParameterIndex() > -1) { - parameters.set(limit.getRowCountParameterIndex(), limit.getRowCount()); - } else { - sqlBuilder.buildSQL(RowCountLimitToken.COUNT_NAME, String.valueOf(limit.getRowCount())); - } - } +// private void amendSQLAccordingToRouteResult(final List parameters, final SQLRouteResult sqlRouteResult, final SQLRewriteEngine sqlRewriteEngine) { +// LimitContext limit = sqlRouteResult.getSqlContext().getLimitContext(); +// SQLBuilder sqlBuilder = sqlRewriteEngine.rewrite(); +// if (null == limit || 1 != sqlRouteResult.getExecutionUnits().size()) { +// return; +// } +// if (limit.getOffsetParameterIndex() > -1) { +// parameters.set(limit.getOffsetParameterIndex(), limit.getOffset()); +// } else { +// sqlBuilder.amend(OffsetLimitToken.OFFSET_NAME, String.valueOf(limit.getOffset())); +// } +// if (limit.getRowCountParameterIndex() > -1) { +// parameters.set(limit.getRowCountParameterIndex(), limit.getRowCount()); +// } else { +// sqlBuilder.amend(RowCountLimitToken.COUNT_NAME, String.valueOf(limit.getRowCount())); +// } +// } }