1 package com.daffodilwoods.daffodildb.server.sql99.dql.tableexpression.fromclause; 2 3 import java.util.*; 4 5 import com.daffodilwoods.daffodildb.server.datadictionarysystem.*; 6 import com.daffodilwoods.daffodildb.server.serversystem.*; 7 import com.daffodilwoods.daffodildb.server.sql99.common.*; 8 import com.daffodilwoods.daffodildb.server.sql99.dql.common.*; 9 import com.daffodilwoods.daffodildb.server.sql99.dql.execution.*; 10 import com.daffodilwoods.daffodildb.server.sql99.dql.plan.*; 11 import com.daffodilwoods.daffodildb.server.sql99.dql.plan.condition.*; 12 import com.daffodilwoods.daffodildb.server.sql99.dql.plan.order.*; 13 import com.daffodilwoods.daffodildb.server.sql99.dql.plan.table.*; 14 import com.daffodilwoods.daffodildb.server.sql99.dql.queryexpression.*; 15 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 16 import com.daffodilwoods.database.resource.*; 17 import com.daffodilwoods.database.sqlinitiator.*; 18 import com.daffodilwoods.database.utility.P; 19 20 32 33 public abstract class ViewAbstract { 34 35 39 40 protected ViewObject viewObject; 42 45 protected TableDetails tableDetails; 46 47 53 protected abstract _DatedFramework getAdjustedDatedFrameWork(_DatedFramework datedFrameWork) throws DException; 54 55 59 60 private boolean viewOptimizable; 61 62 65 66 private _TablePlan[] finalTablePlan; 67 68 71 72 private int match; 73 74 public ViewAbstract() { 75 } 76 77 92 93 public OrderMappingWithTableRefernces[] checkForOrderSequencePlan(_ServerSession session, _OrderPlan orderPlan, _BVEPlan bvePlan, _QueryColumns queryColumns, ConditionArray conditionArray, boolean isUnderLoj) throws DException { 94 _SingleTableOrderPlan[] stops = orderPlan.getSingleTableOrderPlans(); 95 match = TableExpressionConstants.FULLYMATCHED; 96 if (viewObject != null) { 97 match = TableExpressionConstants.PARTIALLYMATCHED; 98 finalTablePlan = getViewPlan(session, tableDetails.cc, null, queryColumns, bvePlan, orderPlan, conditionArray); 99 } 100 for (int i = 0; i < stops.length; i++) { 101 _Order order = stops[i].getOrder(); 102 TableDetails td = stops[i].getTableDetail(); 103 if (td == tableDetails) { 104 TableDetails[] resultant = getAppTableDetails(); 105 OrderMappingWithTableRefernces mapping = new OrderMappingWithTableRefernces(new _SingleTableOrderPlan[] {stops[i]} 106 , match, resultant); 107 return new OrderMappingWithTableRefernces[] {mapping}; 108 } 109 } 110 return null; 111 } 112 113 119 120 private TableDetails[] getAppTableDetails() throws DException { 121 if (finalTablePlan == null) { 122 return new TableDetails[] {tableDetails}; 123 } 124 ArrayList list = new ArrayList(); 125 for (int i = 0; i < finalTablePlan.length; i++) { 126 list.addAll(Arrays.asList(finalTablePlan[i].getTableDetails())); 127 } 128 return (TableDetails[]) list.toArray(new TableDetails[list.size()]); 129 } 130 131 172 173 protected _TablePlan[] getViewPlan(_ServerSession session, _ColumnCharacteristics columnCharacteristics, _DatedFramework datedFrameWork, 174 _QueryColumns queryCols, _BVEPlan bvePlan, 175 _OrderPlan orderPlan, 176 ConditionArray conditionArray) throws DException { 177 if (finalTablePlan != null) { 178 return finalTablePlan; 179 } 180 viewOptimizable = viewObject.getQueryExpression().isViewOptimizationPossible(); 181 booleanvalueexpression bve = getBveOfThisTable(bvePlan); 182 boolean dummyColumns = viewObject.getQueryExpression().hasConstantSelectedColumn(bve); 183 184 if( dummyColumns ){ 186 bvePlan.setRemainingCondition(BVEPlanMerger.addAndConditions(bvePlan.getRemainingCondition(),bve)); 187 bve = null; 188 } 189 190 _Order order = getOrderOfThisTable(orderPlan); 191 ColumnDetails[] allCD = getAllCD(queryCols, bve,order); 192 Object [] queryCDAndClonedCD = getQueryColumns(allCD, bve, order); 193 Object [][] virtualAndActualColumns = updatePropertiesOfColumnsInVolvedInQuery(allCD, viewObject.getQueryExpression(), columnCharacteristics, (ColumnDetails[]) queryCDAndClonedCD[0]); 194 if (bve != null) { 195 conditionArray.addCondition(bve); 196 } 197 if (viewOptimizable) { 198 _TablePlan[] tPlans = viewObject.getQueryExpression().getTablePlans(session, bve, order, (ColumnDetails[]) queryCDAndClonedCD[0], conditionArray); 199 if (tPlans.length == 1) { 200 if (tPlans[0] instanceof QuerySpecificationPlan) { 201 remapColumns(queryCDAndClonedCD); 202 viewOptimizable = false; 203 return new _TablePlan[] {createViewPlan(tPlans[0], virtualAndActualColumns)}; 204 } else { 205 match = TableExpressionConstants.FULLYMATCHED; 206 } 207 } 208 return tPlans; 209 } 210 _TablePlan tablePlan = viewObject.getQueryExpression().getExecutionPlan(session, bve, datedFrameWork, order, (ColumnDetails[]) queryCDAndClonedCD[0], conditionArray); 211 return new _TablePlan[] {createViewPlan(tablePlan, virtualAndActualColumns)}; 212 } 213 214 215 216 private boolean checkForConstantColunms(ColumnDetails[] selectedCDs) throws DException{ 217 for (int j = 0; j < selectedCDs.length; j++) { 218 if (selectedCDs[j].getType() == ColumnDetails.CONSTANT) 219 return true; 220 } 221 return false; 222 } 223 224 225 232 private ColumnDetails[] getAllCD(_QueryColumns queryCols, booleanvalueexpression bve) throws DException { 233 HashMap hashMap = queryCols.getQueryColsHashMap(); 234 if (hashMap.containsKey(tableDetails)) { 235 ColumnDetails cd[] = (ColumnDetails[]) hashMap.get(tableDetails); 236 return addBveColumnIfRequired(cd, bve); 237 } 238 return null; 239 } 240 241 250 private ColumnDetails[] addBveColumnIfRequired(ColumnDetails[] queryColumns, booleanvalueexpression bve) throws DException { 251 if (bve == null) { 252 return queryColumns; 253 } 254 ColumnDetails[] bveCD = GeneralPurposeStaticClass.getAllCoumnDetails( bve.getColumnDetails()); 255 ArrayList aList = new ArrayList(Arrays.asList(queryColumns)); 256 for (int i = 0; i < bveCD.length; i++) { 257 int j; 258 for (j = 0; j < queryColumns.length; j++) { 259 if (bveCD[i] == queryColumns[j]) { 260 break; 261 } 262 } 263 if (j == queryColumns.length && bveCD[i].getTable()==tableDetails) { 264 aList.add(bveCD[i]); 265 } 266 } 267 return (ColumnDetails[]) aList.toArray(new ColumnDetails[aList.size()]); 268 } 269 270 286 private Object [] getQueryColumns(ColumnDetails[] allColumns, booleanvalueexpression bve, _Order order) throws DException { 287 if (allColumns == null) { 288 return new Object [] {null, null}; 289 } 290 ColumnDetails[] conditionAndorder = GeneralPurposeStaticClass.getCombinedCDArray(bve == null ? null : bve.getColumnDetails(), order == null ? null : order.getColumnDetails()); 291 if (viewOptimizable) { 292 return getCDAndClonedCD(allColumns, conditionAndorder); 293 } else { 294 return new Object [] {conditionAndorder, null}; 295 } 296 } 297 298 306 private Object [] getCDAndClonedCD(ColumnDetails[] allColumns, ColumnDetails[] conditionAndOrder) throws DException { 307 if (allColumns == null) { 308 return new Object [] {null, null}; 309 } 310 ColumnDetails[] cloned = new ColumnDetails[allColumns.length]; 311 if (conditionAndOrder != null) { 312 for (int i = 0; i < allColumns.length; i++) { 313 int j; 314 for (j = 0; j < conditionAndOrder.length; j++) { 315 if (allColumns[i] == conditionAndOrder[j]) { 316 break; 317 } 318 } 319 try { 320 if (j == conditionAndOrder.length) { 321 cloned[i] = (ColumnDetails) allColumns[i].clone(); 322 } 323 } catch (CloneNotSupportedException ex) { 324 throw new DException("DSE0", new Object [] {"Clone Not Supported"}); 325 } 326 } 327 } 328 return new Object [] {allColumns, cloned}; 329 } 330 331 338 private _TablePlan createViewPlan(_TablePlan tablePlan, Object [][] virtualAndActualColumns) throws DException { 339 return new ViewPlan(viewObject.getQueryExpression(), tableDetails, virtualAndActualColumns, tablePlan); 340 } 341 342 362 private void remapColumns(Object [] queryCDAndClonedCD) throws DException { 363 ColumnDetails[] queryCD = (ColumnDetails[]) queryCDAndClonedCD[0]; 364 if (queryCD == null) { 365 return; 366 } 367 ColumnDetails[] clonedCD = (ColumnDetails[]) queryCDAndClonedCD[1]; 368 for (int i = 0; i < queryCD.length; i++) { 369 if (clonedCD[i] != null) { 370 GeneralPurposeStaticClass.updateColumnDetailsProperties(queryCD[i], clonedCD[i]); 371 } 372 } 373 } 374 375 381 382 protected booleanvalueexpression getBveOfThisTable(_BVEPlan 383 bvePlan) throws DException { 384 if (bvePlan != null) { 385 _BVESingleTablePlan bveSingleTablePlans[] = bvePlan.getBVESingleTablePlans(); 386 if (bveSingleTablePlans != null) { 387 int len = bveSingleTablePlans.length; 388 for (int i = 0; i < len; i++) { 389 if (bveSingleTablePlans[i].getTableDetails()[0] == tableDetails) { 390 return bveSingleTablePlans[i].getCondition(); 391 } 392 } 393 } 394 } 395 return null; 396 } 397 398 408 409 protected _Order getOrderOfThisTable(_OrderPlan orderPlan) throws DException { 410 if (orderPlan == null) { 411 return null; 412 } 413 _SingleTableOrderPlan[] stops = orderPlan.getSingleTableOrderPlans(); 414 for (int i = 0; i < stops.length; i++) { 415 if (stops[i].getTableDetail() == tableDetails) { 416 return stops[i].getOrder(); 417 } 418 } 419 return null; 420 } 421 422 456 protected Object [][] updatePropertiesOfColumnsInVolvedInQuery(ColumnDetails[] 457 queryColumnDetails, queryexpression queryExpression, 458 _ColumnCharacteristics columnCharacteristics, ColumnDetails[] toMapCD) throws 459 DException { 460 if (queryColumnDetails == null) { 461 return null; 462 } 463 ArrayList listOfKKeyColumns = new ArrayList(5); 464 ArrayList colAndCDMapping = new ArrayList(); 465 Object [][] columnNameAndCD = viewObject.getMappingOfColumnsAndColumnDetails( 466 columnCharacteristics.getColumnNames()); 467 for (int i = 0, length = queryColumnDetails.length; i < length; ++i) { 468 if (queryColumnDetails[i].getTableAliasArray() != null) { getMergedPropertiesforFKeyColumn(queryColumnDetails[i], 470 listOfKKeyColumns); 471 continue; 472 } 473 474 String columnName = queryColumnDetails[i].getColumn(); for (int j = 0, length1 = columnNameAndCD.length; j < length1; ++j) { 476 String columnName1 = (String ) columnNameAndCD[j][0]; 477 if (columnName.equalsIgnoreCase(columnName1)) { 478 ColumnDetails column = (ColumnDetails) columnNameAndCD[j][1]; 479 if (toMapCD != null && isExist(queryColumnDetails[i], toMapCD)) { 480 GeneralPurposeStaticClass.updateColumnDetailsProperties( 481 queryColumnDetails[i], column); 482 } 483 queryColumnDetails[i].setByteComparison(column.getType() == 484 TypeConstants.REFERENCE); 485 colAndCDMapping.add(new Object [] {queryColumnDetails[i], column}); 486 break; 487 } 488 } 489 } 490 if (!listOfKKeyColumns.isEmpty()) { 491 queryExpression.setFKeyColumnDetails( (ColumnDetails[]) listOfKKeyColumns. 492 toArray(new ColumnDetails[ 493 listOfKKeyColumns.size()])); 494 } 495 return (Object [][]) colAndCDMapping.toArray(new Object [colAndCDMapping.size()][ 496 2]); 497 } 498 499 507 508 private boolean isExist(ColumnDetails queryCD, ColumnDetails[] toMapCD) throws DException { 509 for (int j = 0; j < toMapCD.length; j++) { 510 if (queryCD == toMapCD[j]) { 511 return true; 512 } 513 } 514 return false; 515 } 516 517 524 protected void getMergedPropertiesforFKeyColumn(ColumnDetails cd, 525 ArrayList list) throws 526 DException { 527 String columnName = cd.getTableAliasArray()[0]; 528 Object [][] columnNameAndCD = viewObject.getMappingOfColumnsAndColumnDetails(); 529 for (int j = 0, selectListLength = columnNameAndCD.length; 530 j < selectListLength; j++) { 531 if ( ( (String ) columnNameAndCD[j][0]).equalsIgnoreCase(columnName)) { 532 cd.setTableDetails( ( (ColumnDetails) columnNameAndCD[j][1]).getTable()); 533 list.add(cd); 534 break; 535 } 536 } 537 } 538 539 546 547 public _BVEPlan getBveExecutionPlan() throws DException { 548 if (viewObject != null) { 549 if (viewOptimizable) { 550 return viewObject.getQueryExpression().getBveExecutionPlan(); 551 } 552 } 553 return null; 554 } 555 556 562 public ViewObject getViewObject(){ 563 return viewObject; 564 } 565 566 567 568 private ColumnDetails[] addOrderColumnIfRequired(ColumnDetails[] queryColumns, _Order order) throws DException { 569 if (order == null) { 570 return queryColumns; 571 } 572 ColumnDetails[] bveCD = GeneralPurposeStaticClass.getAllCoumnDetails( order.getColumnDetails()); 573 ArrayList aList = new ArrayList(Arrays.asList(queryColumns)); 574 for (int i = 0; i < bveCD.length; i++) { 575 int j; 576 for (j = 0; j < queryColumns.length; j++) { 577 if (bveCD[i] == queryColumns[j]) { 578 break; 579 } 580 } 581 if (j == queryColumns.length && bveCD[i].getTable()==tableDetails) { 582 aList.add(bveCD[i]); 583 } 584 } 585 return (ColumnDetails[]) aList.toArray(new ColumnDetails[aList.size()]); 586 } 587 private ColumnDetails[] getAllCD(_QueryColumns queryCols, 588 booleanvalueexpression bve, _Order order) throws 589 DException { 590 591 return addOrderColumnIfRequired(getAllCD(queryCols, bve), order); 592 593 } 594 } 595 | Popular Tags |