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.serversystem.dmlvalidation.constraintsystem.*; 8 import com.daffodilwoods.daffodildb.server.sql99.*; 9 import com.daffodilwoods.daffodildb.server.sql99.common.*; 10 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 11 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 12 import com.daffodilwoods.daffodildb.server.sql99.utils.parser.*; 13 import com.daffodilwoods.database.general.*; 14 import com.daffodilwoods.database.resource.*; 15 import com.daffodilwoods.database.utility.*; 16 17 public class TableConstraintDescriptor extends ConstraintDescriptor { 18 public String constraint_catalog; 19 public String constraint_schema; 20 public String constraint_name; 21 public String constraint_type; 22 23 public String table_catalog; 24 public String table_schema; 25 public String table_name; 26 27 28 private String tableName; 29 private int columnCount; 30 public int refercencialColumnIndex; 31 32 34 public Object constraintDescriptor; 35 36 public ArrayList constraintColumnDescriptors; 37 int[] columnIndexes; 38 public TableDescriptor tableDescriptor; 39 ArrayList referencingColumns; 40 41 public TableConstraintDescriptor() throws DException { 42 } 43 44 public void load(_ServerSession serverSession) throws DException { 45 DataDictionary dd = (DataDictionary) serverSession.getDataDictionary(); 46 _SelectQueryIterator iter = (_SelectQueryIterator) dd.getPreparedStatementGetter(). 47 getTableConstraintExecuter().executeForFresh(getParameters()); 48 if (!iter.first()) { 49 throw new DException("DSE286", 50 new Object [] {getQualifiedConstraintName().getIdentifier()}); 51 } 52 loadDataFromRecord(iter); 53 loadConstraint(serverSession); 54 loadConstraintColumns(serverSession); 55 } 56 57 public void load(PreparedStatementGetter preparedStatementGetter, 58 _DataDictionary dataDictionary) throws DException { 59 _SelectQueryIterator iter = (_SelectQueryIterator) preparedStatementGetter. 60 getTableConstraintExecuter() 61 .executeForFresh(getParameters()); 62 63 if (!iter.first()) { 64 throw new DException("DSE286", 65 new Object [] {getQualifiedConstraintName().getIdentifier()}); 66 } 67 loadDataFromRecord(iter); 68 loadConstraintColumns(preparedStatementGetter, 69 dataDictionary. 70 getColumnCharacteristics(getQualifiedTable(), true)); 71 } 72 73 public void loadDataFromRecord(_SelectQueryIterator iter, _ServerSession serverSession) throws 74 DException { 75 loadDataFromRecord(iter); 76 loadConstraint(serverSession); 77 loadConstraintColumns(serverSession); 78 } 79 80 public void loadDataFromRecord(_SelectQueryIterator iter) throws DException { 81 loadDataFromRecord( (Object []) iter.getObject()); 82 } 83 84 public void loadDataFromRecord(Object [] obj) throws DException { 85 constraint_catalog = (String ) obj[SystemTablesFields. 86 table_constraints_constraint_catalog]; 87 constraint_schema = (String ) obj[SystemTablesFields. 88 table_constraints_constraint_schema]; 89 constraint_name = (String ) obj[SystemTablesFields. 90 table_constraints_constraint_name]; 91 constraint_type = (String ) obj[SystemTablesFields. 92 table_constraints_constraint_type]; 93 table_catalog = (String ) obj[SystemTablesFields. 94 table_constraints_table_catalog]; 95 table_schema = (String ) obj[SystemTablesFields. 96 table_constraints_table_schema]; 97 table_name = (String ) obj[SystemTablesFields.table_constraints_table_name]; 98 99 is_deferrable = (String ) obj[SystemTablesFields. 100 table_constraints_is_deferrable]; 101 initially_deferred = (String ) obj[SystemTablesFields. 102 table_constraints_initially_deferred]; 103 } 104 105 private void loadConstraint(_ServerSession serverSession) throws DException { 106 if (constraint_type.equalsIgnoreCase(SqlKeywords.UNIQUE) || 107 constraint_type.equalsIgnoreCase(SqlSchemaConstants.PrimaryKey)) { 108 return; 109 } 110 111 if (constraint_type.equalsIgnoreCase(SqlKeywords.CHECK)) { 112 CheckConstraintDescriptor checkConstraint = new CheckConstraintDescriptor(); 113 checkConstraint.constraint_catalog = constraint_catalog; 114 checkConstraint.constraint_schema = constraint_schema; 115 checkConstraint.constraint_name = constraint_name; 116 checkConstraint.load(serverSession); 117 checkConstraint.tableConstraintDescriptor = this; 118 constraintDescriptor = checkConstraint; 119 } else if (constraint_type.equalsIgnoreCase(SqlSchemaConstants.ForeignKey)) { 120 ReferentialConstraintDescriptor referentialConstraint = new 121 ReferentialConstraintDescriptor(); 122 referentialConstraint.constraint_catalog = constraint_catalog; 123 referentialConstraint.constraint_schema = constraint_schema; 124 referentialConstraint.constraint_name = constraint_name; 125 referentialConstraint.tableConstraintDescriptor = this; 126 referentialConstraint.load(serverSession); 127 constraintDescriptor = referentialConstraint; 128 } 129 } 130 131 void loadConstraintColumns(PreparedStatementGetter preparedStatementGetter, 132 _ColumnCharacteristics columnCharacteristics) throws 133 DException { 134 if (constraint_type.equalsIgnoreCase(SqlKeywords.CHECK)) { 135 return; 136 } 137 _SelectQueryIterator iterator = (_SelectQueryIterator) preparedStatementGetter. 138 getKeyColumnUsageExecuter().executeForFresh(getParameters()); 139 loadConstraintColumns(iterator); 140 intializeColumnIndexes(columnCharacteristics); 141 } 142 143 void intializeColumnIndexes(_ColumnCharacteristics 144 columnCharacteristics) throws DException { 145 if (constraint_type.equalsIgnoreCase("Check")) { 146 return; 147 } 148 int constraintColumnCount = constraintColumnDescriptors.size(); 149 columnIndexes = new int[constraintColumnCount]; 150 for (int i = 0; i < constraintColumnCount; i++) { 151 KeyColumnUsageDescriptor columnDescriptor = (KeyColumnUsageDescriptor) 152 constraintColumnDescriptors.get(i); 153 columnIndexes[i] = columnCharacteristics.getColumnIndex(columnDescriptor. 154 column_name); 155 } 156 } 157 158 private void loadConstraintColumns(_ServerSession serverSession) throws 159 DException { 160 if (constraint_type.equalsIgnoreCase(SqlKeywords.CHECK)) { 161 return; 162 } 163 DataDictionary dd = (DataDictionary) serverSession.getDataDictionary(); 164 _SelectQueryIterator iterator = (_SelectQueryIterator) dd.getPreparedStatementGetter(). 165 getKeyColumnUsageExecuter().executeForFresh(getParameters()); 166 loadConstraintColumns(iterator); 167 } 168 169 private void loadConstraintColumns(_SelectQueryIterator iter) throws DException { 170 if (iter.first()) { 171 constraintColumnDescriptors = new ArrayList(4); 172 do { 173 KeyColumnUsageDescriptor constraintColumn = new 174 KeyColumnUsageDescriptor(); 175 constraintColumn.loadDataFromRecord(iter); 176 constraintColumnDescriptors.add(constraintColumn); 177 } while (iter.next()); 178 } else { 179 throw new InitializeException("DSE270", new Object [] {constraint_name}); 180 } 181 } 182 183 public void loadPrimaryKeyConstraint(_ServerSession serverSession) throws 184 DException { 185 DataDictionary dd = (DataDictionary) serverSession.getDataDictionary(); 186 _SelectQueryIterator iter = (_SelectQueryIterator) dd.getPreparedStatementGetter(). 187 getTableConstraintExecuterForPrimaryKey().executeForFresh( 188 new Object [] { 189 table_catalog, table_schema, table_name}); 190 if (!iter.first()) { 191 throw new DException("DSE286", 192 new Object [] {table_catalog + "." + table_schema + "." + table_name}); 193 } 194 loadDataFromRecord(iter); 195 loadConstraintColumns(serverSession); 196 } 197 198 public QualifiedIdentifier areDependentConstraints(_ServerSession serverSession) throws 199 DException { 200 if (constraint_type.equalsIgnoreCase(SqlKeywords.CHECK) || 201 constraint_type.equalsIgnoreCase(SqlSchemaConstants.ForeignKey)) { 202 return null; 203 } 204 _Executer dependentReferentialConstraintExecuter = ( (DataDictionary) serverSession.getDataDictionary()).getPreparedStatementGetter().getDependentReferentialConstraintExecuter(); 205 _SelectQueryIterator iterator = (_SelectQueryIterator) dependentReferentialConstraintExecuter.execute(new Object [] {constraint_catalog, constraint_schema, constraint_name}); 206 if (!iterator.first()) { 207 return null; 208 } 209 Object [] data = (Object []) iterator.getObject(); 210 String catalog = (String ) data[SystemTablesFields.referential_constraints_constraint_catalog]; 211 String schema = (String ) data[SystemTablesFields.referential_constraints_constraint_schema]; 212 String name = (String ) data[SystemTablesFields.referential_constraints_constraint_name]; 213 return new QualifiedIdentifier(catalog, schema, name); 214 } 215 216 public void save(_ServerSession serverSession) throws DException { 217 Object [] columnValues = new Object [] { 218 constraint_catalog, constraint_schema, 219 constraint_name, constraint_type, table_catalog, table_schema, 220 table_name, is_deferrable, initially_deferred}; 221 222 try { 223 SqlSchemaConstants.insert(serverSession, 224 SqlSchemaConstants.table_constraints_TableName, null, 225 columnValues); 226 } catch (PrimaryConstraintException de) { 227 DException tde = new DException("DSE1135", 228 new Object [] {getQualifiedConstraintName(). 229 getIdentifier()}); 230 throw tde; 231 } catch (SizeMisMatchException de) { 232 if (de.getDseCode().equals("DSE773")) { 233 DException tde = new DException("DSE8103", null); 234 throw tde; 235 } 236 } catch (DException de) { 237 if (de.getDseCode().equals("DSE1255")) { 238 DException tde = new DException("DSE1135", 239 new Object [] {getQualifiedConstraintName(). 240 getIdentifier()}); 241 throw tde; 242 } 243 if (de.getDseCode().equals("DSE773")) { 244 DException tde = new DException("DSE8103", null); 245 throw tde; 246 } 247 throw de; 248 } 249 saveConstraint(serverSession); 250 saveConstraintColumns(serverSession); 251 } 252 253 private void saveConstraint(_ServerSession serverSession) throws DException { 254 if (constraintDescriptor == null) { 255 return; 256 } 257 if (constraintDescriptor instanceof CheckConstraintDescriptor) { 258 CheckConstraintDescriptor checkConstraint = (CheckConstraintDescriptor) 259 constraintDescriptor; 260 checkConstraint.save(serverSession); 261 } else { 262 ReferentialConstraintDescriptor referentialConstraint = 263 (ReferentialConstraintDescriptor) constraintDescriptor; 264 referentialConstraint.save(serverSession); 265 } 266 } 267 268 private void saveConstraintColumns(_ServerSession serverSession) throws 269 DException { 270 if (constraintColumnDescriptors == null) { 271 return; 272 } 273 for (int i = 0, columnCount = constraintColumnDescriptors.size(); 274 i < columnCount; i++) { 275 KeyColumnUsageDescriptor constraintColumn = 276 (KeyColumnUsageDescriptor) constraintColumnDescriptors.get(i); 277 constraintColumn.constraint_catalog = constraint_catalog; 278 constraintColumn.constraint_schema = constraint_schema; 279 constraintColumn.constraint_name = constraint_name; 280 constraintColumn.save(serverSession); 281 } 282 } 283 284 286 public void delete(_ServerSession serverSession) throws DException { 287 deleteConstraintColumns(serverSession); 288 deleteConstraint(serverSession); 289 290 booleanvalueexpression condition = ( (DataDictionary) serverSession.getDataDictionary()).getPreparedStatementGetter().getTableConstraintsTableCondition(); 291 super.delete(serverSession, SqlSchemaConstants.table_constraints_TableName, condition, new Object [] {constraint_catalog, constraint_schema, constraint_name}); 292 } 293 294 private void deleteConstraint(_ServerSession serverSession) throws DException { 295 if (constraintDescriptor == null) { 296 return; 297 } 298 if (constraintDescriptor instanceof CheckConstraintDescriptor) { 299 CheckConstraintDescriptor checkConstraint = (CheckConstraintDescriptor) 300 constraintDescriptor; 301 checkConstraint.delete(serverSession); 302 } else { 303 ReferentialConstraintDescriptor referentialConstraint = 304 (ReferentialConstraintDescriptor) constraintDescriptor; 305 referentialConstraint.delete(serverSession); 306 } 307 } 308 309 private void deleteConstraintColumns(_ServerSession serverSession) throws 310 DException { 311 if (constraintColumnDescriptors == null) { 312 return; 313 } 314 for (int i = 0, columnCount = constraintColumnDescriptors.size(); 315 i < columnCount; i++) { 316 KeyColumnUsageDescriptor constraintColumn = 317 (KeyColumnUsageDescriptor) constraintColumnDescriptors.get(i); 318 constraintColumn.delete(serverSession); 319 } 320 } 321 322 public void setTableDescriptor(TableDescriptor tableDes) throws 323 DException { 324 tableDescriptor = tableDes; 325 table_catalog = tableDes.table_catalog; 326 table_schema = tableDes.table_schema; 327 table_name = tableDes.table_name; 328 } 329 330 public void setConstraintColumnDescriptors(ArrayList 331 constraintColumnDescriptors) throws 332 DException { 333 this.constraintColumnDescriptors = constraintColumnDescriptors; 334 336 } 337 338 public void setConstraintDescriptor(Object constraintDescriptor) throws 339 DException { 340 this.constraintDescriptor = constraintDescriptor; 341 343 } 344 345 public ArrayList getConstriantColumnDescriptors() throws DException { 346 return constraintColumnDescriptors; 347 } 348 349 public ArrayList getReferentialConstraints(_ServerSession serverSession) throws DException { 350 351 _Executer dependentReferentialConstraintExecuter = ( (DataDictionary) serverSession.getDataDictionary()).getPreparedStatementGetter().getDependentReferentialConstraintExecuter(); 352 _SelectQueryIterator iterator = (_SelectQueryIterator) dependentReferentialConstraintExecuter.execute(new Object [] {constraint_catalog, constraint_schema, constraint_name}); 353 ArrayList referentialConstraints = new ArrayList(3); 354 if (iterator.first()) { 355 do { 356 TableConstraintDescriptor referentialConstraint = new TableConstraintDescriptor(); 357 Object [] columnData = (Object []) iterator.getObject(); 358 referentialConstraint.constraint_catalog = (String ) columnData[ 359 SystemTablesFields.referential_constraints_constraint_catalog]; 360 referentialConstraint.constraint_schema = (String ) columnData[ 361 SystemTablesFields.referential_constraints_constraint_schema]; 362 referentialConstraint.constraint_name = (String ) columnData[ 363 SystemTablesFields.referential_constraints_constraint_name]; 364 referentialConstraint.load(serverSession); 365 referentialConstraints.add(referentialConstraint); 366 } while (iterator.next()); 367 } 368 return referentialConstraints; 369 } 370 371 public ArrayList getReferencingColumns() throws DException { 372 return getConstraintColumns(); 373 } 374 375 public ArrayList getConstraintColumns() throws DException { 376 if (referencingColumns != null) { 377 return referencingColumns; 378 } 379 referencingColumns = new ArrayList(); 380 for (int i = 0; i < constraintColumnDescriptors.size(); i++) { 381 KeyColumnUsageDescriptor kcd = (KeyColumnUsageDescriptor) 382 constraintColumnDescriptors.get(i); 383 referencingColumns.add(kcd.column_name); 384 } 385 return referencingColumns; 386 } 387 388 public ArrayList getSub_SuperTables() throws DException { 389 ArrayList sub_superTable = new ArrayList(); 390 sub_superTable.add(new QualifiedIdentifier(table_catalog, table_schema, 391 table_name)); 392 return sub_superTable; 393 } 394 395 public boolean isConstraintColumn(int columnIndex) throws DException { 396 if (constraint_type.equalsIgnoreCase("Check")) { 397 return ( (CheckConstraintDescriptor) constraintDescriptor). 398 isConstraintColumn(columnIndex); 399 } 400 int constraintColumnCount = columnIndexes.length; 401 for (int i = 0; i < constraintColumnCount; i++) { 402 403 if (columnIndex == columnIndexes[i]) { 404 return true; 405 } 406 } 407 return false; 408 } 409 410 public String getTable() throws DException { 411 if (tableName == null) { 412 StringBuffer temp = new StringBuffer (); 413 temp.append(table_catalog); 414 temp.append('.'); 415 temp.append(table_schema); 416 temp.append('.'); 417 temp.append(table_name); 418 tableName = temp.toString(); 419 } 420 return tableName; 421 } 422 423 public QualifiedIdentifier getQualifiedTable() throws DException { 424 QualifiedIdentifier identifier = null; 425 if (tableName == null) { 426 identifier = new QualifiedIdentifier(table_catalog, table_schema, 427 table_name); 428 } 429 return identifier; 430 } 431 432 private booleanvalueexpression _bve; 433 public booleanvalueexpression getCondition() throws DException { 434 if (_bve != null) { 435 return _bve; 436 } 437 StringBuffer clause = new StringBuffer (); 438 for (int i = 0; i < constraintColumnDescriptors.size(); i++) { 439 KeyColumnUsageDescriptor constrntColumn = (KeyColumnUsageDescriptor) 440 constraintColumnDescriptors.get(i); 441 clause.append(" \"" + constrntColumn.column_name + "\" = ? "); 442 if (i != constraintColumnDescriptors.size() - 1) { 443 clause.append(" and "); 444 } 445 } 446 _bve = (booleanvalueexpression) ConditionParser.parseCondition(clause. 447 toString()); 448 return _bve; 449 } 450 451 private HashMap list_of_columnindexes_bve; 452 453 public booleanvalueexpression getCondition(int[] columns) throws DException { 454 int numberofColumns = columns.length; 455 ArrayList indexes = new ArrayList(numberofColumns); 456 for (int i = 0; i < numberofColumns; i++) { 457 indexes.add(new Integer (columns[i])); 458 } 459 if (list_of_columnindexes_bve != null) { 460 Object obj = list_of_columnindexes_bve.get( (Object ) indexes); 461 if (obj != null) { 462 return (booleanvalueexpression) obj; 463 } 464 } else { 465 list_of_columnindexes_bve = new HashMap(5); 466 467 } 468 StringBuffer clause = new StringBuffer (); 469 for (int i = 0; i < numberofColumns; i++) { 470 int index = P.indexOf(columnIndexes, columns[i]); 471 KeyColumnUsageDescriptor constraintColumn = (KeyColumnUsageDescriptor) 472 constraintColumnDescriptors.get(index); 473 String columnName = constraintColumn.column_name; 474 clause.append("\"").append(columnName + "\" = ? "); 475 if (i != numberofColumns - 1) { 476 clause.append(" and "); 477 } 478 } 479 booleanvalueexpression columns_bve = (booleanvalueexpression) 480 ConditionParser.parseConstraintsCondition(clause.toString()); 481 list_of_columnindexes_bve.put(indexes, columns_bve); 482 return columns_bve; 483 } 484 485 private String [] getParameters() throws DException { 486 return new String [] { 487 constraint_catalog, constraint_schema, constraint_name}; 488 } 489 490 public int getColumnCount() { 491 return columnCount; 492 } 493 494 public BitSet getBitSet() { 495 BitSet bitSet = new BitSet(columnCount); 496 for (int i = 0; i < columnIndexes.length; i++) { 497 bitSet.set(columnIndexes[i]); 498 } 499 return bitSet; 500 } 501 502 public boolean equals(Object object) { 503 if (! (object instanceof TableConstraintDescriptor)) { 504 return false; 505 } 506 TableConstraintDescriptor ccd = (TableConstraintDescriptor) object; 507 return constraint_catalog.equalsIgnoreCase(ccd.constraint_catalog) && 508 constraint_schema.equalsIgnoreCase(ccd.constraint_schema) && 509 constraint_name.equalsIgnoreCase(ccd.constraint_name); 510 } 511 512 public void setReferencialColumnIndex(int index) { 513 refercencialColumnIndex = index; 514 } 515 516 public int getDescriptorType() { 517 return TABLE_CONSTRAINT_DESCRIPTOR; 518 } 519 520 public void setGeneratedConstraintName(_ServerSession currentSession, 521 String name) throws DException { 522 constraint_catalog = table_catalog; 523 constraint_schema = table_schema; 524 constraint_name = currentSession.getDataDictionary(). 525 generateConstraintName(name); 526 } 527 528 public QualifiedIdentifier getQualifiedConstraintName() { 529 return new QualifiedIdentifier(constraint_catalog, constraint_schema, constraint_name); 530 } 531 } 532 | Popular Tags |