提交 773e9dea 编写于 作者: T terrymanu

extract token package

上级 edee3928
......@@ -26,7 +26,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SelectItemContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ShardingColumnContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.TableToken;
import com.dangdang.ddframe.rdb.sharding.constant.AggregationType;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLTextExpr;
......@@ -155,10 +155,9 @@ public class SQLParser extends AbstractParser {
}
private void setTableToken(final SQLContext sqlContext, final int beginPosition, final SQLPropertyExpr propertyExpr) {
String tableName = sqlContext.getTables().get(0).getName();
String owner = propertyExpr.getOwner().getName();
if (tableName.equalsIgnoreCase(SQLUtil.getExactlyValue(owner))) {
sqlBuilderContext.getSqlTokens().add(new TableToken(beginPosition - owner.length(), owner, tableName));
if (sqlContext.getTables().get(0).getName().equalsIgnoreCase(SQLUtil.getExactlyValue(owner))) {
sqlBuilderContext.getSqlTokens().add(new TableToken(beginPosition - owner.length(), owner));
}
}
......@@ -218,7 +217,7 @@ public class SQLParser extends AbstractParser {
if (skipJoin()) {
throw new UnsupportedOperationException("Cannot support Multiple-Table.");
}
sqlBuilderContext.getSqlTokens().add(new TableToken(beginPosition, tableContext.getOriginalLiterals(), tableContext.getName()));
sqlBuilderContext.getSqlTokens().add(new TableToken(beginPosition, tableContext.getOriginalLiterals()));
sqlContext.getTables().add(tableContext);
sqlContext.getSqlBuilderContext().getTableNames().add(tableContext.getName());
}
......@@ -275,7 +274,7 @@ public class SQLParser extends AbstractParser {
expression.append(value);
getLexer().nextToken();
if (equalAny(Symbol.DOT)) {
sqlBuilderContext.getSqlTokens().add(new TableToken(position, value, SQLUtil.getExactlyValue(value)));
sqlBuilderContext.getSqlTokens().add(new TableToken(position, value));
}
}
return new CommonSelectItemContext(SQLUtil.getExactlyValue(expression.toString()), parseAlias(), false);
......
......@@ -24,8 +24,8 @@ 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.SQLParser;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.LimitContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.OffsetLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.RowCountLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.OffsetLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.RowCountLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException;
/**
......
......@@ -21,13 +21,13 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.AggregationSelec
import com.dangdang.ddframe.rdb.sharding.constant.AggregationType;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.CommonSelectItemContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.GroupByContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ItemsToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.ItemsToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.OrderByContext;
import com.dangdang.ddframe.rdb.sharding.constant.OrderType;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SelectItemContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SelectSQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.TableToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLExpr;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLIdentifierExpr;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLNumberExpr;
......@@ -315,7 +315,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
return;
}
// FIXME 根据shardingRule过滤table
sqlParser.getSqlBuilderContext().getSqlTokens().add(new TableToken(beginPosition, literals, SQLUtil.getExactlyValue(literals)));
sqlParser.getSqlBuilderContext().getSqlTokens().add(new TableToken(beginPosition, literals));
sqlContext.getTables().add(new TableContext(literals, SQLUtil.getExactlyValue(literals), getSqlParser().parseAlias()));
sqlContext.getSqlBuilderContext().getTableNames().add(SQLUtil.getExactlyValue(literals));
}
......@@ -344,8 +344,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
SQLPropertyExpr sqlPropertyExpr = (SQLPropertyExpr) sqlExpr;
for (TableContext each : sqlContext.getTables()) {
if (each.getName().equalsIgnoreCase(SQLUtil.getExactlyValue(sqlPropertyExpr.getOwner().getName()))) {
sqlParser.getSqlBuilderContext().getSqlTokens().add(
new TableToken(startPosition, sqlPropertyExpr.getOwner().getName(), SQLUtil.getExactlyValue(sqlPropertyExpr.getOwner().getName())));
sqlParser.getSqlBuilderContext().getSqlTokens().add(new TableToken(startPosition, sqlPropertyExpr.getOwner().getName()));
}
}
}
......
......@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.update;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.DefaultKeyword;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Symbol;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.SQLParser;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.TableToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.UpdateSQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatementParser;
import com.dangdang.ddframe.rdb.sharding.util.SQLUtil;
......@@ -75,10 +75,9 @@ public abstract class AbstractUpdateParser implements SQLStatementParser {
int beginPosition = sqlParser.getLexer().getCurrentToken().getEndPosition();
String literals = sqlParser.getLexer().getCurrentToken().getLiterals();
sqlParser.getLexer().nextToken();
String tableName = sqlContext.getTables().get(0).getName();
if (sqlParser.skipIfEqual(Symbol.DOT)) {
if (tableName.equalsIgnoreCase(SQLUtil.getExactlyValue(literals))) {
sqlParser.getSqlBuilderContext().getSqlTokens().add(new TableToken(beginPosition - literals.length(), literals, tableName));
if (sqlContext.getTables().get(0).getName().equalsIgnoreCase(SQLUtil.getExactlyValue(literals))) {
sqlParser.getSqlBuilderContext().getSqlTokens().add(new TableToken(beginPosition - literals.length(), literals));
}
sqlParser.getLexer().nextToken();
}
......
......@@ -15,7 +15,7 @@
* </p>
*/
package com.dangdang.ddframe.rdb.sharding.parsing.parser.context;
package com.dangdang.ddframe.rdb.sharding.parsing.parser.token;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
......
......@@ -15,7 +15,7 @@
* </p>
*/
package com.dangdang.ddframe.rdb.sharding.parsing.parser.context;
package com.dangdang.ddframe.rdb.sharding.parsing.parser.token;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
......
......@@ -15,7 +15,7 @@
* </p>
*/
package com.dangdang.ddframe.rdb.sharding.parsing.parser.context;
package com.dangdang.ddframe.rdb.sharding.parsing.parser.token;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
......
......@@ -15,7 +15,7 @@
* </p>
*/
package com.dangdang.ddframe.rdb.sharding.parsing.parser.context;
package com.dangdang.ddframe.rdb.sharding.parsing.parser.token;
/**
* SQL语言标记对象.
......
......@@ -15,8 +15,9 @@
* </p>
*/
package com.dangdang.ddframe.rdb.sharding.parsing.parser.context;
package com.dangdang.ddframe.rdb.sharding.parsing.parser.token;
import com.dangdang.ddframe.rdb.sharding.util.SQLUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
......@@ -33,5 +34,12 @@ public final class TableToken implements SQLToken {
private final String originalLiterals;
private final String tableName;
/**
* 获取表名称.
*
* @return 表名称
*/
public String getTableName() {
return SQLUtil.getExactlyValue(originalLiterals);
}
}
package com.dangdang.ddframe.rdb.sharding.rewrite;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.SQLToken;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
......
......@@ -17,11 +17,11 @@
package com.dangdang.ddframe.rdb.sharding.rewrite;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ItemsToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.OffsetLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.RowCountLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.ItemsToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.OffsetLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.RowCountLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.SQLToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.TableToken;
import lombok.RequiredArgsConstructor;
import java.util.Collections;
......
......@@ -26,15 +26,18 @@ import com.dangdang.ddframe.rdb.sharding.parsing.SQLParsingEngine;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ConditionContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.DeleteSQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.InsertSQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.ItemsToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.LimitContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.OffsetLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.RowCountLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.OffsetLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.RowCountLimitToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SelectSQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ShardingColumnContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.UpdateSQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException;
import com.dangdang.ddframe.rdb.sharding.rewrite.GenerateKeysUtils;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLNumberExpr;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLPlaceholderExpr;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilderContext;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLRewriteEngine;
......@@ -49,6 +52,7 @@ import com.google.common.collect.Sets;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
......@@ -96,12 +100,59 @@ public final class SQLRouteEngine {
log.debug("Logic SQL: {}, {}", logicSql, parameters);
SQLContext result = new SQLParsingEngine(databaseType, logicSql, shardingRule).parseStatement();
MetricsContext.stop(context);
// TODO 提炼至rewrite模块
if (result instanceof InsertSQLContext) {
GenerateKeysUtils.appendGenerateKeys(shardingRule, parameters, (InsertSQLContext) result);
String tableName = result.getTables().get(0).getName();
ItemsToken columnsToken = new ItemsToken(((InsertSQLContext) result).getColumnsListLastPosition());
Collection<String> autoIncrementColumns = shardingRule.getAutoIncrementColumns(tableName);
for (String each : autoIncrementColumns) {
if (!isIncluded((InsertSQLContext) result, each)) {
columnsToken.getItems().add(each);
}
}
if (!columnsToken.getItems().isEmpty()) {
result.getSqlBuilderContext().getSqlTokens().add(columnsToken);
}
ItemsToken valuesToken = new ItemsToken(((InsertSQLContext) result).getValuesListLastPosition());
int offset = parameters.size() - 1;
for (String each : autoIncrementColumns) {
if (isIncluded((InsertSQLContext) result, each)) {
continue;
}
Number generatedId = shardingRule.findTableRule(tableName).generateId(each);
ShardingColumnContext shardingColumnContext = new ShardingColumnContext(each, tableName, true);
if (parameters.isEmpty()) {
valuesToken.getItems().add(generatedId.toString());
if (shardingRule.isShardingColumn(shardingColumnContext)) {
result.getConditionContext().add(new ConditionContext.Condition(shardingColumnContext, new SQLNumberExpr(generatedId)));
}
} else {
valuesToken.getItems().add("?");
parameters.add(generatedId);
offset++;
if (shardingRule.isShardingColumn(shardingColumnContext)) {
result.getConditionContext().add(new ConditionContext.Condition(shardingColumnContext, new SQLPlaceholderExpr(offset)));
}
}
((InsertSQLContext) result).getGeneratedKeyContext().getColumns().add(each);
((InsertSQLContext) result).getGeneratedKeyContext().putValue(each, generatedId);
}
if (!valuesToken.getItems().isEmpty()) {
result.getSqlBuilderContext().getSqlTokens().add(valuesToken);
}
}
return result;
}
private boolean isIncluded(final InsertSQLContext insertSQLContext, final String autoIncrementColumn) {
for (ShardingColumnContext shardingColumnContext : insertSQLContext.getShardingColumnContexts()) {
if (shardingColumnContext.getColumnName().equalsIgnoreCase(autoIncrementColumn)) {
return true;
}
}
return false;
}
private SQLContext buildHintParsedResult(final String logicSql) {
SQLContext result;
switch (SQLUtil.getTypeByStart(logicSql)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册