001package gudusoft.gsqlparser.nodes;
002
003import gudusoft.gsqlparser.*;
004
005/**
006* WhenClause item used in case expr of {@link TCaseExpression}.
007 * <p>
008 * <ul>
009 *     <li>WHEN comparison_expr THEN return_expr</li>
010 *
011 *         <li>comparison_expr: {@link #getComparison_expr()}</li>
012 *         <li>return_expr: {@link #getReturn_expr()}</li>
013 *
014 *
015 * </ul>
016
017 * <p> in db2/plsql case statement
018 * <ul>
019 * <li>WHEN comparison_expr THEN statement_list</li>
020 *
021 *         <li>comparison_expr: {@link #getComparison_expr()}</li>
022 *         <li>statement_list: {@link #getStatement_list()}</li>
023 *
024 *
025 * </ul>
026 *
027 * @see TCaseExpression
028*/
029public class TWhenClauseItem extends TParseTreeNode {
030    private TExpression comparison_expr = null;
031    private TExpression return_expr = null;
032    private TStatementListSqlNode stmts = null; // plsql
033    private TExpressionList conditionList = null;
034
035    public TExpressionList getConditionList() {
036        return conditionList;
037    }
038
039    private TConstantList count_fraction_description_list = null;
040
041    /**
042     * teradata: count,fraction description list of sample clause
043     * @return
044     */
045    public TConstantList getCount_fraction_description_list() {
046        return count_fraction_description_list;
047    }
048
049    public TExpression getComparison_expr() {
050        return comparison_expr;
051    }
052
053    public TExpression getReturn_expr() {
054        return return_expr;
055    }
056
057    /**
058     *
059     * @return statement list if it's in a plsql/db2 case statement.
060     */
061    public TStatementList getStatement_list() {
062        if (statement_list == null){
063            statement_list = new TStatementList();
064        }
065        return statement_list;
066    }
067
068    private TStatementList statement_list = null;
069
070    public void init(Object arg1,Object arg2)
071    {
072       if (arg1 instanceof TExpression){
073            comparison_expr = (TExpression)arg1;
074            if (comparison_expr.getExpressionType() == EExpressionType.assignment_t){
075                //comparison_expr.setExpressionType(TExpression.simple_comparison_conditions);
076                comparison_expr.setExpressionType(EExpressionType.simple_comparison_t);
077            }
078       }else if (arg1 instanceof TExpressionList){
079           //postgresql
080           conditionList = (TExpressionList)arg1;
081       }
082       if (arg2 instanceof TExpression ){
083            return_expr = (TExpression)arg2;
084       }else if (arg2 instanceof TConstantList){
085           this.count_fraction_description_list = (TConstantList)arg2;
086       }
087       else{
088           stmts = (TStatementListSqlNode)arg2;
089       }
090    }
091
092    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
093        if (comparison_expr != null){
094            comparison_expr.doParse(psql,plocation);
095        }else if (conditionList != null){
096            conditionList.doParse(psql,plocation);
097        }
098       if (return_expr != null ){
099        return_expr.doParse(psql,plocation);
100       }else if (stmts != null){
101           stmts.doParse(psql, plocation);
102           for (int i=0;i<stmts.size();i++){
103             getStatement_list().add(stmts.getStatementSqlNode(i).getStmt());  
104           }
105       }
106    }
107
108    public void accept(TParseTreeVisitor v){
109        v.preVisit(this);
110        v.postVisit(this);
111    }
112
113    public void acceptChildren(TParseTreeVisitor v){
114        v.preVisit(this);
115        if (comparison_expr != null){
116            comparison_expr.acceptChildren(v);
117        }else if (conditionList != null){
118            conditionList.acceptChildren(v);
119        }
120        if (return_expr != null ){
121            return_expr.acceptChildren(v);
122        }else if (stmts != null){
123            getStatement_list().acceptChildren(v);
124        }
125        v.postVisit(this);
126    }
127
128    public void setComparison_expr(TExpression comparison_expr) {
129        this.comparison_expr = comparison_expr;
130    }
131
132    public void setReturn_expr(TExpression return_expr) {
133        this.return_expr = return_expr;
134    }
135
136    public void setConditionList(TExpressionList conditionList) {
137        this.conditionList = conditionList;
138    }
139
140    public void setCount_fraction_description_list(TConstantList count_fraction_description_list) {
141        this.count_fraction_description_list = count_fraction_description_list;
142    }
143
144    public void setStatement_list(TStatementList statement_list) {
145        this.statement_list = statement_list;
146    }
147}