提交 208a5427 编写于 作者: T terrymanu

refactor sqlserver offset

上级 f0e8ce76
/*
* 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.parsing.parser.dialect.sqlserver;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.LexerEngine;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.sqlserver.SQLServerKeyword;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.DefaultKeyword;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Literals;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Symbol;
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.sql.SQLParser;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dql.select.SelectStatement;
/**
* SQLServer Top解析器.
*
* @author zhangliang
*/
public final class SQLServerOffsetParser implements SQLParser {
private final LexerEngine lexerEngine;
public SQLServerOffsetParser(final LexerEngine lexerEngine) {
this.lexerEngine = lexerEngine;
}
/**
* 解析Offset.
*
* @param selectStatement Select SQL语句对象
*/
public void parse(final SelectStatement selectStatement) {
if (!lexerEngine.skipIfEqual(SQLServerKeyword.OFFSET)) {
return;
}
int offsetValue = -1;
int offsetIndex = -1;
if (lexerEngine.equalAny(Literals.INT)) {
offsetValue = Integer.parseInt(lexerEngine.getCurrentToken().getLiterals());
} else if (lexerEngine.equalAny(Symbol.QUESTION)) {
offsetIndex = selectStatement.getParametersIndex();
selectStatement.increaseParametersIndex();
} else {
throw new SQLParsingException(lexerEngine);
}
lexerEngine.nextToken();
Limit limit = new Limit(true);
if (lexerEngine.skipIfEqual(DefaultKeyword.FETCH)) {
lexerEngine.nextToken();
int rowCountValue = -1;
int rowCountIndex = -1;
lexerEngine.nextToken();
if (lexerEngine.equalAny(Literals.INT)) {
rowCountValue = Integer.parseInt(lexerEngine.getCurrentToken().getLiterals());
} else if (lexerEngine.equalAny(Symbol.QUESTION)) {
rowCountIndex = selectStatement.getParametersIndex();
selectStatement.increaseParametersIndex();
} else {
throw new SQLParsingException(lexerEngine);
}
lexerEngine.nextToken();
lexerEngine.nextToken();
limit.setRowCount(new LimitValue(rowCountValue, rowCountIndex));
limit.setOffset(new LimitValue(offsetValue, offsetIndex));
} else {
limit.setOffset(new LimitValue(offsetValue, offsetIndex));
}
selectStatement.setLimit(limit);
}
}
......@@ -21,12 +21,8 @@ import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.LexerEngine;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.sqlserver.SQLServerKeyword;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.DefaultKeyword;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Literals;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Symbol;
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.dialect.mysql.MySQLOrderBySQLParser;
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.sql.AbstractOrderBySQLParser;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.DistinctSQLParser;
......@@ -55,6 +51,8 @@ public final class SQLServerSelectParser extends AbstractSelectParser {
private final AbstractOrderBySQLParser orderBySQLParser;
private final SQLServerOffsetParser sqlServerOffsetParser;
public SQLServerSelectParser(final ShardingRule shardingRule, final LexerEngine lexerEngine) {
super(shardingRule, lexerEngine, new SQLServerWhereSQLParser(lexerEngine));
distinctSQLParser = new DistinctSQLParser(lexerEngine);
......@@ -63,6 +61,7 @@ public final class SQLServerSelectParser extends AbstractSelectParser {
groupBySQLParser = new GroupBySQLParser(lexerEngine);
havingSQLParser = new HavingSQLParser(lexerEngine);
orderBySQLParser = new MySQLOrderBySQLParser(lexerEngine);
sqlServerOffsetParser = new SQLServerOffsetParser(lexerEngine);
}
@Override
......@@ -75,49 +74,10 @@ public final class SQLServerSelectParser extends AbstractSelectParser {
groupBySQLParser.parse(selectStatement);
havingSQLParser.parse();
orderBySQLParser.parse(selectStatement);
parseOffset(selectStatement);
sqlServerOffsetParser.parse(selectStatement);
parseFor();
}
private void parseOffset(final SelectStatement selectStatement) {
if (!getLexerEngine().skipIfEqual(SQLServerKeyword.OFFSET)) {
return;
}
int offsetValue = -1;
int offsetIndex = -1;
if (getLexerEngine().equalAny(Literals.INT)) {
offsetValue = Integer.parseInt(getLexerEngine().getCurrentToken().getLiterals());
} else if (getLexerEngine().equalAny(Symbol.QUESTION)) {
offsetIndex = getParametersIndex();
selectStatement.increaseParametersIndex();
} else {
throw new SQLParsingException(getLexerEngine());
}
getLexerEngine().nextToken();
Limit limit = new Limit(true);
if (getLexerEngine().skipIfEqual(DefaultKeyword.FETCH)) {
getLexerEngine().nextToken();
int rowCountValue = -1;
int rowCountIndex = -1;
getLexerEngine().nextToken();
if (getLexerEngine().equalAny(Literals.INT)) {
rowCountValue = Integer.parseInt(getLexerEngine().getCurrentToken().getLiterals());
} else if (getLexerEngine().equalAny(Symbol.QUESTION)) {
rowCountIndex = getParametersIndex();
selectStatement.increaseParametersIndex();
} else {
throw new SQLParsingException(getLexerEngine());
}
getLexerEngine().nextToken();
getLexerEngine().nextToken();
limit.setRowCount(new LimitValue(rowCountValue, rowCountIndex));
limit.setOffset(new LimitValue(offsetValue, offsetIndex));
} else {
limit.setOffset(new LimitValue(offsetValue, offsetIndex));
}
selectStatement.setLimit(limit);
}
private void parseFor() {
if (!getLexerEngine().skipIfEqual(DefaultKeyword.FOR)) {
return;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册