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"); + } }
