1 24 25 package com.mckoi.database; 26 27 import java.util.ArrayList ; 28 import com.mckoi.util.IntegerVector; 29 30 37 38 class OuterTable extends VirtualTable implements RootTable { 39 40 43 public IntegerVector[] outer_rows; 44 45 48 private int outer_row_count; 49 50 53 public OuterTable(Table input_table) { 54 super(); 55 56 RawTableInformation base_table = 57 input_table.resolveToRawTable(new RawTableInformation()); 58 Table[] tables = base_table.getTables(); 59 IntegerVector[] rows = base_table.getRows(); 60 61 outer_rows = new IntegerVector[rows.length]; 62 63 init(tables); 65 set(tables, rows); 66 67 } 68 69 72 public void mergeIn(Table outside_table) { 73 RawTableInformation raw_table_info = 74 outside_table.resolveToRawTable(new RawTableInformation()); 75 76 Table[] base_tables = getReferenceTables(); 78 IntegerVector[] base_rows = getReferenceRows(); 79 80 Table[] tables = raw_table_info.getTables(); 82 IntegerVector[] rows = raw_table_info.getRows(); 83 outer_row_count = rows[0].size(); 85 86 for (int i = 0; i < base_tables.length; ++i) { 87 Table btable = base_tables[i]; 88 int index = -1; 89 for (int n = 0; n < tables.length && index == -1; ++n) { 90 if (btable == tables[n]) { 91 index = n; 92 } 93 } 94 95 if (index == -1) { 97 outer_rows[i] = null; 98 } 99 else { 100 IntegerVector list = new IntegerVector(outer_row_count); 101 outer_rows[i] = list; 102 IntegerVector to_merge = rows[index]; 104 if (to_merge.size() != outer_row_count) { 105 throw new Error ("Wrong size for rows being merged in."); 106 } 107 list.append(to_merge); 108 } 109 110 } 111 112 } 113 114 116 119 public int getRowCount() { 120 return super.getRowCount() + outer_row_count; 121 } 122 123 133 SelectableScheme getSelectableSchemeFor(int column, int original_column, 134 Table table) { 135 136 if (column_scheme[column] == null) { 137 SelectableScheme scheme = new BlindSearch(this, column); 139 column_scheme[column] = scheme.getSubsetScheme(this, column); 140 } 141 142 if (table == this) { 143 return column_scheme[column]; 144 } 145 else { 146 return column_scheme[column].getSubsetScheme(table, original_column); 147 } 148 149 } 150 151 155 public TObject getCellContents(int column, int row) { 156 int table_num = column_table[column]; 157 Table parent_table = reference_list[table_num]; 158 if (row >= outer_row_count) { 159 row = row_list[table_num].intAt(row - outer_row_count); 160 return parent_table.getCellContents(column_filter[column], row); 161 } 162 else { 163 if (outer_rows[table_num] == null) { 164 return new TObject(getColumnDefAt(column).getTType(), null); 166 } 167 else { 168 row = outer_rows[table_num].intAt(row); 169 return parent_table.getCellContents(column_filter[column], row); 170 } 171 } 172 } 173 174 176 181 public boolean typeEquals(RootTable table) { 182 return (this == table); 183 } 184 185 } 186 | Popular Tags |