Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java +4 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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<>(); Loading @@ -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) { Loading Loading @@ -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()); Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/PreparedSQLRouter.java→sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/PreparedSQLRouteEngine.java +10 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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中的参数 Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java +1 −31 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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())); // } // } } sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/router/AbstractBaseRouteSqlTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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>() { Loading Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java +4 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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<>(); Loading @@ -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) { Loading Loading @@ -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()); Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/PreparedSQLRouter.java→sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/PreparedSQLRouteEngine.java +10 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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中的参数 Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java +1 −31 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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())); // } // } }
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/router/AbstractBaseRouteSqlTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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>() { Loading