1 package com.daffodilwoods.daffodildb.server.sql99.dql.execution; 2 3 import com.daffodilwoods.daffodildb.server.datasystem.indexsystem.*; 4 import com.daffodilwoods.daffodildb.server.datasystem.interfaces.*; 5 import com.daffodilwoods.daffodildb.server.serversystem.*; 6 import com.daffodilwoods.daffodildb.server.sql99.common.*; 7 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 8 import com.daffodilwoods.daffodildb.server.sql99.dql.plan.table.*; 9 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 10 import com.daffodilwoods.daffodildb.server.sql99.utils.*; 11 import com.daffodilwoods.database.resource.*; 12 import com.daffodilwoods.database.sqlinitiator.*; 13 14 24 25 public class SingleTableExecuter implements _SingleTableExecuter { 26 27 30 31 protected _Order order; 32 33 36 37 protected TableDetails table; 38 39 43 44 protected _ServerSession serverSession; 45 46 49 50 protected String [] queryColumns; 51 52 55 56 private int indexPosition = -1; 57 58 62 63 private boolean orderSolvableByIndex; 64 65 69 70 private boolean sameOrReverse; 71 72 75 76 protected boolean checkUserRight; 77 78 81 82 protected boolean forUpdate; 83 84 87 88 protected ColumnDetails[] aggregateColumns; 89 90 boolean containsFlag; 91 public boolean isInternalIteratorRequired; 92 public SingleTableExecuter(_Order order0, TableDetails table0, _ServerSession serverSession0, String [] queryColumns0, ColumnDetails[] aggregateColumns0) { 93 order = order0; 94 table = table0; 95 serverSession = serverSession0; 96 queryColumns = queryColumns0; 97 aggregateColumns = aggregateColumns0; 98 } 99 100 105 106 public void setUserRight(boolean checkUserRight0) { 107 checkUserRight = checkUserRight0; 108 } 109 110 114 115 public boolean checkUserRight() { 116 return checkUserRight; 117 } 118 119 135 136 public double getCost(_IndexTable indexTable) throws DException { 137 long estimatedRows = table.getTableType() == TypeConstants.VIEW ? 1000 : ( (_ServerSession) serverSession).getEstimatedRowCount(table.getQualifiedIdentifier()); 138 _IndexInformation[] indexInformations = indexTable.getIndexInformations(); 139 ColumnDetails aggColumn = aggregateColumns == null ? null : aggregateColumns[0].getExistingColumnDetails()[0]; 140 double cost = Double.MAX_VALUE; 141 if (TableReferenceMerger.checkForAggregateColumn(aggColumn, indexInformations[0])) { 142 int num = TableReferenceMerger.checkForOrderColumns(order, indexInformations[0]); 143 sameOrReverse = num == 0; 144 orderSolvableByIndex = num != -1; 145 cost = computeCostForOrderAndQueryColumns(indexInformations[0], estimatedRows, orderSolvableByIndex); 146 indexPosition = 0; 147 } 148 for (int i = 1, length = indexInformations.length; i < length; i++) { 149 if (TableReferenceMerger.checkForAggregateColumn(aggColumn, indexInformations[i])) { 150 int num = TableReferenceMerger.checkForOrderColumns(order, indexInformations[i]); 151 boolean checkForOrderSolvableByIndex1 = num != -1; 152 boolean sameOrReverse1 = num == 0; 153 double cost1 = computeCostForOrderAndQueryColumns(indexInformations[i], estimatedRows, checkForOrderSolvableByIndex1); 154 if (cost1 < cost) { 155 indexPosition = i; 156 cost = cost1; 157 orderSolvableByIndex = checkForOrderSolvableByIndex1; 158 sameOrReverse = sameOrReverse1; 159 } 160 } 161 } 162 return cost; 163 } 164 165 177 178 private double computeCostForOrderAndQueryColumns(_IndexInformation indexInformation, long estimatedRows, boolean checkForOrderSolvableByIndex) throws DException { 179 double cost = estimatedRows; 180 if (!checkForOrderSolvableByIndex) { cost = cost + CostCalculator.getCostForTemporaryOrder(estimatedRows); 182 } 183 boolean checkForQueryColumnsSolvableByIndex = TableReferenceMerger.checkForQueryColumns(indexInformation.getColumns(), queryColumns); 184 if (!checkForQueryColumnsSolvableByIndex) { cost = cost + CostCalculator.getCostForQueryColumns(estimatedRows); 186 } 187 return cost; 188 } 189 190 200 201 public _Iterator execute(_IndexTable indexTable) throws DException { 202 getCost(indexTable); 203 if (order != null) { 204 order.setSolvableByIndex(orderSolvableByIndex); 205 order.setIndexIsSameOrReverse(sameOrReverse); 206 } 207 return orderSolvableByIndex 208 ? indexTable.getIterator(indexPosition) 209 : indexTable.getDefaultIterator(); 210 } 211 212 215 216 public void setForUpdate() { 217 forUpdate = true; 218 } 219 220 224 225 public boolean hasForUpdate() { 226 return forUpdate; 227 } 228 229 234 235 public booleanvalueexpression getCondition() throws DException { 236 return null; 237 } 238 239 243 244 public _Iterator executeForDirtyLock(_IndexTable indexTable) throws DException { 245 throw new UnsupportedOperationException ("Method executeForDirtyLock() yet not implemented"); 246 } 247 248 public void addCondition(booleanvalueexpression condition) throws DException { 249 250 throw new java.lang.UnsupportedOperationException ("Method addCondition() not yet implemented."); 251 } 252 253 public _Reference[] getReferences() throws DException { 254 255 throw new java.lang.UnsupportedOperationException ("Method getReferences() not yet implemented."); 256 } 257 258 public boolean isContainsPresent() { 259 return containsFlag; 260 } 261 262 public void setContainsClauseFlag(boolean containsFlag) throws DException { 263 this.containsFlag = containsFlag; 264 } 265 266 public int[] getColumns() throws DException { 267 if(queryColumns == null || queryColumns.length == 0) 268 return null; 269 else 270 return table.cc.getColumnIndexes(queryColumns); 271 } 272 273 public boolean isParameterisedQuery() throws DException { 274 275 throw new java.lang.UnsupportedOperationException ("Method isParameterisedQuery() not yet implemented."); 276 } 277 public void isInterIteratorRequired( boolean a){ 278 isInternalIteratorRequired = a; 279 } 280 public boolean getInternalIteratorRequired(){ 281 return isInternalIteratorRequired; 282 } 283 } 284 | Popular Tags |