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