// Path: src/main/java/com/elong/pb/newdda/client/exception/SqlParserException.java
// public class SqlParserException extends ShardingJdbcException {
// 
//     private static final long serialVersionUID = -1498980479829506655L;
// 
//     public SqlParserException(final String message, final Object... args) {
//         super(String.format(message, args));
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/SqlVisitor.java
// public interface SqlVisitor {
// 
//     /**
//      * 获取数据库类型.
//      *
//      * @return 数据库类型
//      */
//     DatabaseType getDatabaseType();
// 
//     /**
//      * 获取解析上下文对象.
//      *
//      * @return 解析上下文对象
//      */
//     SqlParserContext getSqlParserContext();
// 
//     /**
//      * 获取SQL构建器.
//      * SQL构建器
//      */
//     SqlAppender getSqlAppender();
// 
//     /**
//      * 打印替换标记.
//      *
//      * @param token 替换标记
//      */
//     void printToken(String token);
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/result/router/SqlStatementType.java
// public enum SqlStatementType {
//     INSERT,
//     DELETE,
//     UPDATE,
//     SELECT
// }


import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.elong.pb.newdda.client.exception.SqlParserException;
import com.elong.pb.newdda.client.router.parser.visitor.SqlVisitor;
import com.elong.pb.newdda.client.router.result.router.SqlStatementType;
import com.google.common.base.Preconditions;
import java.util.List;
        Preconditions.checkArgument(visitor instanceof SqlVisitor);

        SqlVisitor sqlVisitor = (SqlVisitor) visitor;
        SqlParserContext sqlParserContext = sqlVisitor.getSqlParserContext();
        //ast parser是将输入文本转换为ast（抽象语法树），parser有包括两个部分，Parser和Lexer，其中Lexer实现词法分析，Parser实现语法分析。
        //AST是Abstract Syntax Tree的缩写，也就是抽象语法树。AST是parser输出的结果。Visitor是遍历AST的手段，是处理AST最方便的模式，Visitor是一个接口，有缺省什么都没做的实现VistorAdapter
        visitor.setParameters(parameters);
        sqlStatement.accept(visitor);

        //将当前解析的条件对象归并入解析结果
        sqlParserContext.mergeCurrentConditionContext();

        //急躁 、易怒是我情绪上的弱点 ,加油 ~~~~~
        SqlParserResult sqlParserResult = sqlParserContext.getSqlParsedResult();
        sqlParserResult.getRouteContext().setSqlAppender(sqlVisitor.getSqlAppender());
        sqlParserResult.getRouteContext().setSqlStatementType(getType());

        return sqlParserResult;
    }

    private SqlStatementType getType() {
        if (sqlStatement instanceof SQLSelectStatement) {
            return SqlStatementType.SELECT;
        }
        if (sqlStatement instanceof SQLInsertStatement) {
            return SqlStatementType.INSERT;
        }
        if (sqlStatement instanceof SQLUpdateStatement) {
            return SqlStatementType.UPDATE;
        }
// Path: src/main/java/com/elong/pb/newdda/client/exception/SqlParserException.java
// public class SqlParserException extends ShardingJdbcException {
// 
//     private static final long serialVersionUID = -1498980479829506655L;
// 
//     public SqlParserException(final String message, final Object... args) {
//         super(String.format(message, args));
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/SqlVisitor.java
// public interface SqlVisitor {
// 
//     /**
//      * 获取数据库类型.
//      *
//      * @return 数据库类型
//      */
//     DatabaseType getDatabaseType();
// 
//     /**
//      * 获取解析上下文对象.
//      *
//      * @return 解析上下文对象
//      */
//     SqlParserContext getSqlParserContext();
// 
//     /**
//      * 获取SQL构建器.
//      * SQL构建器
//      */
//     SqlAppender getSqlAppender();
// 
//     /**
//      * 打印替换标记.
//      *
//      * @param token 替换标记
//      */
//     void printToken(String token);
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/result/router/SqlStatementType.java
// public enum SqlStatementType {
//     INSERT,
//     DELETE,
//     UPDATE,
//     SELECT
// }


// Path: src/main/java/com/elong/pb/newdda/client/router/parser/SqlParserEngine.java
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.elong.pb.newdda.client.exception.SqlParserException;
import com.elong.pb.newdda.client.router.parser.visitor.SqlVisitor;
import com.elong.pb.newdda.client.router.result.router.SqlStatementType;
import com.google.common.base.Preconditions;
import java.util.List;

        Preconditions.checkArgument(visitor instanceof SqlVisitor);

        SqlVisitor sqlVisitor = (SqlVisitor) visitor;
        SqlParserContext sqlParserContext = sqlVisitor.getSqlParserContext();
        //ast parser是将输入文本转换为ast（抽象语法树），parser有包括两个部分，Parser和Lexer，其中Lexer实现词法分析，Parser实现语法分析。
        //AST是Abstract Syntax Tree的缩写，也就是抽象语法树。AST是parser输出的结果。Visitor是遍历AST的手段，是处理AST最方便的模式，Visitor是一个接口，有缺省什么都没做的实现VistorAdapter
        visitor.setParameters(parameters);
        sqlStatement.accept(visitor);

        //将当前解析的条件对象归并入解析结果
        sqlParserContext.mergeCurrentConditionContext();

        //急躁 、易怒是我情绪上的弱点 ,加油 ~~~~~
        SqlParserResult sqlParserResult = sqlParserContext.getSqlParsedResult();
        sqlParserResult.getRouteContext().setSqlAppender(sqlVisitor.getSqlAppender());
        sqlParserResult.getRouteContext().setSqlStatementType(getType());

        return sqlParserResult;
    }

    private SqlStatementType getType() {
        if (sqlStatement instanceof SQLSelectStatement) {
            return SqlStatementType.SELECT;
        }
        if (sqlStatement instanceof SQLInsertStatement) {
            return SqlStatementType.INSERT;
        }
        if (sqlStatement instanceof SQLUpdateStatement) {
            return SqlStatementType.UPDATE;
        }
        if (sqlStatement instanceof SQLDeleteStatement) {