// Path: src/main/java/com/elong/pb/newdda/client/constants/DatabaseType.java
// public enum DatabaseType {
// 
//     H2, MySQL, Oracle, SQLServer, DB2;
// 
//     public static DatabaseType valueFrom(final String databaseName) {
//         try {
//             return DatabaseType.valueOf(databaseName);
//         } catch (final IllegalArgumentException ex) {
//             throw new DatabaseTypeUnsupportedException(databaseName);
//         }
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/exception/DatabaseTypeUnsupportedException.java
// public class DatabaseTypeUnsupportedException extends RuntimeException {
// 
//     private static final long serialVersionUID = -7807395469148925091L;
// 
//     private static final String MESSAGE = "Can not support database type [%s].";
// 
//     public DatabaseTypeUnsupportedException(final String databaseType) {
//         super(String.format(MESSAGE, databaseType));
//     }
//     
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/basic/mysql/MySqlDeleteVisitor.java
// public class MySqlDeleteVisitor extends AbstractMySqlVisitor {
// 
//     public boolean visit(final MySqlDeleteStatement x) {
//         getSqlParserContext().setCurrentTable(x.getTableName().toString(), x.getAlias());
//         return super.visit(x);
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/basic/mysql/MySqlInsertVisitor.java
// public class MySqlInsertVisitor extends AbstractMySqlVisitor {
// 
//     public boolean visit(final MySqlInsertStatement x) {
//         getSqlParserContext().setCurrentTable(x.getTableName().toString(), x.getAlias());
//         if (null == x.getValues()) {
//             return super.visit(x);
//         }
//         for (int i = 0; i < x.getColumns().size(); i++) {
//             getSqlParserContext().addCondition(x.getColumns().get(i).toString(), x.getTableName().toString(), BinaryOperator.EQUAL, x.getValues().getValues().get(i), getDatabaseType(), getParameters());
//         }
//         return super.visit(x);
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/basic/mysql/MySqlSelectVisitor.java
// public class MySqlSelectVisitor extends AbstractMySqlVisitor {
// 
//     private final static Logger logger = LoggerFactory.getLogger(MySqlSelectVisitor.class);
// 
//     public void preVisit(SQLObject x) {
//         if (logger.isDebugEnabled()) {
//         }
//     }
// 
//     @Override
//     public boolean visit(final MySqlSelectQueryBlock x) {
//         if (x.getFrom() instanceof SQLExprTableSource) {
//             SQLExprTableSource tableExpr = (SQLExprTableSource) x.getFrom();
//             getSqlParserContext().setCurrentTable(tableExpr.getExpr().toString(), tableExpr.getAlias());
//         }
//         return super.visit(x);
//     }
// 
//     @Override
//     public void endVisit(final MySqlSelectQueryBlock x) {
//         super.endVisit(x);
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/basic/mysql/MySqlUpdateVisitor.java
// public class MySqlUpdateVisitor extends AbstractMySqlVisitor {
// 
//     public boolean visit(final MySqlUpdateStatement x) {
//         getSqlParserContext().setCurrentTable(x.getTableName().toString(), null);
//         return super.visit(x);
//     }
// 
// }


import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.elong.pb.newdda.client.constants.DatabaseType;
import com.elong.pb.newdda.client.exception.DatabaseTypeUnsupportedException;
import com.elong.pb.newdda.client.router.parser.visitor.basic.mysql.MySqlDeleteVisitor;
import com.elong.pb.newdda.client.router.parser.visitor.basic.mysql.MySqlInsertVisitor;
import com.elong.pb.newdda.client.router.parser.visitor.basic.mysql.MySqlSelectVisitor;
import com.elong.pb.newdda.client.router.parser.visitor.basic.mysql.MySqlUpdateVisitor;
import java.util.HashMap;
import java.util.Map;
package com.elong.pb.newdda.client.router.parser;



/**
 * SQL访问器注册表.
 */
public final class SqlVisitorRegistry {

    private static final Map<DatabaseType, Class<? extends SQLASTOutputVisitor>> SELECT_REGISTRY = new HashMap<DatabaseType, Class<? extends SQLASTOutputVisitor>>(DatabaseType.values().length);

    private static final Map<DatabaseType, Class<? extends SQLASTOutputVisitor>> INSERT_REGISTRY = new HashMap<DatabaseType, Class<? extends SQLASTOutputVisitor>>(DatabaseType.values().length);

    private static final Map<DatabaseType, Class<? extends SQLASTOutputVisitor>> UPDATE_REGISTRY = new HashMap<DatabaseType, Class<? extends SQLASTOutputVisitor>>(DatabaseType.values().length);

    private static final Map<DatabaseType, Class<? extends SQLASTOutputVisitor>> DELETE_REGISTRY = new HashMap<DatabaseType, Class<? extends SQLASTOutputVisitor>>(DatabaseType.values().length);

    static {
        registerSelectVistor();
        registerInsertVistor();
        registerUpdateVistor();
        registerDeleteVistor();
    }

    private static void registerSelectVistor() {
        SELECT_REGISTRY.put(DatabaseType.H2, MySqlSelectVisitor.class);
        SELECT_REGISTRY.put(DatabaseType.MySQL, MySqlSelectVisitor.class);
        // TODO 其他数据库
    }

