001package gudusoft.gsqlparser.stmt;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.nodes.*;
005import gudusoft.gsqlparser.stmt.*;
006
007public class TExplainPlan extends TCustomSqlStatement {
008
009    private TCustomSqlStatement statement;
010
011    public TCustomSqlStatement getStatement() {
012        return statement;
013    }
014
015    public TExplainPlan(EDbVendor dbvendor) {
016        super(dbvendor);
017        sqlstatementtype = ESqlStatementType.sstExplain;
018    }
019
020    public int doParseStatement(TCustomSqlStatement psql) {
021        if (rootNode == null) {
022            // EXPLAIN FOR CONNECTION has no inner statement to parse
023            if (isForConnection()) return 0;
024            return -1;
025        }
026        super.doParseStatement(psql);
027        TStatementSqlNode sqlNode = new TStatementSqlNode();
028        if (dbvendor == EDbVendor.dbvhana){
029            if (((TDummy)rootNode).node1 != null){
030                sqlNode.init(((TDummy)rootNode).node1);
031                sqlNode.doParse(this, ESqlClause.unknown);
032                statement = sqlNode.getStmt();
033            }
034        }else{
035            sqlNode.init(rootNode);
036            sqlNode.doParse(this, ESqlClause.unknown);
037            statement = sqlNode.getStmt();
038        }
039
040//        switch (rootNode.getNodeType()){
041//            case TStatementSqlNode.select:
042//                statement = new TSelectSqlStatement(dbvendor);
043//                break;
044//            case TStatementSqlNode.delete:
045//                statement = new TDeleteSqlStatement(dbvendor);
046//                break;
047//            case TStatementSqlNode.insert:
048//                statement = new TInsertSqlStatement(dbvendor);
049//                break;
050//            case TStatementSqlNode.update:
051//                statement = new TUpdateSqlStatement(dbvendor);
052//                break;
053//            case TStatementSqlNode.createtable:
054//                statement = new TCreateTableSqlStatement(dbvendor);
055//                break;
056//            case TStatementSqlNode.CreateIndexSqlNode:
057//                statement = new TCreateIndexSqlStatement(dbvendor);
058//                break;
059//            default:
060//                break;
061//        }
062//        statement.rootNode = rootNode;
063//        statement.doParseStatement(this);
064
065        return 0;
066    }
067
068    public void accept(TParseTreeVisitor v){
069        v.preVisit(this);
070        v.postVisit(this);
071    }
072
073    public void acceptChildren(TParseTreeVisitor v){
074        v.preVisit(this);
075        if (statement != null){
076            statement.accept(v);
077        }else{
078            TBaseType.log("Stmt inside explain is null",TLog.WARNING);
079        }
080
081        v.postVisit(this);
082    }
083
084    public void setStatement(TCustomSqlStatement statement) {
085        this.statement = statement;
086    }
087
088    private boolean isForConnection() {
089        if (sourcetokenlist == null) return false;
090        for (int i = 0; i < sourcetokenlist.size() - 1; i++) {
091            TSourceToken st = sourcetokenlist.get(i);
092            if (st.tokencode == TBaseType.rrw_for) {
093                TSourceToken next = sourcetokenlist.nextsolidtoken(i, 1, false);
094                if (next != null && next.toString().equalsIgnoreCase("connection")) {
095                    return true;
096                }
097            }
098        }
099        return false;
100    }
101}