|                                                                                                              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                                                                                                                                                                                              |