Commit 57769207 authored by terrymanu's avatar terrymanu
Browse files

remove SQLBuilder from field of SQLRewriteEngine

parent 2ede57ec
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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 {
+3 −11
Original line number Diff line number Diff line
@@ -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());
@@ -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);
@@ -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 {
+9 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -53,6 +55,7 @@ import java.util.Set;
@Slf4j
public final class RouteEngine {
    
    @Getter
    private final ShardingRule shardingRule;
    
    private final DatabaseType databaseType;
@@ -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());
+5 −2
Original line number Diff line number Diff line
@@ -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;

@@ -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路由.
     *
+2 −1
Original line number Diff line number Diff line
@@ -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