1 package com.daffodilwoods.daffodildb.server.datadictionarysystem; 2 3 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._Iterator; 4 5 import java.util.*; 6 import com.daffodilwoods.database.resource.*; 7 import com.daffodilwoods.daffodildb.server.serversystem._ServerSession; 8 import com.daffodilwoods.database.general.*; 9 import com.daffodilwoods.database.utility.P; 10 import com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors.*; 11 import com.daffodilwoods.daffodildb.server.sql99.common.SqlKeywords; 12 import com.daffodilwoods.daffodildb.server.sql99._Executer; 13 import com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors.*; 14 import com.daffodilwoods.daffodildb.server.sql99.utils._Reference; 15 import com.daffodilwoods.daffodildb.server.sql99.dql.listenerevents.*; 16 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._SelectQueryIterator; 17 18 public class ReferencedConstraintCharacteristics implements _ReferencedConstraintCharacteristics { 19 20 private PreparedStatementGetter preparedStatementGetter; 21 private TreeMap constraints; 22 transient HashMap constraint_column_mapping; 23 private Object [] parameters; 24 private _DataDictionary dataDictionary; 25 private boolean initialized; 26 private boolean isDefered; 27 private boolean isSystemTable; 28 29 public ReferencedConstraintCharacteristics(QualifiedIdentifier tableName, PreparedStatementGetter preparedStatementGetter0, boolean deferable, _DataDictionary dataDictionary) throws DException { 30 isSystemTable = SystemTables.isSystemTable(tableName.getIdentifier()); 31 preparedStatementGetter = preparedStatementGetter0; 32 isDefered = deferable; 33 parameters = new Object [] {tableName.catalog, tableName.schema, tableName.name}; 34 this.dataDictionary = dataDictionary; 35 } 36 37 private void initializeConstraintDescriptor() throws DException { 38 if (initialized) 39 return; 40 synchronized (this) { 41 if (constraints != null) 42 return; 43 constraints = new TreeMap(String.CASE_INSENSITIVE_ORDER); 44 constraint_column_mapping = new HashMap(4); 45 if (!isSystemTable) { 46 _SelectQueryIterator constraintsIterator = isDefered 47 ? getIterator(preparedStatementGetter.getReferencedConstraintsJoinExecuter(), parameters) 48 : getIterator(preparedStatementGetter.getReferencedConstraintsJoinExecuterNonDef(), parameters); 49 if (constraintsIterator.first()) { 50 Object [] record = null; 51 do { 52 TableConstraintDescriptor tableConstraintDescriptor = new TableConstraintDescriptor(); 53 ReferentialConstraintDescriptor constraint = new ReferentialConstraintDescriptor(); 54 record = (Object []) constraintsIterator.getObject(); 55 constraint.tableConstraintDescriptor = tableConstraintDescriptor; 56 tableConstraintDescriptor.constraintDescriptor = constraint; 57 constraint.load(preparedStatementGetter, record, dataDictionary); 58 constraints.put(constraint.constraint_name, constraint); 59 } while (constraintsIterator.next()); 60 } 61 } 62 initialized = true; 63 } 64 } 65 66 public _ReferentialConstraint[] getReferencedConstraintsForUpdate(int[] columns) throws DException { 67 return getInsertConstraints(columns); 68 } 69 70 public _ReferentialConstraint[] getReferencedConstraintsForDelete() throws DException { 71 initializeConstraintDescriptor(); 72 int constraintsCount = constraints.size(); 73 ReferentialConstraintDescriptor[] deleteConstraints = constraintsCount == 0 ? null : 74 new ReferentialConstraintDescriptor[constraintsCount]; 75 if (constraintsCount > 0) 76 constraints.values().toArray(deleteConstraints); 77 return deleteConstraints; 78 } 79 80 private ReferentialConstraintDescriptor[] getInsertConstraints(int[] columns) throws DException { 81 initializeConstraintDescriptor(); 82 ArrayList constraintsToBeReturned = new ArrayList(4); 83 for (int i = 0; i < columns.length; i++) { 84 ReferentialConstraintDescriptor[] effectedConstraints = getConstraintsUsingColumn(columns[i]); 85 if (effectedConstraints != null) 86 for (int j = 0; j < effectedConstraints.length; j++) { 87 int size = constraintsToBeReturned.size(); 88 boolean contains = false; 89 for (int k = 0; k < size; k++) { 90 ReferentialConstraintDescriptor rcd = (ReferentialConstraintDescriptor) constraintsToBeReturned.get(k); 91 if (effectedConstraints[j].constraint_name.equalsIgnoreCase(rcd.constraint_name)) { 92 contains = true; 93 break; 94 } 95 } 96 if (!contains) 97 constraintsToBeReturned.add(effectedConstraints[j]); 98 } 99 } 100 return constraintsToBeReturned.size() == 0 ? null : (ReferentialConstraintDescriptor[]) constraintsToBeReturned.toArray(new ReferentialConstraintDescriptor[0]); 101 } 102 103 private ReferentialConstraintDescriptor[] getConstraintsUsingColumn(int columnIndex) throws DException { 104 Integer key = new Integer (columnIndex); 105 if (constraint_column_mapping.containsKey(key)) 106 return (ReferentialConstraintDescriptor[]) constraint_column_mapping.get(key); 107 108 ArrayList effectedConstraints = new ArrayList(3); 109 Iterator iterator = constraints.values().iterator(); 110 while (iterator.hasNext()) { 111 ReferentialConstraintDescriptor constraint = (ReferentialConstraintDescriptor) iterator.next(); 112 TableConstraintDescriptor tcd = constraint.referencedTableConstraintDescriptor; 113 if (tcd.isConstraintColumn(columnIndex)) 114 effectedConstraints.add(constraint); 115 } 116 ReferentialConstraintDescriptor[] constraintsArray = null; 117 if (effectedConstraints.size() != 0) { 118 constraintsArray = new ReferentialConstraintDescriptor[effectedConstraints.size()]; 119 effectedConstraints.toArray(constraintsArray); 120 } 121 constraint_column_mapping.put(key, constraintsArray); 122 return constraintsArray; 123 } 124 125 126 127 private _SelectQueryIterator getIterator(_Executer executer, Object [] parameters) throws DException { 128 return (_SelectQueryIterator) executer.executeForFresh(parameters); 129 } 130 } 131 | Popular Tags |