KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > sql99 > expression > expressionprimary > searchedcase


1 package com.daffodilwoods.daffodildb.server.sql99.expression.expressionprimary;
2
3 import java.math.*;
4 import java.util.*;
5
6 import com.daffodilwoods.daffodildb.server.sql99.common.*;
7 import com.daffodilwoods.daffodildb.server.sql99.expression.*;
8 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.predicates.*;
9 import com.daffodilwoods.daffodildb.server.sql99.expression.rowvalueexpression.*;
10 import com.daffodilwoods.daffodildb.server.sql99.token.*;
11 import com.daffodilwoods.daffodildb.server.sql99.utils.*;
12 import com.daffodilwoods.daffodildb.utils.*;
13 import com.daffodilwoods.daffodildb.utils.field.*;
14 import com.daffodilwoods.database.resource.*;
15
16 public class searchedcase extends AbstractValueExpression implements casespecification, _sortspecificationAndselectSubList, TypeConstants, Datatypes {
17
18    public SRESERVEDWORD1206543922 _SRESERVEDWORD12065439220;
19    public elseclause _Optelseclause1;
20    public searchedwhenclause[] _Repsearchedwhenclause2;
21    public SRESERVEDWORD1206543922 _SRESERVEDWORD12065439223;
22
23    private int datatype = -1;
24    private int[] datatype2;
25    private int datatype3 = -1;
26    private int size = -1;
27    private int[] size2;
28    private int size3 = -1;
29
30    public Object JavaDoc run(Object JavaDoc object) throws com.daffodilwoods.database.resource.DException {
31       if (datatype == -1) {
32          datatype = getAppropriateDatatype(object);
33          size = getAppropriateSize(object);
34        }
35       FieldBase result;
36       int index = getIndexOfWhenClauseSatisfyingCondition(object);
37       if (index != -1) {
38          result = (FieldBase) _Repsearchedwhenclause2[index].run(object);
39          return result.isNull() ? result : FieldUtility.convertToAppropriateType(result,
40              datatype,size,result.getCollator());
41       }
42       if (_Optelseclause1 != null) {
43          result = (FieldBase) _Optelseclause1.run(object);
44          return result.isNull() ? result : FieldUtility.convertToAppropriateType(result,
45              datatype,size,result.getCollator());
46       }
47       return new FieldLiteral(FieldUtility.NULLBUFFERRANGE, datatype);
48    }
49
50    private int getIndexOfWhenClauseSatisfyingCondition(Object JavaDoc object) throws DException {
51       for (int i = 0; i < _Repsearchedwhenclause2.length; i++) {
52          if (_Repsearchedwhenclause2[i].isConditionSatisfied(object) == 0) {
53             return i;
54          }
55       }
56       return -1;
57
58    }
59
60
61    private ColumnDetails[] columnDetails;
62    private ColumnDetails column;
63
64    public ParameterInfo[] getParameterInfo() throws DException {
65       ArrayList list = new ArrayList();
66       for (int i = 0; i < _Repsearchedwhenclause2.length; ++i) {
67          ParameterInfo[] temp = _Repsearchedwhenclause2[i].getParameterInfo();
68          if (temp != null) {
69             list.addAll(Arrays.asList(temp));
70          }
71       }
72       return (ParameterInfo[]) list.toArray(new ParameterInfo[list.size()]);
73    }
74
75    public ColumnDetails[] getChildColumnDetails() throws DException {
76       return columnDetails;
77    }
78
79    public AbstractRowValueExpression[] getChilds() {
80       int length = _Repsearchedwhenclause2.length;
81       AbstractRowValueExpression[] childs = new AbstractRowValueExpression[length];
82       for (int i = 0; i < length; ++i) {
83          childs[i] = (AbstractRowValueExpression) _Repsearchedwhenclause2[i];
84       }
85       return childs;
86    }
87
88    public ColumnDetails[] getColumnDetails() throws DException {
89       ColumnDetails[] columnDetails1;
90       ColumnDetails[][] details = new ColumnDetails[_Repsearchedwhenclause2.length][];
91       int length = 0;
92       for (int i = 0; i < _Repsearchedwhenclause2.length; i++) {
93          details[i] = _Repsearchedwhenclause2[i] == null ? new ColumnDetails[0] : _Repsearchedwhenclause2[i].getColumnDetails();
94          length += details[i].length;
95       }
96       columnDetails1 = new ColumnDetails[length];
97       int index = 0;
98       for (int i = 0; i < details.length; i++) {
99          ColumnDetails[] cds = (ColumnDetails[]) details[i];
100          for (int j = 0; j < cds.length; j++) {
101             columnDetails1[index++] = cds[j];
102          }
103       }
104       ColumnDetails[] columnDetails2 = null;
105       if (_Optelseclause1 != null) {
106          columnDetails2 = _Optelseclause1.getColumnDetails();
107       }
108       column = new ColumnDetails();
109       column.setColumn(new String JavaDoc[] {toString()});
110       column.setType(CASEEXPRESSION);
111       column.setObject(this);
112       this.columnDetails = columnDetails2 != null ? StaticClass.mergeColumnDetails(columnDetails1, columnDetails2) : columnDetails1;
113       return new ColumnDetails[] {column};
114    }
115
116    private int getAppropriateDatatype(Object JavaDoc object) throws DException {
117       int max = -1;
118       int length = _Repsearchedwhenclause2.length;
119       datatype2 = new int[length];
120       for (int i = 0; i < length; i++) {
121               setDataTypeForNull(_Repsearchedwhenclause2[i], object);
122          datatype2[i] = _Repsearchedwhenclause2[i].getByteComparison(object).
123              getDataTypes()[0];
124          max = datatype2[i] > max ? datatype2[i] : max;
125       }
126       if (_Optelseclause1 != null) {
127          datatype3 = _Optelseclause1.getByteComparison(object).getDataTypes()[0];
128       size = ( (max == CHAR || max == CHARACTER) && (datatype3 == CHAR || max == CHARACTER )) ? 255 : -1 ;
129          max = datatype3 > max ? datatype3 : max;
130       }
131          return GeneralPurposeStaticClass.isCharacterType(max)?VARCHAR:max;
132
133     }
134    private int getAppropriateSize(Object JavaDoc object) throws DException {
135          int max = -1;
136          int length = _Repsearchedwhenclause2.length;
137          size2 = new int[length];
138          for (int i = 0; i < length; i++) {
139             size2[i] = _Repsearchedwhenclause2[i].getByteComparison(object).
140                 getSize();
141             max = size2[i] > max ? size2[i] : max;
142           }
143          if (_Optelseclause1 != null) {
144           size3 = _Optelseclause1.getByteComparison(object).getSize();
145           max = size3 > max ? size3 : max;
146          }
147
148          if (datatype == DEC || datatype == NUMERIC || datatype == DECIMAL ||
149              datatype == BIGDECIMAL) {
150            size = 38;
151          }
152          return max > size ? max : size ;
153     }
154
155    public com.daffodilwoods.daffodildb.server.sql99.utils._Reference[] checkSemantic(com.daffodilwoods.daffodildb.server.serversystem._ServerSession parent) throws DException {
156       _Reference[] ref = null;
157       int length = _Repsearchedwhenclause2.length;
158       for (int i = 0; i < length; i++) {
159          ref = GeneralPurposeStaticClass.getJointReferences(ref, _Repsearchedwhenclause2[i].checkSemantic(parent));
160       }
161       if (_Optelseclause1 != null) {
162          ref = GeneralPurposeStaticClass.getJointReferences(ref, _Optelseclause1.checkSemantic(parent));
163       }
164       getAppropriateDatatype(parent); // Not initialized to dataType, because that check is needed at runtime in case of '?'
165
for (int i = 1; i < length; i++) {
166          Check.checkForDatatype(datatype2[0], datatype2[i]);
167       }
168       if (_Optelseclause1 != null) {
169          Check.checkForDatatype(datatype2[0], datatype3);
170       }
171       return ref;
172    }
173
174    private FieldBase getResult(FieldBase fBase) throws DException {
175      Object JavaDoc object = fBase.getObject();
176       switch(datatype){
177          case BYTE : case TINYINT :
178             return new FieldLiteral( new Byte JavaDoc("" + object) , BYTE);
179           case SHORT : case SMALLINT :
180              return new FieldLiteral( new Short JavaDoc("" + object ) , SHORT);
181          case INTEGER : case INT :
182             return new FieldLiteral( new Integer JavaDoc("" + object ) , INTEGER);
183          case LONG : case BIGINT :
184             return new FieldLiteral( new Long JavaDoc("" + object) , LONG);
185          case REAL :
186             return new FieldLiteral( new Float JavaDoc("" + object ) , REAL);
187          case DOUBLE : case FLOAT : case DOUBLEPRECISION :
188             return new FieldLiteral( new Double JavaDoc("" + object ) , DOUBLE);
189           case BIGDECIMAL : case DEC : case DECIMAL : case NUMERIC :
190             return new FieldLiteral( new BigDecimal("" + object ) , BIGDECIMAL);
191           case CHARACTER :case VARCHAR: case CHAR: case CHARACTERVARYING:
192             return new FieldStringLiteral( object.toString() , CHARACTER ) ;
193             /** Done by vibha to resolve bug no . 12236 */
194           case BOOLEAN :
195              return new FieldLiteral(new Boolean JavaDoc("" + object) , BOOLEAN);
196          default :
197             throw new DException("DSE514",new Object JavaDoc[]{new Integer JavaDoc(datatype)});
198       }
199    }
200
201    public String JavaDoc toString() {
202       StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
203       sb.append(" ");
204       sb.append(_SRESERVEDWORD12065439223);
205       sb.append(" ");
206       for (int i = 0; i < _Repsearchedwhenclause2.length; i++) {
207          sb.append(_Repsearchedwhenclause2[i]);
208       }
209       sb.append(" ");
210       if (_Optelseclause1 != null) {
211          sb.append(_Optelseclause1);
212       }
213       sb.append(" ");
214       sb.append(_SRESERVEDWORD12065439220);
215       return sb.toString();
216    }
217
218    public Object JavaDoc clone() throws CloneNotSupportedException JavaDoc {
219       searchedcase tempClass = new searchedcase();
220       tempClass._SRESERVEDWORD12065439220 = (SRESERVEDWORD1206543922) _SRESERVEDWORD12065439220.clone();
221       if (_Optelseclause1 != null) {
222          tempClass._Optelseclause1 = (elseclause) _Optelseclause1.clone();
223       }
224       searchedwhenclause[] temp_Repsearchedwhenclause2 = new searchedwhenclause[_Repsearchedwhenclause2.length];
225       for (int i = 0; i < _Repsearchedwhenclause2.length; i++) {
226          temp_Repsearchedwhenclause2[i] = (searchedwhenclause) _Repsearchedwhenclause2[i].clone();
227       }
228       tempClass._Repsearchedwhenclause2 = temp_Repsearchedwhenclause2;
229       tempClass._SRESERVEDWORD12065439223 = (SRESERVEDWORD1206543922) _SRESERVEDWORD12065439223.clone();
230       return tempClass;
231    }
232
233    public ByteComparison getByteComparison(Object JavaDoc object) throws DException {
234       ByteComparison bc = new ByteComparison(false, new int[] {getAppropriateDatatype(object)});
235       bc.setSize(getAppropriateSize(object));
236       return bc;
237    }
238    /* done by vibha to solve bug no 13278
239      Method is committed in release4_1 by Sandeep to solve Compiere Bug
240     */

241     private void setDataTypeForNull(searchedwhenclause searchClause,
242                                     Object JavaDoc object) throws DException {
243       if (searchClause._result0.toString().trim().equalsIgnoreCase("null") &&
244           (_Optelseclause1 != null)) {
245         searchClause._result0.getColumnDetails()[0].setDatatype(_Optelseclause1.
246             getByteComparison(object).getDataTypes()[0]);
247       }
248       if (_Optelseclause1 != null &&
249           _Optelseclause1._result0.toString().trim().equalsIgnoreCase("null")) {
250         _Optelseclause1.getColumnDetails()[0].setDatatype(searchClause.
251             getByteComparison(object).getDataTypes()[0]);
252       }
253     }
254
255 }
256
Popular Tags