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 <[email protected]> Authored: Mon May 12 12:48:28 2014 -0700 Committer: Aditya Kishore <[email protected]> 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`");
