1 package com.daffodilwoods.daffodildb.server.sql99.dql.iterator.table; 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.utils.*; 6 import com.daffodilwoods.daffodildb.utils.*; 7 import com.daffodilwoods.daffodildb.utils.field.*; 8 import com.daffodilwoods.database.resource.*; 9 10 24 25 public class MaxMinIterator extends BaseSingleIterator implements _Iterator, SimpleConstants { 26 27 private _Reference childReference; 28 31 private int maxMin; 32 private ColumnDetails[] aggregateColumns; 33 34 37 private int status; 38 43 private boolean isHavingData = true; 44 45 public MaxMinIterator(_Iterator iterator0, ColumnDetails[] aggregateColumns0) throws DException { 46 super(iterator0); 47 String functionType = aggregateColumns0[0].getFunctionType(); 48 if (functionType.equalsIgnoreCase("Max")) { 49 maxMin = MAX; 50 } else if (functionType.equalsIgnoreCase("Min")) { 51 maxMin = MIN; 52 } else { 53 throw new DException("DSE0", new Object [] {"Invalid Type Set For Aggregate"}); 54 } 55 childReference = aggregateColumns0[0].getChildColumnDetails()[0]; 56 aggregateColumns = aggregateColumns0; 57 } 58 59 85 91 public boolean first() throws DException { 92 if (maxMin == MAX) { 93 checkPrevious(); 94 } else { 95 checkNext(); 96 } 97 return true; 98 } 99 100 106 public boolean last() throws DException { 107 if (maxMin == MAX) { 108 checkPrevious(); 109 } else { 110 checkNext(); 111 } 112 return true; 113 } 114 115 123 public boolean next() throws DException { 124 if (status == BEFOREFIRST) { 125 return first(); 126 } 127 status = AFTERLAST; 128 return false; 129 } 130 131 139 public boolean previous() throws DException { 140 if (status == AFTERLAST) { 141 return last(); 142 } 143 status = BEFOREFIRST; 144 return false; 145 } 146 147 156 private void checkPrevious() throws DException { 157 if (iterator.last()) { 158 FieldBase fb = (FieldBase) iterator.getColumnValues(childReference); 159 while (fb.isNull()) { 160 if (iterator.previous()) { 161 fb = (FieldBase) iterator.getColumnValues(childReference); 162 } else { 163 iterator.next(); 164 return; 165 } 166 } 167 status = VALIDSTATE; 168 } else { 169 isHavingData = false; 170 } 171 } 172 173 182 private void checkNext() throws DException { 183 if (iterator.first()) { 184 FieldBase fb = (FieldBase) iterator.getColumnValues(childReference); 185 while (fb.isNull()) { 186 if (iterator.next()) { 187 fb = (FieldBase) iterator.getColumnValues(childReference); 188 } else { 189 iterator.previous(); 190 return; 191 } 192 } 193 status = VALIDSTATE; 194 } else { 195 isHavingData = false; 196 } 197 } 198 199 205 214 public Object getColumnValues(_Reference[] reference) throws DException { 215 Object [] values = new Object [reference.length]; 216 for (int i = 0; i < reference.length; i++) { 217 values[i] = getColumnValues(reference[i]); 218 } 219 return values; 220 } 221 222 233 public Object getColumnValues(_Reference reference) throws DException { 234 for (int i = 0; i < aggregateColumns.length; i++) { 235 if (aggregateColumns[i].getColumn().trim().equalsIgnoreCase(reference.getColumn().trim())) { 236 return isHavingData ? iterator.getColumnValues(childReference) : FieldUtility.NULLFIELDBASE; 237 } 238 } 239 return isHavingData ? iterator.getColumnValues(reference) : FieldUtility.NULLFIELDBASE; 240 } 241 242 250 public FieldBase field(_Reference reference) throws DException { 251 for (int i = 0; i < aggregateColumns.length; i++) { 252 if (aggregateColumns[i].getColumn().trim().equalsIgnoreCase(reference.getColumn().trim())) { 253 return isHavingData ? iterator.field(childReference) : FieldUtility.NULLFIELDBASE; 254 } 255 } 256 return isHavingData ? iterator.field(reference) : FieldUtility.NULLFIELDBASE; 257 } 258 259 267 public FieldBase[] fields(_Reference[] references) throws com.daffodilwoods.database.resource.DException { 268 FieldBase[] values = new FieldBase[references.length]; 269 for (int i = 0; i < references.length; i++) { 270 values[i] = field(references[i]); 271 } 272 return values; 273 } 274 275 276 public String toString() { 277 return "MaxMinIterator [" + iterator + "]"; 278 } 279 } 280 | Popular Tags |