You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/06/30 05:48:16 UTC
[doris] branch master updated: [Fix](multi-catalog) optimize hashcode for PartitionKey. (#21307)
This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 8f4b7c8f3d [Fix](multi-catalog) optimize hashcode for PartitionKey. (#21307)
8f4b7c8f3d is described below
commit 8f4b7c8f3d2c0416693594bb780d4439d2f23c3d
Author: Xiangyu Wang <du...@gmail.com>
AuthorDate: Fri Jun 30 13:48:08 2023 +0800
[Fix](multi-catalog) optimize hashcode for PartitionKey. (#21307)
---
.../java/org/apache/doris/analysis/DateLiteral.java | 6 ++++--
.../java/org/apache/doris/catalog/PartitionKey.java | 6 +++++-
.../java/org/apache/doris/catalog/PartitionKeyTest.java | 17 +++++++++++++++++
3 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
index f9a4cd15ca..1eda2f2c9f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
@@ -56,7 +56,6 @@ import java.time.temporal.TemporalAccessor;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.TimeZone;
import java.util.regex.Pattern;
@@ -1086,7 +1085,10 @@ public class DateLiteral extends LiteralExpr {
@Override
public int hashCode() {
- return 31 * super.hashCode() + Objects.hashCode(unixTimestamp(TimeZone.getDefault()));
+ // do not invoke the super.hashCode(), just use the return value of getLongValue()
+ // a DateV2 DateLiteral obj may be equal to a Date DateLiteral
+ // if the return value of getLongValue() is the same
+ return Long.hashCode(getLongValue());
}
// parse the date string value in 'value' by 'format' pattern.
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionKey.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionKey.java
index b9e8f11b9c..70d667a519 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionKey.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionKey.java
@@ -434,11 +434,15 @@ public class PartitionKey implements Comparable<PartitionKey>, Writable {
@Override
public int hashCode() {
+ int hashCode = 1;
+ for (LiteralExpr key : keys) {
+ hashCode = 31 * hashCode + (key == null ? 0 : key.hashCode());
+ }
int ret = types.size() * 1000;
for (PrimitiveType type : types) {
ret += type.ordinal();
}
- return ret;
+ return hashCode + ret;
}
public static class PartitionKeySerializer implements JsonSerializer<PartitionKey> {
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/PartitionKeyTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/PartitionKeyTest.java
index fc10460615..7030a237a4 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/PartitionKeyTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/PartitionKeyTest.java
@@ -79,6 +79,7 @@ public class PartitionKeyTest {
pk1 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("127"), new PartitionValue("32767")),
Arrays.asList(tinyInt, smallInt));
pk2 = PartitionKey.createInfinityPartitionKey(Arrays.asList(tinyInt, smallInt), true);
+ Assert.assertTrue(pk1.hashCode() != pk2.hashCode());
Assert.assertTrue(!pk1.equals(pk2) && pk1.compareTo(pk2) == -1);
// case2
@@ -86,6 +87,7 @@ public class PartitionKeyTest {
Arrays.asList(tinyInt, smallInt));
pk2 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("127"), new PartitionValue("-32768")),
Arrays.asList(tinyInt, smallInt));
+ Assert.assertTrue(pk1.hashCode() == pk2.hashCode());
Assert.assertTrue(pk1.equals(pk2) && pk1.compareTo(pk2) == 0);
// case3
@@ -93,6 +95,7 @@ public class PartitionKeyTest {
Arrays.asList(int32, bigInt));
pk2 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("128"), new PartitionValue("-32768")),
Arrays.asList(int32, bigInt));
+ Assert.assertTrue(pk1.hashCode() != pk2.hashCode());
Assert.assertTrue(!pk1.equals(pk2) && pk1.compareTo(pk2) == -1);
// case4
@@ -100,6 +103,7 @@ public class PartitionKeyTest {
Arrays.asList(largeInt, bigInt));
pk2 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("127"), new PartitionValue("12346")),
Arrays.asList(largeInt, bigInt));
+ Assert.assertTrue(pk1.hashCode() != pk2.hashCode());
Assert.assertTrue(!pk1.equals(pk2) && pk1.compareTo(pk2) == -1);
// case5
@@ -107,24 +111,28 @@ public class PartitionKeyTest {
Arrays.asList(date, datetime));
pk2 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("2014-12-12"), new PartitionValue("2014-12-12 10:00:01")),
Arrays.asList(date, datetime));
+ Assert.assertTrue(pk1.hashCode() != pk2.hashCode());
Assert.assertTrue(!pk1.equals(pk2) && pk1.compareTo(pk2) == -1);
// case6
pk1 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("-128")),
Arrays.asList(tinyInt, smallInt));
pk2 = PartitionKey.createInfinityPartitionKey(Arrays.asList(tinyInt, smallInt), false);
+ Assert.assertTrue(pk1.hashCode() == pk2.hashCode());
Assert.assertTrue(pk1.equals(pk2) && pk1.compareTo(pk2) == 0);
// case7
pk1 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("127")),
Arrays.asList(tinyInt, smallInt));
pk2 = PartitionKey.createInfinityPartitionKey(Arrays.asList(tinyInt, smallInt), true);
+ Assert.assertTrue(pk1.hashCode() != pk2.hashCode());
Assert.assertTrue(!pk1.equals(pk2) && pk1.compareTo(pk2) == -1);
// case7
pk1 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("127"), new PartitionValue("32767")),
Arrays.asList(tinyInt, smallInt));
pk2 = PartitionKey.createInfinityPartitionKey(Arrays.asList(tinyInt, smallInt), true);
+ Assert.assertTrue(pk1.hashCode() != pk2.hashCode());
Assert.assertTrue(!pk1.equals(pk2) && pk1.compareTo(pk2) == -1);
// case8
@@ -134,6 +142,7 @@ public class PartitionKeyTest {
new PartitionValue("9999-12-31"), new PartitionValue("9999-12-31 23:59:59")),
allColumns);
pk2 = PartitionKey.createInfinityPartitionKey(allColumns, true);
+ Assert.assertTrue(pk1.hashCode() != pk2.hashCode());
Assert.assertTrue(!pk1.equals(pk2) && pk1.compareTo(pk2) == -1);
// case9
@@ -143,6 +152,7 @@ public class PartitionKeyTest {
new PartitionValue("0000-01-01"), new PartitionValue("0000-01-01 00:00:00")),
allColumns);
pk2 = PartitionKey.createInfinityPartitionKey(allColumns, false);
+ Assert.assertTrue(pk1.hashCode() == pk2.hashCode());
Assert.assertTrue(pk1.equals(pk2) && pk1.compareTo(pk2) == 0);
// case10
@@ -151,6 +161,7 @@ public class PartitionKeyTest {
new PartitionValue("0"), new PartitionValue("1970-01-01"), new PartitionValue("1970-01-01 00:00:00")),
allColumns);
pk2 = PartitionKey.createInfinityPartitionKey(allColumns, false);
+ Assert.assertTrue(pk1.hashCode() != pk2.hashCode());
Assert.assertTrue(!pk1.equals(pk2) && pk1.compareTo(pk2) == 1);
// case11
@@ -158,6 +169,7 @@ public class PartitionKeyTest {
Arrays.asList(charString, varchar));
pk2 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("beijing"), new PartitionValue("shanghai")),
Arrays.asList(charString, varchar));
+ Assert.assertTrue(pk1.hashCode() == pk2.hashCode());
Assert.assertTrue(pk1.equals(pk2) && pk1.compareTo(pk2) == 0);
// case12
@@ -165,6 +177,7 @@ public class PartitionKeyTest {
Arrays.asList(charString, varchar));
pk2 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("shijiazhuang"), new PartitionValue("tianjin")),
Arrays.asList(charString, varchar));
+ Assert.assertTrue(pk1.hashCode() != pk2.hashCode());
Assert.assertTrue(!pk1.equals(pk2) && pk1.compareTo(pk2) == -1);
// case13
@@ -172,6 +185,7 @@ public class PartitionKeyTest {
Arrays.asList(charString, varchar));
pk2 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("beijing"), new PartitionValue("tianjin")),
Arrays.asList(charString, varchar));
+ Assert.assertTrue(pk1.hashCode() != pk2.hashCode());
Assert.assertTrue(!pk1.equals(pk2) && pk1.compareTo(pk2) == -1);
// case14
@@ -179,6 +193,7 @@ public class PartitionKeyTest {
Arrays.asList(bool));
pk2 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("false")),
Arrays.asList(bool));
+ Assert.assertTrue(pk1.hashCode() != pk2.hashCode());
Assert.assertTrue(!pk1.equals(pk2) && pk1.compareTo(pk2) == 1);
// case15
@@ -186,6 +201,7 @@ public class PartitionKeyTest {
Arrays.asList(bool));
pk2 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("true")),
Arrays.asList(bool));
+ Assert.assertTrue(pk1.hashCode() == pk2.hashCode());
Assert.assertTrue(pk1.equals(pk2) && pk1.compareTo(pk2) == 0);
// case16
@@ -193,6 +209,7 @@ public class PartitionKeyTest {
Arrays.asList(bool));
pk2 = PartitionKey.createPartitionKey(Arrays.asList(new PartitionValue("false")),
Arrays.asList(bool));
+ Assert.assertTrue(pk1.hashCode() == pk2.hashCode());
Assert.assertTrue(pk1.equals(pk2) && pk1.compareTo(pk2) == 0);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org