You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@drill.apache.org by ja...@apache.org on 2014/05/14 02:26:51 UTC

[3/4] git commit: DRILL-700: Extend AvaticaDrillSqlAccessor to support getDate(), getTime() and getTimestamp()

DRILL-700: Extend AvaticaDrillSqlAccessor to support getDate(), getTime() and getTimestamp()

 + Added accessor methods for getDate(), getTime() and getTimeStamp() in each of the data type's accessor class.


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

Branch: refs/heads/master
Commit: 4b57652f1ea0b9d6b68826b5f07d624eabf043f3
Parents: 8e1865c
Author: Mehant Baid <me...@gmail.com>
Authored: Mon May 12 12:48:28 2014 -0700
Committer: Aditya Kishore <ad...@maprtech.com>
Committed: Tue May 13 16:05:59 2014 -0700

----------------------------------------------------------------------
 .../codegen/templates/FixedValueVectors.java    | 17 ++++++++++-
 .../codegen/templates/NullableValueVectors.java | 10 ++++++
 .../main/codegen/templates/SqlAccessors.java    | 27 +++++++++++++++--
 .../drill/jdbc/AvaticaDrillSqlAccessor.java     |  6 ++--
 .../apache/drill/jdbc/test/TestJdbcQuery.java   | 32 ++++++++++++++++++++
 5 files changed, 85 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/4b57652f/exec/java-exec/src/main/codegen/templates/FixedValueVectors.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/FixedValueVectors.java b/exec/java-exec/src/main/codegen/templates/FixedValueVectors.java
index 8c6c037..7193c29 100644
--- a/exec/java-exec/src/main/codegen/templates/FixedValueVectors.java
+++ b/exec/java-exec/src/main/codegen/templates/FixedValueVectors.java
@@ -272,7 +272,7 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements F
       return p.plusMonths(months).plusDays(days).plusMillis(millis);
     }
     
-    public StringBuilder getAsString(int index) {
+    public StringBuilder getAsStringBuilder(int index) {
 
       int offsetIndex = index * ${type.width};
 
@@ -469,6 +469,21 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements F
       Period p = new Period();
       return p.plusYears(years).plusMonths(months);
     }
+
+    public StringBuilder getAsStringBuilder(int index) {
+
+      int months  = data.getInt(index);
+
+      int years  = (months / org.apache.drill.exec.expr.fn.impl.DateUtility.yearsToMonths);
+      months = (months % org.apache.drill.exec.expr.fn.impl.DateUtility.yearsToMonths);
+
+      String yearString = (Math.abs(years) == 1) ? " year " : " years ";
+      String monthString = (Math.abs(months) == 1) ? " month " : " months ";
+
+      return(new StringBuilder().
+             append(years).append(yearString).
+             append(months).append(monthString));
+    }
     
     <#elseif minor.class == "Time">
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/4b57652f/exec/java-exec/src/main/codegen/templates/NullableValueVectors.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/NullableValueVectors.java b/exec/java-exec/src/main/codegen/templates/NullableValueVectors.java
index 403ba4f..08eea6e 100644
--- a/exec/java-exec/src/main/codegen/templates/NullableValueVectors.java
+++ b/exec/java-exec/src/main/codegen/templates/NullableValueVectors.java
@@ -350,6 +350,16 @@ public final class ${className} extends BaseValueVector implements <#if type.maj
       }
     }
 
+    <#if minor.class == "Interval" || minor.class == "IntervalDay" || minor.class == "IntervalYear">
+    public StringBuilder getAsStringBuilder(int index) {
+      if (isNull(index)) {
+          return null;
+      }else{
+        return values.getAccessor().getAsStringBuilder(index);
+      }
+    }
+    </#if>
+
     public int getValueCount(){
       return valueCount;
     }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/4b57652f/exec/java-exec/src/main/codegen/templates/SqlAccessors.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/SqlAccessors.java b/exec/java-exec/src/main/codegen/templates/SqlAccessors.java
