提交 202a0b0d 编写于 作者: T terrymanu

refactor select parser workflow

上级 90a813f7
......@@ -28,7 +28,6 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.AbstractSQLParser;
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.exception.SQLParsingUnsupportedException;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dql.select.AbstractSelectParser;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dql.select.SelectStatement;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.OffsetToken;
......@@ -46,29 +45,27 @@ public final class MySQLSelectParser extends AbstractSelectParser {
}
@Override
protected Keyword[] getSynonymousKeywordsForDistinct() {
return new Keyword[] {MySQLKeyword.DISTINCTROW};
protected SelectStatement parseInternal() {
SelectStatement result = new SelectStatement();
getSqlParser().getLexer().nextToken();
parseDistinct();
skipBeforeSelectList();
parseSelectList(result);
parseFrom(result);
parseWhere(result);
parseGroupBy(result);
parseHaving();
parseOrderBy(result);
parseLimit(result);
parseRest();
return result;
}
@Override
protected void parseBeforeSelectList(final SelectStatement selectStatement) {
private void skipBeforeSelectList() {
getSqlParser().skipAll(MySQLKeyword.HIGH_PRIORITY, DefaultKeyword.STRAIGHT_JOIN, MySQLKeyword.SQL_SMALL_RESULT, MySQLKeyword.SQL_BIG_RESULT, MySQLKeyword.SQL_BUFFER_RESULT,
MySQLKeyword.SQL_CACHE, MySQLKeyword.SQL_NO_CACHE, MySQLKeyword.SQL_CALC_FOUND_ROWS);
}
@Override
protected Keyword[] getSkippedKeywordAfterGroupBy() {
return new Keyword[] {DefaultKeyword.WITH, MySQLKeyword.ROLLUP};
}
@Override
protected void parseRest(final SelectStatement selectStatement) {
parseLimit(selectStatement);
if (getSqlParser().equalAny(DefaultKeyword.PROCEDURE)) {
throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
}
}
private void parseLimit(final SelectStatement selectStatement) {
if (!getSqlParser().skipIfEqual(MySQLKeyword.LIMIT)) {
return;
......@@ -162,6 +159,11 @@ public final class MySQLSelectParser extends AbstractSelectParser {
return result;
}
@Override
protected Keyword[] getSynonymousKeywordsForDistinct() {
return new Keyword[] {MySQLKeyword.DISTINCTROW};
}
@Override
protected void parseJoinTable(final SelectStatement selectStatement) {
if (getSqlParser().equalAny(DefaultKeyword.USING)) {
......@@ -169,20 +171,20 @@ public final class MySQLSelectParser extends AbstractSelectParser {
}
if (getSqlParser().equalAny(DefaultKeyword.USE)) {
getSqlParser().getLexer().nextToken();
parseIndexHint();
skipIndexHint();
}
if (getSqlParser().equalAny(OracleKeyword.IGNORE)) {
getSqlParser().getLexer().nextToken();
parseIndexHint();
skipIndexHint();
}
if (getSqlParser().equalAny(OracleKeyword.FORCE)) {
getSqlParser().getLexer().nextToken();
parseIndexHint();
skipIndexHint();
}
super.parseJoinTable(selectStatement);
}
private void parseIndexHint() {
private void skipIndexHint() {
if (getSqlParser().equalAny(DefaultKeyword.INDEX)) {
getSqlParser().getLexer().nextToken();
} else {
......@@ -202,4 +204,14 @@ public final class MySQLSelectParser extends AbstractSelectParser {
}
getSqlParser().skipParentheses();
}
@Override
protected Keyword[] getSkippedKeywordAfterGroupBy() {
return new Keyword[] {DefaultKeyword.WITH, MySQLKeyword.ROLLUP};
}
@Override
protected Keyword[] getUnsupportedKeywordsRest() {
return new Keyword[] {DefaultKeyword.PROCEDURE, DefaultKeyword.INTO};
}
}
......@@ -46,7 +46,6 @@ public final class OracleSelectParser extends AbstractSelectParser {
SelectStatement result = new SelectStatement();
getSqlParser().getLexer().nextToken();
parseDistinct();
parseBeforeSelectList(result);
parseSelectList(result);
parseFrom(result);
parseWhere(result);
......@@ -55,21 +54,11 @@ public final class OracleSelectParser extends AbstractSelectParser {
parseHaving();
skipModelClause();
parseOrderBy(result);
parseRest(result);
parseUnsupportedTokens();
skipFor();
parseRest();
return result;
}
@Override
protected Keyword[] getSynonymousKeywordsForDistinct() {
return new Keyword[] {DefaultKeyword.UNIQUE};
}
@Override
protected Keyword[] getSkippedKeywordsBeforeSelectItem() {
return new Keyword[] {OracleKeyword.CONNECT_BY_ROOT};
}
private void skipHierarchicalQueryClause(final SelectStatement selectStatement) {
skipConnect(selectStatement);
skipStart(selectStatement);
......@@ -173,28 +162,20 @@ public final class OracleSelectParser extends AbstractSelectParser {
throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
}
@Override
protected void parseRest(final SelectStatement selectStatement) {
if (getSqlParser().equalAny(DefaultKeyword.FOR)) {
skipForUpdate();
}
if (selectStatement.getOrderByItems().isEmpty()) {
parseOrderBy(selectStatement);
}
}
private void skipForUpdate() {
getSqlParser().getLexer().nextToken();
getSqlParser().accept(DefaultKeyword.UPDATE);
if (getSqlParser().skipIfEqual(DefaultKeyword.OF)) {
do {
getSqlParser().parseExpression();
} while (getSqlParser().skipIfEqual(Symbol.COMMA));
}
if (getSqlParser().equalAny(OracleKeyword.NOWAIT, OracleKeyword.WAIT)) {
private void skipFor() {
if (getSqlParser().skipIfEqual(DefaultKeyword.FOR)) {
getSqlParser().getLexer().nextToken();
} else if (getSqlParser().skipIfEqual(OracleKeyword.SKIP)) {
getSqlParser().accept(OracleKeyword.LOCKED);
getSqlParser().accept(DefaultKeyword.UPDATE);
if (getSqlParser().skipIfEqual(DefaultKeyword.OF)) {
do {
getSqlParser().parseExpression();
} while (getSqlParser().skipIfEqual(Symbol.COMMA));
}
if (getSqlParser().equalAny(OracleKeyword.NOWAIT, OracleKeyword.WAIT)) {
getSqlParser().getLexer().nextToken();
} else if (getSqlParser().skipIfEqual(OracleKeyword.SKIP)) {
getSqlParser().accept(OracleKeyword.LOCKED);
}
}
}
......@@ -271,6 +252,16 @@ public final class OracleSelectParser extends AbstractSelectParser {
}
}
@Override
protected Keyword[] getSynonymousKeywordsForDistinct() {
return new Keyword[] {DefaultKeyword.UNIQUE};
}
@Override
protected Keyword[] getSkippedKeywordsBeforeSelectItem() {
return new Keyword[] {OracleKeyword.CONNECT_BY_ROOT};
}
@Override
protected Keyword[] getUnsupportedKeywordBeforeGroupByItem() {
return new Keyword[] {OracleKeyword.ROLLUP, OracleKeyword.CUBE, OracleKeyword.GROUPING};
......
......@@ -20,6 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parsing.parser.dialect.postgresql;
import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.postgresql.PostgreSQLKeyword;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.DefaultKeyword;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Keyword;
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.AbstractSQLParser;
......@@ -46,21 +47,20 @@ public final class PostgreSQLSelectParser extends AbstractSelectParser {
}
@Override
protected void parseRest(final SelectStatement selectStatement) {
if (getSqlParser().equalAny(PostgreSQLKeyword.WINDOW)) {
throw new SQLParsingUnsupportedException(PostgreSQLKeyword.WINDOW);
}
parseLimit(selectStatement);
if (getSqlParser().skipIfEqual(DefaultKeyword.FETCH)) {
throw new SQLParsingUnsupportedException(DefaultKeyword.FETCH);
}
if (getSqlParser().skipIfEqual(DefaultKeyword.FOR)) {
getSqlParser().skipIfEqual(DefaultKeyword.UPDATE, PostgreSQLKeyword.SHARE);
if (getSqlParser().equalAny(DefaultKeyword.OF)) {
throw new SQLParsingUnsupportedException(DefaultKeyword.OF);
}
getSqlParser().skipIfEqual(PostgreSQLKeyword.NOWAIT);
}
protected SelectStatement parseInternal() {
SelectStatement result = new SelectStatement();
getSqlParser().getLexer().nextToken();
parseDistinct();
parseSelectList(result);
parseFrom(result);
parseWhere(result);
parseGroupBy(result);
parseHaving();
parseOrderBy(result);
parseLimit(result);
parseFor();
parseRest();
return result;
}
private void parseLimit(final SelectStatement selectStatement) {
......@@ -134,4 +134,19 @@ public final class PostgreSQLSelectParser extends AbstractSelectParser {
}
selectStatement.setLimit(limit);
}
private void parseFor() {
if (getSqlParser().skipIfEqual(DefaultKeyword.FOR)) {
getSqlParser().skipIfEqual(DefaultKeyword.UPDATE, PostgreSQLKeyword.SHARE);
if (getSqlParser().equalAny(DefaultKeyword.OF)) {
throw new SQLParsingUnsupportedException(DefaultKeyword.OF);
}
getSqlParser().skipIfEqual(PostgreSQLKeyword.NOWAIT);
}
}
@Override
protected Keyword[] getUnsupportedKeywordsRest() {
return new Keyword[] {PostgreSQLKeyword.WINDOW, DefaultKeyword.FETCH};
}
}
......@@ -48,8 +48,20 @@ public final class SQLServerSelectParser extends AbstractSelectParser {
}
@Override
protected void parseBeforeSelectList(final SelectStatement selectStatement) {
parseTop(selectStatement);
protected SelectStatement parseInternal() {
SelectStatement result = new SelectStatement();
getSqlParser().getLexer().nextToken();
parseDistinct();
parseTop(result);
parseSelectList(result);
parseFrom(result);
parseWhere(result);
parseGroupBy(result);
parseHaving();
parseOrderBy(result);
parseOffset(result);
parseFor();
return result;
}
private void parseTop(final SelectStatement selectStatement) {
......@@ -85,6 +97,69 @@ public final class SQLServerSelectParser extends AbstractSelectParser {
}
}
private void parseOffset(final SelectStatement selectStatement) {
if (getSqlParser().skipIfEqual(SQLServerKeyword.OFFSET)) {
int offsetValue = -1;
int offsetIndex = -1;
if (getSqlParser().equalAny(Literals.INT)) {
offsetValue = Integer.parseInt(getSqlParser().getLexer().getCurrentToken().getLiterals());
} else if (getSqlParser().equalAny(Symbol.QUESTION)) {
offsetIndex = getParametersIndex();
getSqlParser().increaseParametersIndex();
} else {
throw new SQLParsingException(getSqlParser().getLexer());
}
getSqlParser().getLexer().nextToken();
Limit limit = new Limit(true);
if (getSqlParser().skipIfEqual(DefaultKeyword.FETCH)) {
getSqlParser().getLexer().nextToken();
int rowCountValue = -1;
int rowCountIndex = -1;
getSqlParser().getLexer().nextToken();
if (getSqlParser().equalAny(Literals.INT)) {
rowCountValue = Integer.parseInt(getSqlParser().getLexer().getCurrentToken().getLiterals());
} else if (getSqlParser().equalAny(Symbol.QUESTION)) {
rowCountIndex = getParametersIndex();
getSqlParser().increaseParametersIndex();
} else {
throw new SQLParsingException(getSqlParser().getLexer());
}
getSqlParser().getLexer().nextToken();
getSqlParser().getLexer().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 (getSqlParser().skipIfEqual(DefaultKeyword.FOR)) {
if (getSqlParser().equalAny(SQLServerKeyword.BROWSE)) {
getSqlParser().getLexer().nextToken();
} else if (getSqlParser().skipIfEqual(SQLServerKeyword.XML)) {
while (true) {
if (getSqlParser().equalAny(SQLServerKeyword.AUTO, SQLServerKeyword.TYPE, SQLServerKeyword.XMLSCHEMA)) {
getSqlParser().getLexer().nextToken();
} else if (getSqlParser().skipIfEqual(SQLServerKeyword.ELEMENTS)) {
getSqlParser().skipIfEqual(SQLServerKeyword.XSINIL);
} else {
break;
}
if (getSqlParser().equalAny(Symbol.COMMA)) {
getSqlParser().getLexer().nextToken();
} else {
break;
}
}
} else {
throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
}
}
}
@Override
protected boolean isRowNumberSelectItem() {
return getSqlParser().skipIfEqual(SQLServerKeyword.ROW_NUMBER);
......@@ -110,75 +185,4 @@ public final class SQLServerSelectParser extends AbstractSelectParser {
}
super.parseJoinTable(selectStatement);
}
@Override
protected void parseRest(final SelectStatement selectStatement) {
if (getSqlParser().equalAny(DefaultKeyword.FOR)) {
parseFor();
}
if (getSqlParser().equalAny(SQLServerKeyword.OFFSET)) {
parseOffset(selectStatement);
}
}
private void parseOffset(final SelectStatement selectStatement) {
getSqlParser().getLexer().nextToken();
int offsetValue = -1;
int offsetIndex = -1;
if (getSqlParser().equalAny(Literals.INT)) {
offsetValue = Integer.parseInt(getSqlParser().getLexer().getCurrentToken().getLiterals());
} else if (getSqlParser().equalAny(Symbol.QUESTION)) {
offsetIndex = getParametersIndex();
getSqlParser().increaseParametersIndex();
} else {
throw new SQLParsingException(getSqlParser().getLexer());
}
getSqlParser().getLexer().nextToken();
Limit limit = new Limit(true);
if (getSqlParser().skipIfEqual(DefaultKeyword.FETCH)) {
getSqlParser().getLexer().nextToken();
int rowCountValue = -1;
int rowCountIndex = -1;
getSqlParser().getLexer().nextToken();
if (getSqlParser().equalAny(Literals.INT)) {
rowCountValue = Integer.parseInt(getSqlParser().getLexer().getCurrentToken().getLiterals());
} else if (getSqlParser().equalAny(Symbol.QUESTION)) {
rowCountIndex = getParametersIndex();
getSqlParser().increaseParametersIndex();
} else {
throw new SQLParsingException(getSqlParser().getLexer());
}
getSqlParser().getLexer().nextToken();
getSqlParser().getLexer().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() {
getSqlParser().getLexer().nextToken();
if (getSqlParser().equalAny(SQLServerKeyword.BROWSE)) {
getSqlParser().getLexer().nextToken();
} else if (getSqlParser().skipIfEqual(SQLServerKeyword.XML)) {
while (true) {
if (getSqlParser().equalAny(SQLServerKeyword.AUTO, SQLServerKeyword.TYPE, SQLServerKeyword.XMLSCHEMA)) {
getSqlParser().getLexer().nextToken();
} else if (getSqlParser().skipIfEqual(SQLServerKeyword.ELEMENTS)) {
getSqlParser().skipIfEqual(SQLServerKeyword.XSINIL);
} else {
break;
}
if (getSqlParser().equalAny(Symbol.COMMA)) {
getSqlParser().getLexer().nextToken();
} else {
break;
}
}
} else {
throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
}
}
}
......@@ -96,15 +96,13 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
SelectStatement result = new SelectStatement();
sqlParser.getLexer().nextToken();
parseDistinct();
parseBeforeSelectList(result);
parseSelectList(result);
parseFrom(result);
parseWhere(result);
parseGroupBy(result);
parseHaving();
parseOrderBy(result);
parseRest(result);
parseUnsupportedTokens();
parseRest();
return result;
}
......@@ -113,8 +111,8 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
Collection<Keyword> distinctKeywords = new LinkedList<>();
distinctKeywords.add(DefaultKeyword.DISTINCT);
distinctKeywords.addAll(Arrays.asList(getSynonymousKeywordsForDistinct()));
if (getSqlParser().equalAny(distinctKeywords.toArray(new Keyword[distinctKeywords.size()]))) {
throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
if (sqlParser.equalAny(distinctKeywords.toArray(new Keyword[distinctKeywords.size()]))) {
throw new SQLParsingUnsupportedException(sqlParser.getLexer().getCurrentToken().getType());
}
}
......@@ -122,9 +120,6 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
return new Keyword[0];
}
protected void parseBeforeSelectList(final SelectStatement selectStatement) {
}
protected final void parseSelectList(final SelectStatement selectStatement) {
do {
selectStatement.getItems().add(parseSelectItem(selectStatement));
......@@ -214,7 +209,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
}
protected final void parseFrom(final SelectStatement selectStatement) {
if (getSqlParser().equalAny(DefaultKeyword.INTO)) {
if (sqlParser.equalAny(DefaultKeyword.INTO)) {
throw new SQLParsingUnsupportedException(DefaultKeyword.INTO);
}
if (sqlParser.skipIfEqual(DefaultKeyword.FROM)) {
......@@ -227,7 +222,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
sqlParser.skipUselessParentheses();
selectStatement.setSubQueryStatement(parseInternal());
sqlParser.skipUselessParentheses();
if (getSqlParser().equalAny(DefaultKeyword.WHERE, Assist.END)) {
if (sqlParser.equalAny(DefaultKeyword.WHERE, Assist.END)) {
return;
}
}
......@@ -298,7 +293,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
sqlParser.getLexer().nextToken();
}
sqlParser.skipAll(getSkippedKeywordAfterGroupBy());
selectStatement.setGroupByLastPosition(sqlParser.getLexer().getCurrentToken().getEndPosition() - getSqlParser().getLexer().getCurrentToken().getLiterals().length());
selectStatement.setGroupByLastPosition(sqlParser.getLexer().getCurrentToken().getEndPosition() - sqlParser.getLexer().getCurrentToken().getLiterals().length());
}
}
......@@ -404,14 +399,19 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
return Optional.absent();
}
protected abstract void parseRest(final SelectStatement selectStatement);
protected final void parseUnsupportedTokens() {
if (sqlParser.equalAny(DefaultKeyword.UNION, DefaultKeyword.EXCEPT, DefaultKeyword.INTERSECT, DefaultKeyword.MINUS)) {
protected final void parseRest() {
Collection<Keyword> unsupportedRestKeywords = new LinkedList<>();
unsupportedRestKeywords.addAll(Arrays.asList(DefaultKeyword.UNION, DefaultKeyword.INTERSECT, DefaultKeyword.EXCEPT, DefaultKeyword.MINUS));
unsupportedRestKeywords.addAll(Arrays.asList(getUnsupportedKeywordsRest()));
if (sqlParser.equalAny(unsupportedRestKeywords.toArray(new Keyword[unsupportedRestKeywords.size()]))) {
throw new SQLParsingUnsupportedException(sqlParser.getLexer().getCurrentToken().getType());
}
}
protected Keyword[] getUnsupportedKeywordsRest() {
return new Keyword[0];
}
private void appendDerivedColumns(final SelectStatement selectStatement) {
ItemsToken itemsToken = new ItemsToken(selectStatement.getSelectListLastPosition());
appendAvgDerivedColumns(itemsToken, selectStatement);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册