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