From 58e274b456f9c47d6e6b3f08c3f37494f8725df0 Mon Sep 17 00:00:00 2001 From: Keith Lee Date: Mon, 29 Dec 2025 10:06:50 +0000 Subject: [PATCH 01/11] Add BucketingFunctionTest, this allows rust client side to also run the same test and ensures consistency. --- .../bucketing/BucketingFunctionTest.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java diff --git a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java new file mode 100644 index 0000000000..88d79bc5cc --- /dev/null +++ b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java @@ -0,0 +1,66 @@ +package org.apache.fluss.bucketing; + +import org.apache.fluss.metadata.DataLakeFormat; +import org.junit.jupiter.api.Test; + +import java.nio.charset.StandardCharsets; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BucketingFunctionTest { + @Test + public void testDefaultBucketing() { + BucketingFunction defaultBucketing = BucketingFunction.of(null); + + assertThat(defaultBucketing.bucketing(new byte[]{(byte) 0, (byte) 10}, 7)) + .isEqualTo(1); + assertThat(defaultBucketing.bucketing(new byte[]{(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) + .isEqualTo(0); + assertThat(defaultBucketing.bucketing("2bb87d68-baf9-4e64-90f9-f80910419fa6".getBytes(StandardCharsets.UTF_8), 16)) + .isEqualTo(6); + assertThat(defaultBucketing.bucketing("The quick brown fox jumps over the lazy dog".getBytes(StandardCharsets.UTF_8), 8)) + .isEqualTo(6); + } + + @Test + public void testPaimonBucketing() { + BucketingFunction paimonBucketing = BucketingFunction.of(DataLakeFormat.PAIMON); + + assertThat(paimonBucketing.bucketing(new byte[]{(byte) 0, (byte) 10}, 7)) + .isEqualTo(1); + assertThat(paimonBucketing.bucketing(new byte[]{(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) + .isEqualTo(11); + assertThat(paimonBucketing.bucketing("2bb87d68-baf9-4e64-90f9-f80910419fa6".getBytes(StandardCharsets.UTF_8), 16)) + .isEqualTo(12); + assertThat(paimonBucketing.bucketing("The quick brown fox jumps over the lazy dog".getBytes(StandardCharsets.UTF_8), 8)) + .isEqualTo(0); + } + + @Test + public void testLanceBucketing() { + BucketingFunction lanceBucketing = BucketingFunction.of(DataLakeFormat.LANCE); + + assertThat(lanceBucketing.bucketing(new byte[]{(byte) 0, (byte) 10}, 7)) + .isEqualTo(1); + assertThat(lanceBucketing.bucketing(new byte[]{(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) + .isEqualTo(0); + assertThat(lanceBucketing.bucketing("2bb87d68-baf9-4e64-90f9-f80910419fa6".getBytes(StandardCharsets.UTF_8), 16)) + .isEqualTo(6); + assertThat(lanceBucketing.bucketing("The quick brown fox jumps over the lazy dog".getBytes(StandardCharsets.UTF_8), 8)) + .isEqualTo(6); + } + + @Test + public void testIcebergBucketing() { + BucketingFunction icebergBucketing = BucketingFunction.of(DataLakeFormat.ICEBERG); + + assertThat(icebergBucketing.bucketing(new byte[]{(byte) 0, (byte) 10}, 7)) + .isEqualTo(3); + assertThat(icebergBucketing.bucketing(new byte[]{(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) + .isEqualTo(4); + assertThat(icebergBucketing.bucketing("2bb87d68-baf9-4e64-90f9-f80910419fa6".getBytes(StandardCharsets.UTF_8), 16)) + .isEqualTo(12); + assertThat(icebergBucketing.bucketing("The quick brown fox jumps over the lazy dog".getBytes(StandardCharsets.UTF_8), 8)) + .isEqualTo(3); + } +} From fbdeb7821258ebabf2c95641d83aa75551488225 Mon Sep 17 00:00:00 2001 From: Keith Lee Date: Mon, 29 Dec 2025 10:15:02 +0000 Subject: [PATCH 02/11] Add BucketingFunctionTest, this allows rust client side to also run the same test and ensures consistency. --- .../fluss/bucketing/BucketingFunctionTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java index 88d79bc5cc..43b91e9968 100644 --- a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java +++ b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java @@ -1,3 +1,20 @@ +/* + * 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.fluss.bucketing; import org.apache.fluss.metadata.DataLakeFormat; From 1784a9c5faa299ce68f8fa91fc889ff6f0766409 Mon Sep 17 00:00:00 2001 From: Keith Lee Date: Mon, 29 Dec 2025 10:16:28 +0000 Subject: [PATCH 03/11] Add javadoc --- .../java/org/apache/fluss/bucketing/BucketingFunctionTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java index 43b91e9968..89e1e77f9f 100644 --- a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java +++ b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java @@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat; +/** Unit test for {@link BucketingFunction}. Rust client side has similar tests to ensure hashing consistency */ public class BucketingFunctionTest { @Test public void testDefaultBucketing() { From fced2fe5794880ed18825c11ec6b14ed2404bb92 Mon Sep 17 00:00:00 2001 From: Keith Lee Date: Mon, 29 Dec 2025 10:17:22 +0000 Subject: [PATCH 04/11] Spotless fix --- .../bucketing/BucketingFunctionTest.java | 82 ++++++++++++++----- 1 file changed, 61 insertions(+), 21 deletions(-) diff --git a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java index 89e1e77f9f..82282007fc 100644 --- a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java +++ b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java @@ -18,25 +18,38 @@ package org.apache.fluss.bucketing; import org.apache.fluss.metadata.DataLakeFormat; + import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; import static org.assertj.core.api.Assertions.assertThat; -/** Unit test for {@link BucketingFunction}. Rust client side has similar tests to ensure hashing consistency */ +/** + * Unit test for {@link BucketingFunction}. Rust client side has similar tests to ensure hashing + * consistency + */ public class BucketingFunctionTest { @Test public void testDefaultBucketing() { BucketingFunction defaultBucketing = BucketingFunction.of(null); - assertThat(defaultBucketing.bucketing(new byte[]{(byte) 0, (byte) 10}, 7)) - .isEqualTo(1); - assertThat(defaultBucketing.bucketing(new byte[]{(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) + assertThat(defaultBucketing.bucketing(new byte[] {(byte) 0, (byte) 10}, 7)).isEqualTo(1); + assertThat( + defaultBucketing.bucketing( + new byte[] {(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) .isEqualTo(0); - assertThat(defaultBucketing.bucketing("2bb87d68-baf9-4e64-90f9-f80910419fa6".getBytes(StandardCharsets.UTF_8), 16)) + assertThat( + defaultBucketing.bucketing( + "2bb87d68-baf9-4e64-90f9-f80910419fa6" + .getBytes(StandardCharsets.UTF_8), + 16)) .isEqualTo(6); - assertThat(defaultBucketing.bucketing("The quick brown fox jumps over the lazy dog".getBytes(StandardCharsets.UTF_8), 8)) + assertThat( + defaultBucketing.bucketing( + "The quick brown fox jumps over the lazy dog" + .getBytes(StandardCharsets.UTF_8), + 8)) .isEqualTo(6); } @@ -44,13 +57,22 @@ public void testDefaultBucketing() { public void testPaimonBucketing() { BucketingFunction paimonBucketing = BucketingFunction.of(DataLakeFormat.PAIMON); - assertThat(paimonBucketing.bucketing(new byte[]{(byte) 0, (byte) 10}, 7)) - .isEqualTo(1); - assertThat(paimonBucketing.bucketing(new byte[]{(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) + assertThat(paimonBucketing.bucketing(new byte[] {(byte) 0, (byte) 10}, 7)).isEqualTo(1); + assertThat( + paimonBucketing.bucketing( + new byte[] {(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) .isEqualTo(11); - assertThat(paimonBucketing.bucketing("2bb87d68-baf9-4e64-90f9-f80910419fa6".getBytes(StandardCharsets.UTF_8), 16)) + assertThat( + paimonBucketing.bucketing( + "2bb87d68-baf9-4e64-90f9-f80910419fa6" + .getBytes(StandardCharsets.UTF_8), + 16)) .isEqualTo(12); - assertThat(paimonBucketing.bucketing("The quick brown fox jumps over the lazy dog".getBytes(StandardCharsets.UTF_8), 8)) + assertThat( + paimonBucketing.bucketing( + "The quick brown fox jumps over the lazy dog" + .getBytes(StandardCharsets.UTF_8), + 8)) .isEqualTo(0); } @@ -58,13 +80,22 @@ public void testPaimonBucketing() { public void testLanceBucketing() { BucketingFunction lanceBucketing = BucketingFunction.of(DataLakeFormat.LANCE); - assertThat(lanceBucketing.bucketing(new byte[]{(byte) 0, (byte) 10}, 7)) - .isEqualTo(1); - assertThat(lanceBucketing.bucketing(new byte[]{(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) + assertThat(lanceBucketing.bucketing(new byte[] {(byte) 0, (byte) 10}, 7)).isEqualTo(1); + assertThat( + lanceBucketing.bucketing( + new byte[] {(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) .isEqualTo(0); - assertThat(lanceBucketing.bucketing("2bb87d68-baf9-4e64-90f9-f80910419fa6".getBytes(StandardCharsets.UTF_8), 16)) + assertThat( + lanceBucketing.bucketing( + "2bb87d68-baf9-4e64-90f9-f80910419fa6" + .getBytes(StandardCharsets.UTF_8), + 16)) .isEqualTo(6); - assertThat(lanceBucketing.bucketing("The quick brown fox jumps over the lazy dog".getBytes(StandardCharsets.UTF_8), 8)) + assertThat( + lanceBucketing.bucketing( + "The quick brown fox jumps over the lazy dog" + .getBytes(StandardCharsets.UTF_8), + 8)) .isEqualTo(6); } @@ -72,13 +103,22 @@ public void testLanceBucketing() { public void testIcebergBucketing() { BucketingFunction icebergBucketing = BucketingFunction.of(DataLakeFormat.ICEBERG); - assertThat(icebergBucketing.bucketing(new byte[]{(byte) 0, (byte) 10}, 7)) - .isEqualTo(3); - assertThat(icebergBucketing.bucketing(new byte[]{(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) + assertThat(icebergBucketing.bucketing(new byte[] {(byte) 0, (byte) 10}, 7)).isEqualTo(3); + assertThat( + icebergBucketing.bucketing( + new byte[] {(byte) 0, (byte) 10, (byte) 10, (byte) 10}, 12)) .isEqualTo(4); - assertThat(icebergBucketing.bucketing("2bb87d68-baf9-4e64-90f9-f80910419fa6".getBytes(StandardCharsets.UTF_8), 16)) + assertThat( + icebergBucketing.bucketing( + "2bb87d68-baf9-4e64-90f9-f80910419fa6" + .getBytes(StandardCharsets.UTF_8), + 16)) .isEqualTo(12); - assertThat(icebergBucketing.bucketing("The quick brown fox jumps over the lazy dog".getBytes(StandardCharsets.UTF_8), 8)) + assertThat( + icebergBucketing.bucketing( + "The quick brown fox jumps over the lazy dog" + .getBytes(StandardCharsets.UTF_8), + 8)) .isEqualTo(3); } } From 52e7ed16e57efb1dc03c9755dc13c3382e2742f5 Mon Sep 17 00:00:00 2001 From: Keith Lee Date: Sun, 4 Jan 2026 13:01:46 +0000 Subject: [PATCH 05/11] Update BucketingFunctionTest.java Co-authored-by: yuxia Luo --- .../org/apache/fluss/bucketing/BucketingFunctionTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java index 82282007fc..b7c5977751 100644 --- a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java +++ b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java @@ -26,7 +26,11 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Unit test for {@link BucketingFunction}. Rust client side has similar tests to ensure hashing + /** + * Unit tests for {@link BucketingFunction}. + * *

Maintains parity with Rust client tests to guarantee cross-client + * hashing consistency. + */ * consistency */ public class BucketingFunctionTest { From 48afeb083fc7f7fd9861aa2ba300e5ccfc872012 Mon Sep 17 00:00:00 2001 From: Keith Lee Date: Sun, 4 Jan 2026 13:01:59 +0000 Subject: [PATCH 06/11] Update BucketingFunctionTest.java Co-authored-by: yuxia Luo --- .../java/org/apache/fluss/bucketing/BucketingFunctionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java index b7c5977751..b14b07bcb5 100644 --- a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java +++ b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java @@ -33,7 +33,7 @@ */ * consistency */ -public class BucketingFunctionTest { +class BucketingFunctionTest { @Test public void testDefaultBucketing() { BucketingFunction defaultBucketing = BucketingFunction.of(null); From 4984c9dbc75657e109c7b1df017fad185fc9ca9b Mon Sep 17 00:00:00 2001 From: Keith Lee Date: Sun, 4 Jan 2026 13:02:06 +0000 Subject: [PATCH 07/11] Update BucketingFunctionTest.java Co-authored-by: yuxia Luo --- .../java/org/apache/fluss/bucketing/BucketingFunctionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java index b14b07bcb5..5ceaeb20a2 100644 --- a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java +++ b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java @@ -35,7 +35,7 @@ */ class BucketingFunctionTest { @Test - public void testDefaultBucketing() { + void testDefaultBucketing() { BucketingFunction defaultBucketing = BucketingFunction.of(null); assertThat(defaultBucketing.bucketing(new byte[] {(byte) 0, (byte) 10}, 7)).isEqualTo(1); From 719a9a4f4f764a383f97042a7682d8d648611a63 Mon Sep 17 00:00:00 2001 From: Keith Lee Date: Sun, 4 Jan 2026 13:02:12 +0000 Subject: [PATCH 08/11] Update BucketingFunctionTest.java Co-authored-by: yuxia Luo --- .../java/org/apache/fluss/bucketing/BucketingFunctionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java index 5ceaeb20a2..eac3dc7151 100644 --- a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java +++ b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java @@ -58,7 +58,7 @@ void testDefaultBucketing() { } @Test - public void testPaimonBucketing() { + void testPaimonBucketing() { BucketingFunction paimonBucketing = BucketingFunction.of(DataLakeFormat.PAIMON); assertThat(paimonBucketing.bucketing(new byte[] {(byte) 0, (byte) 10}, 7)).isEqualTo(1); From 3bd3168dabcf58282b145937a286b232a8a4c5dc Mon Sep 17 00:00:00 2001 From: Keith Lee Date: Sun, 4 Jan 2026 13:02:18 +0000 Subject: [PATCH 09/11] Update BucketingFunctionTest.java Co-authored-by: yuxia Luo --- .../java/org/apache/fluss/bucketing/BucketingFunctionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java index eac3dc7151..ee08f43060 100644 --- a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java +++ b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java @@ -81,7 +81,7 @@ void testPaimonBucketing() { } @Test - public void testLanceBucketing() { + void testLanceBucketing() { BucketingFunction lanceBucketing = BucketingFunction.of(DataLakeFormat.LANCE); assertThat(lanceBucketing.bucketing(new byte[] {(byte) 0, (byte) 10}, 7)).isEqualTo(1); From fe222f7d0183c3ca43d09edc983f73501dbb5226 Mon Sep 17 00:00:00 2001 From: Keith Lee Date: Sun, 4 Jan 2026 13:02:23 +0000 Subject: [PATCH 10/11] Update BucketingFunctionTest.java Co-authored-by: yuxia Luo --- .../java/org/apache/fluss/bucketing/BucketingFunctionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java index ee08f43060..2b8840a7a2 100644 --- a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java +++ b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java @@ -104,7 +104,7 @@ void testLanceBucketing() { } @Test - public void testIcebergBucketing() { + void testIcebergBucketing() { BucketingFunction icebergBucketing = BucketingFunction.of(DataLakeFormat.ICEBERG); assertThat(icebergBucketing.bucketing(new byte[] {(byte) 0, (byte) 10}, 7)).isEqualTo(3); From 1cf5a241fa7ff90e3173eece4d43bf70dfa53d3c Mon Sep 17 00:00:00 2001 From: Keith Lee Date: Mon, 5 Jan 2026 08:24:51 +0000 Subject: [PATCH 11/11] Fix javadoc --- .../apache/fluss/bucketing/BucketingFunctionTest.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java index 2b8840a7a2..c517f18807 100644 --- a/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java +++ b/fluss-common/src/test/java/org/apache/fluss/bucketing/BucketingFunctionTest.java @@ -25,14 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat; -/** - /** - * Unit tests for {@link BucketingFunction}. - * *

Maintains parity with Rust client tests to guarantee cross-client - * hashing consistency. - */ - * consistency - */ +/** Maintains parity with Rust client tests to guarantee cross-client hashing consistency. */ class BucketingFunctionTest { @Test void testDefaultBucketing() {