UNPKG

@tanstack/db

Version:

A reactive client store for building super fast apps on sync

1 lines • 6.34 kB
{"version":3,"file":"clone-query.cjs","sources":["../../../../src/query/builder/clone-query.ts"],"sourcesContent":["import {\n CollectionRef,\n ConditionalSelect,\n IncludesSubquery,\n QueryRef,\n UnionAll,\n UnionFrom,\n isExpressionLike,\n} from '../ir.js'\nimport { isRefProxy } from './ref-proxy-identity.js'\nimport type { From, QueryIR, Select, SelectValueExpression } from '../ir.js'\n\n/**\n * Gives every query-source placement its own runtime source identities.\n *\n * A reused builder describes the same query meaning, but each FROM, JOIN,\n * UNION, or include placement owns an independent position in the dataflow\n * graph. Expressions are immutable and can remain shared; CollectionRefs\n * cannot because their sourceId identifies that lexical position.\n */\nexport function cloneQueryForPlacement(query: QueryIR): QueryIR {\n return cloneQuery(query, new WeakMap())\n}\n\nfunction cloneQuery(query: QueryIR, clones: WeakMap<object, object>): QueryIR {\n const existing = clones.get(query)\n if (existing) return existing as QueryIR\n\n const cloned: QueryIR = {\n ...query,\n }\n clones.set(query, cloned)\n\n cloned.from = cloneFromForPlacement(query.from, clones)\n cloned.join = query.join?.map((join) => ({\n ...join,\n from: cloneSourceForPlacement(join.from, clones),\n }))\n cloned.select =\n query.select === undefined || isExpressionLike(query.select)\n ? query.select\n : cloneSelectForPlacement(query.select, clones)\n return cloned\n}\n\nfunction cloneFromForPlacement(\n from: From,\n clones: WeakMap<object, object>,\n): From {\n if (from.type === `unionFrom`) {\n return new UnionFrom(\n from.sources.map((source) => cloneSourceForPlacement(source, clones)),\n )\n }\n\n if (from.type === `unionAll`) {\n return new UnionAll(from.queries.map((query) => cloneQuery(query, clones)))\n }\n\n return cloneSourceForPlacement(from, clones)\n}\n\nfunction cloneSourceForPlacement(\n source: CollectionRef | QueryRef,\n clones: WeakMap<object, object>,\n): CollectionRef | QueryRef {\n if (source.type === `collectionRef`) {\n return new CollectionRef(source.collection, source.alias)\n }\n\n return new QueryRef(cloneQuery(source.query, clones), source.alias)\n}\n\nfunction cloneSelectForPlacement(\n select: Select,\n clones: WeakMap<object, object>,\n): Select {\n const existing = clones.get(select)\n if (existing) return existing as Select\n\n const cloned: Select = {}\n clones.set(select, cloned)\n for (const [field, value] of Object.entries(select)) {\n cloned[field] = cloneSelectValueForPlacement(value, clones)\n }\n return cloned\n}\n\nfunction cloneSelectValueForPlacement(\n value: unknown,\n clones: WeakMap<object, object>,\n): SelectValueExpression {\n if (value instanceof IncludesSubquery) {\n const existing = clones.get(value)\n if (existing) return existing as IncludesSubquery\n\n const cloned = new IncludesSubquery(\n cloneQuery(value.query, clones),\n value.correlationField,\n value.childCorrelationField,\n value.fieldName,\n value.parentFilters,\n value.parentProjection,\n value.materialization,\n value.scalarField,\n )\n clones.set(value, cloned)\n return cloned\n }\n\n if (value instanceof ConditionalSelect) {\n const existing = clones.get(value)\n if (existing) return existing as ConditionalSelect\n\n const cloned = new ConditionalSelect(\n value.branches.map((branch) => ({\n ...branch,\n value: cloneSelectValueForPlacement(branch.value, clones),\n })),\n value.defaultValue !== undefined\n ? cloneSelectValueForPlacement(value.defaultValue, clones)\n : undefined,\n )\n clones.set(value, cloned)\n return cloned\n }\n\n if (value === null || typeof value !== `object` || Array.isArray(value)) {\n return value as SelectValueExpression\n }\n\n if (isRefProxy(value)) {\n return value as unknown as SelectValueExpression\n }\n\n return isExpressionLike(value)\n ? (value as SelectValueExpression)\n : cloneSelectForPlacement(value as Select, clones)\n}\n"],"names":["isExpressionLike","UnionFrom","UnionAll","CollectionRef","QueryRef","IncludesSubquery","ConditionalSelect","isRefProxy"],"mappings":"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"}