1[
2 {
3 "given": {"foo": [{"name": "a"}, {"name": "b"}]},
4 "cases": [
5 {
6 "comment": "Matching a literal",
7 "expression": "foo[?name == 'a']",
8 "result": [{"name": "a"}]
9 }
10 ]
11 },
12 {
13 "given": {"foo": [0, 1], "bar": [2, 3]},
14 "cases": [
15 {
16 "comment": "Matching a literal",
17 "expression": "*[?[0] == `0`]",
18 "result": [[], []]
19 }
20 ]
21 },
22 {
23 "given": {"foo": [{"first": "foo", "last": "bar"},
24 {"first": "foo", "last": "foo"},
25 {"first": "foo", "last": "baz"}]},
26 "cases": [
27 {
28 "comment": "Matching an expression",
29 "expression": "foo[?first == last]",
30 "result": [{"first": "foo", "last": "foo"}]
31 },
32 {
33 "comment": "Verify projection created from filter",
34 "expression": "foo[?first == last].first",
35 "result": ["foo"]
36 }
37 ]
38 },
39 {
40 "given": {"foo": [{"age": 20},
41 {"age": 25},
42 {"age": 30}]},
43 "cases": [
44 {
45 "comment": "Greater than with a number",
46 "expression": "foo[?age > `25`]",
47 "result": [{"age": 30}]
48 },
49 {
50 "expression": "foo[?age >= `25`]",
51 "result": [{"age": 25}, {"age": 30}]
52 },
53 {
54 "comment": "Greater than with a number",
55 "expression": "foo[?age > `30`]",
56 "result": []
57 },
58 {
59 "comment": "Greater than with a number",
60 "expression": "foo[?age < `25`]",
61 "result": [{"age": 20}]
62 },
63 {
64 "comment": "Greater than with a number",
65 "expression": "foo[?age <= `25`]",
66 "result": [{"age": 20}, {"age": 25}]
67 },
68 {
69 "comment": "Greater than with a number",
70 "expression": "foo[?age < `20`]",
71 "result": []
72 },
73 {
74 "expression": "foo[?age == `20`]",
75 "result": [{"age": 20}]
76 },
77 {
78 "expression": "foo[?age != `20`]",
79 "result": [{"age": 25}, {"age": 30}]
80 }
81 ]
82 },
83 {
84 "given": {"foo": [{"top": {"name": "a"}},
85 {"top": {"name": "b"}}]},
86 "cases": [
87 {
88 "comment": "Filter with subexpression",
89 "expression": "foo[?top.name == 'a']",
90 "result": [{"top": {"name": "a"}}]
91 }
92 ]
93 },
94 {
95 "given": {"foo": [{"top": {"first": "foo", "last": "bar"}},
96 {"top": {"first": "foo", "last": "foo"}},
97 {"top": {"first": "foo", "last": "baz"}}]},
98 "cases": [
99 {
100 "comment": "Matching an expression",
101 "expression": "foo[?top.first == top.last]",
102 "result": [{"top": {"first": "foo", "last": "foo"}}]
103 },
104 {
105 "comment": "Matching a JSON array",
106 "expression": "foo[?top == `{\"first\": \"foo\", \"last\": \"bar\"}`]",
107 "result": [{"top": {"first": "foo", "last": "bar"}}]
108 }
109 ]
110 },
111 {
112 "given": {"foo": [
113 {"key": true},
114 {"key": false},
115 {"key": 0},
116 {"key": 1},
117 {"key": [0]},
118 {"key": {"bar": [0]}},
119 {"key": null},
120 {"key": [1]},
121 {"key": {"a":2}}
122 ]},
123 "cases": [
124 {
125 "expression": "foo[?key == `true`]",
126 "result": [{"key": true}]
127 },
128 {
129 "expression": "foo[?key == `false`]",
130 "result": [{"key": false}]
131 },
132 {
133 "expression": "foo[?key == `0`]",
134 "result": [{"key": 0}]
135 },
136 {
137 "expression": "foo[?key == `1`]",
138 "result": [{"key": 1}]
139 },
140 {
141 "expression": "foo[?key == `[0]`]",
142 "result": [{"key": [0]}]
143 },
144 {
145 "expression": "foo[?key == `{\"bar\": [0]}`]",
146 "result": [{"key": {"bar": [0]}}]
147 },
148 {
149 "expression": "foo[?key == `null`]",
150 "result": [{"key": null}]
151 },
152 {
153 "expression": "foo[?key == `[1]`]",
154 "result": [{"key": [1]}]
155 },
156 {
157 "expression": "foo[?key == `{\"a\":2}`]",
158 "result": [{"key": {"a":2}}]
159 },
160 {
161 "expression": "foo[?`true` == key]",
162 "result": [{"key": true}]
163 },
164 {
165 "expression": "foo[?`false` == key]",
166 "result": [{"key": false}]
167 },
168 {
169 "expression": "foo[?`0` == key]",
170 "result": [{"key": 0}]
171 },
172 {
173 "expression": "foo[?`1` == key]",
174 "result": [{"key": 1}]
175 },
176 {
177 "expression": "foo[?`[0]` == key]",
178 "result": [{"key": [0]}]
179 },
180 {
181 "expression": "foo[?`{\"bar\": [0]}` == key]",
182 "result": [{"key": {"bar": [0]}}]
183 },
184 {
185 "expression": "foo[?`null` == key]",
186 "result": [{"key": null}]
187 },
188 {
189 "expression": "foo[?`[1]` == key]",
190 "result": [{"key": [1]}]
191 },
192 {
193 "expression": "foo[?`{\"a\":2}` == key]",
194 "result": [{"key": {"a":2}}]
195 },
196 {
197 "expression": "foo[?key != `true`]",
198 "result": [{"key": false}, {"key": 0}, {"key": 1}, {"key": [0]},
199 {"key": {"bar": [0]}}, {"key": null}, {"key": [1]}, {"key": {"a":2}}]
200 },
201 {
202 "expression": "foo[?key != `false`]",
203 "result": [{"key": true}, {"key": 0}, {"key": 1}, {"key": [0]},
204 {"key": {"bar": [0]}}, {"key": null}, {"key": [1]}, {"key": {"a":2}}]
205 },
206 {
207 "expression": "foo[?key != `0`]",
208 "result": [{"key": true}, {"key": false}, {"key": 1}, {"key": [0]},
209 {"key": {"bar": [0]}}, {"key": null}, {"key": [1]}, {"key": {"a":2}}]
210 },
211 {
212 "expression": "foo[?key != `1`]",
213 "result": [{"key": true}, {"key": false}, {"key": 0}, {"key": [0]},
214 {"key": {"bar": [0]}}, {"key": null}, {"key": [1]}, {"key": {"a":2}}]
215 },
216 {
217 "expression": "foo[?key != `null`]",
218 "result": [{"key": true}, {"key": false}, {"key": 0}, {"key": 1}, {"key": [0]},
219 {"key": {"bar": [0]}}, {"key": [1]}, {"key": {"a":2}}]
220 },
221 {
222 "expression": "foo[?key != `[1]`]",
223 "result": [{"key": true}, {"key": false}, {"key": 0}, {"key": 1}, {"key": [0]},
224 {"key": {"bar": [0]}}, {"key": null}, {"key": {"a":2}}]
225 },
226 {
227 "expression": "foo[?key != `{\"a\":2}`]",
228 "result": [{"key": true}, {"key": false}, {"key": 0}, {"key": 1}, {"key": [0]},
229 {"key": {"bar": [0]}}, {"key": null}, {"key": [1]}]
230 },
231 {
232 "expression": "foo[?`true` != key]",
233 "result": [{"key": false}, {"key": 0}, {"key": 1}, {"key": [0]},
234 {"key": {"bar": [0]}}, {"key": null}, {"key": [1]}, {"key": {"a":2}}]
235 },
236 {
237 "expression": "foo[?`false` != key]",
238 "result": [{"key": true}, {"key": 0}, {"key": 1}, {"key": [0]},
239 {"key": {"bar": [0]}}, {"key": null}, {"key": [1]}, {"key": {"a":2}}]
240 },
241 {
242 "expression": "foo[?`0` != key]",
243 "result": [{"key": true}, {"key": false}, {"key": 1}, {"key": [0]},
244 {"key": {"bar": [0]}}, {"key": null}, {"key": [1]}, {"key": {"a":2}}]
245 },
246 {
247 "expression": "foo[?`1` != key]",
248 "result": [{"key": true}, {"key": false}, {"key": 0}, {"key": [0]},
249 {"key": {"bar": [0]}}, {"key": null}, {"key": [1]}, {"key": {"a":2}}]
250 },
251 {
252 "expression": "foo[?`null` != key]",
253 "result": [{"key": true}, {"key": false}, {"key": 0}, {"key": 1}, {"key": [0]},
254 {"key": {"bar": [0]}}, {"key": [1]}, {"key": {"a":2}}]
255 },
256 {
257 "expression": "foo[?`[1]` != key]",
258 "result": [{"key": true}, {"key": false}, {"key": 0}, {"key": 1}, {"key": [0]},
259 {"key": {"bar": [0]}}, {"key": null}, {"key": {"a":2}}]
260 },
261 {
262 "expression": "foo[?`{\"a\":2}` != key]",
263 "result": [{"key": true}, {"key": false}, {"key": 0}, {"key": 1}, {"key": [0]},
264 {"key": {"bar": [0]}}, {"key": null}, {"key": [1]}]
265 }
266 ]
267 },
268 {
269 "given": {"reservations": [
270 {"instances": [
271 {"foo": 1, "bar": 2}, {"foo": 1, "bar": 3},
272 {"foo": 1, "bar": 2}, {"foo": 2, "bar": 1}]}]},
273 "cases": [
274 {
275 "expression": "reservations[].instances[?bar==`1`]",
276 "result": [[{"foo": 2, "bar": 1}]]
277 },
278 {
279 "expression": "reservations[*].instances[?bar==`1`]",
280 "result": [[{"foo": 2, "bar": 1}]]
281 },
282 {
283 "expression": "reservations[].instances[?bar==`1`][]",
284 "result": [{"foo": 2, "bar": 1}]
285 }
286 ]
287 },
288 {
289 "given": {
290 "baz": "other",
291 "foo": [
292 {"bar": 1}, {"bar": 2}, {"bar": 3}, {"bar": 4}, {"bar": 1, "baz": 2}
293 ]
294 },
295 "cases": [
296 {
297 "expression": "foo[?bar==`1`].bar[0]",
298 "result": []
299 }
300 ]
301 },
302 {
303 "given": {
304 "foo": [
305 {"a": 1, "b": {"c": "x"}},
306 {"a": 1, "b": {"c": "y"}},
307 {"a": 1, "b": {"c": "z"}},
308 {"a": 2, "b": {"c": "z"}},
309 {"a": 1, "baz": 2}
310 ]
311 },
312 "cases": [
313 {
314 "expression": "foo[?a==`1`].b.c",
315 "result": ["x", "y", "z"]
316 }
317 ]
318 },
319 {
320 "given": {"foo": [{"name": "a"}, {"name": "b"}, {"name": "c"}]},
321 "cases": [
322 {
323 "comment": "Filter with or expression",
324 "expression": "foo[?name == 'a' || name == 'b']",
325 "result": [{"name": "a"}, {"name": "b"}]
326 },
327 {
328 "expression": "foo[?name == 'a' || name == 'e']",
329 "result": [{"name": "a"}]
330 },
331 {
332 "expression": "foo[?name == 'a' || name == 'b' || name == 'c']",
333 "result": [{"name": "a"}, {"name": "b"}, {"name": "c"}]
334 }
335 ]
336 },
337 {
338 "given": {"foo": [{"a": 1, "b": 2}, {"a": 1, "b": 3}]},
339 "cases": [
340 {
341 "comment": "Filter with and expression",
342 "expression": "foo[?a == `1` && b == `2`]",
343 "result": [{"a": 1, "b": 2}]
344 },
345 {
346 "expression": "foo[?a == `1` && b == `4`]",
347 "result": []
348 }
349 ]
350 },
351 {
352 "given": {"foo": [{"a": 1, "b": 2, "c": 3}, {"a": 3, "b": 4}]},
353 "cases": [
354 {
355 "comment": "Filter with Or and And expressions",
356 "expression": "foo[?c == `3` || a == `1` && b == `4`]",
357 "result": [{"a": 1, "b": 2, "c": 3}]
358 },
359 {
360 "expression": "foo[?b == `2` || a == `3` && b == `4`]",
361 "result": [{"a": 1, "b": 2, "c": 3}, {"a": 3, "b": 4}]
362 },
363 {
364 "expression": "foo[?a == `3` && b == `4` || b == `2`]",
365 "result": [{"a": 1, "b": 2, "c": 3}, {"a": 3, "b": 4}]
366 },
367 {
368 "expression": "foo[?(a == `3` && b == `4`) || b == `2`]",
369 "result": [{"a": 1, "b": 2, "c": 3}, {"a": 3, "b": 4}]
370 },
371 {
372 "expression": "foo[?((a == `3` && b == `4`)) || b == `2`]",
373 "result": [{"a": 1, "b": 2, "c": 3}, {"a": 3, "b": 4}]
374 },
375 {
376 "expression": "foo[?a == `3` && (b == `4` || b == `2`)]",
377 "result": [{"a": 3, "b": 4}]
378 },
379 {
380 "expression": "foo[?a == `3` && ((b == `4` || b == `2`))]",
381 "result": [{"a": 3, "b": 4}]
382 }
383 ]
384 },
385 {
386 "given": {"foo": [{"a": 1, "b": 2, "c": 3}, {"a": 3, "b": 4}]},
387 "cases": [
388 {
389 "comment": "Verify precedence of or/and expressions",
390 "expression": "foo[?a == `1` || b ==`2` && c == `5`]",
391 "result": [{"a": 1, "b": 2, "c": 3}]
392 },
393 {
394 "comment": "Parentheses can alter precedence",
395 "expression": "foo[?(a == `1` || b ==`2`) && c == `5`]",
396 "result": []
397 },
398 {
399 "comment": "Not expressions combined with and/or",
400 "expression": "foo[?!(a == `1` || b ==`2`)]",
401 "result": [{"a": 3, "b": 4}]
402 }
403 ]
404 },
405 {
406 "given": {
407 "foo": [
408 {"key": true},
409 {"key": false},
410 {"key": []},
411 {"key": {}},
412 {"key": [0]},
413 {"key": {"a": "b"}},
414 {"key": 0},
415 {"key": 1},
416 {"key": null},
417 {"notkey": true}
418 ]
419 },
420 "cases": [
421 {
422 "comment": "Unary filter expression",
423 "expression": "foo[?key]",
424 "result": [
425 {"key": true}, {"key": [0]}, {"key": {"a": "b"}},
426 {"key": 0}, {"key": 1}
427 ]
428 },
429 {
430 "comment": "Unary not filter expression",
431 "expression": "foo[?!key]",
432 "result": [
433 {"key": false}, {"key": []}, {"key": {}},
434 {"key": null}, {"notkey": true}
435 ]
436 },
437 {
438 "comment": "Equality with null RHS",
439 "expression": "foo[?key == `null`]",
440 "result": [
441 {"key": null}, {"notkey": true}
442 ]
443 }
444 ]
445 },
446 {
447 "given": {
448 "foo": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
449 },
450 "cases": [
451 {
452 "comment": "Using @ in a filter expression",
453 "expression": "foo[?@ < `5`]",
454 "result": [0, 1, 2, 3, 4]
455 },
456 {
457 "comment": "Using @ in a filter expression",
458 "expression": "foo[?`5` > @]",
459 "result": [0, 1, 2, 3, 4]
460 },
461 {
462 "comment": "Using @ in a filter expression",
463 "expression": "foo[?@ == @]",
464 "result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
465 }
466 ]
467 }
468]
View as plain text