6
6
using System . Collections ;
7
7
using System . Collections . Generic ;
8
8
using System . Diagnostics ;
9
+ using System . Runtime . InteropServices ;
9
10
using Apache . Arrow ;
10
11
using Apache . Arrow . Types ;
11
12
using Microsoft . ML ;
@@ -103,6 +104,8 @@ private IArrowType GetArrowType()
103
104
return UInt64Type . Default ;
104
105
else if ( typeof ( T ) == typeof ( ushort ) )
105
106
return UInt16Type . Default ;
107
+ else if ( typeof ( T ) == typeof ( DateTime ) )
108
+ return Date64Type . Default ;
106
109
else
107
110
throw new NotImplementedException ( nameof ( T ) ) ;
108
111
}
@@ -126,36 +129,64 @@ protected internal override Apache.Arrow.Array ToArrowArray(long startIndex, int
126
129
{
127
130
int arrayIndex = numberOfRows == 0 ? 0 : _columnContainer . GetArrayContainingRowIndex ( startIndex ) ;
128
131
int offset = ( int ) ( startIndex - arrayIndex * ReadOnlyDataFrameBuffer < T > . MaxCapacity ) ;
132
+
129
133
if ( numberOfRows != 0 && numberOfRows > _columnContainer . Buffers [ arrayIndex ] . Length - offset )
130
134
{
131
135
throw new ArgumentException ( Strings . SpansMultipleBuffers , nameof ( numberOfRows ) ) ;
132
136
}
133
- ArrowBuffer valueBuffer = numberOfRows == 0 ? ArrowBuffer . Empty : new ArrowBuffer ( _columnContainer . GetValueBuffer ( startIndex ) ) ;
134
- ArrowBuffer nullBuffer = numberOfRows == 0 ? ArrowBuffer . Empty : new ArrowBuffer ( _columnContainer . GetNullBuffer ( startIndex ) ) ;
137
+
135
138
int nullCount = GetNullCount ( startIndex , numberOfRows ) ;
139
+
140
+ //DateTime requires convertion
141
+ if ( this . DataType == typeof ( DateTime ) )
142
+ {
143
+ if ( numberOfRows == 0 )
144
+ return new Date64Array ( ArrowBuffer . Empty , ArrowBuffer . Empty , numberOfRows , nullCount , offset ) ;
145
+
146
+ ReadOnlyDataFrameBuffer < T > valueBuffer = ( numberOfRows == 0 ) ? null : _columnContainer . Buffers [ arrayIndex ] ;
147
+ ReadOnlyDataFrameBuffer < byte > nullBuffer = ( numberOfRows == 0 ) ? null : _columnContainer . NullBitMapBuffers [ arrayIndex ] ;
148
+
149
+ ReadOnlySpan < DateTime > valueSpan = MemoryMarshal . Cast < T , DateTime > ( valueBuffer . ReadOnlySpan ) ;
150
+ Date64Array . Builder builder = new Date64Array . Builder ( ) . Reserve ( valueBuffer . Length ) ;
151
+
152
+ for ( int i = 0 ; i < valueBuffer . Length ; i ++ )
153
+ {
154
+ if ( BitUtility . GetBit ( nullBuffer . ReadOnlySpan , i ) )
155
+ builder . Append ( valueSpan [ i ] ) ;
156
+ else
157
+ builder . AppendNull ( ) ;
158
+ }
159
+
160
+ return builder . Build ( ) ;
161
+ }
162
+
163
+ //No convertion
164
+ ArrowBuffer arrowValueBuffer = numberOfRows == 0 ? ArrowBuffer . Empty : new ArrowBuffer ( _columnContainer . Buffers [ arrayIndex ] . ReadOnlyBuffer ) ;
165
+ ArrowBuffer arrowNullBuffer = numberOfRows == 0 ? ArrowBuffer . Empty : new ArrowBuffer ( _columnContainer . NullBitMapBuffers [ arrayIndex ] . ReadOnlyBuffer ) ;
166
+
136
167
Type type = this . DataType ;
137
168
if ( type == typeof ( bool ) )
138
- return new BooleanArray ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
169
+ return new BooleanArray ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
139
170
else if ( type == typeof ( double ) )
140
- return new DoubleArray ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
171
+ return new DoubleArray ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
141
172
else if ( type == typeof ( float ) )
142
- return new FloatArray ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
173
+ return new FloatArray ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
143
174
else if ( type == typeof ( int ) )
144
- return new Int32Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
175
+ return new Int32Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
145
176
else if ( type == typeof ( long ) )
146
- return new Int64Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
177
+ return new Int64Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
147
178
else if ( type == typeof ( sbyte ) )
148
- return new Int8Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
179
+ return new Int8Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
149
180
else if ( type == typeof ( short ) )
150
- return new Int16Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
181
+ return new Int16Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
151
182
else if ( type == typeof ( uint ) )
152
- return new UInt32Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
183
+ return new UInt32Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
153
184
else if ( type == typeof ( ulong ) )
154
- return new UInt64Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
185
+ return new UInt64Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
155
186
else if ( type == typeof ( ushort ) )
156
- return new UInt16Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
187
+ return new UInt16Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
157
188
else if ( type == typeof ( byte ) )
158
- return new UInt8Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
189
+ return new UInt8Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
159
190
else
160
191
throw new NotImplementedException ( type . ToString ( ) ) ;
161
192
}
0 commit comments