1 24 25 package com.mckoi.database; 26 27 import java.io.*; 28 import java.util.Arrays ; 29 import java.util.Comparator ; 30 import com.mckoi.util.IntegerVector; 31 import com.mckoi.util.BlockIntegerList; 32 33 49 50 public final class BlindSearch extends SelectableScheme { 51 52 55 public BlindSearch(TableDataSource table, int column) { 56 super(table, column); 57 } 58 59 62 public void insert(int row) { 63 if (isImmutable()) { 64 throw new Error ("Tried to change an immutable scheme."); 65 } 66 } 67 68 71 public void remove(int row) { 72 if (isImmutable()) { 73 throw new Error ("Tried to change an immutable scheme."); 74 } 75 } 76 77 82 public void readFrom(InputStream in) throws IOException { 83 } 84 85 90 public void writeTo(OutputStream out) throws IOException { 91 } 92 93 99 public SelectableScheme copy(TableDataSource table, boolean immutable) { 100 return new BlindSearch(table, getColumn()); 103 } 104 105 108 public void dispose() { 109 } 111 112 116 117 123 private int search(TObject ob, IntegerVector vec, int lower, int higher) { 124 if (lower >= higher) { 125 if (ob.compareTo(getCellContents(vec.intAt(lower))) > 0) { 126 return lower + 1; 127 } 128 else { 129 return lower; 130 } 131 } 132 133 int mid = lower + ((higher - lower) / 2); 134 int comp_result = ob.compareTo(getCellContents(vec.intAt(mid))); 135 136 if (comp_result == 0) { 137 return mid; 138 } 139 else if (comp_result < 0) { 140 return search(ob, vec, lower, mid - 1); 141 } 142 else { 143 return search(ob, vec, mid + 1, higher); 144 } 145 146 } 147 148 156 private int highestSearch(TObject ob, IntegerVector vec, 157 int lower, int higher) { 158 159 if ((higher - lower) <= 5) { 160 for (int i = higher; i >= lower; --i) { 162 int res = ob.compareTo(getCellContents(vec.intAt(i))); 163 if (res >= 0) { 164 return i + 1; 165 } 166 } 167 return lower; 169 } 170 171 int mid = (lower + higher) / 2; 172 int comp_result = ob.compareTo(getCellContents(vec.intAt(mid))); 173 174 if (comp_result == 0) { 175 return highestSearch(ob, vec, mid, higher); 177 } 178 else if (comp_result < 0) { 179 return highestSearch(ob, vec, lower, mid - 1); 180 } 181 else { 182 return highestSearch(ob, vec, mid + 1, higher); 183 } 184 } 185 186 187 private void doInsertSort(IntegerVector vec, int row) { 188 int list_size = vec.size(); 189 if (list_size == 0) { 190 vec.addInt(row); 191 } 192 else { 193 int point = highestSearch(getCellContents(row), vec, 0, list_size - 1); 194 if (point == list_size) { 195 vec.addInt(row); 196 } 197 else { 198 vec.insertIntAt(row, point); 199 } 200 } 201 } 202 203 public IntegerVector selectAll() { 204 IntegerVector row_list = new IntegerVector(getTable().getRowCount()); 205 RowEnumeration e = getTable().rowEnumeration(); 206 while (e.hasMoreRows()) { 207 doInsertSort(row_list, e.nextRowIndex()); 208 } 209 return row_list; 210 } 211 212 213 214 public IntegerVector selectRange(SelectableRange range) { 215 int set_size = getTable().getRowCount(); 216 if (set_size == 0) { 218 return new IntegerVector(0); 219 } 220 221 return selectRange(new SelectableRange[] { range } ); 222 } 223 224 public IntegerVector selectRange(SelectableRange[] ranges) { 225 int set_size = getTable().getRowCount(); 226 if (set_size == 0) { 228 return new IntegerVector(0); 229 } 230 231 RangeChecker checker = new RangeChecker(ranges); 232 return checker.resolve(); 233 } 234 235 236 238 241 final class RangeChecker { 242 243 247 private IntegerVector sorted_set = null; 248 249 253 private byte[] lower_flags; 254 private byte[] upper_flags; 255 256 259 private TObject[] lower_cells; 260 private TObject[] upper_cells; 261 262 265 public RangeChecker(SelectableRange[] ranges) { 266 int size = ranges.length; 267 lower_flags = new byte[size]; 268 upper_flags = new byte[size]; 269 lower_cells = new TObject[size]; 270 upper_cells = new TObject[size]; 271 for (int i = 0; i < ranges.length; ++i) { 272 setupRange(i, ranges[i]); 273 } 274 } 275 276 private void resolveSortedSet() { 277 if (sorted_set == null) { 278 sorted_set = selectAll(); 280 } 281 } 282 283 286 private TObject resolveCell(TObject ob) { 287 if (ob == SelectableRange.FIRST_IN_SET) { 288 resolveSortedSet(); 289 return getCellContents(sorted_set.intAt(0)); 290 291 } 292 else if (ob == SelectableRange.LAST_IN_SET) { 293 resolveSortedSet(); 294 return getCellContents(sorted_set.intAt(sorted_set.size() - 1)); 295 } 296 else { 297 return ob; 298 } 299 } 300 301 304 public void setupRange(int i, SelectableRange range) { 305 TObject l = range.getStart(); 306 byte lf = range.getStartFlag(); 307 TObject u = range.getEnd(); 308 byte uf = range.getEndFlag(); 309 310 if (l == SelectableRange.FIRST_IN_SET && 312 lf == SelectableRange.FIRST_VALUE) { 313 lower_flags[i] = 0; 315 } 316 else { 317 if (lf == SelectableRange.FIRST_VALUE) { 318 lower_flags[i] = 2; } 320 else if (lf == SelectableRange.AFTER_LAST_VALUE) { 321 lower_flags[i] = 1; } 323 else { 324 throw new Error ("Incorrect lower flag."); 325 } 326 lower_cells[i] = resolveCell(l); 327 } 328 329 if (u == SelectableRange.LAST_IN_SET && 331 uf == SelectableRange.LAST_VALUE) { 332 upper_flags[i] = 0; 334 } 335 else { 336 if (uf == SelectableRange.LAST_VALUE) { 337 upper_flags[i] = 2; } 339 else if (uf == SelectableRange.BEFORE_FIRST_VALUE) { 340 upper_flags[i] = 1; } 342 else { 343 throw new Error ("Incorrect upper flag."); 344 } 345 upper_cells[i] = resolveCell(u); 346 } 347 348 } 349 350 353 public IntegerVector resolve() { 354 IntegerVector ivec = new IntegerVector(); 357 RowEnumeration e = getTable().rowEnumeration(); 358 359 int compare_tally = 0; 360 361 int size = lower_flags.length; 362 while (e.hasMoreRows()) { 363 int row = e.nextRowIndex(); 364 range_set: 366 for (int i = 0; i < size; ++i) { 367 boolean result = true; 368 byte lf = lower_flags[i]; 369 if (lf != 0) { 370 ++compare_tally; 371 TObject v = getCellContents(row); 372 int compare = lower_cells[i].compareTo(v); 373 if (lf == 1) { result = (compare < 0); 375 } 376 else if (lf == 2) { result = (compare <= 0); 378 } 379 else { 380 throw new Error ("Incorrect flag."); 381 } 382 } 383 if (result) { 384 byte uf = upper_flags[i]; 385 if (uf != 0) { 386 ++compare_tally; 387 TObject v = getCellContents(row); 388 int compare = upper_cells[i].compareTo(v); 389 if (uf == 1) { result = (compare > 0); 391 } 392 else if (uf == 2) { result = (compare >= 0); 394 } 395 else { 396 throw new Error ("Incorrect flag."); 397 } 398 } 399 if (result) { 401 doInsertSort(ivec, row); 402 break range_set; 403 } 404 } 405 } 406 } 407 408 410 return ivec; 411 } 412 413 } 414 415 } 416 417 | Popular Tags |