@@ -365,10 +365,35 @@ private BsonBinaryData SerializeToBinaryData<TCollection>(TCollection collection
365
365
private static ( T [ ] , byte [ ] VectorBson ) GetTestData < T > ( BinaryVectorDataType dataType , int elementsCount , byte bitsPadding )
366
366
where T : struct
367
367
{
368
- var elementsSpan = new ReadOnlySpan < T > ( Enumerable . Range ( 0 , elementsCount ) . Select ( i => Convert . ChangeType ( i , typeof ( T ) ) . As < T > ( ) ) . ToArray ( ) ) ;
369
- byte [ ] vectorBsonData = [ ( byte ) dataType , bitsPadding , .. MemoryMarshal . Cast < T , byte > ( elementsSpan ) ] ;
370
-
371
- return ( elementsSpan . ToArray ( ) , vectorBsonData ) ;
368
+ var elementsSpan = new ReadOnlySpan < T > (
369
+ Enumerable . Range ( 0 , elementsCount )
370
+ . Select ( i => Convert . ChangeType ( i , typeof ( T ) ) . As < T > ( ) )
371
+ . ToArray ( ) ) ;
372
+ if ( typeof ( T ) == typeof ( float ) && dataType == BinaryVectorDataType . Float32 )
373
+ {
374
+ var buffer = new byte [ 2 + elementsCount * 4 ] ; // 4 bytes per float
375
+ buffer [ 0 ] = ( byte ) dataType ;
376
+ buffer [ 1 ] = bitsPadding ;
377
+ for ( int i = 0 ; i < elementsCount ; i ++ )
378
+ {
379
+ var floatBytes = BitConverter . GetBytes ( ( float ) ( object ) elementsSpan [ i ] ) ;
380
+ if ( ! BitConverter . IsLittleEndian )
381
+ {
382
+ Array . Reverse ( floatBytes ) ;
383
+ }
384
+ Buffer . BlockCopy ( floatBytes , 0 , buffer , 2 + i * 4 , 4 ) ;
385
+ }
386
+ return ( elementsSpan . ToArray ( ) , buffer ) ;
387
+ }
388
+ else if ( ( typeof ( T ) == typeof ( byte ) || typeof ( T ) == typeof ( sbyte ) ) && ( dataType == BinaryVectorDataType . Int8 || dataType == BinaryVectorDataType . PackedBit ) )
389
+ {
390
+ byte [ ] vectorBsonData = [ ( byte ) dataType , bitsPadding , .. MemoryMarshal . Cast < T , byte > ( elementsSpan ) ] ;
391
+ return ( elementsSpan . ToArray ( ) , vectorBsonData ) ;
392
+ }
393
+ else
394
+ {
395
+ throw new NotSupportedException ( $ "Type { typeof ( T ) } is not supported for data type { dataType } .") ;
396
+ }
372
397
}
373
398
374
399
private static ( BinaryVector < T > , byte [ ] VectorBson ) GetTestDataBinaryVector < T > ( BinaryVectorDataType dataType , int elementsCount , byte bitsPadding )
0 commit comments