1 24 25 package com.mckoi.database; 26 27 import com.mckoi.util.IntegerVector; 28 29 35 36 public class CompositeTable extends Table implements RootTable { 37 38 40 43 public static int UNION = 1; 44 45 48 public static int INTERSECT = 2; 49 50 53 public static int EXCEPT = 3; 54 55 56 58 62 private Table master_table; 63 64 67 private Table[] composite_tables; 68 69 72 private IntegerVector[] table_indexes; 73 74 77 private SelectableScheme[] column_scheme; 78 79 82 private int roots_locked; 83 84 92 public CompositeTable(Table master_table, Table[] composite_list) { 93 super(); 94 this.master_table = master_table; 95 this.composite_tables = composite_list; 96 this.column_scheme = new SelectableScheme[master_table.getColumnCount()]; 97 } 98 99 103 public CompositeTable(Table[] composite_list) { 104 this(composite_list[0], composite_list); 105 } 106 107 108 112 private void removeDuplicates(boolean pre_sorted) { 113 throw new Error ("PENDING"); 114 } 115 116 121 public void setupIndexesForCompositeFunction(int function, boolean all) { 122 int size = composite_tables.length; 123 table_indexes = new IntegerVector[size]; 124 125 if (function == UNION) { 126 for (int i = 0; i < size; ++i) { 128 table_indexes[i] = composite_tables[i].selectAll(); 129 } 130 if (!all) { 131 removeDuplicates(false); 132 } 133 } 134 else { 135 throw new Error ("Unrecognised composite function"); 136 } 137 138 } 139 140 142 public Database getDatabase() { 143 return master_table.getDatabase(); 144 } 145 146 public int getColumnCount() { 147 return master_table.getColumnCount(); 148 } 149 150 public int getRowCount() { 151 int row_count = 0; 152 for (int i = 0; i < table_indexes.length; ++i) { 153 row_count += table_indexes[i].size(); 154 } 155 return row_count; 156 } 157 158 public int findFieldName(Variable v) { 159 return master_table.findFieldName(v); 160 } 161 162 public DataTableDef getDataTableDef() { 163 return master_table.getDataTableDef(); 164 } 165 166 public Variable getResolvedVariable(int column) { 167 return master_table.getResolvedVariable(column); 168 } 169 170 SelectableScheme getSelectableSchemeFor(int column, 171 int original_column, Table table) { 172 173 SelectableScheme scheme = column_scheme[column]; 174 if (scheme == null) { 175 scheme = new BlindSearch(this, column); 176 column_scheme[column] = scheme; 177 } 178 179 if (table == this) { 182 return scheme; 183 } 184 else { 186 return scheme.getSubsetScheme(table, original_column); 187 } 188 } 189 190 void setToRowTableDomain(int column, IntegerVector row_set, 191 TableDataSource ancestor) { 192 if (ancestor != this) { 193 throw new RuntimeException ("Method routed to incorrect table ancestor."); 194 } 195 } 196 197 RawTableInformation resolveToRawTable(RawTableInformation info) { 198 System.err.println("Efficiency Warning in DataTable.resolveToRawTable."); 199 IntegerVector row_set = new IntegerVector(); 200 RowEnumeration e = rowEnumeration(); 201 while (e.hasMoreRows()) { 202 row_set.addInt(e.nextRowIndex()); 203 } 204 info.add(this, row_set); 205 return info; 206 } 207 208 public TObject getCellContents(int column, int row) { 209 for (int i = 0; i < table_indexes.length; ++i) { 210 IntegerVector ivec = table_indexes[i]; 211 int sz = ivec.size(); 212 if (row < sz) { 213 return composite_tables[i].getCellContents(column, ivec.intAt(row)); 214 } 215 else { 216 row -= sz; 217 } 218 } 219 throw new Error ("Row '" + row + "' out of bounds."); 220 } 221 222 public RowEnumeration rowEnumeration() { 223 return new SimpleRowEnumeration(getRowCount()); 224 } 225 226 void addDataTableListener(DataTableListener listener) { 227 for (int i = 0; i < composite_tables.length; ++i) { 228 composite_tables[i].addDataTableListener(listener); 229 } 230 } 231 232 void removeDataTableListener(DataTableListener listener) { 233 for (int i = 0; i < composite_tables.length; ++i) { 234 composite_tables[i].removeDataTableListener(listener); 235 } 236 } 237 238 public void lockRoot(int lock_key) { 239 roots_locked++; 241 for (int i = 0; i < composite_tables.length; ++i) { 242 composite_tables[i].lockRoot(lock_key); 243 } 244 } 245 246 public void unlockRoot(int lock_key) { 247 roots_locked--; 249 for (int i = 0; i < composite_tables.length; ++i) { 250 composite_tables[i].unlockRoot(lock_key); 251 } 252 } 253 254 public boolean hasRootsLocked() { 255 return roots_locked != 0; 256 } 257 258 260 public boolean typeEquals(RootTable table) { 261 return (this == table); 262 } 264 265 } 266 | Popular Tags |