diff --git a/core/src/main/java/org/apache/iceberg/variants/PrimitiveWrapper.java b/core/src/main/java/org/apache/iceberg/variants/PrimitiveWrapper.java index 8eebf2f8b998..772215c7db0c 100644 --- a/core/src/main/java/org/apache/iceberg/variants/PrimitiveWrapper.java +++ b/core/src/main/java/org/apache/iceberg/variants/PrimitiveWrapper.java @@ -210,4 +210,9 @@ public int writeTo(ByteBuffer outBuffer, int offset) { throw new UnsupportedOperationException("Unsupported primitive type: " + type()); } + + @Override + public String toString() { + return VariantPrimitive.asString(this); + } } diff --git a/core/src/main/java/org/apache/iceberg/variants/SerializedMetadata.java b/core/src/main/java/org/apache/iceberg/variants/SerializedMetadata.java index 4b078e313e6a..a837a8258f09 100644 --- a/core/src/main/java/org/apache/iceberg/variants/SerializedMetadata.java +++ b/core/src/main/java/org/apache/iceberg/variants/SerializedMetadata.java @@ -111,4 +111,9 @@ public String get(int index) { public ByteBuffer buffer() { return metadata; } + + @Override + public String toString() { + return VariantMetadata.asString(this); + } } diff --git a/core/src/main/java/org/apache/iceberg/variants/SerializedObject.java b/core/src/main/java/org/apache/iceberg/variants/SerializedObject.java index db0d932f8f44..b43fd10dc1e3 100644 --- a/core/src/main/java/org/apache/iceberg/variants/SerializedObject.java +++ b/core/src/main/java/org/apache/iceberg/variants/SerializedObject.java @@ -228,4 +228,9 @@ public ByteBuffer buffer() { public int sizeInBytes() { return value.remaining(); } + + @Override + public String toString() { + return VariantObject.asString(this); + } } diff --git a/core/src/main/java/org/apache/iceberg/variants/SerializedPrimitive.java b/core/src/main/java/org/apache/iceberg/variants/SerializedPrimitive.java index 1a6bd37a4ff3..e213133fbf8e 100644 --- a/core/src/main/java/org/apache/iceberg/variants/SerializedPrimitive.java +++ b/core/src/main/java/org/apache/iceberg/variants/SerializedPrimitive.java @@ -127,4 +127,9 @@ public Object get() { public ByteBuffer buffer() { return value; } + + @Override + public String toString() { + return VariantPrimitive.asString(this); + } } diff --git a/core/src/main/java/org/apache/iceberg/variants/SerializedShortString.java b/core/src/main/java/org/apache/iceberg/variants/SerializedShortString.java index 3004a075def1..805ae7f98a2e 100644 --- a/core/src/main/java/org/apache/iceberg/variants/SerializedShortString.java +++ b/core/src/main/java/org/apache/iceberg/variants/SerializedShortString.java @@ -66,4 +66,9 @@ public String get() { public ByteBuffer buffer() { return value; } + + @Override + public String toString() { + return VariantPrimitive.asString(this); + } } diff --git a/core/src/main/java/org/apache/iceberg/variants/ShreddedObject.java b/core/src/main/java/org/apache/iceberg/variants/ShreddedObject.java index fc248bb2a94d..28bc16a6b9f9 100644 --- a/core/src/main/java/org/apache/iceberg/variants/ShreddedObject.java +++ b/core/src/main/java/org/apache/iceberg/variants/ShreddedObject.java @@ -261,4 +261,9 @@ private int writeTo(ByteBuffer buffer, int offset) { return (dataOffset - offset) + dataSize; } } + + @Override + public String toString() { + return VariantObject.asString(this); + } } diff --git a/core/src/main/java/org/apache/iceberg/variants/VariantMetadata.java b/core/src/main/java/org/apache/iceberg/variants/VariantMetadata.java index e9478b249e9a..b21585b2a5be 100644 --- a/core/src/main/java/org/apache/iceberg/variants/VariantMetadata.java +++ b/core/src/main/java/org/apache/iceberg/variants/VariantMetadata.java @@ -34,4 +34,20 @@ public interface VariantMetadata extends Variants.Serialized { /** Returns the size of the metadata dictionary. */ int dictionarySize(); + + static String asString(VariantMetadata metadata) { + StringBuilder builder = new StringBuilder(); + + builder.append("VariantMetadata(dict={"); + for (int i = 0; i < metadata.dictionarySize(); i += 1) { + if (i > 0) { + builder.append(", "); + } + + builder.append(i).append(" => ").append(metadata.get(i)); + } + builder.append("})"); + + return builder.toString(); + } } diff --git a/core/src/main/java/org/apache/iceberg/variants/VariantObject.java b/core/src/main/java/org/apache/iceberg/variants/VariantObject.java index 33696dae41c2..3a06e279ef5c 100644 --- a/core/src/main/java/org/apache/iceberg/variants/VariantObject.java +++ b/core/src/main/java/org/apache/iceberg/variants/VariantObject.java @@ -38,4 +38,23 @@ default Variants.PhysicalType type() { default VariantObject asObject() { return this; } + + static String asString(VariantObject object) { + StringBuilder builder = new StringBuilder(); + + builder.append("VariantObject(fields={"); + boolean first = true; + for (String field : object.fieldNames()) { + if (first) { + first = false; + } else { + builder.append(", "); + } + + builder.append(field).append(": ").append(object.get(field)); + } + builder.append("})"); + + return builder.toString(); + } } diff --git a/core/src/main/java/org/apache/iceberg/variants/VariantPrimitive.java b/core/src/main/java/org/apache/iceberg/variants/VariantPrimitive.java index 73efb45ae91b..739989c4c79b 100644 --- a/core/src/main/java/org/apache/iceberg/variants/VariantPrimitive.java +++ b/core/src/main/java/org/apache/iceberg/variants/VariantPrimitive.java @@ -18,6 +18,11 @@ */ package org.apache.iceberg.variants; +import java.nio.ByteBuffer; +import org.apache.iceberg.relocated.com.google.common.io.BaseEncoding; +import org.apache.iceberg.util.ByteBuffers; +import org.apache.iceberg.util.DateTimeUtil; + /** A primitive variant value. */ public interface VariantPrimitive extends VariantValue { T get(); @@ -26,4 +31,23 @@ public interface VariantPrimitive extends VariantValue { default VariantPrimitive asPrimitive() { return this; } + + private String valueAsString() { + switch (type()) { + case DATE: + return DateTimeUtil.daysToIsoDate((Integer) get()); + case TIMESTAMPTZ: + return DateTimeUtil.microsToIsoTimestamptz((Long) get()); + case TIMESTAMPNTZ: + return DateTimeUtil.microsToIsoTimestamp((Long) get()); + case BINARY: + return BaseEncoding.base16().encode(ByteBuffers.toByteArray((ByteBuffer) get())); + default: + return String.valueOf(get()); + } + } + + static String asString(VariantPrimitive primitive) { + return "Variant(type=" + primitive.type() + ", value=" + primitive.valueAsString() + ")"; + } }