001 002 package railo.runtime.sql.old; 003 004 import java.util.Vector; 005 006 // Referenced classes of package Zql: 007 // ZExp, ZQuery, ZConstant, ZUtils 008 009 public final class ZExpression 010 implements ZExp 011 { 012 013 public ZExpression(String s) 014 { 015 op_ = null; 016 operands_ = null; 017 op_ = new String(s); 018 } 019 020 public ZExpression(String s, ZExp zexp) 021 { 022 op_ = null; 023 operands_ = null; 024 op_ = new String(s); 025 addOperand(zexp); 026 } 027 028 public ZExpression(String s, ZExp zexp, ZExp zexp1) 029 { 030 op_ = null; 031 operands_ = null; 032 op_ = new String(s); 033 addOperand(zexp); 034 addOperand(zexp1); 035 } 036 037 public String getOperator() 038 { 039 return op_; 040 } 041 042 public void setOperands(Vector vector) 043 { 044 operands_ = vector; 045 } 046 047 public Vector getOperands() 048 { 049 return operands_; 050 } 051 052 public void addOperand(ZExp zexp) 053 { 054 if(operands_ == null) 055 operands_ = new Vector(); 056 operands_.addElement(zexp); 057 } 058 059 public ZExp getOperand(int i) 060 { 061 if(operands_ == null || i >= operands_.size()) 062 return null; 063 return (ZExp)operands_.elementAt(i); 064 } 065 066 public int nbOperands() 067 { 068 if(operands_ == null) 069 return 0; 070 return operands_.size(); 071 } 072 073 public String toReversePolish() 074 { 075 StringBuffer stringbuffer = new StringBuffer("("); 076 stringbuffer.append(op_); 077 for(int i = 0; i < nbOperands(); i++) 078 { 079 ZExp zexp = getOperand(i); 080 if(zexp instanceof ZExpression) 081 stringbuffer.append(" " + ((ZExpression)zexp).toReversePolish()); 082 else 083 if(zexp instanceof ZQuery) 084 stringbuffer.append(" (" + zexp.toString() + ")"); 085 else 086 stringbuffer.append(" " + zexp.toString()); 087 } 088 089 stringbuffer.append(")"); 090 return stringbuffer.toString(); 091 } 092 093 public String toString() 094 { 095 if(op_.equals("?")) 096 return op_; 097 if(ZUtils.isCustomFunction(op_) > 0) 098 return formatFunction(); 099 StringBuffer stringbuffer = new StringBuffer(); 100 if(needPar(op_)) 101 stringbuffer.append("("); 102 switch(nbOperands()) 103 { 104 case 1: // '\001' 105 ZExp zexp = getOperand(0); 106 if(zexp instanceof ZConstant) 107 { 108 if(ZUtils.isAggregate(op_)) 109 stringbuffer.append(op_ + "(" + zexp.toString() + ")"); 110 else 111 stringbuffer.append(op_ + " " + zexp.toString()); 112 } else 113 if(zexp instanceof ZQuery) 114 stringbuffer.append(op_ + " (" + zexp.toString() + ")"); 115 else 116 stringbuffer.append(op_ + " " + zexp.toString()); 117 break; 118 119 case 3: // '\003' 120 if(op_.toUpperCase().endsWith("BETWEEN")) 121 { 122 stringbuffer.append(getOperand(0).toString() + " " + op_ + " " + getOperand(1).toString() + " AND " + getOperand(2).toString()); 123 break; 124 } 125 // fall through 126 127 default: 128 boolean flag = op_.equals("IN") || op_.equals("NOT IN"); 129 int i = nbOperands(); 130 for(int j = 0; j < i; j++) 131 { 132 if(flag && j == 1) 133 stringbuffer.append(" " + op_ + " ("); 134 ZExp zexp1 = getOperand(j); 135 if((zexp1 instanceof ZQuery) && !flag) 136 stringbuffer.append("(" + zexp1.toString() + ")"); 137 else 138 stringbuffer.append(zexp1.toString()); 139 if(j < i - 1) 140 if(op_.equals(",") || flag && j > 0) 141 stringbuffer.append(", "); 142 else 143 if(!flag) 144 stringbuffer.append(" " + op_ + " "); 145 } 146 147 if(flag) 148 stringbuffer.append(")"); 149 break; 150 } 151 if(needPar(op_)) 152 stringbuffer.append(")"); 153 return stringbuffer.toString(); 154 } 155 156 private boolean needPar(String s) 157 { 158 s = s.toUpperCase(); 159 return !s.equals("ANY") && !s.equals("ALL") && !s.equals("UNION") && !ZUtils.isAggregate(s); 160 } 161 162 private String formatFunction() 163 { 164 StringBuffer stringbuffer = new StringBuffer(op_ + "("); 165 int i = nbOperands(); 166 for(int j = 0; j < i; j++) 167 stringbuffer.append(getOperand(j).toString() + (j >= i - 1 ? "" : ",")); 168 169 stringbuffer.append(")"); 170 return stringbuffer.toString(); 171 } 172 173 String op_; 174 Vector operands_; 175 }