You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ja...@apache.org on 2022/03/09 22:50:00 UTC

[pinot] branch master updated: fixing datetime truncate for multi-day (#8327)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 07a7ddb  fixing datetime truncate for multi-day (#8327)
07a7ddb is described below

commit 07a7ddb3e0799454b05be4ad1a7452e34b74ce4a
Author: Rong Rong <wa...@gmail.com>
AuthorDate: Wed Mar 9 14:49:37 2022 -0800

    fixing datetime truncate for multi-day (#8327)
---
 .../org/apache/pinot/common/function/scalar/DateTimeFunctions.java | 3 ++-
 .../transform/transformer/datetime/BaseDateTimeTransformer.java    | 3 ++-
 .../org/apache/pinot/core/data/function/DateTimeFunctionsTest.java | 7 +++++--
 .../transform/transformer/datetime/DateTimeConverterTest.java      | 4 ++--
 4 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/DateTimeFunctions.java b/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/DateTimeFunctions.java
index 183c98b..5746816 100644
--- a/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/DateTimeFunctions.java
+++ b/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/DateTimeFunctions.java
@@ -703,7 +703,8 @@ public class DateTimeFunctions {
           dateTime = dateTime.withHourOfDay((dateTime.getHourOfDay() / size) * size).hourOfDay().roundFloorCopy();
           break;
         case DAYS:
-          dateTime = dateTime.withDayOfMonth((dateTime.getDayOfMonth() / size) * size).dayOfMonth().roundFloorCopy();
+          dateTime = dateTime.withDayOfMonth(((dateTime.getDayOfMonth() - 1) / size) * size + 1).dayOfMonth()
+              .roundFloorCopy();
           break;
         default:
           break;
diff --git a/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/transformer/datetime/BaseDateTimeTransformer.java b/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/transformer/datetime/BaseDateTimeTransformer.java
index 2b20699..a8dc47d 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/transformer/datetime/BaseDateTimeTransformer.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/transformer/datetime/BaseDateTimeTransformer.java
@@ -80,7 +80,8 @@ public abstract class BaseDateTimeTransformer<I, O> implements DataTransformer<I
         break;
       case DAYS:
         _dateTimeTruncate = (dateTime) -> _outputDateTimeFormatter
-            .print(dateTime.withDayOfMonth((dateTime.getDayOfMonth() / sz) * sz).dayOfMonth().roundFloorCopy());
+            .print(dateTime.withDayOfMonth(((dateTime.getDayOfMonth() - 1) / sz) * sz + 1).dayOfMonth()
+                .roundFloorCopy());
         break;
       default:
         _dateTimeTruncate = _outputDateTimeFormatter::print;
diff --git a/pinot-core/src/test/java/org/apache/pinot/core/data/function/DateTimeFunctionsTest.java b/pinot-core/src/test/java/org/apache/pinot/core/data/function/DateTimeFunctionsTest.java
index a94d039..e291c7f 100644
--- a/pinot-core/src/test/java/org/apache/pinot/core/data/function/DateTimeFunctionsTest.java
+++ b/pinot-core/src/test/java/org/apache/pinot/core/data/function/DateTimeFunctionsTest.java
@@ -456,9 +456,12 @@ public class DateTimeFunctionsTest {
         "1:MILLISECONDS:SIMPLE_DATE_FORMAT:yyyy-MM-dd HH:mm:ss.SSS tz(America/Denver)", "12:HOURS",
         "2018-04-11 00:00:00.000");
     // Test conversion from millis since epoch to simple date format (America/Denver timezone with 5 day granularity)
+    testDateTimeConvert(1519926205000L/* 20180301T09:43:25 */, "1:MILLISECONDS:EPOCH",
+        "1:MILLISECONDS:SIMPLE_DATE_FORMAT:yyyy-MM-dd HH:mm:ss.SSS tz(America/Denver)", "5:DAYS",
+        "2018-03-01 00:00:00.000");
     testDateTimeConvert(1522230205000L/* 20180328T09:43:25 */, "1:MILLISECONDS:EPOCH",
         "1:MILLISECONDS:SIMPLE_DATE_FORMAT:yyyy-MM-dd HH:mm:ss.SSS tz(America/Denver)", "5:DAYS",
-        "2018-03-25 00:00:00.000");
+        "2018-03-26 00:00:00.000");
     // Test conversion from millis since epoch to simple date format (America/Los_Angeles timezone with 1 day
     // granularity)
     testDateTimeConvert(1524013200000L/* 20180418T01:00:00 */, "1:MILLISECONDS:EPOCH",
@@ -507,7 +510,7 @@ public class DateTimeFunctionsTest {
     // granularity)
     testDateTimeConvert("20180328T09:43:25", "1:HOURS:SIMPLE_DATE_FORMAT:yyyyMMdd''T''HH:mm:ss",
         "1:MILLISECONDS:SIMPLE_DATE_FORMAT:yyyy-MM-dd HH:mm:ss" + ".SSS tz(America/Denver)", "5:DAYS",
-        "2018-03-25 00:00:00.000");
+        "2018-03-26 00:00:00.000");
     // Test conversion from simple date format to another simple date format (America/Los_Angeles timezone with 1 day
     // granularity)
     testDateTimeConvert("20180418T01:00:00", "1:HOURS:SIMPLE_DATE_FORMAT:yyyyMMdd''T''HH:mm:ss",
diff --git a/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/transformer/datetime/DateTimeConverterTest.java b/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/transformer/datetime/DateTimeConverterTest.java
index 0e91f2d..2761354 100644
--- a/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/transformer/datetime/DateTimeConverterTest.java
+++ b/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/transformer/datetime/DateTimeConverterTest.java
@@ -218,7 +218,7 @@ public class DateTimeConverterTest {
           1523560598000L /* 20180412T19:16:38 */, 1524160502000L /* 20180419T17:55:02 */, 1522230205000L
           /* 20180328T09:43:25 */
       };
-      String[] expected = {"2018-04-10 00:00:00.000", "2018-04-15 00:00:00.000", "2018-03-25 00:00:00.000"};
+      String[] expected = {"2018-04-11 00:00:00.000", "2018-04-16 00:00:00.000", "2018-03-26 00:00:00.000"};
       entries.add(new Object[]{
           "1:MILLISECONDS:EPOCH", "1:MILLISECONDS:SIMPLE_DATE_FORMAT:yyyy-MM-dd HH:mm:ss.SSS tz(America/Denver)",
           "5:DAYS", input, expected
@@ -356,7 +356,7 @@ public class DateTimeConverterTest {
       // Test conversion from simple date format to another simple date format (America/Denver timezone with 5 day
       // granualrity)
       String[] input = {"20180412T19:16:38", "20180419T17:55:02", "20180328T09:43:25"};
-      String[] expected = {"2018-04-10 00:00:00.000", "2018-04-15 00:00:00.000", "2018-03-25 00:00:00.000"};
+      String[] expected = {"2018-04-11 00:00:00.000", "2018-04-16 00:00:00.000", "2018-03-26 00:00:00.000"};
       entries.add(new Object[]{
           "1:HOURS:SIMPLE_DATE_FORMAT:yyyyMMdd'T'HH:mm:ss",
           "1:MILLISECONDS:SIMPLE_DATE_FORMAT:yyyy-MM-dd HH:mm:ss.SSS tz(America/Denver)", "5:DAYS", input, expected

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org