|
23 | 23 | import static org.junit.jupiter.api.Assertions.assertSame; |
24 | 24 | import static org.junit.jupiter.api.Assertions.assertTrue; |
25 | 25 |
|
| 26 | +import java.nio.ByteBuffer; |
26 | 27 | import java.util.ArrayList; |
27 | 28 | import java.util.Arrays; |
28 | 29 | import java.util.List; |
| 30 | +import java.util.UUID; |
29 | 31 | import org.apache.arrow.memory.ArrowBuf; |
30 | 32 | import org.apache.arrow.memory.BufferAllocator; |
31 | 33 | import org.apache.arrow.vector.complex.BaseRepeatedValueVector; |
32 | 34 | import org.apache.arrow.vector.complex.LargeListVector; |
33 | 35 | import org.apache.arrow.vector.complex.ListVector; |
| 36 | +import org.apache.arrow.vector.complex.impl.UnionLargeListReader; |
34 | 37 | import org.apache.arrow.vector.complex.impl.UnionLargeListWriter; |
| 38 | +import org.apache.arrow.vector.complex.impl.UuidWriterFactory; |
35 | 39 | import org.apache.arrow.vector.complex.reader.FieldReader; |
| 40 | +import org.apache.arrow.vector.complex.writer.BaseWriter.ExtensionWriter; |
| 41 | +import org.apache.arrow.vector.holder.UuidHolder; |
36 | 42 | import org.apache.arrow.vector.types.Types.MinorType; |
37 | 43 | import org.apache.arrow.vector.types.pojo.ArrowType; |
38 | 44 | import org.apache.arrow.vector.types.pojo.Field; |
39 | 45 | import org.apache.arrow.vector.types.pojo.FieldType; |
| 46 | +import org.apache.arrow.vector.types.pojo.UuidType; |
40 | 47 | import org.apache.arrow.vector.util.TransferPair; |
41 | 48 | import org.junit.jupiter.api.AfterEach; |
42 | 49 | import org.junit.jupiter.api.BeforeEach; |
@@ -1021,6 +1028,84 @@ public void testGetTransferPairWithField() throws Exception { |
1021 | 1028 | } |
1022 | 1029 | } |
1023 | 1030 |
|
| 1031 | + @Test |
| 1032 | + public void testCopyValueSafeForExtensionType() throws Exception { |
| 1033 | + try (LargeListVector inVector = LargeListVector.empty("input", allocator); |
| 1034 | + LargeListVector outVector = LargeListVector.empty("output", allocator)) { |
| 1035 | + UnionLargeListWriter writer = inVector.getWriter(); |
| 1036 | + writer.allocate(); |
| 1037 | + |
| 1038 | + // Create first list with UUIDs |
| 1039 | + writer.setPosition(0); |
| 1040 | + UUID u1 = UUID.randomUUID(); |
| 1041 | + UUID u2 = UUID.randomUUID(); |
| 1042 | + writer.startList(); |
| 1043 | + ExtensionWriter extensionWriter = writer.extension(new UuidType()); |
| 1044 | + extensionWriter.addExtensionTypeWriterFactory(new UuidWriterFactory()); |
| 1045 | + extensionWriter.writeExtension(u1); |
| 1046 | + extensionWriter.writeExtension(u2); |
| 1047 | + writer.endList(); |
| 1048 | + |
| 1049 | + // Create second list with UUIDs |
| 1050 | + writer.setPosition(1); |
| 1051 | + UUID u3 = UUID.randomUUID(); |
| 1052 | + UUID u4 = UUID.randomUUID(); |
| 1053 | + writer.startList(); |
| 1054 | + extensionWriter = writer.extension(new UuidType()); |
| 1055 | + extensionWriter.addExtensionTypeWriterFactory(new UuidWriterFactory()); |
| 1056 | + extensionWriter.writeExtension(u3); |
| 1057 | + extensionWriter.writeExtension(u4); |
| 1058 | + extensionWriter.writeNull(); |
| 1059 | + |
| 1060 | + writer.endList(); |
| 1061 | + writer.setValueCount(2); |
| 1062 | + |
| 1063 | + // Use copyFromSafe with ExtensionTypeWriterFactory |
| 1064 | + // This internally calls TransferImpl.copyValueSafe with ExtensionTypeWriterFactory |
| 1065 | + outVector.allocateNew(); |
| 1066 | + outVector.copyFromSafe(0, 0, inVector, new UuidWriterFactory()); |
| 1067 | + outVector.copyFromSafe(1, 1, inVector, new UuidWriterFactory()); |
| 1068 | + outVector.setValueCount(2); |
| 1069 | + |
| 1070 | + // Verify first list |
| 1071 | + UnionLargeListReader reader = outVector.getReader(); |
| 1072 | + reader.setPosition(0); |
| 1073 | + assertTrue(reader.isSet(), "first list shouldn't be null"); |
| 1074 | + reader.next(); |
| 1075 | + FieldReader uuidReader = reader.reader(); |
| 1076 | + UuidHolder holder = new UuidHolder(); |
| 1077 | + uuidReader.read(holder); |
| 1078 | + ByteBuffer bb = ByteBuffer.wrap(holder.value); |
| 1079 | + UUID actualUuid = new UUID(bb.getLong(), bb.getLong()); |
| 1080 | + assertEquals(u1, actualUuid); |
| 1081 | + reader.next(); |
| 1082 | + uuidReader = reader.reader(); |
| 1083 | + uuidReader.read(holder); |
| 1084 | + bb = ByteBuffer.wrap(holder.value); |
| 1085 | + actualUuid = new UUID(bb.getLong(), bb.getLong()); |
| 1086 | + assertEquals(u2, actualUuid); |
| 1087 | + |
| 1088 | + // Verify second list |
| 1089 | + reader.setPosition(1); |
| 1090 | + assertTrue(reader.isSet(), "second list shouldn't be null"); |
| 1091 | + reader.next(); |
| 1092 | + uuidReader = reader.reader(); |
| 1093 | + uuidReader.read(holder); |
| 1094 | + bb = ByteBuffer.wrap(holder.value); |
| 1095 | + actualUuid = new UUID(bb.getLong(), bb.getLong()); |
| 1096 | + assertEquals(u3, actualUuid); |
| 1097 | + reader.next(); |
| 1098 | + uuidReader = reader.reader(); |
| 1099 | + uuidReader.read(holder); |
| 1100 | + bb = ByteBuffer.wrap(holder.value); |
| 1101 | + actualUuid = new UUID(bb.getLong(), bb.getLong()); |
| 1102 | + assertEquals(u4, actualUuid); |
| 1103 | + reader.next(); |
| 1104 | + uuidReader = reader.reader(); |
| 1105 | + assertFalse(uuidReader.isSet(), "third element should be null"); |
| 1106 | + } |
| 1107 | + } |
| 1108 | + |
1024 | 1109 | private void writeIntValues(UnionLargeListWriter writer, int[] values) { |
1025 | 1110 | writer.startList(); |
1026 | 1111 | for (int v : values) { |
|
0 commit comments