This is an automated email from the ASF dual-hosted git repository. lzljs3620320 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-paimon.git
The following commit(s) were added to refs/heads/master by this push: new 6c70566f8 [core] Introduce serializeToString and deserializeFromString for internal data structure (#2629) 6c70566f8 is described below commit 6c70566f88f0d9ef35125ac714fccda7dee0896f Author: Zouxxyy <zouxinyu....@alibaba-inc.com> AuthorDate: Thu Jan 4 09:31:08 2024 +0800 [core] Introduce serializeToString and deserializeFromString for internal data structure (#2629) --- .../data/serializer/BinaryStringSerializer.java | 10 +++ .../paimon/data/serializer/BooleanSerializer.java | 10 +++ .../paimon/data/serializer/ByteSerializer.java | 10 +++ .../paimon/data/serializer/DecimalSerializer.java | 11 +++ .../paimon/data/serializer/DoubleSerializer.java | 10 +++ .../paimon/data/serializer/FloatSerializer.java | 10 +++ .../paimon/data/serializer/IntSerializer.java | 10 +++ .../paimon/data/serializer/LongSerializer.java | 10 +++ .../apache/paimon/data/serializer/Serializer.java | 22 ++++++ .../paimon/data/serializer/ShortSerializer.java | 10 +++ .../data/serializer/TimestampSerializer.java | 11 +++ .../serializer/BinaryStringSerializerTest.java | 13 ++++ .../data/serializer/BooleanSerializerTest.java | 9 +++ .../paimon/data/serializer/ByteSerializerTest.java | 14 ++++ .../data/serializer/DecimalSerializerTest.java | 84 ++++++++++++++++++++-- .../data/serializer/DoubleSerializerTest.java | 17 +++++ .../data/serializer/FloatSerializerTest.java | 21 +++++- .../paimon/data/serializer/IntSerializerTest.java | 16 +++++ .../paimon/data/serializer/LongSerializerTest.java | 16 +++++ .../paimon/data/serializer/SerializerTestBase.java | 25 +++++++ .../data/serializer/ShortSerializerTest.java | 16 +++++ .../data/serializer/TimestampSerializerTest.java | 55 ++++++++++++++ 22 files changed, 402 insertions(+), 8 deletions(-) diff --git a/paimon-common/src/main/java/org/apache/paimon/data/serializer/BinaryStringSerializer.java b/paimon-common/src/main/java/org/apache/paimon/data/serializer/BinaryStringSerializer.java index 7f6077f73..10547e71c 100644 --- a/paimon-common/src/main/java/org/apache/paimon/data/serializer/BinaryStringSerializer.java +++ b/paimon-common/src/main/java/org/apache/paimon/data/serializer/BinaryStringSerializer.java @@ -61,4 +61,14 @@ public final class BinaryStringSerializer extends SerializerSingleton<BinaryStri source.readFully(bytes); return BinaryString.fromBytes(bytes); } + + @Override + public String serializeToString(BinaryString record) { + return record.toString(); + } + + @Override + public BinaryString deserializeFromString(String s) { + return BinaryString.fromString(s); + } } diff --git a/paimon-common/src/main/java/org/apache/paimon/data/serializer/BooleanSerializer.java b/paimon-common/src/main/java/org/apache/paimon/data/serializer/BooleanSerializer.java index f725f9acf..af6abc20d 100644 --- a/paimon-common/src/main/java/org/apache/paimon/data/serializer/BooleanSerializer.java +++ b/paimon-common/src/main/java/org/apache/paimon/data/serializer/BooleanSerializer.java @@ -45,4 +45,14 @@ public final class BooleanSerializer extends SerializerSingleton<Boolean> { public Boolean deserialize(DataInputView source) throws IOException { return source.readBoolean(); } + + @Override + public String serializeToString(Boolean record) { + return record.toString(); + } + + @Override + public Boolean deserializeFromString(String s) { + return Boolean.valueOf(s); + } } diff --git a/paimon-common/src/main/java/org/apache/paimon/data/serializer/ByteSerializer.java b/paimon-common/src/main/java/org/apache/paimon/data/serializer/ByteSerializer.java index c10d5ef82..3638d03f4 100644 --- a/paimon-common/src/main/java/org/apache/paimon/data/serializer/ByteSerializer.java +++ b/paimon-common/src/main/java/org/apache/paimon/data/serializer/ByteSerializer.java @@ -45,4 +45,14 @@ public final class ByteSerializer extends SerializerSingleton<Byte> { public Byte deserialize(DataInputView source) throws IOException { return source.readByte(); } + + @Override + public String serializeToString(Byte record) { + return record.toString(); + } + + @Override + public Byte deserializeFromString(String s) { + return Byte.valueOf(s); + } } diff --git a/paimon-common/src/main/java/org/apache/paimon/data/serializer/DecimalSerializer.java b/paimon-common/src/main/java/org/apache/paimon/data/serializer/DecimalSerializer.java index ff8b6199b..7c67f8b4b 100644 --- a/paimon-common/src/main/java/org/apache/paimon/data/serializer/DecimalSerializer.java +++ b/paimon-common/src/main/java/org/apache/paimon/data/serializer/DecimalSerializer.java @@ -23,6 +23,7 @@ import org.apache.paimon.io.DataInputView; import org.apache.paimon.io.DataOutputView; import java.io.IOException; +import java.math.BigDecimal; /** Serializer for {@link Decimal}. */ public final class DecimalSerializer implements Serializer<Decimal> { @@ -64,6 +65,16 @@ public final class DecimalSerializer implements Serializer<Decimal> { } } + @Override + public String serializeToString(Decimal record) { + return record.toString(); + } + + @Override + public Decimal deserializeFromString(String s) { + return Decimal.fromBigDecimal(new BigDecimal(s), precision, scale); + } + @Override public DecimalSerializer duplicate() { return new DecimalSerializer(precision, scale); diff --git a/paimon-common/src/main/java/org/apache/paimon/data/serializer/DoubleSerializer.java b/paimon-common/src/main/java/org/apache/paimon/data/serializer/DoubleSerializer.java index 5532f2130..2fc9d8887 100644 --- a/paimon-common/src/main/java/org/apache/paimon/data/serializer/DoubleSerializer.java +++ b/paimon-common/src/main/java/org/apache/paimon/data/serializer/DoubleSerializer.java @@ -45,4 +45,14 @@ public final class DoubleSerializer extends SerializerSingleton<Double> { public Double deserialize(DataInputView source) throws IOException { return source.readDouble(); } + + @Override + public String serializeToString(Double record) { + return record.toString(); + } + + @Override + public Double deserializeFromString(String s) { + return Double.valueOf(s); + } } diff --git a/paimon-common/src/main/java/org/apache/paimon/data/serializer/FloatSerializer.java b/paimon-common/src/main/java/org/apache/paimon/data/serializer/FloatSerializer.java index 73ccd339e..5d3326159 100644 --- a/paimon-common/src/main/java/org/apache/paimon/data/serializer/FloatSerializer.java +++ b/paimon-common/src/main/java/org/apache/paimon/data/serializer/FloatSerializer.java @@ -45,4 +45,14 @@ public final class FloatSerializer extends SerializerSingleton<Float> { public Float deserialize(DataInputView source) throws IOException { return source.readFloat(); } + + @Override + public String serializeToString(Float record) { + return record.toString(); + } + + @Override + public Float deserializeFromString(String s) { + return Float.valueOf(s); + } } diff --git a/paimon-common/src/main/java/org/apache/paimon/data/serializer/IntSerializer.java b/paimon-common/src/main/java/org/apache/paimon/data/serializer/IntSerializer.java index aa4572a78..dd1336792 100644 --- a/paimon-common/src/main/java/org/apache/paimon/data/serializer/IntSerializer.java +++ b/paimon-common/src/main/java/org/apache/paimon/data/serializer/IntSerializer.java @@ -45,4 +45,14 @@ public final class IntSerializer extends SerializerSingleton<Integer> { public Integer deserialize(DataInputView source) throws IOException { return source.readInt(); } + + @Override + public String serializeToString(Integer record) { + return record.toString(); + } + + @Override + public Integer deserializeFromString(String s) { + return Integer.valueOf(s); + } } diff --git a/paimon-common/src/main/java/org/apache/paimon/data/serializer/LongSerializer.java b/paimon-common/src/main/java/org/apache/paimon/data/serializer/LongSerializer.java index 1461fa8ea..f32dd5980 100644 --- a/paimon-common/src/main/java/org/apache/paimon/data/serializer/LongSerializer.java +++ b/paimon-common/src/main/java/org/apache/paimon/data/serializer/LongSerializer.java @@ -45,4 +45,14 @@ public final class LongSerializer extends SerializerSingleton<Long> { public Long deserialize(DataInputView source) throws IOException { return source.readLong(); } + + @Override + public String serializeToString(Long record) { + return record.toString(); + } + + @Override + public Long deserializeFromString(String s) { + return Long.valueOf(s); + } } diff --git a/paimon-common/src/main/java/org/apache/paimon/data/serializer/Serializer.java b/paimon-common/src/main/java/org/apache/paimon/data/serializer/Serializer.java index b03ee8f32..ebcb02d70 100644 --- a/paimon-common/src/main/java/org/apache/paimon/data/serializer/Serializer.java +++ b/paimon-common/src/main/java/org/apache/paimon/data/serializer/Serializer.java @@ -65,4 +65,26 @@ public interface Serializer<T> extends Serializable { * it reads. */ T deserialize(DataInputView source) throws IOException; + + /** + * Serializes the given record to string. + * + * @param record The record to serialize. + * @return The serialized element. + */ + default String serializeToString(T record) { + throw new UnsupportedOperationException( + String.format("serialize %s to string is unsupported", record)); + } + + /** + * De-serializes a record from string. + * + * @param s The string to de-serialize. + * @return The deserialized element. + */ + default T deserializeFromString(String s) { + throw new UnsupportedOperationException( + String.format("deserialize %s from string is unsupported", s)); + } } diff --git a/paimon-common/src/main/java/org/apache/paimon/data/serializer/ShortSerializer.java b/paimon-common/src/main/java/org/apache/paimon/data/serializer/ShortSerializer.java index 0d5669d89..0526bef13 100644 --- a/paimon-common/src/main/java/org/apache/paimon/data/serializer/ShortSerializer.java +++ b/paimon-common/src/main/java/org/apache/paimon/data/serializer/ShortSerializer.java @@ -45,4 +45,14 @@ public final class ShortSerializer extends SerializerSingleton<Short> { public Short deserialize(DataInputView source) throws IOException { return source.readShort(); } + + @Override + public String serializeToString(Short record) { + return record.toString(); + } + + @Override + public Short deserializeFromString(String s) { + return Short.valueOf(s); + } } diff --git a/paimon-common/src/main/java/org/apache/paimon/data/serializer/TimestampSerializer.java b/paimon-common/src/main/java/org/apache/paimon/data/serializer/TimestampSerializer.java index 818a73aa7..fdaf0caf0 100644 --- a/paimon-common/src/main/java/org/apache/paimon/data/serializer/TimestampSerializer.java +++ b/paimon-common/src/main/java/org/apache/paimon/data/serializer/TimestampSerializer.java @@ -21,6 +21,7 @@ package org.apache.paimon.data.serializer; import org.apache.paimon.data.Timestamp; import org.apache.paimon.io.DataInputView; import org.apache.paimon.io.DataOutputView; +import org.apache.paimon.utils.DateTimeUtils; import java.io.IOException; @@ -73,6 +74,16 @@ public class TimestampSerializer implements Serializer<Timestamp> { } } + @Override + public String serializeToString(Timestamp record) { + return DateTimeUtils.formatTimestamp(record, precision); + } + + @Override + public Timestamp deserializeFromString(String s) { + return DateTimeUtils.parseTimestampData(s, precision); + } + @Override public boolean equals(Object obj) { if (this == obj) { diff --git a/paimon-common/src/test/java/org/apache/paimon/data/serializer/BinaryStringSerializerTest.java b/paimon-common/src/test/java/org/apache/paimon/data/serializer/BinaryStringSerializerTest.java index d60ffa9bf..2ab9d5fa6 100644 --- a/paimon-common/src/test/java/org/apache/paimon/data/serializer/BinaryStringSerializerTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/data/serializer/BinaryStringSerializerTest.java @@ -19,8 +19,10 @@ package org.apache.paimon.data.serializer; import org.apache.paimon.data.BinaryString; +import org.apache.paimon.utils.Pair; import java.util.Arrays; +import java.util.List; /** Test for {@link BinaryStringSerializer}. */ public class BinaryStringSerializerTest extends SerializerTestBase<BinaryString> { @@ -44,4 +46,15 @@ public class BinaryStringSerializerTest extends SerializerTestBase<BinaryString> .map(BinaryString::fromString) .toArray(BinaryString[]::new); } + + @Override + protected List<Pair<BinaryString, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of(BinaryString.fromString("a"), "a"), + Pair.of(BinaryString.fromString(""), ""), + Pair.of( + BinaryString.fromString("jbmbmner8 jhk hj \n \t üäßß@µ"), + "jbmbmner8 jhk hj \n \t üäßß@µ"), + Pair.of(BinaryString.fromString("non-empty"), "non-empty")); + } } diff --git a/paimon-common/src/test/java/org/apache/paimon/data/serializer/BooleanSerializerTest.java b/paimon-common/src/test/java/org/apache/paimon/data/serializer/BooleanSerializerTest.java index 23d1b04ef..2cf706855 100644 --- a/paimon-common/src/test/java/org/apache/paimon/data/serializer/BooleanSerializerTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/data/serializer/BooleanSerializerTest.java @@ -18,6 +18,10 @@ package org.apache.paimon.data.serializer; +import org.apache.paimon.utils.Pair; + +import java.util.Arrays; +import java.util.List; import java.util.Random; /** Test for {@link BooleanSerializer}. */ @@ -41,4 +45,9 @@ public class BooleanSerializerTest extends SerializerTestBase<Boolean> { Boolean.TRUE, Boolean.FALSE, rnd.nextBoolean(), rnd.nextBoolean(), rnd.nextBoolean() }; } + + @Override + protected List<Pair<Boolean, String>> getSerializableToStringTestData() { + return Arrays.asList(Pair.of(Boolean.TRUE, "true"), Pair.of(Boolean.FALSE, "false")); + } } diff --git a/paimon-common/src/test/java/org/apache/paimon/data/serializer/ByteSerializerTest.java b/paimon-common/src/test/java/org/apache/paimon/data/serializer/ByteSerializerTest.java index 88e465191..7d1163a50 100644 --- a/paimon-common/src/test/java/org/apache/paimon/data/serializer/ByteSerializerTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/data/serializer/ByteSerializerTest.java @@ -18,6 +18,10 @@ package org.apache.paimon.data.serializer; +import org.apache.paimon.utils.Pair; + +import java.util.Arrays; +import java.util.List; import java.util.Random; /** Test for {@link ByteSerializer}. */ @@ -40,4 +44,14 @@ public class ByteSerializerTest extends SerializerTestBase<Byte> { return new Byte[] {0, 1, -1, Byte.MAX_VALUE, Byte.MIN_VALUE, rndShort, (byte) -rndShort}; } + + @Override + protected List<Pair<Byte, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of((byte) 0, "0"), + Pair.of((byte) 1, "1"), + Pair.of((byte) -1, "-1"), + Pair.of(Byte.MAX_VALUE, "127"), + Pair.of(Byte.MIN_VALUE, "-128")); + } } diff --git a/paimon-common/src/test/java/org/apache/paimon/data/serializer/DecimalSerializerTest.java b/paimon-common/src/test/java/org/apache/paimon/data/serializer/DecimalSerializerTest.java index c81a54c69..95ac5694d 100644 --- a/paimon-common/src/test/java/org/apache/paimon/data/serializer/DecimalSerializerTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/data/serializer/DecimalSerializerTest.java @@ -19,13 +19,18 @@ package org.apache.paimon.data.serializer; import org.apache.paimon.data.Decimal; +import org.apache.paimon.utils.Pair; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; /** Test for {@link DecimalSerializer}. */ -public class DecimalSerializerTest extends SerializerTestBase<Decimal> { +public abstract class DecimalSerializerTest extends SerializerTestBase<Decimal> { @Override protected DecimalSerializer createSerializer() { - return new DecimalSerializer(5, 2); + return new DecimalSerializer(getPrecision(), getScale()); } @Override @@ -33,13 +38,80 @@ public class DecimalSerializerTest extends SerializerTestBase<Decimal> { return t1.equals(t2); } + protected abstract int getPrecision(); + + protected abstract int getScale(); + @Override protected Decimal[] getTestData() { return new Decimal[] { - Decimal.fromUnscaledLong(1, 5, 2), - Decimal.fromUnscaledLong(2, 5, 2), - Decimal.fromUnscaledLong(3, 5, 2), - Decimal.fromUnscaledLong(4, 5, 2) + Decimal.fromUnscaledLong(1, getPrecision(), getScale()), + Decimal.fromUnscaledLong(2, getPrecision(), getScale()), + Decimal.fromUnscaledLong(3, getPrecision(), getScale()), + Decimal.fromUnscaledLong(4, getPrecision(), getScale()) }; } + + static final class DecimalSerializer2Test extends DecimalSerializerTest { + @Override + protected int getPrecision() { + return 5; + } + + @Override + protected int getScale() { + return 2; + } + } + + @Override + protected List<Pair<Decimal, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of( + Decimal.fromBigDecimal(new BigDecimal("0.01"), getPrecision(), getScale()), + "0.01"), + Pair.of( + Decimal.fromBigDecimal(new BigDecimal("22.02"), getPrecision(), getScale()), + "22.02"), + Pair.of( + Decimal.fromBigDecimal(new BigDecimal("33.30"), getPrecision(), getScale()), + "33.30"), + Pair.of( + Decimal.fromBigDecimal( + new BigDecimal("444.40"), getPrecision(), getScale()), + "444.40")); + } + + static final class DecimalSerializer3Test extends DecimalSerializerTest { + @Override + protected int getPrecision() { + return 6; + } + + @Override + protected int getScale() { + return 3; + } + + @Override + protected List<Pair<Decimal, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of( + Decimal.fromBigDecimal( + new BigDecimal("0.001"), getPrecision(), getScale()), + "0.001"), + Pair.of( + Decimal.fromBigDecimal( + new BigDecimal("22.002"), getPrecision(), getScale()), + "22.002"), + Pair.of( + Decimal.fromBigDecimal( + new BigDecimal("33.030"), getPrecision(), getScale()), + "33.030"), + Pair.of( + Decimal.fromBigDecimal( + new BigDecimal("444.400"), getPrecision(), getScale()), + "444.400")); + } + } } diff --git a/paimon-common/src/test/java/org/apache/paimon/data/serializer/DoubleSerializerTest.java b/paimon-common/src/test/java/org/apache/paimon/data/serializer/DoubleSerializerTest.java index 1cbf4d52e..7c22123cc 100644 --- a/paimon-common/src/test/java/org/apache/paimon/data/serializer/DoubleSerializerTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/data/serializer/DoubleSerializerTest.java @@ -18,6 +18,10 @@ package org.apache.paimon.data.serializer; +import org.apache.paimon.utils.Pair; + +import java.util.Arrays; +import java.util.List; import java.util.Random; /** Test for {@link DoubleSerializer}. */ @@ -51,4 +55,17 @@ public class DoubleSerializerTest extends SerializerTestBase<Double> { Double.POSITIVE_INFINITY }; } + + @Override + protected List<Pair<Double, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of(0.0, "0.0"), + Pair.of(1.0, "1.0"), + Pair.of(-1.0, "-1.0"), + Pair.of(Double.MAX_VALUE, "1.7976931348623157E308"), + Pair.of(Double.MIN_VALUE, "4.9E-324"), + Pair.of(Double.NaN, "NaN"), + Pair.of(Double.NEGATIVE_INFINITY, "-Infinity"), + Pair.of(Double.POSITIVE_INFINITY, "Infinity")); + } } diff --git a/paimon-common/src/test/java/org/apache/paimon/data/serializer/FloatSerializerTest.java b/paimon-common/src/test/java/org/apache/paimon/data/serializer/FloatSerializerTest.java index 2a85ce638..bbe5675cc 100644 --- a/paimon-common/src/test/java/org/apache/paimon/data/serializer/FloatSerializerTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/data/serializer/FloatSerializerTest.java @@ -18,6 +18,10 @@ package org.apache.paimon.data.serializer; +import org.apache.paimon.utils.Pair; + +import java.util.Arrays; +import java.util.List; import java.util.Random; /** Test for {@link FloatSerializer}. */ @@ -39,9 +43,9 @@ public class FloatSerializerTest extends SerializerTestBase<Float> { float rndFloat = rnd.nextFloat() * Float.MAX_VALUE; return new Float[] { - (float) 0, + 0F, 1F, - (float) -1, + -1F, Float.MAX_VALUE, Float.MIN_VALUE, rndFloat, @@ -51,4 +55,17 @@ public class FloatSerializerTest extends SerializerTestBase<Float> { Float.POSITIVE_INFINITY }; } + + @Override + protected List<Pair<Float, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of(0F, "0.0"), + Pair.of(1F, "1.0"), + Pair.of(-1F, "-1.0"), + Pair.of(Float.MAX_VALUE, "3.4028235E38"), + Pair.of(Float.MIN_VALUE, "1.4E-45"), + Pair.of(Float.NaN, "NaN"), + Pair.of(Float.NEGATIVE_INFINITY, "-Infinity"), + Pair.of(Float.POSITIVE_INFINITY, "Infinity")); + } } diff --git a/paimon-common/src/test/java/org/apache/paimon/data/serializer/IntSerializerTest.java b/paimon-common/src/test/java/org/apache/paimon/data/serializer/IntSerializerTest.java index 303b370b5..915ea649f 100644 --- a/paimon-common/src/test/java/org/apache/paimon/data/serializer/IntSerializerTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/data/serializer/IntSerializerTest.java @@ -18,6 +18,10 @@ package org.apache.paimon.data.serializer; +import org.apache.paimon.utils.Pair; + +import java.util.Arrays; +import java.util.List; import java.util.Random; /** Test for {@link IntSerializer}. */ @@ -40,4 +44,16 @@ public class IntSerializerTest extends SerializerTestBase<Integer> { return new Integer[] {0, 1, -1, Integer.MAX_VALUE, Integer.MIN_VALUE, rndInt, -rndInt}; } + + @Override + protected List<Pair<Integer, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of(0, "0"), + Pair.of(1, "1"), + Pair.of(-1, "-1"), + Pair.of(Integer.MAX_VALUE, "2147483647"), + Pair.of(Integer.MIN_VALUE, "-2147483648"), + Pair.of(123456789, "123456789"), + Pair.of(-123456789, "-123456789")); + } } diff --git a/paimon-common/src/test/java/org/apache/paimon/data/serializer/LongSerializerTest.java b/paimon-common/src/test/java/org/apache/paimon/data/serializer/LongSerializerTest.java index 7f3c5e984..d16084e43 100644 --- a/paimon-common/src/test/java/org/apache/paimon/data/serializer/LongSerializerTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/data/serializer/LongSerializerTest.java @@ -18,6 +18,10 @@ package org.apache.paimon.data.serializer; +import org.apache.paimon.utils.Pair; + +import java.util.Arrays; +import java.util.List; import java.util.Random; /** Test for {@link LongSerializer}. */ @@ -40,4 +44,16 @@ public class LongSerializerTest extends SerializerTestBase<Long> { return new Long[] {0L, 1L, -1L, Long.MAX_VALUE, Long.MIN_VALUE, rndLong, -rndLong}; } + + @Override + protected List<Pair<Long, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of(0L, "0"), + Pair.of(1L, "1"), + Pair.of(-1L, "-1"), + Pair.of(Long.MAX_VALUE, "9223372036854775807"), + Pair.of(Long.MIN_VALUE, "-9223372036854775808"), + Pair.of(1234567890123456789L, "1234567890123456789"), + Pair.of(-1234567890123456789L, "-1234567890123456789")); + } } diff --git a/paimon-common/src/test/java/org/apache/paimon/data/serializer/SerializerTestBase.java b/paimon-common/src/test/java/org/apache/paimon/data/serializer/SerializerTestBase.java index ffc9047fa..457d9f505 100644 --- a/paimon-common/src/test/java/org/apache/paimon/data/serializer/SerializerTestBase.java +++ b/paimon-common/src/test/java/org/apache/paimon/data/serializer/SerializerTestBase.java @@ -23,7 +23,9 @@ import org.apache.paimon.io.DataInputView; import org.apache.paimon.io.DataOutputSerializer; import org.apache.paimon.io.DataOutputView; import org.apache.paimon.utils.InstantiationUtil; +import org.apache.paimon.utils.Pair; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import javax.annotation.Nonnull; @@ -34,6 +36,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.concurrent.CyclicBarrier; @@ -54,6 +57,10 @@ public abstract class SerializerTestBase<T> { return getTestData(); } + protected List<Pair<T, String>> getSerializableToStringTestData() { + return Collections.emptyList(); + } + // -------------------------------------------------------------------------------------------- @Test @@ -220,6 +227,24 @@ public abstract class SerializerTestBase<T> { } } + @Test + protected void testSerializeToString() { + try { + Serializer<T> serializer = getSerializer(); + List<Pair<T, String>> serializableToStringTestData = getSerializableToStringTestData(); + for (Pair<T, String> datumToString : serializableToStringTestData) { + String s = serializer.serializeToString(datumToString.getLeft()); + Assertions.assertEquals(datumToString.getRight(), s); + T deserialized = serializer.deserializeFromString(s); + deepEquals("Deserialized value if wrong.", datumToString.getLeft(), deserialized); + } + } catch (Exception e) { + System.err.println(e.getMessage()); + e.printStackTrace(); + fail("Exception in test: " + e.getMessage()); + } + } + // -------------------------------------------------------------------------------------------- private void deepEquals(String message, T should, T is) { diff --git a/paimon-common/src/test/java/org/apache/paimon/data/serializer/ShortSerializerTest.java b/paimon-common/src/test/java/org/apache/paimon/data/serializer/ShortSerializerTest.java index 0ae8c8e75..89a2e8f7b 100644 --- a/paimon-common/src/test/java/org/apache/paimon/data/serializer/ShortSerializerTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/data/serializer/ShortSerializerTest.java @@ -18,6 +18,10 @@ package org.apache.paimon.data.serializer; +import org.apache.paimon.utils.Pair; + +import java.util.Arrays; +import java.util.List; import java.util.Random; /** Test for {@link ShortSerializer}. */ @@ -42,4 +46,16 @@ public class ShortSerializerTest extends SerializerTestBase<Short> { 0, 1, -1, Short.MAX_VALUE, Short.MIN_VALUE, rndShort, (short) -rndShort }; } + + @Override + protected List<Pair<Short, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of((short) 0, "0"), + Pair.of((short) 1, "1"), + Pair.of((short) -1, "-1"), + Pair.of(Short.MAX_VALUE, "32767"), + Pair.of(Short.MIN_VALUE, "-32768"), + Pair.of((short) 12345, "12345"), + Pair.of((short) -12345, "-12345")); + } } diff --git a/paimon-common/src/test/java/org/apache/paimon/data/serializer/TimestampSerializerTest.java b/paimon-common/src/test/java/org/apache/paimon/data/serializer/TimestampSerializerTest.java index 7d67459a4..2642eb067 100644 --- a/paimon-common/src/test/java/org/apache/paimon/data/serializer/TimestampSerializerTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/data/serializer/TimestampSerializerTest.java @@ -19,6 +19,11 @@ package org.apache.paimon.data.serializer; import org.apache.paimon.data.Timestamp; +import org.apache.paimon.utils.DateTimeUtils; +import org.apache.paimon.utils.Pair; + +import java.util.Arrays; +import java.util.List; /** Test for {@link TimestampSerializer}. */ public abstract class TimestampSerializerTest extends SerializerTestBase<Timestamp> { @@ -50,6 +55,17 @@ public abstract class TimestampSerializerTest extends SerializerTestBase<Timesta protected int getPrecision() { return 0; } + + @Override + protected List<Pair<Timestamp, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of( + DateTimeUtils.parseTimestampData("2019-01-01 00:00:00", getPrecision()), + "2019-01-01 00:00:00"), + Pair.of( + DateTimeUtils.parseTimestampData("2019-01-01 00:00:01", getPrecision()), + "2019-01-01 00:00:01")); + } } static final class TimestampSerializer3Test extends TimestampSerializerTest { @@ -57,6 +73,19 @@ public abstract class TimestampSerializerTest extends SerializerTestBase<Timesta protected int getPrecision() { return 3; } + + @Override + protected List<Pair<Timestamp, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of( + DateTimeUtils.parseTimestampData( + "2019-01-01 00:00:00.000", getPrecision()), + "2019-01-01 00:00:00.000"), + Pair.of( + DateTimeUtils.parseTimestampData( + "2019-01-01 00:00:00.001", getPrecision()), + "2019-01-01 00:00:00.001")); + } } static final class TimestampSerializer6Test extends TimestampSerializerTest { @@ -64,6 +93,19 @@ public abstract class TimestampSerializerTest extends SerializerTestBase<Timesta protected int getPrecision() { return 6; } + + @Override + protected List<Pair<Timestamp, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of( + DateTimeUtils.parseTimestampData( + "2019-01-01 00:00:00.000000", getPrecision()), + "2019-01-01 00:00:00.000000"), + Pair.of( + DateTimeUtils.parseTimestampData( + "2019-01-01 00:00:00.000001", getPrecision()), + "2019-01-01 00:00:00.000001")); + } } static final class TimestampSerializer8Test extends TimestampSerializerTest { @@ -71,5 +113,18 @@ public abstract class TimestampSerializerTest extends SerializerTestBase<Timesta protected int getPrecision() { return 8; } + + @Override + protected List<Pair<Timestamp, String>> getSerializableToStringTestData() { + return Arrays.asList( + Pair.of( + DateTimeUtils.parseTimestampData( + "2019-01-01 00:00:00.00000000", getPrecision()), + "2019-01-01 00:00:00.00000000"), + Pair.of( + DateTimeUtils.parseTimestampData( + "2019-01-01 00:00:00.00000001", getPrecision()), + "2019-01-01 00:00:00.00000001")); + } } }