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 2023/07/06 06:10:51 UTC

[pinot] branch master updated: Improve `DateTimeGranularitySpec` to follow the convention of new dateTimeField format (#11030)

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 f3f1c3ecbe Improve `DateTimeGranularitySpec` to follow the convention of new dateTimeField format (#11030)
f3f1c3ecbe is described below

commit f3f1c3ecbe79ff23909049d09687b32b8385c44f
Author: Sanskar Modi <sa...@gmail.com>
AuthorDate: Thu Jul 6 11:40:44 2023 +0530

    Improve `DateTimeGranularitySpec` to follow the convention of new dateTimeField format (#11030)
---
 .../pinot/spi/data/DateTimeGranularitySpec.java    | 54 +++++++++++++---
 .../spi/data/DateTimeGranularitySpecTest.java      | 71 ++++++++++++++++++++++
 2 files changed, 115 insertions(+), 10 deletions(-)

diff --git a/pinot-spi/src/main/java/org/apache/pinot/spi/data/DateTimeGranularitySpec.java b/pinot-spi/src/main/java/org/apache/pinot/spi/data/DateTimeGranularitySpec.java
index c8cd10eb15..4e60d45dc6 100644
--- a/pinot-spi/src/main/java/org/apache/pinot/spi/data/DateTimeGranularitySpec.java
+++ b/pinot-spi/src/main/java/org/apache/pinot/spi/data/DateTimeGranularitySpec.java
@@ -29,10 +29,16 @@ import org.apache.pinot.spi.utils.StringUtil;
  * Class to represent granularity from {@link DateTimeFieldSpec}
  */
 public class DateTimeGranularitySpec {
-  // 'size:timeUnit'
-  private static final char SEPARATOR = ':';
-  private static final int SIZE_POSITION = 0;
-  private static final int TIME_UNIT_POSITION = 1;
+  // Colon format: 'size:timeUnit'
+  private static final char COLON_SEPARATOR = ':';
+  private static final int COLON_FORMAT_SIZE_POSITION = 0;
+  private static final int COLON_FORMAT_TIME_UNIT_POSITION = 1;
+
+  // Pipe format: 'timeUnit|size'
+  private static final char PIPE_SEPARATOR = '|';
+  private static final int PIPE_FORMAT_TIME_UNIT_POSITION = 0;
+  private static final int PIPE_FORMAT_SIZE_POSITION = 1;
+
   private static final int NUM_TOKENS = 2;
 
   private final int _size;
@@ -43,21 +49,40 @@ public class DateTimeGranularitySpec {
    */
   public DateTimeGranularitySpec(String granularity) {
     Preconditions.checkArgument(StringUtils.isNotEmpty(granularity), "Must provide granularity");
-    String[] granularityTokens = StringUtil.split(granularity, SEPARATOR, 2);
+
+    char separator;
+    int sizePosition;
+    int timeUnitPosition;
+
+    if (Character.isDigit(granularity.charAt(0))) {
+      // Colon format: 'size:timeUnit'
+      separator = COLON_SEPARATOR;
+      sizePosition = COLON_FORMAT_SIZE_POSITION;
+      timeUnitPosition = COLON_FORMAT_TIME_UNIT_POSITION;
+    } else {
+      // Pipe format: 'timeUnit|size'
+      separator = PIPE_SEPARATOR;
+      sizePosition = PIPE_FORMAT_SIZE_POSITION;
+      timeUnitPosition = PIPE_FORMAT_TIME_UNIT_POSITION;
+    }
+
+    String[] granularityTokens = StringUtil.split(granularity, separator, 2);
     Preconditions.checkArgument(granularityTokens.length >= NUM_TOKENS,
-        "Invalid granularity: %s, must be of format 'size:timeUnit", granularity);
+            "Invalid granularity: %s, must be of format 'timeUnit|size' or 'size:timeUnit'", granularity);
+
     try {
-      _size = Integer.parseInt(granularityTokens[SIZE_POSITION]);
+      _size = Integer.parseInt(granularityTokens[sizePosition]);
     } catch (Exception e) {
       throw new IllegalArgumentException(
-          String.format("Invalid size: %s in granularity: %s", granularityTokens[SIZE_POSITION], granularity));
+          String.format("Invalid size: %s in granularity: %s", granularityTokens[sizePosition], granularity));
     }
     Preconditions.checkArgument(_size > 0, "Invalid size: %s in granularity: %s, must be positive", _size, granularity);
+
     try {
-      _timeUnit = TimeUnit.valueOf(granularityTokens[TIME_UNIT_POSITION]);
+      _timeUnit = TimeUnit.valueOf(granularityTokens[timeUnitPosition]);
     } catch (Exception e) {
       throw new IllegalArgumentException(
-          String.format("Invalid time unit: %s in granularity: %s", granularityTokens[TIME_UNIT_POSITION],
+          String.format("Invalid time unit: %s in granularity: %s", granularityTokens[timeUnitPosition],
               granularity));
     }
   }
@@ -82,6 +107,15 @@ public class DateTimeGranularitySpec {
 
   /**
    * Converts a granularity to millis.
+   *
+   * Using new format:
+   * <ul>
+   *   <li>1) granularityToMillis(HOURS|1) = 3600000 (60*60*1000)</li>
+   *   <li>2) granularityToMillis(MILLISECONDS|1) = 1</li>
+   *   <li>3) granularityToMillis(MINUTES|15) = 900000 (15*60*1000)</li>
+   * </ul>
+   *
+   * Using old format:
    * <ul>
    *   <li>1) granularityToMillis(1:HOURS) = 3600000 (60*60*1000)</li>
    *   <li>2) granularityToMillis(1:MILLISECONDS) = 1</li>
diff --git a/pinot-spi/src/test/java/org/apache/pinot/spi/data/DateTimeGranularitySpecTest.java b/pinot-spi/src/test/java/org/apache/pinot/spi/data/DateTimeGranularitySpecTest.java
new file mode 100644
index 0000000000..487a2380c0
--- /dev/null
+++ b/pinot-spi/src/test/java/org/apache/pinot/spi/data/DateTimeGranularitySpecTest.java
@@ -0,0 +1,71 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.pinot.spi.data;
+
+import java.util.concurrent.TimeUnit;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertThrows;
+
+
+public class DateTimeGranularitySpecTest {
+
+  @Test
+  public void testDateTimeGranularitySpec() {
+    // Old format
+    DateTimeGranularitySpec dateTimeGranularitySpec = new DateTimeGranularitySpec("1:HOURS");
+    assertEquals(dateTimeGranularitySpec.getSize(), 1);
+    assertEquals(dateTimeGranularitySpec.getTimeUnit(), TimeUnit.HOURS);
+    assertEquals(dateTimeGranularitySpec.granularityToMillis(), 3600000);
+
+    dateTimeGranularitySpec = new DateTimeGranularitySpec("15:MINUTES");
+    assertEquals(dateTimeGranularitySpec.getSize(), 15);
+    assertEquals(dateTimeGranularitySpec.getTimeUnit(), TimeUnit.MINUTES);
+    assertEquals(dateTimeGranularitySpec.granularityToMillis(), 900000);
+
+    dateTimeGranularitySpec = new DateTimeGranularitySpec("1:MILLISECONDS");
+    assertEquals(dateTimeGranularitySpec.getSize(), 1);
+    assertEquals(dateTimeGranularitySpec.getTimeUnit(), TimeUnit.MILLISECONDS);
+    assertEquals(dateTimeGranularitySpec.granularityToMillis(), 1);
+
+    // New format
+    dateTimeGranularitySpec = new DateTimeGranularitySpec("HOURS|1");
+    assertEquals(dateTimeGranularitySpec.getSize(), 1);
+    assertEquals(dateTimeGranularitySpec.getTimeUnit(), TimeUnit.HOURS);
+    assertEquals(dateTimeGranularitySpec.granularityToMillis(), 3600000);
+
+    dateTimeGranularitySpec = new DateTimeGranularitySpec("MINUTES|15");
+    assertEquals(dateTimeGranularitySpec.getSize(), 15);
+    assertEquals(dateTimeGranularitySpec.getTimeUnit(), TimeUnit.MINUTES);
+    assertEquals(dateTimeGranularitySpec.granularityToMillis(), 900000);
+
+    dateTimeGranularitySpec = new DateTimeGranularitySpec("MILLISECONDS|1");
+    assertEquals(dateTimeGranularitySpec.getSize(), 1);
+    assertEquals(dateTimeGranularitySpec.getTimeUnit(), TimeUnit.MILLISECONDS);
+    assertEquals(dateTimeGranularitySpec.granularityToMillis(), 1);
+
+    assertThrows(IllegalArgumentException.class, () -> new DateTimeGranularitySpec("DAY:1"));
+    assertThrows(IllegalArgumentException.class, () -> new DateTimeGranularitySpec("1|DAY"));
+    assertThrows(IllegalArgumentException.class, () -> new DateTimeGranularitySpec("DAY:DAY"));
+    assertThrows(IllegalArgumentException.class, () -> new DateTimeGranularitySpec("1:1"));
+    assertThrows(IllegalArgumentException.class, () -> new DateTimeGranularitySpec("1:DAY:EPOCH"));
+  }
+}


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