KickJava   Java API By Example, From Geeks To Geeks.

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


1 package com.daffodilwoods.daffodildb.server.sql99.expression.expressionprimary;
2
3 import com.daffodilwoods.daffodildb.server.sql99.common.*;
4 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*;
5 import com.daffodilwoods.daffodildb.server.sql99.dql.listenerevents.*;
6 import com.daffodilwoods.daffodildb.server.sql99.expression.rowvalueexpression.*;
7 import com.daffodilwoods.daffodildb.utils.*;
8 import com.daffodilwoods.daffodildb.utils.field.*;
9 import com.daffodilwoods.database.resource.*;
10 import java.util.HashMap JavaDoc;
11 import com.daffodilwoods.database.utility.P;
12 import com.daffodilwoods.daffodildb.server.sql99.utils._Reference;
13
14 public class rowsubquery extends AbstractRowValueExpression implements com.daffodilwoods.daffodildb.utils.parser.StatementExecuter, rowvalueexpression, rowvalueconstructorwithoutboolean {
15
16    public subquery _rowsubquery0;
17    private int cardinality;
18    private boolean underlyingRef;
19
20    private HashMap JavaDoc map = new HashMap JavaDoc(5);
21
22    public Object JavaDoc run(Object JavaDoc object) throws com.daffodilwoods.database.resource.DException {
23
24       Object JavaDoc obj[] = (Object JavaDoc[]) map.get(object);
25       _Iterator iterator = obj == null ? null : (_Iterator) obj[0];
26       if (iterator == null) {
27             iterator = (_Iterator) _rowsubquery0.run(object);
28          underlyingRef = checkForValidReferences(_rowsubquery0.getUnderlyingReferences());
29          /* by Kaushik to solve bug no 11287 start */
30          boolean first = iterator.first();
31          if (first) {
32             if (iterator.next()) {
33                throw new DException("DSE325", null);
34             }
35             iterator.previous();
36          }
37          obj = new Object JavaDoc[] {iterator, new Boolean JavaDoc(first)};
38          /* Done by Kaushik to overcome possible OutOfMemory on 1/07/2004 dst */
39          if (map.size() >= 25) {
40             map.clear();
41          }
42          /* dend*/
43          map.put(object, obj);
44          /* End */
45       }
46
47
48       boolean first = underlyingRef ? iterator.first() : obj == null ? false : ( (Boolean JavaDoc) obj[1]).booleanValue();
49
50       if (first) {
51          Object JavaDoc row = ( (_SelectIterator) iterator).getSelectColumnValues();
52
53          /*dst*/
54          if (underlyingRef && iterator.next()) {
55             throw new DException("DSE325", null);
56          }
57          /*dend*/
58
59          if ( ( (Object JavaDoc[]) row).length == 1)
60             return ( (Object JavaDoc[]) row)[0];
61          else
62
63             return row;
64
65       }
66
67       ColumnDetails[] selectedColumnDetails = _rowsubquery0.getSelectedColumnDetails();
68       int length = selectedColumnDetails.length;
69       if (length == 1) {
70          FieldBase fb = FieldUtility.NULLFIELDBASE;
71          fb.setDatatype(selectedColumnDetails[0].getDatatype());
72          return fb;
73       } else {
74          FieldBase[] fieldBase = new FieldBase[length];
75          for (int i = 0; i < length; i++) {
76             fieldBase[i] = FieldUtility.NULLFIELDBASE;
77             fieldBase[i].setDatatype(selectedColumnDetails[i].getDatatype());
78          }
79          return fieldBase;
80
81       }
82    }
83
84
85    /** @todo ASK FROM GAURAV */
86    public int getCardinality() throws DException {
87       return _rowsubquery0._queryexpression0.getSelectedColumns().length;
88    }
89
90    public ParameterInfo[] getParameterInfo() throws DException {
91       return _rowsubquery0.getParameterInfo();
92    }
93
94    public AbstractRowValueExpression[] getChilds() {
95       AbstractRowValueExpression[] childs = new AbstractRowValueExpression[] { (AbstractRowValueExpression) (_rowsubquery0)};
96       return childs;
97
98    }
99
100    public String JavaDoc toString() {
101       StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
102       sb.append(" ");
103       sb.append(_rowsubquery0);
104       return sb.toString();
105    }
106
107    public Object JavaDoc clone() throws CloneNotSupportedException JavaDoc {
108       rowsubquery tempClass = new rowsubquery();
109       tempClass._rowsubquery0 = (subquery) _rowsubquery0.clone();
110       return tempClass;
111    }
112
113
114    private boolean checkForValidReferences(_Reference[] ref) throws DException {
115       if (ref == null)
116          return false;
117       for (int i = 0; i < ref.length; i++) {
118          if (ref[i].getReferenceType() == SimpleConstants.COLUMNDETAIL || ref[i].getReferenceType() == SimpleConstants.VARIABLECOLUMN)
119             return true;
120       }
121       return false;
122    }
123 }
124
Popular Tags