Skip to content

Commit

Permalink
handling scalars in JSON.GET (#301)
Browse files Browse the repository at this point in the history
* handling scalars in JSON.GET
  • Loading branch information
slorello89 committed Jul 12, 2023
1 parent f30b262 commit 7df1edd
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 7 deletions.
25 changes: 18 additions & 7 deletions pkg/redis-json.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,16 +122,27 @@ func queryJsonGet(qm queryModel, client redisClient) backend.DataResponse {

// Value
switch e := entry.(type) {
case string:
case string, bool, float64:
i := "Value"
if _, ok := fields[i]; !ok {
fields[i] = data.NewField(i, nil, []string{})
frame.Fields = append(frame.Fields, fields[i])

// Generate empty values for all previous rows
for j := 0; j < rowscount-1; j++ {
fields[i].Append("")
switch entry.(type) {
case string:
fields[i] = data.NewField(i, nil, []string{})
for j := 0; j < rowscount-1; j++ {
fields[i].Append("")
}
case bool:
fields[i] = data.NewField(i, nil, []bool{})
for j := 0; j < rowscount-1; j++ {
fields[i].Append(false)
}
case float64:
fields[i] = data.NewField(i, nil, []float64{})
for j := 0; j < rowscount-1; j++ {
fields[i].Append(float64(0))
}
}
frame.Fields = append(frame.Fields, fields[i])
}

// Insert value for current row
Expand Down
72 changes: 72 additions & 0 deletions pkg/redis-json_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,78 @@ func TestQueryJsonObjKeys(t *testing.T) {
func TestQueryJsonGet(t *testing.T) {
t.Parallel()

t.Run("Should return four strings in frame", func(t *testing.T) {
t.Parallel()

client := testClient{rcv: "[[],\"gin\",\"rum\",\"whiskey\"]"}

resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client)

require.Len(t, resp.Frames, 1)
require.Len(t, resp.Frames[0].Fields, 1)
require.Equal(t, resp.Frames[0].Fields[0].Len(), 4)
require.Equal(t, resp.Frames[0].Fields[0].At(0), "")
require.Equal(t, resp.Frames[0].Fields[0].At(1), "gin")
require.Equal(t, resp.Frames[0].Fields[0].At(2), "rum")
require.Equal(t, resp.Frames[0].Fields[0].At(3), "whiskey")
})

t.Run("Should return four booleans in frame", func(t *testing.T) {
t.Parallel()

client := testClient{rcv: "[[],true,false,true]"}

resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client)

require.Len(t, resp.Frames, 1)
require.Len(t, resp.Frames[0].Fields, 1)
require.Equal(t, resp.Frames[0].Fields[0].Len(), 4)
require.Equal(t, resp.Frames[0].Fields[0].At(0), false)
require.Equal(t, resp.Frames[0].Fields[0].At(1), true)
require.Equal(t, resp.Frames[0].Fields[0].At(2), false)
require.Equal(t, resp.Frames[0].Fields[0].At(3), true)
})

t.Run("Should return four float64 in frame", func(t *testing.T) {
t.Parallel()

client := testClient{rcv: "[[],42,43,44]"}

resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client)

require.Len(t, resp.Frames, 1)
require.Len(t, resp.Frames[0].Fields, 1)
require.Equal(t, resp.Frames[0].Fields[0].Len(), 4)
require.Equal(t, resp.Frames[0].Fields[0].At(0), float64(0))
require.Equal(t, resp.Frames[0].Fields[0].At(1), float64(42))
require.Equal(t, resp.Frames[0].Fields[0].At(2), float64(43))
require.Equal(t, resp.Frames[0].Fields[0].At(3), float64(44))

})

t.Run("Should return a single float64 in frame", func(t *testing.T) {
t.Parallel()

client := testClient{rcv: "[42]"}

resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client)

require.Len(t, resp.Frames, 1)
require.Len(t, resp.Frames[0].Fields, 1)
require.Equal(t, resp.Frames[0].Fields[0].At(0), float64(42))

})

t.Run("Should return a single boolean in frame", func(t *testing.T) {
t.Parallel()

client := testClient{rcv: "[true]"}
resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.bool"}, &client)
require.Len(t, resp.Frames, 1)
require.Len(t, resp.Frames[0].Fields, 1)
require.Equal(t, resp.Frames[0].Fields[0].At(0), true)
})

t.Run("should handle encoded JSON with string", func(t *testing.T) {
t.Parallel()

Expand Down

0 comments on commit 7df1edd

Please sign in to comment.