Commit b5be563d authored by terrymanu's avatar terrymanu
Browse files

refactor limit

parent e40449e7
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -27,8 +27,8 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.Limit;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.LimitValue;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatement;
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.parsing.parser.token.OffsetToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.RowCountToken;

/**
 * MySQL解析器.
@@ -74,7 +74,7 @@ public final class MySQLParser extends SQLParser {
            return getLimitWithOffset(sqlStatement, parametersIndex, valueIndex, valueBeginPosition, value, isParameterForValue);
        }
        if (!isParameterForValue) {
            sqlStatement.getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
            sqlStatement.getSqlTokens().add(new RowCountToken(valueBeginPosition, value));
        }
        Limit result = new Limit(true);
        result.setRowCount(new LimitValue(value, valueIndex));
@@ -100,10 +100,10 @@ public final class MySQLParser extends SQLParser {
        }
        getLexer().nextToken();
        if (!isParameterForValue) {
            sqlStatement.getSqlTokens().add(new OffsetLimitToken(valueBeginPosition, value));
            sqlStatement.getSqlTokens().add(new OffsetToken(valueBeginPosition, value));
        }
        if (!isParameterForRowCount) {
            sqlStatement.getSqlTokens().add(new RowCountLimitToken(rowCountBeginPosition, rowCount));
            sqlStatement.getSqlTokens().add(new RowCountToken(rowCountBeginPosition, rowCount));
        }
        Limit result = new Limit(true);
        result.setRowCount(new LimitValue(rowCount, rowCountIndex));
@@ -130,10 +130,10 @@ public final class MySQLParser extends SQLParser {
        }
        getLexer().nextToken();
        if (!isParameterForOffset) {
            sqlStatement.getSqlTokens().add(new OffsetLimitToken(offsetBeginPosition, offset));
            sqlStatement.getSqlTokens().add(new OffsetToken(offsetBeginPosition, offset));
        }
        if (!isParameterForValue) {
            sqlStatement.getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
            sqlStatement.getSqlTokens().add(new RowCountToken(valueBeginPosition, value));
        }
        Limit result = new Limit(true);
        result.setRowCount(new LimitValue(value, valueIndex));
+15 −15
Original line number Diff line number Diff line
@@ -27,8 +27,8 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.LimitValue
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.AbstractSelectParser;
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.parsing.parser.token.OffsetToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.RowCountToken;
import com.google.common.base.Optional;

import static com.dangdang.ddframe.rdb.sharding.util.NumberUtil.roundHalfUp;
@@ -71,18 +71,18 @@ public class PostgreSQLSelectParser extends AbstractSelectParser {
    }
    
    private void parseLimit() {
        Optional<LimitValue> offsetLimit = Optional.absent();
        Optional<LimitValue> rowCountLimit = Optional.absent();
        Optional<LimitValue> offset = Optional.absent();
        Optional<LimitValue> rowCount = Optional.absent();
        while (true) {
            if (getSqlParser().skipIfEqual(PostgreSQLKeyword.LIMIT)) {
                rowCountLimit = buildRowCount();
                rowCount = buildRowCount();
            } else if (getSqlParser().skipIfEqual(PostgreSQLKeyword.OFFSET)) {
                offsetLimit = buildOffsetLimit();
                offset = buildOffset();
            } else {
                break;
            }
        }
        setLimit(offsetLimit, rowCountLimit);
        setLimit(offset, rowCount);
    }
    
    private Optional<LimitValue> buildRowCount() {
@@ -96,7 +96,7 @@ public class PostgreSQLSelectParser extends AbstractSelectParser {
            if (getSqlParser().equalAny(Literals.INT, Literals.FLOAT)) {
                rowCount = roundHalfUp(getSqlParser().getLexer().getCurrentToken().getLiterals());
                valueBeginPosition = valueBeginPosition - (rowCount + "").length();
                getSelectStatement().getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, rowCount));
                getSelectStatement().getSqlTokens().add(new RowCountToken(valueBeginPosition, rowCount));
            } else if (getSqlParser().equalAny(Symbol.QUESTION)) {
                rowCountParameterIndex = parameterIndex++;
                setParametersIndex(parameterIndex);
@@ -109,7 +109,7 @@ public class PostgreSQLSelectParser extends AbstractSelectParser {
        return Optional.of(new LimitValue(rowCount, rowCountParameterIndex));
    }
    
    private Optional<LimitValue> buildOffsetLimit() {
    private Optional<LimitValue> buildOffset() {
        int parameterIndex = getParametersIndex();
        int offset = -1;
        int offsetParameterIndex = -1;
@@ -117,7 +117,7 @@ public class PostgreSQLSelectParser extends AbstractSelectParser {
        if (getSqlParser().equalAny(Literals.INT, Literals.FLOAT)) {
            offset = roundHalfUp(getSqlParser().getLexer().getCurrentToken().getLiterals());
            offsetBeginPosition = offsetBeginPosition - (offset + "").length();
            getSelectStatement().getSqlTokens().add(new OffsetLimitToken(offsetBeginPosition, offset));
            getSelectStatement().getSqlTokens().add(new OffsetToken(offsetBeginPosition, offset));
        } else if (getSqlParser().equalAny(Symbol.QUESTION)) {
            offsetParameterIndex = parameterIndex++;
            setParametersIndex(parameterIndex);
@@ -130,13 +130,13 @@ public class PostgreSQLSelectParser extends AbstractSelectParser {
    }
    
    
    private void setLimit(final Optional<LimitValue> offsetLimit, final Optional<LimitValue> rowCountLimit) {
    private void setLimit(final Optional<LimitValue> offset, final Optional<LimitValue> rowCount) {
        Limit limit = new Limit(true);
        if (offsetLimit.isPresent()) {
            limit.setOffset(offsetLimit.get());
        if (offset.isPresent()) {
            limit.setOffset(offset.get());
        }
        if (rowCountLimit.isPresent()) {
            limit.setRowCount(rowCountLimit.get());
        if (rowCount.isPresent()) {
            limit.setRowCount(rowCount.get());
        }
        getSelectStatement().setLimit(limit);
    }
+1 −1
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ import lombok.RequiredArgsConstructor;
 */
