{"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"]}