@@ -17,60 +17,82 @@ public ValueTask EnrichAsync(
17
17
EntityGroup entity ,
18
18
CancellationToken cancellationToken = default )
19
19
{
20
+ var completed = new HashSet < ( string , string ) > ( ) ;
20
21
var regex = CreateRegex ( ) ;
21
22
22
- foreach ( var ( type , schema ) in entity . Parts )
23
+ foreach ( var entitySchema in entity . Parts . Select ( t => t . Schema ) )
23
24
{
24
- if ( schema . QueryType is null )
25
+ if ( entitySchema . QueryType is null )
25
26
{
26
27
continue ;
27
28
}
28
29
29
- foreach ( var entityResolver in schema . QueryType . Fields )
30
+ foreach ( var entityType in entity . Parts . Select ( t => t . Type ) )
30
31
{
31
- var originalTypeName = type . GetOriginalName ( ) ;
32
- if ( entityResolver . Name . AsSpan ( ) . StartsWith ( originalTypeName , OrdinalIgnoreCase ) )
32
+ var localTypeName = entity . Parts . First ( t => t . Schema == entitySchema ) . Type . GetOriginalName ( ) ;
33
+
34
+ foreach ( var entityResolver in entitySchema . QueryType . Fields )
33
35
{
34
- var splits = regex . Split ( entityResolver . Name ) ;
35
- if ( splits . Length == 5 )
36
+ if ( completed . Contains ( ( entitySchema . Name , entityResolver . Name ) ) )
36
37
{
37
- var typeName = splits [ 1 ] ;
38
- var fieldName = splits [ 3 ] ;
39
- var isList = entityResolver . Type . IsListType ( ) ;
38
+ continue ;
39
+ }
40
40
41
- if ( ! isList && typeName . Equals ( originalTypeName , OrdinalIgnoreCase ) )
42
- {
43
- var field = type . Fields . FirstOrDefault ( f => f . Name . Equals ( fieldName , OrdinalIgnoreCase ) ) ;
44
- if ( field is not null )
45
- {
46
- TryRegisterEntityResolver ( entity , type , entityResolver , field , schema ) ;
47
- }
48
- }
49
- else if ( isList && typeName . Equals ( originalTypeName , OrdinalIgnoreCase ) ||
50
- ( typeName . Length - 1 == originalTypeName . Length &&
51
- typeName . AsSpan ( ) [ typeName . Length - 1 ] == 's' ) )
41
+
42
+ if ( entityResolver . Name . StartsWith ( localTypeName , OrdinalIgnoreCase ) )
43
+ {
44
+ var splits = regex . Split ( entityResolver . Name ) ;
45
+ if ( splits . Length == 5 )
52
46
{
53
- var field = type . Fields . FirstOrDefault ( f => f . Name . Equals ( fieldName , OrdinalIgnoreCase ) ) ;
47
+ var typeName = splits [ 1 ] ;
48
+ var fieldName = splits [ 3 ] ;
49
+ var isList = entityResolver . Type . IsListType ( ) ;
54
50
55
- if ( field is null )
51
+ if ( ! isList && typeName . Equals ( localTypeName , OrdinalIgnoreCase ) )
56
52
{
57
- var fieldPlural = fieldName [ ..^ 1 ] ;
58
- field = type . Fields . FirstOrDefault ( f => f . Name . Equals ( fieldPlural , OrdinalIgnoreCase ) ) ;
53
+ var field = entityType . Fields . FirstOrDefault (
54
+ f => f . Name . Equals ( fieldName , OrdinalIgnoreCase ) ) ;
55
+ if ( field is not null &&
56
+ TryRegisterEntityResolver ( entity , entityType , entityResolver , field , entitySchema ) )
57
+ {
58
+ completed . Add ( ( entitySchema . Name , entityResolver . Name ) ) ;
59
+ }
59
60
}
60
-
61
- if ( field is not null )
61
+ else if ( ( isList && typeName . Equals ( localTypeName , OrdinalIgnoreCase ) ) ||
62
+ ( typeName . Length - 1 == localTypeName . Length &&
63
+ typeName . AsSpan ( ) [ typeName . Length - 1 ] == 's' ) )
62
64
{
63
- TryRegisterBatchEntityResolver ( entity , type , entityResolver , field , schema ) ;
65
+ var field = entityType . Fields . FirstOrDefault (
66
+ f => f . Name . Equals ( fieldName , OrdinalIgnoreCase ) ) ;
67
+
68
+ if ( field is null )
69
+ {
70
+ var fieldPlural = fieldName [ ..^ 1 ] ;
71
+ field = entityType . Fields . FirstOrDefault (
72
+ f => f . Name . Equals ( fieldPlural , OrdinalIgnoreCase ) ) ;
73
+ }
74
+
75
+ if ( field is not null &&
76
+ TryRegisterBatchEntityResolver (
77
+ entity ,
78
+ entityType ,
79
+ entityResolver ,
80
+ field ,
81
+ entitySchema ) )
82
+ {
83
+ completed . Add ( ( entitySchema . Name , entityResolver . Name ) ) ;
84
+ }
64
85
}
65
86
}
66
87
}
67
88
}
68
89
}
69
90
}
91
+
70
92
return default ;
71
93
}
72
94
73
- private static void TryRegisterEntityResolver (
95
+ private static bool TryRegisterEntityResolver (
74
96
EntityGroup entity ,
75
97
ObjectTypeDefinition entityType ,
76
98
OutputFieldDefinition entityResolverField ,
@@ -79,12 +101,12 @@ private static void TryRegisterEntityResolver(
79
101
{
80
102
if ( ! TryResolveKeyArgument ( entityResolverField , keyField , out var keyArg ) )
81
103
{
82
- return ;
104
+ return false ;
83
105
}
84
106
85
- if ( entityResolverField . Type == entityType ||
107
+ if ( entityResolverField . Type . Equals ( entityType , TypeComparison . Structural ) ||
86
108
( entityResolverField . Type . Kind is TypeKind . NonNull &&
87
- entityResolverField . Type . InnerType ( ) == entityType ) )
109
+ entityResolverField . Type . InnerType ( ) . Equals ( entityType , TypeComparison . Structural ) ) )
88
110
{
89
111
var arguments = new List < ArgumentNode > ( ) ;
90
112
@@ -93,12 +115,12 @@ private static void TryRegisterEntityResolver(
93
115
null ,
94
116
new NameNode ( entityResolverField . GetOriginalName ( ) ) ,
95
117
null ,
96
- Array . Empty < DirectiveNode > ( ) ,
118
+ [ ] ,
97
119
arguments ,
98
120
null ) ;
99
121
100
122
// Create a new SelectionSetNode for the entity resolver
101
- var selectionSet = new SelectionSetNode ( new [ ] { selection , } ) ;
123
+ var selectionSet = new SelectionSetNode ( [ selection ] ) ;
102
124
103
125
// Create a new EntityResolver for the entity
104
126
var resolver = new EntityResolver (
@@ -111,8 +133,8 @@ private static void TryRegisterEntityResolver(
111
133
null ,
112
134
new NameNode ( keyField . Name ) ,
113
135
null ,
114
- Array . Empty < DirectiveNode > ( ) ,
115
- Array . Empty < ArgumentNode > ( ) ,
136
+ [ ] ,
137
+ [ ] ,
116
138
null ) ;
117
139
118
140
var keyFieldDirective = new IsDirective ( keyFieldNode ) ;
@@ -122,7 +144,10 @@ private static void TryRegisterEntityResolver(
122
144
123
145
// Add the new EntityResolver to the entity metadata
124
146
entity . Metadata . EntityResolvers . TryAdd ( resolver ) ;
147
+ return true ;
125
148
}
149
+
150
+ return false ;
126
151
}
127
152
128
153
private static bool TryResolveKeyArgument (
@@ -167,7 +192,7 @@ private static bool TryResolveKeyArgument(
167
192
! keyArgument . ContainsIsDirective ( ) ;
168
193
}
169
194
170
- private static void TryRegisterBatchEntityResolver (
195
+ private static bool TryRegisterBatchEntityResolver (
171
196
EntityGroup entity ,
172
197
ObjectTypeDefinition entityType ,
173
198
OutputFieldDefinition entityResolverField ,
@@ -176,7 +201,7 @@ private static void TryRegisterBatchEntityResolver(
176
201
{
177
202
if ( ! TryResolveBatchKeyArgument ( entityResolverField , keyField , out var keyArg ) )
178
203
{
179
- return ;
204
+ return false ;
180
205
}
181
206
182
207
var returnType = entityResolverField . Type ;
@@ -186,16 +211,16 @@ private static void TryRegisterBatchEntityResolver(
186
211
returnType = returnType . InnerType ( ) ;
187
212
}
188
213
189
- if ( returnType . Kind != TypeKind . List )
214
+ if ( returnType . Kind != TypeKind . List )
190
215
{
191
- return ;
216
+ return false ;
192
217
}
193
218
194
219
returnType = returnType . InnerType ( ) ;
195
220
196
- if ( returnType == entityType ||
221
+ if ( returnType . Equals ( entityType , TypeComparison . Structural ) ||
197
222
( returnType . Kind is TypeKind . NonNull &&
198
- returnType . InnerType ( ) == entityType ) )
223
+ returnType . InnerType ( ) . Equals ( entityType , TypeComparison . Structural ) ) )
199
224
{
200
225
var arguments = new List < ArgumentNode > ( ) ;
201
226
@@ -233,7 +258,10 @@ private static void TryRegisterBatchEntityResolver(
233
258
234
259
// Add the new EntityResolver to the entity metadata
235
260
entity . Metadata . EntityResolvers . TryAdd ( resolver ) ;
261
+ return true ;
236
262
}
263
+
264
+ return false ;
237
265
}
238
266
239
267
private static bool TryResolveBatchKeyArgument (
0 commit comments