KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > sql99 > ddl > descriptors > TableConstraintDescriptor


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 JavaDoc constraint_catalog;
19    public String JavaDoc constraint_schema;
20    public String JavaDoc constraint_name;
21    public String JavaDoc constraint_type;
22
23    public String JavaDoc table_catalog;
24    public String JavaDoc table_schema;
25    public String JavaDoc table_name;
26
27
28    private String JavaDoc tableName;
29    private int columnCount;
30    public int refercencialColumnIndex;
31
32    /* storing the constraintDescriptor, could be either
33             check constraint Descriptor or referntial constraint Descriptor*/

34    public Object JavaDoc 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 JavaDoc[] {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 JavaDoc[] {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 JavaDoc[]) iter.getObject());
82    }
83
84    public void loadDataFromRecord(Object JavaDoc[] obj) throws DException {
85       constraint_catalog = (String JavaDoc) obj[SystemTablesFields.
86           table_constraints_constraint_catalog];
87       constraint_schema = (String JavaDoc) obj[SystemTablesFields.
88           table_constraints_constraint_schema];
89       constraint_name = (String JavaDoc) obj[SystemTablesFields.
90           table_constraints_constraint_name];
91       constraint_type = (String JavaDoc) obj[SystemTablesFields.
92           table_constraints_constraint_type];
93       table_catalog = (String JavaDoc) obj[SystemTablesFields.
94           table_constraints_table_catalog];
95       table_schema = (String JavaDoc) obj[SystemTablesFields.
96           table_constraints_table_schema];
97       table_name = (String JavaDoc) obj[SystemTablesFields.table_constraints_table_name];
98
99       is_deferrable = (String JavaDoc) obj[SystemTablesFields.
100           table_constraints_is_deferrable];
101       initially_deferred = (String JavaDoc) 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 JavaDoc[] {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 JavaDoc[] {
189           table_catalog, table_schema, table_name});
190       if (!iter.first()) {
191          throw new DException("DSE286",
192                               new Object JavaDoc[] {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 JavaDoc[] {constraint_catalog, constraint_schema, constraint_name});
206       if (!iterator.first()) {
207          return null;
208       }
209       Object JavaDoc[] data = (Object JavaDoc[]) iterator.getObject();
210       String JavaDoc catalog = (String JavaDoc) data[SystemTablesFields.referential_constraints_constraint_catalog];
211       String JavaDoc schema = (String JavaDoc) data[SystemTablesFields.referential_constraints_constraint_schema];
212       String JavaDoc name = (String JavaDoc) 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 JavaDoc[] columnValues = new Object JavaDoc[] {
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 JavaDoc[] {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 JavaDoc[] {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    /* delete the constraint descriptor from the TableConstraints tables,
285      delete from the individual tables according to the type */

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 JavaDoc[] {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       /** @todo constraint name generation part has been shifted in constraint
335        * class. Please check while reviewing table constaints */

336    }
337
338    public void setConstraintDescriptor(Object JavaDoc constraintDescriptor) throws
339        DException {
340       this.constraintDescriptor = constraintDescriptor;
341       /** @todo constraint name generation part has been shifted in constraint
342        * class. Please check while reviewing table constaints */

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 JavaDoc[] {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 JavaDoc[] columnData = (Object JavaDoc[]) iterator.getObject();
358             referentialConstraint.constraint_catalog = (String JavaDoc) columnData[
359                 SystemTablesFields.referential_constraints_constraint_catalog];
360             referentialConstraint.constraint_schema = (String JavaDoc) columnData[
361                 SystemTablesFields.referential_constraints_constraint_schema];
362             referentialConstraint.constraint_name = (String JavaDoc) 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 JavaDoc getTable() throws DException {
411       if (tableName == null) {
412          StringBuffer JavaDoc temp = new StringBuffer JavaDoc();
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 JavaDoc clause = new StringBuffer JavaDoc();
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 JavaDoc(columns[i]));
458       }
459       if (list_of_columnindexes_bve != null) {
460          Object JavaDoc obj = list_of_columnindexes_bve.get( (Object JavaDoc) indexes);
461          if (obj != null) {
462             return (booleanvalueexpression) obj;
463          }
464       } else {
465          list_of_columnindexes_bve = new HashMap(5);
466
467       }
468       StringBuffer JavaDoc clause = new StringBuffer JavaDoc();
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 JavaDoc 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 JavaDoc[] getParameters() throws DException {
486       return new String JavaDoc[] {
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 JavaDoc 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 JavaDoc 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