Commit f65638bc authored by terrymanu's avatar terrymanu
Browse files

refactor amend for rewrite module

parent 90083bac
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
        }
+18 −0
Original line number Diff line number Diff line
@@ -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()));
        }
    }
}
+20 −22
Original line number Diff line number Diff line
@@ -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<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()));
//        }
//    }
}