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}