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

refactor WhereClauseParser

上级 809817b6
......@@ -70,39 +70,48 @@ public class WhereClauseParser implements SQLClauseParser {
private void parseComparisonCondition(final ShardingRule shardingRule, final SQLStatement sqlStatement, final List<SelectItem> items) {
lexerEngine.skipIfEqual(Symbol.LEFT_PAREN);
SQLExpression left = expressionClauseParser.parse(sqlStatement);
if (lexerEngine.equalAny(Symbol.EQ)) {
if (lexerEngine.skipIfEqual(Symbol.EQ)) {
parseEqualCondition(shardingRule, sqlStatement, left);
lexerEngine.skipIfEqual(Symbol.RIGHT_PAREN);
return;
}
if (lexerEngine.equalAny(DefaultKeyword.IN)) {
if (lexerEngine.skipIfEqual(DefaultKeyword.IN)) {
parseInCondition(shardingRule, sqlStatement, left);
lexerEngine.skipIfEqual(Symbol.RIGHT_PAREN);
return;
}
if (lexerEngine.equalAny(DefaultKeyword.BETWEEN)) {
if (lexerEngine.skipIfEqual(DefaultKeyword.BETWEEN)) {
parseBetweenCondition(shardingRule, sqlStatement, left);
lexerEngine.skipIfEqual(Symbol.RIGHT_PAREN);
return;
}
if (lexerEngine.equalAny(Symbol.LT, Symbol.GT, Symbol.LT_EQ, Symbol.GT_EQ)) {
if (lexerEngine.skipIfEqual(Symbol.LT, Symbol.LT_EQ)) {
if (left instanceof SQLIdentifierExpression && sqlStatement instanceof SelectStatement
&& isRowNumberCondition(items, ((SQLIdentifierExpression) left).getName())) {
parseRowNumberCondition((SelectStatement) sqlStatement);
parseRowCountCondition((SelectStatement) sqlStatement);
} else if (left instanceof SQLPropertyExpression && sqlStatement instanceof SelectStatement
&& isRowNumberCondition(items, ((SQLPropertyExpression) left).getName())) {
parseRowNumberCondition((SelectStatement) sqlStatement);
parseRowCountCondition((SelectStatement) sqlStatement);
} else {
parseOtherCondition(sqlStatement);
}
} else if (lexerEngine.equalAny(Symbol.LT_GT, Symbol.BANG_EQ, Symbol.BANG_GT, Symbol.BANG_LT, DefaultKeyword.LIKE)) {
} else if (lexerEngine.skipIfEqual(Symbol.GT, Symbol.GT_EQ)) {
if (left instanceof SQLIdentifierExpression && sqlStatement instanceof SelectStatement
&& isRowNumberCondition(items, ((SQLIdentifierExpression) left).getName())) {
parseOffsetCondition((SelectStatement) sqlStatement);
} else if (left instanceof SQLPropertyExpression && sqlStatement instanceof SelectStatement
&& isRowNumberCondition(items, ((SQLPropertyExpression) left).getName())) {
parseOffsetCondition((SelectStatement) sqlStatement);
} else {
parseOtherCondition(sqlStatement);
}
} else if (lexerEngine.skipIfEqual(Symbol.LT_GT, Symbol.BANG_EQ, Symbol.BANG_GT, Symbol.BANG_LT, DefaultKeyword.LIKE)) {
parseOtherCondition(sqlStatement);
}
lexerEngine.skipIfEqual(Symbol.RIGHT_PAREN);
}
private void parseEqualCondition(final ShardingRule shardingRule, final SQLStatement sqlStatement, final SQLExpression left) {
lexerEngine.nextToken();
SQLExpression right = expressionClauseParser.parse(sqlStatement);
// TODO if have more tables, and cannot find column belong to, should not add to condition, should parse binding table rule.
if ((sqlStatement.getTables().isSingleTable() || left instanceof SQLPropertyExpression)
......@@ -115,13 +124,10 @@ public class WhereClauseParser implements SQLClauseParser {
}
private void parseInCondition(final ShardingRule shardingRule, final SQLStatement sqlStatement, final SQLExpression left) {
lexerEngine.nextToken();
lexerEngine.accept(Symbol.LEFT_PAREN);
List<SQLExpression> rights = new LinkedList<>();
do {
if (lexerEngine.equalAny(Symbol.COMMA)) {
lexerEngine.nextToken();
}
lexerEngine.skipIfEqual(Symbol.COMMA);
rights.add(expressionClauseParser.parse(sqlStatement));
} while (!lexerEngine.equalAny(Symbol.RIGHT_PAREN));
Optional<Column> column = find(sqlStatement.getTables(), left);
......@@ -132,7 +138,6 @@ public class WhereClauseParser implements SQLClauseParser {
}
private void parseBetweenCondition(final ShardingRule shardingRule, final SQLStatement sqlStatement, final SQLExpression left) {
lexerEngine.nextToken();
List<SQLExpression> rights = new LinkedList<>();
rights.add(expressionClauseParser.parse(sqlStatement));
lexerEngine.accept(DefaultKeyword.AND);
......@@ -147,36 +152,37 @@ public class WhereClauseParser implements SQLClauseParser {
return false;
}
private void parseRowNumberCondition(final SelectStatement selectStatement) {
Symbol symbol = (Symbol) lexerEngine.getCurrentToken().getType();
lexerEngine.nextToken();
private void parseRowCountCondition(final SelectStatement selectStatement) {
SQLExpression sqlExpression = expressionClauseParser.parse(selectStatement);
if (null == selectStatement.getLimit()) {
selectStatement.setLimit(new Limit(false));
}
if (Symbol.LT == symbol || Symbol.LT_EQ == symbol) {
if (sqlExpression instanceof SQLNumberExpression) {
int rowCount = ((SQLNumberExpression) sqlExpression).getNumber().intValue();
selectStatement.getLimit().setRowCount(new LimitValue(rowCount, -1));
selectStatement.getSqlTokens().add(new RowCountToken(
lexerEngine.getCurrentToken().getEndPosition() - String.valueOf(rowCount).length() - lexerEngine.getCurrentToken().getLiterals().length(), rowCount));
} else if (sqlExpression instanceof SQLPlaceholderExpression) {
selectStatement.getLimit().setRowCount(new LimitValue(-1, ((SQLPlaceholderExpression) sqlExpression).getIndex()));
}
} else if (Symbol.GT == symbol || Symbol.GT_EQ == symbol) {
if (sqlExpression instanceof SQLNumberExpression) {
int offset = ((SQLNumberExpression) sqlExpression).getNumber().intValue();
selectStatement.getLimit().setOffset(new LimitValue(offset, -1));
selectStatement.getSqlTokens().add(new OffsetToken(
lexerEngine.getCurrentToken().getEndPosition() - String.valueOf(offset).length() - lexerEngine.getCurrentToken().getLiterals().length(), offset));
} else if (sqlExpression instanceof SQLPlaceholderExpression) {
selectStatement.getLimit().setOffset(new LimitValue(-1, ((SQLPlaceholderExpression) sqlExpression).getIndex()));
}
if (sqlExpression instanceof SQLNumberExpression) {
int rowCount = ((SQLNumberExpression) sqlExpression).getNumber().intValue();
selectStatement.getLimit().setRowCount(new LimitValue(rowCount, -1));
selectStatement.getSqlTokens().add(new RowCountToken(
lexerEngine.getCurrentToken().getEndPosition() - String.valueOf(rowCount).length() - lexerEngine.getCurrentToken().getLiterals().length(), rowCount));
} else if (sqlExpression instanceof SQLPlaceholderExpression) {
selectStatement.getLimit().setRowCount(new LimitValue(-1, ((SQLPlaceholderExpression) sqlExpression).getIndex()));
}
}
private void parseOffsetCondition(final SelectStatement selectStatement) {
SQLExpression sqlExpression = expressionClauseParser.parse(selectStatement);
if (null == selectStatement.getLimit()) {
selectStatement.setLimit(new Limit(false));
}
if (sqlExpression instanceof SQLNumberExpression) {
int offset = ((SQLNumberExpression) sqlExpression).getNumber().intValue();
selectStatement.getLimit().setOffset(new LimitValue(offset, -1));
selectStatement.getSqlTokens().add(new OffsetToken(
lexerEngine.getCurrentToken().getEndPosition() - String.valueOf(offset).length() - lexerEngine.getCurrentToken().getLiterals().length(), offset));
} else if (sqlExpression instanceof SQLPlaceholderExpression) {
selectStatement.getLimit().setOffset(new LimitValue(-1, ((SQLPlaceholderExpression) sqlExpression).getIndex()));
}
}
private void parseOtherCondition(final SQLStatement sqlStatement) {
lexerEngine.nextToken();
expressionClauseParser.parse(sqlStatement);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册