This is an automated email from the ASF dual-hosted git repository. nic pushed a commit to branch 2.6.x in repository https://gitbox.apache.org/repos/asf/kylin.git
The following commit(s) were added to refs/heads/2.6.x by this push: new e772f31 KYLIN-4032 return timestamp and date without timezone in jdbc e772f31 is described below commit e772f31d56ee262aad41b7c35fee25921d578abb Author: chenzhx <c...@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 e1091b4..4f32989 100644 --- a/jdbc/src/main/java/org/apache/kylin/jdbc/KylinClient.java +++ b/jdbc/src/main/java/org/apache/kylin/jdbc/KylinClient.java @@ -27,6 +27,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; @@ -195,11 +198,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; @@ -337,6 +340,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); }