Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/LimitUtils.java 0 → 100644 +49 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <p> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * </p> */ package com.dangdang.ddframe.rdb.sharding.rewrite; 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.exception.SQLParsingException; import java.util.List; /** * 补列工具类. * * @author zhangliang */ public final class LimitUtils { /** * 追加分页. * * @param sqlContext SQL上下文 * @param parameters 参数 */ public static void appendLimit(final SQLContext sqlContext, final List<Object> parameters) { int offset = -1 == sqlContext.getLimitContext().getOffsetParameterIndex() ? sqlContext.getLimitContext().getOffset() : (int) parameters.get(sqlContext.getLimitContext().getOffsetParameterIndex()); int rowCount = -1 == sqlContext.getLimitContext().getRowCountParameterIndex() ? sqlContext.getLimitContext().getRowCount() : (int) parameters.get(sqlContext.getLimitContext().getRowCountParameterIndex()); sqlContext.setLimitContext(new LimitContext(offset, rowCount, sqlContext.getLimitContext().getOffsetParameterIndex(), sqlContext.getLimitContext().getRowCountParameterIndex())); if (offset < 0 || rowCount < 0) { throw new SQLParsingException("LIMIT offset and row count can not be a negative value."); } } } sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java +5 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.dangdang.ddframe.rdb.sharding.rewrite; 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.TableContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.ItemsToken; Loading Loading @@ -46,6 +47,8 @@ public final class SQLRewriteEngine { private final Collection<String> tableNames = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); private final LimitContext limit; private SQLBuilder sqlBuilder; public SQLRewriteEngine(final String originalSQL, final SQLContext sqlContext) { Loading @@ -54,10 +57,11 @@ public final class SQLRewriteEngine { for (TableContext each : sqlContext.getTables()) { tableNames.add(each.getName()); } limit = sqlContext.getLimitContext(); } /** * SQL重写. * SQL改写. * * @return SQL构建器 */ Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/PreparedSQLRouter.java +0 −18 Original line number Diff line number Diff line Loading @@ -21,9 +21,7 @@ import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule; 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.LimitContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException; import com.google.common.base.Optional; import lombok.RequiredArgsConstructor; Loading Loading @@ -61,25 +59,9 @@ public class PreparedSQLRouter { List<Number> generatedIds = generateId(); parameters.addAll(generatedIds); } // TODO 提炼至rewrite模块 setLimit(parameters); return engine.routeSQL(logicSql, sqlContext, parameters); } private void setLimit(final List<Object> parameters) { if (null == sqlContext.getLimitContext()) { return; } int offset = -1 == sqlContext.getLimitContext().getOffsetParameterIndex() ? sqlContext.getLimitContext().getOffset() : (int) parameters.get(sqlContext.getLimitContext().getOffsetParameterIndex()); int rowCount = -1 == sqlContext.getLimitContext().getRowCountParameterIndex() ? sqlContext.getLimitContext().getRowCount() : (int) parameters.get(sqlContext.getLimitContext().getRowCountParameterIndex()); sqlContext.setLimitContext(new LimitContext(offset, rowCount, sqlContext.getLimitContext().getOffsetParameterIndex(), sqlContext.getLimitContext().getRowCountParameterIndex())); if (offset < 0 || rowCount < 0) { throw new SQLParsingException("LIMIT offset and row count can not be a negative value."); } } private List<Number> generateId() { if (!(sqlContext instanceof InsertSQLContext)) { return Collections.emptyList(); Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java +4 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ 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.LimitUtils; 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; Loading Loading @@ -102,6 +103,9 @@ public final class SQLRouteEngine { if (result instanceof SelectSQLContext) { DerivedColumnUtils.appendDerivedColumns((SelectSQLContext) result); } if (null != result.getLimitContext()) { LimitUtils.appendLimit(result, parameters); } return result; } Loading Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/LimitUtils.java 0 → 100644 +49 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <p> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * </p> */ package com.dangdang.ddframe.rdb.sharding.rewrite; 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.exception.SQLParsingException; import java.util.List; /** * 补列工具类. * * @author zhangliang */ public final class LimitUtils { /** * 追加分页. * * @param sqlContext SQL上下文 * @param parameters 参数 */ public static void appendLimit(final SQLContext sqlContext, final List<Object> parameters) { int offset = -1 == sqlContext.getLimitContext().getOffsetParameterIndex() ? sqlContext.getLimitContext().getOffset() : (int) parameters.get(sqlContext.getLimitContext().getOffsetParameterIndex()); int rowCount = -1 == sqlContext.getLimitContext().getRowCountParameterIndex() ? sqlContext.getLimitContext().getRowCount() : (int) parameters.get(sqlContext.getLimitContext().getRowCountParameterIndex()); sqlContext.setLimitContext(new LimitContext(offset, rowCount, sqlContext.getLimitContext().getOffsetParameterIndex(), sqlContext.getLimitContext().getRowCountParameterIndex())); if (offset < 0 || rowCount < 0) { throw new SQLParsingException("LIMIT offset and row count can not be a negative value."); } } }
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java +5 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.dangdang.ddframe.rdb.sharding.rewrite; 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.TableContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.ItemsToken; Loading Loading @@ -46,6 +47,8 @@ public final class SQLRewriteEngine { private final Collection<String> tableNames = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); private final LimitContext limit; private SQLBuilder sqlBuilder; public SQLRewriteEngine(final String originalSQL, final SQLContext sqlContext) { Loading @@ -54,10 +57,11 @@ public final class SQLRewriteEngine { for (TableContext each : sqlContext.getTables()) { tableNames.add(each.getName()); } limit = sqlContext.getLimitContext(); } /** * SQL重写. * SQL改写. * * @return SQL构建器 */ Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/PreparedSQLRouter.java +0 −18 Original line number Diff line number Diff line Loading @@ -21,9 +21,7 @@ import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule; 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.LimitContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLContext; import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException; import com.google.common.base.Optional; import lombok.RequiredArgsConstructor; Loading Loading @@ -61,25 +59,9 @@ public class PreparedSQLRouter { List<Number> generatedIds = generateId(); parameters.addAll(generatedIds); } // TODO 提炼至rewrite模块 setLimit(parameters); return engine.routeSQL(logicSql, sqlContext, parameters); } private void setLimit(final List<Object> parameters) { if (null == sqlContext.getLimitContext()) { return; } int offset = -1 == sqlContext.getLimitContext().getOffsetParameterIndex() ? sqlContext.getLimitContext().getOffset() : (int) parameters.get(sqlContext.getLimitContext().getOffsetParameterIndex()); int rowCount = -1 == sqlContext.getLimitContext().getRowCountParameterIndex() ? sqlContext.getLimitContext().getRowCount() : (int) parameters.get(sqlContext.getLimitContext().getRowCountParameterIndex()); sqlContext.setLimitContext(new LimitContext(offset, rowCount, sqlContext.getLimitContext().getOffsetParameterIndex(), sqlContext.getLimitContext().getRowCountParameterIndex())); if (offset < 0 || rowCount < 0) { throw new SQLParsingException("LIMIT offset and row count can not be a negative value."); } } private List<Number> generateId() { if (!(sqlContext instanceof InsertSQLContext)) { return Collections.emptyList(); Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java +4 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ 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.LimitUtils; 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; Loading Loading @@ -102,6 +103,9 @@ public final class SQLRouteEngine { if (result instanceof SelectSQLContext) { DerivedColumnUtils.appendDerivedColumns((SelectSQLContext) result); } if (null != result.getLimitContext()) { LimitUtils.appendLimit(result, parameters); } return result; } Loading