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}