77using System . Collections . Generic ;
88using System . Diagnostics ;
99using System . Runtime . CompilerServices ;
10+ using System . Runtime . InteropServices ;
1011using Apache . Arrow ;
1112using Apache . Arrow . Types ;
1213using Microsoft . ML ;
@@ -104,6 +105,8 @@ private IArrowType GetArrowType()
104105 return UInt64Type . Default ;
105106 else if ( typeof ( T ) == typeof ( ushort ) )
106107 return UInt16Type . Default ;
108+ else if ( typeof ( T ) == typeof ( DateTime ) )
109+ return Date64Type . Default ;
107110 else
108111 throw new NotImplementedException ( nameof ( T ) ) ;
109112 }
@@ -127,36 +130,64 @@ protected internal override Apache.Arrow.Array ToArrowArray(long startIndex, int
127130 {
128131 int arrayIndex = numberOfRows == 0 ? 0 : _columnContainer . GetArrayContainingRowIndex ( startIndex ) ;
129132 int offset = ( int ) ( startIndex - arrayIndex * ReadOnlyDataFrameBuffer < T > . MaxCapacity ) ;
133+
130134 if ( numberOfRows != 0 && numberOfRows > _columnContainer . Buffers [ arrayIndex ] . Length - offset )
131135 {
132136 throw new ArgumentException ( Strings . SpansMultipleBuffers , nameof ( numberOfRows ) ) ;
133137 }
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+
136139 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+
137168 Type type = this . DataType ;
138169 if ( type == typeof ( bool ) )
139- return new BooleanArray ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
170+ return new BooleanArray ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
140171 else if ( type == typeof ( double ) )
141- return new DoubleArray ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
172+ return new DoubleArray ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
142173 else if ( type == typeof ( float ) )
143- return new FloatArray ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
174+ return new FloatArray ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
144175 else if ( type == typeof ( int ) )
145- return new Int32Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
176+ return new Int32Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
146177 else if ( type == typeof ( long ) )
147- return new Int64Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
178+ return new Int64Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
148179 else if ( type == typeof ( sbyte ) )
149- return new Int8Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
180+ return new Int8Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
150181 else if ( type == typeof ( short ) )
151- return new Int16Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
182+ return new Int16Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
152183 else if ( type == typeof ( uint ) )
153- return new UInt32Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
184+ return new UInt32Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
154185 else if ( type == typeof ( ulong ) )
155- return new UInt64Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
186+ return new UInt64Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
156187 else if ( type == typeof ( ushort ) )
157- return new UInt16Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
188+ return new UInt16Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
158189 else if ( type == typeof ( byte ) )
159- return new UInt8Array ( valueBuffer , nullBuffer , numberOfRows , nullCount , offset ) ;
190+ return new UInt8Array ( arrowValueBuffer , arrowNullBuffer , numberOfRows , nullCount , offset ) ;
160191 else
161192 throw new NotImplementedException ( type . ToString ( ) ) ;
162193 }
0 commit comments