KickJava   Java API By Example, From Geeks To Geeks.

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


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    /**
19     * Descriptors variables
20     */

21
22    /**
23     * CONSTRAINT CHECK_CONSTRAINTS_PRIMARY_KEY
24     * PRIMARY KEY ( CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME )
25     */

26    public String JavaDoc constraint_catalog;
27    public String JavaDoc constraint_schema;
28    public String JavaDoc constraint_name;
29
30    /**
31     * CONSTRAINT CHECK_CONSTRAINTS_SOURCE_CHECK
32     * CHECK ( ( CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME ) IN
33     * ( SELECT *
34     * FROM ( SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME
35     * FROM TABLE_CONSTRAINTS
36     * UNION
37     * SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME
38     * FROM DOMAIN_CONSTRAINTS ) ) )
39     */

40    public String JavaDoc check_clause;
41
42    /**
43     * Class variables
44     */

45
46    public TableConstraintDescriptor tableConstraintDescriptor;
47    public DomainConstraintDescriptor domainConstraintDescriptor;
48    private ArrayList tablesUsedInSearchCondition; // catalog,schema,name in a array;
49
private ArrayList columnsUsedInSearchCondition; // catalog,schema,tablename,columnname in a array;
50
int[] columnIndexes;
51
52    /**
53     * if the constraint is for domain ,
54     * then these are name of column the
55     * which refer this constraint in place of VALUE used to set in the condtion
56     */