@RequiredArgsConstructor
@Getter
public final class OffsetLimitToken implements SQLToken {
public final class OffsetToken implements SQLToken {
    
    private final int beginPosition;
    
+1 −1
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ import lombok.RequiredArgsConstructor;
 */
@RequiredArgsConstructor
@Getter
public final class RowCountLimitToken implements SQLToken {
public final class RowCountToken implements SQLToken {
    
    private final int beginPosition;
    
+12 −12
Original line number Diff line number Diff line
@@ -23,8 +23,8 @@ import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.Limit;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatement;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.ItemsToken;
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.parsing.parser.token.OffsetToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.RowCountToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.SQLToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.TableToken;
import com.dangdang.ddframe.rdb.sharding.routing.type.TableUnit;
@@ -86,10 +86,10 @@ public final class SQLRewriteEngine {
                appendTableToken(result, (TableToken) each, count, sqlTokens);
            } else if (each instanceof ItemsToken) {
                appendItemsToken(result, (ItemsToken) each, count, sqlTokens);
            } else if (each instanceof RowCountLimitToken) {
                appendLimitRowCount(result, (RowCountLimitToken) each, count, sqlTokens, isRewriteLimit);
            } else if (each instanceof OffsetLimitToken) {
                appendLimitOffsetToken(result, (OffsetLimitToken) each, count, sqlTokens, isRewriteLimit);
            } else if (each instanceof RowCountToken) {
                appendLimitRowCount(result, (RowCountToken) each, count, sqlTokens, isRewriteLimit);
            } else if (each instanceof OffsetToken) {
                appendLimitOffsetToken(result, (OffsetToken) each, count, sqlTokens, isRewriteLimit);
            }
            count++;
        }
@@ -124,16 +124,16 @@ public final class SQLRewriteEngine {
        sqlBuilder.appendLiterals(originalSQL.substring(beginPosition, endPosition));
    }
    
    private void appendLimitRowCount(final SQLBuilder sqlBuilder, final RowCountLimitToken rowCountLimitToken, final int count, final List<SQLToken> sqlTokens, final boolean isRewrite) {
        sqlBuilder.appendLiterals(isRewrite ? String.valueOf(rowCountLimitToken.getRowCount() + limit.getOffsetValue()) : String.valueOf(rowCountLimitToken.getRowCount()));
        int beginPosition = rowCountLimitToken.getBeginPosition() + String.valueOf(rowCountLimitToken.getRowCount()).length();
    private void appendLimitRowCount(final SQLBuilder sqlBuilder, final RowCountToken rowCountToken, final int count, final List<SQLToken> sqlTokens, final boolean isRewrite) {
        sqlBuilder.appendLiterals(isRewrite ? String.valueOf(rowCountToken.getRowCount() + limit.getOffsetValue()) : String.valueOf(rowCountToken.getRowCount()));
        int beginPosition = rowCountToken.getBeginPosition() + String.valueOf(rowCountToken.getRowCount()).length();
        int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
        sqlBuilder.appendLiterals(originalSQL.substring(beginPosition, endPosition));
    }
    
    private void appendLimitOffsetToken(final SQLBuilder sqlBuilder, final OffsetLimitToken offsetLimitToken, final int count, final List<SQLToken> sqlTokens, final boolean isRewrite) {
        sqlBuilder.appendLiterals(isRewrite ? "0" : String.valueOf(offsetLimitToken.getOffset()));
        int beginPosition = offsetLimitToken.getBeginPosition() + String.valueOf(offsetLimitToken.getOffset()).length();
    private void appendLimitOffsetToken(final SQLBuilder sqlBuilder, final OffsetToken offsetToken, final int count, final List<SQLToken> sqlTokens, final boolean isRewrite) {
        sqlBuilder.appendLiterals(isRewrite ? "0" : String.valueOf(offsetToken.getOffset()));
        int beginPosition = offsetToken.getBeginPosition() + String.valueOf(offsetToken.getOffset()).length();
        int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
        sqlBuilder.appendLiterals(originalSQL.substring(beginPosition, endPosition));
    }