    private static void registerInsertVistor() {
        INSERT_REGISTRY.put(DatabaseType.H2, MySqlInsertVisitor.class);
        INSERT_REGISTRY.put(DatabaseType.MySQL, MySqlInsertVisitor.class);
        // TODO 其他数据库
    }

// Path: src/main/java/com/elong/pb/newdda/client/constants/DatabaseType.java
// public enum DatabaseType {
// 
//     H2, MySQL, Oracle, SQLServer, DB2;
// 
//     public static DatabaseType valueFrom(final String databaseName) {
//         try {
//             return DatabaseType.valueOf(databaseName);
//         } catch (final IllegalArgumentException ex) {
//             throw new DatabaseTypeUnsupportedException(databaseName);
//         }
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/exception/DatabaseTypeUnsupportedException.java
// public class DatabaseTypeUnsupportedException extends RuntimeException {
// 
//     private static final long serialVersionUID = -7807395469148925091L;
// 
//     private static final String MESSAGE = "Can not support database type [%s].";
// 
//     public DatabaseTypeUnsupportedException(final String databaseType) {
//         super(String.format(MESSAGE, databaseType));
//     }
//     
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/basic/mysql/MySqlDeleteVisitor.java
// public class MySqlDeleteVisitor extends AbstractMySqlVisitor {
// 
//     public boolean visit(final MySqlDeleteStatement x) {
//         getSqlParserContext().setCurrentTable(x.getTableName().toString(), x.getAlias());
//         return super.visit(x);
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/basic/mysql/MySqlInsertVisitor.java
// public class MySqlInsertVisitor extends AbstractMySqlVisitor {
// 
//     public boolean visit(final MySqlInsertStatement x) {
//         getSqlParserContext().setCurrentTable(x.getTableName().toString(), x.getAlias());
//         if (null == x.getValues()) {
//             return super.visit(x);
//         }
//         for (int i = 0; i < x.getColumns().size(); i++) {
//             getSqlParserContext().addCondition(x.getColumns().get(i).toString(), x.getTableName().toString(), BinaryOperator.EQUAL, x.getValues().getValues().get(i), getDatabaseType(), getParameters());
//         }
//         return super.visit(x);
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/basic/mysql/MySqlSelectVisitor.java
// public class MySqlSelectVisitor extends AbstractMySqlVisitor {
// 
//     private final static Logger logger = LoggerFactory.getLogger(MySqlSelectVisitor.class);
// 
//     public void preVisit(SQLObject x) {
//         if (logger.isDebugEnabled()) {
//         }
//     }
// 
//     @Override
//     public boolean visit(final MySqlSelectQueryBlock x) {
//         if (x.getFrom() instanceof SQLExprTableSource) {
//             SQLExprTableSource tableExpr = (SQLExprTableSource) x.getFrom();
//             getSqlParserContext().setCurrentTable(tableExpr.getExpr().toString(), tableExpr.getAlias());
//         }
//         return super.visit(x);
//     }
// 
//     @Override
//     public void endVisit(final MySqlSelectQueryBlock x) {
//         super.endVisit(x);
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/basic/mysql/MySqlUpdateVisitor.java
// public class MySqlUpdateVisitor extends AbstractMySqlVisitor {
// 
//     public boolean visit(final MySqlUpdateStatement x) {
//         getSqlParserContext().setCurrentTable(x.getTableName().toString(), null);
//         return super.visit(x);
//     }
// 
// }


// Path: src/main/java/com/elong/pb/newdda/client/router/parser/SqlVisitorRegistry.java
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.elong.pb.newdda.client.constants.DatabaseType;
import com.elong.pb.newdda.client.exception.DatabaseTypeUnsupportedException;
import com.elong.pb.newdda.client.router.parser.visitor.basic.mysql.MySqlDeleteVisitor;
import com.elong.pb.newdda.client.router.parser.visitor.basic.mysql.MySqlInsertVisitor;
import com.elong.pb.newdda.client.router.parser.visitor.basic.mysql.MySqlSelectVisitor;
import com.elong.pb.newdda.client.router.parser.visitor.basic.mysql.MySqlUpdateVisitor;
import java.util.HashMap;
import java.util.Map;

package com.elong.pb.newdda.client.router.parser;



/**
 * SQL访问器注册表.
 */
public final class SqlVisitorRegistry {

    private static final Map<DatabaseType, Class<? extends SQLASTOutputVisitor>> SELECT_REGISTRY = new HashMap<DatabaseType, Class<? extends SQLASTOutputVisitor>>(DatabaseType.values().length);

    private static final Map<DatabaseType, Class<? extends SQLASTOutputVisitor>> INSERT_REGISTRY = new HashMap<DatabaseType, Class<? extends SQLASTOutputVisitor>>(DatabaseType.values().length);

    private static final Map<DatabaseType, Class<? extends SQLASTOutputVisitor>> UPDATE_REGISTRY = new HashMap<DatabaseType, Class<? extends SQLASTOutputVisitor>>(DatabaseType.values().length);

    private static final Map<DatabaseType, Class<? extends SQLASTOutputVisitor>> DELETE_REGISTRY = new HashMap<DatabaseType, Class<? extends SQLASTOutputVisitor>>(DatabaseType.values().length);

    static {
        registerSelectVistor();
        registerInsertVistor();
        registerUpdateVistor();
        registerDeleteVistor();
    }

    private static void registerSelectVistor() {
        SELECT_REGISTRY.put(DatabaseType.H2, MySqlSelectVisitor.class);
        SELECT_REGISTRY.put(DatabaseType.MySQL, MySqlSelectVisitor.class);
        // TODO 其他数据库
    }

    private static void registerInsertVistor() {
        INSERT_REGISTRY.put(DatabaseType.H2, MySqlInsertVisitor.class);
        INSERT_REGISTRY.put(DatabaseType.MySQL, MySqlInsertVisitor.class);
        // TODO 其他数据库
    }

    private static void registerUpdateVistor() {