提交 c33a09b7 编写于 作者: T terrymanu

add limit to rewrite module

上级 fb77124c
/*
* 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.");
}
}
}
......@@ -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;
......@@ -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) {
......@@ -54,10 +57,11 @@ public final class SQLRewriteEngine {
for (TableContext each : sqlContext.getTables()) {
tableNames.add(each.getName());
}
limit = sqlContext.getLimitContext();
}
/**
* SQL写.
* SQL写.
*
* @return SQL构建器
*/
......
......@@ -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;
......@@ -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();
......
......@@ -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;
......@@ -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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册