Commit 7bc3de4d authored by terrymanu's avatar terrymanu
Browse files

refactor prepareParse

parent 3be381da
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -17,16 +17,16 @@

package com.dangdang.ddframe.rdb.sharding.config;

import com.dangdang.ddframe.rdb.sharding.util.StringUtil;
import com.google.common.base.Joiner;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Properties;
import java.util.Set;

import com.dangdang.ddframe.rdb.sharding.util.StringUtil;
import com.google.common.base.Joiner;

/**
 * Sharding-JDBC的配置属性.
 * 分片配置属性.
 *
 * @author gaohongtao
 * @author zhangliang
+11 −16
Original line number Diff line number Diff line
@@ -44,12 +44,6 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SQLSele
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.update.SQLUpdateParserFactory;
import lombok.RequiredArgsConstructor;

import static com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Assist.END;
import static com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.DefaultKeyword.DELETE;
import static com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.DefaultKeyword.INSERT;
import static com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.DefaultKeyword.SELECT;
import static com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.DefaultKeyword.UPDATE;

/**
 * SQL解析引擎.
 *
@@ -67,9 +61,9 @@ public final class SQLParsingEngine {
    /**
     * 解析SQL.
     * 
     * @return SQL解析对象
     * @return SQL解析上下文
     */
    public SQLContext parseStatement() {
    public SQLContext parse() {
        SQLParser sqlParser = getSQLParser();
        sqlParser.skipIfEqual(Symbol.SEMI);
        if (sqlParser.equalAny(DefaultKeyword.WITH)) {
@@ -116,27 +110,28 @@ public final class SQLParsingEngine {
    }
    
    /**
     * 获取SQL类型.
     * 预解析SQL.
     * 仅获取SQL类型.
     *
     * @return SQL解析对象
     * @return SQL解析上下文
     */
    public SQLContext getStatementType() {
    public SQLContext prepareParse() {
        Lexer lexer = new Lexer(sql, new Dictionary());
        lexer.nextToken();
        while (true) {
            TokenType tokenType = lexer.getCurrentToken().getType();
            if (tokenType instanceof Keyword) {
                if (tokenType.equals(SELECT)) {
                if (tokenType.equals(DefaultKeyword.SELECT)) {
                    return new SelectSQLContext();
                } else if (tokenType.equals(UPDATE)) {
                } else if (tokenType.equals(DefaultKeyword.UPDATE)) {
                    return new UpdateSQLContext();
                } else if (tokenType.equals(INSERT)) {
                } else if (tokenType.equals(DefaultKeyword.INSERT)) {
                    return new InsertSQLContext();
                } else if (tokenType.equals(DELETE)) {
                } else if (tokenType.equals(DefaultKeyword.DELETE)) {
                    return new DeleteSQLContext();
                }
            }
            if (tokenType instanceof Assist && tokenType.equals(END)) {
            if (tokenType instanceof Assist && tokenType.equals(Assist.END)) {
                throw new SQLParsingException("Unsupported SQL statement: [%s]", sql);
            }
            lexer.nextToken();
+2 −2
Original line number Diff line number Diff line
@@ -110,11 +110,11 @@ public final class SQLRouteEngine {
    SQLContext parseSQL(final String logicSQL, final List<Object> parameters) {
        SQLParsingEngine sqlParsingEngine = new SQLParsingEngine(databaseType, logicSQL, shardingRule);
        if (HintManagerHolder.isDatabaseShardingOnly()) {
            return sqlParsingEngine.getStatementType();
            return sqlParsingEngine.prepareParse();
        }
        Context context = MetricsContext.start("Parse SQL");
        log.debug("Logic SQL: {}, {}", logicSQL, parameters);
        SQLContext result = sqlParsingEngine.parseStatement();
        SQLContext result = sqlParsingEngine.parse();
        MetricsContext.stop(context);
        if (result instanceof InsertSQLContext) {
            GenerateKeysUtils.appendGenerateKeys(shardingRule, parameters, (InsertSQLContext) result);
+10 −10
Original line number Diff line number Diff line
@@ -14,27 +14,27 @@ import static org.junit.Assert.assertThat;
public final class SQLParsingEngineTest {
    
    @Test
    public void assertGetStatementTypeForSelect() {
        assertThat(new SQLParsingEngine(DatabaseType.MySQL, " /*COMMENT*/  \t \n  \r \fsElecT\t\n  * from table  ", null).getStatementType(), instanceOf(SelectSQLContext.class));
    public void assertPrepareParseForSelect() {
        assertThat(new SQLParsingEngine(DatabaseType.MySQL, " /*COMMENT*/  \t \n  \r \fsElecT\t\n  * from table  ", null).prepareParse(), instanceOf(SelectSQLContext.class));
    }
    
    @Test
    public void assertGetStatementTypeForInsert() {
        assertThat(new SQLParsingEngine(DatabaseType.MySQL, " - - COMMENT  \t \n  \r \fInsert\t\n  into table  ", null).getStatementType(), instanceOf(InsertSQLContext.class));
    public void assertPrepareParseForInsert() {
        assertThat(new SQLParsingEngine(DatabaseType.MySQL, " - - COMMENT  \t \n  \r \fInsert\t\n  into table  ", null).prepareParse(), instanceOf(InsertSQLContext.class));
    }
    
    @Test
    public void assertGetStatementTypeForUpdate() {
        assertThat(new SQLParsingEngine(DatabaseType.MySQL, " /*+ HINT SELECT * FROM TT*/  \t \n  \r \fuPdAte\t\n  table  ", null).getStatementType(), instanceOf(UpdateSQLContext.class));
    public void assertPrepareParseForUpdate() {
        assertThat(new SQLParsingEngine(DatabaseType.MySQL, " /*+ HINT SELECT * FROM TT*/  \t \n  \r \fuPdAte\t\n  table  ", null).prepareParse(), instanceOf(UpdateSQLContext.class));
    }
    
    @Test
    public void assertGetStatementTypeForDelete() {
        assertThat(new SQLParsingEngine(DatabaseType.MySQL, " /*+ HINT SELECT * FROM TT*/  \t \n  \r \fdelete\t\n  table  ", null).getStatementType(), instanceOf(DeleteSQLContext.class));
    public void assertPrepareParseForDelete() {
        assertThat(new SQLParsingEngine(DatabaseType.MySQL, " /*+ HINT SELECT * FROM TT*/  \t \n  \r \fdelete\t\n  table  ", null).prepareParse(), instanceOf(DeleteSQLContext.class));
    }
    
    @Test(expected = SQLParsingException.class)
    public void assertGetStatementTypeForInvalidSQL() {
        new SQLParsingEngine(DatabaseType.MySQL, "int i = 0", null).getStatementType();
    public void assertPrepareParseForInvalidSQL() {
        new SQLParsingEngine(DatabaseType.MySQL, "int i = 0", null).prepareParse();
    }
}
+4 −4
Original line number Diff line number Diff line
@@ -26,21 +26,21 @@ public final class UnsupportedParseTest {
    
    @Test(expected = SQLParsingUnsupportedException.class)
    public void assertCreate() {
        new SQLParsingEngine(DatabaseType.MySQL, "CREATE TABLE `order` (id BIGINT(10))", new ShardingRuleMockBuilder().build()).parseStatement();
        new SQLParsingEngine(DatabaseType.MySQL, "CREATE TABLE `order` (id BIGINT(10))", new ShardingRuleMockBuilder().build()).parse();
    }
    
    @Test(expected = SQLParsingUnsupportedException.class)
    public void assertDrop() {
        new SQLParsingEngine(DatabaseType.MySQL, "DROP TABLE `order`", new ShardingRuleMockBuilder().build()).parseStatement();
        new SQLParsingEngine(DatabaseType.MySQL, "DROP TABLE `order`", new ShardingRuleMockBuilder().build()).parse();
    }
    
    @Test(expected = SQLParsingUnsupportedException.class)
    public void assertTruncate() {
        new SQLParsingEngine(DatabaseType.MySQL, "TRUNCATE `order`", new ShardingRuleMockBuilder().build()).parseStatement();
        new SQLParsingEngine(DatabaseType.MySQL, "TRUNCATE `order`", new ShardingRuleMockBuilder().build()).parse();
    }
    
    @Test(expected = SQLParsingUnsupportedException.class)
    public void assertAlter() {
        new SQLParsingEngine(DatabaseType.MySQL, "ALTER TABLE `order` ADD COLUMN `other` VARCHAR(45)", new ShardingRuleMockBuilder().build()).parseStatement();
        new SQLParsingEngine(DatabaseType.MySQL, "ALTER TABLE `order` ADD COLUMN `other` VARCHAR(45)", new ShardingRuleMockBuilder().build()).parse();
    }
}
Loading