From fa4943db1eea644a85239bb775cf103547402229 Mon Sep 17 00:00:00 2001 From: "xuyi556677@163.com" Date: Mon, 21 Jan 2019 22:22:59 +0800 Subject: [PATCH 1/2] add unit test for UTC timezome --- .../apache/iotdb/db/qp/QueryProcessor.java | 2 - .../iotdb/db/qp/constant/DatetimeUtils.java | 17 +++++-- .../iotdb/db/sql/DatetimeUtilsTest.java | 49 ++++++++++++------- 3 files changed, 44 insertions(+), 24 deletions(-) diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java index e7abc1965351..6dea246a217a 100644 --- a/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java +++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java @@ -68,8 +68,6 @@ public PhysicalPlan parseSQLToPhysicalPlan(String sqlStr) public PhysicalPlan parseSQLToPhysicalPlan(String sqlStr, ZoneId zoneId) throws QueryProcessorException, ArgsErrorException, ProcessorException { AstNode astNode = parseSQLToAST(sqlStr); - System.out.println("parseASTToOperator"); - System.out.println(zoneId); Operator operator = parseASTToOperator(astNode, zoneId); operator = logicalOptimize(operator, executor); PhysicalGenerator physicalGenerator = new PhysicalGenerator(executor); diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java index 1d3bc3340dbf..13daf3a519e2 100644 --- a/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java +++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java @@ -175,18 +175,25 @@ public class DatetimeUtils { */ .appendOptional(ISO_OFFSET_DATE_TIME_WITH_DOT_WITH_SPACE).toFormatter(); - public static long convertDatetimeStrToMillisecond(String str, ZoneId zoneId) + public static long convertDatetimeStrToMillisecond(String str, ZoneId zoneId, int depth) throws LogicalOperatorException { - return convertDatetimeStrToMillisecond(str, toZoneOffset(zoneId)); + return convertDatetimeStrToMillisecond(str, toZoneOffset(zoneId), depth); } /** * convert date time string to millisecond. */ - public static long convertDatetimeStrToMillisecond(String str, ZoneOffset offset) + public static long convertDatetimeStrToMillisecond(String str, ZoneOffset offset, int depth) throws LogicalOperatorException { - if (str.length() - str.lastIndexOf('+') != 6 && str.length() - str.lastIndexOf('-') != 6) { - return convertDatetimeStrToMillisecond(str + offset, offset); + if (depth >= 2){ + throw new DateTimeException( + String.format("Failed to convert %s to millisecond, zone offset is %s, " + + "please input like 2011-12-03T10:15:30 or 2011-12-03T10:15:30+01:00", str, offset)); + } + if (str.indexOf('Z') > 0){ + return convertDatetimeStrToMillisecond(str.substring(0, str.indexOf('Z')) + "+00:00", offset, depth); + } else if (str.length() - str.lastIndexOf('+') != 6 && str.length() - str.lastIndexOf('-') != 6) { + return convertDatetimeStrToMillisecond(str + offset, offset, depth + 1); } else if (str.indexOf('[') > 0 || str.indexOf(']') > 0) { throw new DateTimeException( String.format("%s with [time-region] at end is not supported now, " diff --git a/iotdb/src/test/java/org/apache/iotdb/db/sql/DatetimeUtilsTest.java b/iotdb/src/test/java/org/apache/iotdb/db/sql/DatetimeUtilsTest.java index c76874a00b18..94a8454ae275 100644 --- a/iotdb/src/test/java/org/apache/iotdb/db/sql/DatetimeUtilsTest.java +++ b/iotdb/src/test/java/org/apache/iotdb/db/sql/DatetimeUtilsTest.java @@ -36,47 +36,56 @@ public class DatetimeUtilsTest { private ZoneId zoneId; // 1546413207689 // 2019-01-02T15:13:27.689+08:00 + private final long timestamp = 1546413207689L; private long delta; @Before public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test1() throws LogicalOperatorException{ zoneOffset = ZonedDateTime.now().getOffset(); zoneId = ZoneId.systemDefault(); - System.out.println(zoneOffset.toString()); if(zoneOffset.toString().equals("Z")){ delta = 8 * 3600000; - zoneOffset = ZoneOffset.of("+00:00"); } else { delta = (8 - Long.parseLong(zoneOffset.toString().split(":")[0])) * 3600000; } - System.out.println(delta); + testConvertDatetimeStrToLongWithoutMS(zoneOffset, zoneId, timestamp - 689 + delta); + testConvertDatetimeStrToLongWithMS(zoneOffset, zoneId, timestamp + delta); } - @After - public void tearDown() throws Exception { + @Test + public void test2() throws LogicalOperatorException{ + zoneOffset = ZoneOffset.UTC; + zoneId = ZoneId.of("Etc/UTC"); + delta = 8 * 3600000; + testConvertDatetimeStrToLongWithoutMS(zoneOffset, zoneId, timestamp - 689 + delta); + testConvertDatetimeStrToLongWithMS(zoneOffset, zoneId, timestamp + delta); } - @Test - public void testConvertDatetimeStrToLongWithoutMS() throws LogicalOperatorException { + public void testConvertDatetimeStrToLongWithoutMS(ZoneOffset zoneOffset, ZoneId zoneId, long res) throws LogicalOperatorException { String[] timeFormatWithoutMs = new String[]{"2019-01-02 15:13:27", "2019/01/02 15:13:27", "2019.01.02 15:13:27", "2019-01-02T15:13:27", "2019/01/02T15:13:27", "2019.01.02T15:13:27", "2019-01-02 15:13:27" + zoneOffset, "2019/01/02 15:13:27" + zoneOffset, "2019.01.02 15:13:27" + zoneOffset, "2019-01-02T15:13:27" + zoneOffset, "2019/01/02T15:13:27" + zoneOffset, "2019.01.02T15:13:27" + zoneOffset,}; - - long res = 1546413207000L + delta; for (String str : timeFormatWithoutMs) { - Assert.assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneOffset)); + Assert.assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneOffset, 0)); } for (String str : timeFormatWithoutMs) { - assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneId)); + assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneId, 0)); } } - @Test - public void testConvertDatetimeStrToLongWithMS() throws LogicalOperatorException { + public void testConvertDatetimeStrToLongWithMS(ZoneOffset zoneOffset, ZoneId zoneId, long res) throws LogicalOperatorException { String[] timeFormatWithoutMs = new String[]{"2019-01-02 15:13:27.689", "2019/01/02 15:13:27.689", "2019.01.02 15:13:27.689", "2019-01-02T15:13:27.689", "2019/01/02T15:13:27.689", @@ -84,14 +93,12 @@ public void testConvertDatetimeStrToLongWithMS() throws LogicalOperatorException "2019/01/02 15:13:27.689" + zoneOffset, "2019.01.02 15:13:27.689" + zoneOffset, "2019-01-02T15:13:27.689" + zoneOffset, "2019/01/02T15:13:27.689" + zoneOffset, "2019.01.02T15:13:27.689" + zoneOffset,}; - - long res = 1546413207689L + delta; for (String str : timeFormatWithoutMs) { - assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneOffset)); + assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneOffset, 0)); } for (String str : timeFormatWithoutMs) { - assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneId)); + assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneId, 0)); } } @@ -101,4 +108,12 @@ public void createTest() { // ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.of("+08:00")); // System.out.println(zonedDateTime); } + + public static void main(String[] args){ +// System.out.println(DatetimeUtils.toZoneOffset(ZoneId.of("Etc/UTC"))); +// for(String zoneId : ZoneId.getAvailableZoneIds()){ +// System.out.println(zoneId + ": " + DatetimeUtils.toZoneOffset(ZoneId.of(zoneId))); +// } +// System.out.println(ZoneOffset.of("+00:00")); + } } From 868758ee45a52462924afe177e776eafd7aeace8 Mon Sep 17 00:00:00 2001 From: "xuyi556677@163.com" Date: Mon, 21 Jan 2019 22:32:46 +0800 Subject: [PATCH 2/2] remove useless paramter --- .../org/apache/iotdb/db/qp/constant/DatetimeUtils.java | 4 ++-- .../org/apache/iotdb/db/sql/DatetimeUtilsTest.java | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java index 13daf3a519e2..5011071c44b1 100644 --- a/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java +++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java @@ -175,9 +175,9 @@ public class DatetimeUtils { */ .appendOptional(ISO_OFFSET_DATE_TIME_WITH_DOT_WITH_SPACE).toFormatter(); - public static long convertDatetimeStrToMillisecond(String str, ZoneId zoneId, int depth) + public static long convertDatetimeStrToMillisecond(String str, ZoneId zoneId) throws LogicalOperatorException { - return convertDatetimeStrToMillisecond(str, toZoneOffset(zoneId), depth); + return convertDatetimeStrToMillisecond(str, toZoneOffset(zoneId), 0); } /** diff --git a/iotdb/src/test/java/org/apache/iotdb/db/sql/DatetimeUtilsTest.java b/iotdb/src/test/java/org/apache/iotdb/db/sql/DatetimeUtilsTest.java index 94a8454ae275..ace139ba6ed1 100644 --- a/iotdb/src/test/java/org/apache/iotdb/db/sql/DatetimeUtilsTest.java +++ b/iotdb/src/test/java/org/apache/iotdb/db/sql/DatetimeUtilsTest.java @@ -80,7 +80,7 @@ public void testConvertDatetimeStrToLongWithoutMS(ZoneOffset zoneOffset, ZoneId } for (String str : timeFormatWithoutMs) { - assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneId, 0)); + assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneId)); } } @@ -98,7 +98,7 @@ public void testConvertDatetimeStrToLongWithMS(ZoneOffset zoneOffset, ZoneId zon } for (String str : timeFormatWithoutMs) { - assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneId, 0)); + assertEquals(res, DatetimeUtils.convertDatetimeStrToMillisecond(str, zoneId)); } } @@ -111,9 +111,9 @@ public void createTest() { public static void main(String[] args){ // System.out.println(DatetimeUtils.toZoneOffset(ZoneId.of("Etc/UTC"))); -// for(String zoneId : ZoneId.getAvailableZoneIds()){ -// System.out.println(zoneId + ": " + DatetimeUtils.toZoneOffset(ZoneId.of(zoneId))); -// } + for(String zoneId : ZoneId.getAvailableZoneIds()){ + System.out.println(zoneId + ": " + DatetimeUtils.toZoneOffset(ZoneId.of(zoneId))); + } // System.out.println(ZoneOffset.of("+00:00")); } }