| 1 package com.daffodilwoods.daffodildb.server.sql99.dql.iterator.set; 2 3 import com.daffodilwoods.daffodildb.client.*; 4 import com.daffodilwoods.daffodildb.server.sql99.common.*; 5 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 6 import com.daffodilwoods.daffodildb.server.sql99.utils.*; 7 import com.daffodilwoods.daffodildb.utils.comparator.*; 8 import com.daffodilwoods.database.resource.*; 9 10 22 public class ExceptDistinctIterator extends ExceptAllIterator { 23 24 51 public ExceptDistinctIterator(_Iterator leftIterator, _Iterator rightIterator, _Reference[] leftColumnReferences, _Reference[] rightColumnReferences, SuperComparator comparator0, _Reference[] orderLeftCD0, _Reference[] orderRightCD0, SuperComparator leftComparator0, SuperComparator rightComparator0) throws DException { 52 super(leftIterator, rightIterator, leftColumnReferences, rightColumnReferences, comparator0, orderLeftCD0, orderRightCD0, leftComparator0, rightComparator0); 53 checkInSecondIterator = true; 54 state = INVALIDSTATE; 55 } 56 57 92 public boolean first() throws DException { 93 checkInSecondIterator = true; 94 if (!leftIterator.first()) { 95 state = AFTERLAST; 96 return false; 97 } 98 if (!rightIterator.first()) { 99 checkInSecondIterator = false; 100 state = VALIDSTATE; 101 return true; 102 } 103 return (state = alignNext() ? VALIDSTATE : AFTERLAST) != AFTERLAST; 104 } 105 106 142 public boolean next() throws DException { 143 if (state == INVALIDSTATE) { 144 throw new DException("DSE4116", null); 145 } 146 if (state == BEFOREFIRST) { 147 return first(); 148 } 149 if (!moveForwardDistinct(leftIterator, leftIterator.getColumnValues(orderLeftCD), orderLeftCD, true)) { 150 state = AFTERLAST; 151 return false; 152 } 153 return (state = alignNext() ? state : AFTERLAST) != AFTERLAST; 154 } 155 156 192 public boolean previous() throws DException { 193 if (state == INVALIDSTATE) { 194 throw new DException("DSE4117", null); 195 } 196 if (state == AFTERLAST) { 197 return last(); 198 } 199 if (!moveBackwardDistinct(leftIterator, leftIterator.getColumnValues(orderLeftCD), orderLeftCD, true)) { 200 state = BEFOREFIRST; 201 return false; 202 } 203 return (state = alignPrevious() ? state : BEFOREFIRST) != BEFOREFIRST; 204 } 205 206 243 public boolean last() throws DException { 244 checkInSecondIterator = true; 245 if (!leftIterator.last()) { 246 state = BEFOREFIRST; 247 return false; 248 } 249 if (!rightIterator.last()) { 250 checkInSecondIterator = false; 251 state = VALIDSTATE; 252 return true; 253 } 254 return (state = alignPrevious() ? VALIDSTATE : BEFOREFIRST) != BEFOREFIRST; 255 } 256 257 262 public _ExecutionPlan getExecutionPlan() throws DException { 263 _ExecutionPlan cplans[] = new _ExecutionPlan[2]; 264 cplans[0] = leftIterator.getExecutionPlan(); 265 cplans[1] = rightIterator.getExecutionPlan(); 266 return new ExecutionPlan("ExceptDistinctIterator", cplans, null, null, null); 267 } 268 269 274 public ExecutionPlanForBrowser getExecutionPlanForBrowser() throws DException { 275 ExecutionPlanForBrowser cplans[] = new ExecutionPlanForBrowser[2]; 276 cplans[0] = leftIterator.getExecutionPlanForBrowser(); 277 cplans[1] = rightIterator.getExecutionPlanForBrowser(); 278 return new ExecutionPlanForBrowser("Except Distinct", "ExceptDistinctIterator", cplans, null, null, null); 279 } 280 281 303 boolean alignNext() throws DException { 304 if (!checkInSecondIterator && !rightIterator.next()) { 305 return true; 306 } while (true) { 307 Object leftObjectValues = leftIterator.getColumnValues(orderLeftCD); 308 Object rightObjectValues = rightIterator.getColumnValues(orderRightCD); 309 int cmp = compare(leftObjectValues, rightObjectValues); 310 if (cmp == 0) { 311 if (!moveForwardDistinct(leftIterator, leftObjectValues, orderLeftCD, true)) { 312 return false; 313 } 314 if (!moveForwardDistinct(rightIterator, rightObjectValues, orderRightCD, false)) { 315 checkInSecondIterator = false; 316 return true; 317 } 318 } else if (cmp > 0) { 319 if (!moveForwardDistinct(rightIterator, rightObjectValues, orderRightCD, false)) { 320 checkInSecondIterator = false; 321 return true; 322 } 323 } else { 324 checkInSecondIterator = true; 325 return true; 326 } 327 } 328 } 329 330 352 boolean alignPrevious() throws DException { 353 if (!checkInSecondIterator && !rightIterator.previous()) { 354 return true; 355 } while (true) { 356 Object leftObjectValues = leftIterator.getColumnValues(orderLeftCD); 357 Object rightObjectValues = rightIterator.getColumnValues(orderRightCD); 358 int cmp = compare(leftObjectValues, rightObjectValues); 359 if (cmp == 0) { 360 if (!moveBackwardDistinct(leftIterator, leftObjectValues, orderLeftCD, true)) { 361 return false; 362 } 363 if (!moveBackwardDistinct(rightIterator, rightObjectValues, orderRightCD, true)) { 364 checkInSecondIterator = false; 365 return true; 366 } 367 } else if (cmp < 0) { 368 if (!moveBackwardDistinct(rightIterator, rightObjectValues, orderRightCD, false)) { 369 checkInSecondIterator = false; 370 return true; 371 } 372 } else { 373 checkInSecondIterator = true; 374 return true; 375 } 376 } 377 } 378 379 380 public String toString() { 381 return "ExceptDistinctIterator [" + leftIterator + "] [" + rightIterator + "]"; 382 } 383 } 384 | Popular Tags |