Skip to content

Commit b67424d

Browse files
authored
Merge pull request #3935 from graphql-java/skip-builder-on-esp
ExecutionStrategyParameters now has a direct transform without a Builder
2 parents d5b6498 + 3790a10 commit b67424d

File tree

5 files changed

+98
-27
lines changed

5 files changed

+98
-27
lines changed

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
@@ -317,8 +317,7 @@ DeferredExecutionSupport createDeferredExecutionSupport(ExecutionContext executi
317317
MergedField currentField = fields.getSubField(fieldName);
318318

319319
ResultPath fieldPath = parameters.getPath().segment(mkNameForPath(currentField));
320-
ExecutionStrategyParameters newParameters = parameters
321-
.transform(builder -> builder.field(currentField).path(fieldPath).parent(parameters));
320+
ExecutionStrategyParameters newParameters = parameters.transform(currentField, fieldPath, parameters);
322321

323322
if (!deferredExecutionSupport.isDeferredField(currentField)) {
324323
Object fieldValueInfo = resolveFieldWithInfo(executionContext, newParameters);
@@ -615,12 +614,10 @@ private FieldValueInfo completeField(GraphQLFieldDefinition fieldDef, ExecutionC
615614

616615
NonNullableFieldValidator nonNullableFieldValidator = new NonNullableFieldValidator(executionContext, executionStepInfo);
617616

618-
ExecutionStrategyParameters newParameters = parameters.transform(builder ->
619-
builder.executionStepInfo(executionStepInfo)
620-
.source(fetchedValue.getFetchedValue())
621-
.localContext(fetchedValue.getLocalContext())
622-
.nonNullFieldValidator(nonNullableFieldValidator)
623-
);
617+
ExecutionStrategyParameters newParameters = parameters.transform(executionStepInfo,
618+
nonNullableFieldValidator,
619+
fetchedValue.getLocalContext(),
620+
fetchedValue.getFetchedValue());
624621

625622
FieldValueInfo fieldValueInfo = completeValue(executionContext, newParameters);
626623
ctxCompleteField.onDispatched();
@@ -781,13 +778,10 @@ protected FieldValueInfo completeValueForList(ExecutionContext executionContext,
781778

782779
FetchedValue value = unboxPossibleDataFetcherResult(executionContext, parameters, item);
783780

784-
ExecutionStrategyParameters newParameters = parameters.transform(builder ->
785-
builder.executionStepInfo(stepInfoForListElement)
786-
.nonNullFieldValidator(nonNullableFieldValidator)
787-
.localContext(value.getLocalContext())
788-
.path(indexedPath)
789-
.source(value.getFetchedValue())
790-
);
781+
ExecutionStrategyParameters newParameters = parameters.transform(stepInfoForListElement,
782+
nonNullableFieldValidator, indexedPath,
783+
value.getLocalContext(), value.getFetchedValue());
784+
791785
fieldValueInfos.add(completeValue(executionContext, newParameters));
792786
index++;
793787
}
@@ -927,12 +921,10 @@ protected Object completeValueForObject(ExecutionContext executionContext, Execu
927921
ExecutionStepInfo newExecutionStepInfo = executionStepInfo.changeTypeWithPreservedNonNull(resolvedObjectType);
928922
NonNullableFieldValidator nonNullableFieldValidator = new NonNullableFieldValidator(executionContext, newExecutionStepInfo);
929923

930-
ExecutionStrategyParameters newParameters = parameters.transform(builder ->
931-
builder.executionStepInfo(newExecutionStepInfo)
932-
.fields(subFields)
933-
.nonNullFieldValidator(nonNullableFieldValidator)
934-
.source(result)
935-
);
924+
ExecutionStrategyParameters newParameters = parameters.transform(newExecutionStepInfo,
925+
nonNullableFieldValidator,
926+
subFields,
927+
result);
936928

937929
// Calling this from the executionContext to ensure we shift back from mutation strategy to the query strategy.
938930
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)