Skip to content

Commit

Permalink
feat: support nested array
Browse files Browse the repository at this point in the history
  • Loading branch information
Danile71 committed Jan 16, 2025
1 parent c347868 commit fef0757
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 11 deletions.
4 changes: 2 additions & 2 deletions pkg/plugin/datasource_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func TestParsingJsonNestedArray(t *testing.T) {
}
`

const expectedInlineArrayValue = `{"schema":{"name":"response ","fields":[{"name":"value1","type":"number","typeInfo":{"frame":"float64","nullable":true},"labels":{}},{"name":"value2","type":"number","typeInfo":{"frame":"float64","nullable":true},"labels":{}},{"name":"sub_value.0.value1","type":"string","typeInfo":{"frame":"string","nullable":true},"labels":{}},{"name":"sub_value.0.value2","type":"number","typeInfo":{"frame":"float64","nullable":true},"labels":{}},{"name":"sub_value.0.sub_value.0.value1","type":"string","typeInfo":{"frame":"string","nullable":true},"labels":{}},{"name":"sub_value.0.sub_value.0.value2","type":"number","typeInfo":{"frame":"float64","nullable":true},"labels":{}}]},"data":{"values":[[1],[0],["string"],[1],["string"],[1]]}}`
const expectedNestedArrayValue = `{"schema":{"name":"response ","fields":[{"name":"value1","type":"number","typeInfo":{"frame":"float64","nullable":true},"labels":{}},{"name":"value2","type":"number","typeInfo":{"frame":"float64","nullable":true},"labels":{}},{"name":"sub_value","type":"other","typeInfo":{"frame":"json.RawMessage","nullable":true},"labels":{}}]},"data":{"values":[[1],[0],[[{"value1":"string","value2":1,"sub_value":[{"value1":"string","value2":1}]}]]]}}`

ds, err := NewMockDatasource([]byte(jsonString))
if err != nil {
Expand Down Expand Up @@ -104,7 +104,7 @@ func TestParsingJsonNestedArray(t *testing.T) {
t.Fatal(err)
}

if string(data) != expectedInlineArrayValue {
if string(data) != expectedNestedArrayValue {
t.Errorf("Unexpected JSON frame data: %s", string(data))
}
}
Expand Down
13 changes: 10 additions & 3 deletions pkg/plugin/parsing/framemap/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ package framemap
import (
"encoding/json"
"fmt"
"reflect"
"time"

"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/wildmountainfarms/wild-graphql-datasource/pkg/plugin/parsing/fieldsort"
"github.com/wildmountainfarms/wild-graphql-datasource/pkg/util/jsonnode"
"reflect"
"time"
)

func (f *FrameMap) getAllFields() []string {
Expand Down Expand Up @@ -73,7 +74,7 @@ func (f *FrameMap) createField(targetNode *frameNode, fieldKey string) (*data.Fi
n := frameMapIterator.Value()
for rowIndex, row := range n.rows {
if value, exists := row.FieldMap[fieldKey]; exists {
switch value.(type) {
switch value := value.(type) {
case jsonnode.Null:
foundNull = true
case jsonnode.Number:
Expand All @@ -86,6 +87,11 @@ func (f *FrameMap) createField(targetNode *frameNode, fieldKey string) (*data.Fi
return createFieldForNativeType[bool](targetNode, fieldKey), nil
case float64:
return createFieldForNativeType[float64](targetNode, fieldKey), nil
case *jsonnode.Array:
var values []*json.RawMessage
vv := value.Serialize()
values = append(values, &vv)
return data.NewField(fieldKey, targetNode.labels, values), nil
default:
return nil, fmt.Errorf("field %s of row %d has unknown type: %v", fieldKey, rowIndex, reflect.TypeOf(value))
}
Expand Down Expand Up @@ -124,6 +130,7 @@ func (f *FrameMap) ToFrames() ([]*data.Frame, error) {
if err != nil {
return nil, err
}

frame.Fields = append(frame.Fields, field)
}
r = append(r, frame)
Expand Down
10 changes: 4 additions & 6 deletions pkg/plugin/parsing/parsing.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,17 +85,15 @@ func ParseData(graphQlResponseData *jsonnode.Object, parsingOption querymodel.Pa
fm := framemap.New()

for _, dataElement := range dataArray {
flatData := jsonnode.NewObject()
flattenData(dataElement, "", flatData)
labels, err := getLabelsFromFlatData(flatData, parsingOption)
labels, err := getLabelsFromFlatData(dataElement, parsingOption)
if err != nil {
return nil, err, FRIENDLY_ERROR // getLabelsFromFlatData must always return a friendly error
}
row := fm.NewRow(labels)
row.FieldOrder = flatData.Keys()
row.FieldOrder = dataElement.Keys()

for _, key := range flatData.Keys() {
value := flatData.Get(key)
for _, key := range dataElement.Keys() {
value := dataElement.Get(key)

timeField := parsingOption.GetTimeField(key)
if timeField != nil {
Expand Down

0 comments on commit fef0757

Please sign in to comment.