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           // Used for multiple WHEN values (e.g., CASE x WHEN 1, 2, 3 THEN ...)
080           conditionList = (TExpressionList)arg1;
081           // For backward compatibility, also set comparison_expr to first expression
082           // so code using getComparison_expr() still works for single values
083           if (conditionList.size() > 0){
084               comparison_expr = conditionList.getExpression(0);
085               if (comparison_expr != null && comparison_expr.getExpressionType() == EExpressionType.assignment_t){
086                   comparison_expr.setExpressionType(EExpressionType.simple_comparison_t);
087               }
088           }
089       }
090       if (arg2 instanceof TExpression ){
091            return_expr = (TExpression)arg2;
092       }else if (arg2 instanceof TConstantList){
093           this.count_fraction_description_list = (TConstantList)arg2;
094       }
095       else{
096           stmts = (TStatementListSqlNode)arg2;
097       }
098    }
099
100    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
101        if (comparison_expr != null){
102            comparison_expr.doParse(psql,plocation);
103        }else if (conditionList != null){
104            conditionList.doParse(psql,plocation);
105        }
106       if (return_expr != null ){
107        return_expr.doParse(psql,plocation);
108       }else if (stmts != null){
109           stmts.doParse(psql, plocation);
110           for (int i=0;i<stmts.size();i++){
111             getStatement_list().add(stmts.getStatementSqlNode(i).getStmt());  
112           }
113       }
114    }
115
116    public void accept(TParseTreeVisitor v){
117        v.preVisit(this);
118        v.postVisit(this);
119    }
120
121    public void acceptChildren(TParseTreeVisitor v){
122        v.preVisit(this);
123        if (comparison_expr != null){
124            comparison_expr.acceptChildren(v);
125        }else if (conditionList != null){
126            conditionList.acceptChildren(v);
127        }
128        if (return_expr != null ){
129            return_expr.acceptChildren(v);
130        }else if (stmts != null){
131            getStatement_list().acceptChildren(v);
132        }
133        v.postVisit(this);
134    }
135
136    public void setComparison_expr(TExpression comparison_expr) {
137        this.comparison_expr = comparison_expr;
138    }
139
140    public void setReturn_expr(TExpression return_expr) {
141        this.return_expr = return_expr;
142    }
143
144    public void setConditionList(TExpressionList conditionList) {
145        this.conditionList = conditionList;
146    }
147
148    public void setCount_fraction_description_list(TConstantList count_fraction_description_list) {
149        this.count_fraction_description_list = count_fraction_description_list;
150    }
151
152    public void setStatement_list(TStatementList statement_list) {
153        this.statement_list = statement_list;
154    }
155}