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 27 public class IntersectDistinctIterator extends IntersectAllIterator { 28 29 52 public IntersectDistinctIterator(_Iterator leftIterator, _Iterator rightIterator,_Reference[] leftColumnReferences,_Reference[] rightColumnReferences,SuperComparator comparator,_Reference []orderLeftCD0,_Reference []orderRightCD0) throws DException{ 53 super(leftIterator,rightIterator,leftColumnReferences,rightColumnReferences,comparator,orderLeftCD0,orderRightCD0); 54 } 55 56 72 public boolean first() throws DException { 73 boolean b1 = leftIterator.first(); 74 boolean b2 = rightIterator.first(); 75 if(b1 && b2) 76 return (state = alignForward() ? VALIDSTATE : AFTERLAST ) != AFTERLAST; 77 return (state = AFTERLAST ) != AFTERLAST ; 78 } 79 80 98 public boolean last() throws DException { 99 if (leftIterator.last() && rightIterator.last()) { 100 return (state = alignBackward() ? VALIDSTATE : BEFOREFIRST) != BEFOREFIRST; 101 } 102 return (state = BEFOREFIRST) != BEFOREFIRST; 103 } 104 105 133 public boolean next() throws DException { 134 if (state == INVALIDSTATE) { 135 throw new DException("DSE4116", null); 136 } 137 if (state == BEFOREFIRST) { 138 return first(); 139 } 140 if (state == AFTERLAST) { 141 return false; 142 } 143 Object left = leftIterator.getColumnValues(orderLeftCD); 144 if (!moveForward(leftIterator, rightIterator.getColumnValues(orderRightCD), orderLeftCD, true) 145 || !moveForward(rightIterator, left, orderRightCD, false)) { 146 state = AFTERLAST; 147 return false; 148 } 149 return (state = alignForward() ? state : AFTERLAST) != AFTERLAST; 150 } 151 152 179 public boolean previous() throws DException { 180 if (state == INVALIDSTATE) { 181 throw new DException("DSE4117", null); 182 } 183 if (state == AFTERLAST) { 184 return last(); 185 } 186 if (state == BEFOREFIRST) { 187 return false; 188 } 189 Object left = leftIterator.getColumnValues(orderLeftCD); 190 if (!moveBackward(leftIterator, rightIterator.getColumnValues(orderRightCD), orderLeftCD, true) 191 || !moveBackward(rightIterator, left, orderRightCD, false)) { 192 state = BEFOREFIRST; 193 return false; 194 } 195 return (state = alignBackward() ? state : BEFOREFIRST) != BEFOREFIRST; 196 } 197 198 199 211 boolean moveForward(_Iterator iterator,Object value,_Reference[] references,boolean leftRight) throws DException{ 212 while(iterator.next()){ 213 if(leftRight){ 214 if(compare(iterator.getColumnValues(references),value) != 0){ 215 return true; 216 } 217 } else { 218 if (compare(value, iterator.getColumnValues(references)) != 0) { 219 return true; 220 } 221 } 222 } 223 return false; 224 } 225 226 238 boolean moveBackward(_Iterator iterator, Object value, _Reference[] references, boolean leftRight) throws DException { 239 while (iterator.previous()) { 240 if (leftRight) { 241 if (compare(iterator.getColumnValues(references), value) != 0) { 242 return true; 243 } 244 } else { 245 if (compare(value, iterator.getColumnValues(references)) != 0) { 246 return true; 247 } 248 } 249 } 250 return false; 251 } 252 253 258 public _ExecutionPlan getExecutionPlan() throws DException{ 259 _ExecutionPlan cplans[] = new _ExecutionPlan[2]; 260 cplans[0] = leftIterator.getExecutionPlan(); 261 cplans[1] = rightIterator.getExecutionPlan(); 262 return new ExecutionPlan("IntersectDistinctIterator",cplans,null,null,null); 263 } 264 265 270 public ExecutionPlanForBrowser getExecutionPlanForBrowser() throws DException { 271 ExecutionPlanForBrowser cplans[] = new ExecutionPlanForBrowser[2]; 272 cplans[0] = leftIterator.getExecutionPlanForBrowser(); 273 cplans[1] = rightIterator.getExecutionPlanForBrowser(); 274 return new ExecutionPlanForBrowser("Intersect Distinct","Intersect Distinct Iterator",cplans,null,null,null); 275 } 276 277 282 283 public _KeyColumnInformation[] getKeyColumnInformations() throws DException { 284 return GeneralPurposeStaticClass.getKeyColumnInformations(leftIterator,rightIterator); 285 } 286 287 public Object [] getUniqueColumnReference() throws DException { 288 return GeneralPurposeStaticClass.getUniqueColumnReference(leftIterator,rightIterator); 289 } 290 291 public String toString() { 292 return "IntersectDistinctIterator [" + leftIterator + "] [" + rightIterator + "]"; 293 } 294 } 295 | Popular Tags |