@@ -16,6 +16,8 @@ import (
16
16
"github.com/apache/arrow/go/v13/arrow/ipc"
17
17
jsoniter "github.com/json-iterator/go"
18
18
"github.com/mattetti/filebuffer"
19
+
20
+ "github.com/grafana/grafana-plugin-sdk-go/internal/jsonitere"
19
21
)
20
22
21
23
const simpleTypeString = "string"
@@ -276,14 +278,12 @@ func readFrameData(iter *jsoniter.Iterator, frame *Frame) error {
276
278
}
277
279
278
280
field := frame .Fields [0 ]
279
- first := make ([]interface {}, 0 )
280
- iter .ReadVal (& first )
281
- vec , err := jsonValuesToVector (field .Type (), first )
281
+ vec , err := jsonValuesToVector (iter , field .Type ())
282
282
if err != nil {
283
283
return err
284
284
}
285
285
field .vector = vec
286
- size := len ( first )
286
+ size := vec . Len ( )
287
287
288
288
addNanos := func () {
289
289
if readNanos {
@@ -420,7 +420,37 @@ func int64FromJSON(v interface{}) (int64, error) {
420
420
return 0 , fmt .Errorf ("unable to convert int64 in json [%T]" , v )
421
421
}
422
422
423
- func jsonValuesToVector (ft FieldType , arr []interface {}) (vector , error ) {
423
+ func jsonValuesToVector (iter * jsoniter.Iterator , ft FieldType ) (vector , error ) {
424
+ itere := jsonitere .NewIterator (iter )
425
+ // we handle Uint64 differently because the regular method for unmarshalling to []any does not work for uint64 correctly
426
+ // due to jsoniter parsing logic that automatically converts all numbers to float64.
427
+ // We can't use readUint64VectorJSON here because the size of the array is not known and the function requires the length parameter
428
+ switch ft {
429
+ case FieldTypeUint64 :
430
+ parseUint64 := func (s string ) (uint64 , error ) {
431
+ return strconv .ParseUint (s , 0 , 64 )
432
+ }
433
+ u , err := readArrayOfNumbers [uint64 ](itere , parseUint64 , itere .ReadUint64 )
434
+ if err != nil {
435
+ return nil , err
436
+ }
437
+ return newUint64VectorWithValues (u ), nil
438
+ case FieldTypeNullableUint64 :
439
+ parseUint64 := func (s string ) (* uint64 , error ) {
440
+ u , err := strconv .ParseUint (s , 0 , 64 )
441
+ if err != nil {
442
+ return nil , err
443
+ }
444
+ return & u , nil
445
+ }
446
+ u , err := readArrayOfNumbers [* uint64 ](itere , parseUint64 , itere .ReadUint64Pointer )
447
+ if err != nil {
448
+ return nil , err
449
+ }
450
+ return newNullableUint64VectorWithValues (u ), nil
451
+ }
452
+ // if it's not uint64 field, handle the array the old way
453
+
424
454
convert := func (v interface {}) (interface {}, error ) {
425
455
return v , nil
426
456
}
@@ -458,13 +488,6 @@ func jsonValuesToVector(ft FieldType, arr []interface{}) (vector, error) {
458
488
iV , err := int64FromJSON (v )
459
489
return uint32 (iV ), err
460
490
}
461
-
462
- case FieldTypeUint64 :
463
- convert = func (v interface {}) (interface {}, error ) {
464
- iV , err := int64FromJSON (v )
465
- return uint64 (iV ), err
466
- }
467
-
468
491
case FieldTypeInt8 :
469
492
convert = func (v interface {}) (interface {}, error ) {
470
493
iV , err := int64FromJSON (v )
@@ -524,6 +547,11 @@ func jsonValuesToVector(ft FieldType, arr []interface{}) (vector, error) {
524
547
}
525
548
}
526
549
550
+ arr := make ([]interface {}, 0 )
551
+ err := itere .ReadVal (& arr )
552
+ if err != nil {
553
+ return nil , err
554
+ }
527
555
f := NewFieldFromFieldType (ft , len (arr ))
528
556
for i , v := range arr {
529
557
if v != nil {
@@ -537,14 +565,53 @@ func jsonValuesToVector(ft FieldType, arr []interface{}) (vector, error) {
537
565
return f .vector , nil
538
566
}
539
567
540
- // nolint:gocyclo
541
- func readVector (iter * jsoniter.Iterator , ft FieldType , size int ) (vector , error ) {
542
- if false {
543
- first := make ([]interface {}, 0 )
544
- iter .ReadVal (& first )
545
- return jsonValuesToVector (ft , first )
568
+ func readArrayOfNumbers [T any ](iter * jsonitere.Iterator , parse func (string ) (T , error ), reader func () (T , error )) ([]T , error ) {
569
+ var def T
570
+ var result []T
571
+ for {
572
+ next , err := iter .ReadArray ()
573
+ if err != nil {
574
+ return nil , err
575
+ }
576
+ if ! next {
577
+ break
578
+ }
579
+ nextType , err := iter .WhatIsNext ()
580
+ if err != nil {
581
+ return nil , err
582
+ }
583
+ switch nextType {
584
+ case jsoniter .StringValue :
585
+ str , err := iter .ReadString ()
586
+ if err != nil {
587
+ return nil , err
588
+ }
589
+ u , err := parse (str )
590
+ if err != nil {
591
+ return nil , iter .ReportError (fmt .Sprintf ("readArrayOfNumbers[%T]" , def ), "cannot parse string" )
592
+ }
593
+ result = append (result , u )
594
+ case jsoniter .NilValue :
595
+ _ , err := iter .ReadNil ()
596
+ if err != nil {
597
+ return nil , err
598
+ }
599
+ // add T's default value. For reference type it will be nil, for value types the default value such as 0, false, ""
600
+ // This is the same logic as in `read<Type>VectorJSON`
601
+ result = append (result , def )
602
+ default : // read as a number, if it is not expected field type, there will be error.
603
+ u , err := reader ()
604
+ if err != nil {
605
+ return nil , err
606
+ }
607
+ result = append (result , u )
608
+ }
546
609
}
610
+ return result , nil
611
+ }
547
612
613
+ // nolint:gocyclo
614
+ func readVector (iter * jsoniter.Iterator , ft FieldType , size int ) (vector , error ) {
548
615
switch ft {
549
616
// Manual
550
617
case FieldTypeTime :
0 commit comments