1 24 25 package com.mckoi.database; 26 27 import java.io.*; 28 import com.mckoi.util.IntegerVector; 29 import com.mckoi.util.BlockIntegerList; 30 31 50 51 public abstract class CollatedBaseSearch extends SelectableScheme { 52 53 56 public CollatedBaseSearch(TableDataSource table, int column) { 57 super(table, column); 58 } 59 60 63 public void insert(int row) { 64 if (isImmutable()) { 66 throw new Error ("Tried to change an immutable scheme."); 67 } 68 } 69 70 73 public void remove(int row) { 74 if (isImmutable()) { 76 throw new Error ("Tried to change an immutable scheme."); 77 } 78 } 79 80 85 public void readFrom(InputStream in) throws IOException { 86 } 87 88 93 public void writeTo(OutputStream out) throws IOException { 94 } 95 96 99 public void dispose() { 100 } 102 103 104 106 111 protected abstract int searchFirst(TObject val); 112 113 118 protected abstract int searchLast(TObject val); 119 120 123 protected int setSize() { 124 return getTable().getRowCount(); 125 } 126 127 131 protected TObject firstInCollationOrder() { 132 return getCellContents(0); 133 } 134 135 139 protected TObject lastInCollationOrder() { 140 return getCellContents(setSize() - 1); 141 } 142 143 147 protected IntegerVector addRangeToSet(int start, int end, 148 IntegerVector ivec) { 149 if (ivec == null) { 150 ivec = new IntegerVector((end - start) + 2); 151 } 152 for (int i = start; i <= end; ++i) { 153 ivec.addInt(i); 154 } 155 return ivec; 156 } 157 158 160 public IntegerVector selectAll() { 161 return addRangeToSet(0, setSize() - 1, null); 162 } 163 164 175 private int positionOfRangePoint(byte flag, TObject val) { 176 int p; 177 TObject cell; 178 179 switch(flag) { 180 181 case(SelectableRange.FIRST_VALUE): 182 if (val == SelectableRange.FIRST_IN_SET) { 183 return 0; 184 } 185 if (val == SelectableRange.LAST_IN_SET) { 186 cell = lastInCollationOrder(); 188 } 189 else { 190 cell = val; 191 } 192 p = searchFirst(cell); 193 if (p < 0) { 195 return -(p + 1); 196 } 197 return p; 198 199 case(SelectableRange.LAST_VALUE): 200 if (val == SelectableRange.LAST_IN_SET) { 201 return setSize() - 1; 202 } 203 if (val == SelectableRange.FIRST_IN_SET) { 204 cell = firstInCollationOrder(); 206 } 207 else { 208 cell = val; 209 } 210 p = searchLast(cell); 211 if (p < 0) { 213 return -(p + 1) - 1; 214 } 215 return p; 216 217 case(SelectableRange.BEFORE_FIRST_VALUE): 218 if (val == SelectableRange.FIRST_IN_SET) { 219 return -1; 220 } 221 if (val == SelectableRange.LAST_IN_SET) { 222 cell = lastInCollationOrder(); 224 } 225 else { 226 cell = val; 227 } 228 p = searchFirst(cell); 229 if (p < 0) { 231 return -(p + 1) - 1; 232 } 233 return p - 1; 234 235 case(SelectableRange.AFTER_LAST_VALUE): 236 if (val == SelectableRange.LAST_IN_SET) { 237 return setSize(); 238 } 239 if (val == SelectableRange.FIRST_IN_SET) { 240 cell = firstInCollationOrder(); 242 } 243 else { 244 cell = val; 245 } 246 p = searchLast(cell); 247 if (p < 0) { 249 return -(p + 1); 250 } 251 return p + 1; 252 253 default: 254 throw new Error ("Unrecognised flag."); 255 } 256 257 } 258 259 263 private IntegerVector addRange(SelectableRange range, IntegerVector ivec) { 264 int r1, r2; 265 266 byte start_flag = range.getStartFlag(); 268 TObject start = range.getStart(); 269 byte end_flag = range.getEndFlag(); 270 TObject end = range.getEnd(); 271 272 r1 = positionOfRangePoint(start_flag, start); 273 r2 = positionOfRangePoint(end_flag, end); 274 275 if (r2 < r1) { 276 return ivec; 277 } 278 279 return addRangeToSet(r1, r2, ivec); 281 282 } 283 284 public IntegerVector selectRange(SelectableRange range) { 285 if (setSize() == 0) { 287 return new IntegerVector(0); 288 } 289 290 IntegerVector ivec = addRange(range, null); 291 if (ivec == null) { 292 return new IntegerVector(0); 293 } 294 295 return ivec; 296 } 297 298 public IntegerVector selectRange(SelectableRange[] ranges) { 299 if (setSize() == 0) { 301 return new IntegerVector(0); 302 } 303 304 IntegerVector ivec = null; 305 for (int i = 0; i < ranges.length; ++i) { 306 SelectableRange range = ranges[i]; 307 ivec = addRange(range, ivec); 308 } 309 310 if (ivec == null) { 311 return new IntegerVector(0); 312 } 313 return ivec; 314 315 } 316 317 } 318 319 | Popular Tags |