You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@iotdb.apache.org by GitBox <gi...@apache.org> on 2019/07/18 06:23:03 UTC

[GitHub] [incubator-iotdb] jt2594838 commented on a change in pull request #246: add micro and nano precision

jt2594838 commented on a change in pull request #246: add micro and nano precision
URL: https://github.com/apache/incubator-iotdb/pull/246#discussion_r304749535
 
 

 ##########
 File path: iotdb/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java
 ##########
 @@ -153,59 +299,176 @@ private DatetimeUtils() {
         .toFormatter();
   }
 
+  /**
+   * such as '2011.12.03 10:15:30+01:00' or '2011.12.03 10:15:30.123456+01:00'.
+   */
+  public static final DateTimeFormatter ISO_OFFSET_DATE_TIME_WITH_DOT_WITH_SPACE_US;
+
+  static {
+    ISO_OFFSET_DATE_TIME_WITH_DOT_WITH_SPACE_US = new DateTimeFormatterBuilder()
+        .parseCaseInsensitive()
+        .append(ISO_LOCAL_DATE_WITH_DOT).appendLiteral(' ').append(ISO_LOCAL_TIME_WITH_US)
+        .appendOffsetId()
+        .toFormatter();
+  }
+
+  /**
+   * such as '2011.12.03 10:15:30+01:00' or '2011.12.03 10:15:30.123456789+01:00'.
+   */
+  public static final DateTimeFormatter ISO_OFFSET_DATE_TIME_WITH_DOT_WITH_SPACE_NS;
+
+  static {
+    ISO_OFFSET_DATE_TIME_WITH_DOT_WITH_SPACE_NS = new DateTimeFormatterBuilder()
+        .parseCaseInsensitive()
+        .append(ISO_LOCAL_DATE_WITH_DOT).appendLiteral(' ').append(ISO_LOCAL_TIME_WITH_NS)
+        .appendOffsetId()
+        .toFormatter();
+  }
+
   public static final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
       /**
        * The ISO date-time formatter that formats or parses a date-time with an offset, such as
        * '2011-12-03T10:15:30+01:00' or '2011-12-03T10:15:30.123+01:00'.
        */
       .appendOptional(ISO_OFFSET_DATE_TIME_WITH_MS)
+
+      /**
+       * such as '2011-12-03T10:15:30+01:00' or '2011-12-03T10:15:30.123456+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_US)
+
+      /**
+       * such as '2011-12-03T10:15:30+01:00' or '2011-12-03T10:15:30.123456789+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_NS)
+
       /**
        * such as '2011/12/03T10:15:30+01:00' or '2011/12/03T10:15:30.123+01:00'.
        */
       .appendOptional(ISO_OFFSET_DATE_TIME_WITH_SLASH)
+
+      /**
+       * such as '2011/12/03T10:15:30+01:00' or '2011/12/03T10:15:30.123456+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_SLASH_US)
+
+      /**
+       * such as '2011/12/03T10:15:30+01:00' or '2011/12/03T10:15:30.123456789+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_SLASH_NS)
+
       /**
        * such as '2011.12.03T10:15:30+01:00' or '2011.12.03T10:15:30.123+01:00'.
        */
       .appendOptional(ISO_OFFSET_DATE_TIME_WITH_DOT)
+
+      /**
+       * such as '2011.12.03T10:15:30+01:00' or '2011.12.03T10:15:30.123456+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_DOT_US)
+
+      /**
+       * such as '2011.12.03T10:15:30+01:00' or '2011.12.03T10:15:30.123456789+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_DOT_NS)
+
       /**
        * such as '2011-12-03 10:15:30+01:00' or '2011-12-03 10:15:30.123+01:00'.
        */
       .appendOptional(ISO_OFFSET_DATE_TIME_WITH_SPACE)
+
+      /**
+       * such as '2011-12-03 10:15:30+01:00' or '2011-12-03 10:15:30.123456+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_SPACE_US)
+
+      /**
+       * such as '2011-12-03 10:15:30+01:00' or '2011-12-03 10:15:30.123456789+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_SPACE_NS)
+
       /**
        * such as '2011/12/03 10:15:30+01:00' or '2011/12/03 10:15:30.123+01:00'.
        */
       .appendOptional(ISO_OFFSET_DATE_TIME_WITH_SLASH_WITH_SPACE)
+
+      /**
+       * such as '2011/12/03 10:15:30+01:00' or '2011/12/03 10:15:30.123456+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_SLASH_WITH_SPACE_US)
+
+      /**
+       * such as '2011/12/03 10:15:30+01:00' or '2011/12/03 10:15:30.123456789+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_SLASH_WITH_SPACE_NS)
+
       /**
        * such as '2011.12.03 10:15:30+01:00' or '2011.12.03 10:15:30.123+01:00'.
        */
-      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_DOT_WITH_SPACE).toFormatter();
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_DOT_WITH_SPACE)
+
+      /**
+       * such as '2011.12.03 10:15:30+01:00' or '2011.12.03 10:15:30.123456+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_DOT_WITH_SPACE_US)
+
+      /**
+       * such as '2011.12.03 10:15:30+01:00' or '2011.12.03 10:15:30.123456789+01:00'.
+       */
+      .appendOptional(ISO_OFFSET_DATE_TIME_WITH_DOT_WITH_SPACE_NS).toFormatter();
 
   public static long convertDatetimeStrToMillisecond(String str, ZoneId zoneId)
       throws LogicalOperatorException {
     return convertDatetimeStrToMillisecond(str, toZoneOffset(zoneId), 0);
   }
 
+  public static long getInstantWithPrecision(String str, TSFileConfig.PrecisionType precisionType)
+      throws LogicalOperatorException {
+    try {
+      ZonedDateTime zonedDateTime = ZonedDateTime.parse(str, formatter);
+      Instant instant = zonedDateTime.toInstant();
+
+      if (instant.getEpochSecond() < 0 && instant.getNano() > 0) {
+        /* adjustment can reduce loss of division */
+        long digits = Math.multiplyExact(instant.getEpochSecond() + 1, precisionType.getOrder());
+        long adjustment = instant.getNano() / 1000 - 1;
+        return Math.addExact(digits, adjustment);
+      } else {
+        long digits = Math.multiplyExact(instant.getEpochSecond(), precisionType.getOrder());
+        return Math
+            .addExact(digits, instant.getNano() / (1000_000_000L / precisionType.getOrder()));
+      }
+    } catch (DateTimeParseException e) {
+      throw new LogicalOperatorException(e);
+    }
+  }
+
   /**
-   * convert date time string to millisecond.
+   * convert date time string to millisecond, microsecond or nanosecond.
    */
   public static long convertDatetimeStrToMillisecond(String str, ZoneOffset offset, int depth)
       throws LogicalOperatorException {
-    if (depth >= 2){
 
 Review comment:
   You should rename the method to something like "convertDatetimeStrToLong".

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services