1 24 25 package com.mckoi.database; 26 27 import java.util.Vector ; 28 import com.mckoi.util.SortUtil; 30 import com.mckoi.util.IntegerVector; 31 32 42 43 final class RawTableInformation { 44 45 49 private Vector raw_info; 50 51 54 RawTableInformation() { 55 raw_info = new Vector (); 56 } 57 58 62 void add(RootTable table, IntegerVector row_set) { 63 RawTableElement elem = new RawTableElement(); 64 elem.table = table; 65 elem.row_set = row_set; 66 raw_info.addElement(elem); 67 } 68 69 73 Table[] getTables() { 74 int size = raw_info.size(); 75 Table[] list = new Table[size]; 76 for (int i = 0; i < size; ++i) { 77 list[i] = (Table) ((RawTableElement) raw_info.elementAt(i)).table; 78 } 79 return list; 80 } 81 82 86 IntegerVector[] getRows() { 87 int size = raw_info.size(); 88 IntegerVector[] list = new IntegerVector[size]; 89 for (int i = 0; i < size; ++i) { 90 list[i] = ((RawTableElement) raw_info.elementAt(i)).row_set; 91 } 92 return list; 93 } 94 95 98 protected RawTableElement[] getSortedElements() { 99 RawTableElement[] list = new RawTableElement[raw_info.size()]; 100 raw_info.copyInto(list); 101 SortUtil.quickSort(list); 102 return list; 103 } 104 105 113 void union(RawTableInformation info) { 114 115 117 int col_count = raw_info.size(); 118 119 121 RawTableElement[] merge1 = getSortedElements(); 122 RawTableElement[] merge2 = info.getSortedElements(); 123 124 126 int size1 = -1; 127 int size2 = -1; 128 129 131 if (merge1.length != merge2.length) { 132 throw new Error ("Incorrect format in table union"); 133 } 134 135 137 for (int i = 0; i < merge1.length; ++i) { 138 if (size1 == -1) { 139 size1 = merge1[i].row_set.size(); 140 } 141 else { 142 if (size1 != merge1[i].row_set.size()) { 143 throw new Error ("Incorrect format in table union"); 144 } 145 } 146 } 147 148 150 for (int i = 0; i < merge2.length; ++i) { 151 152 156 if (!merge2[i].table.typeEquals(merge1[i].table)) { 157 throw new Error ("Incorrect format in table union"); 158 } 159 160 if (size2 == -1) { 161 size2 = merge2[i].row_set.size(); 162 } 163 else { 164 if (size2 != merge2[i].row_set.size()) { 165 throw new Error ("Incorrect format in table union"); 166 } 167 } 168 } 169 170 173 if (size1 == -1 || size2 == -1) { 174 throw new Error ("Incorrect format in table union"); 175 } 176 177 180 raw_info.removeAllElements(); 181 182 184 int merge_size = size1 + size2; 185 RawRowElement[] elems = new RawRowElement[merge_size]; 186 int elems_index = 0; 187 188 for (int i = 0; i < size1; ++i) { 189 RawRowElement e = new RawRowElement(); 190 e.row_vals = new int[col_count]; 191 192 for (int n = 0; n < col_count; ++n) { 193 e.row_vals[n] = merge1[n].row_set.intAt(i); 194 } 195 elems[elems_index] = e; 196 ++elems_index; 197 } 198 199 for (int i = 0; i < size2; ++i) { 200 RawRowElement e = new RawRowElement(); 201 e.row_vals = new int[col_count]; 202 203 for (int n = 0; n < col_count; ++n) { 204 e.row_vals[n] = merge2[n].row_set.intAt(i); 205 } 206 elems[elems_index] = e; 207 ++elems_index; 208 } 209 210 212 SortUtil.quickSort(elems); 213 214 217 for (int i = 0; i < col_count; ++i) { 218 RawTableElement e = merge1[i]; 219 e.row_set.clear(); 220 } 221 RawRowElement previous = null; 222 RawRowElement current = null; 223 for (int n = 0; n < merge_size; ++n) { 224 current = elems[n]; 225 226 229 if (previous == null || previous.compareTo(current) != 0) { 230 for (int i = 0; i < col_count; ++i) { 231 merge1[i].row_set.addInt(current.row_vals[i]); 232 } 233 previous = current; 234 } 235 } 236 237 for (int i = 0; i < col_count; ++i) { 238 raw_info.addElement(merge1[i]); 239 } 240 241 } 242 243 246 void removeDuplicates() { 247 248 250 if (raw_info.size() == 0) { 251 return; 252 } 253 254 257 RawTableElement elen = (RawTableElement) raw_info.elementAt(0); 258 int len = elen.row_set.size(); 259 if (len == 0) { 260 return; 261 } 262 263 265 RawRowElement[] elems = new RawRowElement[len]; 266 int width = raw_info.size(); 267 268 270 RawTableElement[] rdup = new RawTableElement[width]; 271 raw_info.copyInto(rdup); 272 273 276 for (int i = 0; i < len; ++i) { 277 RawRowElement e = new RawRowElement(); 278 e.row_vals = new int[width]; 279 for (int n = 0; n < width; ++n) { 280 e.row_vals[n] = rdup[n].row_set.intAt(i); 281 } 282 elems[i] = e; 283 } 284 285 288 290 SortUtil.quickSort(elems); 291 292 294 raw_info.removeAllElements(); 295 296 298 RawTableElement[] table_elements = rdup; 299 300 303 for (int i = 0; i < width; ++i) { 304 table_elements[i].row_set.clear(); 305 } 306 RawRowElement previous = null; 307 RawRowElement current = null; 308 for (int n = 0; n < len; ++n) { 309 current = elems[n]; 310 311 314 if (previous == null || previous.compareTo(current) != 0) { 315 for (int i = 0; i < width; ++i) { 316 table_elements[i].row_set.addInt(current.row_vals[i]); 317 } 318 previous = current; 319 } 320 } 321 322 for (int i = 0; i < width; ++i) { 323 raw_info.addElement(table_elements[i]); 324 } 325 326 } 327 328 } 329 330 334 final class RawTableElement implements Comparable { 335 336 RootTable table; 337 IntegerVector row_set; 338 339 public int compareTo(Object o) { 340 RawTableElement rte = (RawTableElement) o; 341 return table.hashCode() - rte.table.hashCode(); 342 } 343 344 } 345 346 351 final class RawRowElement implements Comparable { 352 353 int[] row_vals; 354 355 public int compareTo(Object o) { 356 RawRowElement rre = (RawRowElement) o; 357 358 int size = row_vals.length; 359 for (int i = 0; i < size; ++i) { 360 int v1 = row_vals[i]; 361 int v2 = rre.row_vals[i]; 362 if (v1 != v2) { 363 return v1 - v2; 364 } 365 } 366 return 0; 367 } 368 369 } 370 | Popular Tags |