router
router copied to clipboard
[JSONSelection] Remove `rest: * { a b }` star selection syntax
This PR removes the under-documented JSONSelection StarSelection syntax.
The StarSelection syntax provided a way to capture all unselected properties of an input object, which could then be given a name by providing an alias (e.g. rest: *) or further sub-selected by appending a SubSelection (e.g. rest: * { id } to select just the ids).
Another use case for the * syntax was to make it easier to handle dynamic dictionaries in GraphQL, which does not provide a way to select dynamic object keys:
booksByISBN: books { * { title author }}
Supposing books is a dictionary whose keys are ISBN strings and whose values are objects, this selection grabs the title and author properties from each of those objects while preserving the ISBN keys and dictionary structure.
Unfortunately, this syntax has interacted poorly with other JSONSelection functionality, including features we want to build. In particular, capturing only unselected fields with the * selection makes its behavior sensitive to the removal of other NamedSelection fields, which violates guiding principle #3.
Fortunately, we have new tools to address the use cases StarSelection syntax was originally designed to solve. In particular, we can use -> methods to inspect available data and perform arbitrary processing of JSON dictionaries:
# If you need a complete list of keys/values available from
# the current input object, the ->entries method can help
keys: $->entries.key
values: $->entries.value
# Imagine ->mapObject preserves object keys while binding
# each value to @. Note: this method is still hypothetical.
booksByISBN: books->mapObject(@ { title author })
Given these alternatives, I'm confident we can remove the special * syntax without eliminating any use cases, though this is definitely a breaking change for developers who were previously using the * syntax. Please comment below if this removal is disruptive to you.
✅ Docs Preview Ready
No new or changed pages found.
CI performance tests
- [ ] connectors-const - Connectors stress test that runs with a constant number of users
- [x] const - Basic stress test that runs with a constant number of users
- [ ] demand-control-instrumented - A copy of the step test, but with demand control monitoring and metrics enabled
- [ ] demand-control-uninstrumented - A copy of the step test, but with demand control monitoring enabled
- [ ] enhanced-signature - Enhanced signature enabled
- [ ] events - Stress test for events with a lot of users and deduplication ENABLED
- [ ] events_big_cap_high_rate - Stress test for events with a lot of users, deduplication enabled and high rate event with a big queue capacity
- [ ] events_big_cap_high_rate_callback - Stress test for events with a lot of users, deduplication enabled and high rate event with a big queue capacity using callback mode
- [ ] events_callback - Stress test for events with a lot of users and deduplication ENABLED in callback mode
- [ ] events_without_dedup - Stress test for events with a lot of users and deduplication DISABLED
- [ ] events_without_dedup_callback - Stress test for events with a lot of users and deduplication DISABLED using callback mode
- [ ] extended-reference-mode - Extended reference mode enabled
- [ ] large-request - Stress test with a 1 MB request payload
- [ ] no-tracing - Basic stress test, no tracing
- [ ] reload - Reload test over a long period of time at a constant rate of users
- [ ] step-jemalloc-tuning - Clone of the basic stress test for jemalloc tuning
- [ ] step-local-metrics - Field stats that are generated from the router rather than FTV1
- [ ] step-with-prometheus - A copy of the step test with the Prometheus metrics exporter enabled
- [x] step - Basic stress test that steps up the number of users over time
- [ ] xlarge-request - Stress test with 10 MB request payload
- [ ] xxlarge-request - Stress test with 100 MB request payload