1
1
using System ;
2
2
using System . Collections ;
3
3
using System . Collections . Generic ;
4
+ using System . Numerics ;
4
5
using DuckDB . NET . Native ;
5
6
6
7
namespace DuckDB . NET . Data . Internal . Writer ;
7
8
8
9
internal sealed unsafe class ListVectorDataWriter : VectorDataWriterBase
9
10
{
10
11
private ulong offset = 0 ;
11
- private readonly VectorDataWriterBase listDataWriter ;
12
+ private readonly VectorDataWriterBase listItemWriter ;
12
13
13
14
public ListVectorDataWriter ( IntPtr vector , void * vectorData , DuckDBType columnType , DuckDBLogicalType logicalType ) : base ( vector , vectorData , columnType )
14
15
{
15
16
using var childType = NativeMethods . LogicalType . DuckDBListTypeChildType ( logicalType ) ;
16
17
var childVector = NativeMethods . Vectors . DuckDBListVectorGetChild ( vector ) ;
17
- listDataWriter = VectorDataWriterFactory . CreateWriter ( childVector , childType ) ;
18
+ listItemWriter = VectorDataWriterFactory . CreateWriter ( childVector , childType ) ;
18
19
}
19
20
20
21
internal override bool AppendCollection ( IList value , int rowIndex )
21
22
{
22
- var index = 0 ;
23
-
24
- foreach ( var item in value )
23
+ _ = value switch
25
24
{
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
+ } ;
28
53
29
54
var result = AppendValueInternal ( new DuckDBListEntry ( offset , ( ulong ) value . Count ) , rowIndex ) ;
30
55
31
56
offset += ( ulong ) value . Count ;
32
57
33
58
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
+ }
34
71
}
35
72
}
0 commit comments