Skip to content

Commit 3a13e5d

Browse files
authored
[Fusion] Referenced existing union type members when merging (#7983)
1 parent 117238d commit 3a13e5d

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

src/HotChocolate/Fusion-vnext/src/Fusion.Composition/SourceSchemaMerger.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,13 @@ public CompositionResult<SchemaDefinition> Merge()
4747
// [TypeName: [{Type, Schema}, ...], ...].
4848
var typeGroupByName = _schemas
4949
.SelectMany(s => s.Types, (schema, type) => new TypeInfo(type, schema))
50+
.OrderBy(i => i.Type.Kind) // Ensure that object types are merged before union types.
5051
.GroupBy(i => i.Type.Name);
5152

5253
// Merge types.
5354
foreach (var grouping in typeGroupByName)
5455
{
55-
var mergedType = MergeTypes([.. grouping]);
56+
var mergedType = MergeTypes([.. grouping], mergedSchema);
5657

5758
if (mergedType is not null)
5859
{
@@ -88,7 +89,9 @@ public CompositionResult<SchemaDefinition> Merge()
8889
return mergedSchema;
8990
}
9091

91-
private INamedTypeDefinition? MergeTypes(ImmutableArray<TypeInfo> typeGroup)
92+
private INamedTypeDefinition? MergeTypes(
93+
ImmutableArray<TypeInfo> typeGroup,
94+
SchemaDefinition mergedSchema)
9295
{
9396
var kind = typeGroup[0].Type.Kind;
9497

@@ -102,7 +105,7 @@ public CompositionResult<SchemaDefinition> Merge()
102105
TypeKind.Interface => MergeInterfaceTypes(typeGroup),
103106
TypeKind.Object => MergeObjectTypes(typeGroup),
104107
TypeKind.Scalar => MergeScalarTypes(typeGroup),
105-
TypeKind.Union => MergeUnionTypes(typeGroup),
108+
TypeKind.Union => MergeUnionTypes(typeGroup, mergedSchema),
106109
_ => throw new InvalidOperationException()
107110
};
108111
}
@@ -536,7 +539,9 @@ private ScalarTypeDefinition MergeScalarTypes(ImmutableArray<TypeInfo> typeGroup
536539
/// <seealso href="https://graphql.github.io/composite-schemas-spec/draft/#sec-Merge-Union-Types">
537540
/// Specification
538541
/// </seealso>
539-
private UnionTypeDefinition? MergeUnionTypes(ImmutableArray<TypeInfo> typeGroup)
542+
private UnionTypeDefinition? MergeUnionTypes(
543+
ImmutableArray<TypeInfo> typeGroup,
544+
SchemaDefinition mergedSchema)
540545
{
541546
var firstUnion = typeGroup[0].Type;
542547
var name = firstUnion.Name;
@@ -574,11 +579,9 @@ private ScalarTypeDefinition MergeScalarTypes(ImmutableArray<TypeInfo> typeGroup
574579

575580
foreach (var grouping in unionMemberGroupByName)
576581
{
577-
var memberType = new ObjectTypeDefinition(grouping.Key);
578-
579582
AddFusionUnionMemberDirectives(unionType, [.. grouping]);
580583

581-
unionType.Types.Add(memberType);
584+
unionType.Types.Add((ObjectTypeDefinition)mergedSchema.Types[grouping.Key]);
582585
}
583586

584587
return unionType;

0 commit comments

Comments
 (0)