001package gudusoft.gsqlparser.stmt;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.nodes.TCaseExpression;
005import gudusoft.gsqlparser.nodes.TExpression;
006import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
007import gudusoft.gsqlparser.nodes.TWhenClauseItemList;
008
009/**
010 * The CASE statement chooses from a sequence of conditions, and execute a corresponding statement.
011 * @see TCaseExpression
012 */
013
014public class TCaseStmt extends TCustomSqlStatement {
015
016    public TCaseStmt(){
017        this(EDbVendor.dbvoracle);
018    }
019
020     public TCaseStmt(EDbVendor dbvendor){
021        super(dbvendor);
022        sqlstatementtype = ESqlStatementType.sst_casestmt;
023        }
024
025    void buildsql() {
026    }
027
028    void clear() {
029    }
030
031    String getasprettytext() {
032        return "";
033    }
034
035    void iterate(TVisitorAbs pvisitor) {
036    }
037
038
039    private TCaseExpression caseExpr = null;
040
041    public void init(Object arg1){
042      caseExpr = (TCaseExpression)arg1;  
043    }
044
045    /**
046     *
047     * @return check {@link TCaseExpression} for detailed. 
048     */
049    public TCaseExpression getCaseExpr() {
050        return caseExpr;
051    }
052    private TExpression expr = null;
053
054    public TExpression getExpr() {
055        return expr;
056    }
057
058    private TWhenClauseItemList whenClauseItemList = null;
059
060    public TWhenClauseItemList getWhenClauseItemList() {
061        return whenClauseItemList;
062    }
063
064    public TStatementList getDefaultStatementList() {
065        if (defaultStatementList == null){
066            defaultStatementList = new TStatementList();
067        }
068        return defaultStatementList;
069    }
070
071    private TStatementList defaultStatementList = null;
072
073    public int doParseStatement(TCustomSqlStatement psql) {
074        super.doParseStatement(psql);
075        switch (dbvendor){
076            case dbvteradata:
077                caseExpr = (TCaseExpression)rootNode;
078                caseExpr.doParse(this,ESqlClause.unknown);
079                break;
080            case dbvsybase:
081                // Watcom CASE statement (Mantis 4717): the node is its CASE; each WHEN and the ELSE hold statements.
082                caseExpr = (TCaseExpression)rootNode;
083                caseExpr.doParse(this,ESqlClause.unknown);
084                break;
085            case dbvsybaseiq:
086                // Watcom CASE statement (Mantis 4717): the node is its CASE; each WHEN and the ELSE hold statements.
087                caseExpr = (TCaseExpression)rootNode;
088                caseExpr.doParse(this,ESqlClause.unknown);
089                break;
090            case dbvsqlanywhere:
091                // Watcom CASE statement (Mantis 4717): the node is its CASE; each WHEN and the ELSE hold statements.
092                caseExpr = (TCaseExpression)rootNode;
093                caseExpr.doParse(this,ESqlClause.unknown);
094                break;
095            case dbvbigquery:
096                TCaseExpression caseNode = (TCaseExpression)rootNode;
097                this.expr = caseNode.getInput_expr();
098                if (this.expr != null){
099                    this.expr.doParse(this,ESqlClause.unknown);
100                }
101                this.whenClauseItemList = caseNode.getWhenClauseItemList();
102                this.whenClauseItemList.doParse(this,ESqlClause.unknown);
103
104                if (caseNode.getElse_statement_node_list() != null){
105                    caseNode.getElse_statement_node_list().doParse(this,ESqlClause.unknown);
106                    for (int i=0;i<caseNode.getElse_statement_node_list().size();i++){
107                        this.getDefaultStatementList().add(caseNode.getElse_statement_node_list().getStatementSqlNode(i).getStmt());
108                    }
109                }
110                break;
111            default:
112                caseExpr.doParse(this,ESqlClause.unknown);
113                break;
114        }
115        return 0;
116    }
117
118    public void accept(TParseTreeVisitor v){
119        v.preVisit(this);
120        v.postVisit(this);
121    }
122
123    public void acceptChildren(TParseTreeVisitor v){
124        v.preVisit(this);
125        if (caseExpr != null) {
126            caseExpr.acceptChildren(v);
127        } else {
128            // BigQuery path: fields stored directly on TCaseStmt
129            if (expr != null) {
130                expr.acceptChildren(v);
131            }
132            if (whenClauseItemList != null) {
133                whenClauseItemList.acceptChildren(v);
134            }
135            if (defaultStatementList != null) {
136                defaultStatementList.acceptChildren(v);
137            }
138        }
139        v.postVisit(this);
140    }
141
142    public void setCaseExpr(TCaseExpression caseExpr) {
143        this.caseExpr = caseExpr;
144    }
145}