Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilder.java +1 −1 Original line number Diff line number Diff line Loading @@ -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; } Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java +18 −0 Original line number Diff line number Diff line Loading @@ -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<Object> 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())); } } } sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java +20 −22 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()) { Loading Loading @@ -165,21 +163,21 @@ public final class SQLRouteEngine { return new MixedTablesRouter(shardingRule, parameters, logicTables, conditionContext, sqlContext.getType()).route(); } private void amendSQLAccordingToRouteResult(final List<Object> 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<Object> 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())); // } // } } Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilder.java +1 −1 Original line number Diff line number Diff line Loading @@ -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; } Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java +18 −0 Original line number Diff line number Diff line Loading @@ -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<Object> 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())); } } }
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java +20 −22 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()) { Loading Loading @@ -165,21 +163,21 @@ public final class SQLRouteEngine { return new MixedTablesRouter(shardingRule, parameters, logicTables, conditionContext, sqlContext.getType()).route(); } private void amendSQLAccordingToRouteResult(final List<Object> 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<Object> 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())); // } // } }