1 package com.daffodilwoods.daffodildb.server.sql99.dql.iterator.table; 2 3 import java.util.*; 4 5 import com.daffodilwoods.daffodildb.client.*; 6 import com.daffodilwoods.daffodildb.server.serversystem.*; 7 import com.daffodilwoods.daffodildb.server.sql99.common.*; 8 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 9 import com.daffodilwoods.daffodildb.server.sql99.dql.listenerevents.*; 10 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 11 import com.daffodilwoods.daffodildb.server.sql99.utils.*; 12 import com.daffodilwoods.daffodildb.utils.*; 13 import com.daffodilwoods.daffodildb.utils.field.*; 14 import com.daffodilwoods.database.resource.*; 15 import com.daffodilwoods.database.utility.P; 16 17 29 public class IndexedFullJoinIterator extends AbstractQualifiedJoinIterator implements _HasRecordIterator { 30 31 34 protected _Reference[] leftColumnReferences; 35 38 protected _Reference[] rightColumnReferences; 39 40 protected boolean movingForward; 41 44 private ConditionVariableValue conditionVariableValue; 45 46 private final static int LEFTNULL = 0; 47 private final static int RIGHTNULL = 1; 48 private final static int NONULL = 2; 49 private int status = -5; 50 51 62 public IndexedFullJoinIterator(_Iterator leftIterator0, _Iterator rightIterator0, booleanvalueexpression condition0, _KeyColumnInformation[] leftKeyColumnInformation0, _KeyColumnInformation[] rightKeyColumnInformation0, ColumnDetails[] hasRecordReferences0, _ServerSession session) throws DException { 63 super(leftIterator0, rightIterator0, leftKeyColumnInformation0, rightKeyColumnInformation0, hasRecordReferences0); 64 leftIterator = leftIterator0; 65 _VariableValues vValues = GeneralPurposeStaticClass.getNewVariableValues(condition0, getTableDetails(), session); 66 vValues.setIterator(this); 67 conditionVariableValue = new ConditionVariableValue(vValues, condition0); 68 } 69 70 85 public boolean first() throws DException { 86 movingForward = true; 87 return alignForward(leftIterator.first(), rightIterator.first()); 88 } 89 90 109 public boolean next() throws DException { 110 switch (state) { 111 case INVALIDSTATE: 112 throw new DException("DSE4116", null); 113 case BEFOREFIRST: 114 return first(); 115 case AFTERLAST: 116 return false; 117 default: { 118 if (status == NONULL) { 119 return alignForward(leftIterator.next(), rightIterator.next()); 120 } else if (status == LEFTNULL) { 121 return alignForward(true, rightIterator.next()); 122 } else { 123 return alignForward(leftIterator.next(), true); 124 } 125 } 126 } 127 } 128 129 144 public boolean last() throws DException { 145 movingForward = false; 146 return alignBackward(leftIterator.last(), rightIterator.last()); 147 } 148 149 168 public boolean previous() throws DException { 169 switch (state) { 170 case INVALIDSTATE: 171 throw new DException("DSE4117", null); 172 case BEFOREFIRST: 173 return false; 174 case AFTERLAST: 175 return last(); 176 default: { 177 if (status == NONULL) { 178 return alignBackward(leftIterator.previous(), rightIterator.previous()); 179 } else if (status == LEFTNULL) { 180 return alignBackward(true, rightIterator.previous()); 181 } else { 182 return alignBackward(leftIterator.previous(), true); 183 } 184 } 185 } 186 } 187 188 200 private boolean alignForward(boolean leftIteratorValid, boolean rightIteratorValid) throws DException { 201 int cmp = compare(); 202 if (leftIteratorValid && rightIteratorValid) { 203 status = cmp < 0 ? LEFTNULL : cmp > 0 ? RIGHTNULL : NONULL; 204 } else if (!rightIteratorValid) { 205 status = RIGHTNULL; 206 } else { 207 status = LEFTNULL; 208 } 209 return (state = !leftIteratorValid && !rightIteratorValid ? AFTERLAST : VALIDSTATE) != VALIDSTATE; 210 } 211 212 224 private boolean alignBackward(boolean leftIteratorValid, boolean rightIteratorValid) throws DException { 225 int cmp = compare(); 226 if (leftIteratorValid && rightIteratorValid) { 227 status = cmp < 0 ? LEFTNULL : cmp > 0 ? RIGHTNULL : NONULL; 228 } else if (!rightIteratorValid) { 229 status = RIGHTNULL; 230 } else { 231 status = LEFTNULL; 232 } 233 return (state = !leftIteratorValid && !rightIteratorValid ? BEFOREFIRST : VALIDSTATE) != VALIDSTATE; 234 } 235 236 246 247 253 protected int compare() throws DException { 254 return conditionVariableValue.run().hashCode(); 255 } 256 265 public Object getColumnValues(_Reference[] columnReferences) throws DException { 266 int len = columnReferences.length; 267 Object [] values = new Object [len]; 268 for (int i = 0; i < len; i++) { 269 values[i] = getColumnValues(columnReferences[i]); 270 } 271 return values; 272 } 273 274 288 public Object getColumnValues(_Reference references) throws DException { 289 ColumnDetails refColumnDetail = (ColumnDetails) references; 290 TableDetails tDetails = refColumnDetail.getTable(); 291 int index = searchInMapping(tDetails); 292 if (index == -1) 293 return GeneralPurposeStaticClass.getColumnValuesFromQualified(leftIterator, rightIterator, references, rightNull); 294 if (index == SimpleConstants.LEFT) { 295 if(status == RIGHTNULL || status == NONULL) 296 return leftIterator.getColumnValues(references); 297 return new FieldLiteral(FieldUtility.NULLBUFFERRANGE, ( (ColumnDetails) references).getDatatype()); 298 } 299 if (status == LEFTNULL || status == NONULL) 300 return rightIterator.getColumnValues(references); 301 return new FieldLiteral(FieldUtility.NULLBUFFERRANGE, ( (ColumnDetails) references).getDatatype()); 302 } 303 304 307 public Object getColumnValues1(_Reference references) throws DException { 308 Object values; 309 ColumnDetails refColumnDetail = (ColumnDetails) references; 310 TableDetails tDetails = refColumnDetail.getTable(); 311 int index = searchInMapping(tDetails); 312 if (index == -1) { 313 return GeneralPurposeStaticClass.getColumnValuesFromQualified(leftIterator, rightIterator, references, rightNull); 314 } 315 if (index == SimpleConstants.LEFT) { 316 values = leftIterator.getColumnValues(references); 317 } else if (rightNull) { 318 values = new FieldLiteral(FieldUtility.NULLBUFFERRANGE, ( (ColumnDetails) references).getDatatype()); 319 } else { 320 values = rightIterator.getColumnValues(references); 321 } 322 return values; 323 } 324 325 332 private int searchInMapping(TableDetails tDetails) throws DException { 333 for (int i = 0; i < tableDetailsMapping.length; i++) { 334 if (tableDetailsMapping[i][0] == tDetails) { 335 return ( (Integer ) tableDetailsMapping[i][1]).intValue(); 336 } 337 } 338 return -1; 339 } 340 341 346 private void moveAcctoGroupKey(Object [] keys) throws DException { 347 if (leftKeyCount == 0) { 348 leftIterator.first(); 349 } else { 350 Object [] leftKeys = new Object [leftKeyCount]; 351 System.arraycopy(keys, 0, leftKeys, 0, leftKeyCount); 352 leftIterator.move(leftKeys); 353 } 354 if (rightKeyCount == 0) { 355 rightNull = !rightIterator.first(); 356 } else { 357 int rightLength = keys.length - leftKeyCount; 358 Object [] rightKeys = new Object [rightLength]; 359 System.arraycopy(keys, leftKeyCount, rightKeys, 0, rightLength); 360 if (isKeyNull(rightKeys)) { 361 rightNull = true; 362 } else { 363 rightNull = false; 364 rightIterator.move(rightKeys); 365 } 366 } 367 state = 0; 368 } 369 370 381 public Object getColumnValues() throws DException { 382 ArrayList aList = new ArrayList(); 383 Object [] obj = null; 384 switch (status) { 385 case NONULL: { 386 Object obj1 = leftIterator.getColumnValues(); 387 Object obj2 = rightIterator.getColumnValues(); 388 aList.addAll(Arrays.asList( (Object []) obj1)); 389 aList.addAll(Arrays.asList( (Object []) obj2)); 390 } 391 case RIGHTNULL: { 392 Object obj1 = leftIterator.getColumnValues(); 393 obj =makeNullFieldLiteralArray(rightColumnCount); 394 aList.addAll(Arrays.asList( (Object []) obj1)); 395 aList.addAll(Arrays.asList( (Object []) obj)); 396 } 397 case LEFTNULL: { 398 obj=makeNullFieldLiteralArray(leftColumnCount); 399 Object obj2 = rightIterator.getColumnValues(); 400 aList.addAll(Arrays.asList( (Object []) obj)); 401 aList.addAll(Arrays.asList( (Object []) obj2)); 402 } 403 } 404 return aList.toArray(); 405 } 406 407 415 public FieldBase field(_Reference references) throws com.daffodilwoods.database.resource.DException { 416 ColumnDetails refColumnDetail = (ColumnDetails) references; 417 TableDetails tDetails = refColumnDetail.getTable(); 418 int index = searchInMapping(tDetails); 419 if (index == -1) 420 return GeneralPurposeStaticClass.getFieldFromQualified(leftIterator, rightIterator, references, rightNull); 421 if (index == SimpleConstants.LEFT) { 422 if(status == RIGHTNULL || status == NONULL) 423 return leftIterator.field(references); 424 return new FieldLiteral(FieldUtility.NULLBUFFERRANGE, ( (ColumnDetails) references).getDatatype()); 425 } 426 if (status == LEFTNULL || status == NONULL) 427 return rightIterator.field(references); 428 return new FieldLiteral(FieldUtility.NULLBUFFERRANGE, ( (ColumnDetails) references).getDatatype()); 429 } 430 431 434 public FieldBase field1(_Reference references) throws com.daffodilwoods.database.resource.DException { 435 FieldBase values; 436 ColumnDetails refColumnDetail = (ColumnDetails) references; 437 TableDetails tDetails = refColumnDetail.getTable(); 438 int index = searchInMapping(tDetails); 439 if (index == -1) { 440 return GeneralPurposeStaticClass.getFieldFromQualified(leftIterator, rightIterator, references, rightNull); 441 } 442 if (index == SimpleConstants.LEFT) { 443 values = leftIterator.field(references); 444 } else if (rightNull) { 445 values = new FieldLiteral(null, ( (ColumnDetails) references).getDatatype()); 446 ( (FieldLiteral) values).setBufferRange(FieldUtility.NULLBUFFERRANGE); 447 } else { 448 values = rightIterator.field(references); 449 } 450 return values; 451 } 452 453 461 public FieldBase[] fields(_Reference[] columnReferences) throws com.daffodilwoods.database.resource.DException { 462 int len = columnReferences.length; 463 FieldBase[] values = new FieldBase[len]; 464 for (int i = 0; i < len; i++) { 465 values[i] = field(columnReferences[i]); 466 } 467 return values; 468 } 469 470 479 public _Iterator getBaseIterator(ColumnDetails column) throws com.daffodilwoods.database.resource.DException { 480 return this; 481 } 482 483 488 public _ExecutionPlan getExecutionPlan() throws DException { 489 _ExecutionPlan plan = leftIterator.getExecutionPlan(); 490 _ExecutionPlan plan1 = rightIterator.getExecutionPlan(); 491 _ExecutionPlan cplans[] = new _ExecutionPlan[] {plan, plan1}; 492 return new ExecutionPlan("IndexedFullJoinIterator", cplans, null, null, null); 493 } 494 495 500 public ExecutionPlanForBrowser getExecutionPlanForBrowser() throws DException { 501 int length = 2; 502 ExecutionPlanForBrowser cplans[] = new ExecutionPlanForBrowser[length]; 503 cplans[0] = leftIterator.getExecutionPlanForBrowser(); 504 cplans[1] = rightIterator.getExecutionPlanForBrowser(); 505 return new ExecutionPlanForBrowser("Nested Join/Left Join", "Join Iterator", cplans, "" + conditionVariableValue, null, null); 506 } 507 508 519 public void setConditionVariableValue(_Reference[] parm1, Object [] parm2, int parm3) throws DException { 520 if(underlyingRef!=null){ 521 parm1 = GeneralPurposeStaticClass.getJointReferences(parm1,underlyingRef); 522 parm2 = GeneralPurposeStaticClass.getJointValues(this, parm2,underlyingRef.length); 523 } 524 super.setConditionVariableValue(parm1, parm2, parm3); 525 conditionVariableValue.setVariableValues(parm1, parm2, parm3); 526 } 527 528 533 public void releaseResource() throws DException { 534 conditionVariableValue.releaseResource(); 535 leftIterator.releaseResource(); 536 rightIterator.releaseResource(); 537 } 538 539 public String toString() { 540 try { 541 return "IndexedFullJoinIterator[" + leftIterator + "][" + rightIterator + "]" + conditionVariableValue.getCondition() + "]"; 542 } catch (DException ex) { 543 return null; 544 } 545 } 546 } 547 | Popular Tags |