提交 a3f8430c 编写于 作者: T terrymanu

refactor SQLContextBuilder from parsing module to rewrite module

上级 edee3928
......@@ -18,29 +18,28 @@
package com.dangdang.ddframe.rdb.sharding.parsing.parser;
import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
import com.dangdang.ddframe.rdb.sharding.constant.AggregationType;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.Lexer;
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.Literals;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Symbol;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.AggregationSelectItemContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.CommonSelectItemContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ConditionContext;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilderContext;
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.constant.AggregationType;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLTextExpr;
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.SQLIgnoreExpr;
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.parsing.parser.expr.SQLPropertyExpr;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.Lexer;
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.Literals;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Symbol;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLTextExpr;
import com.dangdang.ddframe.rdb.sharding.util.SQLUtil;
import com.google.common.base.Optional;
import lombok.Getter;
......@@ -59,15 +58,12 @@ public class SQLParser extends AbstractParser {
private final ShardingRule shardingRule;
private final SQLBuilderContext sqlBuilderContext;
@Setter
private int parametersIndex;
public SQLParser(final Lexer lexer, final ShardingRule shardingRule) {
super(lexer);
this.shardingRule = shardingRule;
sqlBuilderContext = new SQLBuilderContext(lexer.getInput());
}
/**
......@@ -158,7 +154,7 @@ public class SQLParser extends AbstractParser {
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));
sqlContext.getSqlTokens().add(new TableToken(beginPosition - owner.length(), owner, tableName));
}
}
......@@ -218,9 +214,8 @@ public class SQLParser extends AbstractParser {
if (skipJoin()) {
throw new UnsupportedOperationException("Cannot support Multiple-Table.");
}
sqlBuilderContext.getSqlTokens().add(new TableToken(beginPosition, tableContext.getOriginalLiterals(), tableContext.getName()));
sqlContext.getSqlTokens().add(new TableToken(beginPosition, tableContext.getOriginalLiterals(), tableContext.getName()));
sqlContext.getTables().add(tableContext);
sqlContext.getSqlBuilderContext().getTableNames().add(tableContext.getName());
}
/**
......@@ -253,10 +248,11 @@ public class SQLParser extends AbstractParser {
/**
* 解析查询列.
*
* @param sqlContext SQL上下文
* @param index 参数索引
* @return 查询列上下文
*/
public final SelectItemContext parseSelectItem(final int index) {
public final SelectItemContext parseSelectItem(final SQLContext sqlContext, final int index) {
skipIfEqual(DefaultKeyword.CONNECT_BY_ROOT);
String literals = getLexer().getCurrentToken().getLiterals();
if (equalAny(Symbol.STAR) || Symbol.STAR.getLiterals().equals(SQLUtil.getExactlyValue(literals))) {
......@@ -275,7 +271,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)));
sqlContext.getSqlTokens().add(new TableToken(position, value, SQLUtil.getExactlyValue(value)));
}
}
return new CommonSelectItemContext(SQLUtil.getExactlyValue(expression.toString()), parseAlias(), false);
......
......@@ -21,7 +21,6 @@ import com.dangdang.ddframe.rdb.sharding.constant.SQLType;
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.SQLPropertyExpr;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilderContext;
import com.dangdang.ddframe.rdb.sharding.util.SQLUtil;
import com.google.common.base.Optional;
import lombok.Getter;
......@@ -30,6 +29,7 @@ import lombok.Setter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
......@@ -48,7 +48,7 @@ public abstract class AbstractSQLContext implements SQLContext {
private ConditionContext conditionContext = new ConditionContext();
private SQLBuilderContext sqlBuilderContext;
private final List<SQLToken> sqlTokens = new LinkedList<>();
@Override
public final SQLType getType() {
......
......@@ -24,7 +24,7 @@ import java.util.LinkedList;
import java.util.List;
/**
* 选择项语言标记对象.
* 选择项标记对象.
*
* @author zhangliang
*/
......
......@@ -21,7 +21,7 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* 表语言标记对象.
* 分页偏移量标记对象.
*
* @author zhangliang
*/
......
......@@ -21,7 +21,7 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* 表语言标记对象.
* 分页长度标记对象.
*
* @author zhangliang
*/
......
......@@ -19,7 +19,6 @@ package com.dangdang.ddframe.rdb.sharding.parsing.parser.context;
import com.dangdang.ddframe.rdb.sharding.constant.SQLType;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expr.SQLExpr;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilderContext;
import com.google.common.base.Optional;
import java.util.List;
......@@ -67,13 +66,6 @@ public interface SQLContext {
*/
Optional<ShardingColumnContext> findColumn(SQLExpr expr);
/**
* 设置SQL构建器上下文.
*
* @param sqlBuilderContext SQL构建器上下文
*/
void setSqlBuilderContext(SQLBuilderContext sqlBuilderContext);
/**
* 获取排序上下文集合.
*
......@@ -110,9 +102,9 @@ public interface SQLContext {
void setLimitContext(LimitContext limitContext);
/**
* 获取SQL构建器上下文.
*
* @return SQL构建器上下文
* 获取SQL标记集合.
*
* @return SQL标记集合
*/
SQLBuilderContext getSqlBuilderContext();
List<SQLToken> getSqlTokens();
}
......@@ -18,7 +18,7 @@
package com.dangdang.ddframe.rdb.sharding.parsing.parser.context;
/**
* SQL语言标记对象.
* SQL标记对象.
*
* @author zhangliang
*/
......
......@@ -21,7 +21,7 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* 表语言标记对象.
* 表标记对象.
*
* @author zhangliang
*/
......
......@@ -26,6 +26,7 @@ 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.context.SQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException;
/**
......@@ -43,10 +44,11 @@ public final class MySQLParser extends SQLParser {
/**
* 解析分页上.
*
* @param sqlContext SQL上下文
* @param parametersIndex 参数索引
* @return 分页上下文
*/
public LimitContext parseLimit(final int parametersIndex) {
public LimitContext parseLimit(final SQLContext sqlContext, final int parametersIndex) {
skipIfEqual(MySQLKeyword.LIMIT);
int valueIndex = -1;
int valueBeginPosition = getLexer().getCurrentToken().getEndPosition();
......@@ -65,18 +67,19 @@ public final class MySQLParser extends SQLParser {
}
getLexer().nextToken();
if (skipIfEqual(Symbol.COMMA)) {
return getLimitContextWithComma(parametersIndex, valueIndex, valueBeginPosition, value, isParameterForValue);
return getLimitContextWithComma(sqlContext, parametersIndex, valueIndex, valueBeginPosition, value, isParameterForValue);
}
if (skipIfEqual(MySQLKeyword.OFFSET)) {
return getLimitContextWithOffset(parametersIndex, valueIndex, valueBeginPosition, value, isParameterForValue);
return getLimitContextWithOffset(sqlContext, parametersIndex, valueIndex, valueBeginPosition, value, isParameterForValue);
}
if (!isParameterForValue) {
getSqlBuilderContext().getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
sqlContext.getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
}
return new LimitContext(value, valueIndex);
}
private LimitContext getLimitContextWithComma(final int parametersIndex, final int valueIndex, final int valueBeginPosition, final int value, final boolean isParameterForValue) {
private LimitContext getLimitContextWithComma(final SQLContext sqlContext,
final int parametersIndex, final int valueIndex, final int valueBeginPosition, final int value, final boolean isParameterForValue) {
int rowCountBeginPosition = getLexer().getCurrentToken().getEndPosition();
int rowCount;
int rowCountIndex = -1;
......@@ -94,16 +97,16 @@ public final class MySQLParser extends SQLParser {
}
getLexer().nextToken();
if (!isParameterForValue) {
getSqlBuilderContext().getSqlTokens().add(new OffsetLimitToken(valueBeginPosition, value));
sqlContext.getSqlTokens().add(new OffsetLimitToken(valueBeginPosition, value));
}
if (!isParameterForRowCount) {
getSqlBuilderContext().getSqlTokens().add(new RowCountLimitToken(rowCountBeginPosition, rowCount));
sqlContext.getSqlTokens().add(new RowCountLimitToken(rowCountBeginPosition, rowCount));
}
return new LimitContext(value, rowCount, valueIndex, rowCountIndex);
}
private LimitContext getLimitContextWithOffset(
final int parametersIndex, final int valueIndex, final int valueBeginPosition, final int value, final boolean isParameterForValue) {
private LimitContext getLimitContextWithOffset(final SQLContext sqlContext,
final int parametersIndex, final int valueIndex, final int valueBeginPosition, final int value, final boolean isParameterForValue) {
int offsetBeginPosition = getLexer().getCurrentToken().getEndPosition();
int offset;
int offsetIndex = -1;
......@@ -121,10 +124,10 @@ public final class MySQLParser extends SQLParser {
}
getLexer().nextToken();
if (!isParameterForOffset) {
getSqlBuilderContext().getSqlTokens().add(new OffsetLimitToken(offsetBeginPosition, offset));
sqlContext.getSqlTokens().add(new OffsetLimitToken(offsetBeginPosition, offset));
}
if (!isParameterForValue) {
getSqlBuilderContext().getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
sqlContext.getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
}
return new LimitContext(offset, value, offsetIndex, valueIndex);
}
......
......@@ -46,7 +46,7 @@ public class MySQLSelectParser extends AbstractSelectParser {
parseGroupBy();
getSqlContext().getOrderByContexts().addAll(parseOrderBy(getSqlContext()));
if (getSqlParser().equalAny(MySQLKeyword.LIMIT)) {
getSqlContext().setLimitContext(((MySQLParser) getSqlParser()).parseLimit(getParametersIndex()));
getSqlContext().setLimitContext(((MySQLParser) getSqlParser()).parseLimit(getSqlContext(), getParametersIndex()));
}
if (getSqlParser().equalAny(DefaultKeyword.PROCEDURE)) {
throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
......
......@@ -41,7 +41,6 @@ public abstract class AbstractDeleteParser implements SQLStatementParser {
public AbstractDeleteParser(final SQLParser sqlParser) {
this.sqlParser = sqlParser;
sqlContext = new DeleteSQLContext();
sqlContext.setSqlBuilderContext(sqlParser.getSqlBuilderContext());
}
@Override
......
......@@ -58,7 +58,6 @@ public abstract class AbstractInsertParser implements SQLStatementParser {
this.sqlParser = sqlParser;
this.shardingRule = shardingRule;
sqlContext = new InsertSQLContext();
sqlContext.setSqlBuilderContext(sqlParser.getSqlBuilderContext());
}
@Override
......
......@@ -66,7 +66,6 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
public AbstractSelectParser(final SQLParser sqlParser) {
this.sqlParser = sqlParser;
sqlContext = new SelectSQLContext();
sqlContext.setSqlBuilderContext(sqlParser.getSqlBuilderContext());
}
@Override
......@@ -75,7 +74,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
sqlContext.getOrderByContexts().addAll(parseOrderBy(getSqlContext()));
customizedSelect();
if (!itemsToken.getItems().isEmpty()) {
sqlParser.getSqlBuilderContext().getSqlTokens().add(itemsToken);
sqlContext.getSqlTokens().add(itemsToken);
}
return sqlContext;
}
......@@ -113,7 +112,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
protected final void parseSelectList() {
int index = 1;
do {
SelectItemContext selectItemContext = sqlParser.parseSelectItem(index);
SelectItemContext selectItemContext = sqlParser.parseSelectItem(sqlContext, index);
sqlContext.getItemContexts().add(selectItemContext);
if (selectItemContext instanceof CommonSelectItemContext && ((CommonSelectItemContext) selectItemContext).isStar()) {
sqlContext.setContainStar(true);
......@@ -315,9 +314,8 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
return;
}
// FIXME 根据shardingRule过滤table
sqlParser.getSqlBuilderContext().getSqlTokens().add(new TableToken(beginPosition, literals, SQLUtil.getExactlyValue(literals)));
sqlContext.getSqlTokens().add(new TableToken(beginPosition, literals, SQLUtil.getExactlyValue(literals)));
sqlContext.getTables().add(new TableContext(literals, SQLUtil.getExactlyValue(literals), getSqlParser().parseAlias()));
sqlContext.getSqlBuilderContext().getTableNames().add(SQLUtil.getExactlyValue(literals));
}
protected void parseJoinTable() {
......@@ -344,8 +342,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())));
sqlContext.getSqlTokens().add(new TableToken(startPosition, sqlPropertyExpr.getOwner().getName(), SQLUtil.getExactlyValue(sqlPropertyExpr.getOwner().getName())));
}
}
}
......
......@@ -44,7 +44,6 @@ public abstract class AbstractUpdateParser implements SQLStatementParser {
public AbstractUpdateParser(final SQLParser sqlParser) {
this.sqlParser = sqlParser;
sqlContext = new UpdateSQLContext();
sqlContext.setSqlBuilderContext(sqlParser.getSqlBuilderContext());
}
@Override
......@@ -78,7 +77,7 @@ public abstract class AbstractUpdateParser implements SQLStatementParser {
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));
sqlContext.getSqlTokens().add(new TableToken(beginPosition - literals.length(), literals, tableName));
}
sqlParser.getLexer().nextToken();
}
......
......@@ -35,7 +35,7 @@ public class GenerateKeysUtils {
}
}
if (!columnsToken.getItems().isEmpty()) {
insertSQLContext.getSqlBuilderContext().getSqlTokens().add(columnsToken);
insertSQLContext.getSqlTokens().add(columnsToken);
}
ItemsToken valuesToken = new ItemsToken(insertSQLContext.getValuesListLastPosition());
int offset = parameters.size() - 1;
......@@ -62,7 +62,7 @@ public class GenerateKeysUtils {
insertSQLContext.getGeneratedKeyContext().putValue(each, generatedId);
}
if (!valuesToken.getItems().isEmpty()) {
insertSQLContext.getSqlBuilderContext().getSqlTokens().add(valuesToken);
insertSQLContext.getSqlTokens().add(valuesToken);
}
}
......
......@@ -20,9 +20,10 @@ 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.SQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableToken;
import lombok.RequiredArgsConstructor;
import java.util.Collections;
import java.util.Comparator;
......@@ -33,13 +34,20 @@ import java.util.List;
*
* @author zhangliang
*/
@RequiredArgsConstructor
public final class SQLRewriteEngine {
private final SQLBuilderContext sqlBuilderContext;
private SQLBuilder sqlBuilder;
public SQLRewriteEngine(final String originalSQL, final SQLContext sqlContext) {
sqlBuilderContext = new SQLBuilderContext(originalSQL);
for (TableContext each : sqlContext.getTables()) {
sqlBuilderContext.getTableNames().add(each.getName());
}
sqlBuilderContext.getSqlTokens().addAll(sqlContext.getSqlTokens());
}
/**
* SQL重写.
*
......
......@@ -63,7 +63,7 @@ public class PreparedSQLRouter {
}
// TODO 提炼至rewrite模块
setLimit(parameters);
return engine.routeSQL(sqlContext, parameters);
return engine.routeSQL(logicSql, sqlContext, parameters);
}
private void setLimit(final List<Object> parameters) {
......
......@@ -36,7 +36,6 @@ 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.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilderContext;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLRewriteEngine;
import com.dangdang.ddframe.rdb.sharding.router.binding.BindingTablesRouter;
import com.dangdang.ddframe.rdb.sharding.router.database.DatabaseRouter;
......@@ -70,12 +69,12 @@ public final class SQLRouteEngine {
/**
* SQL路由.
*
* @param logicSql 逻辑SQL
* @param logicSQL 逻辑SQL
* @return 路由结果
* @throws SQLParsingException SQL解析失败异常
*/
public SQLRouteResult route(final String logicSql) throws SQLParsingException {
return routeSQL(parseSQL(logicSql, Collections.emptyList()), Collections.emptyList());
public SQLRouteResult route(final String logicSQL) throws SQLParsingException {
return routeSQL(logicSQL, parseSQL(logicSQL, Collections.emptyList()), Collections.emptyList());
}
/**
......@@ -120,16 +119,14 @@ public final class SQLRouteEngine {
default:
throw new UnsupportedOperationException("");
}
SQLBuilderContext sqlBuilderContext = new SQLBuilderContext(logicSql);
result.setSqlBuilderContext(sqlBuilderContext);
return result;
}
SQLRouteResult routeSQL(final SQLContext sqlContext, final List<Object> parameters) {
SQLRouteResult routeSQL(final String logicSQL, final SQLContext sqlContext, final List<Object> parameters) {
Context context = MetricsContext.start("Route SQL");
SQLRouteResult result = new SQLRouteResult(sqlContext);
RoutingResult routingResult = routeSQL(sqlContext.getConditionContext(), sqlContext, parameters);
SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(sqlContext.getSqlBuilderContext());
SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(logicSQL, sqlContext);
result.getExecutionUnits().addAll(routingResult.getSQLExecutionUnits(sqlRewriteEngine.rewrite()));
amendSQLAccordingToRouteResult(parameters, result, sqlRewriteEngine);
MetricsContext.stop(context);
......
......@@ -23,8 +23,8 @@ import com.dangdang.ddframe.rdb.sharding.constant.ShardingOperator;
import com.dangdang.ddframe.rdb.sharding.parsing.jaxb.Assert;
import com.dangdang.ddframe.rdb.sharding.parsing.jaxb.Asserts;
import com.dangdang.ddframe.rdb.sharding.parsing.jaxb.Value;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ConditionContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.AggregationSelectItemContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.ConditionContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.GroupByContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.LimitContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.OrderByContext;
......
......@@ -37,24 +37,24 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
@Test
public void parseWithoutCondition() throws SQLException {
String sql = "DELETE FROM TABLE_XXX";
ShardingRule shardingRule = createShardingRule();
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "DELETE FROM TABLE_XXX", shardingRule);
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, sql, shardingRule);
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertThat(sqlContext.getTables().get(0).getName(), is("TABLE_XXX"));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("DELETE FROM [Token(TABLE_XXX)]"));
assertThat(new SQLRewriteEngine(sql, sqlContext).rewrite().toString(), is("DELETE FROM [Token(TABLE_XXX)]"));
}
@Test
public void parseWithoutParameter() throws SQLException {
String sql = "DELETE FROM TABLE_XXX xxx WHERE field4<10 AND TABLE_XXX.field1=1 AND field5>10 AND xxx.field2 IN (1,3) AND field6<=10 AND field3 BETWEEN 5 AND 20 AND field7>=10";
ShardingRule shardingRule = createShardingRule();
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL,
"DELETE FROM TABLE_XXX xxx WHERE field4<10 AND TABLE_XXX.field1=1 AND field5>10 AND xxx.field2 IN (1,3) AND field6<=10 AND field3 BETWEEN 5 AND 20 AND field7>=10",
shardingRule);
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, sql, shardingRule);
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertDeleteStatementWithoutParameter(sqlContext);
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is(
assertThat(new SQLRewriteEngine(sql, sqlContext).rewrite().toString(), is(
"DELETE FROM [Token(TABLE_XXX)] xxx WHERE field4<10 AND [Token(TABLE_XXX)].field1=1 AND field5>10 AND xxx.field2 IN (1,3) AND field6<=10 AND field3 BETWEEN 5 AND 20 AND field7>=10"));
}
......@@ -79,13 +79,13 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
@Test
public void parseWithParameter() throws SQLException {
String sql = "DELETE FROM TABLE_XXX xxx WHERE field4<? AND field1=? AND field5>? AND field2 IN (?,?) AND field6<=? AND field3 BETWEEN ? AND ? AND field7>=?";
ShardingRule shardingRule = createShardingRule();
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL,
"DELETE FROM TABLE_XXX xxx WHERE field4<? AND field1=? AND field5>? AND field2 IN (?,?) AND field6<=? AND field3 BETWEEN ? AND ? AND field7>=?", shardingRule);
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, sql, shardingRule);
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertDeleteStatementWithParameter(sqlContext);
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is(
assertThat(new SQLRewriteEngine(sql, sqlContext).rewrite().toString(), is(
"DELETE FROM [Token(TABLE_XXX)] xxx WHERE field4<? AND field1=? AND field5>? AND field2 IN (?,?) AND field6<=? AND field3 BETWEEN ? AND ? AND field7>=?"));
}
......@@ -157,6 +157,6 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
assertThat(condition.getValues().size(), is(1));
assertThat(condition.getValues().get(0), is((Comparable) 1));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString().replace("([Token(TABLE_XXX)] )", "([Token(TABLE_XXX)])"), is(expectedSQL));
assertThat(new SQLRewriteEngine(actualSQL, sqlContext).rewrite().toString().replace("([Token(TABLE_XXX)] )", "([Token(TABLE_XXX)])"), is(expectedSQL));
}
}
......@@ -53,44 +53,48 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
@Test
public void parseWithoutParameter() throws SQLException {
String sql = "INSERT INTO `TABLE_XXX` (`field1`, `field2`) VALUES (10, 1)";
ShardingRule shardingRule = createShardingRule();
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "INSERT INTO `TABLE_XXX` (`field1`, `field2`) VALUES (10, 1)", shardingRule);
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, sql, shardingRule);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatementWithoutParameter(sqlContext);
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, `field2`) VALUES (10, 1)"));
assertThat(new SQLRewriteEngine(sql, sqlContext).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, `field2`) VALUES (10, 1)"));
}
@Test
public void parseWithParameter() {
String sql = "INSERT INTO TABLE_XXX (field1, field2) VALUES (?, ?)";
ShardingRule shardingRule = createShardingRule();
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "INSERT INTO TABLE_XXX (field1, field2) VALUES (?, ?)", shardingRule);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatementWithParameter(sqlContext);
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (field1, field2) VALUES (?, ?)"));
assertThat(new SQLRewriteEngine(sql, sqlContext).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (field1, field2) VALUES (?, ?)"));
}
@Test
public void parseWithAutoIncrementColumnsWithoutParameter() throws SQLException {
String sql = "INSERT INTO `TABLE_XXX` (`field1`) VALUES (10)";
ShardingRule shardingRule = createShardingRuleWithAutoIncrementColumns();
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "INSERT INTO `TABLE_XXX` (`field1`) VALUES (10)", shardingRule);
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, sql, shardingRule);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatementWithoutParameter(sqlContext);
// TODO 放入rewrite模块断言
GenerateKeysUtils.appendGenerateKeys(shardingRule, Collections.emptyList(), sqlContext);
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (10, 1)"));
assertThat(new SQLRewriteEngine(sql, sqlContext).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (10, 1)"));
}
@Test
public void parseWithAutoIncrementColumnsWithParameter() throws SQLException {
String sql = "INSERT INTO `TABLE_XXX` (`field1`) VALUES (?)";
ShardingRule shardingRule = createShardingRuleWithAutoIncrementColumns();
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "INSERT INTO `TABLE_XXX` (`field1`) VALUES (?)", shardingRule);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatementWithParameter(sqlContext);
// TODO 放入rewrite模块断言
GenerateKeysUtils.appendGenerateKeys(shardingRule, Collections.emptyList(), sqlContext);
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (?, 1)"));
assertThat(new SQLRewriteEngine(sql, sqlContext).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (?, 1)"));
}
private void assertInsertStatementWithoutParameter(final InsertSQLContext sqlContext) {
......@@ -162,7 +166,7 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
assertThat(condition.getValues().size(), is(1));
assertThat(condition.getValues().get(0), is((Comparable) 1));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is(expectedSQL));
assertThat(new SQLRewriteEngine(actualSQL, sqlContext).rewrite().toString(), is(expectedSQL));
}
@Test(expected = UnsupportedOperationException.class)
......
......@@ -27,8 +27,6 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsu
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLRewriteEngine;
import org.junit.Test;
import java.sql.SQLException;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
......@@ -37,24 +35,26 @@ import static org.junit.Assert.assertTrue;
public final class UpdateStatementParserTest extends AbstractStatementParserTest {
@Test
public void parseWithoutCondition() throws SQLException, NoSuchFieldException, IllegalAccessException {
public void parseWithoutCondition() {
String sql = "UPDATE TABLE_XXX SET field1=field1+1";
ShardingRule shardingRule = createShardingRule();
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "UPDATE TABLE_XXX SET field1=field1+1", shardingRule);
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, sql, shardingRule);
UpdateSQLContext sqlContext = (UpdateSQLContext) statementParser.parseStatement();
assertThat(sqlContext.getTables().get(0).getName(), is("TABLE_XXX"));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("UPDATE [Token(TABLE_XXX)] SET field1=field1+1"));
assertThat(new SQLRewriteEngine(sql, sqlContext).rewrite().toString(), is("UPDATE [Token(TABLE_XXX)] SET field1=field1+1"));
}
@Test
public void parseWithoutParameter() {
String sql = "UPDATE TABLE_XXX xxx SET TABLE_XXX.field1=field1+1,xxx.field2=2 WHERE TABLE_XXX.field4<10 AND"
+ " TABLE_XXX.field1=1 AND xxx.field5>10 AND TABLE_XXX.field2 IN (1,3) AND xxx.field6<=10 AND TABLE_XXX.field3 BETWEEN 5 AND 20 AND xxx.field7>=10";
ShardingRule shardingRule = createShardingRule();
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "UPDATE TABLE_XXX xxx SET TABLE_XXX.field1=field1+1,xxx.field2=2 WHERE TABLE_XXX.field4<10 AND"
+ " TABLE_XXX.field1=1 AND xxx.field5>10 AND TABLE_XXX.field2 IN (1,3) AND xxx.field6<=10 AND TABLE_XXX.field3 BETWEEN 5 AND 20 AND xxx.field7>=10", shardingRule);
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, sql, shardingRule);
UpdateSQLContext sqlContext = (UpdateSQLContext) statementParser.parseStatement();
assertUpdateStatementWithoutParameter(sqlContext);
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(),
assertThat(new SQLRewriteEngine(sql, sqlContext).rewrite().toString(),
is("UPDATE [Token(TABLE_XXX)] xxx SET [Token(TABLE_XXX)].field1=field1+1,xxx.field2=2 WHERE [Token(TABLE_XXX)].field4<10 "
+ "AND [Token(TABLE_XXX)].field1=1 AND xxx.field5>10 AND [Token(TABLE_XXX)].field2 IN (1,3) AND xxx.field6<=10 AND [Token(TABLE_XXX)].field3 BETWEEN 5 AND 20 AND xxx.field7>=10"));
}
......@@ -80,14 +80,13 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
@Test
public void parseWithParameter() {
String sql = "UPDATE TABLE_XXX AS xxx SET field1=field1+? WHERE field4<? AND xxx.field1=? AND field5>? AND xxx.field2 IN (?, ?) AND field6<=? AND xxx.field3 BETWEEN ? AND ? AND field7>=?";
ShardingRule shardingRule = createShardingRule();
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL,
"UPDATE TABLE_XXX AS xxx SET field1=field1+? WHERE field4<? AND xxx.field1=? AND field5>? AND xxx.field2 IN (?, ?) AND field6<=? AND xxx.field3 BETWEEN ? AND ? AND field7>=?",
shardingRule);
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, sql, shardingRule);
UpdateSQLContext sqlContext = (UpdateSQLContext) statementParser.parseStatement();
assertUpdateStatementWitParameter(sqlContext);
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("UPDATE [Token(TABLE_XXX)] AS xxx SET field1=field1+? "
assertThat(new SQLRewriteEngine(sql, sqlContext).rewrite().toString(), is("UPDATE [Token(TABLE_XXX)] AS xxx SET field1=field1+? "
+ "WHERE field4<? AND xxx.field1=? AND field5>? AND xxx.field2 IN (?, ?) AND field6<=? AND xxx.field3 BETWEEN ? AND ? AND field7>=?"));
}
......@@ -152,6 +151,6 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
assertThat(condition.getValues().size(), is(1));
assertThat(condition.getValues().get(0), is((Comparable) 1));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is(expectedSQL));
assertThat(new SQLRewriteEngine(actualSQL, sqlContext).rewrite().toString(), is(expectedSQL));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册