This is an automated email from the ASF dual-hosted git repository.
wgtmac pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/parquet-java.git
The following commit(s) were added to refs/heads/master by this push:
new 6129423db GH-3627: Add missing onAppend() to
VariantBuilder#appendUUIDBytes (#3624)
6129423db is described below
commit 6129423db38721c9de79448543af9d09f174cf66
Author: Eduard Tudenhoefner <[email protected]>
AuthorDate: Wed Jun 24 08:23:00 2026 +0200
GH-3627: Add missing onAppend() to VariantBuilder#appendUUIDBytes (#3624)
---
.../org/apache/parquet/variant/VariantBuilder.java | 1 +
.../parquet/variant/TestVariantArrayBuilder.java | 31 ++++++++++++++++++++++
.../parquet/variant/TestVariantObjectBuilder.java | 25 +++++++++++++++++
.../parquet/variant/TestVariantScalarBuilder.java | 24 +++++++++++++++++
4 files changed, 81 insertions(+)
diff --git
a/parquet-variant/src/main/java/org/apache/parquet/variant/VariantBuilder.java
b/parquet-variant/src/main/java/org/apache/parquet/variant/VariantBuilder.java
index 4e166190d..5b0ae146f 100644
---
a/parquet-variant/src/main/java/org/apache/parquet/variant/VariantBuilder.java
+++
b/parquet-variant/src/main/java/org/apache/parquet/variant/VariantBuilder.java
@@ -420,6 +420,7 @@ public class VariantBuilder {
* @param bytes a 16-byte value.
*/
void appendUUIDBytes(ByteBuffer bytes) {
+ onAppend();
checkCapacity(1 + VariantUtil.UUID_SIZE);
writeBuffer[writePos++] = VariantUtil.primitiveHeader(VariantUtil.UUID);
if (bytes.remaining() < VariantUtil.UUID_SIZE) {
diff --git
a/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantArrayBuilder.java
b/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantArrayBuilder.java
index ccb4f7b1f..98060d218 100644
---
a/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantArrayBuilder.java
+++
b/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantArrayBuilder.java
@@ -18,6 +18,9 @@
*/
package org.apache.parquet.variant;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.UUID;
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
@@ -26,6 +29,34 @@ import org.slf4j.LoggerFactory;
public class TestVariantArrayBuilder {
private static final Logger LOG =
LoggerFactory.getLogger(TestVariantArrayBuilder.class);
+ @Test
+ public void testArrayBuilderWithUUIDBytes() {
+ byte[] uuid = new byte[] {0, 17, 34, 51, 68, 85, 102, 119, -120, -103,
-86, -69, -52, -35, -18, -1};
+ long msb = ByteBuffer.wrap(uuid, 0,
8).order(ByteOrder.BIG_ENDIAN).getLong();
+ long lsb = ByteBuffer.wrap(uuid, 8,
8).order(ByteOrder.BIG_ENDIAN).getLong();
+ UUID expected = new UUID(msb, lsb);
+
+ VariantBuilder builder = new VariantBuilder();
+ VariantArrayBuilder array = builder.startArray();
+ array.appendInt(1);
+ // appendUUIDBytes must go through onAppend() so that the element offset
is recorded and
+ // numValues is incremented. Otherwise the offset list is wrong and the
UUID element is lost.
+ array.appendUUIDBytes(ByteBuffer.wrap(uuid));
+ array.appendInt(2);
+ builder.endArray();
+
+ VariantTestUtil.testVariant(builder.build(), v -> {
+ VariantTestUtil.checkType(v, VariantUtil.ARRAY, Variant.Type.ARRAY);
+ Assert.assertEquals(3, v.numArrayElements());
+ VariantTestUtil.checkType(v.getElementAtIndex(0), VariantUtil.PRIMITIVE,
Variant.Type.INT);
+ Assert.assertEquals(1, v.getElementAtIndex(0).getInt());
+ VariantTestUtil.checkType(v.getElementAtIndex(1), VariantUtil.PRIMITIVE,
Variant.Type.UUID);
+ Assert.assertEquals(expected, v.getElementAtIndex(1).getUUID());
+ VariantTestUtil.checkType(v.getElementAtIndex(2), VariantUtil.PRIMITIVE,
Variant.Type.INT);
+ Assert.assertEquals(2, v.getElementAtIndex(2).getInt());
+ });
+ }
+
@Test
public void testEmptyArrayBuilder() {
VariantBuilder b = new VariantBuilder();
diff --git
a/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantObjectBuilder.java
b/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantObjectBuilder.java
index d657f354b..56e8d1e3c 100644
---
a/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantObjectBuilder.java
+++
b/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantObjectBuilder.java
@@ -19,6 +19,8 @@
package org.apache.parquet.variant;
import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.UUID;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
@@ -28,6 +30,29 @@ import org.slf4j.LoggerFactory;
public class TestVariantObjectBuilder {
private static final Logger LOG =
LoggerFactory.getLogger(TestVariantObjectBuilder.class);
+ @Test
+ public void testObjectBuilderWithUUIDBytes() {
+ byte[] uuid = new byte[] {0, 17, 34, 51, 68, 85, 102, 119, -120, -103,
-86, -69, -52, -35, -18, -1};
+ long msb = ByteBuffer.wrap(uuid, 0,
8).order(ByteOrder.BIG_ENDIAN).getLong();
+ long lsb = ByteBuffer.wrap(uuid, 8,
8).order(ByteOrder.BIG_ENDIAN).getLong();
+ UUID expected = new UUID(msb, lsb);
+
+ VariantBuilder builder = new VariantBuilder();
+ VariantObjectBuilder object = builder.startObject();
+ object.appendKey("id");
+ // appendUUIDBytes must go through onAppend() so that numValues stays in
sync with the
+ // appended keys. Otherwise endObject() throws because keys (1) != values
(0).
+ object.appendUUIDBytes(ByteBuffer.wrap(uuid));
+ builder.endObject();
+
+ VariantTestUtil.testVariant(builder.build(), v -> {
+ VariantTestUtil.checkType(v, VariantUtil.OBJECT, Variant.Type.OBJECT);
+ Assert.assertEquals(1, v.numObjectElements());
+ VariantTestUtil.checkType(v.getFieldByKey("id"), VariantUtil.PRIMITIVE,
Variant.Type.UUID);
+ Assert.assertEquals(expected, v.getFieldByKey("id").getUUID());
+ });
+ }
+
@Test
public void testEmptyObjectBuilder() {
VariantBuilder b = new VariantBuilder();
diff --git
a/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantScalarBuilder.java
b/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantScalarBuilder.java
index 05a05d806..36cee318a 100644
---
a/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantScalarBuilder.java
+++
b/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantScalarBuilder.java
@@ -512,4 +512,28 @@ public class TestVariantScalarBuilder {
// expected
}
}
+
+ @Test
+ public void testUUIDBytesBuilder() {
+ byte[] uuid = new byte[] {0, 17, 34, 51, 68, 85, 102, 119, -120, -103,
-86, -69, -52, -35, -18, -1};
+ long msb = ByteBuffer.wrap(uuid, 0,
8).order(ByteOrder.BIG_ENDIAN).getLong();
+ long lsb = ByteBuffer.wrap(uuid, 8,
8).order(ByteOrder.BIG_ENDIAN).getLong();
+ UUID expected = new UUID(msb, lsb);
+
+ VariantBuilder vb = new VariantBuilder();
+ vb.appendUUIDBytes(ByteBuffer.wrap(uuid));
+ VariantTestUtil.testVariant(vb.build(), v -> {
+ VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE, Variant.Type.UUID);
+ Assert.assertEquals(expected, v.getUUID());
+ });
+
+ // appendUUIDBytes must go through onAppend(), so a second append on the
root builder
+ // (which already holds a value) must be rejected instead of producing a
multi-value buffer.
+ try {
+ vb.appendUUIDBytes(ByteBuffer.wrap(uuid));
+ Assert.fail("Expected Exception when appending multiple values");
+ } catch (Exception e) {
+ // expected
+ }
+ }
}