You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ma...@apache.org on 2021/05/17 21:03:22 UTC
[incubator-pinot] branch master updated: Add support for Long in
Modulo partition function. (#6929)
This is an automated email from the ASF dual-hosted git repository.
mayanks pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git
The following commit(s) were added to refs/heads/master by this push:
new 5b7023a Add support for Long in Modulo partition function. (#6929)
5b7023a is described below
commit 5b7023a4e75d91ea75d4f5f575d440b602bf3df6
Author: Mayank Shrivastava <ma...@apache.org>
AuthorDate: Mon May 17 14:02:05 2021 -0700
Add support for Long in Modulo partition function. (#6929)
- Currently, the `ModuloPartitionFunction` class only supports `int` and `String`,
with this PR, we also add support for `long`.
- Also fixed String to be parsed as Long, to be able to support both `long` and `int`.
---
.../local/partition/ModuloPartitionFunction.java | 6 ++++-
.../local/partition/PartitionFunctionTest.java | 29 ++++++++++++++++++----
2 files changed, 29 insertions(+), 6 deletions(-)
diff --git a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/partition/ModuloPartitionFunction.java b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/partition/ModuloPartitionFunction.java
index 52371ac..4d32f3c 100644
--- a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/partition/ModuloPartitionFunction.java
+++ b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/partition/ModuloPartitionFunction.java
@@ -53,8 +53,12 @@ public class ModuloPartitionFunction implements PartitionFunction {
public int getPartition(Object value) {
if (value instanceof Integer) {
return ((Integer) value) % _numPartitions;
+ } else if (value instanceof Long) {
+ // Since _numPartitions is int, the modulo should also be int.
+ return (int) (((Long) value) % _numPartitions);
} else if (value instanceof String) {
- return ((Integer.parseInt((String) value)) % _numPartitions);
+ // Parse String as Long, to support both Integer and Long.
+ return (int) ((Long.parseLong((String) value)) % _numPartitions);
} else {
throw new IllegalArgumentException(
"Illegal argument for partitioning, expected Integer, got: " + value.getClass().getName());
diff --git a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/partition/PartitionFunctionTest.java b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/partition/PartitionFunctionTest.java
index ccda88c..c5fcb55 100644
--- a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/partition/PartitionFunctionTest.java
+++ b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/partition/PartitionFunctionTest.java
@@ -57,10 +57,29 @@ public class PartitionFunctionTest {
Assert.assertEquals(partitionFunction.toString().toLowerCase(), functionName.toLowerCase());
Assert.assertEquals(partitionFunction.getNumPartitions(), expectedNumPartitions);
+ // Test int values.
for (int j = 0; j < 1000; j++) {
int value = random.nextInt();
Assert.assertEquals(partitionFunction.getPartition(value), (value % expectedNumPartitions));
}
+
+ // Test long values.
+ for (int j = 0; j < 1000; j++) {
+ long value = random.nextLong();
+ Assert.assertEquals(partitionFunction.getPartition(value), (value % expectedNumPartitions));
+ }
+
+ // Test Integer represented as String.
+ for (int j = 0; j < 1000; j++) {
+ int value = random.nextInt();
+ Assert.assertEquals(partitionFunction.getPartition(Integer.toString(value)), (value % expectedNumPartitions));
+ }
+
+ // Test Long represented as String.
+ for (int j = 0; j < 1000; j++) {
+ long value = random.nextLong();
+ Assert.assertEquals(partitionFunction.getPartition(Long.toString(value)), (value % expectedNumPartitions));
+ }
}
}
@@ -92,9 +111,10 @@ public class PartitionFunctionTest {
Assert.assertEquals(partitionFunction.getNumPartitions(), expectedNumPartitions);
for (int j = 0; j < 1000; j++) {
- Integer value = random.nextInt();
- Assert.assertTrue(partitionFunction.getPartition(value.toString()) < expectedNumPartitions,
- "Illegal: " + partitionFunction.getPartition(value.toString()) + " " + expectedNumPartitions);
+ int value = random.nextInt();
+ String stringValue = Integer.toString(value);
+ Assert.assertTrue(partitionFunction.getPartition(stringValue) < expectedNumPartitions,
+ "Illegal: " + partitionFunction.getPartition(stringValue) + " " + expectedNumPartitions);
}
}
}
@@ -169,8 +189,7 @@ public class PartitionFunctionTest {
// 10 values of size 7, were randomly generated, using {@link Random::nextBytes} with seed 100
// Applied org.apache.kafka.common.utils.Utils::murmur2 to those values and stored in expectedMurmurValues
int[] expectedMurmurValues =
- new int[]{-1044832774, -594851693, 1441878663, 1766739604, 1034724141, -296671913, 443511156, 1483601453,
- 1819695080, -931669296};
+ new int[]{-1044832774, -594851693, 1441878663, 1766739604, 1034724141, -296671913, 443511156, 1483601453, 1819695080, -931669296};
long seed = 100;
Random random = new Random(seed);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org