{"version":3,"file":"materialized-pipeline.cjs","sources":["../../../../src/query/live/materialized-pipeline.ts"],"sourcesContent":["import {\n  compareKeys,\n  distinct,\n  filter,\n  join,\n  map,\n  reduce,\n  serializeValue,\n} from '@tanstack/db-ivm'\nimport { FN_SELECT_STATE, INCLUDES_ROUTING } from '../compiler/index.js'\nimport { VIRTUAL_PROP_NAMES } from '../../virtual-props.js'\nimport { deepEquals } from '../../utils.js'\nimport type {\n  CompilationResult,\n  IncludesCompilationResult,\n} from '../compiler/index.js'\nimport type { IncludesMaterialization } from '../ir.js'\nimport type { IStreamBuilder } from '@tanstack/db-ivm'\nimport type { ResultStream } from '../../types.js'\n\ntype ResultTuple = [\n  value: Record<PropertyKey, any>,\n  order: string | undefined,\n  correlationKey?: unknown,\n  parentContext?: Record<string, any> | null,\n  routing?: IncludesRouting,\n  publicKey?: unknown,\n]\n\ntype IncludesRouting = Record<string, IncludeRoute>\n\ntype IncludeRoute = {\n  active: boolean\n  correlationKey: unknown\n  parentContext: Record<string, any> | null\n}\n\ntype FnSelectState = {\n  sourceRow: Record<PropertyKey, any>\n  fnSelect: (row: any) => unknown\n}\n\ntype CanonicalResult = {\n  publicKey: unknown\n  tuple: ResultTuple\n}\n\nexport type BucketRow = {\n  publicKey: unknown\n  value: Record<PropertyKey, any>\n  order: string | undefined\n}\n\nexport type BucketFacadeCompilation = {\n  edgeId: string\n  rows: IStreamBuilder<[string, BucketRow]>\n  activeBuckets: IStreamBuilder<[string, true]>\n  hasOrderBy: boolean\n}\n\nexport const BUCKET_FACADE_REF = Symbol(`bucketFacadeRef`)\n\nexport type BucketFacadeRef = {\n  [BUCKET_FACADE_REF]: {\n    edgeId: string\n    bucketKey: string\n  }\n}\n\nexport type MaterializedCompilation = {\n  pipeline: ResultStream\n  facades: Array<BucketFacadeCompilation>\n}\n\ntype RelationScope = `root` | `child`\n\ntype BuiltRelations = WeakMap<\n  CompilationResult,\n  Partial<Record<RelationScope, MaterializedCompilation>>\n>\n\nlet nextBucketFacadeEdgeId = 0\n\n/**\n * Compiles inline includes into the same D2 graph as their parent relation.\n * Collection-valued includes become inert bucket references. The public facade\n * adapter resolves those references after the graph reaches quiescence.\n */\nexport function materializeCompilation(\n  compilation: CompilationResult,\n  getRootKey?: (row: any) => unknown,\n  reduceJoinedPublicKeys = false,\n): MaterializedCompilation {\n  if (\n    !compilation.includes?.length &&\n    !(getRootKey && reduceJoinedPublicKeys)\n  ) {\n    return { pipeline: compilation.pipeline, facades: [] }\n  }\n\n  const built: BuiltRelations = new WeakMap()\n  const materialized = materializeRelation(\n    compilation,\n    getRootKey,\n    built,\n    `root`,\n  )\n  return {\n    ...materialized,\n    facades: dedupeFacades(materialized.facades),\n  }\n}\n\nfunction materializeRelation(\n  compilation: CompilationResult,\n  getKey: ((row: any) => unknown) | undefined,\n  built: BuiltRelations,\n  scope: RelationScope,\n): MaterializedCompilation {\n  const cached = built.get(compilation)?.[scope]\n  if (cached) return cached\n\n  let pipeline = canonicalizeByPublicKey(\n    exposeRouting(compilation.pipeline),\n    getKey,\n    scope,\n  )\n  const facades: Array<BucketFacadeCompilation> = []\n\n  for (const include of compilation.includes ?? []) {\n    const child = materializeRelation(\n      include.childCompilationResult,\n      undefined,\n      built,\n      `child`,\n    )\n    facades.push(...child.facades)\n\n    const bucketRows = createBucketRows(child.pipeline)\n    if (include.materialization === `collection`) {\n      const edgeId = `bucket-facade-${++nextBucketFacadeEdgeId}`\n      const activeBuckets = createActiveBuckets(pipeline, include)\n      const activeBucketRows = activeBuckets.pipe(\n        join(bucketRows),\n        map(([bucketKey, [, row]]) => [bucketKey, row]),\n      ) as IStreamBuilder<[string, BucketRow]>\n      facades.push({\n        edgeId,\n        rows: activeBucketRows,\n        activeBuckets,\n        hasOrderBy: include.hasOrderBy,\n      })\n      pipeline = attachCollectionInclude(pipeline, include, edgeId, scope)\n    } else {\n      pipeline = attachInlineInclude(pipeline, bucketRows, include, scope)\n    }\n  }\n\n  const result = { pipeline, facades }\n  built.set(compilation, { ...built.get(compilation), [scope]: result })\n  return result\n}\n\nfunction dedupeFacades(\n  facades: Array<BucketFacadeCompilation>,\n): Array<BucketFacadeCompilation> {\n  return [...new Map(facades.map((facade) => [facade.edgeId, facade])).values()]\n}\n\nfunction exposeRouting(pipeline: ResultStream): ResultStream {\n  return pipeline.pipe(\n    map(([key, rawTuple]) => {\n      const tuple = rawTuple as ResultTuple\n      return [\n        key,\n        [\n          tuple[0],\n          tuple[1],\n          tuple[2],\n          tuple[3],\n          tuple[0][INCLUDES_ROUTING],\n          tuple[4],\n        ],\n      ]\n    }),\n  ) as unknown as ResultStream\n}\n\nfunction canonicalizeByPublicKey(\n  pipeline: ResultStream,\n  getKey: ((row: any) => unknown) | undefined,\n  scope: RelationScope,\n): ResultStream {\n  return pipeline.pipe(\n    map(([internalKey, rawTuple]) => {\n      const tuple = rawTuple as ResultTuple\n      const publicKey = getKey ? getKey(tuple[0]) : (tuple[5] ?? internalKey)\n      const relationKey =\n        scope === `root`\n          ? serializeValue([`root`, publicKey])\n          : serializeValue([routeKey(tuple[2], tuple[3]), publicKey])\n      return [relationKey, { publicKey, tuple }] as [string, CanonicalResult]\n    }),\n    reduce((values: Array<[CanonicalResult, number]>) => {\n      const totalMultiplicity = values.reduce(\n        (total, [, multiplicity]) => total + multiplicity,\n        0,\n      )\n      if (totalMultiplicity === 0) return []\n      if (totalMultiplicity < 0) {\n        throw new Error(`Canonical query row has negative multiplicity`)\n      }\n\n      const visible = values.find(([, multiplicity]) => multiplicity > 0)?.[0]\n      if (!visible) {\n        throw new Error(`Canonical query row has no positive contributor`)\n      }\n\n      for (const [candidate, multiplicity] of values) {\n        if (multiplicity <= 0) continue\n        assertCongruentContributors(visible, candidate)\n      }\n\n      return [[visible, 1]]\n    }),\n    map(([relationKey, { publicKey, tuple }]) => [\n      scope === `root` ? publicKey : relationKey,\n      tuple,\n    ]),\n  ) as ResultStream\n}\n\nfunction assertCongruentContributors(\n  left: CanonicalResult,\n  right: CanonicalResult,\n): void {\n  const [leftValue, leftOrder, leftCorrelation, leftContext, leftRouting] =\n    left.tuple\n  const [rightValue, rightOrder, rightCorrelation, rightContext, rightRouting] =\n    right.tuple\n\n  if (\n    leftOrder !== rightOrder ||\n    !deepEquals(leftValue, rightValue) ||\n    !deepEquals(leftCorrelation, rightCorrelation) ||\n    !deepEquals(leftContext, rightContext) ||\n    !deepEquals(leftRouting, rightRouting)\n  ) {\n    throw new Error(\n      `Query contributors for public key ${serializeValue(left.publicKey)} are not congruent`,\n    )\n  }\n}\n\nfunction attachInlineInclude(\n  parentPipeline: ResultStream,\n  bucketRows: IStreamBuilder<[string, BucketRow]>,\n  include: IncludesCompilationResult,\n  scope: RelationScope,\n): ResultStream {\n  const bucketValues = bucketRows.pipe(\n    reduce((values: Array<[BucketRow, number]>) => {\n      const rows: Array<BucketRow> = []\n      for (const [row, multiplicity] of values) {\n        if (multiplicity < 0) {\n          throw new Error(\n            `Materialization bucket row has negative multiplicity`,\n          )\n        }\n        for (let index = 0; index < multiplicity; index++) rows.push(row)\n      }\n      if (rows.length === 0) return []\n\n      rows.sort(compareBucketRows)\n      return [[{ value: materializeRows(rows, include) }, 1]]\n    }),\n  )\n  const routedParents = parentPipeline.pipe(\n    map(([parentKey, rawTuple]) => {\n      const tuple = rawTuple as ResultTuple\n      const routing = getIncludeRoute(tuple, include.fieldName)\n      return [\n        routing?.active !== true\n          ? `inactive:${serializeValue(parentKey)}`\n          : routeKey(routing.correlationKey, routing.parentContext),\n        { parentKey, tuple },\n      ] as [string, { parentKey: unknown; tuple: ResultTuple }]\n    }),\n    join(bucketValues, `left`),\n    map(([_bucketKey, [parent, bucketValue]]) => {\n      const [value, order, correlationKey, parentContext, routing, publicKey] =\n        parent!.tuple\n      const edgeRouting = routing?.[include.fieldName]\n      if (edgeRouting?.active !== true) {\n        return [\n          parent!.parentKey,\n          [value, order, correlationKey, parentContext, routing, publicKey],\n        ]\n      }\n      const materialized =\n        bucketValue === null\n          ? emptyMaterializedValue(include.materialization)\n          : bucketValue.value\n      return [\n        parent!.parentKey,\n        [\n          setMaterializedInclude(value, include.resultPath, materialized),\n          order,\n          correlationKey,\n          parentContext,\n          routing,\n          publicKey,\n        ],\n      ]\n    }),\n  )\n  // A route move can make the join emit matched and empty-bucket deltas for\n  // the same parent key in one graph turn. Reduce those deltas back to the one\n  // canonical parent row before the next include or the public output sees it.\n  return canonicalizeByPublicKey(\n    routedParents as ResultStream,\n    undefined,\n    scope,\n  )\n}\n\nfunction createBucketRows(\n  childPipeline: ResultStream,\n): IStreamBuilder<[string, BucketRow]> {\n  return childPipeline.pipe(\n    map(([internalKey, rawTuple]) => {\n      const [value, order, correlationKey, parentContext, , publicKey] =\n        rawTuple as ResultTuple\n      return [\n        routeKey(correlationKey, parentContext),\n        { publicKey: publicKey ?? internalKey, value, order },\n      ] as [string, BucketRow]\n    }),\n  )\n}\n\nfunction attachCollectionInclude(\n  parentPipeline: ResultStream,\n  include: IncludesCompilationResult,\n  edgeId: string,\n  scope: RelationScope,\n): ResultStream {\n  const routedParents = parentPipeline.pipe(\n    map(([parentKey, rawTuple]) => {\n      const tuple = rawTuple as ResultTuple\n      const routing = getIncludeRoute(tuple, include.fieldName)\n      if (routing?.active !== true) return [parentKey, tuple]\n      const facade = createBucketFacadeRef(\n        edgeId,\n        routeKey(routing.correlationKey, routing.parentContext),\n      )\n      return [\n        parentKey,\n        [\n          setMaterializedInclude(tuple[0], include.resultPath, facade),\n          tuple[1],\n          tuple[2],\n          tuple[3],\n          tuple[4],\n          tuple[5],\n        ],\n      ]\n    }),\n  )\n  return canonicalizeByPublicKey(\n    routedParents as ResultStream,\n    undefined,\n    scope,\n  )\n}\n\nfunction createActiveBuckets(\n  parentPipeline: ResultStream,\n  include: IncludesCompilationResult,\n): IStreamBuilder<[string, true]> {\n  return parentPipeline.pipe(\n    map(([parentKey, rawTuple]) => {\n      const tuple = rawTuple as ResultTuple\n      const routing = getIncludeRoute(tuple, include.fieldName)\n      const bucketKey =\n        routing?.active === true\n          ? routeKey(routing.correlationKey, routing.parentContext)\n          : undefined\n      return [parentKey, bucketKey] as [unknown, string | undefined]\n    }),\n    filter(([, bucketKey]) => bucketKey !== undefined),\n    distinct(([, bucketKey]) => bucketKey),\n    map(([, bucketKey]) => [bucketKey!, true] as [string, true]),\n  )\n}\n\nfunction createBucketFacadeRef(\n  edgeId: string,\n  bucketKey: string,\n): BucketFacadeRef {\n  return { [BUCKET_FACADE_REF]: { edgeId, bucketKey } }\n}\n\nfunction getIncludeRoute(\n  tuple: ResultTuple,\n  fieldName: string,\n): IncludeRoute | undefined {\n  return tuple[4]?.[fieldName]\n}\n\nfunction routeKey(\n  correlationKey: unknown,\n  parentContext: Record<string, any> | null | undefined,\n): string {\n  return serializeValue([correlationKey ?? null, parentContext ?? null])\n}\n\nfunction compareBucketRows(left: BucketRow, right: BucketRow): number {\n  if (left.order !== right.order) {\n    if (left.order === undefined) return 1\n    if (right.order === undefined) return -1\n    return left.order < right.order ? -1 : 1\n  }\n\n  if (\n    (typeof left.publicKey === `string` ||\n      typeof left.publicKey === `number`) &&\n    (typeof right.publicKey === `string` || typeof right.publicKey === `number`)\n  ) {\n    return compareKeys(left.publicKey, right.publicKey)\n  }\n\n  const leftKey = serializeValue(left.publicKey)\n  const rightKey = serializeValue(right.publicKey)\n  return leftKey < rightKey ? -1 : leftKey > rightKey ? 1 : 0\n}\n\nfunction materializeRows(\n  rows: Array<BucketRow>,\n  include: IncludesCompilationResult,\n): unknown {\n  const scalarField = include.scalarField\n  const values = scalarField\n    ? rows.map(({ value }) => value[scalarField])\n    : rows.map(({ value }) => value)\n\n  if (include.materialization === `array`) return values\n  if (include.materialization === `singleton`) return values[0]\n  return values.map((value) => String(value ?? ``)).join(``)\n}\n\nfunction emptyMaterializedValue(\n  materialization: IncludesMaterialization,\n): unknown {\n  if (materialization === `array`) return []\n  if (materialization === `concat`) return ``\n  if (materialization === `singleton`) return undefined\n  throw new Error(`Collection includes require a bucket facade`)\n}\n\nfunction setNestedValue(\n  source: Record<PropertyKey, any>,\n  path: Array<string>,\n  value: unknown,\n): Record<PropertyKey, any> {\n  const root = { ...source }\n  let target = root\n  let current: Record<PropertyKey, any> | null | undefined = source\n\n  for (let index = 0; index < path.length - 1; index++) {\n    const part = path[index]!\n    const currentChild: any = current?.[part]\n    const next = Array.isArray(currentChild)\n      ? [...currentChild]\n      : { ...(currentChild ?? {}) }\n    target[part] = next\n    target = next\n    current = currentChild\n  }\n\n  target[path[path.length - 1]!] = value\n  return root\n}\n\nfunction setMaterializedInclude(\n  value: Record<PropertyKey, any>,\n  path: Array<string>,\n  materialized: unknown,\n): Record<PropertyKey, any> {\n  const state = value[FN_SELECT_STATE] as FnSelectState | undefined\n  if (!state) return setNestedValue(value, path, materialized)\n\n  const sourceRow = setNestedValue(state.sourceRow, path, materialized)\n  const selectedValue = state.fnSelect(sourceRow)\n  if (!selectedValue || typeof selectedValue !== `object`) {\n    throw new Error(`fn.select must return an object when it projects includes`)\n  }\n\n  const selected: Record<PropertyKey, any> = Array.isArray(selectedValue)\n    ? [...selectedValue]\n    : { ...selectedValue }\n  for (const property of VIRTUAL_PROP_NAMES) {\n    if (property in value && !(property in selected)) {\n      selected[property] = value[property]\n    }\n  }\n  selected[INCLUDES_ROUTING] = value[INCLUDES_ROUTING]\n  Object.defineProperty(selected, FN_SELECT_STATE, {\n    value: { sourceRow, fnSelect: state.fnSelect },\n    enumerable: true,\n    configurable: true,\n  })\n  return selected\n}\n"],"names":["join","map","INCLUDES_ROUTING","serializeValue","reduce","deepEquals","index","filter","distinct","compareKeys","FN_SELECT_STATE","VIRTUAL_PROP_NAMES"],"mappings":"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"}