提交 8daa85a7 编写于 作者: T terrymanu

refactor select parser 2nd version

上级 4d01a607
......@@ -39,23 +39,24 @@ public class MySQLSelectParser extends AbstractSelectParser {
}
@Override
public void query() {
if (getSqlParser().skipIfEqual(DefaultKeyword.SELECT)) {
parseDistinct();
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);
parseSelectList();
skipToFrom();
}
parseFrom();
parseWhere();
parseGroupBy();
parseOrderBy();
protected void parseBetweenSelectAndList() {
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 final void skipToFrom() {
while (!getSqlParser().equalAny(DefaultKeyword.FROM) && !getSqlParser().equalAny(Assist.END)) {
getSqlParser().getLexer().nextToken();
}
}
@Override
protected void customizedQuery() {
parseLimit();
if (getSqlParser().equalAny(DefaultKeyword.PROCEDURE)) {
throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
}
queryRest();
}
private void parseLimit() {
......@@ -151,12 +152,6 @@ public class MySQLSelectParser extends AbstractSelectParser {
return result;
}
private void skipToFrom() {
while (!getSqlParser().equalAny(DefaultKeyword.FROM) && !getSqlParser().equalAny(Assist.END)) {
getSqlParser().getLexer().nextToken();
}
}
@Override
protected void parseJoinTable() {
if (getSqlParser().equalAny(DefaultKeyword.USING)) {
......
......@@ -33,26 +33,17 @@ public class OracleSelectParser extends AbstractSelectParser {
}
@Override
public void query() {
if (getSqlParser().skipIfEqual(DefaultKeyword.SELECT)) {
parseDistinct();
parseSelectList();
}
skipInto();
parseFrom();
parseWhere();
skipHierarchicalQueryClause();
parseGroupBy();
skipModelClause();
queryRest();
}
private void skipInto() {
protected final void skipToFrom() {
if (getSqlParser().equalAny(DefaultKeyword.INTO)) {
throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
}
}
@Override
protected void customizedBetweenWhereAndGroupBy() {
skipHierarchicalQueryClause();
}
private void skipHierarchicalQueryClause() {
skipConnect();
skipStart();
......@@ -77,6 +68,11 @@ public class OracleSelectParser extends AbstractSelectParser {
}
}
@Override
protected final void customizedBetweenGroupByAndOrderBy() {
skipModelClause();
}
private void skipModelClause() {
if (!getSqlParser().skipIfEqual(OracleKeyword.MODEL)) {
return;
......
......@@ -39,22 +39,18 @@ public class PostgreSQLSelectParser extends AbstractSelectParser {
}
@Override
public void query() {
if (getSqlParser().skipIfEqual(DefaultKeyword.SELECT)) {
parseDistinct();
parseSelectList();
if (getSqlParser().skipIfEqual(DefaultKeyword.INTO)) {
getSqlParser().skipIfEqual(DefaultKeyword.TEMPORARY, PostgreSQLKeyword.TEMP, PostgreSQLKeyword.UNLOGGED);
getSqlParser().skipIfEqual(DefaultKeyword.TABLE);
}
protected final void skipToFrom() {
if (getSqlParser().skipIfEqual(DefaultKeyword.INTO)) {
getSqlParser().skipIfEqual(DefaultKeyword.TEMPORARY, PostgreSQLKeyword.TEMP, PostgreSQLKeyword.UNLOGGED);
getSqlParser().skipIfEqual(DefaultKeyword.TABLE);
}
parseFrom();
parseWhere();
parseGroupBy();
}
@Override
protected void customizedQuery() {
if (getSqlParser().equalAny(PostgreSQLKeyword.WINDOW)) {
throw new SQLParsingUnsupportedException(PostgreSQLKeyword.WINDOW);
}
parseOrderBy();
parseLimit();
if (getSqlParser().skipIfEqual(DefaultKeyword.FETCH)) {
throw new SQLParsingUnsupportedException(DefaultKeyword.FETCH);
......@@ -66,7 +62,6 @@ public class PostgreSQLSelectParser extends AbstractSelectParser {
}
getSqlParser().skipIfEqual(PostgreSQLKeyword.NOWAIT);
}
queryRest();
}
private void parseLimit() {
......
......@@ -42,19 +42,8 @@ public class SQLServerSelectParser extends AbstractSelectParser {
}
@Override
public void query() {
if (getSqlParser().skipIfEqual(DefaultKeyword.SELECT)) {
parseDistinct();
parseTop();
parseSelectList();
}
if (getSqlParser().equalAny(DefaultKeyword.INTO)) {
throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
}
parseFrom();
parseWhere();
parseGroupBy();
queryRest();
protected void parseBetweenSelectAndList() {
parseTop();
}
private void parseTop() {
......@@ -112,6 +101,13 @@ public class SQLServerSelectParser extends AbstractSelectParser {
return new CommonSelectItem("ROW_NUMBER", getSqlParser().parseAlias());
}
@Override
protected final void skipToFrom() {
if (getSqlParser().equalAny(DefaultKeyword.INTO)) {
throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
}
}
@Override
protected void parseJoinTable() {
if (getSqlParser().skipIfEqual(DefaultKeyword.WITH)) {
......
......@@ -85,7 +85,21 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
return selectStatement;
}
protected abstract void query();
protected final void query() {
getSqlParser().getLexer().nextToken();
parseDistinct();
parseBetweenSelectAndList();
parseSelectList();
skipToFrom();
parseFrom();
parseWhere();
customizedBetweenWhereAndGroupBy();
parseGroupBy();
customizedBetweenGroupByAndOrderBy();
parseOrderBy();
customizedQuery();
queryRest();
}
protected final void parseDistinct() {
if (sqlParser.equalAny(DefaultKeyword.DISTINCT, DefaultKeyword.DISTINCTROW, DefaultKeyword.UNION)) {
......@@ -104,6 +118,9 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
return false;
}
protected void parseBetweenSelectAndList() {
}
protected final void parseSelectList() {
do {
parseSelectItem();
......@@ -183,10 +200,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
return new CommonSelectItem(SQLUtil.getExactlyValue(expression.substring(0, expression.lastIndexOf(lastToken.getLiterals()))), Optional.of(lastToken.getLiterals()));
}
protected void queryRest() {
if (sqlParser.equalAny(DefaultKeyword.UNION, DefaultKeyword.EXCEPT, DefaultKeyword.INTERSECT, DefaultKeyword.MINUS)) {
throw new SQLParsingUnsupportedException(sqlParser.getLexer().getCurrentToken().getType());
}
protected void skipToFrom() {
}
protected final void parseWhere() {
......@@ -197,6 +211,12 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
parametersIndex = sqlParser.getParametersIndex();
}
protected void customizedBetweenWhereAndGroupBy() {
}
protected void customizedBetweenGroupByAndOrderBy() {
}
protected final void parseOrderBy() {
if (!sqlParser.skipIfEqual(DefaultKeyword.ORDER)) {
return;
......@@ -370,6 +390,15 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
}
}
protected void customizedQuery() {
}
protected final void queryRest() {
if (sqlParser.equalAny(DefaultKeyword.UNION, DefaultKeyword.EXCEPT, DefaultKeyword.INTERSECT, DefaultKeyword.MINUS)) {
throw new SQLParsingUnsupportedException(sqlParser.getLexer().getCurrentToken().getType());
}
}
protected void customizedSelect() {
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册