index 74ee9ed..b7207f9 100644
--- a/exec/java-exec/src/main/codegen/templates/SqlAccessors.java
+++ b/exec/java-exec/src/main/codegen/templates/SqlAccessors.java
@@ -102,16 +102,37 @@ public class ${name}Accessor extends AbstractSqlAccessor{
   public Timestamp getTimestamp(int index) {
     return new Timestamp(ac.getObject(index).getMillis());
   }
-  <#elseif minor.class == "Interval" || minor.class == "IntervalDay">
+  <#elseif minor.class == "Interval" || minor.class == "IntervalDay" || minor.class == "IntervalYear">
   @Override
-  public byte[] getBytes(int index) {
-      return null;
+  public String getString(int index) {
+      return String.valueOf(ac.getAsStringBuilder(index));
   }
   <#elseif minor.class.startsWith("Decimal")>
   @Override
   public BigDecimal getBigDecimal(int index) {
       return ac.getObject(index);
   }
+  <#elseif minor.class == "Date">
+  @Override
+  public Date getDate(int index) {
+    org.joda.time.DateTime date = new org.joda.time.DateTime(ac.get(index), org.joda.time.DateTimeZone.UTC);
+    date = date.withZoneRetainFields(org.joda.time.DateTimeZone.getDefault());
+    return new Date(date.getMillis());
+  }
+  <#elseif minor.class == "TimeStamp">
+  @Override
+  public Timestamp getTimestamp(int index) {
+    org.joda.time.DateTime date = new org.joda.time.DateTime(ac.get(index), org.joda.time.DateTimeZone.UTC);
+    date = date.withZoneRetainFields(org.joda.time.DateTimeZone.getDefault());
+    return new Timestamp(date.getMillis());
+  }
+  <#elseif minor.class == "Time">
+  @Override
+  public Time getTime(int index) {
+    org.joda.time.DateTime time = new org.joda.time.DateTime(ac.get(index), org.joda.time.DateTimeZone.UTC);
+    time = time.withZoneRetainFields(org.joda.time.DateTimeZone.getDefault());
+    return new Time(time.getMillis());
+  }
   <#else>
   @Override
   public ${javaType} get${javaType?cap_first}(int index){

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/4b57652f/exec/jdbc/src/main/java/org/apache/drill/jdbc/AvaticaDrillSqlAccessor.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/AvaticaDrillSqlAccessor.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/AvaticaDrillSqlAccessor.java
index 48fb6fd..d06c420 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/AvaticaDrillSqlAccessor.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/AvaticaDrillSqlAccessor.java
@@ -168,17 +168,17 @@ public class AvaticaDrillSqlAccessor implements Accessor{
 
   @Override
   public Date getDate(Calendar calendar) throws SQLException {
-    throw new SQLFeatureNotSupportedException();
+    return a.getDate(row());
   }
 
   @Override
   public Time getTime(Calendar calendar) throws SQLException {
-    throw new SQLFeatureNotSupportedException();
+    return a.getTime(row());
   }
 
   @Override
   public Timestamp getTimestamp(Calendar calendar) throws SQLException {
-    throw new SQLFeatureNotSupportedException();
+    return a.getTimestamp(row());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/4b57652f/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java
index 2d26b17..2fd23d3 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcQuery.java
@@ -20,6 +20,7 @@ package org.apache.drill.jdbc.test;
 import java.lang.Exception;
 import java.lang.RuntimeException;
 import java.nio.file.Paths;
+import java.sql.*;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.ResultSet;
@@ -751,6 +752,37 @@ public class TestJdbcQuery extends JdbcTest{
     });
   }
 
+
+  @Test
+  public void testDateTimeAccessors() throws Exception{
+    JdbcAssert.withNoDefaultSchema().withConnection(new Function<Connection, Void>() {
+      public Void apply(Connection connection) {
+        try {
+          Statement statement = connection.createStatement();
+
+          // show tables on view
+          ResultSet resultSet = statement.executeQuery("select date '2008-2-23', time '12:23:34', timestamp '2008-2-23 12:23:34.456', " +
+                                                       "interval '1' year, interval '2' day " +
+                                                       "from cp.`employee.json` limit 1");
+
+          java.sql.Date date = resultSet.getDate(1);
+          java.sql.Time time = resultSet.getTime(2);
+          java.sql.Timestamp ts = resultSet.getTimestamp(3);
+          String intervalYear = resultSet.getString(4);
+          String intervalDay  = resultSet.getString(5);
+
+          System.out.println("Date: " + date.toString() + " time: " + time.toString() + " timestamp: " + ts.toString() +
+                             "\ninterval year: " + intervalYear + " intervalDay: " + intervalDay);
+
+          statement.close();
+          return null;
+        } catch (Exception e) {
+          throw new RuntimeException(e);
+        }
+      }
+    });
+  }
+
   @Test
   public void testShowFiles() throws Exception {
     testQuery("show files from dfs.`/tmp`");