You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ni...@apache.org on 2019/06/17 12:29:57 UTC

[kylin] branch master updated: KYLIN-4032 return timestamp and date without timezone in jdbc

This is an automated email from the ASF dual-hosted git repository.

nic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kylin.git


The following commit(s) were added to refs/heads/master by this push:
     new 2cfead0  KYLIN-4032 return timestamp and date without timezone in jdbc
2cfead0 is described below

commit 2cfead0b3c7772366e233c6bc61942ca38c68642
Author: chenzhx <ch...@apache.org>
AuthorDate: Mon Jun 17 17:39:32 2019 +0800

    KYLIN-4032 return timestamp and date without timezone in jdbc
---
 .../java/org/apache/kylin/jdbc/KylinClient.java    | 19 ++++++++++++++++--
 .../java/org/apache/kylin/jdbc/DriverTest.java     | 23 ++++++++++++++++++++++
 .../java/org/apache/kylin/jdbc/DummyClient.java    | 17 +++++++++++++++-
 3 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/jdbc/src/main/java/org/apache/kylin/jdbc/KylinClient.java b/jdbc/src/main/java/org/apache/kylin/jdbc/KylinClient.java
index f59c374..2f23f4e 100644
--- a/jdbc/src/main/java/org/apache/kylin/jdbc/KylinClient.java
+++ b/jdbc/src/main/java/org/apache/kylin/jdbc/KylinClient.java
@@ -30,6 +30,9 @@ import java.sql.Date;
 import java.sql.Time;
 import java.sql.Timestamp;
 import java.sql.Types;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -217,11 +220,11 @@ public class KylinClient implements IRemoteClient {
         case Types.LONGVARBINARY:
             return value.getBytes(StandardCharsets.UTF_8);
         case Types.DATE:
-            return Date.valueOf(value);
+            return dateConvert(value);
         case Types.TIME:
             return Time.valueOf(value);
         case Types.TIMESTAMP:
-            return Timestamp.valueOf(value);
+            return timestampConvert(value);
         default:
             //do nothing
             break;
@@ -380,6 +383,18 @@ public class KylinClient implements IRemoteClient {
                 columnStub.getIS_NULLABLE());
     }
 
+    private static Date dateConvert(String value) {
+        ZoneId utc = ZoneId.of("UTC");
+        LocalDate localDate = Date.valueOf(value).toLocalDate();
+        return new Date(localDate.atStartOfDay(utc).toInstant().toEpochMilli());
+    }
+
+    private static Timestamp timestampConvert(String value) {
+        ZoneId utc = ZoneId.of("UTC");
+        LocalDateTime localDate = Timestamp.valueOf(value).toLocalDateTime();
+        return new Timestamp(localDate.atZone(utc).toInstant().toEpochMilli());
+    }
+
     @Override
     public QueryResult executeQuery(String sql, List<Object> paramValues,
             Map<String, String> queryToggles) throws IOException {
diff --git a/jdbc/src/test/java/org/apache/kylin/jdbc/DriverTest.java b/jdbc/src/test/java/org/apache/kylin/jdbc/DriverTest.java
index 1ffec6d..908ce21 100644
--- a/jdbc/src/test/java/org/apache/kylin/jdbc/DriverTest.java
+++ b/jdbc/src/test/java/org/apache/kylin/jdbc/DriverTest.java
@@ -105,6 +105,29 @@ public class DriverTest {
     }
 
     @Test
+    public void testDateAndTimeStampWithMockData() throws SQLException {
+        Driver driver = new DummyDriver();
+
+        Connection conn = driver.connect("jdbc:kylin://test_url/test_db", null);
+        PreparedStatement state = conn.prepareStatement("select * from test_table where id=?");
+        state.setInt(1, 10);
+        ResultSet resultSet = state.executeQuery();
+
+        ResultSetMetaData metadata = resultSet.getMetaData();
+        assertEquals("date", metadata.getColumnTypeName(4));
+        assertEquals("timestamp", metadata.getColumnTypeName(5));
+
+        while (resultSet.next()) {
+            assertEquals("2019-04-27", resultSet.getString(4));
+            assertEquals("2019-04-27 17:30:03", resultSet.getString(5));
+        }
+
+        resultSet.close();
+        state.close();
+        conn.close();
+    }
+
+    @Test
     public void testMultipathOfDomainForConnection() throws SQLException {
         Driver driver = new DummyDriver();
 
diff --git a/jdbc/src/test/java/org/apache/kylin/jdbc/DummyClient.java b/jdbc/src/test/java/org/apache/kylin/jdbc/DummyClient.java
index 7039cc0..75292a1 100644
--- a/jdbc/src/test/java/org/apache/kylin/jdbc/DummyClient.java
+++ b/jdbc/src/test/java/org/apache/kylin/jdbc/DummyClient.java
@@ -19,7 +19,12 @@
 package org.apache.kylin.jdbc;
 
 import java.io.IOException;
+import java.sql.Date;
+import java.sql.Timestamp;
 import java.sql.Types;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -65,13 +70,23 @@ public class DummyClient implements IRemoteClient {
     @Override
     public QueryResult executeQuery(String sql, List<Object> paramValues, Map<String, String> queryToggles) throws IOException {
         List<Object> data = new ArrayList<Object>();
-        Object[] row = new Object[] { "foo", "bar", "tool" };
+
+        ZoneId utc = ZoneId.of("UTC");
+        LocalDate localDate = Date.valueOf("2019-04-27").toLocalDate();
+        LocalDateTime localDateTime = Timestamp.valueOf("2019-04-27 17:30:03").toLocalDateTime();
+        Date date = new Date(localDate.atStartOfDay(utc).toInstant().toEpochMilli());
+        Timestamp timestamp = new Timestamp(localDateTime.atZone(utc).toInstant().toEpochMilli());
+
+        Object[] row = new Object[] { "foo", "bar", "tool", date, timestamp };
         data.add(row);
 
         List<ColumnMetaData> meta = new ArrayList<ColumnMetaData>();
         meta.add(ColumnMetaData.dummy(ColumnMetaData.scalar(Types.VARCHAR, "varchar", Rep.STRING), true));
         meta.add(ColumnMetaData.dummy(ColumnMetaData.scalar(Types.VARCHAR, "varchar", Rep.STRING), true));
         meta.add(ColumnMetaData.dummy(ColumnMetaData.scalar(Types.VARCHAR, "varchar", Rep.STRING), true));
+        meta.add(ColumnMetaData.dummy(ColumnMetaData.scalar(Types.DATE, "date", Rep.JAVA_SQL_DATE), true));
+        meta.add(ColumnMetaData.dummy(ColumnMetaData.scalar(Types.TIMESTAMP, "timestamp", Rep.JAVA_SQL_TIMESTAMP),
+                true));
 
         return new QueryResult(meta, data);
     }