Commit c33a09b7 authored by terrymanu's avatar terrymanu
Browse files

add limit to rewrite module

parent fb77124c
Loading
Loading
Loading
Loading
+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.");
        }
    }
}
+5 −1
Original line number Diff line number Diff line
@@ -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构建器
     */
+0 −18
Original line number Diff line number Diff line
@@ -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();
+4 −0
Original line number Diff line number Diff line
@@ -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;
    }