Repository: valkey-io/valkey-json
Pull request #42: Adding all JSON command definition
Author: login: roshkhatri
Created: 2025-03-06T23:19:06Z | Merged: 2025-03-31T21:24:42Z

This will be one of three pr's to add bloom documentation to the Valkey.io website. This pr includes the base information displayed for the commands


Diff:
diff --git a/README.md b/README.md
index 0884c29..b55842c 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # Valkey JSON
 
-Valkey-json is a C++ Valkey-Module that provides native JSON (JavaScript Object Notation) support for Valkey. The implementation complies with RFC7159 and ECMA-404 JSON data interchange standards. Users can natively store, query, and modify JSON data structures using the JSONPath query language. The query expressions support advanced capabilities including wildcard selections, filter expressions, array slices, union operations, and recursive searches.
+Valkey-json is a Valkey module written in C++ that provides native JSON (JavaScript Object Notation) support for Valkey. The implementation complies with RFC7159 and ECMA-404 JSON data interchange standards. Users can natively store, query, and modify JSON data structures using the JSONPath query language. The query expressions support advanced capabilities including wildcard selections, filter expressions, array slices, union operations, and recursive searches.
 
 Valkey-json leverages [RapidJSON](https://rapidjson.org/), a high-performance JSON parser and generator for C++, chosen for its small footprint and exceptional performance and memory efficiency. As a header-only library with no external dependencies, RapidJSON provides robust Unicode support while maintaining a compact memory profile of just 16 bytes per JSON value on most 32/64-bit machines.
 
@@ -109,11 +109,11 @@ JSON.DEL
 JSON.FORGET
 JSON.GET
 JSON.MGET
-JSON.MSET (#16)
+JSON.MSET
 JSON.NUMINCRBY
 JSON.NUMMULTBY
-JSON.OBJLEN
 JSON.OBJKEYS
+JSON.OBJLEN
 JSON.RESP
 JSON.SET
 JSON.STRAPPEND
diff --git a/src/commands/json.arrappend.json b/src/commands/json.arrappend.json
new file mode 100644
index 0000000..c5c4eb2
--- /dev/null
+++ b/src/commands/json.arrappend.json
@@ -0,0 +1,30 @@
+{
+    "JSON.ARRAPPEND": {
+        "summary": "Append one or more values to the array values at the path.",
+        "complexity": "O(N) where N is the number of vaules",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": -4,
+        "acl_categories": [
+            "JSON",
+            "WRITE",
+            "FAST"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string"
+            },
+            {
+                "name": "json",
+                "type": "string",
+                "multiple": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.arrindex.json b/src/commands/json.arrindex.json
new file mode 100644
index 0000000..2cb90e6
--- /dev/null
+++ b/src/commands/json.arrindex.json
@@ -0,0 +1,39 @@
+{
+    "JSON.ARRINDEX": {
+        "summary": "Search for the first occurrence of a scalar JSON value in arrays located at the specified path. Indices out of range are adjusted.",
+        "complexity": "O(N), where N is the length of the array.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 4,
+        "acl_categories": [
+            "READ",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string"
+            },
+            {
+                "name": "json-scalar",
+                "type": "string"
+            },
+            {
+                "name": "start",
+                "type": "integer",
+                "optional": true
+            },
+            {
+                "name": "end",
+                "type": "integer",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.arrinsert.json b/src/commands/json.arrinsert.json
new file mode 100644
index 0000000..efeee3e
--- /dev/null
+++ b/src/commands/json.arrinsert.json
@@ -0,0 +1,34 @@
+{
+    "JSON.ARRINSERT": {
+        "summary": "Insert one or more values into an array at the given path before the specified index.",
+        "complexity": "O(N) where N is the length of the array.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": -5,
+        "acl_categories": [
+            "WRITE",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string"
+            },
+            {
+                "name": "index",
+                "type": "integer"
+            },
+            {
+                "name": "json",
+                "type": "string",
+                "multiple": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.arrlen.json b/src/commands/json.arrlen.json
new file mode 100644
index 0000000..caf70ff
--- /dev/null
+++ b/src/commands/json.arrlen.json
@@ -0,0 +1,26 @@
+{
+    "JSON.ARRLEN": {
+        "summary": "Get length of the array at the path.",
+        "complexity": "O(N) where N is the number of json arrays matched at the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "READ",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.arrpop.json b/src/commands/json.arrpop.json
new file mode 100644
index 0000000..2206109
--- /dev/null
+++ b/src/commands/json.arrpop.json
@@ -0,0 +1,31 @@
+{
+    "JSON.ARRPOP": {
+        "summary": "Remove and returns the element at the given index. Popping an empty array returns null.",
+        "complexity": "O(N) where N is the number of jsons arrays matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "WRITE",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "optional": true
+            },
+            {
+                "name": "index",
+                "type": "integer",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.arrtrim.json b/src/commands/json.arrtrim.json
new file mode 100644
index 0000000..5e54114
--- /dev/null
+++ b/src/commands/json.arrtrim.json
@@ -0,0 +1,33 @@
+{
+    "JSON.ARRTRIM": {
+        "summary": "Trim the array at the path so that it becomes subarray [start, end], both inclusive.",
+        "complexity": "O(N) where N is the number of json arrays matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 5,
+        "acl_categories": [
+            "WRITE",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string"
+            },
+            {
+                "name": "start",
+                "type": "integer"
+            },
+            {
+                "name": "end",
+                "type": "integer"
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.clear.json b/src/commands/json.clear.json
new file mode 100644
index 0000000..3dc2aa8
--- /dev/null
+++ b/src/commands/json.clear.json
@@ -0,0 +1,26 @@
+{
+    "JSON.CLEAR": {
+        "summary": "Clear the arrays or an object at the specified path.",
+        "complexity": "O(N) where N is the number of json arrays/objects matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "WRITE",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.debug.json b/src/commands/json.debug.json
new file mode 100644
index 0000000..a3ddc30
--- /dev/null
+++ b/src/commands/json.debug.json
@@ -0,0 +1,20 @@
+{
+    "JSON.DEBUG": {
+        "summary": "Report information. Supported subcommands are: MEMORY <key> [path] - report memory usage in bytes of a JSON value. DEPTH <key> - report the maximum path depth of the JSON document. FIELDS <key> [path] - report the number of fields at the specified document path. HELP - print help messages of the command.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "READ",
+            "SLOW",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "subcommand & arguments",
+                "type": "string"
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.del.json b/src/commands/json.del.json
new file mode 100644
index 0000000..c103a1b
--- /dev/null
+++ b/src/commands/json.del.json
@@ -0,0 +1,26 @@
+{
+    "JSON.DEL": {
+        "summary": "Delete the JSON values at the specified path in a document key.",
+        "complexity": "O(N) where N is the number of json values matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "WRITE",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.forget.json b/src/commands/json.forget.json
new file mode 100644
index 0000000..2e83451
--- /dev/null
+++ b/src/commands/json.forget.json
@@ -0,0 +1,6 @@
+{
+    "JSON.FORGET": {
+        "summary": "An alias of JSON.DEL.",
+        "group": "json"
+    }
+}
diff --git a/src/commands/json.get.json b/src/commands/json.get.json
new file mode 100644
index 0000000..b513b03
--- /dev/null
+++ b/src/commands/json.get.json
@@ -0,0 +1,37 @@
+{
+    "JSON.GET": {
+        "summary": "Get the serialized JSON at one or multiple paths.",
+        "complexity": "O(N) where N is the number of paths",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "READ",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "INDENT/NEWLINE/SPACE",
+                "type": "string",
+                "optional": true
+            },
+            {
+                "name": "NOESCAPE",
+                "type": "string",
+                "optional": true
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "multiple": true,
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.mget.json b/src/commands/json.mget.json
new file mode 100644
index 0000000..e185f67
--- /dev/null
+++ b/src/commands/json.mget.json
@@ -0,0 +1,26 @@
+{
+    "JSON.MGET": {
+        "summary": "Get serialized JSONs at the path from multiple document keys. Return null for non-existent key or JSON path.",
+        "complexity": "O(N) where N is the number of keys",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": -3,
+        "acl_categories": [
+            "READ",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "multiple": true,
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string"
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.mset.json b/src/commands/json.mset.json
new file mode 100644
index 0000000..4317609
--- /dev/null
+++ b/src/commands/json.mset.json
@@ -0,0 +1,36 @@
+{
+    "JSON.MSET": {
+        "summary": "Set multiple JSON values at the path to multiple keys.",
+        "complexity": "O(N) where N is the number of keys",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": -4,
+        "acl_categories": [
+            "WRITE",
+            "SLOW",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "data",
+                "type": "block",
+                "multiple": true,
+                "arguments": [
+                    {
+                        "name": "key",
+                        "type": "key",
+                        "key_spec_index": 0
+                    },
+                    {
+                        "name": "path",
+                        "type": "string"
+                    },
+                    {
+                        "name": "json",
+                        "type": "string"
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.numincrby.json b/src/commands/json.numincrby.json
new file mode 100644
index 0000000..1887f36
--- /dev/null
+++ b/src/commands/json.numincrby.json
@@ -0,0 +1,29 @@
+{
+    "JSON.NUMINCRBY": {
+        "summary": "Increment the number values at the path by a given number.",
+        "complexity": "O(N) where N is the number of json values matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 4,
+        "acl_categories": [
+            "WRITE",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string"
+            },
+            {
+                "name": "number",
+                "type": "integer"
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.nummultby.json b/src/commands/json.nummultby.json
new file mode 100644
index 0000000..70adad8
--- /dev/null
+++ b/src/commands/json.nummultby.json
@@ -0,0 +1,29 @@
+{
+    "JSON.NUMMULTBY": {
+        "summary": "Multiply the numeric values at the path by a given number.",
+        "complexity": "O(N) where N is the number of json values matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 4,
+        "acl_categories": [
+            "WRITE",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string"
+            },
+            {
+                "name": "number",
+                "type": "integer"
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.objkeys.json b/src/commands/json.objkeys.json
new file mode 100644
index 0000000..f8221bf
--- /dev/null
+++ b/src/commands/json.objkeys.json
@@ -0,0 +1,26 @@
+{
+    "JSON.OBJKEYS": {
+        "summary": "Retrieve the key names from the objects at the specified path.",
+        "complexity": "O(N) where N is the number of json objects matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "READ",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.objlen.json b/src/commands/json.objlen.json
new file mode 100644
index 0000000..a375244
--- /dev/null
+++ b/src/commands/json.objlen.json
@@ -0,0 +1,26 @@
+{
+    "JSON.OBJLEN": {
+        "summary": "Get the number of keys in the object at the specified path.",
+        "complexity": "O(N) where N is the number of json objects matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "READ",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.resp.json b/src/commands/json.resp.json
new file mode 100644
index 0000000..bb929aa
--- /dev/null
+++ b/src/commands/json.resp.json
@@ -0,0 +1,26 @@
+{
+    "JSON.RESP": {
+        "summary": "Return the JSON value at the given path in Redis Serialization Protocol (RESP).",
+        "complexity": "O(N) where N is the number of json values matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "READ",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.set.json b/src/commands/json.set.json
new file mode 100644
index 0000000..e29689d
--- /dev/null
+++ b/src/commands/json.set.json
@@ -0,0 +1,34 @@
+{
+    "JSON.SET": {
+        "summary": "Set JSON values at the specified path.",
+        "complexity": "O(N) where N is the number of json values matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 4,
+        "acl_categories": [
+            "WRITE",
+            "SLOW",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string"
+            },
+            {
+                "name": "json",
+                "type": "string"
+            },
+            {
+                "name": "options",
+                "type": "string",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.strappend.json b/src/commands/json.strappend.json
new file mode 100644
index 0000000..afec34e
--- /dev/null
+++ b/src/commands/json.strappend.json
@@ -0,0 +1,30 @@
+{
+    "JSON.STRAPPEND": {
+        "summary": "Append a string to the JSON strings at the specified path.",
+        "complexity": "O(N) where N is the number of string values matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 3,
+        "acl_categories": [
+            "WRITE",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "optional": true
+            },
+            {
+                "name": "json_string",
+                "type": "string"
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.strlen.json b/src/commands/json.strlen.json
new file mode 100644
index 0000000..88d0cd1
--- /dev/null
+++ b/src/commands/json.strlen.json
@@ -0,0 +1,26 @@
+{
+    "JSON.STRLEN": {
+        "summary": "Get the length of the JSON string values at the specified path.",
+        "complexity": "O(N) where N is the number of string values matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "READ",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.toggle.json b/src/commands/json.toggle.json
new file mode 100644
index 0000000..4d30ddf
--- /dev/null
+++ b/src/commands/json.toggle.json
@@ -0,0 +1,26 @@
+{
+    "JSON.TOGGLE": {
+        "summary": "Toggle boolean values between true and false at the specified path.",
+        "complexity": "O(N) where N is the number of json boolean values matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "WRITE",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/src/commands/json.type.json b/src/commands/json.type.json
new file mode 100644
index 0000000..d52eeba
--- /dev/null
+++ b/src/commands/json.type.json
@@ -0,0 +1,26 @@
+{
+    "JSON.TYPE": {
+        "summary": "Report the type of the values at the given path.",
+        "complexity": "O(N) where N is the number of json values matched by the path.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 2,
+        "acl_categories": [
+            "READ",
+            "FAST",
+            "JSON"
+        ],
+        "arguments": [
+            {
+                "name": "key",
+                "type": "key",
+                "key_spec_index": 0
+            },
+            {
+                "name": "path",
+                "type": "string",
+                "optional": true
+            }
+        ]
+    }
+}
\ No newline at end of file


Reviews:
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:30:42Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:35:05Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:40:19Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:41:31Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:44:55Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:46:17Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:47:10Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:47:47Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:48:13Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:49:21Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:49:48Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:52:00Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:52:47Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-07T15:53:26Z
user: login: roshkhatri
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T20:19:17Z
user: login: roshkhatri
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T20:23:06Z
user: login: roshkhatri
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T20:29:21Z
user: login: roshkhatri
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T20:31:19Z
user: login: roshkhatri
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T20:33:21Z
user: login: roshkhatri
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T20:45:18Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-28T20:50:19Z
user: login: hpatro
body: I don't remember us putting `\n` in summary of valkey core json command documentation. Could you check and update the statements.
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-28T21:13:59Z
user: login: roshkhatri
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-28T23:59:41Z
user: login: joehu21
body: LGTM
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-29T22:38:54Z
user: login: hpatro
body: Overall LGTM. Would let the module owners verify the time complexity / arity. 
state: APPROVED
author_association: NONE
submitted_at: 2025-03-30T16:52:39Z
user: login: hpatro
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-31T18:16:05Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-31T18:43:29Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-31T18:44:00Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-31T18:44:30Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-31T18:44:57Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-31T18:45:22Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-31T18:45:55Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-31T18:46:19Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-31T18:46:36Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-31T18:46:54Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-31T18:47:17Z
user: login: joehu21
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-31T18:47:29Z
user: login: hpatro
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-31T20:40:43Z
user: login: roshkhatri
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-31T20:45:30Z
user: login: roshkhatri
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-31T21:20:56Z

Review comments:
diff_hunk: @@ -0,0 +1,30 @@
+{
+    "JSON.ARRAPPEND": {
+        "summary": "Append one or more values to the array values at the path.",
+        "complexity": "O(N)",
path: src/commands/json.arrappend.json
user: login: joehu21
body: Why O(N) instead of O(1)?
created_at: 2025-03-07T15:30:42Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,30 @@
+{
+    "JSON.ARRAPPEND": {
+        "summary": "Append one or more values to the array values at the path.",
+        "complexity": "O(N)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": -3,
path: src/commands/json.arrappend.json
user: login: joehu21
body: Why is arity -3 instead of -4?
created_at: 2025-03-07T15:35:05Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,39 @@
+{
+    "JSON.ARRINDEX": {
+        "summary": "Search for the first occurrence of a scalar JSON value in the arrays at the path.\n\n* Out of range errors are treated by rounding the index to the array's start and end.\n* If start > end, return -1 (not found).",
+        "complexity": "O(N)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 3,
path: src/commands/json.arrindex.json
user: login: joehu21
body: Why arity 3 instead of -4?
created_at: 2025-03-07T15:40:19Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,34 @@
+{
+    "JSON.ARRINSERT": {
+        "summary": "Insert one or more values into the array values at path before the index.\n\n* Inserting at index 0 prepends to the array.\n* A negative index values is interpreted as starting from the end.\n* The index must be in the array's boundary.",
+        "complexity": "O(M*N) where M is the number of values in an array and N is the number of array where the value needs to be inserted.",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": -4,
path: src/commands/json.arrinsert.json
user: login: joehu21
body: why arity -4 instead of -5?
created_at: 2025-03-07T15:41:31Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,34 @@
+{
+    "JSON.ARRINSERT": {
+        "summary": "Insert one or more values into the array values at path before the index.\n\n* Inserting at index 0 prepends to the array.\n* A negative index values is interpreted as starting from the end.\n* The index must be in the array's boundary.",
+        "complexity": "O(M*N) where M is the number of values in an array and N is the number of array where the value needs to be inserted.",
path: src/commands/json.arrinsert.json
user: login: joehu21
body: Correction: O(N), where N is the length of the array.
created_at: 2025-03-07T15:44:55Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,39 @@
+{
+    "JSON.ARRINDEX": {
+        "summary": "Search for the first occurrence of a scalar JSON value in the arrays at the path.\n\n* Out of range errors are treated by rounding the index to the array's start and end.\n* If start > end, return -1 (not found).",
+        "complexity": "O(N)",
path: src/commands/json.arrindex.json
user: login: joehu21
body: O(N), where N is the length of the array.
created_at: 2025-03-07T15:46:17Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.ARRLEN": {
+        "summary": "Get length of the array values at the path.",
+        "complexity": "O(N) where N is the number of arrays in the JSON document ",
path: src/commands/json.arrlen.json
user: login: joehu21
body: O(1)
created_at: 2025-03-07T15:47:10Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.ARRLEN": {
+        "summary": "Get length of the array values at the path.",
path: src/commands/json.arrlen.json
user: login: joehu21
body: Get length of the array at the path.
created_at: 2025-03-07T15:47:47Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.ARRLEN": {
+        "summary": "Get length of the array values at the path.",
+        "complexity": "O(N) where N is the number of arrays in the JSON document ",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
path: src/commands/json.arrlen.json
user: login: joehu21
body: Why is arity 1 instead of -2?
created_at: 2025-03-07T15:48:13Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,31 @@
+{
+    "JSON.ARRPOP": {
+        "summary": "Remove and return element at the index from the array. Popping an empty array returns null.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
+        "acl_categories": [
+            "READ",
+            "SLOW",
path: src/commands/json.arrpop.json
user: login: joehu21
body: why slow? it should be fast.
created_at: 2025-03-07T15:49:21Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,31 @@
+{
+    "JSON.ARRPOP": {
+        "summary": "Remove and return element at the index from the array. Popping an empty array returns null.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
path: src/commands/json.arrpop.json
user: login: joehu21
body: arity -2?
created_at: 2025-03-07T15:49:47Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.CLEAR": {
+        "summary": "Clear the arrays or an objects at the path.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
path: src/commands/json.clear.json
user: login: joehu21
body: -2?
created_at: 2025-03-07T15:52:00Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,20 @@
+{
+    "JSON.DEBUG": {
+        "summary": "Report information. Supported subcommands are:\n\n* MEMORY <key> [path] - report memory usage in bytes of a JSON value. Path defaults to the root if not provided.\n* DEPTH <key> - report the maximum path depth of the JSON document.\n* FIELDS <key> [path] - report the number of fields at the specified document path. Path defaults to the root if not provided.\n  Each non-container JSON value counts as one field. Objects and arrays recursively count one field for each of their\n  containing JSON values. Each container value, except the root container, counts as one additional field.\n* HELP - print help messages of the command.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
path: src/commands/json.debug.json
user: login: joehu21
body: arity should be -2
created_at: 2025-03-07T15:52:47Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.DEL": {
+        "summary": "Delete the JSON values at the path in a document key. If the path is the root path, it is equivalent to deleting\nthe key from Valkey.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
path: src/commands/json.del.json
user: login: joehu21
body: arity should be -2
created_at: 2025-03-07T15:53:26Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,30 @@
+{
+    "JSON.ARRAPPEND": {
+        "summary": "Append one or more values to the array values at the path.",
+        "complexity": "O(N)",
path: src/commands/json.arrappend.json
user: login: roshkhatri
body: Where N is the number of values?

created_at: 2025-03-28T20:19:16Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,39 @@
+{
+    "JSON.ARRINDEX": {
+        "summary": "Search for the first occurrence of a scalar JSON value in the arrays at the path.\n\n* Out of range errors are treated by rounding the index to the array's start and end.\n* If start > end, return -1 (not found).",
+        "complexity": "O(N)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 3,
path: src/commands/json.arrindex.json
user: login: roshkhatri
body: I think it should be 4 as there are no multiple
created_at: 2025-03-28T20:23:06Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.ARRLEN": {
+        "summary": "Get length of the array values at the path.",
+        "complexity": "O(N) where N is the number of arrays in the JSON document ",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
path: src/commands/json.arrlen.json
user: login: roshkhatri
body: It will be 2 as no multiple
created_at: 2025-03-28T20:29:21Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,31 @@
+{
+    "JSON.ARRPOP": {
+        "summary": "Remove and return element at the index from the array. Popping an empty array returns null.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
+        "acl_categories": [
+            "READ",
+            "SLOW",
path: src/commands/json.arrpop.json
user: login: roshkhatri
body: Should it also be WRITE,FAST,JSON
![Screenshot 2025-03-28 at 1 31 09 PM](https://github.com/user-attachments/assets/9be57a35-a9b4-42a0-b12b-ff584af28717)

created_at: 2025-03-28T20:31:19Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,31 @@
+{
+    "JSON.ARRPOP": {
+        "summary": "Remove and return element at the index from the array. Popping an empty array returns null.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
path: src/commands/json.arrpop.json
user: login: roshkhatri
body: 2 as no multiple
created_at: 2025-03-28T20:33:21Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,33 @@
+{
+    "JSON.ARRTRIM": {
+        "summary": "Trim arrays at the path so that it becomes subarray [start, end], both inclusive.\n\n* If the array is empty, do nothing, return 0.\n* If start < 0, treat it as 0.\n* If end >= size (size of the array), treat it as size-1.\n* If start >= size or start > end, empty the array and return 0.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 4,
path: src/commands/json.arrtrim.json
user: login: roshkhatri
body: This will be 5
created_at: 2025-03-28T20:34:42Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.CLEAR": {
+        "summary": "Clear the arrays or an objects at the path.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
path: src/commands/json.clear.json
user: login: roshkhatri
body: 2 as no multiple
created_at: 2025-03-28T20:35:50Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,20 @@
+{
+    "JSON.DEBUG": {
+        "summary": "Report information. Supported subcommands are:\n\n* MEMORY <key> [path] - report memory usage in bytes of a JSON value. Path defaults to the root if not provided.\n* DEPTH <key> - report the maximum path depth of the JSON document.\n* FIELDS <key> [path] - report the number of fields at the specified document path. Path defaults to the root if not provided.\n  Each non-container JSON value counts as one field. Objects and arrays recursively count one field for each of their\n  containing JSON values. Each container value, except the root container, counts as one additional field.\n* HELP - print help messages of the command.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
path: src/commands/json.debug.json
user: login: roshkhatri
body: 2 as no multiple
created_at: 2025-03-28T20:36:22Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.DEL": {
+        "summary": "Delete the JSON values at the path in a document key. If the path is the root path, it is equivalent to deleting\nthe key from Valkey.",
+        "complexity": "O(1)",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
path: src/commands/json.del.json
user: login: roshkhatri
body: 2 as no multiple
created_at: 2025-03-28T20:37:11Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,37 @@
+{
+    "JSON.GET": {
+        "summary": "Get the serialized JSON at one or multiple paths.",
+        "complexity": "O(N) where N is the number of paths",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": 1,
path: src/commands/json.get.json
user: login: roshkhatri
body: 2
created_at: 2025-03-28T20:37:47Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.MGET": {
+        "summary": "Get serialized JSONs at the path from multiple document keys. Return null for non-existent key or JSON path.",
+        "complexity": "O(N) where N is the number of keys",
+        "group": "json",
+        "module_since": "1.0.0",
+        "arity": -2,
path: src/commands/json.mget.json
user: login: roshkhatri
body: -3
created_at: 2025-03-28T20:39:04Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,30 @@
+{
+    "JSON.ARRAPPEND": {
+        "summary": "Append one or more values to the array values at the path.",
+        "complexity": "O(N)",
path: src/commands/json.arrappend.json
user: login: joehu21
body: It should be O(1) for appending one value.
created_at: 2025-03-28T20:50:19Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,39 @@
+{
+    "JSON.ARRINDEX": {
+        "summary": "Search for the first occurrence of a scalar JSON value in the arrays at the path.\n\n* Out of range errors are treated by rounding the index to the array's start and end.\n* If start > end, return -1 (not found).",
path: src/commands/json.arrindex.json
user: login: hpatro
body: Why do we add the new lines (\n\n) here in the summary for all the commands ?
created_at: 2025-03-28T21:09:43Z
author_association: NONE
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.DEL": {
+        "summary": "Delete the JSON values at the path in a document key. If the path is the root path, it is equivalent to deleting\nthe key from Valkey.",
path: src/commands/json.del.json
user: login: hpatro
body: ```suggestion
        "summary": "Delete the JSON values at the path in a document key. If the path is the root path, it is equivalent to deleting the key from Valkey.",
```
created_at: 2025-03-28T21:12:41Z
author_association: NONE
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.DEL": {
+        "summary": "Delete the JSON values at the path in a document key. If the path is the root path, it is equivalent to deleting\nthe key from Valkey.",
path: src/commands/json.del.json
user: login: roshkhatri
body: I will we will have to trim these description for being summaries and add the description on the valkey-doc side

created_at: 2025-03-28T23:59:41Z
author_association: MEMBER
diff_hunk: @@ -107,8 +107,8 @@ JSON.MGET
 JSON.MSET (#16)
path: README.md
user: login: hpatro
body: Could we cleanup the PR/issue number from this ? Seems odd.
created_at: 2025-03-30T16:49:20Z
author_association: NONE
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.RESP": {
+        "summary": "Return the JSON value at the given path in Valkey Serialization Protocol (RESP).",
path: src/commands/json.resp.json
user: login: hpatro
body: I think it's ok to mention Redis Serialization Protocol. 

Valkey Serialization Protocol followed by RESP in bracket is confusing.
created_at: 2025-03-30T16:51:41Z
author_association: NONE
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.RESP": {
+        "summary": "Return the JSON value at the given path in Valkey Serialization Protocol (RESP).",
path: src/commands/json.resp.json
user: login: hpatro
body: @madolson any thoughts.
created_at: 2025-03-30T16:51:56Z
author_association: NONE
diff_hunk: @@ -1,8 +1,8 @@
-# ValkeyJSON
+# Valkey JSON
 
-ValkeyJSON is a C++ Valkey-Module that provides native JSON (JavaScript Object Notation) support for Valkey. The implementation complies with RFC7159 and ECMA-404 JSON data interchange standards. Users can natively store, query, and modify JSON data structures using the JSONPath query language. The query expressions support advanced capabilities including wildcard selections, filter expressions, array slices, union operations, and recursive searches.
+Valkey-json is a C++ Valkey-Module that provides native JSON (JavaScript Object Notation) support for Valkey. The implementation complies with RFC7159 and ECMA-404 JSON data interchange standards. Users can natively store, query, and modify JSON data structures using the JSONPath query language. The query expressions support advanced capabilities including wildcard selections, filter expressions, array slices, union operations, and recursive searches.
path: README.md
user: login: hpatro
body: ```suggestion
valkey-json is a Valkey module written in C++ that provides native JSON (JavaScript Object Notation) support for Valkey. The implementation complies with RFC7159 and ECMA-404 JSON data interchange standards. Users can natively store, query, and modify JSON data structures using the JSONPath query language. The query expressions support advanced capabilities including wildcard selections, filter expressions, array slices, union operations, and recursive searches.
```
created_at: 2025-03-31T18:14:31Z
author_association: NONE
diff_hunk: @@ -1,8 +1,8 @@
-# ValkeyJSON
+# Valkey JSON
 
-ValkeyJSON is a C++ Valkey-Module that provides native JSON (JavaScript Object Notation) support for Valkey. The implementation complies with RFC7159 and ECMA-404 JSON data interchange standards. Users can natively store, query, and modify JSON data structures using the JSONPath query language. The query expressions support advanced capabilities including wildcard selections, filter expressions, array slices, union operations, and recursive searches.
+Valkey-json is a C++ Valkey-Module that provides native JSON (JavaScript Object Notation) support for Valkey. The implementation complies with RFC7159 and ECMA-404 JSON data interchange standards. Users can natively store, query, and modify JSON data structures using the JSONPath query language. The query expressions support advanced capabilities including wildcard selections, filter expressions, array slices, union operations, and recursive searches.
 
-ValkeyJSON leverages [RapidJSON](https://rapidjson.org/), a high-performance JSON parser and generator for C++, chosen for its small footprint and exceptional performance and memory efficiency. As a header-only library with no external dependencies, RapidJSON provides robust Unicode support while maintaining a compact memory profile of just 16 bytes per JSON value on most 32/64-bit machines.
+Valkey-json leverages [RapidJSON](https://rapidjson.org/), a high-performance JSON parser and generator for C++, chosen for its small footprint and exceptional performance and memory efficiency. As a header-only library with no external dependencies, RapidJSON provides robust Unicode support while maintaining a compact memory profile of just 16 bytes per JSON value on most 32/64-bit machines.
path: README.md
user: login: hpatro
body: ```suggestion
valkey-json leverages [RapidJSON](https://rapidjson.org/), a high-performance JSON parser and generator for C++, chosen for its small footprint and exceptional performance and memory efficiency. As a header-only library with no external dependencies, RapidJSON provides robust Unicode support while maintaining a compact memory profile of just 16 bytes per JSON value on most 32/64-bit machines.
```
created_at: 2025-03-31T18:15:01Z
author_association: NONE
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.DEL": {
+        "summary": "Delete the JSON values at the specified path in a document key.",
+        "complexity": "O(1)",
path: src/commands/json.del.json
user: login: joehu21
body: O(N) where N is the number of json values matched by the path.
created_at: 2025-03-31T18:43:29Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.CLEAR": {
+        "summary": "Clear the arrays or an object at the specified path.",
+        "complexity": "O(1)",
path: src/commands/json.clear.json
user: login: joehu21
body: O(N) where N is the number of json arrays/objects matched by the path.
created_at: 2025-03-31T18:44:00Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,33 @@
+{
+    "JSON.ARRTRIM": {
+        "summary": "Trim the array at the path so that it becomes subarray [start, end], both inclusive.",
+        "complexity": "O(1)",
path: src/commands/json.arrtrim.json
user: login: joehu21
body: O(N) where N is the number of json arrays matched by the path.
created_at: 2025-03-31T18:44:30Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,31 @@
+{
+    "JSON.ARRPOP": {
+        "summary": "Remove and returns the element at the given index. Popping an empty array returns null.",
+        "complexity": "O(1)",
path: src/commands/json.arrpop.json
user: login: joehu21
body: O(N) where N is the number of json arrays matched by the path.
created_at: 2025-03-31T18:44:57Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.ARRLEN": {
+        "summary": "Get length of the array at the path.",
+        "complexity": "0(1) ",
path: src/commands/json.arrlen.json
user: login: joehu21
body: O(N) where N is the number of json arrays matched by the path.
created_at: 2025-03-31T18:45:22Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.TYPE": {
+        "summary": "Report the type of the values at the given path.",
+        "complexity": "O(N) where N is the number of json objects matched by the path.",
path: src/commands/json.type.json
user: login: joehu21
body: O(N) where N is the number of json values matched by the path.
created_at: 2025-03-31T18:45:55Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.TOGGLE": {
+        "summary": "Toggle boolean values between true and false at the specified path.",
+        "complexity": "O(N) where N is the number of json objects matched by the path.",
path: src/commands/json.toggle.json
user: login: joehu21
body: O(N) where N is the number of json boolean values matched by the path.
created_at: 2025-03-31T18:46:19Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.STRLEN": {
+        "summary": "Get the length of the JSON string values at the specified path.",
+        "complexity": "O(N) where N is the number of json objects matched by the path.",
path: src/commands/json.strlen.json
user: login: joehu21
body: O(N) where N is the number of string values matched by the path.
created_at: 2025-03-31T18:46:36Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,30 @@
+{
+    "JSON.STRAPPEND": {
+        "summary": "Append a string to the JSON strings at the specified path.",
+        "complexity": "O(N) where N is the number of json objects matched by the path.",
path: src/commands/json.strappend.json
user: login: joehu21
body: O(N) where N is the number of string values matched by the path.
created_at: 2025-03-31T18:46:54Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,34 @@
+{
+    "JSON.SET": {
+        "summary": "Set JSON values at the specified path.",
+        "complexity": "O(1)",
path: src/commands/json.set.json
user: login: joehu21
body: O(N) where N is the number of json values matched by the path.
created_at: 2025-03-31T18:47:17Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.RESP": {
+        "summary": "Return the JSON value at the given path in Redis Serialization Protocol (RESP).",
+        "complexity": "O(N) where N is the number of json objects matched by the path.",
path: src/commands/json.resp.json
user: login: joehu21
body: O(N) where N is the number of json values matched by the path.
created_at: 2025-03-31T18:47:29Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,26 @@
+{
+    "JSON.ARRLEN": {
+        "summary": "Get length of the array at the path.",
+        "complexity": "0(N) where N is the number of json arrays matched at the path.",
path: src/commands/json.arrlen.json
user: login: hpatro
body: ```suggestion
        "complexity": "O(N) where N is the number of json arrays matched at the path.",
```
created_at: 2025-03-31T20:40:14Z
author_association: NONE
diff_hunk: @@ -0,0 +1,39 @@
+{
+    "JSON.ARRINDEX": {
+        "summary": "Search for the first occurrence of a scalar JSON value in the arrays at the path.\n\n* Out of range errors are treated by rounding the index to the array's start and end.\n* If start > end, return -1 (not found).",
path: src/commands/json.arrindex.json
user: login: roshkhatri
body: We removed this from here and updated a compact description
created_at: 2025-03-31T20:45:30Z
author_association: MEMBER
diff_hunk: @@ -1,8 +1,8 @@
-# ValkeyJSON
+# Valkey JSON
 
-ValkeyJSON is a C++ Valkey-Module that provides native JSON (JavaScript Object Notation) support for Valkey. The implementation complies with RFC7159 and ECMA-404 JSON data interchange standards. Users can natively store, query, and modify JSON data structures using the JSONPath query language. The query expressions support advanced capabilities including wildcard selections, filter expressions, array slices, union operations, and recursive searches.
+Valkey-json is a C++ Valkey-Module that provides native JSON (JavaScript Object Notation) support for Valkey. The implementation complies with RFC7159 and ECMA-404 JSON data interchange standards. Users can natively store, query, and modify JSON data structures using the JSONPath query language. The query expressions support advanced capabilities including wildcard selections, filter expressions, array slices, union operations, and recursive searches.
 
-ValkeyJSON leverages [RapidJSON](https://rapidjson.org/), a high-performance JSON parser and generator for C++, chosen for its small footprint and exceptional performance and memory efficiency. As a header-only library with no external dependencies, RapidJSON provides robust Unicode support while maintaining a compact memory profile of just 16 bytes per JSON value on most 32/64-bit machines.
+Valkey-json leverages [RapidJSON](https://rapidjson.org/), a high-performance JSON parser and generator for C++, chosen for its small footprint and exceptional performance and memory efficiency. As a header-only library with no external dependencies, RapidJSON provides robust Unicode support while maintaining a compact memory profile of just 16 bytes per JSON value on most 32/64-bit machines.
path: README.md
user: login: roshkhatri
body: lower case?
I think we can keep it Valkey-json
created_at: 2025-03-31T21:20:56Z
author_association: MEMBER

PR comments:
user: login: hpatro
created_at: 2025-03-31T18:06:35Z
body: I would prefer the PR title to be "Adding all JSON command definition"
author_association: NONE
user: login: hpatro
created_at: 2025-03-31T18:16:55Z
body: @joehu21 / @roshkhatri Shall we merge this in ?
author_association: NONE
user: login: joehu21
created_at: 2025-03-31T18:49:56Z
body: > @joehu21 / @roshkhatri Shall we merge this in ?

I see the "complexity" description is not consistent across all commands. Posted comments. The rest looks good.
author_association: COLLABORATOR