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"));
+        }
     }
 }

Reply via email to