Commit d9605b76 authored by terrymanu's avatar terrymanu
Browse files

refactor router

parent b4179c23
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import com.dangdang.ddframe.rdb.sharding.jdbc.adapter.AbstractPreparedStatementA
import com.dangdang.ddframe.rdb.sharding.merger.ResultSetFactory;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.GeneratedKeyContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.InsertSQLContext;
import com.dangdang.ddframe.rdb.sharding.router.PreparedSQLRouter;
import com.dangdang.ddframe.rdb.sharding.router.PreparedSQLRouteEngine;
import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit;
import com.dangdang.ddframe.rdb.sharding.router.SQLRouteResult;
import com.google.common.base.Optional;
@@ -46,7 +46,7 @@ import java.util.Objects;
 */
public final class ShardingPreparedStatement extends AbstractPreparedStatementAdapter {
    
    private final PreparedSQLRouter preparedSQLRouter;
    private final PreparedSQLRouteEngine preparedSQLRouteEngine;
    
    private final List<PreparedStatementExecutorWrapper> cachedPreparedStatementWrappers = new ArrayList<>();
    
@@ -70,7 +70,7 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd
    ShardingPreparedStatement(final ShardingConnection shardingConnection, 
            final String sql, final int resultSetType, final int resultSetConcurrency, final int resultSetHoldability) {
        super(shardingConnection, resultSetType, resultSetConcurrency, resultSetHoldability);
        preparedSQLRouter = shardingConnection.getShardingContext().getSqlRouteEngine().prepareSQL(sql);
        preparedSQLRouteEngine = new PreparedSQLRouteEngine(sql, shardingConnection.getShardingContext());
    }
    
    ShardingPreparedStatement(final ShardingConnection shardingConnection, final String sql, final int autoGeneratedKeys) {
@@ -160,7 +160,7 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd
    
    private List<PreparedStatementExecutorWrapper> routeSQL() throws SQLException {
        List<PreparedStatementExecutorWrapper> result = new ArrayList<>();
        SQLRouteResult sqlRouteResult = preparedSQLRouter.route(getParameters());
        SQLRouteResult sqlRouteResult = preparedSQLRouteEngine.route(getParameters());
        setSqlContext(sqlRouteResult.getSqlContext());
        if (sqlRouteResult.getSqlContext() instanceof InsertSQLContext) {
            setGeneratedKeyContext(((InsertSQLContext) sqlRouteResult.getSqlContext()).getGeneratedKeyContext());
+10 −5
Original line number Diff line number Diff line
@@ -19,23 +19,22 @@ package com.dangdang.ddframe.rdb.sharding.router;

import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule;
import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.GeneratedKeyContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.InsertSQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLContext;
import com.google.common.base.Optional;
import lombok.RequiredArgsConstructor;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 预解析功能的SQL路由.
 * 预解析的SQL路由引擎..
 * 
 * @author gaohongtao
 */
@RequiredArgsConstructor
public class PreparedSQLRouter {
public final class PreparedSQLRouteEngine {
    
    private final String logicSql;
    
@@ -45,8 +44,14 @@ public class PreparedSQLRouter {
    
    private SQLContext sqlContext;
    
    public PreparedSQLRouteEngine(final String logicSql, final ShardingContext shardingContext) {
        this.logicSql = logicSql;
        engine = shardingContext.getSqlRouteEngine();
        shardingRule = shardingContext.getShardingRule();
    }
    
    /**
     * 使用参数进行SQL路由.
     * SQL路由.
     * 当第一次路由时进行SQL解析,之后的路由复用第一次的解析结果.
     * 
     * @param parameters SQL中的参数
+1 −31
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ 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.rewrite.DerivedColumnUtils;
import com.dangdang.ddframe.rdb.sharding.rewrite.GenerateKeysUtils;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLRewriteEngine;
@@ -68,22 +67,11 @@ public final class SQLRouteEngine {
     *
     * @param logicSQL 逻辑SQL
     * @return 路由结果
     * @throws SQLParsingException SQL解析失败异常
     */
    public SQLRouteResult route(final String logicSQL) throws SQLParsingException {
    public SQLRouteResult route(final String logicSQL) {
        return routeSQL(logicSQL, parseSQL(logicSQL, Collections.emptyList()), Collections.emptyList());
    }
    
    /**
     * 预解析SQL路由.
     * 
     * @param logicSql 逻辑SQL
     * @return 预解析SQL路由器
     */
    public PreparedSQLRouter prepareSQL(final String logicSql) {
        return new PreparedSQLRouter(logicSql, this, shardingRule);
    }
    
    SQLContext parseSQL(final String logicSql, final List<Object> parameters) {
        if (HintManagerHolder.isDatabaseShardingOnly()) {
            return buildHintParsedResult(logicSql);
@@ -162,22 +150,4 @@ public final class SQLRouteEngine {
        // TODO 可配置是否执行笛卡尔积
        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.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()));
//        }
//    }
}
+3 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule;
import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy;
import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy;
import com.dangdang.ddframe.rdb.sharding.constant.DatabaseType;
import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingContext;
import com.dangdang.ddframe.rdb.sharding.router.fixture.OrderAttrShardingAlgorithm;
import com.dangdang.ddframe.rdb.sharding.router.fixture.OrderShardingAlgorithm;
import com.google.common.base.Function;
@@ -100,7 +101,8 @@ public abstract class AbstractBaseRouteSqlTest {
    
    protected void assertMultipleTargetsWithParameters(
            final String originSql, final List<Object> parameters, final int expectedSize, final Collection<String> targetDataSources, final Collection<String> targetSQLs) {
        SQLRouteResult actual = new SQLRouteEngine(getShardingRule(), DatabaseType.MySQL).prepareSQL(originSql).route(parameters);
        ShardingContext shardingContext = new ShardingContext(getShardingRule(), new SQLRouteEngine(getShardingRule(), DatabaseType.MySQL), null);
        SQLRouteResult actual = new PreparedSQLRouteEngine(originSql, shardingContext).route(parameters);
        assertThat(actual.getExecutionUnits().size(), is(expectedSize));
        Set<String> actualDataSources = new HashSet<>(Collections2.transform(actual.getExecutionUnits(), new Function<SQLExecutionUnit, String>() {