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 830d85ad0 fix(java): Restore compact codec fixed width optimizations 
(#3478)
830d85ad0 is described below

commit 830d85ad0dfaa734e3b63d8bb9cbfd75d7be1f7b
Author: Steven Schlansker <[email protected]>
AuthorDate: Sat Mar 14 06:25:28 2026 -0700

    fix(java): Restore compact codec fixed width optimizations (#3478)
    
    ## Why?
    
    Restores compact codec fixed width binary optimizations
    
    ## Related issues
    
    Fixes #3117
---
 .../fory/format/row/binary/CompactBinaryArray.java      |  2 +-
 .../apache/fory/format/type/ArrowSchemaConverter.java   |  4 ++++
 .../java/org/apache/fory/format/type/DataTypes.java     | 17 +++++++++++++++++
 .../apache/fory/format/encoder/CompactCodecTest.java    | 13 ++++---------
 .../org/apache/fory/format/encoder/CustomCodecTest.java |  2 +-
 5 files changed, 27 insertions(+), 11 deletions(-)

diff --git 
a/java/fory-format/src/main/java/org/apache/fory/format/row/binary/CompactBinaryArray.java
 
b/java/fory-format/src/main/java/org/apache/fory/format/row/binary/CompactBinaryArray.java
index 8a1be8be3..40d10de9c 100644
--- 
a/java/fory-format/src/main/java/org/apache/fory/format/row/binary/CompactBinaryArray.java
+++ 
b/java/fory-format/src/main/java/org/apache/fory/format/row/binary/CompactBinaryArray.java
@@ -109,7 +109,7 @@ public class CompactBinaryArray extends BinaryArray {
       return super.getStruct(ordinal, field, extDataSlot);
     }
     if (extData[extDataSlot] == null) {
-      extData[extDataSlot] = DataTypes.createSchema(field);
+      extData[extDataSlot] = newSchema(field);
     }
     final BinaryRow row = newRow((Schema) extData[extDataSlot]);
     row.pointTo(getBuffer(), getOffset(ordinal), fixedWidth);
diff --git 
a/java/fory-format/src/main/java/org/apache/fory/format/type/ArrowSchemaConverter.java
 
b/java/fory-format/src/main/java/org/apache/fory/format/type/ArrowSchemaConverter.java
index 6ec842161..be958d8b2 100644
--- 
a/java/fory-format/src/main/java/org/apache/fory/format/type/ArrowSchemaConverter.java
+++ 
b/java/fory-format/src/main/java/org/apache/fory/format/type/ArrowSchemaConverter.java
@@ -66,6 +66,8 @@ public class ArrowSchemaConverter {
       return ArrowType.Utf8.INSTANCE;
     } else if (foryType instanceof DataTypes.BinaryType) {
       return ArrowType.Binary.INSTANCE;
+    } else if (foryType instanceof DataTypes.FixedWidthBinaryType) {
+      return new ArrowType.FixedSizeBinary(foryType.byteWidth());
     } else if (foryType instanceof DataTypes.DurationType) {
       return new ArrowType.Duration(TimeUnit.NANOSECOND);
     } else if (foryType instanceof DataTypes.TimestampType) {
@@ -183,6 +185,8 @@ public class ArrowSchemaConverter {
       return DataTypes.utf8();
     } else if (arrowType instanceof ArrowType.Binary) {
       return DataTypes.binary();
+    } else if (arrowType instanceof ArrowType.FixedSizeBinary) {
+      return DataTypes.fixedWidthBinary(((ArrowType.FixedSizeBinary) 
arrowType).getByteWidth());
     } else if (arrowType instanceof ArrowType.Duration) {
       return DataTypes.duration();
     } else if (arrowType instanceof ArrowType.Timestamp) {
diff --git 
a/java/fory-format/src/main/java/org/apache/fory/format/type/DataTypes.java 
b/java/fory-format/src/main/java/org/apache/fory/format/type/DataTypes.java
index 8c40f27ae..ae8108362 100644
--- a/java/fory-format/src/main/java/org/apache/fory/format/type/DataTypes.java
+++ b/java/fory-format/src/main/java/org/apache/fory/format/type/DataTypes.java
@@ -246,6 +246,19 @@ public class DataTypes {
     }
   }
 
+  /** Raw binary data (fixed-width). */
+  public static class FixedWidthBinaryType extends FixedWidthType {
+
+    private FixedWidthBinaryType(int byteSize) {
+      super(TYPE_BINARY, byteSize * 8);
+    }
+
+    @Override
+    public String name() {
+      return "fixedSizeBinary(" + byteWidth() + ")";
+    }
+  }
+
   // 
============================================================================
   // Temporal types
   // 
============================================================================
@@ -614,6 +627,10 @@ public class DataTypes {
     return BinaryType.INSTANCE;
   }
 
+  public static FixedWidthType fixedWidthBinary(int size) {
+    return new FixedWidthBinaryType(size);
+  }
+
   public static DurationType duration() {
     return DurationType.INSTANCE;
   }
diff --git 
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/CompactCodecTest.java
 
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/CompactCodecTest.java
index acaec0ddd..a1f582777 100644
--- 
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/CompactCodecTest.java
+++ 
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/CompactCodecTest.java
@@ -181,16 +181,13 @@ public class CompactCodecTest {
     row.pointTo(buffer, 0, buffer.size());
     final CompactUuidType deserializedBean = encoder.fromRow(row);
     assertEquals(bean1, deserializedBean);
-    // Note: Using binary() type which is variable-width, so size includes 
offset+size header (8
-    // bytes)
-    // plus the actual data (16 bytes) plus null bitmap (1 byte) plus 
alignment = 32 bytes
-    assertEquals(buffer.size(), 32);
+    assertEquals(buffer.size(), 17);
   }
 
   static class CompactUUIDCodec implements CustomCodec.MemoryBufferCodec<UUID> 
{
     @Override
     public Field getForyField(final String fieldName) {
-      return DataTypes.field(fieldName, DataTypes.binary());
+      return DataTypes.field(fieldName, DataTypes.fixedWidthBinary(16));
     }
 
     @Override
@@ -293,8 +290,7 @@ public class CompactCodecTest {
     row.pointTo(buffer, 0, buffer.size());
     final InlineNestedArrayType deserializedBean = encoder.fromRow(row);
     assertEquals(deserializedBean, bean1);
-    // Size is larger due to variable-width binary encoding for UUIDs
-    assertEquals(buffer.size(), 109);
+    assertEquals(buffer.size(), 88);
   }
 
   @Data
@@ -353,8 +349,7 @@ public class CompactCodecTest {
     row.pointTo(buffer, 0, buffer.size());
     final CompactMapType deserializedBean = encoder.fromRow(row);
     assertEquals(deserializedBean, bean1);
-    // Size is larger due to variable-width binary encoding for UUIDs
-    assertEquals(buffer.size(), 161);
+    assertEquals(buffer.size(), 109);
   }
 
   @Test
diff --git 
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/CustomCodecTest.java
 
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/CustomCodecTest.java
index 749e39d6d..7f8e6d3c1 100644
--- 
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/CustomCodecTest.java
+++ 
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/CustomCodecTest.java
@@ -212,7 +212,7 @@ public class CustomCodecTest {
 
     @Override
     public Field getForyField(final String fieldName) {
-      return DataTypes.field(fieldName, DataTypes.binary());
+      return DataTypes.field(fieldName, DataTypes.fixedWidthBinary(16));
     }
   }
 


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

Reply via email to