Skip to content

Commit ec9db9f

Browse files
committed
Avoid boxing when writing list to appender.
1 parent 9b87e3b commit ec9db9f

File tree

1 file changed

+44
-7
lines changed

1 file changed

+44
-7
lines changed
Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,72 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4+
using System.Numerics;
45
using DuckDB.NET.Native;
56

67
namespace DuckDB.NET.Data.Internal.Writer;
78

89
internal sealed unsafe class ListVectorDataWriter : VectorDataWriterBase
910
{
1011
private ulong offset = 0;
11-
private readonly VectorDataWriterBase listDataWriter;
12+
private readonly VectorDataWriterBase listItemWriter;
1213

1314
public ListVectorDataWriter(IntPtr vector, void* vectorData, DuckDBType columnType, DuckDBLogicalType logicalType) : base(vector, vectorData, columnType)
1415
{
1516
using var childType = NativeMethods.LogicalType.DuckDBListTypeChildType(logicalType);
1617
var childVector = NativeMethods.Vectors.DuckDBListVectorGetChild(vector);
17-
listDataWriter = VectorDataWriterFactory.CreateWriter(childVector, childType);
18+
listItemWriter = VectorDataWriterFactory.CreateWriter(childVector, childType);
1819
}
1920

2021
internal override bool AppendCollection(IList value, int rowIndex)
2122
{
22-
var index = 0;
23-
24-
foreach (var item in value)
23+
_ = value switch
2524
{
26-
listDataWriter.AppendValue(item, (int)offset + (index++));
27-
}
25+
IEnumerable<bool> items => WriteItems(items),
26+
27+
IEnumerable<sbyte> items => WriteItems(items),
28+
IEnumerable<short> items => WriteItems(items),
29+
IEnumerable<int> items => WriteItems(items),
30+
IEnumerable<long> items => WriteItems(items),
31+
IEnumerable<byte> items => WriteItems(items),
32+
IEnumerable<ushort> items => WriteItems(items),
33+
IEnumerable<uint> items => WriteItems(items),
34+
IEnumerable<ulong> items => WriteItems(items),
35+
36+
IEnumerable<decimal> items => WriteItems(items),
37+
IEnumerable<BigInteger> items => WriteItems(items),
38+
39+
IEnumerable<string> items => WriteItems(items),
40+
IEnumerable<Guid> items => WriteItems(items),
41+
IEnumerable<DateTime> items => WriteItems(items),
42+
IEnumerable<TimeSpan> items => WriteItems(items),
43+
IEnumerable<DuckDBDateOnly> items => WriteItems(items),
44+
IEnumerable<DuckDBTimeOnly> items => WriteItems(items),
45+
#if NET6_0_OR_GREATER
46+
IEnumerable<DateOnly> items => WriteItems(items),
47+
IEnumerable<TimeOnly> items => WriteItems(items),
48+
#endif
49+
IEnumerable<DateTimeOffset> items => WriteItems(items),
50+
51+
_ => WriteItems<object>((IEnumerable<object>)value)
52+
};
2853

2954
var result = AppendValueInternal(new DuckDBListEntry(offset, (ulong)value.Count), rowIndex);
3055

3156
offset += (ulong)value.Count;
3257

3358
return result;
59+
60+
int WriteItems<T>(IEnumerable<T> items)
61+
{
62+
var index = 0;
63+
64+
foreach (var item in items)
65+
{
66+
listItemWriter.AppendValue(item, (int)offset + (index++));
67+
}
68+
69+
return 0;
70+
}
3471
}
3572
}

0 commit comments

Comments
 (0)