UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

1 lines 3.98 kB
{"version":3,"file":"buildExecutionPlan.js","sourceRoot":"","sources":["../../../src/execution/incremental/buildExecutionPlan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,mCAAkC;AACrD,OAAO,EAAE,SAAS,EAAE,oCAAmC;AAkBvD,MAAM,UAAU,kBAAkB,CAChC,uBAAwC,EACxC,oBAAmC,IAAI,GAAG,EAAc;IAExD,MAAM,eAAe,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC5D,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAGhC,CAAC;IACJ,KAAK,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC,IAAI,uBAAuB,EAAE,CAAC;QACtE,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QAEzE,IAAI,SAAS,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACxD,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QAED,IAAI,kBAAkB,GAAG,QAAQ,CAC/B,mBAAmB,EACnB,qBAAqB,CACtB,CAAC;QACF,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACrC,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAC;YAC/B,mBAAmB,CAAC,GAAG,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC;QACrE,CAAC;QACD,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACxD,CAAC;IAED,OAAO;QACL,eAAe;QACf,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,gBAAkC;IAElC,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAc,CAAC;IACpD,KAAK,MAAM,YAAY,IAAI,gBAAgB,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;QAC3C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,qBAAqB,CAAC,KAAK,EAAE,CAAC;YAC9B,OAAO,qBAAqB,CAAC;QAC/B,CAAC;QACD,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,MAAM,UAAU,IAAI,qBAAqB,EAAE,CAAC;QAC/C,IAAI,gBAAgB,GAA2B,UAAU,CAAC,gBAAgB,CAAC;QAC3E,OAAO,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,qBAAqB,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAChD,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACzC,MAAM;YACR,CAAC;YACD,gBAAgB,GAAG,gBAAgB,CAAC,gBAAgB,CAAC;QACvD,CAAC;IACH,CAAC;IACD,OAAO,qBAAqB,CAAC;AAC/B,CAAC","sourcesContent":["import { getBySet } from '../../jsutils/getBySet.ts';\nimport { isSameSet } from '../../jsutils/isSameSet.ts';\n\nimport type {\n DeferUsage,\n FieldDetailsList,\n GroupedFieldSet,\n} from '../collectFields.ts';\n\n/** @internal */\nexport type DeferUsageSet = ReadonlySet<DeferUsage>;\n\n/** @internal */\nexport interface ExecutionPlan {\n groupedFieldSet: GroupedFieldSet;\n newGroupedFieldSets: Map<DeferUsageSet, GroupedFieldSet>;\n}\n\n/** @internal */\nexport function buildExecutionPlan(\n originalGroupedFieldSet: GroupedFieldSet,\n parentDeferUsages: DeferUsageSet = new Set<DeferUsage>(),\n): ExecutionPlan {\n const groupedFieldSet = new Map<string, FieldDetailsList>();\n const newGroupedFieldSets = new Map<\n DeferUsageSet,\n Map<string, FieldDetailsList>\n >();\n for (const [responseKey, fieldDetailsList] of originalGroupedFieldSet) {\n const filteredDeferUsageSet = getFilteredDeferUsageSet(fieldDetailsList);\n\n if (isSameSet(filteredDeferUsageSet, parentDeferUsages)) {\n groupedFieldSet.set(responseKey, fieldDetailsList);\n continue;\n }\n\n let newGroupedFieldSet = getBySet(\n newGroupedFieldSets,\n filteredDeferUsageSet,\n );\n if (newGroupedFieldSet === undefined) {\n newGroupedFieldSet = new Map();\n newGroupedFieldSets.set(filteredDeferUsageSet, newGroupedFieldSet);\n }\n newGroupedFieldSet.set(responseKey, fieldDetailsList);\n }\n\n return {\n groupedFieldSet,\n newGroupedFieldSets,\n };\n}\n\nfunction getFilteredDeferUsageSet(\n fieldDetailsList: FieldDetailsList,\n): ReadonlySet<DeferUsage> {\n const filteredDeferUsageSet = new Set<DeferUsage>();\n for (const fieldDetails of fieldDetailsList) {\n const deferUsage = fieldDetails.deferUsage;\n if (deferUsage === undefined) {\n filteredDeferUsageSet.clear();\n return filteredDeferUsageSet;\n }\n filteredDeferUsageSet.add(deferUsage);\n }\n\n for (const deferUsage of filteredDeferUsageSet) {\n let parentDeferUsage: DeferUsage | undefined = deferUsage.parentDeferUsage;\n while (parentDeferUsage !== undefined) {\n if (filteredDeferUsageSet.has(parentDeferUsage)) {\n filteredDeferUsageSet.delete(deferUsage);\n break;\n }\n parentDeferUsage = parentDeferUsage.parentDeferUsage;\n }\n }\n return filteredDeferUsageSet;\n}\n"]}