Martin Schulze created SLING-13152:
--------------------------------------
Summary: [GraphQL] Multiple aliased selections for the same field
lose sub-field selections due to FQN collision in SelectedFieldWrapper
Key: SLING-13152
URL: https://issues.apache.org/jira/browse/SLING-13152
Project: Sling
Issue Type: Bug
Components: GraphQL
Reporter: Martin Schulze
When a GraphQL query uses multiple aliases pointing at the same underlying
field:
{
AliasA: items { ... on TypeA { rteField { html } } }
AliasB: items { ... on TypeB { textField } }
}
All aliases resolve to the same fully-qualified name (FQN), e.g.
`ParentType.items`.
SelectedFieldWrapper stores sub-fields in a HashMap<String, SelectedField>
keyed by
FQN. When the second alias is processed, its entry overwrites the first,
discarding
the sub-field selections from AliasA.
For fields whose values are resolved directly (scalars), this is harmless. For
fields
that consult the selection set at resolution time — such as MultiFormatString
(RTE),
which uses the sub-field list to determine which formats
(html/plaintext/markdown) to
render — the result is null, because the selection set appears empty.
Steps to reproduce:
1. Define two CF models, ModelA (with a MultiFormatString field) and ModelB
2. Create a container model with a fragment-reference multifield `items`
accepting
both ModelA and ModelB
3. Query with two aliases on `items`:
AliasA: items { ... on ModelAModel { rteField { html } } }
AliasB: items { ... on ModelBModel { textField } }
4. Observe: rteField { html } returns null
Expected: html contains the stored HTML content
Actual: html is null
Fix: when a duplicate FQN is encountered, merge the sub-field maps from both
aliases instead of overwriting. This preserves all requested sub-fields
regardless of how many aliases reference the same field.
Affected class: SelectedFieldWrapper (and SelectionSetWrapper at the top level)
--
This message was sent by Atlassian Jira
(v8.20.10#820010)