Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 7df1edd

Browse files
authoredJul 12, 2023
handling scalars in JSON.GET (#301)
* handling scalars in JSON.GET
1 parent f30b262 commit 7df1edd

File tree

2 files changed

+90
-7
lines changed

2 files changed

+90
-7
lines changed
 

‎pkg/redis-json.go

+18-7
Original file line numberDiff line numberDiff line change
@@ -122,16 +122,27 @@ func queryJsonGet(qm queryModel, client redisClient) backend.DataResponse {
122122

123123
// Value
124124
switch e := entry.(type) {
125-
case string:
125+
case string, bool, float64:
126126
i := "Value"
127127
if _, ok := fields[i]; !ok {
128-
fields[i] = data.NewField(i, nil, []string{})
129-
frame.Fields = append(frame.Fields, fields[i])
130-
131-
// Generate empty values for all previous rows
132-
for j := 0; j < rowscount-1; j++ {
133-
fields[i].Append("")
128+
switch entry.(type) {
129+
case string:
130+
fields[i] = data.NewField(i, nil, []string{})
131+
for j := 0; j < rowscount-1; j++ {
132+
fields[i].Append("")
133+
}
134+
case bool:
135+
fields[i] = data.NewField(i, nil, []bool{})
136+
for j := 0; j < rowscount-1; j++ {
137+
fields[i].Append(false)
138+
}
139+
case float64:
140+
fields[i] = data.NewField(i, nil, []float64{})
141+
for j := 0; j < rowscount-1; j++ {
142+
fields[i].Append(float64(0))
143+
}
134144
}
145+
frame.Fields = append(frame.Fields, fields[i])
135146
}
136147

137148
// Insert value for current row

‎pkg/redis-json_test.go

+72
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,78 @@ func TestQueryJsonObjKeys(t *testing.T) {
160160
func TestQueryJsonGet(t *testing.T) {
161161
t.Parallel()
162162

163+
t.Run("Should return four strings in frame", func(t *testing.T) {
164+
t.Parallel()
165+
166+
client := testClient{rcv: "[[],\"gin\",\"rum\",\"whiskey\"]"}
167+
168+
resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client)
169+
170+
require.Len(t, resp.Frames, 1)
171+
require.Len(t, resp.Frames[0].Fields, 1)
172+
require.Equal(t, resp.Frames[0].Fields[0].Len(), 4)
173+
require.Equal(t, resp.Frames[0].Fields[0].At(0), "")
174+
require.Equal(t, resp.Frames[0].Fields[0].At(1), "gin")
175+
require.Equal(t, resp.Frames[0].Fields[0].At(2), "rum")
176+
require.Equal(t, resp.Frames[0].Fields[0].At(3), "whiskey")
177+
})
178+
179+
t.Run("Should return four booleans in frame", func(t *testing.T) {
180+
t.Parallel()
181+
182+
client := testClient{rcv: "[[],true,false,true]"}
183+
184+
resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client)
185+
186+
require.Len(t, resp.Frames, 1)
187+
require.Len(t, resp.Frames[0].Fields, 1)
188+
require.Equal(t, resp.Frames[0].Fields[0].Len(), 4)
189+
require.Equal(t, resp.Frames[0].Fields[0].At(0), false)
190+
require.Equal(t, resp.Frames[0].Fields[0].At(1), true)
191+
require.Equal(t, resp.Frames[0].Fields[0].At(2), false)
192+
require.Equal(t, resp.Frames[0].Fields[0].At(3), true)
193+
})
194+
195+
t.Run("Should return four float64 in frame", func(t *testing.T) {
196+
t.Parallel()
197+
198+
client := testClient{rcv: "[[],42,43,44]"}
199+
200+
resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client)
201+
202+
require.Len(t, resp.Frames, 1)
203+
require.Len(t, resp.Frames[0].Fields, 1)
204+
require.Equal(t, resp.Frames[0].Fields[0].Len(), 4)
205+
require.Equal(t, resp.Frames[0].Fields[0].At(0), float64(0))
206+
require.Equal(t, resp.Frames[0].Fields[0].At(1), float64(42))
207+
require.Equal(t, resp.Frames[0].Fields[0].At(2), float64(43))
208+
require.Equal(t, resp.Frames[0].Fields[0].At(3), float64(44))
209+
210+
})
211+
212+
t.Run("Should return a single float64 in frame", func(t *testing.T) {
213+
t.Parallel()
214+
215+
client := testClient{rcv: "[42]"}
216+
217+
resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client)
218+
219+
require.Len(t, resp.Frames, 1)
220+
require.Len(t, resp.Frames[0].Fields, 1)
221+
require.Equal(t, resp.Frames[0].Fields[0].At(0), float64(42))
222+
223+
})
224+
225+
t.Run("Should return a single boolean in frame", func(t *testing.T) {
226+
t.Parallel()
227+
228+
client := testClient{rcv: "[true]"}
229+
resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.bool"}, &client)
230+
require.Len(t, resp.Frames, 1)
231+
require.Len(t, resp.Frames[0].Fields, 1)
232+
require.Equal(t, resp.Frames[0].Fields[0].At(0), true)
233+
})
234+
163235
t.Run("should handle encoded JSON with string", func(t *testing.T) {
164236
t.Parallel()
165237

0 commit comments

Comments
 (0)
Please sign in to comment.