@tanstack/db
Version:
A reactive client store for building super fast apps on sync
1 lines • 23.4 kB
Source Map (JSON)
{"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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"}