1 24 25 package com.mckoi.database; 26 27 import com.mckoi.util.IntegerVector; 28 import com.mckoi.util.BlockIntegerList; 29 30 37 38 public abstract class JoinedTable extends Table { 39 40 43 protected Table[] reference_list; 44 45 48 protected SelectableScheme[] column_scheme; 49 50 55 59 protected int[] column_table; 60 61 65 protected int[] column_filter; 66 67 71 private int sorted_against_column = -1; 72 73 77 private DataTableDef vt_table_def; 78 79 84 private byte roots_locked; 85 86 89 JoinedTable(Table[] tables) { 90 super(); 91 init(tables); 92 } 93 94 97 JoinedTable(Table table) { 98 super(); 99 Table[] tables = new Table[1]; 100 tables[0] = table; 101 init(tables); 102 } 103 104 107 protected JoinedTable() { 108 super(); 109 } 110 111 114 protected void init(Table[] tables) { 115 int table_count = tables.length; 116 reference_list = tables; 117 118 final int col_count = getColumnCount(); 119 column_scheme = new SelectableScheme[col_count]; 120 121 vt_table_def = new DataTableDef(); 122 123 125 column_table = new int[col_count]; 126 column_filter = new int[col_count]; 127 int index = 0; 128 for (int i = 0; i < reference_list.length; ++i) { 129 130 Table cur_table = reference_list[i]; 131 DataTableDef cur_table_def = cur_table.getDataTableDef(); 132 int ref_col_count = cur_table.getColumnCount(); 133 134 for (int n = 0; n < ref_col_count; ++n) { 136 column_filter[index] = n; 137 column_table[index] = i; 138 ++index; 139 140 vt_table_def.addVirtualColumn( 142 new DataTableColumnDef(cur_table_def.columnAt(n))); 143 } 144 145 } 146 147 149 vt_table_def.setTableName(new TableName(null, "#VIRTUAL TABLE#")); 150 151 vt_table_def.setImmutable(); 152 153 } 154 155 161 private IntegerVector calculateRowReferenceList() { 162 int size = getRowCount(); 163 IntegerVector all_list = new IntegerVector(size); 164 for (int i = 0; i < size; ++i) { 165 all_list.addInt(i); 166 } 167 return all_list; 168 } 169 170 173 public Database getDatabase() { 174 return reference_list[0].getDatabase(); 175 } 176 177 181 public int getColumnCount() { 182 int column_count_sum = 0; 183 for (int i = 0; i < reference_list.length; ++i) { 184 column_count_sum += reference_list[i].getColumnCount(); 185 } 186 return column_count_sum; 187 } 188 189 194 public int findFieldName(Variable v) { 195 int col_index = 0; 196 for (int i = 0; i < reference_list.length; ++i) { 197 int col = reference_list[i].findFieldName(v); 198 if (col != -1) { 199 return col + col_index; 200 } 201 col_index += reference_list[i].getColumnCount(); 202 } 203 return -1; 204 } 205 206 211 public final Variable getResolvedVariable(int column) { 212 Table parent_table = reference_list[column_table[column]]; 213 return parent_table.getResolvedVariable(column_filter[column]); 214 } 215 216 219 protected final Table[] getReferenceTables() { 220 return reference_list; 221 } 222 223 235 void optimisedPostSet(int column) { 236 sorted_against_column = column; 237 } 238 239 245 SelectableScheme getSelectableSchemeFor(int column, int original_column, 246 Table table) { 247 248 SelectableScheme scheme = column_scheme[column]; 250 if (scheme != null) { 251 if (table == this) { 252 return scheme; 253 } 254 else { 255 return scheme.getSubsetScheme(table, original_column); 256 } 257 } 258 259 SelectableScheme ss; 261 262 if (sorted_against_column != -1 && 265 sorted_against_column == column) { 266 InsertSearch isop = 267 new InsertSearch(this, column, calculateRowReferenceList()); 268 isop.RECORD_UID = false; 269 ss = isop; 270 column_scheme[column] = ss; 271 if (table != this) { 272 ss = ss.getSubsetScheme(table, original_column); 273 } 274 275 } 276 else { 277 Table parent_table = reference_list[column_table[column]]; 280 ss = parent_table.getSelectableSchemeFor( 281 column_filter[column], original_column, table); 282 if (table == this) { 283 column_scheme[column] = ss; 284 } 285 } 286 287 return ss; 288 } 289 290 297 void setToRowTableDomain(int column, IntegerVector row_set, 298 TableDataSource ancestor) { 299 300 if (ancestor == this) { 301 return; 302 } 303 else { 304 305 int table_num = column_table[column]; 306 Table parent_table = reference_list[table_num]; 307 308 resolveAllRowsForTableAt(row_set, table_num); 310 311 parent_table.setToRowTableDomain(column_filter[column], row_set, ancestor); 312 return; 313 } 314 } 315 316 322 RawTableInformation resolveToRawTable(RawTableInformation info, 323 IntegerVector row_set) { 324 325 if (this instanceof RootTable) { 326 info.add((RootTable) this, calculateRowReferenceList()); 327 } 328 else { 329 for (int i = 0; i < reference_list.length; ++i) { 330 331 IntegerVector new_row_set = new IntegerVector(row_set); 332 333 resolveAllRowsForTableAt(new_row_set, i); 335 336 Table table = reference_list[i]; 337 if (table instanceof RootTable) { 338 info.add((RootTable) table, new_row_set); 339 } 340 else { 341 ((JoinedTable) table).resolveToRawTable(info, new_row_set); 342 } 343 } 344 } 345 346 return info; 347 } 348 349 353 RawTableInformation resolveToRawTable(RawTableInformation info) { 354 IntegerVector all_list = new IntegerVector(); 355 int size = getRowCount(); 356 for (int i = 0; i < size; ++i) { 357 all_list.addInt(i); 358 } 359 return resolveToRawTable(info, all_list); 360 } 361 362 369 public DataTableDef getDataTableDef() { 370 return vt_table_def; 371 } 372 373 377 public TObject getCellContents(int column, int row) { 378 int table_num = column_table[column]; 379 Table parent_table = reference_list[table_num]; 380 row = resolveRowForTableAt(row, table_num); 381 return parent_table.getCellContents(column_filter[column], row); 382 } 383 384 388 public RowEnumeration rowEnumeration() { 389 return new SimpleRowEnumeration(getRowCount()); 390 } 391 392 402 void addDataTableListener(DataTableListener listener) { 403 for (int i = 0; i < reference_list.length; ++i) { 404 reference_list[i].addDataTableListener(listener); 405 } 406 } 407 408 414 void removeDataTableListener(DataTableListener listener) { 415 for (int i = 0; i < reference_list.length; ++i) { 416 reference_list[i].removeDataTableListener(listener); 417 } 418 } 419 420 421 429 public void lockRoot(int lock_key) { 430 roots_locked++; 432 for (int i = 0; i < reference_list.length; ++i) { 433 reference_list[i].lockRoot(lock_key); 434 } 435 } 436 437 442 public void unlockRoot(int lock_key) { 443 roots_locked--; 445 for (int i = 0; i < reference_list.length; ++i) { 446 reference_list[i].unlockRoot(lock_key); 447 } 448 } 449 450 454 public boolean hasRootsLocked() { 455 return roots_locked != 0; 456 } 457 458 459 462 public void printGraph(java.io.PrintStream out, int indent) { 463 for (int i = 0; i < indent; ++i) { 464 out.print(' '); 465 } 466 out.println("JT[" + getClass()); 467 468 for (int i = 0; i < reference_list.length; ++i) { 469 reference_list[i].printGraph(out, indent + 2); 470 } 471 472 for (int i = 0; i < indent; ++i) { 473 out.print(' '); 474 } 475 out.println("]"); 476 } 477 478 480 484 protected abstract int resolveRowForTableAt(int row_number, int table_num); 485 486 491 protected abstract void 492 resolveAllRowsForTableAt(IntegerVector row_set, int table_num); 493 494 495 } 496 497 | Popular Tags |