|                                                                                                              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                                                                                                                                                                                              |