Skip to content

Commit f51bdc1

Browse files
committed
apacheGH-558: ComplexCopier supports for Duration columns.
1 parent 5559930 commit f51bdc1

File tree

2 files changed

+145
-0
lines changed

2 files changed

+145
-0
lines changed

vector/src/main/codegen/templates/ComplexCopier.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ private static FieldWriter getStructWriterForReader(FieldReader reader, StructWr
162162
return (FieldWriter) writer.map(name);
163163
case LISTVIEW:
164164
return (FieldWriter) writer.listView(name);
165+
case DURATION:
166+
return (FieldWriter) writer.duration(name);
165167
default:
166168
throw new UnsupportedOperationException(reader.getMinorType().toString());
167169
}
@@ -186,6 +188,8 @@ private static FieldWriter getListWriterForReader(FieldReader reader, ListWriter
186188
return (FieldWriter) writer.list();
187189
case LISTVIEW:
188190
return (FieldWriter) writer.listView();
191+
case DURATION:
192+
return (FieldWriter) writer.duration();
189193
default:
190194
throw new UnsupportedOperationException(reader.getMinorType().toString());
191195
}
@@ -211,6 +215,8 @@ private static FieldWriter getMapWriterForReader(FieldReader reader, MapWriter w
211215
return (FieldWriter) writer.listView();
212216
case MAP:
213217
return (FieldWriter) writer.map(false);
218+
case DURATION:
219+
return (FieldWriter) writer.duration();
214220
default:
215221
throw new UnsupportedOperationException(reader.getMinorType().toString());
216222
}

vector/src/test/java/org/apache/arrow/vector/complex/impl/TestComplexCopier.java

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.apache.arrow.vector.complex.writer.BaseWriter.StructWriter;
3434
import org.apache.arrow.vector.complex.writer.FieldWriter;
3535
import org.apache.arrow.vector.holders.DecimalHolder;
36+
import org.apache.arrow.vector.holders.DurationHolder;
37+
import org.apache.arrow.vector.types.TimeUnit;
3638
import org.apache.arrow.vector.types.Types;
3739
import org.apache.arrow.vector.types.pojo.ArrowType;
3840
import org.apache.arrow.vector.types.pojo.FieldType;
@@ -845,4 +847,141 @@ public void testCopyMapVectorWithMapValue() {
845847
assertTrue(VectorEqualsVisitor.vectorEquals(from, to));
846848
}
847849
}
850+
851+
@Test
852+
public void testCopyDurationVector() {
853+
try (ListVector from = ListVector.empty("v", allocator);
854+
ListVector to = ListVector.empty("v", allocator)) {
855+
856+
UnionListWriter listWriter = from.getWriter();
857+
listWriter.allocate();
858+
859+
DurationHolder durationHolder = new DurationHolder();
860+
for (int i = 0; i < COUNT; i++) {
861+
listWriter.setPosition(i);
862+
listWriter.startList();
863+
durationHolder.value = 123456789L;
864+
durationHolder.unit = TimeUnit.MILLISECOND;
865+
listWriter.duration().write(durationHolder);
866+
listWriter.endList();
867+
}
868+
from.setValueCount(COUNT);
869+
870+
FieldReader in = from.getReader();
871+
FieldWriter out = to.getWriter();
872+
for (int i = 0; i < COUNT; i++) {
873+
in.setPosition(i);
874+
out.setPosition(i);
875+
ComplexCopier.copy(in, out);
876+
}
877+
878+
to.setValueCount(COUNT);
879+
880+
assertTrue(VectorEqualsVisitor.vectorEquals(from, to));
881+
}
882+
}
883+
884+
@Test
885+
public void testCopyListVectorWithDuration() {
886+
try (ListVector from = ListVector.empty("v", allocator);
887+
ListVector to = ListVector.empty("v", allocator)) {
888+
889+
UnionListWriter listWriter = from.getWriter();
890+
listWriter.allocate();
891+
892+
DurationHolder durationHolder = new DurationHolder();
893+
for (int i = 0; i < COUNT; i++) {
894+
listWriter.setPosition(i);
895+
listWriter.startList();
896+
durationHolder.value = 123456789L;
897+
durationHolder.unit = TimeUnit.MILLISECOND;
898+
listWriter.duration().write(durationHolder);
899+
listWriter.endList();
900+
}
901+
from.setValueCount(COUNT);
902+
903+
// Copy values
904+
FieldReader in = from.getReader();
905+
FieldWriter out = to.getWriter();
906+
for (int i = 0; i < COUNT; i++) {
907+
in.setPosition(i);
908+
out.setPosition(i);
909+
ComplexCopier.copy(in, out);
910+
}
911+
912+
to.setValueCount(COUNT);
913+
914+
assertTrue(VectorEqualsVisitor.vectorEquals(from, to));
915+
}
916+
}
917+
918+
@Test
919+
public void testCopyMapVectorWithDurationValue() {
920+
try (MapVector from = MapVector.empty("v", allocator, false);
921+
MapVector to = MapVector.empty("v", allocator, false)) {
922+
923+
UnionMapWriter mapWriter = from.getWriter();
924+
mapWriter.allocate();
925+
926+
DurationHolder durationHolder = new DurationHolder();
927+
for (int i = 0; i < COUNT; i++) {
928+
mapWriter.setPosition(i);
929+
mapWriter.startMap();
930+
mapWriter.startEntry();
931+
mapWriter.key().integer().writeInt(i);
932+
durationHolder.value = 123456789L;
933+
durationHolder.unit = TimeUnit.MILLISECOND;
934+
mapWriter.value().duration().write(durationHolder);
935+
mapWriter.endEntry();
936+
mapWriter.endMap();
937+
}
938+
from.setValueCount(COUNT);
939+
940+
FieldReader in = from.getReader();
941+
FieldWriter out = to.getWriter();
942+
for (int i = 0; i < COUNT; i++) {
943+
in.setPosition(i);
944+
out.setPosition(i);
945+
ComplexCopier.copy(in, out);
946+
}
947+
948+
to.setValueCount(COUNT);
949+
950+
assertTrue(VectorEqualsVisitor.vectorEquals(from, to));
951+
}
952+
}
953+
954+
@Test
955+
public void testCopyStructVectorWithDurationValue() {
956+
try (StructVector from = StructVector.empty("v", allocator);
957+
StructVector to = StructVector.empty("v", allocator)) {
958+
959+
from.allocateNew();
960+
961+
NullableStructWriter structWriter = from.getWriter();
962+
DurationHolder durationHolder = new DurationHolder();
963+
964+
for (int i = 0; i < COUNT; i++) {
965+
structWriter.setPosition(i);
966+
structWriter.start();
967+
durationHolder.value = 123456789L;
968+
durationHolder.unit = TimeUnit.MILLISECOND;
969+
structWriter.duration("durationField").write(durationHolder); // 使用 DurationHolder
970+
structWriter.end();
971+
}
972+
973+
from.setValueCount(COUNT);
974+
975+
FieldReader in = from.getReader();
976+
FieldWriter out = to.getWriter();
977+
for (int i = 0; i < COUNT; i++) {
978+
in.setPosition(i);
979+
out.setPosition(i);
980+
ComplexCopier.copy(in, out);
981+
}
982+
to.setValueCount(COUNT);
983+
984+
assertTrue(VectorEqualsVisitor.vectorEquals(from, to));
985+
}
986+
}
848987
}

0 commit comments

Comments
 (0)