提交 2543b09c 编写于 作者: T terrymanu

add rewrite module

上级 abee4c7d
......@@ -21,7 +21,7 @@ import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
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.parsing.parser.context.SQLBuilderContext;
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;
......@@ -220,6 +220,7 @@ public class SQLParser extends AbstractParser {
}
sqlBuilderContext.getSqlTokens().add(new TableToken(beginPosition, tableContext.getOriginalLiterals(), tableContext.getName()));
sqlContext.getTables().add(tableContext);
sqlContext.getSqlBuilderContext().getTableNames().add(tableContext.getName());
}
/**
......
......@@ -21,9 +21,9 @@ 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.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
......@@ -50,9 +50,6 @@ public abstract class AbstractSQLContext implements SQLContext {
private SQLBuilderContext sqlBuilderContext;
@Setter(AccessLevel.NONE)
private SQLBuilder sqlBuilder;
@Override
public final SQLType getType() {
return type;
......@@ -128,12 +125,4 @@ public abstract class AbstractSQLContext implements SQLContext {
@Override
public void setLimitContext(final LimitContext limitContext) {
}
@Override
public SQLBuilder getSqlBuilder() {
if (null == sqlBuilder) {
sqlBuilder = sqlBuilderContext.toSqlBuilder(tables);
}
return sqlBuilder;
}
}
......@@ -19,6 +19,7 @@ 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;
......@@ -66,20 +67,6 @@ public interface SQLContext {
*/
Optional<ShardingColumnContext> findColumn(SQLExpr expr);
/**
* 获取SQL构建器上下文.
*
* @return SQL构建器上下文
*/
SQLBuilderContext getSqlBuilderContext();
/**
* 获取SQL构建器.
*
* @return SQL构建器
*/
SQLBuilder getSqlBuilder();
/**
* 设置SQL构建器上下文.
*
......@@ -121,4 +108,11 @@ public interface SQLContext {
* @param limitContext 分页上下文
*/
void setLimitContext(LimitContext limitContext);
/**
* 获取SQL构建器上下文.
*
* @return SQL构建器上下文
*/
SQLBuilderContext getSqlBuilderContext();
}
......@@ -317,6 +317,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
// FIXME 根据shardingRule过滤table
sqlParser.getSqlBuilderContext().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() {
......
......@@ -17,11 +17,11 @@
package com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.update;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.TableToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.UpdateSQLContext;
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.context.UpdateSQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatementParser;
import com.dangdang.ddframe.rdb.sharding.util.SQLUtil;
import lombok.AccessLevel;
......
......@@ -15,7 +15,7 @@
* </p>
*/
package com.dangdang.ddframe.rdb.sharding.parsing.parser.context;
package com.dangdang.ddframe.rdb.sharding.rewrite;
import com.google.common.base.Joiner;
import lombok.Getter;
......
package com.dangdang.ddframe.rdb.sharding.rewrite;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLToken;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.TreeSet;
/**
* SQL构建器上下文.
*
* @author zhangliang
*/
@RequiredArgsConstructor
@Getter
public final class SQLBuilderContext {
private final String originalSQL;
private final List<SQLToken> sqlTokens = new LinkedList<>();
private final Collection<String> tableNames = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
}
package com.dangdang.ddframe.rdb.sharding.parsing.parser.context;
/*
* Copyright 1999-2015 dangdang.com.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* </p>
*/
import lombok.Getter;
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 lombok.RequiredArgsConstructor;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
/**
* SQL构建器上下文.
* SQL重写引擎.
*
* @author zhangliang
*/
@RequiredArgsConstructor
@Getter
public final class SQLBuilderContext {
public final class SQLRewriteEngine {
private final String originalSQL;
private final SQLBuilderContext sqlBuilderContext;
private final List<SQLToken> sqlTokens = new LinkedList<>();
private SQLBuilder sqlBuilder;
/**
* 生成SQL构建器.
*
* @param tables 表对象
* SQL重写.
*
* @return SQL构建器
*/
public SQLBuilder toSqlBuilder(final List<TableContext> tables) {
public SQLBuilder rewrite() {
if (null == sqlBuilder) {
sqlBuilder = rewriteInternal(sqlBuilderContext);
}
return sqlBuilder;
}
private SQLBuilder rewriteInternal(final SQLBuilderContext sqlBuilderContext) {
SQLBuilder result = new SQLBuilder();
if (sqlTokens.isEmpty()) {
result.append(originalSQL);
if (sqlBuilderContext.getSqlTokens().isEmpty()) {
result.append(sqlBuilderContext.getOriginalSQL());
return result;
}
int count = 0;
Collections.sort(sqlTokens, new Comparator<SQLToken>() {
@Override
public int compare(final SQLToken o1, final SQLToken o2) {
return o1.getBeginPosition() - o2.getBeginPosition();
}
});
List<SQLToken> sqlTokens = sqlBuilderContext.getSqlTokens();
sortByBeginPosition();
for (SQLToken each : sqlTokens) {
if (0 == count) {
result.append(originalSQL.substring(0, each.getBeginPosition()));
result.append(sqlBuilderContext.getOriginalSQL().substring(0, each.getBeginPosition()));
}
if (each instanceof TableToken) {
String tableName = ((TableToken) each).getTableName();
boolean found = false;
for (TableContext tableContext : tables) {
if (tableContext.getName().equalsIgnoreCase(tableName)) {
found = true;
break;
}
}
if (found) {
if (sqlBuilderContext.getTableNames().contains(tableName)) {
result.appendToken(tableName);
int beginPosition = each.getBeginPosition() + ((TableToken) each).getOriginalLiterals().length();
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
result.append(originalSQL.substring(beginPosition, endPosition));
int endPosition = sqlTokens.size() - 1 == count ? sqlBuilderContext.getOriginalSQL().length() : sqlTokens.get(count + 1).getBeginPosition();
result.append(sqlBuilderContext.getOriginalSQL().substring(beginPosition, endPosition));
} else {
result.append(((TableToken) each).getOriginalLiterals());
int beginPosition = each.getBeginPosition() + ((TableToken) each).getOriginalLiterals().length();
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
result.append(originalSQL.substring(beginPosition, endPosition));
int endPosition = sqlTokens.size() - 1 == count ? sqlBuilderContext.getOriginalSQL().length() : sqlTokens.get(count + 1).getBeginPosition();
result.append(sqlBuilderContext.getOriginalSQL().substring(beginPosition, endPosition));
}
} else if (each instanceof ItemsToken) {
for (String item : ((ItemsToken) each).getItems()) {
......@@ -71,21 +84,31 @@ public final class SQLBuilderContext {
result.append(item);
}
int beginPosition = each.getBeginPosition();
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
result.append(originalSQL.substring(beginPosition, endPosition));
int endPosition = sqlTokens.size() - 1 == count ? sqlBuilderContext.getOriginalSQL().length() : sqlTokens.get(count + 1).getBeginPosition();
result.append(sqlBuilderContext.getOriginalSQL().substring(beginPosition, endPosition));
} else if (each instanceof RowCountLimitToken) {
result.appendToken(RowCountLimitToken.COUNT_NAME, ((RowCountLimitToken) each).getRowCount() + "");
int beginPosition = each.getBeginPosition() + (((RowCountLimitToken) each).getRowCount() + "").length();
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
result.append(originalSQL.substring(beginPosition, endPosition));
int endPosition = sqlTokens.size() - 1 == count ? sqlBuilderContext.getOriginalSQL().length() : sqlTokens.get(count + 1).getBeginPosition();
result.append(sqlBuilderContext.getOriginalSQL().substring(beginPosition, endPosition));
} else if (each instanceof OffsetLimitToken) {
result.appendToken(OffsetLimitToken.OFFSET_NAME, ((OffsetLimitToken) each).getOffset() + "");
int beginPosition = each.getBeginPosition() + (((OffsetLimitToken) each).getOffset() + "").length();
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
result.append(originalSQL.substring(beginPosition, endPosition));
int endPosition = sqlTokens.size() - 1 == count ? sqlBuilderContext.getOriginalSQL().length() : sqlTokens.get(count + 1).getBeginPosition();
result.append(sqlBuilderContext.getOriginalSQL().substring(beginPosition, endPosition));
}
count++;
}
return result;
}
private void sortByBeginPosition() {
Collections.sort(sqlBuilderContext.getSqlTokens(), new Comparator<SQLToken>() {
@Override
public int compare(final SQLToken o1, final SQLToken o2) {
return o1.getBeginPosition() - o2.getBeginPosition();
}
});
}
}
......@@ -17,9 +17,9 @@
package com.dangdang.ddframe.rdb.sharding.router;
import java.util.Collection;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import java.util.Collection;
/**
*  路由结果接口.
......
......@@ -17,7 +17,7 @@
package com.dangdang.ddframe.rdb.sharding.router;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
......
......@@ -28,8 +28,6 @@ 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.context.ItemsToken;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.LimitContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilderContext;
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;
......@@ -38,6 +36,9 @@ 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.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;
import com.dangdang.ddframe.rdb.sharding.router.binding.BindingTablesRouter;
import com.dangdang.ddframe.rdb.sharding.router.database.DatabaseRouter;
import com.dangdang.ddframe.rdb.sharding.router.mixed.MixedTablesRouter;
......@@ -177,8 +178,9 @@ public final class SQLRouteEngine {
Context context = MetricsContext.start("Route SQL");
SQLRouteResult result = new SQLRouteResult(sqlContext);
RoutingResult routingResult = routeSQL(sqlContext.getConditionContext(), sqlContext, parameters);
result.getExecutionUnits().addAll(routingResult.getSQLExecutionUnits(sqlContext.getSqlBuilder()));
amendSQLAccordingToRouteResult(sqlContext, parameters, result);
SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(sqlContext.getSqlBuilderContext());
result.getExecutionUnits().addAll(routingResult.getSQLExecutionUnits(sqlRewriteEngine.rewrite()));
amendSQLAccordingToRouteResult(parameters, result, sqlRewriteEngine);
MetricsContext.stop(context);
log.debug("final route result is {} target", result.getExecutionUnits().size());
for (SQLExecutionUnit each : result.getExecutionUnits()) {
......@@ -208,9 +210,9 @@ public final class SQLRouteEngine {
return new MixedTablesRouter(shardingRule, parameters, logicTables, conditionContext, sqlContext.getType()).route();
}
private void amendSQLAccordingToRouteResult(final SQLContext sqlContext, final List<Object> parameters, final SQLRouteResult sqlRouteResult) {
private void amendSQLAccordingToRouteResult(final List<Object> parameters, final SQLRouteResult sqlRouteResult, final SQLRewriteEngine sqlRewriteEngine) {
LimitContext limit = sqlRouteResult.getSqlContext().getLimitContext();
SQLBuilder sqlBuilder = sqlContext.getSqlBuilder();
SQLBuilder sqlBuilder = sqlRewriteEngine.rewrite();
if (null != limit) {
if (1 == sqlRouteResult.getExecutionUnits().size()) {
if (limit.getOffsetParameterIndex() > -1) {
......
......@@ -17,7 +17,7 @@
package com.dangdang.ddframe.rdb.sharding.router.binding;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.router.single.SingleRoutingTableFactor;
import lombok.AccessLevel;
import lombok.Getter;
......
......@@ -17,7 +17,7 @@
package com.dangdang.ddframe.rdb.sharding.router.database;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.router.RoutingResult;
import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit;
import com.google.common.base.Function;
......
......@@ -17,7 +17,7 @@
package com.dangdang.ddframe.rdb.sharding.router.mixed;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit;
import lombok.Getter;
import lombok.ToString;
......
......@@ -21,7 +21,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.router.RoutingResult;
import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit;
......
......@@ -17,7 +17,7 @@
package com.dangdang.ddframe.rdb.sharding.router.mixed;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.router.single.SingleRoutingTableFactor;
import lombok.Getter;
import lombok.ToString;
......
......@@ -17,7 +17,7 @@
package com.dangdang.ddframe.rdb.sharding.router.single;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit;
import com.google.common.base.Function;
import com.google.common.base.Optional;
......
......@@ -17,7 +17,7 @@
package com.dangdang.ddframe.rdb.sharding.router.single;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.router.RoutingResult;
import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit;
import com.google.common.base.Function;
......
......@@ -17,7 +17,7 @@
package com.dangdang.ddframe.rdb.sharding.router.single;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
......
......@@ -25,7 +25,7 @@ import com.dangdang.ddframe.rdb.sharding.executor.fixture.ExecutorTestUtil;
import com.dangdang.ddframe.rdb.sharding.executor.fixture.TestDMLExecutionEventListener;
import com.dangdang.ddframe.rdb.sharding.executor.fixture.TestDQLExecutionEventListener;
import com.dangdang.ddframe.rdb.sharding.executor.wrapper.PreparedStatementExecutorWrapper;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit;
import org.junit.After;
import org.junit.Before;
......
......@@ -25,7 +25,7 @@ import com.dangdang.ddframe.rdb.sharding.executor.fixture.ExecutorTestUtil;
import com.dangdang.ddframe.rdb.sharding.executor.fixture.TestDMLExecutionEventListener;
import com.dangdang.ddframe.rdb.sharding.executor.fixture.TestDQLExecutionEventListener;
import com.dangdang.ddframe.rdb.sharding.executor.wrapper.StatementExecutorWrapper;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit;
import org.junit.After;
import org.junit.Before;
......
......@@ -23,6 +23,7 @@ import com.dangdang.ddframe.rdb.sharding.constant.ShardingOperator;
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.rewrite.SQLRewriteEngine;
import org.junit.Test;
import java.sql.SQLException;
......@@ -40,7 +41,8 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "DELETE FROM TABLE_XXX", shardingRule);
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertThat(sqlContext.getTables().get(0).getName(), is("TABLE_XXX"));
assertThat(sqlContext.getSqlBuilder().toString(), is("DELETE FROM [Token(TABLE_XXX)]"));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("DELETE FROM [Token(TABLE_XXX)]"));
}
@Test
......@@ -51,7 +53,8 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
shardingRule);
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertDeleteStatementWithoutParameter(sqlContext);
assertThat(sqlContext.getSqlBuilder().toString(), is(
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).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"));
}
......@@ -81,7 +84,8 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
"DELETE FROM TABLE_XXX xxx WHERE field4<? AND field1=? AND field5>? AND field2 IN (?,?) AND field6<=? AND field3 BETWEEN ? AND ? AND field7>=?", shardingRule);
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertDeleteStatementWithParameter(sqlContext);
assertThat(sqlContext.getSqlBuilder().toString(), is(
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).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>=?"));
}
......@@ -152,6 +156,7 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
assertThat(condition.getOperator(), is(ShardingOperator.EQUAL));
assertThat(condition.getValues().size(), is(1));
assertThat(condition.getValues().get(0), is((Comparable) 1));
assertThat(sqlContext.getSqlBuilder().toString().replace("([Token(TABLE_XXX)] )", "([Token(TABLE_XXX)])"), is(expectedSQL));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString().replace("([Token(TABLE_XXX)] )", "([Token(TABLE_XXX)])"), is(expectedSQL));
}
}
......@@ -29,6 +29,7 @@ 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.InsertSQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLRewriteEngine;
import org.junit.Test;
import javax.sql.DataSource;
......@@ -55,7 +56,8 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "INSERT INTO `TABLE_XXX` (`field1`, `field2`) VALUES (10, 1)", shardingRule);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatementWithoutParameter(sqlContext);
assertThat(sqlContext.getSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, `field2`) VALUES (10, 1)"));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, `field2`) VALUES (10, 1)"));
}
@Test
......@@ -64,7 +66,8 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "INSERT INTO TABLE_XXX (field1, field2) VALUES (?, ?)", shardingRule);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatementWithParameter(sqlContext);
assertThat(sqlContext.getSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (field1, field2) VALUES (?, ?)"));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (field1, field2) VALUES (?, ?)"));
}
@Test
......@@ -73,7 +76,8 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "INSERT INTO `TABLE_XXX` (`field1`) VALUES (10)", shardingRule);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatementWithoutParameter(sqlContext);
assertThat(sqlContext.getSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`) VALUES (10)"));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`) VALUES (10)"));
}
@Test
......@@ -82,7 +86,8 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "INSERT INTO `TABLE_XXX` (`field1`) VALUES (?)", shardingRule);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatementWithParameter(sqlContext);
assertThat(sqlContext.getSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`) VALUES (?)"));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`) VALUES (?)"));
}
private void assertInsertStatementWithoutParameter(final InsertSQLContext sqlContext) {
......@@ -153,7 +158,8 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
assertThat(condition.getOperator(), is(ShardingOperator.EQUAL));
assertThat(condition.getValues().size(), is(1));
assertThat(condition.getValues().get(0), is((Comparable) 1));
assertThat(sqlContext.getSqlBuilder().toString(), is(expectedSQL));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is(expectedSQL));
}
@Test(expected = UnsupportedOperationException.class)
......
......@@ -24,6 +24,7 @@ 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.UpdateSQLContext;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException;
import com.dangdang.ddframe.rdb.sharding.rewrite.SQLRewriteEngine;
import org.junit.Test;
import java.sql.SQLException;
......@@ -41,7 +42,8 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "UPDATE TABLE_XXX SET field1=field1+1", shardingRule);
UpdateSQLContext sqlContext = (UpdateSQLContext) statementParser.parseStatement();
assertThat(sqlContext.getTables().get(0).getName(), is("TABLE_XXX"));
assertThat(sqlContext.getSqlBuilder().toString(), is("UPDATE [Token(TABLE_XXX)] SET field1=field1+1"));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is("UPDATE [Token(TABLE_XXX)] SET field1=field1+1"));
}
@Test
......@@ -51,7 +53,8 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
+ " 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);
UpdateSQLContext sqlContext = (UpdateSQLContext) statementParser.parseStatement();
assertUpdateStatementWithoutParameter(sqlContext);
assertThat(sqlContext.getSqlBuilder().toString(),
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).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"));
}
......@@ -83,7 +86,8 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
shardingRule);
UpdateSQLContext sqlContext = (UpdateSQLContext) statementParser.parseStatement();
assertUpdateStatementWitParameter(sqlContext);
assertThat(sqlContext.getSqlBuilder().toString(), is("UPDATE [Token(TABLE_XXX)] AS xxx SET field1=field1+? "
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).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>=?"));
}
......@@ -147,6 +151,7 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
assertThat(condition.getOperator(), is(ShardingOperator.EQUAL));
assertThat(condition.getValues().size(), is(1));
assertThat(condition.getValues().get(0), is((Comparable) 1));
assertThat(sqlContext.getSqlBuilder().toString(), is(expectedSQL));
// TODO 放入rewrite模块断言
assertThat(new SQLRewriteEngine(sqlContext.getSqlBuilderContext()).rewrite().toString(), is(expectedSQL));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册