提交 1a4edfc1 编写于 作者: T terrymanu

add SQLBuilderContext

上级 ab8a2da2
......@@ -54,7 +54,7 @@ public final class SQLParseEngine {
} else if (sqlContext instanceof InsertSQLContext) {
parseInsert(result, (InsertSQLContext) sqlContext);
}
result.setSqlBuilder(sqlContext.toSqlBuilder());
result.setSqlBuilder(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()));
return result;
}
......
......@@ -20,19 +20,16 @@ package com.dangdang.ddframe.rdb.sharding.parser.sql.context;
import com.dangdang.ddframe.rdb.sharding.parser.contstant.SQLType;
import com.dangdang.ddframe.rdb.sharding.parser.result.router.Condition;
import com.dangdang.ddframe.rdb.sharding.parser.result.router.ConditionContext;
import com.dangdang.ddframe.rdb.sharding.parser.result.router.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.parser.sql.expr.SQLExpr;
import com.dangdang.ddframe.rdb.sharding.parser.sql.expr.SQLIdentifierExpr;
import com.dangdang.ddframe.rdb.sharding.parser.sql.expr.SQLPropertyExpr;
import com.dangdang.ddframe.rdb.sharding.util.SQLUtil;
import com.google.common.base.Optional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
/**
......@@ -40,24 +37,18 @@ import java.util.List;
*
* @author zhangliang
*/
@RequiredArgsConstructor
@Getter
@Setter
public abstract class AbstractSQLContext implements SQLContext {
@Setter
private ConditionContext conditionContext = new ConditionContext();
private final String originalSQL;
private final SQLType type;
private final List<TableContext> tables = new ArrayList<>();
private final List<SQLToken> sqlTokens = new LinkedList<>();
private ConditionContext conditionContext = new ConditionContext();
public AbstractSQLContext(final String originalSQL, final SQLType type) {
this.originalSQL = originalSQL;
this.type = type;
}
private SQLBuilderContext sqlBuilderContext;
@Override
public final SQLType getType() {
......@@ -110,71 +101,4 @@ public abstract class AbstractSQLContext implements SQLContext {
private Condition.Column createColumn(final String columnName, final String tableName) {
return new Condition.Column(SQLUtil.getExactlyValue(columnName), SQLUtil.getExactlyValue(tableName));
}
@Override
public SQLBuilder toSqlBuilder() {
SQLBuilder result = new SQLBuilder();
if (sqlTokens.isEmpty()) {
append(result, originalSQL);
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();
}
});
for (SQLToken each : sqlTokens) {
if (0 == count) {
append(result, originalSQL.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) {
result.appendToken(tableName);
int beginPosition = each.getBeginPosition() + ((TableToken) each).getOriginalLiterals().length();
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
append(result, originalSQL.substring(beginPosition, endPosition));
} else {
append(result, ((TableToken) each).getOriginalLiterals());
int beginPosition = each.getBeginPosition() + ((TableToken) each).getOriginalLiterals().length();
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
append(result, originalSQL.substring(beginPosition, endPosition));
}
} else if (each instanceof ItemsToken) {
for (String item : ((ItemsToken) each).getItems()) {
append(result, ", ");
append(result, item);
}
int beginPosition = each.getBeginPosition();
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
append(result, originalSQL.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();
append(result, originalSQL.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();
append(result, originalSQL.substring(beginPosition, endPosition));
}
count++;
}
return result;
}
private void append(final SQLBuilder sqlBuilder, final String literals) {
sqlBuilder.append(literals);
}
}
......@@ -28,7 +28,7 @@ import lombok.Getter;
@Getter
public final class DeleteSQLContext extends AbstractSQLContext {
public DeleteSQLContext(final String originalSQL) {
super(originalSQL, SQLType.DELETE);
public DeleteSQLContext() {
super(SQLType.DELETE);
}
}
......@@ -28,10 +28,9 @@ import lombok.Getter;
@Getter
public final class InsertSQLContext extends AbstractSQLContext {
private final GeneratedKeyContext generatedKeyContext;
private final GeneratedKeyContext generatedKeyContext = new GeneratedKeyContext();
public InsertSQLContext(final String originalSQL) {
super(originalSQL, SQLType.INSERT);
generatedKeyContext = new GeneratedKeyContext();
public InsertSQLContext() {
super(SQLType.INSERT);
}
}
package com.dangdang.ddframe.rdb.sharding.parser.sql.context;
import com.dangdang.ddframe.rdb.sharding.parser.result.router.SQLBuilder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
/**
* SQL构建器上下文.
*
* @author zhangliang
*/
@RequiredArgsConstructor
@Getter
public final class SQLBuilderContext {
private final String originalSQL;
private final List<SQLToken> sqlTokens = new LinkedList<>();
/**
* 生成SQL构建器.
*
* @param tables 表对象
* @return SQL构建器
*/
public SQLBuilder toSqlBuilder(final List<TableContext> tables) {
SQLBuilder result = new SQLBuilder();
if (sqlTokens.isEmpty()) {
result.append(originalSQL);
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();
}
});
for (SQLToken each : sqlTokens) {
if (0 == count) {
result.append(originalSQL.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) {
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));
} 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));
}
} else if (each instanceof ItemsToken) {
for (String item : ((ItemsToken) each).getItems()) {
result.append(", ");
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));
} 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));
} 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));
}
count++;
}
return result;
}
}
......@@ -20,7 +20,6 @@ package com.dangdang.ddframe.rdb.sharding.parser.sql.context;
import com.dangdang.ddframe.rdb.sharding.parser.contstant.SQLType;
import com.dangdang.ddframe.rdb.sharding.parser.result.router.Condition;
import com.dangdang.ddframe.rdb.sharding.parser.result.router.ConditionContext;
import com.dangdang.ddframe.rdb.sharding.parser.result.router.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.parser.sql.expr.SQLExpr;
import com.google.common.base.Optional;
......@@ -33,6 +32,13 @@ import java.util.List;
*/
public interface SQLContext {
/**
* 获取SQL语句类型.
*
* @return SQL语句类型
*/
SQLType getType();
/**
* 获取表解析对象集合.
*
......@@ -55,31 +61,24 @@ public interface SQLContext {
void setConditionContext(ConditionContext conditionContext);
/**
* 获取SQL语言标记对象集合.
* 获取列对象.
*
* @return SQL语言标记对象集合
*/
List<SQLToken> getSqlTokens();
/**
* 生成SQL构建器.
*
* @return SQL构建器
* @param expr SQL表达式
* @return 列对象
*/
SQLBuilder toSqlBuilder();
Optional<Condition.Column> findColumn(SQLExpr expr);
/**
* 获取SQL语句类型.
* 获取SQL构建器上下文.
*
* @return SQL语句类型
* @return SQL构建器上下文
*/
SQLType getType();
SQLBuilderContext getSqlBuilderContext();
/**
* 获取列对象.
*
* @param expr SQL表达式
* @return 列对象
* 设置SQL构建器上下文.
*
* @param sqlBuilderContext SQL构建器上下文
*/
Optional<Condition.Column> findColumn(SQLExpr expr);
void setSqlBuilderContext(SQLBuilderContext sqlBuilderContext);
}
......@@ -47,8 +47,8 @@ public final class SelectSQLContext extends AbstractSQLContext {
private LimitContext limitContext;
public SelectSQLContext(final String originalSQL) {
super(originalSQL, SQLType.SELECT);
public SelectSQLContext() {
super(SQLType.SELECT);
}
/**
......
......@@ -26,7 +26,7 @@ import com.dangdang.ddframe.rdb.sharding.parser.contstant.SQLType;
*/
public final class UpdateSQLContext extends AbstractSQLContext {
public UpdateSQLContext(final String originalSQL) {
super(originalSQL, SQLType.UPDATE);
public UpdateSQLContext() {
super(SQLType.UPDATE);
}
}
......@@ -69,7 +69,7 @@ public final class MySQLParser extends SQLParser {
return getLimitContextWithOffset(parametersIndex, sqlContext, valueIndex, valueBeginPosition, value, isParameterForValue);
}
if (!isParameterForValue) {
sqlContext.getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
getSqlBuilderContext().getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
}
if (value < 0) {
throw new SQLParserException("LIMIT offset and row count can not be a negative value");
......@@ -96,10 +96,10 @@ public final class MySQLParser extends SQLParser {
}
getLexer().nextToken();
if (!isParameterForValue) {
sqlContext.getSqlTokens().add(new OffsetLimitToken(valueBeginPosition, value));
getSqlBuilderContext().getSqlTokens().add(new OffsetLimitToken(valueBeginPosition, value));
}
if (!isParameterForRowCount) {
sqlContext.getSqlTokens().add(new RowCountLimitToken(rowCountBeginPosition, rowCount));
getSqlBuilderContext().getSqlTokens().add(new RowCountLimitToken(rowCountBeginPosition, rowCount));
}
if (value < 0 || rowCount < 0) {
throw new SQLParserException("LIMIT offset and row count can not be a negative value");
......@@ -126,10 +126,10 @@ public final class MySQLParser extends SQLParser {
}
getLexer().nextToken();
if (!isParameterForOffset) {
sqlContext.getSqlTokens().add(new OffsetLimitToken(offsetBeginPosition, offset));
getSqlBuilderContext().getSqlTokens().add(new OffsetLimitToken(offsetBeginPosition, offset));
}
if (!isParameterForValue) {
sqlContext.getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
getSqlBuilderContext().getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
}
if (value < 0 || offset < 0) {
throw new SQLParserException("LIMIT offset and row count can not be a negative value");
......
......@@ -23,6 +23,7 @@ import com.dangdang.ddframe.rdb.sharding.parser.result.router.ConditionContext;
import com.dangdang.ddframe.rdb.sharding.parser.sql.context.AggregationSelectItemContext;
import com.dangdang.ddframe.rdb.sharding.parser.contstant.AggregationType;
import com.dangdang.ddframe.rdb.sharding.parser.sql.context.CommonSelectItemContext;
import com.dangdang.ddframe.rdb.sharding.parser.sql.context.SQLBuilderContext;
import com.dangdang.ddframe.rdb.sharding.parser.sql.context.SQLContext;
import com.dangdang.ddframe.rdb.sharding.parser.sql.context.SelectItemContext;
import com.dangdang.ddframe.rdb.sharding.parser.sql.context.SelectSQLContext;
......@@ -54,22 +55,23 @@ import java.util.List;
*
* @author zhangliang
*/
@Getter
@Setter
public class SQLParser extends Parser {
@Getter
private final ShardingRule shardingRule;
@Getter
private final List<Object> parameters;
@Getter
@Setter
private final SQLBuilderContext sqlBuilderContext;
private int parametersIndex;
public SQLParser(final Lexer lexer, final ShardingRule shardingRule, final List<Object> parameters) {
super(lexer);
this.shardingRule = shardingRule;
this.parameters = parameters;
sqlBuilderContext = new SQLBuilderContext(lexer.getInput());
}
/**
......@@ -160,7 +162,7 @@ public class SQLParser extends Parser {
String tableName = sqlContext.getTables().get(0).getName();
String owner = propertyExpr.getOwner().getName();
if (tableName.equalsIgnoreCase(SQLUtil.getExactlyValue(owner))) {
sqlContext.getSqlTokens().add(new TableToken(beginPosition - owner.length(), owner, tableName));
sqlBuilderContext.getSqlTokens().add(new TableToken(beginPosition - owner.length(), owner, tableName));
}
}
......@@ -220,7 +222,7 @@ public class SQLParser extends Parser {
if (skipJoin()) {
throw new UnsupportedOperationException("Cannot support Multiple-Table.");
}
sqlContext.getSqlTokens().add(new TableToken(beginPosition, tableContext.getOriginalLiterals(), tableContext.getName()));
sqlBuilderContext.getSqlTokens().add(new TableToken(beginPosition, tableContext.getOriginalLiterals(), tableContext.getName()));
sqlContext.getTables().add(tableContext);
}
......@@ -277,7 +279,7 @@ public class SQLParser extends Parser {
expression.append(value);
getLexer().nextToken();
if (equalAny(Symbol.DOT)) {
sqlContext.getSqlTokens().add(new TableToken(position, value, SQLUtil.getExactlyValue(value)));
sqlBuilderContext.getSqlTokens().add(new TableToken(position, value, SQLUtil.getExactlyValue(value)));
}
}
return new CommonSelectItemContext(SQLUtil.getExactlyValue(expression.toString()), parseAlias(), index, false);
......
......@@ -39,7 +39,8 @@ public abstract class AbstractDeleteParser {
public AbstractDeleteParser(final SQLParser exprParser) {
this.exprParser = exprParser;
sqlContext = new DeleteSQLContext(exprParser.getLexer().getInput());
sqlContext = new DeleteSQLContext();
sqlContext.setSqlBuilderContext(exprParser.getSqlBuilderContext());
}
/**
......
......@@ -62,7 +62,8 @@ public abstract class AbstractInsertParser {
this.exprParser = exprParser;
this.shardingRule = shardingRule;
this.parameters = parameters;
sqlContext = new InsertSQLContext(exprParser.getLexer().getInput());
sqlContext = new InsertSQLContext();
sqlContext.setSqlBuilderContext(exprParser.getSqlBuilderContext());
}
/**
......@@ -127,7 +128,7 @@ public abstract class AbstractInsertParser {
result.add(new Condition.Column(each, sqlContext.getTables().get(0).getName(), true));
}
if (!itemsToken.getItems().isEmpty()) {
sqlContext.getSqlTokens().add(itemsToken);
exprParser.getSqlBuilderContext().getSqlTokens().add(itemsToken);
}
exprParser.getLexer().nextToken();
}
......@@ -181,7 +182,7 @@ public abstract class AbstractInsertParser {
count++;
}
if (!itemsToken.getItems().isEmpty()) {
sqlContext.getSqlTokens().add(itemsToken);
exprParser.getSqlBuilderContext().getSqlTokens().add(itemsToken);
}
exprParser.accept(Symbol.RIGHT_PAREN);
parsed = true;
......
......@@ -64,7 +64,8 @@ public abstract class AbstractSelectParser {
public AbstractSelectParser(final SQLParser exprParser) {
this.exprParser = exprParser;
sqlContext = new SelectSQLContext(getExprParser().getLexer().getInput());
sqlContext = new SelectSQLContext();
sqlContext.setSqlBuilderContext(exprParser.getSqlBuilderContext());
}
/**
......@@ -77,7 +78,7 @@ public abstract class AbstractSelectParser {
sqlContext.getOrderByContexts().addAll(parseOrderBy(getSqlContext()));
customizedSelect();
if (!itemsToken.getItems().isEmpty()) {
sqlContext.getSqlTokens().add(itemsToken);
exprParser.getSqlBuilderContext().getSqlTokens().add(itemsToken);
}
return sqlContext;
}
......@@ -318,7 +319,7 @@ public abstract class AbstractSelectParser {
return;
}
// FIXME 根据shardingRule过滤table
sqlContext.getSqlTokens().add(new TableToken(beginPosition, literals, SQLUtil.getExactlyValue(literals)));
exprParser.getSqlBuilderContext().getSqlTokens().add(new TableToken(beginPosition, literals, SQLUtil.getExactlyValue(literals)));
sqlContext.getTables().add(new TableContext(literals, SQLUtil.getExactlyValue(literals), getExprParser().parseAlias()));
}
......@@ -340,12 +341,14 @@ public abstract class AbstractSelectParser {
private void parseTableCondition(final int startPosition) {
SQLExpr sqlExpr = exprParser.parseExpression();
if (sqlExpr instanceof SQLPropertyExpr) {
SQLPropertyExpr sqlPropertyExpr = (SQLPropertyExpr) sqlExpr;
for (TableContext each : sqlContext.getTables()) {
if (each.getName().equalsIgnoreCase(SQLUtil.getExactlyValue(sqlPropertyExpr.getOwner().getName()))) {
sqlContext.getSqlTokens().add(new TableToken(startPosition, sqlPropertyExpr.getOwner().getName(), SQLUtil.getExactlyValue(sqlPropertyExpr.getOwner().getName())));
}
if (!(sqlExpr instanceof SQLPropertyExpr)) {
return;
}
SQLPropertyExpr sqlPropertyExpr = (SQLPropertyExpr) sqlExpr;
for (TableContext each : sqlContext.getTables()) {
if (each.getName().equalsIgnoreCase(SQLUtil.getExactlyValue(sqlPropertyExpr.getOwner().getName()))) {
exprParser.getSqlBuilderContext().getSqlTokens().add(
new TableToken(startPosition, sqlPropertyExpr.getOwner().getName(), SQLUtil.getExactlyValue(sqlPropertyExpr.getOwner().getName())));
}
}
}
......
......@@ -42,7 +42,8 @@ public abstract class AbstractUpdateParser {
public AbstractUpdateParser(final SQLParser exprParser) {
this.exprParser = exprParser;
sqlContext = new UpdateSQLContext(exprParser.getLexer().getInput());
sqlContext = new UpdateSQLContext();
sqlContext.setSqlBuilderContext(exprParser.getSqlBuilderContext());
}
/**
......@@ -80,7 +81,7 @@ public abstract class AbstractUpdateParser {
String tableName = sqlContext.getTables().get(0).getName();
if (exprParser.skipIfEqual(Symbol.DOT)) {
if (tableName.equalsIgnoreCase(SQLUtil.getExactlyValue(literals))) {
sqlContext.getSqlTokens().add(new TableToken(beginPosition - literals.length(), literals, tableName));
exprParser.getSqlBuilderContext().getSqlTokens().add(new TableToken(beginPosition - literals.length(), literals, tableName));
}
exprParser.getLexer().nextToken();
}
......
......@@ -44,7 +44,7 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertThat(sqlContext.getTables().get(0).getName(), is("TABLE_XXX"));
assertTrue(sqlContext.getConditionContext().isEmpty());
assertThat(sqlContext.toSqlBuilder().toString(), is("DELETE FROM [Token(TABLE_XXX)]"));
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).toString(), is("DELETE FROM [Token(TABLE_XXX)]"));
}
@Test
......@@ -56,7 +56,7 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
shardingRule, parameters);
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertDeleteStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is(
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).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"));
}
......@@ -68,7 +68,7 @@ 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, parameters);
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertDeleteStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is(
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).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>=?"));
}
......@@ -151,6 +151,6 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
assertThat(condition.getValues().size(), is(1));
assertThat(condition.getValues().get(0), is((Comparable) 1));
assertFalse(conditions.hasNext());
assertThat(sqlContext.toSqlBuilder().toString().replace("([Token(TABLE_XXX)] )", "([Token(TABLE_XXX)])"), is(expectedSQL));
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).toString().replace("([Token(TABLE_XXX)] )", "([Token(TABLE_XXX)])"), is(expectedSQL));
}
}
......@@ -55,7 +55,7 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, "INSERT INTO `TABLE_XXX` (`field1`, `field2`) VALUES (10, 1)", shardingRule, parameters);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, `field2`) VALUES (10, 1)"));
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, `field2`) VALUES (10, 1)"));
}
@Test
......@@ -65,7 +65,7 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, "INSERT INTO TABLE_XXX (field1, field2) VALUES (?, ?)", shardingRule, parameters);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (field1, field2) VALUES (?, ?)"));
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).toString(), is("INSERT INTO [Token(TABLE_XXX)] (field1, field2) VALUES (?, ?)"));
}
@Test
......@@ -75,7 +75,7 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, "INSERT INTO `TABLE_XXX` (`field1`) VALUES (10)", shardingRule, parameters);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (10, 1)"));
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (10, 1)"));
}
@Test
......@@ -85,7 +85,7 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, "INSERT INTO `TABLE_XXX` (`field1`) VALUES (?)", shardingRule, parameters);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (?, ?)"));
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (?, ?)"));
}
private void assertInsertStatement(final InsertSQLContext sqlContext) {
......@@ -161,7 +161,7 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
assertThat(condition.getValues().size(), is(1));
assertThat(condition.getValues().get(0), is((Comparable) 1));
assertFalse(conditions.hasNext());
assertThat(sqlContext.toSqlBuilder().toString(), is(expectedSQL));
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).toString(), is(expectedSQL));
}
@Test(expected = UnsupportedOperationException.class)
......
......@@ -44,7 +44,7 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
UpdateSQLContext sqlContext = (UpdateSQLContext) statementParser.parseStatement();
assertThat(sqlContext.getTables().get(0).getName(), is("TABLE_XXX"));
assertTrue(sqlContext.getConditionContext().isEmpty());
assertThat(sqlContext.toSqlBuilder().toString(), is("UPDATE [Token(TABLE_XXX)] SET field1=field1+1"));
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).toString(), is("UPDATE [Token(TABLE_XXX)] SET field1=field1+1"));
}
@Test
......@@ -55,7 +55,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, parameters);
UpdateSQLContext sqlContext = (UpdateSQLContext) statementParser.parseStatement();
assertUpdateStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is("UPDATE [Token(TABLE_XXX)] xxx SET [Token(TABLE_XXX)].field1=field1+1,xxx.field2=2 WHERE [Token(TABLE_XXX)].field4<10 "
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).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"));
}
......@@ -68,7 +69,7 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
shardingRule, parameters);
UpdateSQLContext sqlContext = (UpdateSQLContext) statementParser.parseStatement();
assertUpdateStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is("UPDATE [Token(TABLE_XXX)] AS xxx SET field1=field1+? "
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).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>=?"));
}
......@@ -142,6 +143,6 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
assertThat(condition.getValues().size(), is(1));
assertThat(condition.getValues().get(0), is((Comparable) 1));
assertFalse(conditions.hasNext());
assertThat(sqlContext.toSqlBuilder().toString(), is(expectedSQL));
assertThat(sqlContext.getSqlBuilderContext().toSqlBuilder(sqlContext.getTables()).toString(), is(expectedSQL));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册