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

jbonofre pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-java.git


The following commit(s) were added to refs/heads/main by this push:
     new 4a7fb4ef9 GH-552: [Vector] Add absent methods to the 
UnionFixedSizeListWriter (#1052)
4a7fb4ef9 is described below

commit 4a7fb4ef95d9386a0a7102fb18fbe52547527c21
Author: Aleksei Starikov <[email protected]>
AuthorDate: Wed Mar 11 14:59:21 2026 +0100

    GH-552: [Vector] Add absent methods to the UnionFixedSizeListWriter (#1052)
    
    ## What's Changed
    
    Add absent methods to the `UnionFixedSizeListWriter`.
    
    1. Aligned the `UnionFixedSizeListWriter` template with the
    `UnionListWriter` template, which added the following previously absent
    methods to the generated `UnionFixedSizeListWriter` class:
    
    ```
    - duration() methods
        - DurationWriter duration()
        - DurationWriter duration(String name, 
org.apache.arrow.vector.types.TimeUnit unit)
        - DurationWriter duration(String name)
    - timeStampSecTZ() methods
        - TimeStampSecTZWriter timeStampSecTZ()
        - TimeStampSecTZWriter timeStampSecTZ(String name, String timezone)
        - TimeStampSecTZWriter timeStampSecTZ(String name)
    - timeStampMilliTZ() methods
        - TimeStampMilliTZWriter timeStampMilliTZ()
        - TimeStampMilliTZWriter timeStampMilliTZ(String name, String timezone)
        - TimeStampMilliTZWriter timeStampMilliTZ(String name)
    - timeStampMicroTZ() methods
        - TimeStampMicroTZWriter timeStampMicroTZ()
        - TimeStampMicroTZWriter timeStampMicroTZ(String name, String timezone)
        - TimeStampMicroTZWriter timeStampMicroTZ(String name)
    - timeStampNanoTZ() methods
        - TimeStampNanoTZWriter timeStampNanoTZ()
        - TimeStampNanoTZWriter timeStampNanoTZ(String name, String timezone)
        - TimeStampNanoTZWriter timeStampNanoTZ(String name)
    - fixedSizeBinary() methods
        - FixedSizeBinaryWriter fixedSizeBinary()
        - FixedSizeBinaryWriter fixedSizeBinary(String name, int byteWidth)
        - FixedSizeBinaryWriter fixedSizeBinary(String name)
    - write() methods for Duration
        - void writeDuration(long value)
        - void write(DurationHolder holder)
    - write() methods for TimeStampSecTZ
        - void writeTimeStampSecTZ(long value)
        - void write(TimeStampSecTZHolder holder)
    - write() methods for TimeStampMilliTZ
        - void writeTimeStampMilliTZ(long value)
        - void write(TimeStampMilliTZHolder holder)
    - write() methods for TimeStampMicroTZ
        - void writeTimeStampMicroTZ(long value)
        - void write(TimeStampMicroTZHolder holder)
    - write() methods for TimeStampNanoTZ
        - void writeTimeStampNanoTZ(long value)
        - void write(TimeStampNanoTZHolder holder)
    - write() methods for FixedSizeBinary
        - void writeFixedSizeBinary(ArrowBuf buffer)
        - void write(FixedSizeBinaryHolder holder)
    ```
    
    2. Add `structName = name;` for 2 existing methods (align them with
    other similar methods):
    
    ```
    - DecimalWriter decimal(String name)
    - Decimal256Writer decimal256(String name)
    ```
    
    3. Remove unused assignments from the `UnionListWriter` template + add
    missing overrides.
    
    This fix adds override annotations to the `UnionListWriter` generated
    class and extend/fix the code of the `UnionFixedSizeListWriter`
    generated class. So, the change is backward compatible.
    
    See the gists for the generated writer classes:
    -
    
[UnionFixedSizeListWriter](https://gist.github.com/axreldable/9908f98d75ec4c0a62e4ccfa176cbbe1)
    -
    
[UnionListWriter](https://gist.github.com/axreldable/881f3cf1ed001c513870daf3ea4f3bbd)
    
    ---
    
    Inspired by this [PR](https://github.com/apache/arrow/pull/35353).
    
    ---
    
    Closes #552 .
---
 .../templates/UnionFixedSizeListWriter.java        | 151 ++++++---------
 .../main/codegen/templates/UnionListWriter.java    |   6 +-
 .../arrow/vector/TestFixedSizeListVector.java      | 207 +++++++++++++++++++++
 .../org/apache/arrow/vector/TestMapVector.java     |  35 ++--
 .../java/org/apache/arrow/vector/TestUtils.java    |  13 ++
 5 files changed, 293 insertions(+), 119 deletions(-)

diff --git a/vector/src/main/codegen/templates/UnionFixedSizeListWriter.java 
b/vector/src/main/codegen/templates/UnionFixedSizeListWriter.java
index f6e3f63ca..484199ab2 100644
--- a/vector/src/main/codegen/templates/UnionFixedSizeListWriter.java
+++ b/vector/src/main/codegen/templates/UnionFixedSizeListWriter.java
@@ -35,6 +35,10 @@ import java.math.BigDecimal;
 
 <#include "/@includes/vv_imports.ftl" />
 
+<#function is_timestamp_tz type>
+  <#return type?starts_with("TimeStamp") && type?ends_with("TZ")>
+</#function>
+
 /*
  * This class is generated using freemarker and the ${.template_name} template.
  */
@@ -96,55 +100,30 @@ public class UnionFixedSizeListWriter extends 
AbstractFieldWriter {
   public void setPosition(int index) {
     super.setPosition(index);
   }
-  <#list vv.types as type><#list type.minor as minor><#assign name = 
minor.class?cap_first />
-  <#assign fields = minor.fields!type.fields />
-  <#assign uncappedName = name?uncap_first/>
-  <#if uncappedName == "int" ><#assign uncappedName = "integer" /></#if>
-  <#if !minor.typeParams?? >
 
+  <#list vv.types as type><#list type.minor as minor>
+  <#assign lowerName = minor.class?uncap_first />
+  <#if lowerName == "int" ><#assign lowerName = "integer" /></#if>
+  <#assign upperName = minor.class?upper_case />
   @Override
-  public ${name}Writer ${uncappedName}() {
+  public ${minor.class}Writer ${lowerName}() {
     return this;
   }
 
+  <#if minor.typeParams?? >
   @Override
-  public ${name}Writer ${uncappedName}(String name) {
-    structName = name;
-    return writer.${uncappedName}(name);
+  public ${minor.class}Writer ${lowerName}(String name<#list minor.typeParams 
as typeParam>, ${typeParam.type} ${typeParam.name}</#list>) {
+    return writer.${lowerName}(name<#list minor.typeParams as typeParam>, 
${typeParam.name}</#list>);
   }
   </#if>
-  </#list></#list>
-
-  @Override
-  public DecimalWriter decimal() {
-    return this;
-  }
-
-  @Override
-  public DecimalWriter decimal(String name, int scale, int precision) {
-    return writer.decimal(name, scale, precision);
-  }
-
-  @Override
-  public DecimalWriter decimal(String name) {
-    return writer.decimal(name);
-  }
-
 
   @Override
-  public Decimal256Writer decimal256() {
-    return this;
-  }
-
-  @Override
-  public Decimal256Writer decimal256(String name, int scale, int precision) {
-    return writer.decimal256(name, scale, precision);
+  public ${minor.class}Writer ${lowerName}(String name) {
+    structName = name;
+    return writer.${lowerName}(name);
   }
 
-  @Override
-  public Decimal256Writer decimal256(String name) {
-    return writer.decimal256(name);
-  }
+  </#list></#list>
 
   @Override
   public StructWriter struct() {
@@ -215,87 +194,86 @@ public class UnionFixedSizeListWriter extends 
AbstractFieldWriter {
   }
 
   @Override
-  public void write(DecimalHolder holder) {
-    if (writer.idx() >= (idx() + 1) * listSize) {
-      throw new IllegalStateException(String.format("values at index %s is 
greater than listSize %s", idx(), listSize));
-    }
-    writer.write(holder);
-    writer.setPosition(writer.idx() + 1);
-  }
-
-  @Override
-  public void write(Decimal256Holder holder) {
+  public void writeNull() {
     if (writer.idx() >= (idx() + 1) * listSize) {
       throw new IllegalStateException(String.format("values at index %s is 
greater than listSize %s", idx(), listSize));
     }
-    writer.write(holder);
-    writer.setPosition(writer.idx() + 1);
+    writer.writeNull();
   }
 
 
+  <#list vv.types as type>
+    <#list type.minor as minor>
+      <#assign name = minor.class?cap_first />
+      <#assign fields = minor.fields!type.fields />
+      <#assign uncappedName = name?uncap_first/>
   @Override
-  public void writeNull() {
+  public void write${name}(<#list fields as field>${field.type} 
${field.name}<#if field_has_next>, </#if></#list>) {
     if (writer.idx() >= (idx() + 1) * listSize) {
       throw new IllegalStateException(String.format("values at index %s is 
greater than listSize %s", idx(), listSize));
     }
-    writer.writeNull();
+    writer.write${name}(<#list fields as field>${field.name}<#if 
field_has_next>, </#if></#list>);
+    writer.setPosition(writer.idx()+1);
   }
 
-  public void writeDecimal(long start, ArrowBuf buffer, ArrowType arrowType) {
+  <#if is_timestamp_tz(minor.class) || minor.class == "Duration" || 
minor.class == "FixedSizeBinary">
+  @Override
+  public void write(${name}Holder holder) {
     if (writer.idx() >= (idx() + 1) * listSize) {
       throw new IllegalStateException(String.format("values at index %s is 
greater than listSize %s", idx(), listSize));
     }
-    writer.writeDecimal(start, buffer, arrowType);
-    writer.setPosition(writer.idx() + 1);
+    writer.write(holder);
+    writer.setPosition(writer.idx()+1);
   }
 
-  public void writeDecimal(BigDecimal value) {
+  <#elseif minor.class?starts_with("Decimal")>
+  @Override
+  public void write${name}(long start, ArrowBuf buffer, ArrowType arrowType) {
     if (writer.idx() >= (idx() + 1) * listSize) {
       throw new IllegalStateException(String.format("values at index %s is 
greater than listSize %s", idx(), listSize));
     }
-    writer.writeDecimal(value);
-    writer.setPosition(writer.idx() + 1);
+    writer.write${name}(start, buffer, arrowType);
+    writer.setPosition(writer.idx()+1);
   }
 
-  public void writeBigEndianBytesToDecimal(byte[] value, ArrowType arrowType) {
+  @Override
+  public void write(${name}Holder holder) {
     if (writer.idx() >= (idx() + 1) * listSize) {
       throw new IllegalStateException(String.format("values at index %s is 
greater than listSize %s", idx(), listSize));
     }
-    writer.writeBigEndianBytesToDecimal(value, arrowType);
-    writer.setPosition(writer.idx() + 1);
+    writer.write(holder);
+    writer.setPosition(writer.idx()+1);
   }
 
-  public void writeDecimal256(long start, ArrowBuf buffer, ArrowType 
arrowType) {
+  @Override
+  public void write${name}(BigDecimal value) {
     if (writer.idx() >= (idx() + 1) * listSize) {
       throw new IllegalStateException(String.format("values at index %s is 
greater than listSize %s", idx(), listSize));
     }
-    writer.writeDecimal256(start, buffer, arrowType);
-    writer.setPosition(writer.idx() + 1);
+    writer.write${name}(value);
+    writer.setPosition(writer.idx()+1);
   }
 
-  public void writeDecimal256(BigDecimal value) {
+  @Override
+  public void writeBigEndianBytesTo${name}(byte[] value, ArrowType arrowType){
     if (writer.idx() >= (idx() + 1) * listSize) {
       throw new IllegalStateException(String.format("values at index %s is 
greater than listSize %s", idx(), listSize));
     }
-    writer.writeDecimal256(value);
+    writer.writeBigEndianBytesTo${name}(value, arrowType);
     writer.setPosition(writer.idx() + 1);
   }
-
-  public void writeBigEndianBytesToDecimal256(byte[] value, ArrowType 
arrowType) {
+  <#else>
+  @Override
+  public void write(${name}Holder holder) {
     if (writer.idx() >= (idx() + 1) * listSize) {
       throw new IllegalStateException(String.format("values at index %s is 
greater than listSize %s", idx(), listSize));
     }
-    writer.writeBigEndianBytesToDecimal256(value, arrowType);
-    writer.setPosition(writer.idx() + 1);
+    writer.write${name}(<#list fields as field>holder.${field.name}<#if 
field_has_next>, </#if></#list>);
+    writer.setPosition(writer.idx()+1);
   }
+  </#if>
 
-
-  <#list vv.types as type>
-    <#list type.minor as minor>
-      <#assign name = minor.class?cap_first />
-      <#assign fields = minor.fields!type.fields />
-      <#assign uncappedName = name?uncap_first/>
-      <#if minor.class?ends_with("VarBinary")>
+  <#if minor.class?ends_with("VarBinary")>
   @Override
   public void write${minor.class}(byte[] value) {
     if (writer.idx() >= (idx() + 1) * listSize) {
@@ -349,27 +327,8 @@ public class UnionFixedSizeListWriter extends 
AbstractFieldWriter {
     writer.write${minor.class}(value);
     writer.setPosition(writer.idx() + 1);
   }
-      </#if>
-
-      <#if !minor.typeParams?? >
-  @Override
-  public void write${name}(<#list fields as field>${field.type} 
${field.name}<#if field_has_next>, </#if></#list>) {
-    if (writer.idx() >= (idx() + 1) * listSize) {
-      throw new IllegalStateException(String.format("values at index %s is 
greater than listSize %s", idx(), listSize));
-    }
-    writer.write${name}(<#list fields as field>${field.name}<#if 
field_has_next>, </#if></#list>);
-    writer.setPosition(writer.idx() + 1);
-  }
-
-  public void write(${name}Holder holder) {
-    if (writer.idx() >= (idx() + 1) * listSize) {
-      throw new IllegalStateException(String.format("values at index %s is 
greater than listSize %s", idx(), listSize));
-    }
-    writer.write${name}(<#list fields as field>holder.${field.name}<#if 
field_has_next>, </#if></#list>);
-    writer.setPosition(writer.idx() + 1);
-  }
+  </#if>
 
-      </#if>
     </#list>
   </#list>
 }
diff --git a/vector/src/main/codegen/templates/UnionListWriter.java 
b/vector/src/main/codegen/templates/UnionListWriter.java
index 4b5473923..394348f02 100644
--- a/vector/src/main/codegen/templates/UnionListWriter.java
+++ b/vector/src/main/codegen/templates/UnionListWriter.java
@@ -123,8 +123,6 @@ public class Union${listName}Writer extends 
AbstractFieldWriter {
   <#assign lowerName = minor.class?uncap_first />
   <#if lowerName == "int" ><#assign lowerName = "integer" /></#if>
   <#assign upperName = minor.class?upper_case />
-  <#assign capName = minor.class?cap_first />
-  <#assign vectName = capName />
   @Override
   public ${minor.class}Writer ${lowerName}() {
     return this;
@@ -370,6 +368,7 @@ public class Union${listName}Writer extends 
AbstractFieldWriter {
   }
 
   <#elseif minor.class?starts_with("Decimal")>
+  @Override
   public void write${name}(long start, ArrowBuf buffer, ArrowType arrowType) {
     writer.write${name}(start, buffer, arrowType);
     writer.setPosition(writer.idx()+1);
@@ -381,11 +380,13 @@ public class Union${listName}Writer extends 
AbstractFieldWriter {
     writer.setPosition(writer.idx()+1);
   }
 
+  @Override
   public void write${name}(BigDecimal value) {
     writer.write${name}(value);
     writer.setPosition(writer.idx()+1);
   }
 
+  @Override
   public void writeBigEndianBytesTo${name}(byte[] value, ArrowType arrowType){
     writer.writeBigEndianBytesTo${name}(value, arrowType);
     writer.setPosition(writer.idx() + 1);
@@ -429,6 +430,7 @@ public class Union${listName}Writer extends 
AbstractFieldWriter {
     writer.setPosition(writer.idx() + 1);
   }
 
+  @Override
   public void write${minor.class}(String value) {
     writer.write${minor.class}(value);
     writer.setPosition(writer.idx() + 1);
diff --git 
a/vector/src/test/java/org/apache/arrow/vector/TestFixedSizeListVector.java 
b/vector/src/test/java/org/apache/arrow/vector/TestFixedSizeListVector.java
index 73a88b3a1..b3455fe52 100644
--- a/vector/src/test/java/org/apache/arrow/vector/TestFixedSizeListVector.java
+++ b/vector/src/test/java/org/apache/arrow/vector/TestFixedSizeListVector.java
@@ -30,14 +30,21 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import org.apache.arrow.memory.BufferAllocator;
+import org.apache.arrow.vector.complex.BaseRepeatedValueVector;
 import org.apache.arrow.vector.complex.FixedSizeListVector;
 import org.apache.arrow.vector.complex.ListVector;
 import org.apache.arrow.vector.complex.impl.UnionFixedSizeListReader;
 import org.apache.arrow.vector.complex.impl.UnionFixedSizeListWriter;
 import org.apache.arrow.vector.complex.impl.UnionListReader;
 import org.apache.arrow.vector.complex.reader.FieldReader;
+import org.apache.arrow.vector.holders.DurationHolder;
+import org.apache.arrow.vector.holders.FixedSizeBinaryHolder;
+import org.apache.arrow.vector.holders.TimeStampMilliTZHolder;
+import org.apache.arrow.vector.holders.TimeStampNanoTZHolder;
+import org.apache.arrow.vector.types.TimeUnit;
 import org.apache.arrow.vector.types.Types.MinorType;
 import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.Text;
 import org.apache.arrow.vector.util.TransferPair;
@@ -628,6 +635,206 @@ public class TestFixedSizeListVector {
     }
   }
 
+  @Test
+  public void testWriterTimeStampNanoTZField() {
+    try (final FixedSizeListVector vector =
+        FixedSizeListVector.empty("vector", /* size= */ 3, allocator)) {
+      UnionFixedSizeListWriter writer = vector.getWriter();
+      writer.allocate();
+
+      final int valueCount = 10;
+
+      for (int i = 0; i < valueCount; i++) {
+        writer.startList();
+        writer.timeStampNanoTZ().writeTimeStampNanoTZ(i * 1000L);
+        writer.timeStampNanoTZ().writeTimeStampNanoTZ((i + 1) * 1000L);
+        writer.timeStampNanoTZ().writeTimeStampNanoTZ((i + 2) * 1000L);
+        writer.endList();
+      }
+      vector.setValueCount(valueCount);
+
+      UnionFixedSizeListReader reader = vector.getReader();
+      for (int i = 0; i < valueCount; i++) {
+        reader.setPosition(i);
+        assertTrue(reader.isSet());
+        assertTrue(reader.next());
+        assertEquals(i * 1000L, reader.reader().readLong().longValue());
+        assertTrue(reader.next());
+        assertEquals((i + 1) * 1000L, reader.reader().readLong().longValue());
+        assertTrue(reader.next());
+        assertEquals((i + 2) * 1000L, reader.reader().readLong().longValue());
+        assertFalse(reader.next());
+      }
+    }
+  }
+
+  @Test
+  public void testWriterUsingHolderTimeStampNanoTZField() {
+    try (final FixedSizeListVector vector =
+        FixedSizeListVector.empty("vector", /* size= */ 3, allocator)) {
+      UnionFixedSizeListWriter writer = vector.getWriter();
+      writer.allocate();
+
+      TimeStampNanoTZHolder holder = new TimeStampNanoTZHolder();
+      holder.timezone = "SomeFakeTimeZone";
+      writer.startList();
+      holder.value = 12341234L;
+      writer.timeStampNanoTZ().write(holder);
+      holder.value = 55555L;
+      writer.timeStampNanoTZ().write(holder);
+
+      // Writing with a different timezone should throw
+      holder.timezone = "AsdfTimeZone";
+      holder.value = 77777;
+      IllegalArgumentException ex =
+          assertThrows(
+              IllegalArgumentException.class, () -> 
writer.timeStampNanoTZ().write(holder));
+      assertEquals(
+          "holder.timezone: AsdfTimeZone not equal to vector timezone: 
SomeFakeTimeZone",
+          ex.getMessage());
+
+      writer.endList();
+      vector.setValueCount(1);
+
+      Field expectedDataField =
+          new Field(
+              BaseRepeatedValueVector.DATA_VECTOR_NAME,
+              FieldType.nullable(new ArrowType.Timestamp(TimeUnit.NANOSECOND, 
"SomeFakeTimeZone")),
+              null);
+      Field expectedField =
+          new Field(
+              vector.getName(),
+              FieldType.nullable(new ArrowType.FixedSizeList(3)),
+              List.of(expectedDataField));
+
+      assertEquals(expectedField, writer.getField());
+    }
+  }
+
+  @Test
+  public void testWriterUsingHolderTimestampMilliTZField() {
+    try (final FixedSizeListVector vector =
+        FixedSizeListVector.empty("vector", /* size= */ 3, allocator)) {
+      UnionFixedSizeListWriter writer = vector.getWriter();
+      writer.allocate();
+
+      TimeStampMilliTZHolder holder = new TimeStampMilliTZHolder();
+      holder.timezone = "SomeFakeTimeZone";
+      writer.startList();
+      holder.value = 12341234L;
+      writer.timeStampMilliTZ().write(holder);
+      holder.value = 55555L;
+      writer.timeStampMilliTZ().write(holder);
+
+      // Writing with a different timezone should throw
+      holder.timezone = "AsdfTimeZone";
+      holder.value = 77777;
+      IllegalArgumentException ex =
+          assertThrows(
+              IllegalArgumentException.class, () -> 
writer.timeStampMilliTZ().write(holder));
+      assertEquals(
+          "holder.timezone: AsdfTimeZone not equal to vector timezone: 
SomeFakeTimeZone",
+          ex.getMessage());
+
+      writer.endList();
+      vector.setValueCount(1);
+
+      Field expectedDataField =
+          new Field(
+              BaseRepeatedValueVector.DATA_VECTOR_NAME,
+              FieldType.nullable(new ArrowType.Timestamp(TimeUnit.MILLISECOND, 
"SomeFakeTimeZone")),
+              null);
+      Field expectedField =
+          new Field(
+              vector.getName(),
+              FieldType.nullable(new ArrowType.FixedSizeList(3)),
+              List.of(expectedDataField));
+
+      assertEquals(expectedField, writer.getField());
+    }
+  }
+
+  @Test
+  public void testWriterUsingHolderDurationField() {
+    try (final FixedSizeListVector vector =
+        FixedSizeListVector.empty("vector", /* size= */ 3, allocator)) {
+      UnionFixedSizeListWriter writer = vector.getWriter();
+      writer.allocate();
+
+      DurationHolder durationHolder = new DurationHolder();
+      durationHolder.unit = TimeUnit.MILLISECOND;
+
+      writer.startList();
+      durationHolder.value = 812374L;
+      writer.duration().write(durationHolder);
+      durationHolder.value = 143451L;
+      writer.duration().write(durationHolder);
+
+      // Writing with a different unit should throw
+      durationHolder.unit = TimeUnit.SECOND;
+      durationHolder.value = 8888888;
+      IllegalArgumentException ex =
+          assertThrows(
+              IllegalArgumentException.class, () -> 
writer.duration().write(durationHolder));
+      assertEquals("holder.unit: SECOND not equal to vector unit: 
MILLISECOND", ex.getMessage());
+
+      writer.endList();
+      vector.setValueCount(1);
+
+      Field expectedDataField =
+          new Field(
+              BaseRepeatedValueVector.DATA_VECTOR_NAME,
+              FieldType.nullable(new ArrowType.Duration(TimeUnit.MILLISECOND)),
+              null);
+      Field expectedField =
+          new Field(
+              vector.getName(),
+              FieldType.nullable(new ArrowType.FixedSizeList(3)),
+              List.of(expectedDataField));
+
+      assertEquals(expectedField, writer.getField());
+    }
+  }
+
+  @Test
+  public void testWriterUsingHolderFixedSizeBinaryField() {
+    try (final FixedSizeListVector vector =
+        FixedSizeListVector.empty("vector", /* size= */ 2, allocator)) {
+      UnionFixedSizeListWriter writer = vector.getWriter();
+      writer.allocate();
+
+      FixedSizeBinaryHolder holder1 =
+          TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {11, 22});
+      FixedSizeBinaryHolder holder2 =
+          TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {32, 21});
+
+      writer.startList();
+      writer.fixedSizeBinary().write(holder1);
+      holder1.buffer.close();
+      writer.fixedSizeBinary().write(holder2);
+      holder2.buffer.close();
+
+      writer.endList();
+      vector.setValueCount(1);
+
+      FieldReader reader = vector.getReader();
+      assertTrue(reader.isSet(), "shouldn't be null");
+
+      Field expectedDataField =
+          new Field(
+              BaseRepeatedValueVector.DATA_VECTOR_NAME,
+              FieldType.nullable(new ArrowType.FixedSizeBinary(2)),
+              null);
+      Field expectedField =
+          new Field(
+              vector.getName(),
+              FieldType.nullable(new ArrowType.FixedSizeList(2)),
+              List.of(expectedDataField));
+
+      assertEquals(expectedField, writer.getField());
+    }
+  }
+
   private int[] convertListToIntArray(List<?> list) {
     int[] values = new int[list.size()];
     for (int i = 0; i < list.size(); i++) {
diff --git a/vector/src/test/java/org/apache/arrow/vector/TestMapVector.java 
b/vector/src/test/java/org/apache/arrow/vector/TestMapVector.java
index 274d2973b..2f520f388 100644
--- a/vector/src/test/java/org/apache/arrow/vector/TestMapVector.java
+++ b/vector/src/test/java/org/apache/arrow/vector/TestMapVector.java
@@ -1353,17 +1353,6 @@ public class TestMapVector {
     }
   }
 
-  private FixedSizeBinaryHolder getFixedSizeBinaryHolder(byte[] array) {
-    FixedSizeBinaryHolder holder = new FixedSizeBinaryHolder();
-    holder.byteWidth = array.length;
-    holder.buffer = allocator.buffer(array.length);
-    for (int i = 0; i < array.length; i++) {
-      holder.buffer.setByte(i, array[i]);
-    }
-
-    return holder;
-  }
-
   /**
    * Regression test for GH-586: UnionMapWriter.fixedSizeBinary() should 
properly delegate to the
    * entry writer for both key and value paths.
@@ -1382,8 +1371,10 @@ public class TestMapVector {
       // {[11, 22] -> null}
       // {null -> [32, 21]} - wrong "for a given entry, the "key" is 
non-nullable" - todo: it
       // shouldn't work. Should it?
-      FixedSizeBinaryHolder holder1 = getFixedSizeBinaryHolder(new byte[] {11, 
22});
-      FixedSizeBinaryHolder holder2 = getFixedSizeBinaryHolder(new byte[] {32, 
21});
+      FixedSizeBinaryHolder holder1 =
+          TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {11, 22});
+      FixedSizeBinaryHolder holder2 =
+          TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {32, 21});
 
       writer.setPosition(0); // optional
       writer.startMap();
@@ -1399,8 +1390,8 @@ public class TestMapVector {
       writer.endMap();
 
       // {1 -> [11, 22], 2 -> [32, 21]}
-      holder1 = getFixedSizeBinaryHolder(new byte[] {11, 22});
-      holder2 = getFixedSizeBinaryHolder(new byte[] {32, 21});
+      holder1 = TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {11, 
22});
+      holder2 = TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {32, 
21});
       writer.setPosition(1);
       writer.startMap();
       writer.startEntry();
@@ -1416,8 +1407,8 @@ public class TestMapVector {
       holder2.buffer.close();
 
       // {[11, 22] -> 1, [32, 21] -> 2}
-      holder1 = getFixedSizeBinaryHolder(new byte[] {11, 22});
-      holder2 = getFixedSizeBinaryHolder(new byte[] {32, 21});
+      holder1 = TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {11, 
22});
+      holder2 = TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {32, 
21});
       writer.setPosition(3);
       writer.startMap();
       writer.startEntry();
@@ -1433,7 +1424,7 @@ public class TestMapVector {
       holder2.buffer.close();
 
       // {[11, 22] -> null}
-      holder1 = getFixedSizeBinaryHolder(new byte[] {11, 22});
+      holder1 = TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {11, 
22});
       writer.setPosition(4);
       writer.startMap();
       writer.startEntry();
@@ -1443,7 +1434,7 @@ public class TestMapVector {
       holder1.buffer.close();
 
       // {null -> [32, 21]}
-      holder2 = getFixedSizeBinaryHolder(new byte[] {32, 21});
+      holder2 = TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {32, 
21});
       writer.setPosition(5);
       writer.startMap();
       writer.startEntry();
@@ -1536,8 +1527,10 @@ public class TestMapVector {
 
       // populate input vector with the following records
       // {[11, 22] -> [32, 21]}
-      FixedSizeBinaryHolder holder1 = getFixedSizeBinaryHolder(new byte[] {11, 
22});
-      FixedSizeBinaryHolder holder2 = getFixedSizeBinaryHolder(new byte[] {32, 
21});
+      FixedSizeBinaryHolder holder1 =
+          TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {11, 22});
+      FixedSizeBinaryHolder holder2 =
+          TestUtils.fixedSizeBinaryHolder(allocator, new byte[] {32, 21});
 
       writer.setPosition(0); // optional
       writer.startMap();
diff --git a/vector/src/test/java/org/apache/arrow/vector/TestUtils.java 
b/vector/src/test/java/org/apache/arrow/vector/TestUtils.java
index c28751aa5..d91b2004c 100644
--- a/vector/src/test/java/org/apache/arrow/vector/TestUtils.java
+++ b/vector/src/test/java/org/apache/arrow/vector/TestUtils.java
@@ -18,6 +18,7 @@ package org.apache.arrow.vector;
 
 import java.util.Random;
 import org.apache.arrow.memory.BufferAllocator;
+import org.apache.arrow.vector.holders.FixedSizeBinaryHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
 import org.apache.arrow.vector.types.pojo.ArrowType;
 import org.apache.arrow.vector.types.pojo.ExtensionTypeRegistry;
@@ -73,4 +74,16 @@ public class TestUtils {
       ExtensionTypeRegistry.register(type);
     }
   }
+
+  public static FixedSizeBinaryHolder fixedSizeBinaryHolder(
+      BufferAllocator allocator, byte[] array) {
+    FixedSizeBinaryHolder holder = new FixedSizeBinaryHolder();
+    holder.byteWidth = array.length;
+    holder.buffer = allocator.buffer(array.length);
+    for (int i = 0; i < array.length; i++) {
+      holder.buffer.setByte(i, array[i]);
+    }
+
+    return holder;
+  }
 }

Reply via email to