1 package com.daffodilwoods.daffodildb.server.sql99.dql.tableexpression; 2 3 import java.util.*; 4 5 import com.daffodilwoods.daffodildb.server.serversystem.*; 6 import com.daffodilwoods.daffodildb.server.sql99.common.*; 7 import com.daffodilwoods.daffodildb.server.sql99.dql.common.*; 8 import com.daffodilwoods.daffodildb.server.sql99.dql.execution.*; 9 import com.daffodilwoods.daffodildb.server.sql99.dql.listenerevents.*; 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.tableexpression.fromclause.*; 15 import com.daffodilwoods.daffodildb.server.sql99.dql.tableexpression.groupbyclause.*; 16 import com.daffodilwoods.daffodildb.server.sql99.dql.tableexpression.havingclause.*; 17 import com.daffodilwoods.daffodildb.server.sql99.dql.tableexpression.whereclause.*; 18 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 19 import com.daffodilwoods.daffodildb.server.sql99.utils.*; 20 import com.daffodilwoods.database.resource.*; 21 import com.daffodilwoods.database.sqlinitiator.*; 22 import com.daffodilwoods.database.utility.P; 23 24 37 38 public class tableexpression extends JoinRelationAbstract implements com.daffodilwoods.daffodildb.utils.parser.StatementExecuter, TypeConstants, TableExpressionConstants, SimpleConstants { 39 40 43 44 public havingclause _Opthavingclause0; 45 46 49 50 public groupbyclause _Optgroupbyclause1; 51 52 55 56 public whereclause _Optwhereclause2; 57 58 61 62 public fromclause _fromclause3; 63 64 67 68 private _TablePlan[] tablePlans; 69 70 74 75 private _BVEPlan resultantBvePlan; 76 77 81 82 private Object [][] tableAndQualifiedPlan; 84 87 88 private _OrderPlan orderPlan; 89 90 93 94 private _TablePlan finalTablePlan; 95 96 100 101 private booleanvalueexpression remainingCondition; 102 103 106 107 private TableDetails[] tableDetails; 108 109 114 115 private TableDetails[] allTableDetails; 116 117 _QueryColumns queryColumns0; 118 119 public tableexpression() { 120 } 121 122 public Object run(Object object) throws com.daffodilwoods.database.resource.DException { 123 throw new DException("DSE16", new Object [] {"run"}); 124 } 125 126 132 133 private Object [] addParameters(Object [] param1, Object [] param2) { 134 return param1 == null ? param2 : param2 == null ? param1 : mergeParameters(param1, param2); 135 } 136 137 private Object [] mergeParameters(Object [] param1, Object [] param2) { 138 int len1 = param1.length; 139 int len2 = param2.length; 140 int len = len1 + len2; 141 Object [] result = new Object [len]; 142 System.arraycopy(param1, 0, result, 0, len1); 143 System.arraycopy(param2, 0, result, len1, len2); 144 return result; 145 } 146 147 154 155 private _BVEPlan mergeBvePlan(booleanvalueexpression condition) throws DException { 156 _BVEPlan bvePlan = null; 157 if (condition != null) { 158 bvePlan = condition.getExecutionPlan(); 159 } 160 if (_Optwhereclause2 != null) { 161 _BVEPlan whereBvePlan = _Optwhereclause2.getExecutionPlan(); 162 bvePlan = BVEPlanMerger.mergeTablePlansWithAnd(bvePlan, whereBvePlan); 163 } 164 return bvePlan; 165 } 166 167 230 231 public _TablePlan getExecutionPlan(_ServerSession session, booleanvalueexpression bve, _DatedFramework datedFrameWork, _QueryColumns queryColumns, _Order order0, ConditionArray conditionArray) throws DException { 232 queryColumns0=queryColumns; 233 234 initializeBvePlan(bve); 235 initializeOrderPlan(session, order0, queryColumns); 236 initializeConditionArray(conditionArray); tablePlans = _fromclause3.getTablePlan(session, datedFrameWork, resultantBvePlan, orderPlan, queryColumns, conditionArray); 238 return createTableExpressionPlan(session); 239 } 240 241 242 255 256 private TableExpressionPlan createTableExpressionPlan(_ServerSession session) throws DException { 257 mergeFromClauseConditioninResultantBvePlan(); 258 initializeMapping(); 259 mergeJoinCondition(session); 260 joinMissingLink(); 261 262 263 return new TableExpressionPlan(finalTablePlan, resultantBvePlan, orderPlan, 264 _Optwhereclause2 == null ? null:GeneralPurposeStaticClass.getUnderLyingReferencesOnly(_Optwhereclause2.getReferences(tableDetails),tableDetails), 265 _Opthavingclause0 == null ? null:GeneralPurposeStaticClass.getUnderLyingReferencesOnly(_Opthavingclause0.getReferences(tableDetails),tableDetails) 266 ); 267 } 268 269 276 277 private void initializeConditionArray(ConditionArray conditionArray) throws DException { 278 if (_Optwhereclause2 != null) { 279 if (conditionArray == null) { 280 conditionArray = new ConditionArray(); 281 } 282 _BVEPlan bvePlan = _Optwhereclause2.getExecutionPlan(); 283 _BVESingleTablePlan[] bveSingleTablePlans = bvePlan.getBVESingleTablePlans(); 284 if (bveSingleTablePlans != null) { 285 for (int i = 0; i < bveSingleTablePlans.length; i++) { 286 conditionArray.addCondition(bveSingleTablePlans[i].getCondition()); 287 } 288 } 289 _AllTablesJoinRelation allTablesJoinRelation = bvePlan.getAllTableJoinRelation(); 290 if (allTablesJoinRelation != null) { 291 _JoinRelation[] joinRelations = allTablesJoinRelation.getRelations(); 292 for (int i = 0; i < joinRelations.length; i++) { 293 conditionArray.addCondition(joinRelations[i].getCondition()); 294 } 295 } 296 } 297 } 298 299 307 308 private void mergeFromClauseConditioninResultantBvePlan() throws DException { 309 _BVEPlan fromBvePlan = _fromclause3.getBveExecutionPlan(); 310 resultantBvePlan = BVEPlanMerger.mergeTablePlansWithAnd(resultantBvePlan, fromBvePlan); 311 } 312 313 322 323 private boolean checkSequence(_SingleTableOrderPlan[] singleTableOrderPlan1, _SingleTableOrderPlan[] singleTableOrderPlan2) throws DException { 324 int count = (singleTableOrderPlan1.length < singleTableOrderPlan2.length) ? singleTableOrderPlan1.length : singleTableOrderPlan2.length; 325 for (int i = 0; i < count; i++) { 326 if (!compareOrdersAndColumns(singleTableOrderPlan1[i].getOrder(), singleTableOrderPlan2[i].getOrder())) { 327 return false; 328 } 329 } 330 return true; 331 } 332 333 341 342 private boolean checkSequence(_Order order1, _Order order2) throws DException { 343 return (compareOrdersAndColumns(order1, order2)); 344 } 345 346 354 355 private boolean compareOrdersAndColumns(_Order order1, _Order order2) throws DException { 356 String [] str1 = order1.getColumns(); 357 String [] str2 = order2.getColumns(); 358 boolean[] result1 = order1.getOrderOfColumns(); 359 boolean[] result2 = order2.getOrderOfColumns(); 360 int length = (str1.length < str2.length) ? str1.length : str2.length; 361 for (int i = 0; i < length; i++) { 362 if (!str1[i].equalsIgnoreCase(str2[i]) || ! (result1[i] == result2[i])) { 363 return false; 364 } 365 } 366 return true; 367 } 368 369 376 377 private void initializeBvePlan(booleanvalueexpression bve) throws DException { 378 resultantBvePlan = bve == null ? null : bve.getExecutionPlan(); 379 resultantBvePlan = _Optwhereclause2 == null ? resultantBvePlan : BVEPlanMerger.mergeTablePlansWithAnd(resultantBvePlan, _Optwhereclause2.getExecutionPlan()); 380 resultantBvePlan = _Opthavingclause0 == null ? resultantBvePlan : BVEPlanMerger.mergeTablePlansWithAnd(resultantBvePlan, _Opthavingclause0.getExecutionPlan()); 381 resultantBvePlan = createLayerOfBveAllTablePlan(resultantBvePlan); 382 } 383 384 396 397 private _BVEPlan createLayerOfBveAllTablePlan(_BVEPlan bvePlanPassed) throws DException { 398 if (bvePlanPassed == null) { 399 return new BVEAllTablePlan(null, null, null); 400 } else if (bvePlanPassed.getType() == BVEConstants.BVESINGLETABLEPLAN) { 401 return new BVEAllTablePlan(new _BVESingleTablePlan[] { (_BVESingleTablePlan) bvePlanPassed} 402 , null, null); 403 } else if (bvePlanPassed.getType() == BVEConstants.BVEAGGREGATEPLAN) { 404 booleanvalueexpression aggregateCondition = bvePlanPassed.getAggregateCondition(); 405 bvePlanPassed = new BVEAllTablePlan(null, null, null); 406 ( (BVEAllTablePlan) bvePlanPassed).andAggregateCondition(aggregateCondition); 407 return bvePlanPassed; 408 } 409 return bvePlanPassed; 410 } 411 412 425 426 private void initializeMapping() throws DException { 427 int sizeOfMapping = 0; 428 int length = tablePlans.length; 429 Object [] singleTblPlans = new Object [length]; 430 for (int i = 0; i < length; i++) { 431 _SingleTablePlan singleTablePlans[] = tablePlans[i].getSingleTablePlans(); 432 sizeOfMapping += singleTablePlans.length; 433 singleTblPlans[i] = singleTablePlans; 434 } 435 tableAndQualifiedPlan = new Object [sizeOfMapping][3]; 436 int index = 0; 437 for (int i = 0; i < length; i++) { 438 439 _SingleTablePlan singleTablePlans[] = (_SingleTablePlan[]) singleTblPlans[i]; 440 for (int j = 0; j < singleTablePlans.length; j++) { 441 tableAndQualifiedPlan[index][0] = singleTablePlans[j].getTableDetails()[0]; 442 tableAndQualifiedPlan[index][1] = singleTablePlans[j]; 443 tableAndQualifiedPlan[index++][2] = tablePlans[i]; 444 } 445 } 446 } 447 448 454 455 private void mergeJoinCondition(_ServerSession session) throws DException { 456 if (resultantBvePlan == null) { 457 return; 458 } 459 _AllTablesJoinRelation allTablesJoinRelation = resultantBvePlan.getAllTableJoinRelation(); 460 if (allTablesJoinRelation != null) { 461 462 allTablesJoinRelation.sort(tableAndQualifiedPlan, session); 463 mergeJoinRelations(allTablesJoinRelation); 464 } 465 } 466 467 474 475 private int getTablePosition(TableDetails table) throws DException { 476 int length = tableAndQualifiedPlan.length; 477 for (int i = 0; i < length; i++) { 478 if (ifExists( ( (_TablePlan) tableAndQualifiedPlan[i][2]), table)) { 479 return i; 480 } 481 } 482 throw new DException("DSE3516", new Object [] {table.getNameOfTable()}); } 484 485 492 493 private boolean ifExists(_TablePlan tablePlan, TableDetails tableDetail) throws DException { 494 TableDetails[] tds = tablePlan.getTableDetails(); 495 for (int i = 0; i < tds.length; i++) { 496 if (tds[i] == tableDetail) { 497 return true; 498 } 499 } 500 return false; 501 } 502 503 510 511 public void updateMapping(int[] mappingPositions, _TablePlan tablePlan) throws DException { 512 for (int i = 0; i < mappingPositions.length; i++) { 513 tableAndQualifiedPlan[mappingPositions[i]][2] = tablePlan; 514 } 515 TableDetails[] tableDetails = tablePlan.getViewTableDetails(); 516 int[] tablePositions = getTablePositionFromMapping(tableDetails); 517 for (int i = 0; i < tablePositions.length; i++) { 518 tableAndQualifiedPlan[tablePositions[i]][2] = tablePlan; 519 } 520 } 521 522 529 530 531 private int[] getTablePositionFromMapping(TableDetails[] tableDetails) throws DException { 532 int intArray[] = new int[tableAndQualifiedPlan.length]; 533 int index = 0; 534 for (int j = 0; j < tableDetails.length; j++) { 535 for (int i = 0; i < tableAndQualifiedPlan.length; i++) { 536 if (tableAndQualifiedPlan[i][0] == tableDetails[j]) { 537 intArray[index++] = i; 538 break; 539 } 540 } 541 } 542 int[] returnArray = new int[index]; 543 System.arraycopy(intArray, 0, returnArray, 0, index); 544 return returnArray; 545 } 546 547 559 560 private void mergeJoinRelations(_AllTablesJoinRelation allTablesJoinRelation) throws DException { 561 _JoinRelation joinRelations[] = allTablesJoinRelation.getRelations(); 562 int length = joinRelations.length; 563 for (int i = 0; i < length; i++) { 564 TableDetails[] tableDetails = GeneralPurposeStaticClass.getAllTableDetails(joinRelations[i].getCondition()); 565 int mappingPosition1 = getTablePosition(tableDetails[0]); 566 _TablePlan tablePlan1 = (_TablePlan) tableAndQualifiedPlan[mappingPosition1][2]; 567 int mappingPosition2 = getTablePosition(tableDetails[1]); 568 _TablePlan tablePlan2 = (_TablePlan) tableAndQualifiedPlan[mappingPosition2][2]; 569 int[] tablePositions = new int[] {mappingPosition1, mappingPosition2}; 570 tablePlans = mergingOfJoinRelation(tablePlan1, tablePlan2, joinRelations[i], tableDetails, tablePositions, tablePlans); 571 } 572 } 573 574 585 586 private void prepareTableMergeAndUpdateTablePlans(_TablePlan orderSequencePlan, booleanvalueexpression bve, int index1, int index2) throws DException { 587 _TablePlan[] tp = ( (OrderSequencePlan) orderSequencePlan).getTablePlans(); 588 int len = tp.length; 589 TemporaryMerge tempMerge = new TemporaryMerge(); 590 for (int i = index1; i <= index2; i++) { 591 tempMerge.addTablePlan(tp[i]); 592 } 593 tempMerge.addCondition(bve); 594 _TablePlan[] newTp = new _TablePlan[tp.length - (index2 - index1)]; 595 System.arraycopy(tp, 0, newTp, 0, index1); 596 newTp[index1] = tempMerge; 597 System.arraycopy(tp, index2 + 1, newTp, index1 + 1, tp.length - index2 - 1); 598 ( (OrderSequencePlan) orderSequencePlan).setPlans(newTp); 599 } 600 601 612 613 private void prepareTwoTableJoinPlanAndUpdateTablePlans(_TablePlan orderSequencePlan, booleanvalueexpression bve, int index1, int index2) throws DException { 614 _TablePlan[] tp = ( (OrderSequencePlan) orderSequencePlan).getTablePlans(); 615 int len = tp.length; 616 TwoTableJoinPlan ttJp = new TwoTableJoinPlan(tp[index1], tp[index2], bve); 617 _TablePlan[] newTp = new _TablePlan[tp.length - 1]; 618 System.arraycopy(tp, 0, newTp, 0, index1); 619 newTp[index1] = ttJp; 620 System.arraycopy(tp, index1 + 1, newTp, index1 + 1, index2 - index1 - 1); 621 System.arraycopy(tp, index2 + 1, newTp, index2, newTp.length - index2); 622 ( (OrderSequencePlan) orderSequencePlan).setPlans(newTp); 623 } 624 625 635 636 private void joinMissingLink() throws DException { 637 int length = tablePlans.length; 638 639 for (int i = 0; i < length; i++) { 640 tablePlans[i] = tablePlans[i].joinMissingLink(); 641 } 642 643 if (tablePlans.length > 1) { 644 finalTablePlan = new NestedLoopJoinPlan(tablePlans); 645 } else { 646 finalTablePlan = tablePlans[0]; 647 } 648 } 649 650 655 656 public ColumnDetails[] getFromClauseColumnDetails() throws DException { 657 return _fromclause3.getColumnDetails(); 658 } 659 660 665 666 public ColumnDetails[] getWhereClauseColumnDetails() throws DException { 667 return _Optwhereclause2 != null ? _Optwhereclause2.getColumnDetails() 668 : null; 669 } 670 671 676 677 public ColumnDetails[] getGroupByColumnDetails() throws DException { 678 return _Optgroupbyclause1 != null ? _Optgroupbyclause1.getColumnDetails() 679 : null; 680 } 681 682 687 688 public ColumnDetails[] getHavingClauseColumnDetails() throws DException { 689 return _Opthavingclause0 != null ? _Opthavingclause0.getColumnDetails() 690 : null; 691 } 692 693 697 698 public String getfromClause() { 699 return _fromclause3.toString(); 700 } 701 702 706 707 public String getGroupByClause() { 708 return _Optgroupbyclause1 == null ? null : _Optgroupbyclause1.toString(); 709 } 710 711 715 716 public String getHavingClause() { 717 return _Opthavingclause0 == null ? null : _Opthavingclause0.toString(); 718 } 719 720 724 725 public String getWhereClause() { 726 return _Optwhereclause2 == null ? null : _Optwhereclause2.toString(); 727 } 728 729 735 736 public TableDetails[] getViewTableDetails() throws DException { 737 return _fromclause3.getViewTableDetails(); 738 } 739 740 746 747 public _Reference[] getUnderlyingReferences() throws DException { 748 return _fromclause3.getUnderlyingReferences(); 749 } 750 751 757 758 public booleanvalueexpression getAggregateCondition() throws DException { 759 return resultantBvePlan == null ? null 760 : resultantBvePlan.getAggregateCondition(); 761 } 762 763 776 777 private void initializeOrderPlan(_ServerSession session, _Order viewOrder, _QueryColumns queryCols) throws DException { 778 orderPlan = checkForGroupAndOrderRedundant(viewOrder, session, queryCols); 779 if (orderPlan != null) { 780 return; 781 } 782 if (viewOrder != null) { 783 orderPlan = viewOrder.getOrderPlan(session); 784 } 785 if (_Optgroupbyclause1 != null) { 786 _Order groupOrder = _Optgroupbyclause1.getOrder(queryCols); orderPlan = getMergedGroupAndOrderPlan(orderPlan, groupOrder.getOrderPlan(session)); 788 } 789 } 790 791 826 827 private _OrderPlan getMergedGroupAndOrderPlan(_OrderPlan orderByOrderPlan, _OrderPlan groupByOrderPlan) throws DException { 828 if (orderByOrderPlan == null) { 829 return groupByOrderPlan; 830 } 831 _SingleTableOrderPlan[] stopOrderBy = orderByOrderPlan.getSingleTableOrderPlans(); 832 _SingleTableOrderPlan[] stopGroupBy = groupByOrderPlan.getSingleTableOrderPlans(); 833 if (stopGroupBy != null) { 834 if (stopOrderBy != null) { return mergeSingleTableOrderPlans(stopOrderBy, stopGroupBy, orderByOrderPlan, groupByOrderPlan); 836 } 837 _Order joinOrderPlanOrderBy = orderByOrderPlan.getJoinLevelOrder(); 838 844 if (joinOrderPlanOrderBy != null) { groupByOrderPlan.setJoinOrderPlan(joinOrderPlanOrderBy); 846 return groupByOrderPlan; 847 } 848 groupByOrderPlan.setGroupByOrderPlan(orderByOrderPlan.getGroupByLevelOrder()); return groupByOrderPlan; 850 } 851 if (stopOrderBy != null) { groupByOrderPlan.setGroupByOrderPlan(OrderPlanMerger.getOrder(stopOrderBy)); 853 return groupByOrderPlan; 854 } 855 _Order joinOrderPlanOrderBy = orderByOrderPlan.getJoinLevelOrder(); 856 _Order joinOrderPlanGroupBy = groupByOrderPlan.getJoinLevelOrder(); 857 if (joinOrderPlanOrderBy != null) { return mergeJoinOrderPlan(joinOrderPlanOrderBy, joinOrderPlanGroupBy, orderByOrderPlan, groupByOrderPlan); 859 } 860 861 groupByOrderPlan.setGroupByOrderPlan(orderByOrderPlan.getGroupByLevelOrder()); return groupByOrderPlan; 863 } 864 865 889 private _OrderPlan mergeSingleTableOrderPlans(_SingleTableOrderPlan[] stop1, _SingleTableOrderPlan[] stop2, _OrderPlan orderByOrderPlan, _OrderPlan groupByOrderPlan) throws DException { 890 if (!checkSequence(stop1, stop2)) { 891 groupByOrderPlan.setGroupByOrderPlan(OrderPlanMerger.getOrder(stop1)); 892 return groupByOrderPlan; 893 } 894 return (stop1.length >= stop2.length) ? orderByOrderPlan : groupByOrderPlan; 895 } 896 897 909 private _OrderPlan mergeJoinOrderPlan(_Order joinOrderPlanOrderBy, _Order joinOrderPlanGroupBy, _OrderPlan orderByOrderPlan, _OrderPlan groupByOrderPlan) throws DException { 910 if (!checkSequence(joinOrderPlanOrderBy, joinOrderPlanGroupBy)) { 911 groupByOrderPlan.setGroupByOrderPlan(joinOrderPlanOrderBy); 912 return groupByOrderPlan; 913 } 914 return (joinOrderPlanOrderBy.getColumnIndexes().length >= joinOrderPlanGroupBy.getColumnIndexes().length) ? orderByOrderPlan : groupByOrderPlan; 915 } 916 917 public String toString() { 918 StringBuffer sb = new StringBuffer (); 919 sb.append(" "); 920 sb.append(_fromclause3); 921 sb.append(" "); 922 if (_Optwhereclause2 != null) { 923 sb.append(_Optwhereclause2); 924 } 925 sb.append(" "); 926 if (_Optgroupbyclause1 != null) { 927 sb.append(_Optgroupbyclause1); 928 } 929 sb.append(" "); 930 if (_Opthavingclause0 != null) { 931 sb.append(_Opthavingclause0); 932 } 933 return sb.toString(); 934 } 935 936 public Object clone() throws CloneNotSupportedException { 937 tableexpression tempClass = new tableexpression(); 938 if (_Opthavingclause0 != null) { 939 tempClass._Opthavingclause0 = (havingclause) _Opthavingclause0.clone(); 940 } 941 if (_Optgroupbyclause1 != null) { 942 tempClass._Optgroupbyclause1 = (groupbyclause) _Optgroupbyclause1.clone(); 943 } 944 if (_Optwhereclause2 != null) { 945 tempClass._Optwhereclause2 = (whereclause) _Optwhereclause2.clone(); 946 } 947 tempClass._fromclause3 = (fromclause) _fromclause3.clone(); 948 return tempClass; 949 } 950 951 970 protected void mergeJoinRelationInOrderSequencePlan(_TablePlan tablePlan1, _JoinRelation joinRelation) throws DException { 971 TableDetails[] tableDetails = joinRelation.getTableDetails(); 972 int index1 = ( (OrderTablePlanAbstract) tablePlan1).getIndex(tableDetails[0]); 973 int index2 = ( (OrderTablePlanAbstract) tablePlan1).getIndex(tableDetails[1]); 974 if (index1 > index2) { 975 int temp = index1; 976 index1 = index2; 977 index2 = temp; 978 } 979 if (index2 - index1 == 0) { 980 ( (OrderTablePlanAbstract) tablePlan1).setJoinConditionOfChild(index1, joinRelation); 981 } else { 982 if ( (index2 - index1) > 1) { prepareTableMergeAndUpdateTablePlans(tablePlan1, joinRelation.getCondition(), index1, index2); 984 } else { prepareTwoTableJoinPlanAndUpdateTablePlans(tablePlan1, joinRelation.getCondition(), index1, index2); 986 } 987 } 988 } 989 990 996 997 public _BVEPlan getBveExecutionPlan() throws DException { 998 _BVEPlan fromBvePlan = _fromclause3.getBveExecutionPlan(); 999 return BVEPlanMerger.mergeTablePlansWithAnd(resultantBvePlan, fromBvePlan); 1000 } 1001 1002 1013 public boolean isSimpleQuery(_ServerSession serverSession) throws DException { 1014 if (serverSession != null) { 1015 1016 return _Optgroupbyclause1 == null && (_Optwhereclause2 == null || (_Optwhereclause2 != null && !_Optwhereclause2.checkForSubquery() &&!_Optwhereclause2.hasContainClause() )) 1017 && _Opthavingclause0 == null && _fromclause3.isSimpleQuery(serverSession); 1018 1019 } 1020 return _Optgroupbyclause1 == null && _Optwhereclause2 == null 1021 && _Opthavingclause0 == null 1022 && tableDetails.length == 1 && tableDetails[0].getTableType() == TypeConstants.VIEW; 1023 } 1024 1025 1074 1075 public _TablePlan[] getTablePlans(_ServerSession session, booleanvalueexpression condition, _Order viewOrder, _QueryColumns queryCols, ConditionArray conditionArray) throws DException { 1076 resultantBvePlan = mergeBvePlan(condition); 1077 resultantBvePlan = createLayerOfBveAllTablePlan(resultantBvePlan); 1078 initializeOrderPlan(session, viewOrder, queryCols); 1079 initializeConditionArray(conditionArray); tablePlans = _fromclause3.getTablePlan(session, null, resultantBvePlan, orderPlan, queryCols, conditionArray); 1081 return orderPlan != null && orderPlan.getJoinLevelOrder() != null ? new _TablePlan[] {createTableExpressionPlan(session)} 1082 : tablePlans; 1083 } 1084 1085 1090 1091 public _Order getGroupByLevelOrder() throws DException { 1092 return orderPlan == null ? null : orderPlan.getGroupByLevelOrder(); 1093 } 1094 1095 1102 1103 public void checkSemanticForUpdate() throws DException { 1104 if (_Optgroupbyclause1 != null || (_Optwhereclause2 != null && _Optwhereclause2.checkForSubquery()) || tableDetails.length != 1 || tableDetails[0].getTableType() == TypeConstants.VIEW) { 1105 throw new DException("DSE6003", null); 1106 } 1107 } 1108 1109 1130 private _OrderPlan checkForGroupAndOrderRedundant(_Order viewOrder, _ServerSession session, _QueryColumns queryCols) throws DException { 1131 if (viewOrder == null || _Optgroupbyclause1 == null) { 1132 return null; 1133 } 1134 ColumnDetails[] orderCD = viewOrder.getColumnDetails(); 1135 boolean[] orderSpecification = viewOrder.getOrderOfColumns(); 1136 ColumnDetails[] groupCD = _Optgroupbyclause1.getOrder(queryCols).getColumnDetails(); 1137 ArrayList result = new ArrayList(); 1138 int i = 0; 1139 for (; i < orderCD.length; i++) { 1140 if (orderCD[i].getType() != REFERENCE || !orderSpecification[i]) { 1141 return null; 1142 } 1143 String column = orderCD[i].getAppropriateColumn(); 1144 int j = 0; 1145 for (; j < groupCD.length; j++) { 1146 if(orderCD[i].getTable() == groupCD[j].getTable() && column.equalsIgnoreCase(groupCD[j].getAppropriateColumn())){ 1147 result.add(groupCD[j]); 1148 break; 1149 } 1150 } 1151 if (j == groupCD.length) { 1152 return null; 1153 } 1154 1155 } 1156 if (i == orderCD.length) { 1157 for (int k = 0; k < groupCD.length; k++) { 1158 if (!result.contains(groupCD[k])) { 1159 result.add(groupCD[k]); 1160 } 1161 } 1162 return new SelectOrder( (ColumnDetails[]) result.toArray(new ColumnDetails[result.size()])).getOrderPlan(session); 1163 } 1164 return null; 1165 } 1166 1167 1171 1172 public _Reference[] getReferences(TableDetails[] tableDetails) throws DException { 1173 _Reference[] reference = null; 1174 if (_Optwhereclause2 != null) { 1175 reference = GeneralPurposeStaticClass.getJointReferences(reference, _Optwhereclause2.getReferences(tableDetails)); 1176 } 1177 if (_Opthavingclause0 != null) { 1178 reference = GeneralPurposeStaticClass.getJointReferences(reference, _Opthavingclause0.getReferences(tableDetails)); 1179 } 1180 1181 reference = GeneralPurposeStaticClass.getJointReferences(reference, _fromclause3.getUnderlyingReferences()); 1182 1183 if (_Optgroupbyclause1 != null) { 1184 reference = GeneralPurposeStaticClass.getJointReferences(reference,_Optgroupbyclause1.getReferences(tableDetails)); 1185 } 1186 1187 return reference; 1188 } 1189 1190 public Object [] getParameters(Object object) throws DException { 1191 Object [] param = _fromclause3.getParameters(object); 1192 if (_Optwhereclause2 != null) { 1193 param = addParameters(param, _Optwhereclause2.getParameters(object)); 1194 } 1195 if (_Opthavingclause0 != null) { 1196 param = addParameters(param, _Opthavingclause0.getParameters(object)); 1197 } 1198 return param; 1199 } 1200 1201 public TableDetails[] getTableDetails(_ServerSession session, ColumnDetails[] queryColumns) throws DException { 1202 if (tableDetails == null) { 1203 tableDetails = _fromclause3.getTableDetails(session, queryColumns); 1204 } 1205 return tableDetails; 1206 } 1207 1208 1218 1219 public void getColumnsIncluded(ArrayList aList) throws DException { 1220 _fromclause3.getColumnsIncluded(aList); 1221 if (_Optwhereclause2 != null) { 1222 _Optwhereclause2.getColumnsIncluded(aList); 1223 } 1224 if (_Optgroupbyclause1 != null) { 1225 _Optgroupbyclause1.getColumnsIncluded(aList); 1226 } 1227 if (_Opthavingclause0 != null) { 1228 _Opthavingclause0.getColumnsIncluded(aList); 1229 } 1230 } 1231 1232 1242 1243 public void getTablesIncluded(ArrayList aList) throws DException { 1244 _fromclause3.getTablesIncluded(aList); 1245 if (_Optwhereclause2 != null) { 1246 _Optwhereclause2.getTablesIncluded(aList); 1247 } 1248 if (_Optgroupbyclause1 != null) { 1249 _Optgroupbyclause1.getTablesIncluded(aList); 1250 } 1251 if (_Opthavingclause0 != null) { 1252 _Opthavingclause0.getTablesIncluded(aList); 1253 } 1254 } 1255 1256 public ParameterInfo[] getParameterInfo() throws DException { 1257 ParameterInfo[] p1 = _fromclause3.getParameterInfo(); 1258 ParameterInfo[] p2 = null, p3 = null; 1259 if (_Optwhereclause2 != null) { 1260 p2 = _Optwhereclause2.getParameterInfo(); 1261 } 1262 if (_Opthavingclause0 != null) { 1263 p3 = _Opthavingclause0.getParameterInfo(); 1264 } 1265 ArrayList aList = new ArrayList(5); 1266 if (p1 != null) { 1267 aList.addAll(Arrays.asList(p1)); 1268 } 1269 if (p2 != null) { 1270 aList.addAll(Arrays.asList(p2)); 1271 } 1272 if (p3 != null) { 1273 aList.addAll(Arrays.asList(p3)); 1274 } 1275 return (ParameterInfo[]) aList.toArray(new ParameterInfo[0]); 1276 } 1277 1278 1285 1286 public void verifyValues(_VariableValueOperations variableValueOperation) throws DException { 1287 return ; 1288 1290 } 1291 1292 1299 1300 public void setDefaultValues(_VariableValueOperations variableValueOperation) throws DException { 1301 ( (VariableValueOperations) variableValueOperation).setFlag(false); 1302 _fromclause3.setDefaultValues(variableValueOperation); 1303 if (_Opthavingclause0 != null) { 1304 _Opthavingclause0.setDefaultValues(variableValueOperation); 1305 } 1306 } 1307 1308 public _Reference[] checkSemantic(_ServerSession session, ColumnDetails[] queryColumns, boolean checkUserRight) throws DException { 1309 _Reference[] references = _fromclause3.checkSemantic(session, queryColumns, checkUserRight); if (_Optwhereclause2 != null) { 1311 references = GeneralPurposeStaticClass.getJointReferences(references, _Optwhereclause2.checkSemantic(session)); 1312 } 1313 if (_Opthavingclause0 != null) { 1314 _Reference[] temp = _Opthavingclause0.checkSemantic(session); 1315 references = GeneralPurposeStaticClass.getJointReferences(references, temp); 1316 } 1317 return references; 1318 } 1319 1320 1326 1327 public void setTablesForInsertion(ColumnMappingHandler columnMapping, _VariableValueOperations vv) throws DException { 1328 return; 1329 1331 1332 1340 } 1341 1342 public TableDetails[] getTableDetails() throws DException { 1343 return finalTablePlan == null ? tableDetails 1344 : finalTablePlan.getTableDetails(); 1345 } 1346 1347 public TableDetails[] getAllTableDetails() throws DException { 1348 return allTableDetails == null ? 1349 allTableDetails = _fromclause3.getAllTableDetails() : 1350 allTableDetails; 1351 } 1352 1353} 1354 | Popular Tags |