This is an automated email from the ASF dual-hosted git repository.

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory.git


The following commit(s) were added to refs/heads/main by this push:
     new 75dcd7ad fix(java): fix row format handling Optional of type with 
custom codec (#2321)
75dcd7ad is described below

commit 75dcd7ad1b202320e049f99b4816d52c50d96b48
Author: Steven Schlansker <[email protected]>
AuthorDate: Mon Jun 9 23:53:29 2025 -0700

    fix(java): fix row format handling Optional of type with custom codec 
(#2321)
    
    ## What does this PR do?
    
    Fix the logic for type with custom codec wrapped in Optional, currently
    causes compile error
    
    Please review #2320 first; this PR depends on that fix
    
    And please consider for a 0.11.0-rc2 if that happens, otherwise 0.11.1
---
 .../format/encoder/BaseBinaryEncoderBuilder.java   |  1 -
 .../fory/format/encoder/RowEncoderBuilder.java     | 14 +++----
 .../format/encoder/ImplementInterfaceTest.java     | 43 ++++++++++++++++++++++
 3 files changed, 49 insertions(+), 9 deletions(-)

diff --git 
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/BaseBinaryEncoderBuilder.java
 
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/BaseBinaryEncoderBuilder.java
index 332a2bcc..7ff21902 100644
--- 
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/BaseBinaryEncoderBuilder.java
+++ 
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/BaseBinaryEncoderBuilder.java
@@ -536,7 +536,6 @@ public abstract class BaseBinaryEncoderBuilder extends 
CodecBuilder {
       Set<TypeRef<?>> visitedCustomTypes) {
     Class<?> rawType = getRawType(typeRef);
     TypeRef<?> rewrittenType = 
customTypeHandler.replacementTypeFor(beanType.getRawType(), rawType);
-    ;
     if (rewrittenType != null
         && !visitedCustomTypes.contains(typeRef)
         && !typeRef.equals(rewrittenType)) {
diff --git 
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/RowEncoderBuilder.java
 
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/RowEncoderBuilder.java
index ac9118c8..7c3a581b 100644
--- 
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/RowEncoderBuilder.java
+++ 
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/RowEncoderBuilder.java
@@ -286,16 +286,14 @@ public class RowEncoderBuilder extends 
BaseBinaryEncoderBuilder {
       Descriptor d = 
getDescriptorByFieldName(schema.getFields().get(i).getName());
       TypeRef<?> fieldType = d.getTypeRef();
       Class<?> rawFieldType = fieldType.getRawType();
-      TypeRef<?> columnAccessType;
+      TypeRef<?> columnAccessType = fieldType;
       if (rawFieldType == Optional.class) {
         columnAccessType = TypeUtils.getTypeArguments(fieldType).get(0);
-      } else {
-        CustomCodec<?, ?> customEncoder = 
customTypeHandler.findCodec(beanClass, rawFieldType);
-        if (customEncoder == null) {
-          columnAccessType = fieldType;
-        } else {
-          columnAccessType = customEncoder.encodedType();
-        }
+      }
+      TypeRef<?> replacementType =
+          customTypeHandler.replacementTypeFor(beanClass, 
columnAccessType.getRawType());
+      if (replacementType != null) {
+        columnAccessType = replacementType;
       }
       String columnAccessMethodName =
           BinaryUtils.getElemAccessMethodName(columnAccessType, typeCtx);
diff --git 
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/ImplementInterfaceTest.java
 
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/ImplementInterfaceTest.java
index 40fec4e6..c174748a 100644
--- 
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/ImplementInterfaceTest.java
+++ 
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/ImplementInterfaceTest.java
@@ -75,6 +75,7 @@ public class ImplementInterfaceTest {
 
   static {
     Encoders.registerCustomCodec(PoisonPill.class, new PoisonPillCodec());
+    Encoders.registerCustomCodec(Id.class, new IdCodec());
   }
 
   @Test
@@ -168,4 +169,46 @@ public class ImplementInterfaceTest {
     final OptionalType deserializedBean = encoder.fromRow(row);
     Assert.assertEquals(deserializedBean.f1(), Optional.of("42"));
   }
+
+  public static class Id<T> {
+    byte id;
+
+    Id(final byte id) {
+      this.id = id;
+    }
+  }
+
+  public interface OptionalCustomType {
+    Optional<Id<OptionalCustomType>> f1();
+  }
+
+  static class OptionalCustomTypeImpl implements OptionalCustomType {
+    @Override
+    public Optional<Id<OptionalCustomType>> f1() {
+      return Optional.of(new Id<>((byte) 42));
+    }
+  }
+
+  static class IdCodec<T> implements CustomCodec.MemoryBufferCodec<Id<T>> {
+    @Override
+    public MemoryBuffer encode(final Id<T> value) {
+      return MemoryBuffer.fromByteArray(new byte[] {value.id});
+    }
+
+    @Override
+    public Id<T> decode(final MemoryBuffer value) {
+      return new Id<>(value.readByte());
+    }
+  }
+
+  @Test
+  public void testOptionalCustomType() {
+    final OptionalCustomType bean1 = new OptionalCustomTypeImpl();
+    final RowEncoder<OptionalCustomType> encoder = 
Encoders.bean(OptionalCustomType.class);
+    final BinaryRow row = encoder.toRow(bean1);
+    final MemoryBuffer buffer = MemoryUtils.wrap(row.toBytes());
+    row.pointTo(buffer, 0, buffer.size());
+    final OptionalCustomType deserializedBean = encoder.fromRow(row);
+    Assert.assertEquals(deserializedBean.f1().get().id, bean1.f1().get().id);
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to