UNPKG

@tanstack/db

Version:

A reactive client store for building super fast apps on sync

1 lines 22.8 kB
{"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 { deepEquals } from '../../utils.js'\nimport { getParentContextIdentity } from '../equality-value-identity.js'\nimport { INCLUDES_ROUTING } from '../compiler/route-metadata.js'\nimport type { ValueIdentity } from '../equality-value-identity.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 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 compilation.valueIdentity,\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(\n child.pipeline,\n include.childCompilationResult.valueIdentity,\n )\n if (include.materialization === `collection`) {\n const edgeId = `bucket-facade-${++nextBucketFacadeEdgeId}`\n const activeBuckets = createActiveBuckets(\n pipeline,\n include,\n compilation.valueIdentity,\n )\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(\n pipeline,\n include,\n edgeId,\n scope,\n compilation.valueIdentity,\n )\n } else {\n pipeline = attachInlineInclude(\n pipeline,\n bucketRows,\n include,\n scope,\n compilation.valueIdentity,\n )\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 valueIdentity: ValueIdentity,\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([\n routeKey(tuple[2], tuple[3], valueIdentity),\n publicKey,\n ])\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 valueIdentity: ValueIdentity,\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(\n routing.correlationKey,\n routing.parentContext,\n valueIdentity,\n ),\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 setNestedValue(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 valueIdentity,\n )\n}\n\nfunction createBucketRows(\n childPipeline: ResultStream,\n valueIdentity: ValueIdentity,\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, valueIdentity),\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 valueIdentity: ValueIdentity,\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, valueIdentity),\n )\n return [\n parentKey,\n [\n setNestedValue(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 valueIdentity,\n )\n}\n\nfunction createActiveBuckets(\n parentPipeline: ResultStream,\n include: IncludesCompilationResult,\n valueIdentity: ValueIdentity,\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(\n routing.correlationKey,\n routing.parentContext,\n valueIdentity,\n )\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 valueIdentity: ValueIdentity,\n): string {\n return serializeValue([\n valueIdentity.equality(correlationKey ?? null),\n getParentContextIdentity(parentContext ?? null),\n ])\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"],"names":["join","map","INCLUDES_ROUTING","serializeValue","reduce","deepEquals","filter","distinct","getParentContextIdentity","compareKeys"],"mappings":"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"}