1 package com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors; 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.execution.*; 9 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 10 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 11 import com.daffodilwoods.daffodildb.server.sql99.utils.parser.*; 12 import com.daffodilwoods.daffodildb.utils.*; 13 import com.daffodilwoods.database.general.*; 14 import com.daffodilwoods.database.resource.*; 15 import com.daffodilwoods.database.utility.*; 16 17 public class CheckConstraintDescriptor extends Descriptor implements _CheckConstraint { 18 21 22 26 public String constraint_catalog; 27 public String constraint_schema; 28 public String constraint_name; 29 30 40 public String check_clause; 41 42 45 46 public TableConstraintDescriptor tableConstraintDescriptor; 47 public DomainConstraintDescriptor domainConstraintDescriptor; 48 private ArrayList tablesUsedInSearchCondition; private ArrayList columnsUsedInSearchCondition; int[] columnIndexes; 51 52 57 private String [] domainColumnNames; 58 public boolean saveTableAndColumnIncluded; 59 public CheckConstraintDescriptor() throws DException {} 60 61 64 65 public void load(PreparedStatementGetter preparedStatementGetter, 66 _ColumnCharacteristics columnCharacteristics) throws DException { 67 _SelectQueryIterator checkConstraintIterator = (_SelectQueryIterator) preparedStatementGetter. 68 getCheckConstraintExecuter().executeForFresh(getParameters()); 69 if (!checkConstraintIterator.first()) { 70 throw new DException("DSE235", null); 71 } 72 check_clause = (String ) ( (Object []) checkConstraintIterator. 73 getObject())[0]; 74 77 78 if (tableConstraintDescriptor != null) { 79 _SelectQueryIterator checkTableUsageIterator = (_SelectQueryIterator) preparedStatementGetter.getCheckTableUsedExecuter().executeForFresh(getParameters()); 80 loadTableUsed(checkTableUsageIterator); 81 _SelectQueryIterator checkColumnUsageIterator = (_SelectQueryIterator) preparedStatementGetter.getCheckColumnUsedExecuter().executeForFresh(getParameters()); 82 loadColumnUsed(checkColumnUsageIterator); 83 initializeColumnIndexes(columnCharacteristics); 84 } 85 } 86 87 private void loadTableUsed(_SelectQueryIterator checkTableUsageIterator) throws 88 DException { 89 tablesUsedInSearchCondition = new ArrayList(); 90 if (checkTableUsageIterator.first()) { 91 do { 92 Object [] values = (Object []) checkTableUsageIterator.getObject(); 93 tablesUsedInSearchCondition.add(new String [] { (String ) values[0], 94 (String ) values[1], (String ) values[2]}); 95 } while (checkTableUsageIterator.next()); 96 } 97 } 98 99 private void loadColumnUsed(_SelectQueryIterator checkColumnUsageIterator) throws 100 DException { 101 columnsUsedInSearchCondition = new ArrayList(); 102 if (checkColumnUsageIterator.first()) { 103 do { 104 Object [] values = (Object []) checkColumnUsageIterator.getObject(); 105 columnsUsedInSearchCondition.add(new String [] { (String ) values[0], 106 (String ) values[1], (String ) values[2], 107 (String ) values[3]}); 108 } while (checkColumnUsageIterator.next()); 109 } 110 } 111 112 115 116 public void load(_ServerSession serverSession) throws DException { 117 DataDictionary dd = (DataDictionary) serverSession.getDataDictionary(); 118 _SelectQueryIterator iter = (_SelectQueryIterator) dd.getPreparedStatementGetter(). 119 getCheckConstraintExecuter().executeForFresh(getParameters()); 120 if (!iter.first()) { 121 throw new InitializeException("DSE235", null); 122 } 123 check_clause = (String ) ( (Object []) iter.getObject())[0]; 124 _SelectQueryIterator checkTableUsageIterator = (_SelectQueryIterator) dd. 125 getPreparedStatementGetter().getCheckTableUsedExecuter(). 126 executeForFresh(getParameters()); 127 loadTableUsed(checkTableUsageIterator); 128 _SelectQueryIterator checkColumnUsageIterator = (_SelectQueryIterator) dd. 129 getPreparedStatementGetter().getCheckColumnUsedExecuter(). 130 executeForFresh(getParameters()); 131 loadColumnUsed(checkColumnUsageIterator); 132 } 133 134 137 138 private void initializeColumnIndexes(_ColumnCharacteristics columnCharacteristics) throws DException { 139 int noOfColumnsUsed = columnsUsedInSearchCondition.size(); 140 String tableName = tableConstraintDescriptor.getTable(); 141 ArrayList columnsList = new ArrayList(); 142 for (int i = 0; i < noOfColumnsUsed; i++) { 143 String [] columnsName = (String []) columnsUsedInSearchCondition.get(i); 144 String currentTableName = columnsName[0] + "." + columnsName[1] + "." + 145 columnsName[2]; 146 if (tableName.equalsIgnoreCase(currentTableName) && 147 (!columnsList.contains(columnsName[3]))) { 148 columnsList.add(columnsName[3]); 149 } 150 } 151 if (columnsList.size() != 0) { 152 String [] columnNames = (String []) columnsList.toArray(new String [0]); 153 columnIndexes = columnCharacteristics.getColumnIndexes(columnNames); 154 } 155 } 156 157 public void loadDataFromRecord(Object [] values) throws DException { 158 constraint_catalog = (String ) values[SystemTablesFields. 159 check_constraints_constraint_catalog]; 160 constraint_schema = (String ) values[SystemTablesFields. 161 check_constraints_constraint_schema]; 162 constraint_name = (String ) values[SystemTablesFields. 163 check_constraints_constraint_name]; 164 check_clause = (String ) values[SystemTablesFields. 165 check_constraints_check_clause]; 166 } 167 168 public void loadDataFromRecord(_SelectQueryIterator iter) throws DException { 169 loadDataFromRecord( (Object []) iter.getObject()); 170 } 171 172 public void save(_ServerSession serverSession) throws DException { 173 Object [] columnValues = { 174 constraint_catalog, constraint_schema, constraint_name, check_clause}; 175 SqlSchemaConstants.insert(serverSession, 176 SqlSchemaConstants.check_constraints_TableName, null, columnValues); 177 if (saveTableAndColumnIncluded) { 178 saveTablesAndColumnsIncluded(serverSession); 179 } 180 } 181 182 public void saveTablesAndColumnsIncluded(_ServerSession serverSession) throws DException { 183 saveTablesUsedInSearchCondition(serverSession); 184 saveColumnsUsedInSearchCondition(serverSession); 185 } 186 187 230 231 private void saveTablesUsedInSearchCondition(_ServerSession serverSession) throws 232 DException { 233 if (tablesUsedInSearchCondition == null || tablesUsedInSearchCondition.size() == 0) { 234 if (tableConstraintDescriptor != null) { 235 Object [] columnValues = new Object [6]; 236 columnValues[0] = constraint_catalog; 237 columnValues[1] = constraint_schema; 238 columnValues[2] = constraint_name; 239 columnValues[3] = tableConstraintDescriptor.table_catalog; 240 columnValues[4] = tableConstraintDescriptor.table_schema; 241 columnValues[5] = tableConstraintDescriptor.table_name; 242 SqlSchemaConstants.insert(serverSession, 243 SqlSchemaConstants.check_table_usage_TableName, null, columnValues); 244 } else { 245 return; 246 } 247 } else { 248 int tableCount = tablesUsedInSearchCondition.size(); 249 Object [] columnValues = new Object [6]; 250 columnValues[0] = constraint_catalog; 251 columnValues[1] = constraint_schema; 252 columnValues[2] = constraint_name; 253 for (int i = 0; i < tableCount; i++) { 254 String [] tableName = (String []) tablesUsedInSearchCondition.get(i); 255 if (tableConstraintDescriptor == null) { columnValues[3] = tableName[0]; 257 columnValues[4] = tableName[1]; 258 columnValues[5] = tableName[2]; 259 SqlSchemaConstants.insert(serverSession, 260 SqlSchemaConstants.check_table_usage_TableName, null, columnValues); 261 } else { if (tableConstraintDescriptor.table_catalog.equalsIgnoreCase(tableName[0]) && tableConstraintDescriptor.table_schema.equalsIgnoreCase(tableName[1]) && tableConstraintDescriptor.table_name.equalsIgnoreCase(tableName[2])) { 263 columnValues[3] = tableConstraintDescriptor.table_catalog; 264 columnValues[4] = tableConstraintDescriptor.table_schema; 265 columnValues[5] = tableConstraintDescriptor.table_name; 266 SqlSchemaConstants.insert(serverSession, 267 SqlSchemaConstants.check_table_usage_TableName, null, columnValues); 268 } else { 269 columnValues[3] = tableName[0]; 270 columnValues[4] = tableName[1]; 271 columnValues[5] = tableName[2]; 272 SqlSchemaConstants.insert(serverSession, 273 SqlSchemaConstants.check_table_usage_TableName, null, columnValues); 274 } 275 } 276 } 277 } 278 } 279 280 private void saveColumnsUsedInSearchCondition(_ServerSession serverSession) throws 281 DException { 282 if (columnsUsedInSearchCondition == null || 283 columnsUsedInSearchCondition.size() == 0) { 284 return; 285 } 286 int columnCount = columnsUsedInSearchCondition.size(); 287 Object [] columnValues = new Object [7]; 288 columnValues[0] = constraint_catalog; 289 columnValues[1] = constraint_schema; 290 columnValues[2] = constraint_name; 291 for (int k = 0; k < columnCount; k++) { 292 String [] columnName = (String []) columnsUsedInSearchCondition.get(k); 293 columnValues[3] = columnName[0]; 294 columnValues[4] = columnName[1]; 295 columnValues[5] = columnName[2]; 296 columnValues[6] = columnName[3]; 297 SqlSchemaConstants.insert(serverSession, 298 SqlSchemaConstants.check_column_usage_TableName, null, 299 columnValues); 300 } 301 } 303 public ArrayList getColumnsUsedInSearchCondition() throws DException { 304 return columnsUsedInSearchCondition; 305 } 306 307 308 public boolean isConstraintColumn(int column) throws DException { 309 return P.indexOf(columnIndexes, column) != -1; 310 } 311 312 public void delete(_ServerSession serverSession) throws DException { 313 booleanvalueexpression condition = ( (DataDictionary) serverSession.getDataDictionary()).getPreparedStatementGetter().getCheckConstraintsTableCondition(); 314 super.delete(serverSession, SqlSchemaConstants.check_constraints_TableName, condition, new Object [] {constraint_catalog, constraint_schema, constraint_name}); 315 deleteTablesUsedFromUsageTable(serverSession); 316 deleteColumnsUsedFromUsageTable(serverSession); 317 } 318 319 private void deleteTablesUsedFromUsageTable(_ServerSession serverSession) throws DException { 320 TableDetails tableDetail = new TableDetails(); 321 tableDetail.setTableName(SqlSchemaConstants.check_table_usage_TableName.getTableName()); 322 _ServerSession systemSession = serverSession.getSystemServerSession(); 323 _ServerSession globalSession = serverSession.getGlobalSession(); 324 booleanvalueexpression condition = ( (DataDictionary) serverSession.getDataDictionary()).getPreparedStatementGetter().getCheckTableUsageTableCondition(); 325 ConditionSingleTableExecuter conSingTE = new ConditionSingleTableExecuter(null, tableDetail, globalSession, condition, null); 326 _Iterator iter = globalSession.getInternalIterator(SqlSchemaConstants.check_table_usage_TableName, conSingTE); 327 iter.setConditionVariableValue(condition.getReferences(new TableDetails[] {tableDetail}), FieldUtility.getFields(new Object [] {constraint_catalog, constraint_schema, constraint_name}), 1); 328 SqlSchemaConstants.deleteAll(systemSession, SqlSchemaConstants.check_table_usage_TableName, iter); 329 } 330 331 private void deleteColumnsUsedFromUsageTable(_ServerSession serverSession) throws DException { 332 TableDetails tableDetail = new TableDetails(); 333 tableDetail.setTableName(SqlSchemaConstants.check_column_usage_TableName.getTableName()); 334 _ServerSession systemSession = serverSession.getSystemServerSession(); 335 _ServerSession globalSession = serverSession.getGlobalSession(); 336 booleanvalueexpression condition = ( (DataDictionary) serverSession.getDataDictionary()).getPreparedStatementGetter().getCheckColumnUsageTableCondition(); 337 ConditionSingleTableExecuter conSingTE = new ConditionSingleTableExecuter(null, tableDetail, globalSession, condition, null); 338 _Iterator iter = globalSession.getInternalIterator(SqlSchemaConstants.check_column_usage_TableName, conSingTE); 339 iter.setConditionVariableValue(condition.getReferences(new TableDetails[] {tableDetail}), FieldUtility.getFields(new Object [] {constraint_catalog, constraint_schema, constraint_name}), 1); 340 SqlSchemaConstants.deleteAll(systemSession, SqlSchemaConstants.check_column_usage_TableName, iter); 341 } 342 343 private String [] getParameters() throws DException { 344 return new String [] {constraint_catalog, constraint_schema, constraint_name}; 345 } 346 347 private booleanvalueexpression _bve; 348 public booleanvalueexpression getCondition() throws DException { 349 if (_bve == null) { 350 _bve = (booleanvalueexpression) ConditionParser.parseCondition( 351 check_clause); 352 if (domainConstraintDescriptor != null) { 353 ColumnDetails[] cds = _bve.getColumnDetails(); 354 replaceValueWithColumnName(cds); 355 } 356 } 357 return _bve; 358 } 359 360 private void replaceValueWithColumnName(ColumnDetails[] cds) throws DException { 361 for (int i = 0; i < cds.length; i++) { 362 int type = cds[i].getType(); 363 if (type == ColumnDetails.CONSTANT) 364 continue; 365 if (type == ColumnDetails.REFERENCE) { 366 String [] namePresent = cds[i].getColumnName(); 367 if (namePresent[0].equalsIgnoreCase(SqlKeywords.VALUE)) { 368 cds[i].setColumnName(domainColumnNames); 369 } 370 } else { 371 replaceValueWithColumnName(cds[i].getExistingColumnDetails()); 372 } 373 } 374 } 375 376 public QualifiedIdentifier getQualifiedIdentifier() throws DException { 377 return domainConstraintDescriptor == null ? 378 new QualifiedIdentifier(tableConstraintDescriptor.constraint_catalog, 379 tableConstraintDescriptor.constraint_schema, 380 tableConstraintDescriptor.constraint_name) 381 : 382 new QualifiedIdentifier(domainConstraintDescriptor.constraint_catalog, 383 domainConstraintDescriptor.constraint_schema, 384 domainConstraintDescriptor.constraint_name); 385 } 386 387 public void setTablesIncluded(ArrayList tablesIncluded) throws 388 DException { 389 int size = tablesIncluded.size(); 390 tablesUsedInSearchCondition = new ArrayList(size); 391 TreeSet tablesList = new TreeSet(new StringArrayComparator()); 392 for (int i = 0; i < size; i++) { 393 String [] tableNamepresent = (String []) tablesIncluded.get(i); 394 String [] tableName = new String [3]; 395 int tableLen = tableNamepresent.length; 396 if (tableLen == 3) { 397 tableName = tableNamepresent; 398 } else { 399 tableName[0] = tableConstraintDescriptor == null ? 400 domainConstraintDescriptor.domain_catalog : 401 tableConstraintDescriptor.table_catalog; 402 tableName[1] = tableLen < 2 ? tableConstraintDescriptor == null ? 403 domainConstraintDescriptor.domain_schema : 404 tableConstraintDescriptor.table_schema : 405 tableNamepresent[0]; 406 tableName[2] = tableLen == 1 ? tableNamepresent[0] : tableNamepresent[1]; 407 } 408 if (!tablesList.contains(tableName)) { 409 tablesList.add(tableName); 410 } 411 } 412 tablesUsedInSearchCondition.addAll(tablesList); 413 } 414 415 public void setColumnsIncluded(ArrayList columnsIncluded) throws 416 DException { 417 int size = columnsIncluded.size(); 418 columnsUsedInSearchCondition = new ArrayList(size); 419 TreeSet columnsList = new TreeSet(new StringArrayComparator()); 420 for (int i = 0; i < size; i++) { 421 String [] columnNamepresent = (String []) columnsIncluded.get(i); 422 String [] columnName = new String [4]; 423 int columnLen = columnNamepresent.length; 424 if (columnLen == 4) { 425 columnName = columnNamepresent; 426 } else { 427 columnName[0] = tableConstraintDescriptor == null ? 428 domainConstraintDescriptor.domain_catalog : tableConstraintDescriptor.table_catalog; 429 columnName[1] = columnLen < 3 ? tableConstraintDescriptor == null ? 430 domainConstraintDescriptor.domain_schema : tableConstraintDescriptor.table_schema : 431 columnNamepresent[0]; 432 if (columnLen < 2 && domainConstraintDescriptor != null) { 433 if (!columnNamepresent[columnLen - 1].equalsIgnoreCase(SqlKeywords.VALUE)) { 434 throw new DException("DSE256", new Object [] {columnNamepresent[columnLen - 1]}); 435 } 436 continue; 437 } 438 columnName[2] = columnLen < 2 ? tableConstraintDescriptor.table_name : 439 columnNamepresent[columnLen - 2]; 440 columnName[3] = columnNamepresent[columnLen - 1]; 441 } 442 if (!columnsList.contains(columnName)) { 443 columnsList.add(columnName); 444 } 445 } 446 columnsUsedInSearchCondition.addAll(columnsList); 447 } 448 449 public void addColumnIndex(int index, String [] columns) throws DException { 450 if (columnIndexes == null) { 451 columnIndexes = new int[] {index}; 452 domainColumnNames = columns; 453 } else { 454 int len = columnIndexes.length; 455 int[] temp = new int[len + 1]; 456 System.arraycopy(columnIndexes, 0, temp, 0, len); 457 temp[len] = index; 458 columnIndexes = temp; 459 } 460 } 461 462 public boolean equals(Object object) { 463 if (! (object instanceof CheckConstraintDescriptor)) { 464 return false; 465 } 466 CheckConstraintDescriptor ccd = (CheckConstraintDescriptor) object; 467 return constraint_name.equalsIgnoreCase(ccd.constraint_name); 468 } 469 470 public BitSet getBitSet() { 471 BitSet bitSet = domainConstraintDescriptor == null ? 472 new BitSet(tableConstraintDescriptor.getColumnCount()) 473 : new BitSet(1); 474 if (columnIndexes == null) 475 return new BitSet(tableConstraintDescriptor.getColumnCount()); 476 for (int i = 0; i < columnIndexes.length; i++) { 477 bitSet.set(columnIndexes[i]); 478 } 479 return bitSet; 480 } 481 482 public int[] getColumns() { 483 return columnIndexes; 484 } 485 486 public int getDescriptorType() { 487 return CHECK_CONSTRAINT_DESCRIPTOR; 488 } 489 490 public Object clone() throws CloneNotSupportedException { 491 return this; 492 } 493 } 494 | Popular Tags |