| 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 ; 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 map = new HashMap (5); 21 22 public Object run(Object object) throws com.daffodilwoods.database.resource.DException { 23 24 Object obj[] = (Object []) 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 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 [] {iterator, new Boolean (first)}; 38 39 if (map.size() >= 25) { 40 map.clear(); 41 } 42 43 map.put(object, obj); 44 45 } 46 47 48 boolean first = underlyingRef ? iterator.first() : obj == null ? false : ( (Boolean ) obj[1]).booleanValue(); 49 50 if (first) { 51 Object row = ( (_SelectIterator) iterator).getSelectColumnValues(); 52 53 54 if (underlyingRef && iterator.next()) { 55 throw new DException("DSE325", null); 56 } 57 58 59 if ( ( (Object []) row).length == 1) 60 return ( (Object []) 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 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 toString() { 101 StringBuffer sb = new StringBuffer (); 102 sb.append(" "); 103 sb.append(_rowsubquery0); 104 return sb.toString(); 105 } 106 107 public Object clone() throws CloneNotSupportedException { 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 |