33
33
import org .springframework .graphql .ExecutionGraphQlResponse ;
34
34
import org .springframework .graphql .ExecutionGraphQlService ;
35
35
import org .springframework .graphql .support .DefaultExecutionGraphQlResponse ;
36
+ import org .springframework .lang .Nullable ;
36
37
37
38
/**
38
39
* {@link ExecutionGraphQlService} that uses a {@link GraphQlSource} to obtain a
@@ -51,7 +52,8 @@ public class DefaultExecutionGraphQlService implements ExecutionGraphQlService {
51
52
52
53
private final List <DataLoaderRegistrar > dataLoaderRegistrars = new ArrayList <>();
53
54
54
- private boolean hasDataLoaderRegistrations ;
55
+ @ Nullable
56
+ private Boolean hasDataLoaderRegistrations ;
55
57
56
58
private final boolean isDefaultExecutionIdProvider ;
57
59
@@ -70,13 +72,6 @@ public DefaultExecutionGraphQlService(GraphQlSource graphQlSource) {
70
72
*/
71
73
public void addDataLoaderRegistrar (DataLoaderRegistrar registrar ) {
72
74
this .dataLoaderRegistrars .add (registrar );
73
- this .hasDataLoaderRegistrations = (this .hasDataLoaderRegistrations || hasRegistrations (registrar ));
74
- }
75
-
76
- private static boolean hasRegistrations (DataLoaderRegistrar registrar ) {
77
- DataLoaderRegistry registry = DataLoaderRegistry .newRegistry ().build ();
78
- registrar .registerDataLoaders (registry , GraphQLContext .newContext ().build ());
79
- return !registry .getDataLoaders ().isEmpty ();
80
75
}
81
76
82
77
@@ -93,28 +88,41 @@ public final Mono<ExecutionGraphQlResponse> execute(ExecutionGraphQlRequest requ
93
88
GraphQLContext graphQLContext = executionInput .getGraphQLContext ();
94
89
ContextSnapshot .captureFrom (contextView ).updateContext (graphQLContext );
95
90
96
- ExecutionInput updatedExecutionInput =
97
- (this .hasDataLoaderRegistrations ? registerDataLoaders (executionInput ) : executionInput );
91
+ ExecutionInput executionInputToUse = registerDataLoaders (executionInput );
98
92
99
- return Mono .fromFuture (this .graphQlSource .graphQl ().executeAsync (updatedExecutionInput ))
100
- .map ((result ) -> new DefaultExecutionGraphQlResponse (updatedExecutionInput , result ));
93
+ return Mono .fromFuture (this .graphQlSource .graphQl ().executeAsync (executionInputToUse ))
94
+ .map ((result ) -> new DefaultExecutionGraphQlResponse (executionInputToUse , result ));
101
95
});
102
96
}
103
97
104
98
private ExecutionInput registerDataLoaders (ExecutionInput executionInput ) {
105
- GraphQLContext graphQLContext = executionInput .getGraphQLContext ();
106
- DataLoaderRegistry existingRegistry = executionInput .getDataLoaderRegistry ();
107
- if (existingRegistry == DataLoaderDispatcherInstrumentationState .EMPTY_DATALOADER_REGISTRY ) {
108
- DataLoaderRegistry newRegistry = DataLoaderRegistry .newRegistry ().build ();
109
- applyDataLoaderRegistrars (newRegistry , graphQLContext );
110
- executionInput = executionInput .transform ((builder ) -> builder .dataLoaderRegistry (newRegistry ));
99
+ if (this .hasDataLoaderRegistrations == null ) {
100
+ this .hasDataLoaderRegistrations = initHasDataLoaderRegistrations ();
111
101
}
112
- else {
113
- applyDataLoaderRegistrars (existingRegistry , graphQLContext );
102
+ if (this .hasDataLoaderRegistrations ) {
103
+ GraphQLContext graphQLContext = executionInput .getGraphQLContext ();
104
+ DataLoaderRegistry existingRegistry = executionInput .getDataLoaderRegistry ();
105
+ if (existingRegistry == DataLoaderDispatcherInstrumentationState .EMPTY_DATALOADER_REGISTRY ) {
106
+ DataLoaderRegistry newRegistry = DataLoaderRegistry .newRegistry ().build ();
107
+ applyDataLoaderRegistrars (newRegistry , graphQLContext );
108
+ executionInput = executionInput .transform ((builder ) -> builder .dataLoaderRegistry (newRegistry ));
109
+ }
110
+ else {
111
+ applyDataLoaderRegistrars (existingRegistry , graphQLContext );
112
+ }
114
113
}
115
114
return executionInput ;
116
115
}
117
116
117
+ private boolean initHasDataLoaderRegistrations () {
118
+ for (DataLoaderRegistrar registrar : this .dataLoaderRegistrars ) {
119
+ if (registrar .hasRegistrations ()) {
120
+ return true ;
121
+ }
122
+ }
123
+ return false ;
124
+ }
125
+
118
126
private void applyDataLoaderRegistrars (DataLoaderRegistry registry , GraphQLContext graphQLContext ) {
119
127
this .dataLoaderRegistrars .forEach ((registrar ) -> registrar .registerDataLoaders (registry , graphQLContext ));
120
128
}
0 commit comments