]> source.dussan.org Git - jackcess.git/commitdiff
add date time Value accessor
authorJames Ahlborn <jtahlborn@yahoo.com>
Thu, 26 Jan 2017 02:11:33 +0000 (02:11 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Thu, 26 Jan 2017 02:11:33 +0000 (02:11 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/branches/exprs@1081 f203690c-595d-4dc9-a70b-905162fa7fd2

src/main/java/com/healthmarketscience/jackcess/expr/EvalContext.java
src/main/java/com/healthmarketscience/jackcess/expr/Value.java
src/main/java/com/healthmarketscience/jackcess/impl/expr/BaseDateValue.java
src/main/java/com/healthmarketscience/jackcess/impl/expr/BaseDelayedValue.java
src/main/java/com/healthmarketscience/jackcess/impl/expr/BaseNumericValue.java
src/main/java/com/healthmarketscience/jackcess/impl/expr/BaseValue.java
src/main/java/com/healthmarketscience/jackcess/impl/expr/BuiltinOperators.java
src/main/java/com/healthmarketscience/jackcess/impl/expr/Expressionator.java

index 01a27b0ac7816189769a2ec09d59f3015540ab2d..a4e21d1442d56fc7355e6d1532496137aeec0ae5 100644 (file)
@@ -24,10 +24,10 @@ import java.text.SimpleDateFormat;
  */
 public interface EvalContext 
 {
-  public TemporalConfig getTemporalConfig();
-
   public Value.Type getResultType();
 
+  public TemporalConfig getTemporalConfig();
+
   public SimpleDateFormat createDateFormat(String formatStr);
 
   public Value getThisColumnValue();
index 29967721eb302632eb155574865662a0d4356df0..04844ae8910fafe40f2bd66cb5c87452a383dbff 100644 (file)
@@ -62,7 +62,7 @@ public interface Value
 
   public String getAsString();
 
-  public Date getAsDateTime();
+  public Date getAsDateTime(EvalContext ctx);
 
   public Long getAsLong();
 
index 1c96ba866a2fdead8e56f0a74dbb168d52a415f5..4bf03afe874491b975649f775daff024e4429b24 100644 (file)
@@ -21,6 +21,7 @@ import java.text.DateFormat;
 import java.util.Date;
 
 import com.healthmarketscience.jackcess.impl.ColumnImpl;
+import com.healthmarketscience.jackcess.expr.EvalContext;
 
 /**
  *
@@ -60,6 +61,11 @@ public abstract class BaseDateValue extends BaseValue
     return _fmt.format(_val);
   }
 
+  @Override
+  public Date getAsDateTime(EvalContext ctx) {
+    return _val;
+  }
+
   @Override
   public Long getAsLong() {
     return getNumber().longValue();
index 5ee037ca81159a62a2f3a3f5acd699678e1a01c1..c34a914e08d3b99f39142516732258b93d127517 100644 (file)
@@ -19,6 +19,7 @@ package com.healthmarketscience.jackcess.impl.expr;
 import java.math.BigDecimal;
 import java.util.Date;
 
+import com.healthmarketscience.jackcess.expr.EvalContext;
 import com.healthmarketscience.jackcess.expr.Value;
 
 /**
@@ -59,8 +60,8 @@ public abstract class BaseDelayedValue implements Value
     return getDelegate().getAsString();
   }
 
-  public Date getAsDateTime() {
-    return getDelegate().getAsDateTime();
+  public Date getAsDateTime(EvalContext ctx) {
+    return getDelegate().getAsDateTime(ctx);
   }
 
   public Long getAsLong() {
index fc136bf0a16a5bc9c1c619afe33b94548fc177e6..585c71e47ddbc4fa5d6cdb988093f3e6a1e6e857 100644 (file)
@@ -16,6 +16,11 @@ limitations under the License.
 
 package com.healthmarketscience.jackcess.impl.expr;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.healthmarketscience.jackcess.expr.EvalContext;
+import com.healthmarketscience.jackcess.impl.ColumnImpl;
 
 /**
  *
@@ -43,5 +48,14 @@ public abstract class BaseNumericValue extends BaseValue
     return getNumber().doubleValue();
   }
 
+  @Override
+  public Date getAsDateTime(EvalContext ctx) {
+    double d = getNumber().doubleValue();
+    
+    SimpleDateFormat sdf = ctx.createDateFormat(
+        ctx.getTemporalConfig().getDefaultDateTimeFormat());
+    return new Date(ColumnImpl.fromDateDouble(d, sdf.getCalendar()));
+  }
+
   protected abstract Number getNumber();
 }
index 109412bed98a7266c210a273365b74871d33671b..e30c303690b98a8e083c0ff642931187ed084592 100644 (file)
@@ -20,6 +20,7 @@ import java.math.BigDecimal;
 import java.util.Date;
 
 import com.healthmarketscience.jackcess.expr.Value;
+import com.healthmarketscience.jackcess.expr.EvalContext;
 
 /**
  *
@@ -39,7 +40,7 @@ public abstract class BaseValue implements Value
     throw invalidConversion(Value.Type.STRING);
   }
 
-  public Date getAsDateTime() {
+  public Date getAsDateTime(EvalContext ctx) {
     throw invalidConversion(Value.Type.DATE_TIME);
   }
 
index 5bd6ac92b63fea2417a893f136ce098d043453d9..e456e8bb6947cafbdd8b4b854232a13e49a1529b 100644 (file)
@@ -154,6 +154,8 @@ public class BuiltinOperators
       return NULL_VAL;
     }
 
+    // FIXME, string will convert to number if one is number and one is a string parseable as a number!!!
+
     Value.Type mathType = getGeneralMathTypePrecedence(param1, param2);
 
     switch(mathType) {
@@ -696,7 +698,7 @@ public class BuiltinOperators
     return ((t1.compareTo(t2) > 0) ? t1 : t2);
   }
 
-  private static boolean isIntegral(double d) {
+  static boolean isIntegral(double d) {
     return ((d == Math.rint(d)) && !Double.isInfinite(d) && !Double.isNaN(d));
   }
 
index d7e519064bcd304381dae2e02f23bce4f336d2ae..f92ad8c90c9e4a286a6f3bab18d2ba47383f918a 100644 (file)
@@ -1877,9 +1877,24 @@ public class Expressionator
         return null;
       }
 
-      // FIXME, booleans seem to go to -1 (true),0 (false) ...?
-
-      return val.get();
+      // FIXME possibly do some type coercion.  are there conversions here which don't work elsewhere? (string -> date, string -> number)?
+      switch(ctx.getResultType()) {
+      case STRING:
+        return val.getAsString();
+      case DATE:
+      case TIME:
+      case DATE_TIME:
+        return val.getAsDateTime(ctx);
+      case LONG:
+        return val.getAsLong();
+      case DOUBLE:
+        return val.getAsDouble();
+      case BIG_DEC:
+        return val.getAsBigDecimal();
+      default:
+        throw new IllegalStateException("unexpected result type " + 
+                                        ctx.getResultType());
+      }
     }
 
     private Boolean evalCondition(EvalContext ctx) {