001package gudusoft.gsqlparser.nodes;
002
003import gudusoft.gsqlparser.EExpressionType;
004import gudusoft.gsqlparser.ESqlClause;
005import gudusoft.gsqlparser.TCustomSqlStatement;
006import gudusoft.gsqlparser.TStatementList;
007
008/**
009* CASE expressions let you use IF ... THEN ... ELSE logic in SQL statements without having to invoke procedures.
010 * <p>simple case expression:
011 * <ul>
012 * <li>CASE input_expr {WHEN comparison_expr THEN return_expr}[...n] [ELSE else_expr] END</li>
013 *     <li>input_expr: {@link #getInput_expr()}</li>
014 *     <li>WHEN...THEN... list: {@link #getWhenClauseItemList()}</li>
015 *     <li>else_expr: {@link #getElse_expr()}</li>
016 * </ul>
017 *
018 * <br> searched case expression:
019 * CASE  {WHEN comparison_expr THEN return_expr}[...n] [ELSE else_expr] END
020 * <ul>
021 *     <li>WHEN...THEN... list: {@link #getWhenClauseItemList()}</li>
022 *     <li>else_expr: {@link #getElse_expr()}</li>
023 * </ul>
024 *
025 *
026 * plsql case statement
027 * <ul>
028 * <li>CASE input_expr {WHEN comparison_expr THEN statement}[...n] [ELSE else_statement_list] END
029 * <ul>
030 *     <li>input_expr: {@link #getInput_expr()}</li>
031 *     <li>WHEN...THEN... list: {@link #getWhenClauseItemList()}</li>
032 *     <li>else_statement_list: {@link #getElse_statement_list()}</li>
033 *     </ul>
034 * </li>
035 * </ul>
036 *
037 *
038 * @see TWhenClauseItem
039 * @see TWhenClauseItemList
040*/
041
042public class TCaseExpression extends TParseTreeNode{
043    private TExpression input_expr = null;
044    private TExpression else_expr = null;
045
046    public TExpression getElse_expr() {
047        return else_expr;
048    }
049
050    public TExpression getInput_expr() {
051        return input_expr;
052    }
053
054    /**
055     * 
056     * @return List of When...Then... clause.
057     */
058    public TWhenClauseItemList getWhenClauseItemList() {
059        return whenClauseItemList;
060    }
061
062    private TWhenClauseItemList whenClauseItemList = null;
063
064    public TStatementListSqlNode getElse_statement_node_list() {
065        return else_statement_node_list;
066    }
067
068    private TStatementListSqlNode else_statement_node_list = null; // plsql
069    private TStatementList else_statement_list = null;
070
071    /**
072     *
073     * @return else statement list in plsql case statement. 
074     */
075    public TStatementList getElse_statement_list() {
076        if (else_statement_list == null){
077            else_statement_list = new TStatementList();
078        }
079        return else_statement_list;
080    }
081
082    public void init(Object arg1, Object arg2, Object arg3)
083    {
084        input_expr = (TExpression)arg1;
085        whenClauseItemList = (TWhenClauseItemList)arg2;
086        if (arg3 instanceof TExpression){
087        else_expr = (TExpression)arg3;
088        }else{
089          else_statement_node_list = (TStatementListSqlNode)arg3;
090        }
091    }
092
093    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
094        if (input_expr != null){
095            input_expr.doParse(psql,plocation);
096        }
097        whenClauseItemList.doParse(psql,plocation);
098        if (else_expr != null){
099            else_expr.doParse(psql,plocation);
100        }
101        if (else_statement_node_list != null){
102            else_statement_node_list.doParse(psql,plocation);
103            for (int i=0;i<else_statement_node_list.size();i++){
104              getElse_statement_list().add(else_statement_node_list.getStatementSqlNode(i).getStmt());  
105            }
106        }
107    }
108
109    public void accept(TParseTreeVisitor v){
110        v.preVisit(this);
111        v.postVisit(this);
112    }
113
114    public void acceptChildren(TParseTreeVisitor v){
115        v.preVisit(this);
116        if (input_expr != null){
117            input_expr.acceptChildren(v);
118        }
119        whenClauseItemList.acceptChildren(v);
120        if (else_expr != null){
121            if (else_expr.getExpressionType() == EExpressionType.parenthesis_t){
122                else_expr.getLeftOperand().acceptChildren(v);
123            }else{
124                else_expr.acceptChildren(v);
125            }
126        }
127        if (else_statement_node_list != null){
128            getElse_statement_list().acceptChildren(v);
129        }
130        v.postVisit(this);
131    }
132
133    public void setInput_expr(TExpression input_expr) {
134        this.input_expr = input_expr;
135    }
136
137    public void setElse_expr(TExpression else_expr) {
138        this.else_expr = else_expr;
139    }
140
141    public void setWhenClauseItemList(TWhenClauseItemList whenClauseItemList) {
142        this.whenClauseItemList = whenClauseItemList;
143    }
144
145    public void setElse_statement_node_list(TStatementListSqlNode else_statement_node_list) {
146        this.else_statement_node_list = else_statement_node_list;
147    }
148
149    public void setElse_statement_list(TStatementList else_statement_list) {
150        this.else_statement_list = else_statement_list;
151    }
152
153//    public void evaluate(){
154//        whenClauseItemList.getWhenClauseItem(0).getReturn_expr().evaluate();
155//    }
156}