DRILL-758: Implement to_timestamp that accepts seconds from epoch as input.


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/3168986b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/3168986b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/3168986b

Branch: refs/heads/master
Commit: 3168986b77504daf91018f654db9f5e065e755f6
Parents: 61fc5ea
Author: Mehant Baid <[email protected]>
Authored: Wed Jun 4 11:11:07 2014 -0700
Committer: Jacques Nadeau <[email protected]>
Committed: Wed Jun 4 16:39:22 2014 -0700

----------------------------------------------------------------------
 .../ToTimeStampFunction.java                    | 76 ++++++++++++++++++++
 .../drill/jdbc/test/TestFunctionsQuery.java     | 21 ++++++
 2 files changed, 97 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/3168986b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/ToTimeStampFunction.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/ToTimeStampFunction.java
 
b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/ToTimeStampFunction.java
new file mode 100644
index 0000000..9195891
--- /dev/null
+++ 
b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctionTemplates/ToTimeStampFunction.java
@@ -0,0 +1,76 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.drill.exec.expr.annotations.Workspace;
+
+<@pp.dropOutputFile />
+
+<#list numericTypes.numeric as numerics>
+
+<@pp.changeOutputFile 
name="/org/apache/drill/exec/expr/fn/impl/G${numerics}ToTimeStamp.java" />
+
+<#include "/@includes/license.ftl" />
+
+package org.apache.drill.exec.expr.fn.impl;
+
+import org.apache.drill.exec.expr.DrillSimpleFunc;
+import org.apache.drill.exec.expr.annotations.FunctionTemplate;
+import org.apache.drill.exec.expr.annotations.FunctionTemplate.NullHandling;
+import org.apache.drill.exec.expr.annotations.Output;
+import org.apache.drill.exec.expr.annotations.Workspace;
+import org.apache.drill.exec.expr.annotations.Param;
+import org.apache.drill.exec.expr.holders.*;
+import org.apache.drill.exec.record.RecordBatch;
+
+// This class is generated using freemarker template ToTimeStampFunction.java
+
+@FunctionTemplate(name = "to_timestamp" , scope = 
FunctionTemplate.FunctionScope.SIMPLE, nulls = NullHandling.NULL_IF_NULL)
+public class G${numerics}ToTimeStamp implements DrillSimpleFunc {
+
+
+    @Param  ${numerics}Holder left;
+    <#if numerics.startsWith("Decimal")>
+    @Workspace java.math.BigInteger millisConstant;
+    </#if>
+    @Output TimeStampHolder out;
+
+    public void setup(RecordBatch b) {
+      <#if numerics.startsWith("Decimal")>
+      millisConstant = java.math.BigInteger.valueOf(1000);
+      </#if>
+    }
+
+    public void eval() {
+        long inputMillis = 0;
+
+        <#if (numerics.startsWith("Decimal"))>
+        <#if (numerics == "Decimal9") || (numerics == "Decimal18")>
+        java.math.BigInteger value = java.math.BigInteger.valueOf(left.value);
+        value = value.multiply(millisConstant);
+        inputMillis = (new java.math.BigDecimal(value, 
left.scale)).longValue();
+        <#elseif (numerics == "Decimal28Sparse") || (numerics == 
"Decimal38Sparse")>
+        java.math.BigDecimal input = 
org.apache.drill.common.util.DecimalUtility.getBigDecimalFromSparse(left.buffer,
 left.start, left.nDecimalDigits, left.scale);
+        inputMillis = input.multiply(new 
java.math.BigDecimal(1000)).longValue();
+        </#if>
+        <#else>
+        inputMillis = (long) (left.value * 1000l);
+        </#if>
+        out.value = new 
org.joda.time.DateTime(inputMillis).withZoneRetainFields(org.joda.time.DateTimeZone.UTC).getMillis();
+    }
+}
+</#list>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/3168986b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
----------------------------------------------------------------------
diff --git 
a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java 
b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
index 0dacfa3..ac1b289 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestFunctionsQuery.java
@@ -27,9 +27,16 @@ import java.sql.Statement;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.drill.common.util.TestTools;
+import org.apache.drill.exec.expr.fn.impl.DateUtility;
 import org.apache.drill.exec.store.hive.HiveTestDataGenerator;
 import org.apache.drill.jdbc.Driver;
 import org.apache.drill.jdbc.JdbcTest;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.DateTimeFormatterBuilder;
+import org.joda.time.format.DateTimeParser;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
@@ -480,4 +487,18 @@ public class TestFunctionsQuery {
             "SIGN_INT=1\n");
   }
 
+  @Test
+  public void testToTimeStamp() throws Exception {
+    String query = "select to_timestamp(cast('800120400.12312' as decimal(38, 
5))) as DEC38_TS, to_timestamp(200120400) as INT_TS " +
+        "from cp.`employee.json` where employee_id < 2";
+
+    DateTime result1 = new DateTime(800120400123l);
+    DateTime result2 = new DateTime(200120400000l);
+    DateTimeFormatter f = 
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ");
+    JdbcAssert.withNoDefaultSchema()
+        .sql(query)
+        .returns(
+            "DEC38_TS=" + f.print(result1)+ "; " +
+            "INT_TS=" + f.print(result2) + "\n");
+  }
 }

Reply via email to