22
33import graphql .ExecutionResult ;
44import graphql .ExecutionResultImpl ;
5- import graphql .execution .ExecutionContext ;
6- import graphql .execution .ExecutionStrategy ;
5+ import graphql .execution .*;
76import graphql .language .Field ;
87import graphql .schema .*;
98import io .reactivex .Flowable ;
2120import java .util .stream .Stream ;
2221import java .util .stream .StreamSupport ;
2322
23+ import static graphql .execution .ExecutionParameters .newParameters ;
2424import static java .util .stream .Collectors .toList ;
2525
2626public class ReactiveExecutionStrategy extends ExecutionStrategy {
2727
2828 @ Override
29- public ExecutionResult execute (ExecutionContext context , GraphQLObjectType parentType , Object source , Map <String , List <Field >> fields ) {
29+ public ExecutionResult execute (ExecutionContext context , ExecutionParameters parameters ) throws NonNullableFieldWasNullException {
30+ Map <String , List <Field >> fields = parameters .fields ();
31+ Object source = parameters .source ();
3032 return complexChangesFlow (
3133 context ,
3234 source ,
3335 __ -> fields .entrySet ().stream (),
34- (entry , sourceValue ) -> resolveField (new ReactiveContext (context , entry .getKey ()), parentType , source == null ? null : sourceValue , entry .getValue ()),
36+ (entry , sourceValue ) -> {
37+ ReactiveContext subContext = new ReactiveContext (context , entry .getKey ());
38+
39+ ExecutionParameters newParameters = newParameters ()
40+ .typeInfo (parameters .typeInfo ())
41+ .fields (parameters .fields ())
42+ .arguments (parameters .arguments ())
43+ .source (source == null ? null : sourceValue )
44+ .build ();
45+ return resolveField (subContext , newParameters , entry .getValue ());
46+ },
3547 results -> {
3648 Map <Object , Object > result = new HashMap <>();
3749 for (Object entry : results ) {
@@ -59,12 +71,21 @@ protected Object adapt(Object result) {
5971 }
6072
6173 @ Override
62- protected ExecutionResult completeValue (ExecutionContext context , GraphQLType fieldType , List <Field > fields , Object result ) {
63- result = adapt (result );
74+ protected ExecutionResult completeValue (ExecutionContext context , ExecutionParameters parameters , List <Field > fields ) {
75+ Object result = adapt (parameters .source ());
76+ GraphQLType fieldType = parameters .typeInfo ().type ();
6477
6578 if ((fieldType instanceof GraphQLScalarType || fieldType instanceof GraphQLEnumType ) && result instanceof Publisher ) {
6679 Flowable <Change > changesFlow = Flowable .fromPublisher ((Publisher <?>) result )
67- .map (it -> new Change (context , completeValue (context , fieldType , fields , it ).getData ()));
80+ .map (it -> {
81+ ExecutionParameters newParameters = newParameters ()
82+ .source (it )
83+ .fields (parameters .fields ())
84+ .typeInfo (parameters .typeInfo ())
85+ .build ();
86+
87+ return new Change (context , completeValue (context , newParameters , fields ).getData ());
88+ });
6889
6990 return new ExecutionResultImpl (changesFlow , null );
7091 }
@@ -86,7 +107,15 @@ protected ExecutionResult completeValue(ExecutionContext context, GraphQLType fi
86107 AtomicInteger i = new AtomicInteger ();
87108 return stream .map (it -> new SimpleEntry <>(i .getAndIncrement (), adapt (it )));
88109 },
89- (entry , __ ) -> completeValue (new ReactiveContext (context , entry .getKey ()), wrappedType , fields , entry .getValue ()),
110+ (entry , __ ) -> {
111+ ExecutionParameters newParameters = ExecutionParameters .newParameters ()
112+ .source (entry .getValue ())
113+ .fields (parameters .fields ())
114+ .arguments (parameters .arguments ())
115+ .typeInfo (parameters .typeInfo ().asType (wrappedType ))
116+ .build ();
117+ return completeValue (new ReactiveContext (context , entry .getKey ()), newParameters , fields );
118+ },
90119 results -> Stream .of (results )
91120 .map (SimpleEntry .class ::cast )
92121 .sorted (Comparator .comparingInt (it -> (Integer ) it .getKey ()))
@@ -95,7 +124,7 @@ protected ExecutionResult completeValue(ExecutionContext context, GraphQLType fi
95124 );
96125 }
97126
98- return super .completeValue (context , fieldType , fields , result );
127+ return super .completeValue (context , parameters , fields );
99128 }
100129
101130 protected <K , V > ExecutionResultImpl complexChangesFlow (
0 commit comments