提交 329dd7df 编写于 作者: H haocao

Merge branch '1.5.2-SNAPSHOT' of...

Merge branch '1.5.2-SNAPSHOT' of https://github.com/dangdangdotcom/sharding-jdbc into 1.5.2-SNAPSHOT
......@@ -75,10 +75,15 @@ public enum Symbol implements TokenType {
private static Map<String, Symbol> symbols = new HashMap<>(128);
@Getter
private static Symbol[] operators;
static {
for (Symbol each : Symbol.values()) {
symbols.put(each.getLiterals(), each);
}
operators = new Symbol
[] {PLUS, SUB, STAR, SLASH, EQ, GT, LT, CARET, PERCENT, LT_EQ, GT_EQ, LT_EQ_GT, LT_GT, BANG_EQ, BANG_GT, BANG_LT, AMP, BAR, DOUBLE_AMP, DOUBLE_BAR, DOUBLE_LT, DOUBLE_GT};
}
private final String literals;
......
......@@ -22,9 +22,7 @@ import com.dangdang.ddframe.rdb.sharding.constant.OrderType;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Assist;
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.lexer.token.Token;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.AbstractSQLParser;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.OrderItem;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.AggregationSelectItem;
......@@ -136,40 +134,18 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
private void parseSelectItem() {
sqlParser.skipIfEqual(getSkipKeywordsBeforeSelectItem());
SelectItem selectItem;
if (isRowNumberSelectItem()) {
selectStatement.getItems().add(parseRowNumberSelectItem());
return;
}
if (isStarSelectItem()) {
selectStatement.getItems().add(parseStarSelectItem());
return;
}
if (isAggregationSelectItem()) {
selectStatement.getItems().add(parseAggregationSelectItem());
return;
}
StringBuilder expression = new StringBuilder();
Token lastToken = null;
while (!sqlParser.equalAny(DefaultKeyword.AS) && !sqlParser.equalAny(Symbol.COMMA) && !sqlParser.equalAny(DefaultKeyword.FROM) && !sqlParser.equalAny(Assist.END)) {
if (sqlParser.equalAny(Symbol.LEFT_PAREN)) {
expression.append(sqlParser.skipParentheses());
lastToken = sqlParser.getLexer().getCurrentToken();
continue;
}
String value = sqlParser.getLexer().getCurrentToken().getLiterals();
int position = sqlParser.getLexer().getCurrentToken().getEndPosition() - value.length();
expression.append(value);
lastToken = sqlParser.getLexer().getCurrentToken();
sqlParser.getLexer().nextToken();
if (sqlParser.equalAny(Symbol.DOT)) {
selectStatement.getSqlTokens().add(new TableToken(position, value));
}
}
if (hasAlias(expression, lastToken)) {
selectStatement.getItems().add(parseSelectItemWithAlias(expression, lastToken));
return;
selectItem = parseRowNumberSelectItem();
} else if (isStarSelectItem()) {
selectItem = parseStarSelectItem();
} else if (isAggregationSelectItem()) {
selectItem = parseAggregationSelectItem();
parseRestSelectItem();
} else {
selectItem = new CommonSelectItem(SQLUtil.getExactlyValue(parseCommonSelectItem() + parseRestSelectItem()), sqlParser.parseAlias());
}
selectStatement.getItems().add(new CommonSelectItem(SQLUtil.getExactlyValue(expression.toString()), sqlParser.parseAlias()));
selectStatement.getItems().add(selectItem);
}
protected Keyword[] getSkipKeywordsBeforeSelectItem() {
......@@ -207,16 +183,30 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
return new AggregationSelectItem(aggregationType, sqlParser.skipParentheses(), sqlParser.parseAlias());
}
private boolean hasAlias(final StringBuilder expression, final Token lastToken) {
return null != lastToken && Literals.IDENTIFIER == lastToken.getType() && !isSQLPropertyExpression(expression, lastToken) && !expression.toString().equals(lastToken.getLiterals());
}
private boolean isSQLPropertyExpression(final StringBuilder expression, final Token lastToken) {
return expression.toString().endsWith(Symbol.DOT.getLiterals() + lastToken.getLiterals());
private String parseCommonSelectItem() {
String literals = sqlParser.getLexer().getCurrentToken().getLiterals();
int position = sqlParser.getLexer().getCurrentToken().getEndPosition() - literals.length();
StringBuilder result = new StringBuilder();
result.append(literals);
sqlParser.getLexer().nextToken();
if (sqlParser.equalAny(Symbol.LEFT_PAREN)) {
result.append(sqlParser.skipParentheses());
} else if (sqlParser.equalAny(Symbol.DOT)) {
selectStatement.getSqlTokens().add(new TableToken(position, literals));
result.append(sqlParser.getLexer().getCurrentToken().getLiterals());
sqlParser.getLexer().nextToken();
result.append(sqlParser.getLexer().getCurrentToken().getLiterals());
sqlParser.getLexer().nextToken();
}
return result.toString();
}
private CommonSelectItem parseSelectItemWithAlias(final StringBuilder expression, final Token lastToken) {
return new CommonSelectItem(SQLUtil.getExactlyValue(expression.substring(0, expression.lastIndexOf(lastToken.getLiterals()))), Optional.of(lastToken.getLiterals()));
private String parseRestSelectItem() {
StringBuilder result = new StringBuilder();
while (sqlParser.equalAny(Symbol.getOperators())) {
result.append(parseCommonSelectItem());
}
return result.toString();
}
protected final void parseWhere() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册