Skip to content

Commit 1ad54e7

Browse files
docs: expand JMESPath documentation and add presentation slides (#497)
Presentation: - Add 3 new JMESPath slides showing filtering, pipelines, and extended functions - Show real command examples with sample output Documentation: - Expand jmespath-queries.md with all new 0.6 function categories - Add examples for format_bytes, format_duration, time_ago, is_private_ip, etc. - Add pipeline examples showing chained operations - Add function categories reference table - Add syntax reference table
1 parent 2f21596 commit 1ad54e7

File tree

2 files changed

+228
-46
lines changed

2 files changed

+228
-46
lines changed

docs/src/common-features/jmespath-queries.md

Lines changed: 188 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# JMESPath Queries
22

3-
Filter and transform output using JMESPath expressions with the `-q` or `--query` flag.
3+
Filter and transform output using JMESPath expressions with the `-q` or `--query` flag. redisctl includes 300+ extended functions beyond standard JMESPath.
44

55
## Basic Usage
66

@@ -12,7 +12,7 @@ redisctl enterprise cluster get -q 'name'
1212
redisctl cloud database get 123:456 -q 'security.ssl_client_authentication'
1313

1414
# Get multiple fields
15-
redisctl enterprise database get 1:-q '{name: name, memory: memory_size, port: port}'
15+
redisctl enterprise database get 1 -q '{name: name, memory: memory_size, port: port}'
1616
```
1717

1818
## Array Operations
@@ -54,6 +54,20 @@ redisctl cloud subscription list -q "reverse(sort_by(@, &id))"
5454
redisctl enterprise database list -q '[:5]'
5555
```
5656

57+
## Pipelines
58+
59+
Chain operations together with `|` for complex transformations:
60+
61+
```bash
62+
# Filter -> Sort -> Take top 3 -> Reshape
63+
redisctl enterprise database list -q '
64+
[?status==`active`]
65+
| sort_by(@, &memory_size)
66+
| reverse(@)
67+
| [:3]
68+
| [*].{name: name, memory_gb: to_string(memory_size / `1073741824`)}'
69+
```
70+
5771
## Common Patterns
5872

5973
### Extract Single Value
@@ -88,30 +102,82 @@ redisctl cloud subscription list -q 'length(@) == `0`'
88102

89103
## Extended Functions
90104

91-
redisctl includes 150+ extended JMESPath functions beyond the standard built-ins.
105+
redisctl includes 300+ extended JMESPath functions. Here are the most useful categories:
92106

93107
### String Functions
94108

95109
```bash
96-
# Uppercase/lowercase
97-
redisctl enterprise database list -q '[].{name: name, status: upper(status)}'
110+
# Case conversion
111+
redisctl enterprise database list -q '[].{name: upper(name)}'
98112

99113
# String manipulation
100114
redisctl enterprise cluster get -q 'split(name, `-`)'
101115
redisctl enterprise database list -q '[].{name: trim(name)}'
116+
117+
# Case transformations
118+
redisctl api cloud get /subscriptions -q '[].{id: id, name: snake_case(name)}'
102119
```
103120

104-
### Type Functions
121+
### Formatting Functions
105122

106123
```bash
107-
# Type checking
108-
redisctl enterprise database get 1 -q '{name: name, type: type_of(memory_size)}'
124+
# Format bytes (human readable)
125+
redisctl enterprise database list -q '[].{name: name, memory: format_bytes(memory_size)}'
126+
# Output: [{"name": "cache", "memory": "1.00 GB"}]
109127

110-
# Default values for missing fields
111-
redisctl cloud database get 123:456 -q '{name: name, region: default(region, `"unknown"`)}'
128+
# Format duration
129+
redisctl enterprise database list -q '[].{name: name, uptime: format_duration(uptime_seconds)}'
130+
# Output: [{"name": "cache", "uptime": "2d 5h 30m"}]
112131

113-
# Check if empty
114-
redisctl enterprise database get 1 -q '{name: name, has_endpoints: not(is_empty(endpoints))}'
132+
# Parse bytes
133+
redisctl api cloud get /subscriptions -q '[].{name: name, bytes: parse_bytes(memory_limit)}'
134+
```
135+
136+
### Date/Time Functions
137+
138+
```bash
139+
# Human-readable relative time
140+
redisctl cloud task list -q '[].{id: id, created: time_ago(created_time)}'
141+
# Output: [{"id": "task-123", "created": "2 hours ago"}]
142+
143+
# Format timestamps
144+
redisctl cloud subscription list -q '[].{name: name, created: format_date(createdAt, `"%Y-%m-%d"`)}'
145+
146+
# Current timestamp
147+
redisctl enterprise cluster get -q '{name: name, checked_at: now()}'
148+
149+
# Check if weekend/weekday
150+
redisctl cloud task list -q '[?is_weekday(created_timestamp)]'
151+
152+
# Time calculations
153+
redisctl enterprise database list -q '[].{name: name, age_days: date_diff(now(), created_at, `"days"`)}'
154+
```
155+
156+
### Duration Functions
157+
158+
```bash
159+
# Convert seconds to human format
160+
redisctl enterprise database list -q '[].{name: name, uptime: format_duration(uptime_seconds)}'
161+
162+
# Parse duration strings
163+
redisctl api enterprise get /v1/cluster -q '{timeout: parse_duration(`"1h30m"`)}'
164+
# Output: {"timeout": 5400}
165+
```
166+
167+
### Network Functions
168+
169+
```bash
170+
# Check if IP is private
171+
redisctl enterprise node list -q '[?is_private_ip(addr)].addr'
172+
173+
# Check CIDR containment
174+
redisctl enterprise node list -q '[?cidr_contains(`"10.0.0.0/8"`, addr)]'
175+
176+
# Get network info
177+
redisctl api enterprise get /v1/cluster -q '{
178+
network: cidr_network(deployment_cidr),
179+
broadcast: cidr_broadcast(deployment_cidr)
180+
}'
115181
```
116182

117183
### Math Functions
@@ -122,6 +188,39 @@ redisctl enterprise database list -q '[].{name: name, memory_gb: round(memory_si
122188

123189
# Min/max
124190
redisctl enterprise database list -q 'max_by(@, &memory_size).name'
191+
192+
# Statistics
193+
redisctl enterprise database list -q '{
194+
total: sum([].memory_size),
195+
avg: avg([].memory_size),
196+
count: length(@)
197+
}'
198+
```
199+
200+
### Semver Functions
201+
202+
```bash
203+
# Compare versions
204+
redisctl enterprise cluster get -q '{
205+
version: version,
206+
needs_upgrade: semver_compare(version, `"7.4.0"`) < `0`
207+
}'
208+
209+
# Check version constraints
210+
redisctl enterprise node list -q '[?semver_satisfies(redis_version, `">=7.0.0"`)]'
211+
```
212+
213+
### Type Functions
214+
215+
```bash
216+
# Type checking
217+
redisctl enterprise database get 1 -q '{name: name, type: type_of(memory_size)}'
218+
219+
# Default values for missing fields
220+
redisctl cloud database get 123:456 -q '{name: name, region: default(region, `"unknown"`)}'
221+
222+
# Check if empty
223+
redisctl enterprise database get 1 -q '{name: name, has_endpoints: not(is_empty(endpoints))}'
125224
```
126225

127226
### Utility Functions
@@ -137,45 +236,98 @@ redisctl cloud database get 123:456 -q '{region: coalesce(region, cloud_region,
137236
redisctl enterprise database list -q 'unique([].status)'
138237
```
139238

