提交 bf7ec315 编写于 作者: T terrymanu

refactor SQLStatementParser => SQLParserEngine

上级 5f07c26c
......@@ -48,6 +48,7 @@ import java.util.List;
*/
@RequiredArgsConstructor
@Slf4j
// TODO 与SQLParserEngine合一
public final class SQLParseEngine {
private final SQLContext sqlContext;
......
......@@ -23,7 +23,7 @@ import com.dangdang.ddframe.rdb.sharding.parser.sql.dialect.oracle.parser.Oracle
import com.dangdang.ddframe.rdb.sharding.parser.sql.dialect.postgresql.parser.PostgreSQLParser;
import com.dangdang.ddframe.rdb.sharding.parser.sql.dialect.sqlserver.parser.SQLServerParser;
import com.dangdang.ddframe.rdb.sharding.parser.sql.parser.SQLParser;
import com.dangdang.ddframe.rdb.sharding.parser.sql.parser.SQLStatementParser;
import com.dangdang.ddframe.rdb.sharding.parser.sql.parser.SQLParserEngine;
import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
import com.dangdang.ddframe.rdb.sharding.constants.DatabaseType;
import com.dangdang.ddframe.rdb.sharding.exception.SQLParserException;
......@@ -55,12 +55,12 @@ public final class SQLParserFactory {
*/
public static SQLParseEngine create(final DatabaseType databaseType, final String sql, final List<Object> parameters, final ShardingRule shardingRule) throws SQLParserException {
log.debug("Logic SQL: {}, {}", sql, parameters);
SQLContext sqlContext = getSQLStatementParser(databaseType, sql, shardingRule, parameters).parseStatement();
SQLContext sqlContext = getSQLParserEngine(databaseType, sql, shardingRule, parameters).parseStatement();
log.trace("Get {} SQL Statement", sqlContext.getClass().getName());
return new SQLParseEngine(sqlContext);
}
private static SQLStatementParser getSQLStatementParser(final DatabaseType dbType, final String sql, final ShardingRule shardingRule, final List<Object> parameters) {
private static SQLParserEngine getSQLParserEngine(final DatabaseType dbType, final String sql, final ShardingRule shardingRule, final List<Object> parameters) {
SQLParser sqlParser;
switch (dbType) {
case H2:
......@@ -79,6 +79,6 @@ public final class SQLParserFactory {
default:
throw new UnsupportedOperationException(dbType.name());
}
return new SQLStatementParser(dbType, shardingRule, parameters, sqlParser);
return new SQLParserEngine(dbType, sqlParser, shardingRule, parameters);
}
}
......@@ -26,31 +26,26 @@ import com.dangdang.ddframe.rdb.sharding.parser.sql.parser.delete.SQLDeleteParse
import com.dangdang.ddframe.rdb.sharding.parser.sql.parser.insert.SQLInsertParserFactory;
import com.dangdang.ddframe.rdb.sharding.parser.sql.parser.select.SQLSelectParserFactory;
import com.dangdang.ddframe.rdb.sharding.parser.sql.parser.update.SQLUpdateParserFactory;
import lombok.RequiredArgsConstructor;
import java.util.List;
/**
* SQL解析.
* SQL解析引擎.
*
* @author zhangliang
*/
public final class SQLStatementParser {
@RequiredArgsConstructor
public final class SQLParserEngine {
private final DatabaseType dbType;
private final SQLParser exprParser;
private final ShardingRule shardingRule;
private final List<Object> parameters;
private final SQLParser exprParser;
public SQLStatementParser(final DatabaseType dbType, final ShardingRule shardingRule, final List<Object> parameters, final SQLParser exprParser) {
this.dbType = dbType;
this.shardingRule = shardingRule;
this.parameters = parameters;
this.exprParser = exprParser;
}
/**
* 解析SQL.
*
......
......@@ -43,7 +43,7 @@ import static org.mockito.Mockito.when;
public abstract class AbstractStatementParserTest {
protected final SQLStatementParser getSqlStatementParser(final DatabaseType dbType, final String actualSQL) {
protected final SQLParserEngine getSqlStatementParser(final DatabaseType dbType, final String actualSQL) {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
SQLParser sqlParser;
......@@ -64,7 +64,7 @@ public abstract class AbstractStatementParserTest {
default:
throw new UnsupportedOperationException(dbType.name());
}
return new SQLStatementParser(dbType, shardingRule, parameters, sqlParser);
return new SQLParserEngine(dbType, sqlParser, shardingRule, parameters);
}
protected final ShardingRule createShardingRule() {
......
......@@ -41,7 +41,7 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
public void parseWithoutCondition() throws SQLException {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
SQLStatementParser statementParser = new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser("DELETE FROM TABLE_XXX", shardingRule, parameters));
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, new MySQLParser("DELETE FROM TABLE_XXX", shardingRule, parameters), shardingRule, parameters);
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertThat(sqlContext.getTables().get(0).getName(), is("TABLE_XXX"));
assertTrue(sqlContext.getConditionContexts().isEmpty());
......@@ -52,9 +52,9 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
public void parseWithoutParameter() throws SQLException {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
SQLStatementParser statementParser = new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser(
"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, parameters));
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, new MySQLParser(
"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, parameters), shardingRule, parameters);
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertDeleteStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is(
......@@ -65,8 +65,9 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
public void parseWithParameter() throws SQLException {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Arrays.<Object>asList(10, 1, 10, 1, 3, 10, 5, 20, 10);
SQLStatementParser statementParser = new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser(
"DELETE FROM TABLE_XXX xxx WHERE field4<? AND field1=? AND field5>? AND field2 IN (?,?) AND field6<=? AND field3 BETWEEN ? AND ? AND field7>=?", shardingRule, parameters));
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, new MySQLParser(
"DELETE FROM TABLE_XXX xxx WHERE field4<? AND field1=? AND field5>? AND field2 IN (?,?) AND field6<=? AND field3 BETWEEN ? AND ? AND field7>=?", shardingRule, parameters),
shardingRule, parameters);
DeleteSQLContext sqlContext = (DeleteSQLContext) statementParser.parseStatement();
assertDeleteStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is(
......@@ -104,7 +105,7 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
public void parseStatementWithDeleteMultipleTable() {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser("DELETE TABLE_XXX1, TABLE_xxx2 FROM TABLE_XXX1 JOIN TABLE_XXX2", shardingRule, parameters))
new SQLParserEngine(DatabaseType.MySQL, new MySQLParser("DELETE TABLE_XXX1, TABLE_xxx2 FROM TABLE_XXX1 JOIN TABLE_XXX2", shardingRule, parameters), shardingRule, parameters)
.parseStatement();
}
......@@ -112,7 +113,7 @@ public final class DeleteStatementParserTest extends AbstractStatementParserTest
public void parseStatementWithDeleteMultipleTableWithUsing() {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser("DELETE FROM TABLE_XXX1, TABLE_xxx2 USING TABLE_XXX1 JOIN TABLE_XXX2", shardingRule, parameters))
new SQLParserEngine(DatabaseType.MySQL, new MySQLParser("DELETE FROM TABLE_XXX1, TABLE_xxx2 USING TABLE_XXX1 JOIN TABLE_XXX2", shardingRule, parameters), shardingRule, parameters)
.parseStatement();
}
......
......@@ -54,8 +54,8 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
public void parseWithoutParameter() throws SQLException {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
SQLStatementParser statementParser = new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser(
"INSERT INTO `TABLE_XXX` (`field1`, `field2`) VALUES (10, 1)", shardingRule, parameters));
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, new MySQLParser(
"INSERT INTO `TABLE_XXX` (`field1`, `field2`) VALUES (10, 1)", shardingRule, parameters), shardingRule, parameters);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, `field2`) VALUES (10, 1)"));
......@@ -65,8 +65,8 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
public void parseWithParameter() {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Lists.<Object>newArrayList(10, 1);
SQLStatementParser statementParser = new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser(
"INSERT INTO TABLE_XXX (field1, field2) VALUES (?, ?)", shardingRule, parameters));
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, new MySQLParser(
"INSERT INTO TABLE_XXX (field1, field2) VALUES (?, ?)", shardingRule, parameters), shardingRule, parameters);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (field1, field2) VALUES (?, ?)"));
......@@ -76,8 +76,8 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
public void parseWithAutoIncrementColumnsWithoutParameter() throws SQLException {
ShardingRule shardingRule = createShardingRuleWithAutoIncrementColumns();
List<Object> parameters = Collections.emptyList();
SQLStatementParser statementParser = new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser(
"INSERT INTO `TABLE_XXX` (`field1`) VALUES (10)", shardingRule, parameters));
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, new MySQLParser(
"INSERT INTO `TABLE_XXX` (`field1`) VALUES (10)", shardingRule, parameters), shardingRule, parameters);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (10, 1)"));
......@@ -87,8 +87,8 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
public void parseWithAutoIncrementColumnsWithParameter() throws SQLException {
ShardingRule shardingRule = createShardingRuleWithAutoIncrementColumns();
List<Object> parameters = Lists.<Object>newArrayList(10);
SQLStatementParser statementParser = new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser(
"INSERT INTO `TABLE_XXX` (`field1`) VALUES (?)", shardingRule, parameters));
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, new MySQLParser(
"INSERT INTO `TABLE_XXX` (`field1`) VALUES (?)", shardingRule, parameters), shardingRule, parameters);
InsertSQLContext sqlContext = (InsertSQLContext) statementParser.parseStatement();
assertInsertStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is("INSERT INTO [Token(TABLE_XXX)] (`field1`, field2) VALUES (?, ?)"));
......@@ -175,23 +175,23 @@ public final class InsertStatementParserTest extends AbstractStatementParserTest
public void parseMultipleInsertForMySQL() {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
new SQLStatementParser(DatabaseType.Oracle, shardingRule, parameters, new OracleParser(
"INSERT INTO TABLE_XXX (`field1`, `field2`) VALUES (1, 'value_char'), (2, 'value_char')", shardingRule, parameters)).parseStatement();
new SQLParserEngine(DatabaseType.Oracle, new OracleParser(
"INSERT INTO TABLE_XXX (`field1`, `field2`) VALUES (1, 'value_char'), (2, 'value_char')", shardingRule, parameters), shardingRule, parameters).parseStatement();
}
@Test(expected = ParserUnsupportedException.class)
public void parseInsertAllForOracle() {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
new SQLStatementParser(DatabaseType.Oracle, shardingRule, parameters, new OracleParser(
"INSERT ALL INTO TABLE_XXX (field1) VALUES (field1) SELECT field1 FROM TABLE_XXX2", shardingRule, parameters)).parseStatement();
new SQLParserEngine(DatabaseType.Oracle, new OracleParser(
"INSERT ALL INTO TABLE_XXX (field1) VALUES (field1) SELECT field1 FROM TABLE_XXX2", shardingRule, parameters), shardingRule, parameters).parseStatement();
}
@Test(expected = ParserUnsupportedException.class)
public void parseInsertFirstForOracle() {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
new SQLStatementParser(DatabaseType.Oracle, shardingRule, parameters, new OracleParser(
"INSERT FIRST INTO TABLE_XXX (field1) VALUES (field1) SELECT field1 FROM TABLE_XXX2", shardingRule, parameters)).parseStatement();
new SQLParserEngine(DatabaseType.Oracle, new OracleParser(
"INSERT FIRST INTO TABLE_XXX (field1) VALUES (field1) SELECT field1 FROM TABLE_XXX2", shardingRule, parameters), shardingRule, parameters).parseStatement();
}
}
......@@ -42,7 +42,7 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
public void parseWithoutCondition() throws SQLException {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
SQLStatementParser statementParser = new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser("UPDATE TABLE_XXX SET field1=field1+1", shardingRule, parameters));
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, new MySQLParser("UPDATE TABLE_XXX SET field1=field1+1", shardingRule, parameters), shardingRule, parameters);
UpdateSQLContext sqlContext = (UpdateSQLContext) statementParser.parseStatement();
assertThat(sqlContext.getTables().get(0).getName(), is("TABLE_XXX"));
assertTrue(sqlContext.getConditionContexts().isEmpty());
......@@ -53,10 +53,10 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
public void parseWithoutParameter() {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
SQLStatementParser statementParser = new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser(
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, new MySQLParser(
"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, parameters));
shardingRule, parameters), 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 "
......@@ -67,9 +67,9 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
public void parseWithParameter() {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Arrays.<Object>asList(2, 10, 1, 10, 1, 3, 10, 5, 20, 10);
SQLStatementParser statementParser = new SQLStatementParser(DatabaseType.MySQL, shardingRule, parameters, new MySQLParser(
SQLParserEngine statementParser = new SQLParserEngine(DatabaseType.MySQL, new MySQLParser(
"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, parameters));
shardingRule, parameters), shardingRule, parameters);
UpdateSQLContext sqlContext = (UpdateSQLContext) statementParser.parseStatement();
assertUpdateStatement(sqlContext);
assertThat(sqlContext.toSqlBuilder().toString(), is("UPDATE [Token(TABLE_XXX)] AS xxx SET field1=field1+? "
......@@ -107,8 +107,8 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest
public void parseWithOr() {
ShardingRule shardingRule = createShardingRule();
List<Object> parameters = Collections.emptyList();
new SQLStatementParser(DatabaseType.Oracle, shardingRule, parameters, new OracleParser("UPDATE TABLE_XXX SET field1=1 WHERE field1<1 AND (field1 >2 OR field2 =1)",
shardingRule, parameters)).parseStatement();
new SQLParserEngine(DatabaseType.Oracle, new OracleParser("UPDATE TABLE_XXX SET field1=1 WHERE field1<1 AND (field1 >2 OR field2 =1)",
shardingRule, parameters), shardingRule, parameters).parseStatement();
}
@Test
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册