1 24 25 package com.mckoi.database; 26 27 import java.io.IOException ; 28 import java.io.ObjectOutputStream ; 29 import java.util.Locale ; 30 import com.mckoi.util.BigNumber; 31 import com.mckoi.database.global.ByteLongObject; 32 import com.mckoi.database.global.BlobRef; 33 import com.mckoi.database.global.ClobRef; 34 import com.mckoi.database.global.SQLTypes; 35 import com.mckoi.database.global.StringObject; 36 37 44 45 public final class TObject implements java.io.Serializable { 46 47 static final long serialVersionUID = -5129157457207765079L; 48 49 52 private TType type; 53 54 57 private Object ob; 58 59 62 public TObject(TType type, Object ob) { 63 this.type = type; 64 if (ob instanceof String ) { 65 this.ob = StringObject.fromString((String ) ob); 66 } 67 else { 68 this.ob = ob; 69 } 70 } 71 72 75 public TType getTType() { 76 return type; 77 } 78 79 83 public boolean isNull() { 84 return (getObject() == null); 85 } 86 87 90 public Object getObject() { 91 return ob; 92 } 93 94 99 public int approximateMemoryUse() { 100 return getTType().calculateApproximateMemoryUse(getObject()); 101 } 102 103 109 public boolean comparableTypes(TObject ob) { 110 return getTType().comparableTypes(ob.getTType()); 111 } 112 113 118 public BigNumber toBigNumber() { 119 if (getTType() instanceof TNumericType) { 120 return (BigNumber) getObject(); 121 } 122 return null; 123 } 124 125 130 public Boolean toBoolean() { 131 if (getTType() instanceof TBooleanType) { 132 return (Boolean ) getObject(); 133 } 134 return null; 135 } 136 137 142 public String toStringValue() { 143 if (getTType() instanceof TStringType) { 144 return getObject().toString(); 145 } 146 return null; 147 } 148 149 150 public static final TObject BOOLEAN_TRUE = 151 new TObject(TType.BOOLEAN_TYPE, Boolean.TRUE); 152 public static final TObject BOOLEAN_FALSE = 153 new TObject(TType.BOOLEAN_TYPE, Boolean.FALSE); 154 public static final TObject BOOLEAN_NULL = 155 new TObject(TType.BOOLEAN_TYPE, null); 156 157 public static final TObject NULL_OBJECT = 158 new TObject(TType.NULL_TYPE, null); 159 160 163 public static TObject booleanVal(boolean b) { 164 if (b) { 165 return BOOLEAN_TRUE; 166 } 167 return BOOLEAN_FALSE; 168 } 169 170 173 public static TObject intVal(int val) { 174 return bigNumberVal(BigNumber.fromLong(val)); 175 } 176 177 180 public static TObject longVal(long val) { 181 return bigNumberVal(BigNumber.fromLong(val)); 182 } 183 184 187 public static TObject doubleVal(double val) { 188 return bigNumberVal(BigNumber.fromDouble(val)); 189 } 190 191 195 public static TObject bigNumberVal(BigNumber val) { 196 return new TObject(TType.NUMERIC_TYPE, val); 197 } 198 199 203 public static TObject stringVal(StringObject str) { 204 return new TObject(TType.STRING_TYPE, str); 205 } 206 207 210 public static TObject stringVal(String str) { 211 return new TObject(TType.STRING_TYPE, StringObject.fromString(str)); 212 } 213 214 217 public static TObject dateVal(java.util.Date d) { 218 return new TObject(TType.DATE_TYPE, d); 219 } 220 221 224 public static TObject nullVal() { 225 return NULL_OBJECT; 226 } 227 228 231 public static TObject objectVal(Object ob) { 232 if (ob == null) { 233 return nullVal(); 234 } 235 else if (ob instanceof BigNumber) { 236 return bigNumberVal((BigNumber) ob); 237 } 238 else if (ob instanceof StringObject) { 239 return stringVal((StringObject) ob); 240 } 241 else if (ob instanceof Boolean ) { 242 return booleanVal(((Boolean ) ob).booleanValue()); 243 } 244 else if (ob instanceof java.util.Date ) { 245 return dateVal((java.util.Date ) ob); 246 } 247 else if (ob instanceof ByteLongObject) { 248 return new TObject(TType.BINARY_TYPE, (ByteLongObject) ob); 249 } 250 else if (ob instanceof byte[]) { 251 return new TObject(TType.BINARY_TYPE, new ByteLongObject((byte[]) ob)); 252 } 253 else if (ob instanceof BlobRef) { 254 return new TObject(TType.BINARY_TYPE, (BlobRef) ob); 255 } 256 else if (ob instanceof ClobRef) { 257 return new TObject(TType.STRING_TYPE, (ClobRef) ob); 258 } 259 else { 260 throw new Error ("Don't know how to convert object type " + ob.getClass()); 261 } 262 } 263 264 273 public int compareToNoNulls(TObject tob) { 274 TType type = getTType(); 275 if (type instanceof TStringType) { 277 TStringType stype = (TStringType) type; 279 if (stype.getLocale() == null) { 282 type = tob.getTType(); 283 } 284 } 285 return type.compareObs(getObject(), tob.getObject()); 286 } 287 288 289 298 public int compareTo(TObject tob) { 299 if (isNull()) { 301 if (tob.isNull()) { 303 return 0; 304 } 305 else { 306 return -1; 307 } 308 } 309 else { 310 if (tob.isNull()) { 312 return 1; 313 } 314 else { 315 return compareToNoNulls(tob); 317 } 318 } 319 } 320 321 327 public boolean equals(Object ob) { 328 throw new Error ("equals method should not be used."); 329 } 330 331 336 public boolean valuesEqual(TObject ob) { 337 if (this == ob) { 338 return true; 339 } 340 if (getTType().comparableTypes(ob.getTType())) { 341 return compareTo(ob) == 0; 342 } 343 return false; 344 } 345 346 347 348 350 356 public TObject operatorOr(TObject val) { 357 BigNumber v1 = toBigNumber(); 358 BigNumber v2 = val.toBigNumber(); 359 TType result_type = TType.getWidestType(getTType(), val.getTType()); 360 361 if (v1 == null || v2 == null) { 362 return new TObject(result_type, null); 363 } 364 365 return new TObject(result_type, v1.bitWiseOr(v2)); 366 } 367 368 374 public TObject operatorAdd(TObject val) { 375 BigNumber v1 = toBigNumber(); 376 BigNumber v2 = val.toBigNumber(); 377 TType result_type = TType.getWidestType(getTType(), val.getTType()); 378 379 if (v1 == null || v2 == null) { 380 return new TObject(result_type, null); 381 } 382 383 return new TObject(result_type, v1.add(v2)); 384 } 385 386 392 public TObject operatorSubtract(TObject val) { 393 BigNumber v1 = toBigNumber(); 394 BigNumber v2 = val.toBigNumber(); 395 TType result_type = TType.getWidestType(getTType(), val.getTType()); 396 397 if (v1 == null || v2 == null) { 398 return new TObject(result_type, null); 399 } 400 401 return new TObject(result_type, v1.subtract(v2)); 402 } 403 404 410 public TObject operatorMultiply(TObject val) { 411 BigNumber v1 = toBigNumber(); 412 BigNumber v2 = val.toBigNumber(); 413 TType result_type = TType.getWidestType(getTType(), val.getTType()); 414 415 if (v1 == null || v2 == null) { 416 return new TObject(result_type, null); 417 } 418 419 return new TObject(result_type, v1.multiply(v2)); 420 } 421 422 428 public TObject operatorDivide(TObject val) { 429 BigNumber v1 = toBigNumber(); 430 BigNumber v2 = val.toBigNumber(); 431 TType result_type = TType.getWidestType(getTType(), val.getTType()); 432 433 if (v1 == null || v2 == null) { 434 return new TObject(result_type, null); 435 } 436 437 return new TObject(result_type, v1.divide(v2)); 438 } 439 440 449 public TObject operatorConcat(TObject val) { 450 451 if (isNull()) { 453 return this; 454 } 455 else if (val.isNull()) { 456 return val; 457 } 458 459 TType tt1 = getTType(); 460 TType tt2 = val.getTType(); 461 462 if (tt1 instanceof TStringType && 463 tt2 instanceof TStringType) { 464 TStringType st1 = (TStringType) tt1; 466 TStringType st2 = (TStringType) tt2; 467 468 Locale str_locale = null; 469 int str_strength = 0; 470 int str_decomposition = 0; 471 472 if (st1.getLocale() != null) { 473 str_locale = st1.getLocale(); 474 str_strength = st1.getStrength(); 475 str_decomposition = st1.getDecomposition(); 476 } 477 else if (st2.getLocale() != null) { 478 str_locale = st2.getLocale(); 479 str_strength = st2.getStrength(); 480 str_decomposition = st2.getDecomposition(); 481 } 482 483 TStringType dest_type = st1; 484 if (str_locale != null) { 485 dest_type = new TStringType(SQLTypes.VARCHAR, -1, 486 str_locale, str_strength, str_decomposition); 487 } 488 489 return new TObject(dest_type, 490 StringObject.fromString(toStringValue() + val.toStringValue())); 491 492 } 493 494 return new TObject(tt1, null); 496 } 497 498 503 public TObject operatorIs(TObject val) { 504 if (isNull() && val.isNull()) { 505 return BOOLEAN_TRUE; 506 } 507 if (comparableTypes(val)) { 508 return booleanVal(compareTo(val) == 0); 509 } 510 return BOOLEAN_FALSE; 512 } 513 514 519 public TObject operatorEquals(TObject val) { 520 if (comparableTypes(val) && !isNull() && !val.isNull()) { 522 return booleanVal(compareToNoNulls(val) == 0); 523 } 524 return BOOLEAN_NULL; 526 } 527 528 533 public TObject operatorNotEquals(TObject val) { 534 if (comparableTypes(val) && !isNull() && !val.isNull()) { 536 return booleanVal(compareToNoNulls(val) != 0); 537 } 538 return BOOLEAN_NULL; 540 } 541 542 547 public TObject operatorGreater(TObject val) { 548 if (comparableTypes(val) && !isNull() && !val.isNull()) { 550 return booleanVal(compareToNoNulls(val) > 0); 551 } 552 return BOOLEAN_NULL; 554 } 555 556 561 public TObject operatorGreaterEquals(TObject val) { 562 if (comparableTypes(val) && !isNull() && !val.isNull()) { 564 return booleanVal(compareToNoNulls(val) >= 0); 565 } 566 return BOOLEAN_NULL; 568 } 569 570 575 public TObject operatorLess(TObject val) { 576 if (comparableTypes(val) && !isNull() && !val.isNull()) { 578 return booleanVal(compareToNoNulls(val) < 0); 579 } 580 return BOOLEAN_NULL; 582 } 583 584 589 public TObject operatorLessEquals(TObject val) { 590 if (comparableTypes(val) && !isNull() && !val.isNull()) { 592 return booleanVal(compareToNoNulls(val) <= 0); 593 } 594 return BOOLEAN_NULL; 596 } 597 598 599 600 603 public TObject operatorNot() { 604 if (isNull()) { 606 return this; 607 } 608 Boolean b = toBoolean(); 609 if (b != null) { 610 return booleanVal(!b.booleanValue()); 611 } 612 return BOOLEAN_NULL; 613 } 614 615 616 617 618 620 624 public static TObject createAndCastFromObject(TType type, Object ob) { 625 return new TObject(type, TType.castObjectToTType(ob, type)); 626 } 627 628 631 public TObject castTo(TType cast_to_type) { 632 Object ob = getObject(); 633 return createAndCastFromObject(cast_to_type, ob); 634 } 635 636 637 638 public String toString() { 639 if (isNull()) { 640 return "NULL"; 641 } 642 else { 643 return getObject().toString(); 644 } 645 } 646 647 648 683 684 689 private void writeObject(ObjectOutputStream out) throws IOException { 690 out.defaultWriteObject(); 691 } 692 693 700 private void readObject(java.io.ObjectInputStream in) 701 throws IOException , ClassNotFoundException { 702 in.defaultReadObject(); 703 if (ob instanceof String ) { 706 ob = StringObject.fromString((String ) ob); 707 } 708 } 709 710 } 711 712 | Popular Tags |