Skip to content

Commit c42e811

Browse files
authoredJul 12, 2021
Remove info from ExecutionParams and add operationType (#3166)
* Remove info from ExecutionParams and add operationType * Fix tests * Allow getBatchingExecutor to cache executor by memoizing default executor * Memoize for a single so allow to memoize correctly. * Rename Request to ExecutionRequest * Remove unnecessary diff * Remove unnecessary operationName from DelegationContext * Add `context` in `createRequest` and `createRequestInfo` instead of `delegateToSchema` * Get context from request * Do not export extra types from delegate * Add info back * Fix typings
1 parent a0ff8f3 commit c42e811

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+266
-219
lines changed
 

‎.changeset/lazy-turtles-dress.md

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
'@graphql-tools/batch-execute': major
3+
'@graphql-tools/delegate': major
4+
'@graphql-tools/links': major
5+
'@graphql-tools/utils': major
6+
'@graphql-tools/wrap': major
7+
---
8+
9+
BREAKING CHANGES;
10+
11+
- Rename `Request` to `ExecutionRequest`
12+
- Drop unnecessary `GraphQLResolveInfo` in `ExecutionRequest`
13+
- Add required `operationType: OperationTypeNode` field in `ExecutionRequest`
14+
- Add `context` in `createRequest` and `createRequestInfo` instead of `delegateToSchema`
15+
16+
> It doesn't rely on info.operation.operationType to allow the user to call an operation from different root type.
17+
And it doesn't call getOperationAST again and again to get operation type from the document/operation because we have it in Request and ExecutionParams
18+
https://github.com/ardatan/graphql-tools/pull/3166/files#diff-d4824895ea613dcc1f710c3ac82e952fe0ca12391b671f70d9f2d90d5656fdceR38
19+
20+
Improvements;
21+
- Memoize `defaultExecutor` for a single `GraphQLSchema` so allow `getBatchingExecutor` to memoize `batchingExecutor` correctly.
22+
- And there is no different `defaultExecutor` is created for `subscription` and other operation types. Only one executor is used.
23+
24+
> Batch executor is memoized by `executor` reference but `createDefaultExecutor` didn't memoize the default executor so this memoization wasn't working correctly on `batch-execute` side.
25+
https://github.com/ardatan/graphql-tools/blob/remove-info-executor/packages/batch-execute/src/getBatchingExecutor.ts#L9

‎packages/batch-execute/src/createBatchingExecutor.ts

+15-16
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import { getOperationAST } from 'graphql';
2-
31
import DataLoader from 'dataloader';
42

53
import { ValueOrPromise } from 'value-or-promise';
64

7-
import { Request, Executor, ExecutionResult } from '@graphql-tools/utils';
5+
import { ExecutionRequest, Executor, ExecutionResult } from '@graphql-tools/utils';
86

97
import { mergeRequests } from './mergeRequests';
108
import { splitResult } from './splitResult';
@@ -14,32 +12,30 @@ export function createBatchingExecutor(
1412
dataLoaderOptions?: DataLoader.Options<any, any, any>,
1513
extensionsReducer: (
1614
mergedExtensions: Record<string, any>,
17-
request: Request
15+
request: ExecutionRequest
1816
) => Record<string, any> = defaultExtensionsReducer
1917
): Executor {
2018
const loader = new DataLoader(createLoadFn(executor, extensionsReducer), dataLoaderOptions);
21-
return (request: Request) =>
22-
request.info?.operation.operation === 'subscription' ? executor(request) : loader.load(request);
19+
return (request: ExecutionRequest) => {
20+
return request.operationType === 'subscription' ? executor(request) : loader.load(request);
21+
};
2322
}
2423

2524
function createLoadFn(
2625
executor: Executor,
27-
extensionsReducer: (mergedExtensions: Record<string, any>, request: Request) => Record<string, any>
26+
extensionsReducer: (mergedExtensions: Record<string, any>, request: ExecutionRequest) => Record<string, any>
2827
) {
29-
return async (requests: ReadonlyArray<Request>): Promise<Array<ExecutionResult>> => {
30-
const execBatches: Array<Array<Request>> = [];
28+
return async (requests: ReadonlyArray<ExecutionRequest>): Promise<Array<ExecutionResult>> => {
29+
const execBatches: Array<Array<ExecutionRequest>> = [];
3130
let index = 0;
3231
const request = requests[index];
33-
let currentBatch: Array<Request> = [request];
32+
let currentBatch: Array<ExecutionRequest> = [request];
3433
execBatches.push(currentBatch);
3534

36-
const operationType = getOperationAST(request.document, undefined)?.operation;
37-
if (operationType == null) {
38-
throw new Error('Could not identify operation type of document.');
39-
}
35+
const operationType = request.operationType;
4036

4137
while (++index < requests.length) {
42-
const currentOperationType = getOperationAST(requests[index].document, undefined)?.operation;
38+
const currentOperationType = requests[index].operationType;
4339
if (operationType == null) {
4440
throw new Error('Could not identify operation type of document.');
4541
}
@@ -68,7 +64,10 @@ function createLoadFn(
6864
};
6965
}
7066

71-
function defaultExtensionsReducer(mergedExtensions: Record<string, any>, request: Request): Record<string, any> {
67+
function defaultExtensionsReducer(
68+
mergedExtensions: Record<string, any>,
69+
request: ExecutionRequest
70+
): Record<string, any> {
7271
const newExtensions = request.extensions;
7372
if (newExtensions != null) {
7473
Object.assign(mergedExtensions, newExtensions);

0 commit comments

Comments
 (0)
Please sign in to comment.