140-
### Date/Time Functions
239+
### Validation Functions
141240

142241
```bash
143-
# Current timestamp
144-
redisctl enterprise cluster get -q '{name: name, checked_at: now()}'
242+
# Validate formats
243+
redisctl enterprise database list -q '[].{
244+
name: name,
245+
valid_endpoint: is_ipv4(endpoints[0].addr),
246+
valid_uuid: is_uuid(database_id)
247+
}'
145248

146-
# Format dates
147-
redisctl cloud subscription list -q '[].{name: name, created: format_date(createdAt, `"%Y-%m-%d"`)}'
249+
# Email validation
250+
redisctl api cloud get /users -q '[?is_email(email)].email'
148251
```
149252

150-
### Validation Functions
253+
### Encoding Functions
151254

152255
```bash
153-
# Validate IPs
154-
redisctl enterprise database list -q '[].{name: name, valid_endpoint: is_ipv4(endpoints[0].addr)}'
256+
# Base64 encode/decode
257+
redisctl enterprise cluster get -q '{encoded: base64_encode(name)}'
258+
redisctl api enterprise get /v1/cluster -q '{decoded: base64_decode(encoded_field)}'
259+
260+
# URL encode/decode
261+
redisctl api cloud get /subscriptions -q '[].{safe_name: url_encode(name)}'
155262
```
156263

