Skip to content

Commit 41927ea

Browse files
committed
Cherry pick PR 3935
1 parent 5d85e48 commit 41927ea

5 files changed

Lines changed: 98 additions & 27 deletions

File tree

src/main/java/graphql/execution/AsyncSerialExecutionStrategy.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,9 @@ public CompletableFuture<ExecutionResult> execute(ExecutionContext executionCont
5252
CompletableFuture<List<Object>> resultsFuture = Async.eachSequentially(fieldNames, (fieldName, prevResults) -> {
5353
MergedField currentField = fields.getSubField(fieldName);
5454
ResultPath fieldPath = parameters.getPath().segment(mkNameForPath(currentField));
55-
ExecutionStrategyParameters newParameters = parameters
56-
.transform(builder -> builder.field(currentField).path(fieldPath));
55+
ExecutionStrategyParameters newParameters = parameters.transform(currentField, fieldPath);
5756

58-
Object resolveSerialField = resolveSerialField(executionContext, dataLoaderDispatcherStrategy, newParameters);
59-
return resolveSerialField;
57+
return resolveSerialField(executionContext, dataLoaderDispatcherStrategy, newParameters);
6058
});
6159

6260
CompletableFuture<ExecutionResult> overallResult = new CompletableFuture<>();

src/main/java/graphql/execution/ExecutionStrategy.java

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,7 @@ DeferredExecutionSupport createDeferredExecutionSupport(ExecutionContext executi
329329
MergedField currentField = fields.getSubField(fieldName);
330330

331331
ResultPath fieldPath = parameters.getPath().segment(mkNameForPath(currentField));
332-
ExecutionStrategyParameters newParameters = parameters
333-
.transform(builder -> builder.field(currentField).path(fieldPath).parent(parameters));
332+
ExecutionStrategyParameters newParameters = parameters.transform(currentField, fieldPath, parameters);
334333

335334
if (!deferredExecutionSupport.isDeferredField(currentField)) {
336335
Object fieldValueInfo = resolveFieldWithInfo(executionContext, newParameters);
@@ -627,12 +626,10 @@ private FieldValueInfo completeField(GraphQLFieldDefinition fieldDef, ExecutionC
627626

628627
NonNullableFieldValidator nonNullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo);
629628

630-
ExecutionStrategyParameters newParameters = parameters.transform(builder ->
631-
builder.executionStepInfo(executionStepInfo)
632-
.source(fetchedValue.getFetchedValue())
633-
.localContext(fetchedValue.getLocalContext())
634-
.nonNullFieldValidator(nonNullableFieldValidator)
635-
);
629+
ExecutionStrategyParameters newParameters = parameters.transform(executionStepInfo,
630+
nonNullableFieldValidator,
631+
fetchedValue.getLocalContext(),
632+
fetchedValue.getFetchedValue());
636633

637634
FieldValueInfo fieldValueInfo = completeValue(executionContext, newParameters);
638635
ctxCompleteField.onDispatched();
@@ -793,13 +790,10 @@ protected FieldValueInfo completeValueForList(ExecutionContext executionContext,
793790

794791
FetchedValue value = unboxPossibleDataFetcherResult(executionContext, parameters, item);
795792

796-
ExecutionStrategyParameters newParameters = parameters.transform(builder ->
797-
builder.executionStepInfo(stepInfoForListElement)
798-
.nonNullFieldValidator(nonNullableFieldValidator)
799-
.localContext(value.getLocalContext())
800-
.path(indexedPath)
801-
.source(value.getFetchedValue())
802-
);
793+
ExecutionStrategyParameters newParameters = parameters.transform(stepInfoForListElement,
794+
nonNullableFieldValidator, indexedPath,
795+
value.getLocalContext(), value.getFetchedValue());
796+
803797
fieldValueInfos.add(completeValue(executionContext, newParameters));
804798
index++;
805799
}
@@ -939,12 +933,10 @@ protected Object completeValueForObject(ExecutionContext executionContext, Execu
939933
ExecutionStepInfo newExecutionStepInfo = executionStepInfo.changeTypeWithPreservedNonNull(resolvedObjectType);
940934
NonNullableFieldValidator nonNullableFieldValidator = new NonNullableFieldValidator(executionContext, newExecutionStepInfo);
941935

942-
ExecutionStrategyParameters newParameters = parameters.transform(builder ->
943-
builder.executionStepInfo(newExecutionStepInfo)
944-
.fields(subFields)
945-
.nonNullFieldValidator(nonNullableFieldValidator)
946-
.source(result)
947-
);
936+
ExecutionStrategyParameters newParameters = parameters.transform(newExecutionStepInfo,
937+
nonNullableFieldValidator,
938+
subFields,
939+
result);
948940

949941
// Calling this from the executionContext to ensure we shift back from mutation strategy to the query strategy.
950942
return executionContext.getQueryStrategy().executeObject(executionContext, newParameters);

src/main/java/graphql/execution/ExecutionStrategyParameters.java

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package graphql.execution;
22

3+
import graphql.Internal;
34
import graphql.PublicApi;
45
import graphql.execution.incremental.DeferredCallContext;
56
import org.jspecify.annotations.Nullable;
@@ -115,6 +116,84 @@ public MergedField getField() {
115116
return currentField;
116117
}
117118

119+
@Internal
120+
ExecutionStrategyParameters transform(MergedField currentField,
121+
ResultPath path) {
122+
return new ExecutionStrategyParameters(executionStepInfo,
123+
source,
124+
localContext,
125+
fields,
126+
nonNullableFieldValidator,
127+
path,
128+
currentField,
129+
parent,
130+
deferredCallContext);
131+
}
132+
133+
@Internal
134+
ExecutionStrategyParameters transform(ExecutionStepInfo executionStepInfo,
135+
NonNullableFieldValidator nonNullableFieldValidator,
136+
MergedSelectionSet fields,
137+
Object source) {
138+
return new ExecutionStrategyParameters(executionStepInfo,
139+
source,
140+
localContext,
141+
fields,
142+
nonNullableFieldValidator,
143+
path,
144+
currentField,
145+
parent,
146+
deferredCallContext);
147+
}
148+
149+
@Internal
150+
ExecutionStrategyParameters transform(ExecutionStepInfo executionStepInfo,
151+
NonNullableFieldValidator nonNullableFieldValidator,
152+
ResultPath path,
153+
Object localContext,
154+
Object source) {
155+
return new ExecutionStrategyParameters(executionStepInfo,
156+
source,
157+
localContext,
158+
fields,
159+
nonNullableFieldValidator,
160+
path,
161+
currentField,
162+
parent,
163+
deferredCallContext);
164+
}
165+
166+
@Internal
167+
ExecutionStrategyParameters transform(ExecutionStepInfo executionStepInfo,
168+
NonNullableFieldValidator nonNullableFieldValidator,
169+
Object localContext,
170+
Object source) {
171+
return new ExecutionStrategyParameters(executionStepInfo,
172+
source,
173+
localContext,
174+
fields,
175+
nonNullableFieldValidator,
176+
path,
177+
currentField,
178+
parent,
179+
deferredCallContext);
180+
}
181+
182+
@Internal
183+
ExecutionStrategyParameters transform(MergedField currentField,
184+
ResultPath path,
185+
ExecutionStrategyParameters parent) {
186+
return new ExecutionStrategyParameters(executionStepInfo,
187+
source,
188+
localContext,
189+
fields,
190+
nonNullableFieldValidator,
191+
path,
192+
currentField,
193+
parent,
194+
deferredCallContext);
195+
}
196+
118197
public ExecutionStrategyParameters transform(Consumer<Builder> builderConsumer) {
119198
Builder builder = newParameters(this);
120199
builderConsumer.accept(builder);

src/main/java/graphql/execution/SubscriptionExecutionStrategy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ private ExecutionStrategyParameters firstFieldOfSubscriptionSelection(ExecutionS
184184
MergedField firstField = fields.getSubField(fields.getKeys().get(0));
185185

186186
ResultPath fieldPath = parameters.getPath().segment(mkNameForPath(firstField.getSingleField()));
187-
return parameters.transform(builder -> builder.field(firstField).path(fieldPath));
187+
return parameters.transform(firstField,fieldPath);
188188
}
189189

190190
private ExecutionStepInfo createSubscribedFieldStepInfo(ExecutionContext executionContext, ExecutionStrategyParameters parameters) {

src/main/java/graphql/execution/incremental/DeferredExecutionSupport.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import graphql.execution.FieldValueInfo;
1212
import graphql.execution.MergedField;
1313
import graphql.execution.MergedSelectionSet;
14+
import graphql.execution.ResultPath;
1415
import graphql.execution.instrumentation.Instrumentation;
1516
import graphql.incremental.IncrementalPayload;
1617
import graphql.util.FpKit;
@@ -139,10 +140,11 @@ private Supplier<CompletableFuture<DeferredFragmentCall.FieldWithExecutionResult
139140
ExecutionStrategyParameters callParameters = parameters.transform(builder ->
140141
{
141142
MergedSelectionSet mergedSelectionSet = MergedSelectionSet.newMergedSelectionSet().subFields(fields).build();
143+
ResultPath path = parameters.getPath().segment(currentField.getResultKey());
142144
builder.deferredCallContext(deferredCallContext)
143145
.field(currentField)
144146
.fields(mergedSelectionSet)
145-
.path(parameters.getPath().segment(currentField.getResultKey()))
147+
.path(path)
146148
.parent(null); // this is a break in the parent -> child chain - it's a new start effectively
147149
}
148150
);

0 commit comments

Comments
 (0)