KickJava   Java API By Example, From Geeks To Geeks.

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


1 package com.daffodilwoods.daffodildb.server.sql99.expression.expressionprimary;
2 import com.daffodilwoods.database.resource.*;
3 import com.daffodilwoods.daffodildb.server.sql99.token.*;
4 import com.daffodilwoods.daffodildb.server.sql99.common.ColumnDetails;
5 import com.daffodilwoods.daffodildb.server.sql99.common.ParameterInfo;
6 import com.daffodilwoods.daffodildb.server.sql99.utils._Reference;
7 import com.daffodilwoods.daffodildb.server.serversystem._ServerSession;
8 import com.daffodilwoods.daffodildb.server.sql99.utils.ByteComparison;
9 import com.daffodilwoods.daffodildb.server.sql99.expression.*;
10 import com.daffodilwoods.daffodildb.utils.field.*;
11 import com.daffodilwoods.daffodildb.server.sql99.common.*;
12 import com.daffodilwoods.daffodildb.server.sql99.expression.rowvalueexpression.
13
    AbstractRowValueExpression;
14 import com.daffodilwoods.daffodildb.utils.*;
15 import java.math.*;
16 import java.sql.*;
17 import java.sql.Date JavaDoc;
18 import java.util.*;
19 import com.daffodilwoods.database.utility.*;
20
21 public class decodefunction extends AbstractGeneralFunction implements com.daffodilwoods.daffodildb.utils.parser.StatementExecuter ,generalvaluespecification {
22
23      public Srightparen_1874859514 _Srightparen_18748595140 ;
24      public valueexpression _OptScomma94843605valueexpression1 ;
25      public decodesearchrule[] _OptRepScomma94843605decodesearchrule2 ;
26      public decodesearchrule _decodesearchrule3 ;
27      public Scomma94843605 _Scomma948436054 ;
28      public valueexpression _valueexpression5 ;
29      public Sleftparen653880241 _Sleftparen6538802416 ;
30      public SNONRESERVEDWORD136444255 _SNONRESERVEDWORD1364442557 ;
31
32
33
34      /* Decode ( expression , search , [, search , result]... [, default] )
35      The decode function has the functionality of an IF-THEN-ELSE statement.
36      The syntax for the decode function is:
37      decode ( expression , search , result [, search , result]... [, default] )
38      expression is the value to compare.
39      search is the value that is compared against expression.
40      result is the value returned, if expression is equal to search.
41      default is optional. If no matches are found, the decode will return default. If default is omitted, then the decode statement will return null (if no matches are found).
42      For Example:
43      You could use the decode function in an SQL statement as follows:
44      SELECT supplier_name,
45      decode (supplier_id, 100, 'IBM',
46      10001, 'Microsoft', 10002, 'Hewlett Packard', 'Gateway') result FROM suppliers;
47   */

48
49      private int resultDataType = -1;
50
51
52      public Object JavaDoc run(Object JavaDoc object) throws DException{
53        if (resultDataType == -1) {
54                resultDataType = getAppropriateDatatype(object);
55         }
56        FieldBase expression = (FieldBase)_valueexpression5.run(object);
57        Object JavaDoc[] res = (Object JavaDoc[])_decodesearchrule3.run(object);
58        FieldBase search = (FieldBase)res[0];
59        FieldBase result = (FieldBase)res[1];
60        if (expression.isNull()) {
61          if (_OptScomma94843605valueexpression1 != null) {
62            return (FieldBase) _OptScomma94843605valueexpression1.run(object);
63          }
64          else
65            return FieldUtility.NULLFIELDBASE;
66          }
67         FieldBase resultToReturn = (FieldBase) getObject(expression,search,result,object);
68         Object JavaDoc ob =resultToReturn.getObject();
69         if(ob==null){
70         return FieldUtility.NULLFIELDBASE;
71         }
72         return getResult(ob,resultDataType);
73       }
74
75    protected Object JavaDoc getResult(Object JavaDoc object, int type ) throws DException {
76      switch (type) {
77        case BYTE:
78        case TINYINT:
79          return new FieldLiteral(new Byte JavaDoc("" + object), BYTE);
80        case SHORT:
81        case SMALLINT:
82          return new FieldLiteral(new Short JavaDoc("" + object), SHORT);
83        case INTEGER:
84        case INT:
85          return new FieldLiteral(new Integer JavaDoc("" + object), INTEGER);
86        case LONG:
87        case BIGINT:
88          return new FieldLiteral(new Long JavaDoc("" + object), LONG);
89        case REAL:
90          return new FieldLiteral(new Float JavaDoc("" + object), FLOAT);
91        case DOUBLE:
92        case FLOAT:
93        case DOUBLEPRECISION:
94          return new FieldLiteral(new Double JavaDoc("" + object), DOUBLE);
95        case BIGDECIMAL:
96        case DEC:
97        case DECIMAL:
98        case NUMERIC:
99          return new FieldLiteral(new BigDecimal("" + object), BIGDECIMAL);
100        case CHARACTER:
101        case VARCHAR:
102        case CHAR:
103        case CHARACTERVARYING:
104          return new FieldStringLiteral(object.toString(), CHARACTER);
105        case DATE:
106          return new FieldLiteral(Date.valueOf(object.toString()), DATE);
107        case TIME:
108          return new FieldLiteral(Time.valueOf(object.toString()), TIME);
109        case TIMESTAMP:
110          return new FieldLiteral(Timestamp.valueOf(object.toString()), TIMESTAMP);
111        default:
112          throw new DException("DSE514", new Object JavaDoc[] {StaticClass.getDataTypeName(type)});
113
114      }
115    }
116
117
118
119    public Object JavaDoc getObject(FieldBase expression, FieldBase search1,
120                            FieldBase result1,Object JavaDoc object) throws DException {
121     int expDataType=-1,searchType=-1;
122     expDataType=getDataTypeForByte(_valueexpression5.getByteComparison(object));
123     searchType =getDataTypeForByte(_decodesearchrule3._valueexpression2.getByteComparison(object));
124      checkDatatype(expDataType, searchType);
125      if (GetByteComparator.objectComparator.compare(expression,search1)==0) {
126        return result1;
127      }
128       else if (_OptRepScomma94843605decodesearchrule2 != null) {
129           int len = _OptRepScomma94843605decodesearchrule2.length;
130           FieldBase search = null, result = null;
131           for (int i = 0; i < len; i++) {
132            searchType = getDataTypeForByte(_OptRepScomma94843605decodesearchrule2[i]._valueexpression2.getByteComparison(object));
133            checkDatatype(expDataType, searchType);
134            Object JavaDoc[] res1 = (Object JavaDoc[]) _OptRepScomma94843605decodesearchrule2[i].run(object);
135            search = (FieldBase) res1[0];
136            result = (FieldBase) res1[1];
137            if (GetByteComparator.objectComparator.compare(expression,search)==0) {
138                 return result;
139            }
140           }
141       }
142
143       if(_OptScomma94843605valueexpression1!=null) {
144         return (FieldBase)_OptScomma94843605valueexpression1.run(object);
145       }
146
147       return FieldUtility.NULLFIELDBASE;
148     }
149
150   private void checkDatatype(int expDataType, int searchType) throws DException{
151     try {
152      Check.checkForDatatype(expDataType, searchType);
153     }
154      catch (DException ex) {
155        if (ex.getDseCode().equalsIgnoreCase("DSE514") ||
156           ex.getDseCode().equalsIgnoreCase("DSE6001")) {
157           throw new DException("DSE8100", new Object JavaDoc[] {StaticClass.getDataTypeName(expDataType),
158            StaticClass.getDataTypeName(searchType)});
159        }
160         throw ex;
161     }
162   }
163
164
165       private boolean checkForVariableColumn() throws DException {
166          for (int i = 0; i < columnDetails.length; ++i) {
167             if (columnDetails[i].getColumn().equals("?")) {
168                return true;
169             }
170          }
171          return false;
172       }
173
174
175       private String JavaDoc getNameOfColumn(ColumnDetails[] columnDetails) throws DException {
176          String JavaDoc nameOfColumn = "";
177          for (int i = 0; i < columnDetails.length; ++i) {
178             nameOfColumn += columnDetails[i].getColumn();
179          }
180          return nameOfColumn;
181       }
182
183       private void syntaxCheckingForColumn(ColumnDetails[] columnDetails) throws DException {
184          if (columnDetails.length > 1) {
185             int i = 0;
186             for (; i < columnDetails.length; ++i) {
187                if (columnDetails[i].getType() == CONSTANT) {
188                   break;
189                }
190             }
191             if (i == columnDetails.length) {
192                throw new DException("DSE526", null);
193             }
194          }
195       }
196
197       private ColumnDetails[] mergeColumnDetails(ColumnDetails[] columnDetails1, ColumnDetails[] columnDetails2) throws DException {
198            ColumnDetails[] objectTarget = new ColumnDetails[columnDetails1.length + columnDetails2.length];
199            int i = 0;
200            for (; i < columnDetails1.length; ++i) {
201               objectTarget[i] = columnDetails1[i];
202            }
203            for (int j = 0; j < columnDetails2.length; ++i, ++j) {
204               objectTarget[i] = columnDetails2[j];
205            }
206            return objectTarget;
207         }
208
209
210      public String JavaDoc toString() {
211     StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
212     sb.append(" ");
213     sb.append(_SNONRESERVEDWORD1364442557);
214     sb.append(" ");
215     sb.append(_Sleftparen6538802416);
216     sb.append(" ");
217     sb.append(_valueexpression5);
218     sb.append(" ");
219     sb.append(_Scomma948436054);
220     sb.append(" ");
221     sb.append(_decodesearchrule3);
222     sb.append(" ");
223     if(_OptRepScomma94843605decodesearchrule2 != null ) {
224         for(int i = 0 ; i < _OptRepScomma94843605decodesearchrule2.length ; i++ )
225             sb.append(",").append(_OptRepScomma94843605decodesearchrule2[i]);
226     }
227     sb.append(" ");
228     if(_OptScomma94843605valueexpression1 != null ) {
229         sb.append(",");
230     sb.append(_OptScomma94843605valueexpression1);
231     }
232     sb.append(" ");
233     sb.append(_Srightparen_18748595140);
234     return sb.toString();
235        }
236
237       /**
238        * getParameterInfo
239        *
240        * @return ParameterInfo[]
241        */

242       public ParameterInfo[] getParameterInfo() throws DException{
243     /* ParameterInfo[] parameterInfo1 = _valueexpression5.getParameterInfo();
244          ParameterInfo[] parameterInfo2 = _decodesearchrule3._valueexpression0.getParameterInfo();
245          ParameterInfo[] parameterInfo3 = _decodesearchrule3._valueexpression2.getParameterInfo();
246          java.util.ArrayList list =new java.util.ArrayList();
247          ParameterInfo[] parameterInfo4 = new ParameterInfo[parameterInfo1.length + parameterInfo2.length+parameterInfo3.length];
248          int index = 0;
249          for (; index < parameterInfo1.length; ++index) {
250             parameterInfo4[index] = parameterInfo1[index];
251          }
252          for (int i = 0; i < parameterInfo2.length; ++i, ++index) {
253             parameterInfo4[index] = parameterInfo2[i];
254          }
255          for (int i = 0; i < parameterInfo3.length; ++i, ++index) {
256          parameterInfo4[index] = parameterInfo3[i];
257          }
258          list.addAll(Arrays.asList(parameterInfo4));
259          if(_OptRepScomma94843605decodesearchrule2!=null) {
260            int len =_OptRepScomma94843605decodesearchrule2.length;
261            for (int i = 0; i < len; i++) {
262            list.addAll(Arrays.asList(_OptRepScomma94843605decodesearchrule2[i]._valueexpression0.getParameterInfo()));
263            list.addAll(Arrays.asList(_OptRepScomma94843605decodesearchrule2[i]._valueexpression2.getParameterInfo()));
264            }
265          }
266          ParameterInfo[] param5=null;
267          if(_OptScomma94843605valueexpression1!=null){
268          param5 = _OptScomma94843605valueexpression1.getParameterInfo();
269          }
270         list.addAll(Arrays.asList(param5));
271         ParameterInfo[] param6 = new ParameterInfo[list.size()];
272         list.toArray(param6);
273          return param6; */

274        return new ParameterInfo[0];
275       }
276
277
278       /**
279        * checkSemantic
280        * @param ss _ServerSession
281        * @return _Reference[]
282        */

283       public _Reference[] checkSemantic(_ServerSession parent) throws DException {
284         _Reference[] ref = super.checkSemantic(parent);
285         getAppropriateDatatype(parent);
286         return ref;
287       }
288
289
290       /**
291        * getByteComparison
292        * @param object Object
293        * @return ByteComparison
294        */

295
296       public ByteComparison getByteComparison(Object JavaDoc object) throws DException{
297       int dt = resultDataType == -1 ? getAppropriateDatatype(object) : resultDataType;
298       ByteComparison byteComparison = new ByteComparison(false, new int[] {dt});
299       byteComparison.setSize(getColumnSize(object));
300       return byteComparison;
301       }
302
303       /**
304        * getChildColumnDetails
305        * @return ColumnDetails[]
306        */

307
308       public ColumnDetails[] getChildColumnDetails() throws DException{
309         ArrayList list =new ArrayList();
310         list.addAll(Arrays.asList( _valueexpression5.getColumnDetails()));
311         list.addAll(Arrays.asList( _decodesearchrule3._valueexpression2.getColumnDetails()));
312         list.addAll(Arrays.asList( _decodesearchrule3._valueexpression0.getColumnDetails()));
313         if(_OptRepScomma94843605decodesearchrule2!=null) {
314           for (int i = 0; i < _OptRepScomma94843605decodesearchrule2.length; i++) {
315             list.addAll(Arrays.asList( _OptRepScomma94843605decodesearchrule2[i]._valueexpression2.getColumnDetails()));
316             list.addAll(Arrays.asList( _OptRepScomma94843605decodesearchrule2[i]._valueexpression0.getColumnDetails()));
317           }
318         }
319        if(_OptScomma94843605valueexpression1!=null) {
320          list.addAll(Arrays.asList( _OptScomma94843605valueexpression1.getColumnDetails()));
321        }
322        ColumnDetails[] cd =new ColumnDetails[list.size()];
323        list.toArray(cd);
324        return cd;
325       }
326
327       /**
328        * clone
329        * @return Object
330        */

331       public Object JavaDoc clone() throws CloneNotSupportedException JavaDoc {
332        decodefunction tempClass = new decodefunction();
333      tempClass._Srightparen_18748595140 = (Srightparen_1874859514) _Srightparen_18748595140.clone();
334     if(_OptScomma94843605valueexpression1 != null ) {
335     tempClass._OptScomma94843605valueexpression1 = (valueexpression) _OptScomma94843605valueexpression1.clone();
336     }
337      if(_OptRepScomma94843605decodesearchrule2 != null ) {
338         for(int i = 0 ; i < _OptRepScomma94843605decodesearchrule2.length ; i++ )
339         tempClass._OptRepScomma94843605decodesearchrule2 =(decodesearchrule[])_OptRepScomma94843605decodesearchrule2[i].clone();
340       }
341      tempClass._decodesearchrule3 = (decodesearchrule) _decodesearchrule3.clone();
342      tempClass._valueexpression5 =(valueexpression)_valueexpression5.clone();
343      tempClass._Sleftparen6538802416 = (Sleftparen653880241) _Sleftparen6538802416.clone();
344      tempClass._SNONRESERVEDWORD1364442557 = (SNONRESERVEDWORD136444255) _SNONRESERVEDWORD1364442557.clone();
345      return tempClass;
346       }
347
348
349       /**
350        * Return the appropriate data type of a function
351        * @param object Object
352        * @throws DException
353        * @return int
354        */

355       private int getAppropriateDatatype(Object JavaDoc object) throws DException {
356          resultDataType = getDataTypeForByte(_decodesearchrule3._valueexpression0.getByteComparison(object));
357          if (_OptRepScomma94843605decodesearchrule2 != null) {
358            int len = _OptRepScomma94843605decodesearchrule2.length;
359           int[] resultType = new int[len];
360            for (int i = 0; i < len; i++) {
361              resultType[i] = getDataTypeForByte(
362                  _OptRepScomma94843605decodesearchrule2[i]._valueexpression0.
363                  getByteComparison(object));
364            }
365            for (int i = 0; i < resultType.length; i++) {
366              try {
367                Check.checkForDatatype(resultDataType, resultType[i]);
368                resultDataType = resultDataType > resultType[i] ? resultDataType :
369                    resultType[i];
370              }
371              catch (DException ex) {
372                if (ex.getDseCode().equalsIgnoreCase("DSE514") ||
373                    ex.getDseCode().equalsIgnoreCase("DSE6001")) {
374                  throw new DException("DSE8100",
375                                       new Object JavaDoc[] {StaticClass.
376                                       getDataTypeName(resultDataType),
377                                       StaticClass.getDataTypeName(resultType[i])});
378                }
379                throw ex;
380              }
381            }
382          }
383          int defaultExpressionDataType = _OptScomma94843605valueexpression1 == null ? -1 :
384              getDataTypeForByte(_OptScomma94843605valueexpression1.getByteComparison(object));
385
386          resultDataType = resultDataType > defaultExpressionDataType ? resultDataType : defaultExpressionDataType;
387          return resultDataType ;
388       }
389
390       /**
391        * getChilds
392        *
393        * @return AbstractRowValueExpression[]
394        */

395       public AbstractRowValueExpression[] getChilds() {
396         ArrayList list = new ArrayList();
397         if (_OptRepScomma94843605decodesearchrule2 != null) {
398           if (_OptScomma94843605valueexpression1 != null) {
399             list.add( (AbstractRowValueExpression) (_valueexpression5));
400             list.add( (AbstractRowValueExpression) (_decodesearchrule3.
401                                                     _valueexpression2));
402             list.add( (AbstractRowValueExpression) (_decodesearchrule3.
403                                                     _valueexpression0));
404             for (int i = 0; i < _OptRepScomma94843605decodesearchrule2.length; i++) {
405                   list.add( (AbstractRowValueExpression)( _OptRepScomma94843605decodesearchrule2[i]._valueexpression2));
406                   list.add( (AbstractRowValueExpression)( _OptRepScomma94843605decodesearchrule2[i]._valueexpression0));
407             }
408             list.add( (AbstractRowValueExpression)
409                      _OptScomma94843605valueexpression1);
410           }
411           else {
412             list.add( (AbstractRowValueExpression) (_valueexpression5));
413             list.add( (AbstractRowValueExpression) (_decodesearchrule3.
414                                                     _valueexpression2));
415             list.add( (AbstractRowValueExpression) (_decodesearchrule3.
416                                                     _valueexpression0));
417             for (int i = 0; i < _OptRepScomma94843605decodesearchrule2.length; i++) {
418                 list.add( (AbstractRowValueExpression)( _OptRepScomma94843605decodesearchrule2[i]._valueexpression2));
419                 list.add( (AbstractRowValueExpression)( _OptRepScomma94843605decodesearchrule2[i]._valueexpression0));
420               }
421           }
422         }
423         else {
424           if (_OptScomma94843605valueexpression1 != null) {
425             list.add( (AbstractRowValueExpression) (_valueexpression5));
426             list.add( (AbstractRowValueExpression) (_decodesearchrule3.
427                                                     _valueexpression2));
428             list.add( (AbstractRowValueExpression) (_decodesearchrule3.
429                                                     _valueexpression0));
430             list.add( (AbstractRowValueExpression)
431                      _OptScomma94843605valueexpression1);
432
433           }
434           else {
435             list.add( (AbstractRowValueExpression) (_valueexpression5));
436             list.add( (AbstractRowValueExpression) (_decodesearchrule3.
437                                                     _valueexpression2));
438             list.add( (AbstractRowValueExpression) (_decodesearchrule3.
439                                                     _valueexpression0));
440           }
441         }
442         AbstractRowValueExpression[] child = new AbstractRowValueExpression[list.size()];
443         list.toArray(child);
444         return child;
445     }
446
447     int getColumnSize(Object JavaDoc object) throws DException {
448       ColumnDetails[] columnDetails = getChildColumnDetails();
449       int type =columnDetails[2].getType();
450       if(type!=TypeConstants.CONSTANT) {
451         int datatype = columnDetails[2].getDatatype();
452          switch (datatype) {
453            case BYTE:
454            case TINYINT:
455            case INTEGER:
456            case INT:
457              return INTSIZE;
458            case REAL:
459              return FLOATSIZE;
460            case DOUBLE:
461            case FLOAT:
462            case DOUBLEPRECISION:
463             return DOUBLESIZE;
464            case LONG:
465            case BIGINT:
466              return LONGSIZE;
467            case SHORT:
468            case SMALLINT:
469              return SHORTSIZE;
470            case BIGDECIMAL:
471            case DEC:
472            case DECIMAL:
473            case NUMERIC:
474              if (columnDetails[2].getSize() != -5) {
475                return columnDetails[2].getSize();
476              }
477              break;
478            case DATE :
479             return DATESIZE;
480            case TIME :
481              return TIMESIZE;
482            case TIMESTAMP :
483              return TIMESTAMPSIZE;
484              default :
485              if (columnDetails[0].getSize() != -5) {
486                return columnDetails[0].getSize();
487              }
488          }
489        } else if(columnDetails[2].getQuestion()) {
490            return 255;
491        } else {
492          Object JavaDoc[] res = (Object JavaDoc[])_decodesearchrule3.run(object);
493          FieldBase field = (FieldBase)res[1];
494          field.setDatatype(columnDetails[2].getDatatype());
495          return field.getLength();
496        }
497        return -1;
498        }
499
500
501   }
502
Popular Tags