157-
### Encoding Functions
264+
### Hash Functions
158265

159266
```bash
160-
# Base64 decode
161-
redisctl enterprise cluster get -q '{decoded: base64_decode(encoded_field)}'
267+
# Generate hashes
268+
redisctl enterprise database list -q '[].{name: name, hash: sha256(name)}'
269+
redisctl api cloud get /subscriptions -q '[].{id: id, checksum: md5(to_string(@))}'
162270
```
163271

164-
For a complete list of extended functions, see the
165-
[jmespath-extensions documentation](https://github.com/joshrotenberg/jmespath-extensions).
272+
### JSON Patch Functions
273+
274+
```bash
275+
# Compare two configs
276+
redisctl enterprise database get 1 -q 'json_diff(current_config, desired_config)'
277+
278+
# Apply patches
279+
redisctl api enterprise get /v1/bdbs/1 -q 'json_patch(@, `[{"op": "add", "path": "/tags", "value": ["prod"]}]`)'
280+
```
166281

167-
## JMESPath Reference
282+
### Fuzzy Matching
283+
284+
```bash
285+
# Levenshtein distance
286+
redisctl enterprise database list -q '[?levenshtein(name, `"cache"`) < `3`]'
287+
288+
# Phonetic matching
289+
redisctl api cloud get /users -q '[?sounds_like(name, `"Smith"`)]'
290+
```
168291

169-
- Strings: `'value'` (single quotes)
170-
- Numbers: `` `123` `` (backticks)
171-
- Booleans: `` `true` ``, `` `false` ``
172-
- Current element: `@`
173-
- Child: `.field`
174-
- Index: `[0]`
175-
- Slice: `[0:5]`
176-
- Filter: `[?condition]`
177-
- Multi-select: `{key1: field1, key2: field2}`
178-
- Pipe: `expression | another`
292+
## Function Categories Reference
293+
294+
| Category | Example Functions |
295+
|----------|-------------------|
296+
| String | `upper`, `lower`, `trim`, `split`, `snake_case`, `camel_case` |
297+
| Array | `unique`, `flatten`, `chunk`, `zip`, `intersection` |
298+
| Object | `keys`, `values`, `pick`, `omit`, `deep_merge` |
299+
| Math | `round`, `floor`, `ceil`, `sum`, `avg`, `stddev` |
300+
| Type | `type_of`, `is_array`, `is_string`, `to_boolean` |
301+
| Utility | `if`, `coalesce`, `default`, `now` |
302+
| DateTime | `format_date`, `time_ago`, `relative_time`, `is_weekend` |
303+
| Duration | `format_duration`, `parse_duration` |
304+
| Network | `is_private_ip`, `cidr_contains`, `ip_to_int` |
305+
| Computing | `format_bytes`, `parse_bytes`, `bit_and`, `bit_or` |
306+
| Validation | `is_email`, `is_uuid`, `is_ipv4`, `is_url` |
307+
| Encoding | `base64_encode`, `base64_decode`, `url_encode` |
308+
| Hash | `md5`, `sha256`, `hmac_sha256` |
309+
| Regex | `regex_match`, `regex_replace`, `regex_extract` |
310+
| Semver | `semver_compare`, `semver_satisfies`, `semver_parse` |
311+
| Fuzzy | `levenshtein`, `soundex`, `jaro_winkler` |
312+
| JSON Patch | `json_diff`, `json_patch`, `json_merge_patch` |
313+
314+
For the complete list, see the [jmespath-extensions documentation](https://docs.rs/jmespath_extensions).
315+
316+
## JMESPath Syntax Reference
317+
318+
| Syntax | Description | Example |
319+
|--------|-------------|---------|
320+
| `'value'` | String literal | `[?name=='cache']` |
321+
| `` `123` `` | Number literal | `[?size > `1024`]` |
322+
| `` `true` `` | Boolean literal | `[?active == `true`]` |
323+
| `@` | Current element | `sort_by(@, &name)` |
324+
| `.field` | Child access | `cluster.name` |
325+
| `[0]` | Index access | `nodes[0]` |
326+
| `[0:5]` | Slice | `databases[:5]` |
327+
| `[?expr]` | Filter | `[?status=='active']` |
328+
| `{k: v}` | Multi-select | `{id: uid, n: name}` |
329+
| `\|` | Pipe | `[].name \| sort(@)` |
330+
| `&field` | Expression reference | `sort_by(@, &name)` |
179331

180332
For full syntax, see [jmespath.org](https://jmespath.org/).
181333

docs/src/presentation/slides.html

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -333,18 +333,48 @@ <h2>
333333

334334
<!-- Layer 3: Human Commands - JMESPath -->
335335
<section>
336-
<h2>
337-
<span class="green">Human Commands:</span> JMESPath
338-
Queries
339-
</h2>
340-
<pre><code class="language-bash">$ redisctl cloud subscription list -q '[*].{name: name, cost: price}'</code></pre>
336+
<h2><span class="green">Human Commands:</span> JMESPath Queries</h2>
337+
<p>Filter, reshape, and transform any JSON output</p>
338+
<pre><code class="language-bash">$ redisctl enterprise database list -o json</code></pre>
339+
<pre><code class="language-json">[{"uid":1,"name":"session-cache","memory_size":1073741824,"status":"active"},
340+
{"uid":2,"name":"user-data","memory_size":2147483648,"status":"active"},
341+
{"uid":3,"name":"analytics","memory_size":4294967296,"status":"pending"}]</code></pre>
342+
<pre><code class="language-bash">$ redisctl enterprise database list -q '[?status==`active`].name'</code></pre>
343+
<pre><code class="language-json">["session-cache", "user-data"]</code></pre>
344+
</section>
345+
346+
<!-- JMESPath Pipelines -->
347+
<section>
348+
<h2><span class="green">JMESPath:</span> Pipelines</h2>
349+
<p>Chain operations with <code>|</code></p>
350+
<pre><code class="language-bash"># Filter -> Sort -> Take first 3 -> Reshape
351+
$ redisctl enterprise database list -q '
352+
[?status==`active`]
353+
| sort_by(@, &memory_size)
354+
| reverse(@)
355+
| [:3]
356+
| [*].{name: name, gb: to_string(memory_size / `1073741824`)}'</code></pre>
341357
<pre><code class="language-json">[
342-
{"name": "production", "cost": 250.00},
343-
{"name": "staging", "cost": 50.00},
344-
{"name": "dev", "cost": 25.00}
358+
{"name": "analytics", "gb": "4"},
359+
{"name": "user-data", "gb": "2"},
360+
{"name": "session-cache", "gb": "1"}
345361
]</code></pre>
346-
<pre><code class="language-bash">$ redisctl enterprise node list -q '[?status==`active`].addr'</code></pre>
347-
<pre><code class="language-json">["10.0.0.1", "10.0.0.2", "10.0.0.3"]</code></pre>
362+
</section>
363+
364+
<!-- JMESPath Extended Functions -->
365+
<section>
366+
<h2><span class="green">JMESPath:</span> 300+ Functions</h2>
367+
<p>Beyond standard JMESPath</p>
368+
<pre><code class="language-bash"># Format bytes, dates, durations
369+
$ redisctl enterprise database list -q '[*].{
370+
name: name,
371+
memory: format_bytes(memory_size),
372+
uptime: format_duration(uptime_seconds)
373+
}'</code></pre>
374+
<pre><code class="language-json">[{"name": "session-cache", "memory": "1.00 GB", "uptime": "45d 12h 30m"}]</code></pre>
375+
<pre><code class="language-bash"># Network validation
376+
$ redisctl enterprise node list -q '[?is_private_ip(addr)].addr'</code></pre>
377+
<pre><code class="language-json">["10.0.0.1", "10.0.0.2", "192.168.1.10"]</code></pre>
348378
</section>
349379

350380
<!-- Layer 4: Workflows - Cloud -->

0 commit comments

Comments
 (0)