-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
Showing
17 changed files
with
940 additions
and
358 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
--- | ||
title: JSON.RESP | ||
description: Documentation for the DiceDB command JSON.RESP | ||
--- | ||
|
||
The `JSON.RESP` command in DiceDB is part of the DiceDBJSON module, which returns the JSON in the specified key in Redis Serialization Protocol Specification (RESP) form. | ||
|
||
## Syntax | ||
|
||
```bash | ||
JSON.RESP <key> [path] | ||
``` | ||
|
||
## Parameters | ||
|
||
| Parameter | Description | Type | Required | | ||
| --------- | --------------------------------------------------------------------------------------- | ------ | -------- | | ||
| `key` | The key under which the JSON data is stored. | String | Yes | | ||
| `path` | The JSON path to the specific part of the JSON data to fetch. Defaults to the root if not provided. | String | No | | ||
|
||
## Return Value | ||
|
||
| Condition | Return Value | | ||
| ----------------------- | ----------------------------------- | | ||
| if `path` is provided | JSON value at the specified path in RESP form. | | ||
|
||
## Behaviour | ||
|
||
- If the path is not provided, it defaults to the root of the JSON data. | ||
|
||
## Errors | ||
|
||
1. `Wrong Type`: | ||
- Error Message: `WRONGTYPE Operation against a key holding the wrong kind of value` | ||
- If the key exists but does not hold JSON data, DiceDB will return an error. | ||
|
||
## Example Usage | ||
|
||
### JSON.RESP on array | ||
|
||
The `JSON.RESP` command returns the entire JSON data stored under the key `arrayjson` in RESP form. | ||
|
||
```bash | ||
127.0.0.1:7379> JSON.SET arrayjson $ '["dice",10,10.5,true,null]' | ||
OK | ||
127.0.0.1:7379> JSON.RESP | ||
1) [ | ||
2) "dice" | ||
3) (integer) 10 | ||
4) "10.5" | ||
5) true | ||
6) (nil) | ||
``` | ||
### JSON.RESP on nested JSON | ||
The `JSON.RESP` command returns the JSON data stored under the key `myjson` at `$.b` in RESP form. | ||
```bash | ||
127.0.0.1:7379> JSON.SET myjson $ '{"a":100,"b":["dice",10,10.5,true,null]}' | ||
OK | ||
127.0.0.1:7379> JSON.RESP myjson $.b | ||
1) 1) [ | ||
2) "dice" | ||
3) (integer) 10 | ||
4) "10.5" | ||
5) true | ||
6) (nil) | ||
``` | ||
## Notes | ||
- JSONPath expressions are used to navigate and specify the location within the JSON document. Familiarity with JSONPath syntax is beneficial for effective use of this command. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
package http | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
func TestJSONDEBUG(t *testing.T) { | ||
exec := NewHTTPCommandExecutor() | ||
|
||
testCases := []TestCase{ | ||
{ | ||
name: "jsondebug with no path", | ||
commands: []HTTPCommand{ | ||
{Command: "JSON.SET", Body: map[string]interface{}{"key": "k1", "path": "$", "json": map[string]interface{}{"a": 1}}}, | ||
{Command: "JSON.DEBUG", Body: map[string]interface{}{"values": []interface{}{"MEMORY", "k1"}}}, | ||
}, | ||
expected: []interface{}{"OK", float64(89)}, | ||
}, | ||
{ | ||
name: "jsondebug with a valid path", | ||
commands: []HTTPCommand{ | ||
{Command: "JSON.SET", Body: map[string]interface{}{"key": "k2", "path": "$", "json": map[string]interface{}{"a": 1, "b": 2}}}, | ||
{Command: "JSON.DEBUG", Body: map[string]interface{}{"values": []interface{}{"MEMORY", "k2", "$.a"}}}, | ||
}, | ||
expected: []interface{}{"OK", []interface{}{float64(16)}}, | ||
}, | ||
{ | ||
name: "jsondebug with multiple paths", | ||
commands: []HTTPCommand{ | ||
{Command: "JSON.SET", Body: map[string]interface{}{"key": "k3", "path": "$", "json": map[string]interface{}{"a": 1, "b": "dice"}}}, | ||
{Command: "JSON.DEBUG", Body: map[string]interface{}{"values": []interface{}{"MEMORY", "k3", "$.a", "$.b"}}}, | ||
}, | ||
expected: []interface{}{"OK", []interface{}{float64(16)}}, | ||
}, | ||
{ | ||
name: "jsondebug with multiple paths", | ||
commands: []HTTPCommand{ | ||
{Command: "JSON.SET", Body: map[string]interface{}{"key": "k4", "path": "$", "json": map[string]interface{}{"a": 1, "b": "dice"}}}, | ||
{Command: "JSON.DEBUG", Body: map[string]interface{}{"values": []interface{}{"MEMORY", "k4", "$.a", "$.b"}}}, | ||
}, | ||
expected: []interface{}{"OK", []interface{}{float64(16)}}, | ||
}, | ||
{ | ||
name: "jsondebug with single path for array json", | ||
commands: []HTTPCommand{ | ||
{Command: "JSON.SET", Body: map[string]interface{}{"key": "k5", "path": "$", "json": []interface{}{"roll", "the", "dices"}}}, | ||
{Command: "JSON.DEBUG", Body: map[string]interface{}{"values": []interface{}{"MEMORY", "k5", "$[1]"}}}, | ||
}, | ||
expected: []interface{}{"OK", []interface{}{float64(19)}}, | ||
}, | ||
{ | ||
name: "jsondebug with multiple paths for array json", | ||
commands: []HTTPCommand{ | ||
{Command: "JSON.SET", Body: map[string]interface{}{"key": "k6", "path": "$", "json": []interface{}{"roll", "the", "dices"}}}, | ||
{Command: "JSON.DEBUG", Body: map[string]interface{}{"values": []interface{}{"MEMORY", "k6", "$[1,2]"}}}, | ||
}, | ||
expected: []interface{}{"OK", []interface{}{float64(19), float64(21)}}, | ||
}, | ||
{ | ||
name: "jsondebug with all paths for array json", | ||
commands: []HTTPCommand{ | ||
{Command: "JSON.SET", Body: map[string]interface{}{"key": "k7", "path": "$", "json": []interface{}{"roll", "the", "dices"}}}, | ||
{Command: "JSON.DEBUG", Body: map[string]interface{}{"values": []interface{}{"MEMORY", "k7", "$[:]"}}}, | ||
}, | ||
expected: []interface{}{"OK", []interface{}{float64(20), float64(19), float64(21)}}, | ||
}, | ||
} | ||
|
||
for _, tc := range testCases { | ||
t.Run(tc.name, func(t *testing.T) { | ||
for i, cmd := range tc.commands { | ||
result, _ := exec.FireCommand(cmd) | ||
assert.Equal(t, tc.expected[i], result) | ||
} | ||
}) | ||
} | ||
|
||
// Cleanup the used keys | ||
exec.FireCommand(HTTPCommand{Command: "DEL", Body: map[string]interface{}{"keys": []interface{}{"k1", "k2", "k3", "k4", "k5", "k6", "k7"}}}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
package http | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
func TestJSONRESP(t *testing.T) { | ||
exec := NewHTTPCommandExecutor() | ||
|
||
testCases := []TestCase{ | ||
{ | ||
name: "jsonresp on array with mixed types", | ||
commands: []HTTPCommand{ | ||
{Command: "JSON.SET", Body: map[string]interface{}{"key": "k1", "path": "$", "json": []interface{}{"dice", 10, 10.5, true, nil}}}, | ||
{Command: "JSON.RESP", Body: map[string]interface{}{"key": "k1", "path": "$"}}, | ||
}, | ||
expected: []interface{}{"OK", []interface{}{"[", "dice", float64(10), float64(10.5), true, nil}}, | ||
}, | ||
{ | ||
name: "jsonresp on nested array with mixed types", | ||
commands: []HTTPCommand{ | ||
{Command: "JSON.SET", Body: map[string]interface{}{"key": "k2", "path": "$", "json": map[string]interface{}{"b": []interface{}{"dice", 10, 10.5, true, nil}}}}, | ||
{Command: "JSON.RESP", Body: map[string]interface{}{"key": "k2", "path": "$.b"}}, | ||
}, | ||
expected: []interface{}{"OK", []interface{}{[]interface{}{"[", "dice", float64(10), float64(10.5), true, nil}}}, | ||
}, | ||
{ | ||
name: "jsonresp on object at root path", | ||
commands: []HTTPCommand{ | ||
{Command: "JSON.SET", Body: map[string]interface{}{"key": "k3", "path": "$", "json": map[string]interface{}{"b": []interface{}{"dice", 10, 10.5, true, nil}}}}, | ||
{Command: "JSON.RESP", Body: map[string]interface{}{"key": "k3"}}, | ||
}, | ||
expected: []interface{}{"OK", []interface{}{"{", "b", []interface{}{"[", "dice", float64(10), float64(10.5), true, nil}}}, | ||
}, | ||
} | ||
|
||
for _, tc := range testCases { | ||
t.Run(tc.name, func(t *testing.T) { | ||
for i, cmd := range tc.commands { | ||
result, _ := exec.FireCommand(cmd) | ||
assert.Equal(t, tc.expected[i], result) | ||
} | ||
}) | ||
} | ||
|
||
// Cleanup the used keys | ||
exec.FireCommand(HTTPCommand{Command: "DEL", Body: map[string]interface{}{"keys": []interface{}{"k1", "k2", "k3"}}}) | ||
} |
Oops, something went wrong.