57    private String JavaDoc[] domainColumnNames;
58    public boolean saveTableAndColumnIncluded;
59    public CheckConstraintDescriptor() throws DException {}
60
61    /**
62     * This used in initiaizing checkconstraintcharacteris in DataDictionay
63     */

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 JavaDoc) ( (Object JavaDoc[]) checkConstraintIterator.
73                                getObject())[0];
74       /**
75        * if the checkConstraint is not for domain
76        */

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 JavaDoc[] values = (Object JavaDoc[]) checkTableUsageIterator.getObject();
93             tablesUsedInSearchCondition.add(new String JavaDoc[] { (String JavaDoc) values[0],
94                                             (String JavaDoc) values[1], (String JavaDoc) 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 JavaDoc[] values = (Object JavaDoc[]) checkColumnUsageIterator.getObject();
105             columnsUsedInSearchCondition.add(new String JavaDoc[] { (String JavaDoc) values[0],
106                                              (String JavaDoc) values[1], (String JavaDoc) values[2],
107                                              (String JavaDoc) values[3]});
108          } while (checkColumnUsageIterator.next());
109       }
110    }
111
112    /**
113     * This is used in case of loding in ddl
114     */

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 JavaDoc) ( (Object JavaDoc[]) 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    /**
135     * initializes the column indexes on which this check constraint is made.
136     */

137
138    private void initializeColumnIndexes(_ColumnCharacteristics columnCharacteristics) throws DException {
139       int noOfColumnsUsed = columnsUsedInSearchCondition.size();
140       String JavaDoc tableName = tableConstraintDescriptor.getTable();
141       ArrayList columnsList = new ArrayList();
142       for (int i = 0; i < noOfColumnsUsed; i++) {
143          String JavaDoc[] columnsName = (String JavaDoc[]) columnsUsedInSearchCondition.get(i);
144          String JavaDoc 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 JavaDoc[] columnNames = (String JavaDoc[]) columnsList.toArray(new String JavaDoc[0]);
153          columnIndexes = columnCharacteristics.getColumnIndexes(columnNames);
154       }
155    }
156
157    public void loadDataFromRecord(Object JavaDoc[] values) throws DException {
158       constraint_catalog = (String JavaDoc) values[SystemTablesFields.
159           check_constraints_constraint_catalog];
160       constraint_schema = (String JavaDoc) values[SystemTablesFields.
161           check_constraints_constraint_schema];
162       constraint_name = (String JavaDoc) values[SystemTablesFields.
163           check_constraints_constraint_name];
164       check_clause = (String JavaDoc) values[SystemTablesFields.
165           check_constraints_check_clause];
166    }
167
168    public void loadDataFromRecord(_SelectQueryIterator iter) throws DException {
169       loadDataFromRecord( (Object JavaDoc[]) iter.getObject());
170    }
171
172    public void save(_ServerSession serverSession) throws DException {
173       Object JavaDoc[] 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    /* private void saveTablesUsedInSearchCondition(_ServerSession serverSession) throws
188           DException {
189          if (tablesUsedInSearchCondition == null ||
190              tablesUsedInSearchCondition.size() == 0) {
191             return;
192          }
193          int tableCount = tablesUsedInSearchCondition.size();
194          Object[] columnValues = new Object[6];
195          columnValues[0] = constraint_catalog;
196          columnValues[1] = constraint_schema;
197          columnValues[2] = constraint_name;
198          for (int i = 0; i < tableCount; i++) {
199             String[] tableName = (String[]) tablesUsedInSearchCondition.get(i);
200             columnValues[3] = tableName[0];
201             columnValues[4] = tableName[1];
202             columnValues[5] = tableName[2];
203             SqlSchemaConstants.insert(serverSession,
204                                       SqlSchemaConstants.check_table_usage_TableName, null,
205                                       columnValues);
206          }
207       }
208       private void saveColumnsUsedInSearchCondition(_ServerSession serverSession) throws
209           DException {
210          if (columnsUsedInSearchCondition == null ||
211              columnsUsedInSearchCondition.size() == 0) {
212             return;
213          }
214          int columnCount = columnsUsedInSearchCondition.size();
215          Object[] columnValues = new Object[7];
216          columnValues[0] = constraint_catalog;
217          columnValues[1] = constraint_schema;
218          columnValues[2] = constraint_name;
219          for (int i = 0; i < columnCount; i++) {
220             String[] columnName = (String[]) columnsUsedInSearchCondition.get(i);
221             columnValues[3] = columnName[0];
222             columnValues[4] = columnName[1];
223             columnValues[5] = columnName[2];
224             columnValues[6] = columnName[3];
225             SqlSchemaConstants.insert(serverSession,
226                                       SqlSchemaConstants.check_column_usage_TableName, null,
227                                       columnValues);
228          }
229       }*/

230
231    private void saveTablesUsedInSearchCondition(_ServerSession serverSession) throws
232        DException {
233       if (tablesUsedInSearchCondition == null || tablesUsedInSearchCondition.size() == 0) {
234          if (tableConstraintDescriptor != null) {
235             Object JavaDoc[] columnValues = new Object JavaDoc[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 JavaDoc[] columnValues = new Object JavaDoc[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 JavaDoc[] tableName = (String JavaDoc[]) tablesUsedInSearchCondition.get(i);
255             if (tableConstraintDescriptor == null) { // if check constraint is for domain
256
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 check constraint is for table
262
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 JavaDoc[] columnValues = new Object JavaDoc[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 JavaDoc[] columnName = (String JavaDoc[]) 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    } // Done by harvinder complete
302

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 JavaDoc[] {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 JavaDoc[] {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 JavaDoc[] {constraint_catalog, constraint_schema, constraint_name}), 1);
340       SqlSchemaConstants.deleteAll(systemSession, SqlSchemaConstants.check_column_usage_TableName, iter);
341    }
342
343    private String JavaDoc[] getParameters() throws DException {
344       return new String JavaDoc[] {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 JavaDoc[] 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 JavaDoc[] tableNamepresent = (String JavaDoc[]) tablesIncluded.get(i);
394          String JavaDoc[] tableName = new String JavaDoc[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 JavaDoc[] columnNamepresent = (String JavaDoc[]) columnsIncluded.get(i);
422          String JavaDoc[] columnName = new String JavaDoc[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 JavaDoc[] {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 JavaDoc[] 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 JavaDoc 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 JavaDoc clone() throws CloneNotSupportedException JavaDoc {
491       return this;
492    }
493 }
494
Popular Tags