@nicia-ai/typegraph 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +11 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -18
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/node.ts","../src/core/edge.ts","../src/core/meta-edge.ts","../src/core/external-ref.ts","../src/ontology/core-meta-edges.ts","../src/query/compiler/passes/recursive.ts","../src/query/compiler/passes/runner.ts","../src/query/compiler/temporal.ts","../src/query/compiler/passes/temporal.ts","../src/query/subquery-utils.ts","../src/query/predicates.ts","../src/query/compiler/predicates.ts","../src/query/compiler/passes/vector.ts","../src/query/compiler/plan/lowering.ts","../src/query/compiler/emitter/plan-inspector.ts","../src/query/compiler/emitter/recursive.ts","../src/query/compiler/emitter/set-operations.ts","../src/query/compiler/emitter/standard.ts","../src/query/compiler/predicate-utils.ts","../src/query/compiler/typed-json-extract.ts","../src/query/compiler/utils.ts","../src/query/compiler/emitter/standard-builders.ts","../src/query/compiler/recursive.ts","../src/query/compiler/schema.ts","../src/query/compiler/set-operations.ts","../src/query/compiler/standard-pass-pipeline.ts","../src/query/compiler/index.ts","../src/query/cursor.ts","../src/utils/id.ts","../src/utils/path.ts","../src/query/execution/result-mapper.ts","../src/query/execution/pagination.ts","../src/query/ast.ts","../src/query/execution/field-tracker.ts","../src/query/execution/value-decoder.ts","../src/query/execution/selective-result-mapper.ts","../src/query/builder/validation.ts","../src/query/builder/ast-builder.ts","../src/query/builder/prepared-query.ts","../src/query/builder/executable-query.ts","../src/query/builder/executable-aggregate-query.ts","../src/query/builder/traversal-builder.ts","../src/query/builder/query-builder.ts","../src/query/builder/unionable-query.ts","../src/query/builder/aggregates.ts","../src/query/builder/fragment.ts","../src/query/builder/index.ts","../src/query/builder.ts","../src/registry/builders.ts","../src/store/collections/edge-collection.ts","../src/store/collections/node-collection.ts","../src/store/collection-factory.ts","../src/constraints/index.ts","../src/store/constraints.ts","../src/store/row-mappers.ts","../src/store/operations/edge-operations.ts","../src/store/embedding-sync.ts","../src/store/uniqueness.ts","../src/store/operations/node-operations.ts","../src/store/store.ts"],"names":["validateSchemaKeys","z","field","expr","qualifier","sql","normalizeValueType","literal","pattern","left","opSql","arrayField","predicate","hasVariableLengthTraversal","compileKindFilter","quoteIdentifier","compileQuery","collectRequiredColumnsByAlias","compileSetOperation","having","jsonPointer","RESERVED_NODE_KEYS","RESERVED_EDGE_KEYS","nullToUndefined","value","rawRows","NOT_COMPUTED","max","min","rowToEdge","executeEdgeCreate","executeEdgeCreateNoReturnBatch","executeEdgeCreateBatch","executeEdgeUpdate","executeEdgeUpsertUpdate","executeEdgeDelete","executeEdgeHardDelete","results","rowToNode","executeNodeCreate","executeNodeCreateNoReturnBatch","executeNodeCreateBatch","executeNodeUpdate","executeNodeUpsertUpdate","executeNodeDelete","executeNodeHardDelete","mode","count","exists","edge"],"mappings":"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","file":"index.js","sourcesContent":["import { type z } from \"zod\";\n\nimport { ConfigurationError } from \"../errors/index\";\nimport { NODE_TYPE_BRAND, type NodeType } from \"./types\";\n\n// ============================================================\n// Reserved Keys\n// ============================================================\n\n/**\n * Property names that are reserved for system use and cannot appear in node schemas.\n * These are used for flattened node instances where props are spread at the top level.\n */\nconst RESERVED_NODE_KEYS = new Set([\"id\", \"kind\", \"meta\"]);\n\n// ============================================================\n// Node Factory Options\n// ============================================================\n\n/**\n * Options for defining a node type.\n */\nexport type DefineNodeOptions<S extends z.ZodObject<z.ZodRawShape>> = Readonly<{\n /** Zod schema for node properties */\n schema: S;\n /** Optional description for documentation */\n description?: string;\n}>;\n\n// ============================================================\n// Node Factory\n// ============================================================\n\n/**\n * Validates that a schema does not contain reserved property names.\n */\nfunction validateSchemaKeys(\n schema: z.ZodObject<z.ZodRawShape>,\n name: string,\n): void {\n const shape = schema.shape;\n const conflicts = Object.keys(shape).filter((key) =>\n RESERVED_NODE_KEYS.has(key),\n );\n if (conflicts.length > 0) {\n throw new ConfigurationError(\n `Node \"${name}\" schema contains reserved property names: ${conflicts.join(\", \")}`,\n { nodeType: name, conflicts, reservedKeys: [...RESERVED_NODE_KEYS] },\n {\n suggestion: `Rename the conflicting properties. Reserved names (id, kind, meta) are added automatically to all nodes.`,\n },\n );\n }\n}\n\n/**\n * Creates a node type definition.\n *\n * @example\n * ```typescript\n * const Person = defineNode(\"Person\", {\n * schema: z.object({\n * fullName: z.string().min(1),\n * email: z.string().email().optional(),\n * }),\n * description: \"A person in the system\",\n * });\n * ```\n */\nexport function defineNode<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n>(name: K, options: DefineNodeOptions<S>): NodeType<K, S> {\n validateSchemaKeys(options.schema, name);\n\n return Object.freeze({\n [NODE_TYPE_BRAND]: true as const,\n kind: name,\n schema: options.schema,\n description: options.description,\n }) as NodeType<K, S>;\n}\n","import { z } from \"zod\";\n\nimport { ConfigurationError } from \"../errors/index\";\nimport { EDGE_TYPE_BRAND, type EdgeType, type NodeType } from \"./types\";\n\n// ============================================================\n// Reserved Keys\n// ============================================================\n\n/**\n * Property names that are reserved for system use and cannot appear in edge schemas.\n * These are used for flattened edge instances where props are spread at the top level.\n */\nconst RESERVED_EDGE_KEYS = new Set([\n \"id\",\n \"kind\",\n \"meta\",\n \"fromKind\",\n \"fromId\",\n \"toKind\",\n \"toId\",\n]);\n\n// ============================================================\n// Edge Factory Options\n// ============================================================\n\n/**\n * Options for defining an edge type.\n */\nexport type DefineEdgeOptions<\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[] | undefined = undefined,\n To extends readonly NodeType[] | undefined = undefined,\n> = Readonly<{\n /** Zod schema for edge properties (defaults to empty object) */\n schema?: S;\n /** Optional description for documentation */\n description?: string;\n /** Node types that can be the source of this edge (domain constraint) */\n from?: From;\n /** Node types that can be the target of this edge (range constraint) */\n to?: To;\n}>;\n\n// ============================================================\n// Empty Schema\n// ============================================================\n\nconst EMPTY_SCHEMA = z.object({});\ntype EmptySchema = typeof EMPTY_SCHEMA;\n\n// ============================================================\n// Edge Factory\n// ============================================================\n\n/**\n * Validates that a schema does not contain reserved property names.\n */\nfunction validateSchemaKeys(\n schema: z.ZodObject<z.ZodRawShape>,\n name: string,\n): void {\n const shape = schema.shape;\n const conflicts = Object.keys(shape).filter((key) =>\n RESERVED_EDGE_KEYS.has(key),\n );\n if (conflicts.length > 0) {\n throw new ConfigurationError(\n `Edge \"${name}\" schema contains reserved property names: ${conflicts.join(\", \")}`,\n { edgeType: name, conflicts, reservedKeys: [...RESERVED_EDGE_KEYS] },\n {\n suggestion: `Rename the conflicting properties. Reserved names are added automatically to all edges.`,\n },\n );\n }\n}\n\n/**\n * Creates an edge type definition.\n *\n * @example\n * ```typescript\n * // Edge with no properties\n * const hasEpisode = defineEdge(\"hasEpisode\");\n *\n * // Edge with properties\n * const employedAt = defineEdge(\"employedAt\", {\n * schema: z.object({\n * isPrimary: z.boolean().default(true),\n * startedAt: z.date(),\n * }),\n * description: \"Employment relationship\",\n * });\n *\n * // Edge with domain/range constraints (can be used directly in defineGraph)\n * const worksAt = defineEdge(\"worksAt\", {\n * schema: z.object({ role: z.string() }),\n * from: [Person],\n * to: [Company],\n * });\n * ```\n */\n// Overload: no options - returns edge without domain/range\nexport function defineEdge<K extends string>(name: K): EdgeType<K, EmptySchema>;\n\n// Overload: options with both from and to - returns edge with domain/range\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[],\n To extends readonly NodeType[],\n>(\n name: K,\n options: DefineEdgeOptions<S, From, To> & { from: From; to: To },\n): EdgeType<K, S, From, To>;\n\n// Overload: options without from/to - returns edge without domain/range\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n>(name: K, options: DefineEdgeOptions<S>): EdgeType<K, S>;\n\n// Implementation\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[] | undefined,\n To extends readonly NodeType[] | undefined,\n>(\n name: K,\n options?: DefineEdgeOptions<S, From, To>,\n): EdgeType<K, S, From, To> | EdgeType<K, EmptySchema> {\n const schema = options?.schema ?? EMPTY_SCHEMA;\n validateSchemaKeys(schema, name);\n\n return Object.freeze({\n [EDGE_TYPE_BRAND]: true as const,\n kind: name,\n schema,\n description: options?.description,\n from: options?.from,\n to: options?.to,\n }) as EdgeType<K, S, From, To> | EdgeType<K, EmptySchema>;\n}\n","import {\n type InferenceType,\n META_EDGE_BRAND,\n type MetaEdge,\n type MetaEdgeProperties,\n} from \"../ontology/types\";\n\n// ============================================================\n// Meta-Edge Factory Options\n// ============================================================\n\n/**\n * Options for creating a meta-edge.\n */\nexport type MetaEdgeOptions = Readonly<{\n /** Whether the relationship is transitive (A→B, B→C implies A→C) */\n transitive?: boolean;\n /** Whether the relationship is symmetric (A→B implies B→A) */\n symmetric?: boolean;\n /** Whether the relationship is reflexive (A→A is always true) */\n reflexive?: boolean;\n /** Name of the inverse meta-edge */\n inverse?: string;\n /** How this meta-edge affects queries and validation */\n inference?: InferenceType;\n /** Optional description */\n description?: string;\n}>;\n\n// ============================================================\n// Meta-Edge Factory\n// ============================================================\n\n/**\n * Creates a custom meta-edge definition.\n *\n * @example\n * ```typescript\n * // Custom meta-edge for regulatory relationships\n * const regulatedBy = metaEdge(\"regulatedBy\", {\n * description: \"Type X is regulated by authority type Y\",\n * transitive: false,\n * symmetric: false,\n * });\n * ```\n */\nexport function metaEdge<K extends string>(\n name: K,\n options: MetaEdgeOptions = {},\n): MetaEdge<K> {\n const properties: MetaEdgeProperties = {\n transitive: options.transitive ?? false,\n symmetric: options.symmetric ?? false,\n reflexive: options.reflexive ?? false,\n inverse: options.inverse,\n inference: options.inference ?? \"none\",\n description: options.description,\n };\n\n return Object.freeze({\n [META_EDGE_BRAND]: true as const,\n name,\n properties,\n }) as MetaEdge<K>;\n}\n","/**\n * External reference type for hybrid overlay patterns.\n *\n * Creates a Zod-compatible schema for referencing entities in external\n * data sources (e.g., existing application tables) from TypeGraph nodes.\n */\nimport { z } from \"zod\";\n\n// ============================================================\n// External Reference Metadata Symbol\n// ============================================================\n\n/**\n * Symbol key for storing external table name on the schema.\n * This allows the schema introspector to detect external reference types\n * and extract source information.\n */\nexport const EXTERNAL_REF_TABLE_KEY = \"_externalRefTable\" as const;\n\n// ============================================================\n// External Reference Value Type\n// ============================================================\n\n/**\n * The shape of an external reference value.\n * Contains the source table identifier and the ID of the referenced record.\n */\nexport type ExternalRefValue<T extends string = string> = Readonly<{\n table: T;\n id: string;\n}>;\n\n// ============================================================\n// External Reference Schema Type\n// ============================================================\n\n/**\n * A Zod schema for external references with attached table metadata.\n */\nexport type ExternalRefSchema<T extends string = string> = z.ZodType<\n ExternalRefValue<T>\n> &\n Readonly<{\n [EXTERNAL_REF_TABLE_KEY]: T;\n }>;\n\n// ============================================================\n// External Reference Factory\n// ============================================================\n\n/**\n * Creates a Zod schema for referencing external data sources.\n *\n * Use this when building a hybrid overlay where TypeGraph stores\n * graph relationships and metadata while your existing tables\n * remain the source of truth for entity data.\n *\n * @param table - The identifier for the external table/source (e.g., \"users\", \"documents\")\n * @returns A Zod schema that validates external reference objects\n *\n * @example\n * ```typescript\n * import { defineNode, externalRef, embedding } from \"@nicia-ai/typegraph\";\n *\n * // Reference documents from your existing application database\n * const Document = defineNode(\"Document\", {\n * schema: z.object({\n * source: externalRef(\"documents\"),\n * embedding: embedding(1536).optional(),\n * extractedTopics: z.array(z.string()).optional(),\n * }),\n * });\n *\n * // Create a node referencing an external document\n * await store.nodes.Document.create({\n * source: { table: \"documents\", id: \"doc_abc123\" },\n * embedding: await generateEmbedding(docContent),\n * });\n *\n * // Query and hydrate with external data\n * const results = await store\n * .query()\n * .from(\"Document\", \"d\")\n * .whereNode(\"d\", (d) => d.embedding.similarTo(query, 10))\n * .select((ctx) => ctx.d.source)\n * .execute();\n *\n * // Fetch full data from your app database\n * const externalIds = results.map((r) => r.id);\n * const fullDocs = await appDb.query.documents.findMany({\n * where: inArray(documents.id, externalIds),\n * });\n * ```\n */\nexport function externalRef<T extends string>(table: T): ExternalRefSchema<T> {\n if (typeof table !== \"string\" || table.length === 0) {\n throw new Error(\n `External reference table must be a non-empty string, got: ${typeof table === \"string\" ? `\"${table}\"` : typeof table}`,\n );\n }\n\n const schema = z.object({\n table: z.literal(table),\n id: z.string().min(1, \"External reference ID must be non-empty\"),\n });\n\n // Attach table metadata for introspection\n return Object.assign(schema, {\n [EXTERNAL_REF_TABLE_KEY]: table,\n }) as unknown as ExternalRefSchema<T>;\n}\n\n// ============================================================\n// Type Guards\n// ============================================================\n\n/**\n * Checks if a value is an external reference schema.\n */\nexport function isExternalRefSchema(\n value: unknown,\n): value is ExternalRefSchema {\n return (\n typeof value === \"object\" &&\n value !== null &&\n EXTERNAL_REF_TABLE_KEY in value &&\n typeof (value as Record<string, unknown>)[EXTERNAL_REF_TABLE_KEY] ===\n \"string\"\n );\n}\n\n/**\n * Gets the table name from an external reference schema.\n * Returns undefined if the schema is not an external reference schema.\n */\nexport function getExternalRefTable(schema: z.ZodType): string | undefined {\n if (isExternalRefSchema(schema)) {\n return schema[EXTERNAL_REF_TABLE_KEY];\n }\n return undefined;\n}\n\n// ============================================================\n// Helper for creating reference values\n// ============================================================\n\n/**\n * Helper function to create a typed external reference value.\n * Useful when you want to avoid repeating the table name.\n *\n * @example\n * ```typescript\n * const docRef = createExternalRef(\"documents\");\n *\n * await store.nodes.Document.create({\n * source: docRef(\"doc_123\"),\n * embedding: [...],\n * });\n * ```\n */\nexport function createExternalRef<T extends string>(\n table: T,\n): (id: string) => ExternalRefValue<T> {\n return (id: string) => ({ table, id });\n}\n","import { type EdgeType, type NodeType } from \"../core/types\";\nimport {\n META_EDGE_BROADER,\n META_EDGE_DIFFERENT_FROM,\n META_EDGE_DISJOINT_WITH,\n META_EDGE_EQUIVALENT_TO,\n META_EDGE_HAS_PART,\n META_EDGE_IMPLIES,\n META_EDGE_INVERSE_OF,\n META_EDGE_NARROWER,\n META_EDGE_PART_OF,\n META_EDGE_RELATED_TO,\n META_EDGE_SAME_AS,\n META_EDGE_SUB_CLASS_OF,\n} from \"./constants\";\nimport { META_EDGE_BRAND, type MetaEdge, type OntologyRelation } from \"./types\";\n\n// ============================================================\n// Helper to Create Meta-Edge\n// ============================================================\n\nfunction createMetaEdge<K extends string>(\n name: K,\n properties: {\n transitive?: boolean;\n symmetric?: boolean;\n reflexive?: boolean;\n inverse?: string;\n inference:\n | \"subsumption\"\n | \"hierarchy\"\n | \"substitution\"\n | \"constraint\"\n | \"composition\"\n | \"association\"\n | \"none\";\n description: string;\n },\n): MetaEdge<K> {\n return Object.freeze({\n [META_EDGE_BRAND]: true as const,\n name,\n properties: {\n transitive: properties.transitive ?? false,\n symmetric: properties.symmetric ?? false,\n reflexive: properties.reflexive ?? false,\n inverse: properties.inverse,\n inference: properties.inference,\n description: properties.description,\n },\n }) as MetaEdge<K>;\n}\n\n// ============================================================\n// Subsumption & Classification\n// ============================================================\n\n/**\n * Type inheritance relationship.\n * A subClassOf B means instances of A are also instances of B.\n */\nconst subClassOfMetaEdge = createMetaEdge(META_EDGE_SUB_CLASS_OF, {\n transitive: true,\n inference: \"subsumption\",\n description: \"Type inheritance (Podcast subClassOf Media)\",\n});\n\n/**\n * Creates a subClassOf ontology relation.\n */\nexport function subClassOf(\n child: NodeType,\n parent: NodeType,\n): OntologyRelation {\n return {\n metaEdge: subClassOfMetaEdge,\n from: child,\n to: parent,\n };\n}\n\n// ============================================================\n// Hierarchical (SKOS-inspired)\n// ============================================================\n\n/**\n * Broader concept relationship.\n * A broader B means A is a more specific concept than B.\n */\nconst broaderMetaEdge = createMetaEdge(META_EDGE_BROADER, {\n transitive: true,\n inverse: META_EDGE_NARROWER,\n inference: \"hierarchy\",\n description: \"Broader concept (ML broader AI)\",\n});\n\n/**\n * Creates a broader ontology relation.\n */\nexport function broader(\n narrowerConcept: NodeType,\n broaderConcept: NodeType,\n): OntologyRelation {\n return {\n metaEdge: broaderMetaEdge,\n from: narrowerConcept,\n to: broaderConcept,\n };\n}\n\n/**\n * Narrower concept relationship.\n * A narrower B means A is a more general concept than B.\n */\nconst narrowerMetaEdge = createMetaEdge(META_EDGE_NARROWER, {\n transitive: true,\n inverse: META_EDGE_BROADER,\n inference: \"hierarchy\",\n description: \"Narrower concept (AI narrower ML)\",\n});\n\n/**\n * Creates a narrower ontology relation.\n */\nexport function narrower(\n broaderConcept: NodeType,\n narrowerConcept: NodeType,\n): OntologyRelation {\n return {\n metaEdge: narrowerMetaEdge,\n from: broaderConcept,\n to: narrowerConcept,\n };\n}\n\n/**\n * Related concept relationship.\n * Non-hierarchical association between concepts.\n */\nconst relatedToMetaEdge = createMetaEdge(META_EDGE_RELATED_TO, {\n symmetric: true,\n inference: \"association\",\n description: \"Non-hierarchical association\",\n});\n\n/**\n * Creates a relatedTo ontology relation.\n */\nexport function relatedTo(\n conceptA: NodeType,\n conceptB: NodeType,\n): OntologyRelation {\n return {\n metaEdge: relatedToMetaEdge,\n from: conceptA,\n to: conceptB,\n };\n}\n\n// ============================================================\n// Equivalence & Identity (OWL-inspired)\n// ============================================================\n\n/**\n * Type equivalence relationship.\n * A equivalentTo B means they represent the same class.\n */\nconst equivalentToMetaEdge = createMetaEdge(META_EDGE_EQUIVALENT_TO, {\n symmetric: true,\n transitive: true,\n inference: \"substitution\",\n description: \"Same class, different representation\",\n});\n\n/**\n * Creates an equivalentTo ontology relation.\n * Can be used with external IRIs for cross-system mapping.\n */\nexport function equivalentTo(\n kindA: NodeType,\n kindBOrIri: NodeType | string,\n): OntologyRelation {\n return {\n metaEdge: equivalentToMetaEdge,\n from: kindA,\n to: kindBOrIri,\n };\n}\n\n/**\n * Instance identity relationship.\n * A sameAs B means they refer to the same individual.\n */\nconst sameAsMetaEdge = createMetaEdge(META_EDGE_SAME_AS, {\n symmetric: true,\n transitive: true,\n inference: \"substitution\",\n description: \"Same individual (for deduplication)\",\n});\n\n/**\n * Creates a sameAs ontology relation.\n */\nexport function sameAs(\n kindA: NodeType,\n kindBOrIri: NodeType | string,\n): OntologyRelation {\n return {\n metaEdge: sameAsMetaEdge,\n from: kindA,\n to: kindBOrIri,\n };\n}\n\n/**\n * Explicit non-identity relationship.\n * A differentFrom B means they are definitely different individuals.\n */\nconst differentFromMetaEdge = createMetaEdge(META_EDGE_DIFFERENT_FROM, {\n symmetric: true,\n inference: \"constraint\",\n description: \"Explicitly different individuals\",\n});\n\n/**\n * Creates a differentFrom ontology relation.\n */\nexport function differentFrom(\n kindA: NodeType,\n kindB: NodeType,\n): OntologyRelation {\n return {\n metaEdge: differentFromMetaEdge,\n from: kindA,\n to: kindB,\n };\n}\n\n/**\n * Disjoint types relationship.\n * A disjointWith B means nothing can be both an A and a B.\n */\nconst disjointWithMetaEdge = createMetaEdge(META_EDGE_DISJOINT_WITH, {\n symmetric: true,\n inference: \"constraint\",\n description: \"Mutually exclusive types\",\n});\n\n/**\n * Creates a disjointWith ontology relation.\n */\nexport function disjointWith(\n kindA: NodeType,\n kindB: NodeType,\n): OntologyRelation {\n return {\n metaEdge: disjointWithMetaEdge,\n from: kindA,\n to: kindB,\n };\n}\n\n// ============================================================\n// Mereological (Part-Whole)\n// ============================================================\n\n/**\n * Part-of relationship.\n * A partOf B means A is a component of B.\n */\nconst partOfMetaEdge = createMetaEdge(META_EDGE_PART_OF, {\n transitive: true,\n inverse: META_EDGE_HAS_PART,\n inference: \"composition\",\n description: \"X is part of Y\",\n});\n\n/**\n * Creates a partOf ontology relation.\n */\nexport function partOf(part: NodeType, whole: NodeType): OntologyRelation {\n return {\n metaEdge: partOfMetaEdge,\n from: part,\n to: whole,\n };\n}\n\n/**\n * Has-part relationship.\n * A hasPart B means A contains B as a component.\n */\nconst hasPartMetaEdge = createMetaEdge(META_EDGE_HAS_PART, {\n transitive: true,\n inverse: META_EDGE_PART_OF,\n inference: \"composition\",\n description: \"Y has part X\",\n});\n\n/**\n * Creates a hasPart ontology relation.\n */\nexport function hasPart(whole: NodeType, part: NodeType): OntologyRelation {\n return {\n metaEdge: hasPartMetaEdge,\n from: whole,\n to: part,\n };\n}\n\n// ============================================================\n// Property Relationships\n// ============================================================\n\n/**\n * Inverse edge relationship.\n * Edge A inverseOf edge B means traversing A is equivalent to traversing B backwards.\n */\nconst inverseOfMetaEdge = createMetaEdge(META_EDGE_INVERSE_OF, {\n symmetric: true,\n inference: \"none\",\n description: \"Edge A is inverse of edge B\",\n});\n\n/**\n * Implication relationship.\n * Edge A implies edge B means if A exists, B should also exist.\n */\nconst impliesMetaEdge = createMetaEdge(META_EDGE_IMPLIES, {\n transitive: true,\n inference: \"none\",\n description: \"Edge A implies edge B exists\",\n});\n\n/**\n * Creates an inverseOf ontology relation.\n * Edge A inverseOf edge B means traversing A is equivalent to traversing B backwards.\n */\nexport function inverseOf(edgeA: EdgeType, edgeB: EdgeType): OntologyRelation {\n return {\n metaEdge: inverseOfMetaEdge,\n from: edgeA,\n to: edgeB,\n };\n}\n\n/**\n * Creates an implies ontology relation.\n * Edge A implies edge B means if A exists between two nodes, B should also exist.\n */\nexport function implies(edgeA: EdgeType, edgeB: EdgeType): OntologyRelation {\n return {\n metaEdge: impliesMetaEdge,\n from: edgeA,\n to: edgeB,\n };\n}\n\n// ============================================================\n// Core Ontology Export\n// ============================================================\n\n/**\n * The core ontology module containing all built-in meta-edges\n * and their relation factory functions.\n */\nexport const core = {\n // Meta-edges\n subClassOfMetaEdge,\n broaderMetaEdge,\n narrowerMetaEdge,\n relatedToMetaEdge,\n equivalentToMetaEdge,\n sameAsMetaEdge,\n differentFromMetaEdge,\n disjointWithMetaEdge,\n partOfMetaEdge,\n hasPartMetaEdge,\n inverseOfMetaEdge,\n impliesMetaEdge,\n\n // Relation factories\n subClassOf,\n broader,\n narrower,\n relatedTo,\n equivalentTo,\n sameAs,\n differentFrom,\n disjointWith,\n partOf,\n hasPart,\n inverseOf,\n implies,\n} as const;\n","import {\n CompilerInvariantError,\n UnsupportedPredicateError,\n} from \"../../../errors\";\nimport type { QueryAst, Traversal, VariableLengthSpec } from \"../../ast\";\n\n/**\n * Traversal with required variable-length spec.\n */\nexport type VariableLengthTraversal = Traversal & {\n variableLength: VariableLengthSpec;\n};\n\n/**\n * Selects and validates the variable-length traversal target for recursive compilation.\n *\n * Invariants:\n * - Query must contain exactly one variable-length traversal.\n * - Recursive mode currently supports only a single traversal in the query.\n */\nexport function runRecursiveTraversalSelectionPass(\n ast: QueryAst,\n): VariableLengthTraversal {\n const variableLengthTraversal = ast.traversals.find(\n (traversal): traversal is VariableLengthTraversal =>\n traversal.variableLength !== undefined,\n );\n\n if (variableLengthTraversal === undefined) {\n throw new CompilerInvariantError(\"No variable-length traversal found\");\n }\n\n if (ast.traversals.length > 1) {\n throw new UnsupportedPredicateError(\n \"Variable-length traversals with multiple traversals are not yet supported. \" +\n \"Please use a single variable-length traversal.\",\n );\n }\n\n return variableLengthTraversal;\n}\n","export type CompilerPass<TState, TPassName extends string, TOutput> = Readonly<{\n name: TPassName;\n execute: (state: TState) => TOutput;\n update: (state: TState, output: TOutput) => TState;\n}>;\n\nexport type CompilerPassResult<TState> = Readonly<{\n state: TState;\n}>;\n\nexport function runCompilerPass<TState, TPassName extends string, TOutput>(\n state: TState,\n pass: CompilerPass<TState, TPassName, TOutput>,\n): CompilerPassResult<TState> {\n const output = pass.execute(state);\n return {\n state: pass.update(state, output),\n };\n}\n","/**\n * Temporal Filter Compilation\n *\n * Generates SQL clauses for temporal filtering based on valid_from/valid_to\n * and deleted_at timestamps. Consolidates the previously duplicated temporal\n * filter functions into a single, parameterized implementation.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { type TemporalMode } from \"../../core/types\";\n\n/**\n * Temporal filter options.\n */\nexport type TemporalFilterOptions = Readonly<{\n /** The temporal mode to apply */\n mode: TemporalMode;\n /** Timestamp for asOf queries (required when mode is \"asOf\") */\n asOf?: string | undefined;\n /** Optional table alias prefix for column references */\n tableAlias?: string | undefined;\n /** Optional execution-time current timestamp SQL expression */\n currentTimestamp?: SQL | undefined;\n}>;\n\n/**\n * Compiles a temporal filter to SQL.\n *\n * This is the unified temporal filter function that handles all temporal modes\n * and optional table alias prefixes. It replaces the previous three separate\n * functions (compileTemporalFilter, compileEdgeTemporalFilter, compileNodeTemporalFilter).\n *\n * @param options - Temporal filter configuration\n * @returns SQL clause for the temporal filter\n *\n * @example\n * ```typescript\n * // Without table alias (for CTEs)\n * compileTemporalFilter({ mode: \"current\" })\n * // → deleted_at IS NULL AND (valid_from IS NULL OR ...) AND ...\n *\n * // With table alias (for JOINs)\n * compileTemporalFilter({ mode: \"current\", tableAlias: \"e\" })\n * // → e.deleted_at IS NULL AND (e.valid_from IS NULL OR ...) AND ...\n *\n * // AsOf mode\n * compileTemporalFilter({ mode: \"asOf\", asOf: \"2024-01-01T00:00:00Z\" })\n * // → deleted_at IS NULL AND (valid_from IS NULL OR valid_from <= '2024-01-01...') AND ...\n * ```\n */\nexport function compileTemporalFilter(options: TemporalFilterOptions): SQL {\n const { mode, asOf, tableAlias, currentTimestamp } = options;\n\n // Build column references with optional prefix\n const prefix = tableAlias ? sql.raw(`${tableAlias}.`) : sql.raw(\"\");\n const deletedAt = sql`${prefix}deleted_at`;\n const validFrom = sql`${prefix}valid_from`;\n const validTo = sql`${prefix}valid_to`;\n\n switch (mode) {\n case \"current\": {\n const now = currentTimestamp ?? sql`CURRENT_TIMESTAMP`;\n return sql`${deletedAt} IS NULL AND (${validFrom} IS NULL OR ${validFrom} <= ${now}) AND (${validTo} IS NULL OR ${validTo} > ${now})`;\n }\n\n case \"asOf\": {\n // asOf is guaranteed to be defined - validated in QueryBuilder.temporal()\n const timestamp = asOf!;\n return sql`${deletedAt} IS NULL AND (${validFrom} IS NULL OR ${validFrom} <= ${timestamp}) AND (${validTo} IS NULL OR ${validTo} > ${timestamp})`;\n }\n\n case \"includeEnded\": {\n // Include records that have ended but not been deleted\n return sql`${deletedAt} IS NULL`;\n }\n\n case \"includeTombstones\": {\n // Include everything, no filter\n return sql.raw(\"1=1\");\n }\n }\n}\n\n/**\n * Extracts temporal options from a query AST.\n *\n * @param ast - Query AST with temporalMode\n * @param tableAlias - Optional table alias for column references\n * @returns TemporalFilterOptions for use with compileTemporalFilter\n */\nexport function extractTemporalOptions(\n ast: { temporalMode: { mode: TemporalMode; asOf?: string } },\n tableAlias?: string,\n): TemporalFilterOptions {\n return {\n mode: ast.temporalMode.mode,\n asOf: ast.temporalMode.asOf,\n tableAlias,\n };\n}\n","import { type SQL } from \"drizzle-orm\";\n\nimport type { QueryAst } from \"../../ast\";\nimport { compileTemporalFilter, extractTemporalOptions } from \"../temporal\";\n\nexport type TemporalFilterPass = Readonly<{\n forAlias: (tableAlias?: string) => SQL;\n}>;\n\n/**\n * Creates a temporal filter pass bound to a query AST and timestamp source.\n *\n * Invariant:\n * - All temporal clauses for a query use the same timestamp expression.\n */\nexport function createTemporalFilterPass(\n ast: QueryAst,\n currentTimestamp: SQL,\n): TemporalFilterPass {\n return {\n forAlias(tableAlias?: string): SQL {\n return compileTemporalFilter({\n ...extractTemporalOptions(ast, tableAlias),\n currentTimestamp,\n });\n },\n };\n}\n","/**\n * Shared utilities for subquery projection shape and type handling.\n */\nimport { type AggregateExpr, type QueryAst, type ValueType } from \"./ast\";\n\n/**\n * Normalizes a value type by treating \"unknown\" as undefined.\n */\nfunction normalizeValueType(valueType?: ValueType): ValueType | undefined {\n if (valueType === undefined || valueType === \"unknown\") {\n return undefined;\n }\n return valueType;\n}\n\n/**\n * Returns true when the type cannot be compared with IN/NOT IN.\n */\nexport function isUnsupportedInSubqueryValueType(\n valueType?: ValueType,\n): boolean {\n const normalized = normalizeValueType(valueType);\n return (\n normalized === \"array\" ||\n normalized === \"object\" ||\n normalized === \"embedding\"\n );\n}\n\n/**\n * Returns true when two value types are compatible for IN/NOT IN.\n *\n * Unknown types are treated as compatible (deferred to runtime) to preserve\n * flexibility for untyped fields.\n */\nexport function isInSubqueryTypeCompatible(\n left?: ValueType,\n right?: ValueType,\n): boolean {\n const normalizedLeft = normalizeValueType(left);\n const normalizedRight = normalizeValueType(right);\n\n if (normalizedLeft === undefined || normalizedRight === undefined) {\n return true;\n }\n\n return normalizedLeft === normalizedRight;\n}\n\n/**\n * Resolves the value type produced by an aggregate projection.\n */\nfunction getAggregateValueType(\n aggregate: AggregateExpr,\n): ValueType | undefined {\n switch (aggregate.function) {\n case \"count\":\n case \"countDistinct\":\n case \"sum\":\n case \"avg\": {\n return \"number\";\n }\n case \"min\":\n case \"max\": {\n return normalizeValueType(aggregate.field.valueType);\n }\n }\n}\n\n/**\n * Returns effective projected column value types for a subquery.\n *\n * If selective fields are present, they represent the effective projection.\n * Otherwise, falls back to the explicit projection fields.\n */\nfunction getProjectedValueTypes(\n subquery: QueryAst,\n): readonly (ValueType | undefined)[] {\n if (subquery.selectiveFields && subquery.selectiveFields.length > 0) {\n return subquery.selectiveFields.map((field) =>\n normalizeValueType(field.valueType),\n );\n }\n\n return subquery.projection.fields.map((field) => {\n if (field.source.__type === \"aggregate\") {\n return getAggregateValueType(field.source);\n }\n return normalizeValueType(field.source.valueType);\n });\n}\n\n/**\n * Returns the effective number of columns projected by a subquery.\n */\nexport function getSubqueryColumnCount(subquery: QueryAst): number {\n return getProjectedValueTypes(subquery).length;\n}\n\n/**\n * Returns the value type when a subquery projects exactly one column.\n */\nexport function getSingleSubqueryColumnValueType(\n subquery: QueryAst,\n): ValueType | undefined {\n const valueTypes = getProjectedValueTypes(subquery);\n if (valueTypes.length !== 1) {\n return undefined;\n }\n return valueTypes[0];\n}\n","/**\n * Predicate builders for TypeGraph queries.\n *\n * Provides a fluent API for building type-safe predicates.\n */\nimport { UnsupportedPredicateError } from \"../errors\";\nimport {\n type ArrayOp,\n type ArrayPredicate,\n type BetweenPredicate,\n type ComparisonOp,\n type ComparisonPredicate,\n type ExistsSubquery,\n type FieldRef,\n type InSubquery,\n type LiteralValue,\n type NullPredicate,\n type ObjectOp,\n type ObjectPredicate,\n type ParameterRef,\n type PredicateExpression,\n type QueryAst,\n type StringOp,\n type StringPredicate,\n type ValueType,\n type VectorMetricType,\n type VectorSimilarityPredicate,\n} from \"./ast\";\nimport { resolveFieldTypeInfoAtJsonPointer } from \"./field-type-info\";\nimport {\n joinJsonPointers,\n type JsonPointer,\n jsonPointer,\n type JsonPointerInput,\n type JsonPointerSegment,\n normalizeJsonPointer,\n type ResolveJsonPointer,\n type ResolveJsonPointerSegments,\n} from \"./json-pointer\";\nimport { type FieldTypeInfo } from \"./schema-introspector\";\nimport {\n getSingleSubqueryColumnValueType,\n getSubqueryColumnCount,\n isInSubqueryTypeCompatible,\n isUnsupportedInSubqueryValueType,\n} from \"./subquery-utils\";\n\n// ============================================================\n// Predicate Builder\n// ============================================================\n\n/**\n * A chainable predicate that can be combined with AND/OR.\n */\nexport type Predicate = Readonly<{\n __expr: PredicateExpression;\n and: (other: Predicate) => Predicate;\n or: (other: Predicate) => Predicate;\n not: () => Predicate;\n}>;\n\n/**\n * Creates a predicate wrapper with chainable methods.\n */\nfunction predicate(expr: PredicateExpression): Predicate {\n return {\n __expr: expr,\n and: (other: Predicate): Predicate =>\n predicate({\n __type: \"and\",\n predicates: [expr, other.__expr],\n }),\n or: (other: Predicate): Predicate =>\n predicate({\n __type: \"or\",\n predicates: [expr, other.__expr],\n }),\n not: (): Predicate =>\n predicate({\n __type: \"not\",\n predicate: expr,\n }),\n };\n}\n\n// ============================================================\n// Parameter References\n// ============================================================\n\n/**\n * Creates a named parameter reference for prepared queries.\n *\n * Use with `query.prepare()` to create reusable parameterized queries.\n * Only supported in scalar comparison positions (eq, neq, gt, etc.),\n * string operations, and between bounds. Not supported in `in()`/`notIn()`.\n *\n * @example\n * ```typescript\n * const prepared = store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(param(\"name\")))\n * .select((ctx) => ctx.p)\n * .prepare();\n *\n * const results = await prepared.execute({ name: \"Alice\" });\n * ```\n */\n// eslint-disable-next-line unicorn/prevent-abbreviations -- concise public API\nexport function param(name: string): ParameterRef {\n return { __type: \"parameter\", name };\n}\n\n/**\n * Type guard for ParameterRef values.\n */\nexport function isParameterRef(value: unknown): value is ParameterRef {\n if (typeof value !== \"object\" || value === null) return false;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime guard for untyped input\n return (value as ParameterRef).__type === \"parameter\";\n}\n\n// ============================================================\n// Field Builder\n// ============================================================\n\n/**\n * A typed field builder for creating predicates.\n */\ntype FieldBuilder<T> =\n [T] extends [string] ? StringFieldBuilder\n : [T] extends [number] ? NumberFieldBuilder\n : [T] extends [boolean] ? BooleanFieldBuilder\n : [T] extends [Date] ? DateFieldBuilder\n : [T] extends [readonly (infer U)[]] ? ArrayFieldBuilder<U>\n : [T] extends [Record<string, unknown>] ? ObjectFieldBuilder<T>\n : BaseFieldBuilder;\n\n/**\n * Base field operations available on all types.\n */\ntype BaseFieldBuilder = Readonly<{\n eq: (value: unknown) => Predicate;\n neq: (value: unknown) => Predicate;\n isNull: () => Predicate;\n isNotNull: () => Predicate;\n in: (values: readonly unknown[]) => Predicate;\n notIn: (values: readonly unknown[]) => Predicate;\n}>;\n\n/**\n * String-specific field operations.\n */\ntype StringFieldBuilder = BaseFieldBuilder &\n Readonly<{\n contains: (pattern: string | ParameterRef) => Predicate;\n startsWith: (pattern: string | ParameterRef) => Predicate;\n endsWith: (pattern: string | ParameterRef) => Predicate;\n like: (pattern: string | ParameterRef) => Predicate;\n ilike: (pattern: string | ParameterRef) => Predicate;\n }>;\n\n/**\n * Number-specific field operations.\n */\ntype NumberFieldBuilder = BaseFieldBuilder &\n Readonly<{\n gt: (value: number | ParameterRef) => Predicate;\n gte: (value: number | ParameterRef) => Predicate;\n lt: (value: number | ParameterRef) => Predicate;\n lte: (value: number | ParameterRef) => Predicate;\n between: (\n lower: number | ParameterRef,\n upper: number | ParameterRef,\n ) => Predicate;\n }>;\n\n/**\n * Boolean-specific field operations.\n */\ntype BooleanFieldBuilder = BaseFieldBuilder;\n\n/**\n * Date-specific field operations.\n */\ntype DateFieldBuilder = BaseFieldBuilder &\n Readonly<{\n gt: (value: Date | string | ParameterRef) => Predicate;\n gte: (value: Date | string | ParameterRef) => Predicate;\n lt: (value: Date | string | ParameterRef) => Predicate;\n lte: (value: Date | string | ParameterRef) => Predicate;\n between: (\n lower: Date | string | ParameterRef,\n upper: Date | string | ParameterRef,\n ) => Predicate;\n }>;\n\ntype ScalarValue = string | number | boolean | Date;\n\ntype ArrayPredicateOps<T> =\n [T] extends [ScalarValue] ?\n Readonly<{\n /** Check if array contains a specific value */\n contains: (value: T) => Predicate;\n /** Check if array contains all specified values */\n containsAll: (values: readonly T[]) => Predicate;\n /** Check if array contains any of the specified values (overlaps) */\n containsAny: (values: readonly T[]) => Predicate;\n }>\n : Readonly<Record<string, never>>;\n\n/**\n * Array-specific field operations.\n */\ntype ArrayFieldBuilder<T = unknown> = BaseFieldBuilder &\n Readonly<{\n /** Check if array is empty */\n isEmpty: () => Predicate;\n /** Check if array is not empty */\n isNotEmpty: () => Predicate;\n /** Check if array length equals a value */\n lengthEq: (length: number) => Predicate;\n /** Check if array length is greater than a value */\n lengthGt: (length: number) => Predicate;\n /** Check if array length is greater than or equal to a value */\n lengthGte: (length: number) => Predicate;\n /** Check if array length is less than a value */\n lengthLt: (length: number) => Predicate;\n /** Check if array length is less than or equal to a value */\n lengthLte: (length: number) => Predicate;\n }> &\n ArrayPredicateOps<T>;\n\n/**\n * Object/JSON-specific field operations.\n */\ntype ResolvedPointerInput<T, Pointer> =\n Pointer extends string ? ResolveJsonPointer<T, Pointer>\n : Pointer extends readonly JsonPointerSegment[] ?\n ResolveJsonPointerSegments<T, Pointer>\n : unknown;\n\n/**\n * Resolves the type of a nested key access on an object type.\n * Returns ObjectFieldBuilder for nested objects, FieldBuilder for scalars.\n */\ntype NestedFieldBuilder<T, K extends keyof T> =\n NonNullable<T[K]> extends Record<string, unknown> ?\n ObjectFieldBuilder<NonNullable<T[K]>>\n : FieldBuilder<T[K]>;\n\ntype ObjectFieldBuilder<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = BaseFieldBuilder &\n Readonly<{\n /** Access a nested field by key for fluent chaining */\n get: <K extends keyof T & string>(key: K) => NestedFieldBuilder<T, K>;\n /** Check if object has a specific key at root level */\n hasKey: (key: string) => Predicate;\n /** Check if object has a nested path (JSON Pointer) */\n hasPath: <P extends JsonPointerInput<T>>(pointer: P) => Predicate;\n /** Check if value at path equals a value */\n pathEquals: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => Predicate;\n /** Check if value at path (array) contains a value */\n pathContains: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => Predicate;\n /** Check if value at path is null */\n pathIsNull: <P extends JsonPointerInput<T>>(pointer: P) => Predicate;\n /** Check if value at path is not null */\n pathIsNotNull: <P extends JsonPointerInput<T>>(pointer: P) => Predicate;\n /** Access a nested field to get a typed field builder */\n field: <P extends JsonPointerInput<T>>(\n pointer: P,\n ) => FieldBuilder<ResolvedPointerInput<T, P>>;\n }>;\n\n/**\n * Options for the similarTo method.\n */\nexport type SimilarToOptions = Readonly<{\n /** Similarity metric to use. Default: \"cosine\" */\n metric?: VectorMetricType;\n /**\n * Minimum similarity score to include results.\n * For cosine: 0-1 where 1 is identical.\n * For L2: maximum distance to include.\n * For inner_product: minimum inner product value.\n */\n minScore?: number;\n}>;\n\n/**\n * Embedding-specific field operations for vector similarity search.\n */\ntype EmbeddingFieldBuilder = BaseFieldBuilder &\n Readonly<{\n /**\n * Find nodes with similar embeddings.\n * Returns results ordered by similarity (most similar first).\n *\n * @param queryEmbedding - The embedding vector to compare against\n * @param k - Maximum number of results to return (top-k)\n * @param options - Optional configuration (metric, minScore)\n *\n * @example\n * ```typescript\n * store.query()\n * .from(\"Document\", \"d\")\n * .whereNode(\"d\", (d) =>\n * d.embedding.similarTo(queryVector, 10, { metric: \"cosine\" })\n * )\n * .select((ctx) => ({ doc: ctx.d }))\n * .execute()\n * ```\n */\n similarTo: (\n queryEmbedding: readonly number[],\n k: number,\n options?: SimilarToOptions,\n ) => Predicate;\n }>;\n\n// ============================================================\n// Field Builder Factory\n// ============================================================\n\n/**\n * Creates a field reference.\n */\ntype FieldRefOptions = Readonly<{\n jsonPointer?: JsonPointer | undefined;\n valueType?: ValueType | undefined;\n elementType?: ValueType | undefined;\n}>;\n\nexport function fieldRef(\n alias: string,\n path: readonly string[],\n options?: FieldRefOptions,\n): FieldRef {\n return {\n __type: \"field_ref\",\n alias,\n path,\n ...(options?.jsonPointer !== undefined && {\n jsonPointer: options.jsonPointer,\n }),\n ...(options?.valueType !== undefined && { valueType: options.valueType }),\n ...(options?.elementType !== undefined && {\n elementType: options.elementType,\n }),\n };\n}\n\nfunction coerceLiteralValue(value: unknown): string | number | boolean | Date {\n if (value instanceof Date) {\n return value;\n }\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n throw new Error(`Unsupported literal value type: ${typeof value}`);\n}\n\nfunction inferLiteralValueType(value: string | number | boolean): ValueType {\n if (typeof value === \"string\") {\n return \"string\";\n }\n if (typeof value === \"number\") {\n return \"number\";\n }\n return \"boolean\";\n}\n\n/**\n * Creates a literal value.\n */\nfunction literal(value: string | number | boolean | Date): LiteralValue {\n if (value instanceof Date) {\n return { __type: \"literal\", value: value.toISOString(), valueType: \"date\" };\n }\n const valueType = inferLiteralValueType(value);\n return {\n __type: \"literal\",\n value,\n valueType,\n };\n}\n\n/**\n * Creates a comparison predicate.\n */\nfunction comparison(\n op: ComparisonOp,\n field: FieldRef,\n value: unknown,\n): Predicate {\n if (isParameterRef(value)) {\n const expr: ComparisonPredicate = {\n __type: \"comparison\",\n op,\n left: field,\n right: value,\n };\n return predicate(expr);\n }\n const coercedValue = coerceLiteralValue(value);\n const expr: ComparisonPredicate = {\n __type: \"comparison\",\n op,\n left: field,\n right: literal(coercedValue),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an IN comparison predicate.\n */\nfunction inComparison(\n op: \"in\" | \"notIn\",\n field: FieldRef,\n values: readonly unknown[],\n): Predicate {\n const literals = values.map((value) => literal(coerceLiteralValue(value)));\n const expr: ComparisonPredicate = {\n __type: \"comparison\",\n op,\n left: field,\n right: literals,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a string operation predicate.\n */\nfunction stringOp(\n op: StringOp,\n field: FieldRef,\n pattern: string | ParameterRef,\n): Predicate {\n if (isParameterRef(pattern)) {\n const expr: StringPredicate = {\n __type: \"string_op\",\n op,\n field,\n pattern,\n };\n return predicate(expr);\n }\n const expr: StringPredicate = {\n __type: \"string_op\",\n op,\n field,\n pattern,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a null check predicate.\n */\nfunction nullCheck(op: \"isNull\" | \"isNotNull\", field: FieldRef): Predicate {\n const expr: NullPredicate = {\n __type: \"null_check\",\n op,\n field,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a between predicate.\n */\nfunction between(\n field: FieldRef,\n lower: string | number | boolean | Date | ParameterRef,\n upper: string | number | boolean | Date | ParameterRef,\n): Predicate {\n const expr: BetweenPredicate = {\n __type: \"between\",\n field,\n lower: isParameterRef(lower) ? lower : literal(lower),\n upper: isParameterRef(upper) ? upper : literal(upper),\n };\n return predicate(expr);\n}\n\n/**\n * Creates a base field builder with common operations.\n */\nfunction baseFieldBuilder(field: FieldRef): BaseFieldBuilder {\n return {\n eq: (value) => comparison(\"eq\", field, value),\n neq: (value) => comparison(\"neq\", field, value),\n isNull: () => nullCheck(\"isNull\", field),\n isNotNull: () => nullCheck(\"isNotNull\", field),\n in: (values) => inComparison(\"in\", field, values),\n notIn: (values) => inComparison(\"notIn\", field, values),\n };\n}\n\n/**\n * Creates a string field builder.\n */\nexport function stringField(field: FieldRef): StringFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n contains: (pattern) => stringOp(\"contains\", field, pattern),\n startsWith: (pattern) => stringOp(\"startsWith\", field, pattern),\n endsWith: (pattern) => stringOp(\"endsWith\", field, pattern),\n like: (pattern) => stringOp(\"like\", field, pattern),\n ilike: (pattern) => stringOp(\"ilike\", field, pattern),\n };\n}\n\n/**\n * Creates a number field builder.\n */\nexport function numberField(field: FieldRef): NumberFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n gt: (value) => comparison(\"gt\", field, value),\n gte: (value) => comparison(\"gte\", field, value),\n lt: (value) => comparison(\"lt\", field, value),\n lte: (value) => comparison(\"lte\", field, value),\n between: (lower, upper) => between(field, lower, upper),\n };\n}\n\n/**\n * Creates a date field builder.\n */\nexport function dateField(field: FieldRef): DateFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n gt: (value) => comparison(\"gt\", field, value),\n gte: (value) => comparison(\"gte\", field, value),\n lt: (value) => comparison(\"lt\", field, value),\n lte: (value) => comparison(\"lte\", field, value),\n between: (lower, upper) => between(field, lower, upper),\n };\n}\n\n/**\n * Creates a base field builder (for booleans, enums, and unknown types).\n * Only provides the fundamental operations: eq, neq, isNull, isNotNull, in, notIn.\n */\nexport function baseField(field: FieldRef): BaseFieldBuilder {\n return baseFieldBuilder(field);\n}\n\n/**\n * Creates an array operation predicate.\n */\nfunction arrayOp(\n op: ArrayOp,\n field: FieldRef,\n values?: readonly unknown[],\n length?: number,\n): Predicate {\n const expr: ArrayPredicate = {\n __type: \"array_op\",\n op,\n field,\n ...(values !== undefined && {\n values: values.map((value) => literal(coerceLiteralValue(value))),\n }),\n ...(length !== undefined && { length }),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an array field builder.\n */\nexport function arrayField<T = unknown>(field: FieldRef): ArrayFieldBuilder<T> {\n // The type assertion is needed because ArrayFieldBuilder conditionally includes\n // contains/containsAll/containsAny based on whether T extends ScalarValue.\n // At runtime we always provide them - they just won't type-check if T isn't scalar.\n return {\n ...baseFieldBuilder(field),\n contains: (value: T) => arrayOp(\"contains\", field, [value]),\n containsAll: (values: readonly T[]) =>\n arrayOp(\"containsAll\", field, values),\n containsAny: (values: readonly T[]) =>\n arrayOp(\"containsAny\", field, values),\n isEmpty: () => arrayOp(\"isEmpty\", field),\n isNotEmpty: () => arrayOp(\"isNotEmpty\", field),\n lengthEq: (length: number) => arrayOp(\"lengthEq\", field, undefined, length),\n lengthGt: (length: number) => arrayOp(\"lengthGt\", field, undefined, length),\n lengthGte: (length: number) =>\n arrayOp(\"lengthGte\", field, undefined, length),\n lengthLt: (length: number) => arrayOp(\"lengthLt\", field, undefined, length),\n lengthLte: (length: number) =>\n arrayOp(\"lengthLte\", field, undefined, length),\n } as unknown as ArrayFieldBuilder<T>;\n}\n\n/**\n * Creates a vector similarity predicate.\n */\nfunction vectorSimilarity(\n field: FieldRef,\n queryEmbedding: readonly number[],\n limit: number,\n options?: SimilarToOptions,\n): Predicate {\n const expr: VectorSimilarityPredicate = {\n __type: \"vector_similarity\",\n field,\n queryEmbedding,\n metric: options?.metric ?? \"cosine\",\n limit,\n ...(options?.minScore !== undefined && { minScore: options.minScore }),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an embedding field builder for vector similarity search.\n */\nexport function embeddingField(field: FieldRef): EmbeddingFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n similarTo: (queryEmbedding, k, options) =>\n vectorSimilarity(field, queryEmbedding, k, options),\n };\n}\n\nfunction buildFieldBuilderForTypeInfo(\n field: FieldRef,\n typeInfo: FieldTypeInfo | undefined,\n): BaseFieldBuilder {\n if (!typeInfo) {\n return baseField(field);\n }\n\n switch (typeInfo.valueType) {\n case \"string\": {\n return stringField(field);\n }\n case \"number\": {\n return numberField(field);\n }\n case \"boolean\": {\n return baseField(field);\n }\n case \"date\": {\n return dateField(field);\n }\n case \"array\": {\n return arrayField(field);\n }\n case \"object\": {\n return objectField(field, { typeInfo });\n }\n case \"embedding\": {\n return embeddingField(field);\n }\n case \"unknown\": {\n return baseField(field);\n }\n }\n}\n\nfunction resolvePointerTypeInfo(\n typeInfo: FieldTypeInfo | undefined,\n pointer: JsonPointer,\n): FieldTypeInfo | undefined {\n return resolveFieldTypeInfoAtJsonPointer(typeInfo, pointer);\n}\n\n/**\n * Creates an object operation predicate.\n */\ntype ObjectPredicateOptions = Readonly<{\n valueType?: ValueType;\n elementType?: ValueType;\n}>;\n\nfunction objectOp(\n op: ObjectOp,\n field: FieldRef,\n pointer: JsonPointer,\n value?: unknown,\n options?: ObjectPredicateOptions,\n): Predicate {\n const expr: ObjectPredicate = {\n __type: \"object_op\",\n op,\n field,\n pointer,\n ...(value !== undefined && {\n value: literal(coerceLiteralValue(value)),\n }),\n ...(options?.valueType !== undefined && { valueType: options.valueType }),\n ...(options?.elementType !== undefined && {\n elementType: options.elementType,\n }),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an object/JSON field builder.\n */\ntype ObjectFieldOptions = Readonly<{\n typeInfo?: FieldTypeInfo;\n}>;\n\nexport function objectField<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(field: FieldRef, options?: ObjectFieldOptions): ObjectFieldBuilder<T> {\n const basePointer = field.jsonPointer;\n\n return {\n ...baseFieldBuilder(field),\n get: <K extends keyof T & string>(key: K) => {\n const pointer = jsonPointer([key]);\n const nestedPointer = joinJsonPointers(basePointer, pointer);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, pointer);\n const nestedRef = fieldRef(field.alias, field.path, {\n jsonPointer: nestedPointer,\n ...(resolved?.valueType !== undefined && {\n valueType: resolved.valueType,\n }),\n ...(resolved?.elementType !== undefined && {\n elementType: resolved.elementType,\n }),\n });\n return buildFieldBuilderForTypeInfo(nestedRef, resolved) as ReturnType<\n ObjectFieldBuilder<T>[\"get\"]\n >;\n },\n hasKey: (key) => {\n const pointer = jsonPointer([key]);\n resolvePointerTypeInfo(options?.typeInfo, pointer);\n return objectOp(\"hasKey\", field, pointer);\n },\n hasPath: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n resolvePointerTypeInfo(options?.typeInfo, normalized);\n return objectOp(\"hasPath\", field, normalized);\n },\n pathEquals: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n if (\n resolved &&\n (resolved.valueType === \"array\" || resolved.valueType === \"object\")\n ) {\n throw new Error(\"pathEquals is only supported for scalar JSON values\");\n }\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.valueType === undefined ?\n undefined\n : { valueType: resolved.valueType };\n return objectOp(\"pathEquals\", field, normalized, value, predicateOptions);\n },\n pathContains: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n if (resolved && resolved.valueType !== \"array\") {\n throw new Error(\"pathContains is only supported for JSON array values\");\n }\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.elementType === undefined ?\n undefined\n : { elementType: resolved.elementType };\n return objectOp(\n \"pathContains\",\n field,\n normalized,\n value,\n predicateOptions,\n );\n },\n pathIsNull: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.valueType === undefined ?\n undefined\n : { valueType: resolved.valueType };\n return objectOp(\n \"pathIsNull\",\n field,\n normalized,\n undefined,\n predicateOptions,\n );\n },\n pathIsNotNull: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.valueType === undefined ?\n undefined\n : { valueType: resolved.valueType };\n return objectOp(\n \"pathIsNotNull\",\n field,\n normalized,\n undefined,\n predicateOptions,\n );\n },\n field: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const nestedPointer = joinJsonPointers(basePointer, normalized);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n const nestedRef = fieldRef(field.alias, field.path, {\n jsonPointer: nestedPointer,\n ...(resolved?.valueType !== undefined && {\n valueType: resolved.valueType,\n }),\n ...(resolved?.elementType !== undefined && {\n elementType: resolved.elementType,\n }),\n });\n return buildFieldBuilderForTypeInfo(nestedRef, resolved) as FieldBuilder<\n ResolvedPointerInput<T, P>\n >;\n },\n };\n}\n\n// ============================================================\n// Subquery Predicates\n// ============================================================\n\n/**\n * Creates an EXISTS subquery predicate.\n * Returns true if the subquery returns at least one row.\n *\n * @param subquery - The subquery AST to check for existence\n *\n * @example\n * ```typescript\n * // Find persons who have at least one order\n * query\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", () =>\n * exists(\n * query.from(\"Order\", \"o\")\n * .whereNode(\"o\", (o) => o.customerId.eq(field(\"p.id\")))\n * .select((ctx) => ({ id: ctx.o.id }))\n * .toAst()\n * )\n * )\n * ```\n */\nexport function exists(subquery: QueryAst): Predicate {\n const expr: ExistsSubquery = {\n __type: \"exists\",\n subquery,\n negated: false,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a NOT EXISTS subquery predicate.\n * Returns true if the subquery returns no rows.\n *\n * @param subquery - The subquery AST to check for non-existence\n */\nexport function notExists(subquery: QueryAst): Predicate {\n const expr: ExistsSubquery = {\n __type: \"exists\",\n subquery,\n negated: true,\n };\n return predicate(expr);\n}\n\n/**\n * Creates an IN subquery predicate.\n * Returns true if the field value is in the subquery results.\n *\n * @param field - The field to check\n * @param subquery - The subquery AST that returns a single column\n *\n * @example\n * ```typescript\n * // Find persons whose ID is in the VIP list\n * query\n * .from(\"Person\", \"p\")\n * .where(() =>\n * inSubquery(\n * fieldRef(\"p\", [\"id\"]),\n * query.from(\"VIPMember\", \"v\")\n * .aggregate({\n * id: fieldRef(\"v\", [\"props\", \"personId\"], { valueType: \"string\" }),\n * })\n * .toAst()\n * )\n * )\n * ```\n */\nexport function inSubquery(field: FieldRef, subquery: QueryAst): Predicate {\n assertSingleColumnSubquery(subquery);\n assertCompatibleSubqueryValueTypes(field, subquery);\n const expr: InSubquery = {\n __type: \"in_subquery\",\n field,\n subquery,\n negated: false,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a NOT IN subquery predicate.\n * Returns true if the field value is not in the subquery results.\n *\n * @param field - The field to check\n * @param subquery - The subquery AST that returns a single column\n */\nexport function notInSubquery(field: FieldRef, subquery: QueryAst): Predicate {\n assertSingleColumnSubquery(subquery);\n assertCompatibleSubqueryValueTypes(field, subquery);\n const expr: InSubquery = {\n __type: \"in_subquery\",\n field,\n subquery,\n negated: true,\n };\n return predicate(expr);\n}\n\n/**\n * Ensures IN/NOT IN subqueries project exactly one column.\n */\nfunction assertSingleColumnSubquery(subquery: QueryAst): void {\n const columnCount = getSubqueryColumnCount(subquery);\n if (columnCount === 1) return;\n\n throw new UnsupportedPredicateError(\n `IN/NOT IN subquery must project exactly 1 column, but got ${columnCount}`,\n { subqueryColumnCount: columnCount },\n {\n suggestion:\n \"Use aggregate() with exactly one projected field for scalar IN/NOT IN subqueries.\",\n },\n );\n}\n\n/**\n * Ensures IN/NOT IN subquery and field value types are compatible when known.\n */\nfunction assertCompatibleSubqueryValueTypes(\n field: FieldRef,\n subquery: QueryAst,\n): void {\n const fieldValueType = field.valueType;\n const subqueryValueType = getSingleSubqueryColumnValueType(subquery);\n const resolvedValueType = fieldValueType ?? subqueryValueType;\n\n if (isUnsupportedInSubqueryValueType(resolvedValueType)) {\n throw new UnsupportedPredicateError(\n `IN/NOT IN subquery does not support ${String(resolvedValueType)} values`,\n { valueType: resolvedValueType },\n {\n suggestion:\n \"Use scalar fields (string/number/boolean/date) in IN/NOT IN predicates.\",\n },\n );\n }\n\n if (isInSubqueryTypeCompatible(fieldValueType, subqueryValueType)) {\n return;\n }\n\n throw new UnsupportedPredicateError(\n `IN/NOT IN type mismatch: field type \"${String(fieldValueType)}\" does not match subquery column type \"${String(subqueryValueType)}\"`,\n {\n fieldValueType,\n subqueryValueType,\n },\n );\n}\n","/**\n * Predicate Expression Compilation\n *\n * Compiles predicate AST nodes to SQL using dialect adapters.\n * Handles comparisons, string operations, null checks, array/object predicates,\n * and subqueries.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { UnsupportedPredicateError } from \"../../errors\";\nimport {\n type ArrayPredicate,\n type ExistsSubquery,\n type FieldRef,\n type InSubquery,\n type LiteralValue,\n type ObjectPredicate,\n type ParameterRef,\n type PredicateExpression,\n type QueryAst,\n type ValueType,\n type VectorSimilarityPredicate,\n} from \"../ast\";\nimport { type DialectAdapter } from \"../dialect\";\nimport {\n joinJsonPointers,\n type JsonPointer,\n jsonPointer,\n} from \"../json-pointer\";\nimport { isParameterRef } from \"../predicates\";\nimport {\n getSingleSubqueryColumnValueType,\n getSubqueryColumnCount,\n isInSubqueryTypeCompatible,\n isUnsupportedInSubqueryValueType,\n} from \"../subquery-utils\";\nimport { type SqlSchema } from \"./schema\";\n\nconst COMPARISON_OP_SQL: Record<string, string> = {\n eq: \"=\",\n neq: \"!=\",\n gt: \">\",\n gte: \">=\",\n lt: \"<\",\n lte: \"<=\",\n};\n\n// ============================================================\n// Field Reference Compilation\n// ============================================================\n\n/**\n * Compiles a field reference to a base column name.\n *\n * @param field - The field reference to compile\n * @param cteAlias - Optional CTE alias for main query context (e.g., \"cte_p\")\n * @param cteColumnPrefix - Optional prefix for CTE WHERE context:\n * - undefined: Use aliased column names (e.g., \"p_props\")\n * - \"\": Use raw column names (e.g., \"props\") for start CTE\n * - \"n\": Use table-qualified names (e.g., \"n.props\") for traversal CTE\n */\nexport function compileFieldColumn(\n field: FieldRef,\n cteAlias?: string,\n cteColumnPrefix?: string,\n): SQL {\n // When cteColumnPrefix is defined (including empty string), use raw column names\n // This is for CTE WHERE clauses which operate on raw table columns\n if (cteColumnPrefix !== undefined) {\n const qualifier = cteColumnPrefix === \"\" ? \"\" : `${cteColumnPrefix}.`;\n\n if (field.path.length === 1 && field.path[0] === \"id\") {\n return sql.raw(`${qualifier}id`);\n }\n if (field.path.length === 1 && field.path[0] === \"kind\") {\n return sql.raw(`${qualifier}kind`);\n }\n if (field.path.length > 0 && field.path[0] === \"props\") {\n return sql.raw(`${qualifier}props`);\n }\n\n return sql.raw(`${qualifier}${field.path.join(\"_\")}`);\n }\n\n // Default behavior: use aliased column names (e.g., \"p_props\")\n const prefix = field.alias;\n const qualifier = cteAlias ? `${cteAlias}.` : \"\";\n\n if (field.path.length === 1 && field.path[0] === \"id\") {\n return sql.raw(`${qualifier}${prefix}_id`);\n }\n if (field.path.length === 1 && field.path[0] === \"kind\") {\n return sql.raw(`${qualifier}${prefix}_kind`);\n }\n if (field.path.length > 0 && field.path[0] === \"props\") {\n return sql.raw(`${qualifier}${prefix}_props`);\n }\n\n return sql.raw(`${qualifier}${prefix}_${field.path.join(\"_\")}`);\n}\n\n/**\n * Gets the JSON pointer for a field reference.\n */\nfunction getFieldPointer(field: FieldRef): JsonPointer | undefined {\n if (field.jsonPointer !== undefined) {\n return field.jsonPointer;\n }\n\n if (field.path.length > 1 && field.path[0] === \"props\") {\n return jsonPointer(field.path.slice(1));\n }\n\n return undefined;\n}\n\n/**\n * Checks if a field reference points to a JSON props column.\n */\nfunction isJsonField(field: FieldRef): boolean {\n return field.path.length > 0 && field.path[0] === \"props\";\n}\n\n/**\n * Normalizes a value type, treating \"unknown\" as undefined.\n */\nfunction normalizeValueType(\n valueType: ValueType | undefined,\n): ValueType | undefined {\n if (!valueType || valueType === \"unknown\") {\n return undefined;\n }\n return valueType;\n}\n\n/**\n * Compiles a field reference to SQL with appropriate type extraction.\n */\nexport function compileFieldValue(\n field: FieldRef,\n dialect: DialectAdapter,\n valueType?: ValueType,\n cteAlias?: string,\n pointerOverride?: JsonPointer,\n cteColumnPrefix?: string,\n): SQL {\n const resolved = normalizeValueType(valueType);\n const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);\n\n if (!isJsonField(field)) {\n return column;\n }\n\n const pointer = pointerOverride ?? getFieldPointer(field);\n if (!pointer || pointer === \"\") {\n return column;\n }\n\n switch (resolved) {\n case \"number\": {\n return dialect.jsonExtractNumber(column, pointer);\n }\n case \"boolean\": {\n return dialect.jsonExtractBoolean(column, pointer);\n }\n case \"date\": {\n return dialect.jsonExtractDate(column, pointer);\n }\n case \"array\":\n case \"object\":\n case \"embedding\": {\n // Embeddings are stored in a separate table, but if we need to\n // extract from JSON, treat like a regular JSON value\n return dialect.jsonExtract(column, pointer);\n }\n case \"string\":\n case \"unknown\":\n case undefined: {\n return dialect.jsonExtractText(column, pointer);\n }\n }\n}\n\n/**\n * Compiles a field reference for text comparison.\n */\nfunction compileFieldTextValue(\n field: FieldRef,\n dialect: DialectAdapter,\n cteAlias?: string,\n pointerOverride?: JsonPointer,\n cteColumnPrefix?: string,\n): SQL {\n const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);\n if (!isJsonField(field)) {\n return column;\n }\n\n const pointer = pointerOverride ?? getFieldPointer(field);\n if (!pointer || pointer === \"\") {\n return column;\n }\n\n return dialect.jsonExtractText(column, pointer);\n}\n\n/**\n * Compiles a field reference for JSON value extraction.\n */\nfunction compileFieldJsonValue(\n field: FieldRef,\n dialect: DialectAdapter,\n cteAlias?: string,\n pointerOverride?: JsonPointer,\n cteColumnPrefix?: string,\n): SQL {\n const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);\n if (!isJsonField(field)) {\n return column;\n }\n\n const pointer = pointerOverride ?? getFieldPointer(field);\n if (!pointer || pointer === \"\") {\n return column;\n }\n\n return dialect.jsonExtract(column, pointer);\n}\n\n// ============================================================\n// Value Type Resolution\n// ============================================================\n\n/**\n * Resolves literal value types from an array of literals.\n */\nfunction resolveLiteralValueTypes(\n literals: readonly LiteralValue[],\n): ValueType | undefined {\n const resolved = new Set<ValueType>();\n\n for (const literal of literals) {\n const valueType = normalizeValueType(literal.valueType);\n if (valueType) {\n resolved.add(valueType);\n }\n }\n\n if (resolved.size > 1) {\n throw new UnsupportedPredicateError(\n \"Mixed literal value types are not supported in predicates\",\n { valueTypes: [...resolved] },\n );\n }\n\n return resolved.values().next().value;\n}\n\n/**\n * Resolves the value type for a comparison predicate.\n */\nfunction resolveComparisonValueType(\n field: FieldRef,\n right: LiteralValue | readonly LiteralValue[] | ParameterRef,\n): ValueType | undefined {\n if (isParameterRef(right)) {\n return (\n normalizeValueType(right.valueType) ?? normalizeValueType(field.valueType)\n );\n }\n const literals = Array.isArray(right) ? right : [right];\n const literalType = resolveLiteralValueTypes(literals);\n const fieldType = normalizeValueType(field.valueType);\n\n // Date fields compared with string literals should use date type\n if (fieldType === \"date\" && literalType === \"string\") {\n return fieldType;\n }\n\n if (literalType) {\n return literalType;\n }\n\n return fieldType;\n}\n\n/**\n * Resolves value type with preference for explicit type.\n */\nfunction resolvePredicateValueType(\n preferred: ValueType | undefined,\n literal: LiteralValue | undefined,\n): ValueType | undefined {\n const normalizedPreferred = normalizeValueType(preferred);\n if (normalizedPreferred) {\n return normalizedPreferred;\n }\n\n return literal ? normalizeValueType(literal.valueType) : undefined;\n}\n\n// ============================================================\n// Value Conversion\n// ============================================================\n\n/**\n * Converts a literal value for SQL binding.\n * Delegates to dialect adapter for proper type conversion (e.g., boolean → 0/1 for SQLite).\n */\nfunction convertValueForSql(value: unknown, dialect: DialectAdapter): unknown {\n return dialect.bindValue(value);\n}\n\n// ============================================================\n// String Pattern Compilation\n// ============================================================\n\n/**\n * Compiles a string pattern for LIKE operations.\n */\nfunction compileStringPattern(op: string, pattern: string): string {\n const escaped = pattern\n .replaceAll(\"%\", String.raw`\\%`)\n .replaceAll(\"_\", String.raw`\\_`);\n\n switch (op) {\n case \"contains\": {\n return `%${escaped}%`;\n }\n case \"startsWith\": {\n return `${escaped}%`;\n }\n case \"endsWith\": {\n return `%${escaped}`;\n }\n case \"like\":\n case \"ilike\": {\n return pattern;\n }\n default: {\n return escaped;\n }\n }\n}\n\n/**\n * Escapes wildcard characters in a SQL pattern parameter.\n */\nfunction escapeLikePatternParameter(parameter: SQL): SQL {\n return sql`REPLACE(REPLACE(REPLACE(${parameter}, '\\\\', '\\\\\\\\'), '%', '\\\\%'), '_', '\\\\_')`;\n}\n\n/**\n * Builds a SQL pattern expression for parameterized string operations.\n */\nfunction compileParameterizedStringPattern(op: string, parameter: SQL): SQL {\n switch (op) {\n case \"contains\": {\n const escaped = escapeLikePatternParameter(parameter);\n return sql`'%' || ${escaped} || '%'`;\n }\n case \"startsWith\": {\n const escaped = escapeLikePatternParameter(parameter);\n return sql`${escaped} || '%'`;\n }\n case \"endsWith\": {\n const escaped = escapeLikePatternParameter(parameter);\n return sql`'%' || ${escaped}`;\n }\n case \"like\":\n case \"ilike\": {\n return parameter;\n }\n default: {\n return escapeLikePatternParameter(parameter);\n }\n }\n}\n\n// ============================================================\n// Predicate Compilation\n// ============================================================\n\n/**\n * Compiler context passed to recursive compilation functions.\n *\n * When compiling predicates inside CTE WHERE clauses, `cteColumnPrefix` specifies\n * how to reference columns:\n * - undefined: Use aliased column names (e.g., \"p_props\") - for main query context\n * - \"\": Use raw column names (e.g., \"props\") - for start CTE WHERE clause\n * - \"n\": Use table-qualified names (e.g., \"n.props\") - for traversal CTE WHERE clause\n */\nexport type PredicateCompilerContext = Readonly<{\n dialect: DialectAdapter;\n schema: SqlSchema;\n compileQuery: (ast: QueryAst, graphId: string) => SQL;\n cteColumnPrefix?: string;\n}>;\n\n/**\n * Compiles a predicate expression to SQL.\n */\nexport function compilePredicateExpression(\n expr: PredicateExpression,\n ctx: PredicateCompilerContext,\n): SQL {\n const { dialect } = ctx;\n\n const cteColumnPrefix = ctx.cteColumnPrefix;\n\n switch (expr.__type) {\n case \"comparison\": {\n return compileComparisonPredicate(expr, dialect, cteColumnPrefix);\n }\n\n case \"string_op\": {\n const field = compileFieldTextValue(\n expr.field,\n dialect,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n\n if (isParameterRef(expr.pattern)) {\n const placeholder = sql`${sql.placeholder(expr.pattern.name)}`;\n const pattern = compileParameterizedStringPattern(expr.op, placeholder);\n if (\n expr.op === \"ilike\" ||\n expr.op === \"contains\" ||\n expr.op === \"startsWith\" ||\n expr.op === \"endsWith\"\n ) {\n return dialect.ilike(field, pattern);\n }\n return sql`${field} LIKE ${pattern}`;\n }\n\n const pattern = compileStringPattern(expr.op, expr.pattern);\n // Use case-insensitive matching for contains, startsWith, endsWith, and ilike\n // This ensures consistent behavior across PostgreSQL (case-sensitive LIKE)\n // and SQLite (case-insensitive LIKE for ASCII)\n if (\n expr.op === \"ilike\" ||\n expr.op === \"contains\" ||\n expr.op === \"startsWith\" ||\n expr.op === \"endsWith\"\n ) {\n return dialect.ilike(field, pattern);\n }\n // Use case-sensitive LIKE only for explicit 'like' operator\n return sql`${field} LIKE ${pattern}`;\n }\n\n case \"null_check\": {\n const field = compileFieldTextValue(\n expr.field,\n dialect,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n return expr.op === \"isNull\" ?\n sql`${field} IS NULL`\n : sql`${field} IS NOT NULL`;\n }\n\n case \"between\": {\n const lowerIsParam = isParameterRef(expr.lower);\n const upperIsParam = isParameterRef(expr.upper);\n\n // Resolve value type from non-param bounds\n const boundsForType: LiteralValue[] = [];\n if (!lowerIsParam) boundsForType.push(expr.lower);\n if (!upperIsParam) boundsForType.push(expr.upper);\n\n const valueType =\n boundsForType.length > 0 ?\n resolveComparisonValueType(expr.field, boundsForType)\n : normalizeValueType(expr.field.valueType);\n\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Between comparisons are not supported for JSON arrays or objects\",\n );\n }\n const field = compileFieldValue(\n expr.field,\n dialect,\n valueType,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n const lower =\n lowerIsParam ?\n sql.placeholder(expr.lower.name)\n : convertValueForSql(expr.lower.value, dialect);\n const upper =\n upperIsParam ?\n sql.placeholder(expr.upper.name)\n : convertValueForSql(expr.upper.value, dialect);\n return sql`${field} BETWEEN ${lower} AND ${upper}`;\n }\n\n case \"and\": {\n const parts = expr.predicates.map((p) =>\n compilePredicateExpression(p, ctx),\n );\n return sql`(${sql.join(parts, sql` AND `)})`;\n }\n\n case \"or\": {\n const parts = expr.predicates.map((p) =>\n compilePredicateExpression(p, ctx),\n );\n return sql`(${sql.join(parts, sql` OR `)})`;\n }\n\n case \"not\": {\n const inner = compilePredicateExpression(expr.predicate, ctx);\n return sql`NOT (${inner})`;\n }\n\n case \"array_op\": {\n return compileArrayPredicate(expr, dialect, cteColumnPrefix);\n }\n\n case \"object_op\": {\n return compileObjectPredicate(expr, dialect, cteColumnPrefix);\n }\n\n case \"aggregate_comparison\": {\n return compileAggregatePredicate(expr, dialect);\n }\n\n case \"exists\": {\n return compileExistsSubquery(expr, ctx);\n }\n\n case \"in_subquery\": {\n return compileInSubquery(expr, ctx);\n }\n\n case \"vector_similarity\": {\n return compileVectorSimilarityPredicate(expr, ctx);\n }\n }\n}\n\n/**\n * Compiles a comparison predicate.\n */\nfunction compileComparisonPredicate(\n expr: {\n __type: \"comparison\";\n op: string;\n left: FieldRef;\n right: LiteralValue | readonly LiteralValue[] | ParameterRef;\n },\n dialect: DialectAdapter,\n cteColumnPrefix?: string,\n): SQL {\n // Handle ParameterRef on the right side\n if (isParameterRef(expr.right)) {\n const parameterValueType =\n normalizeValueType(expr.right.valueType) ??\n normalizeValueType(expr.left.valueType);\n const left = compileFieldValue(\n expr.left,\n dialect,\n parameterValueType,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n const opSql = COMPARISON_OP_SQL[expr.op];\n if (!opSql) {\n throw new UnsupportedPredicateError(\n `Comparison operation \"${expr.op}\" is not supported for parameterized predicates`,\n );\n }\n return sql`${left} ${sql.raw(opSql)} ${sql.placeholder(expr.right.name)}`;\n }\n\n const valueType = resolveComparisonValueType(expr.left, expr.right);\n\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n `Comparison operation \"${expr.op}\" is not supported for ${valueType} values`,\n );\n }\n\n const left = compileFieldValue(\n expr.left,\n dialect,\n valueType,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n\n if (expr.op === \"in\" || expr.op === \"notIn\") {\n const values: readonly LiteralValue[] =\n Array.isArray(expr.right) ? expr.right : [expr.right as LiteralValue];\n if (values.length === 0) {\n return expr.op === \"in\" ? sql.raw(\"1=0\") : sql.raw(\"1=1\");\n }\n const placeholders = values.map(\n (v) => sql`${convertValueForSql(v.value, dialect)}`,\n );\n const op = expr.op === \"in\" ? sql.raw(\"IN\") : sql.raw(\"NOT IN\");\n return sql`${left} ${op} (${sql.join(placeholders, sql`, `)})`;\n }\n\n // For single-value comparisons, extract the literal value\n const right = expr.right;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- Type narrowing with Array.isArray\n const rightValue: LiteralValue = Array.isArray(right) ? right[0]! : right;\n\n const convertedRight = convertValueForSql(rightValue.value, dialect);\n const opSql = COMPARISON_OP_SQL[expr.op];\n if (!opSql) {\n throw new UnsupportedPredicateError(\n `Comparison operation \"${expr.op}\" is not supported`,\n );\n }\n return sql`${left} ${sql.raw(opSql)} ${convertedRight}`;\n}\n\n/**\n * Compiles an array predicate.\n */\nfunction compileArrayPredicate(\n expr: ArrayPredicate,\n dialect: DialectAdapter,\n cteColumnPrefix?: string,\n): SQL {\n const field = compileFieldJsonValue(\n expr.field,\n dialect,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n const values =\n expr.values?.map((v) => convertValueForSql(v.value, dialect)) ?? [];\n\n switch (expr.op) {\n case \"isEmpty\": {\n return sql`(${field} IS NULL OR ${dialect.jsonArrayLength(field)} = 0)`;\n }\n case \"isNotEmpty\": {\n return sql`(${field} IS NOT NULL AND ${dialect.jsonArrayLength(field)} > 0)`;\n }\n case \"lengthEq\": {\n return sql`${dialect.jsonArrayLength(field)} = ${expr.length}`;\n }\n case \"lengthGt\": {\n return sql`${dialect.jsonArrayLength(field)} > ${expr.length}`;\n }\n case \"lengthGte\": {\n return sql`${dialect.jsonArrayLength(field)} >= ${expr.length}`;\n }\n case \"lengthLt\": {\n return sql`${dialect.jsonArrayLength(field)} < ${expr.length}`;\n }\n case \"lengthLte\": {\n return sql`${dialect.jsonArrayLength(field)} <= ${expr.length}`;\n }\n case \"contains\": {\n const value = values[0];\n if (value === undefined) {\n return sql.raw(\"1=0\");\n }\n return dialect.jsonArrayContains(field, value);\n }\n case \"containsAll\": {\n return dialect.jsonArrayContainsAll(field, values);\n }\n case \"containsAny\": {\n return dialect.jsonArrayContainsAny(field, values);\n }\n }\n}\n\n/**\n * Compiles an object/JSON predicate.\n */\nfunction compileObjectPredicate(\n expr: ObjectPredicate,\n dialect: DialectAdapter,\n cteColumnPrefix?: string,\n): SQL {\n const basePointer = getFieldPointer(expr.field);\n const pointer = joinJsonPointers(basePointer, expr.pointer);\n const column = compileFieldColumn(expr.field, undefined, cteColumnPrefix);\n\n switch (expr.op) {\n case \"hasKey\":\n case \"hasPath\": {\n return dialect.jsonHasPath(column, pointer);\n }\n\n case \"pathEquals\": {\n if (!expr.value) {\n throw new UnsupportedPredicateError(\n \"pathEquals requires a comparison value\",\n );\n }\n const valueType = resolvePredicateValueType(expr.valueType, expr.value);\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"pathEquals is not supported for JSON arrays or objects\",\n );\n }\n const left = compileFieldValue(\n expr.field,\n dialect,\n valueType,\n undefined,\n pointer,\n cteColumnPrefix,\n );\n return sql`${left} = ${convertValueForSql(expr.value.value, dialect)}`;\n }\n\n case \"pathContains\": {\n if (!expr.value) {\n throw new UnsupportedPredicateError(\n \"pathContains requires a comparison value\",\n );\n }\n const arrayField = compileFieldJsonValue(\n expr.field,\n dialect,\n undefined,\n pointer,\n cteColumnPrefix,\n );\n return dialect.jsonArrayContains(\n arrayField,\n convertValueForSql(expr.value.value, dialect),\n );\n }\n\n case \"pathIsNull\": {\n return dialect.jsonPathIsNull(column, pointer);\n }\n\n case \"pathIsNotNull\": {\n return dialect.jsonPathIsNotNull(column, pointer);\n }\n }\n}\n\n/**\n * AggregateExpr structure from AST.\n */\ntype AggregateExprInput = Readonly<{\n __type: \"aggregate\";\n function: string;\n field: FieldRef;\n}>;\n\n/**\n * Compiles an aggregate comparison predicate.\n */\nfunction compileAggregatePredicate(\n expr: {\n __type: \"aggregate_comparison\";\n op: string;\n aggregate: AggregateExprInput;\n value: LiteralValue;\n },\n dialect: DialectAdapter,\n): SQL {\n const aggregate = compileAggregateExpr(expr.aggregate, dialect);\n\n const op = COMPARISON_OP_SQL[expr.op];\n if (!op) {\n throw new UnsupportedPredicateError(\n `Comparison operation \"${expr.op}\" is not supported for aggregate predicates`,\n );\n }\n\n const convertedValue = convertValueForSql(expr.value.value, dialect);\n return sql`${aggregate} ${sql.raw(op)} ${convertedValue}`;\n}\n\n/**\n * Compiles an aggregate expression.\n */\nfunction compileAggregateExpr(\n expr: AggregateExprInput,\n dialect: DialectAdapter,\n): SQL {\n const cteAlias = `cte_${expr.field.alias}`;\n const field = compileFieldValue(\n expr.field,\n dialect,\n expr.field.valueType,\n cteAlias,\n );\n\n switch (expr.function) {\n case \"count\": {\n return sql`COUNT(${field})`;\n }\n case \"countDistinct\": {\n return sql`COUNT(DISTINCT ${field})`;\n }\n case \"sum\": {\n return sql`SUM(${field})`;\n }\n case \"avg\": {\n return sql`AVG(${field})`;\n }\n case \"min\": {\n return sql`MIN(${field})`;\n }\n case \"max\": {\n return sql`MAX(${field})`;\n }\n default: {\n throw new UnsupportedPredicateError(\n `Unknown aggregate function: ${expr.function}`,\n );\n }\n }\n}\n\n/**\n * Compiles an EXISTS subquery predicate.\n */\nfunction compileExistsSubquery(\n expr: ExistsSubquery,\n ctx: PredicateCompilerContext,\n): SQL {\n if (expr.subquery.graphId === undefined) {\n throw new UnsupportedPredicateError(\"EXISTS subquery must have a graphId\");\n }\n const subSql = ctx.compileQuery(expr.subquery, expr.subquery.graphId);\n return expr.negated ? sql`NOT EXISTS (${subSql})` : sql`EXISTS (${subSql})`;\n}\n\n/**\n * Compiles an IN subquery predicate.\n */\nfunction compileInSubquery(\n expr: InSubquery,\n ctx: PredicateCompilerContext,\n): SQL {\n const subqueryColumnCount = getSubqueryColumnCount(expr.subquery);\n if (subqueryColumnCount !== 1) {\n throw new UnsupportedPredicateError(\n `IN/NOT IN subquery must project exactly 1 column, but got ${subqueryColumnCount}`,\n { subqueryColumnCount },\n );\n }\n\n const fieldValueType = normalizeValueType(expr.field.valueType);\n const subqueryValueType = getSingleSubqueryColumnValueType(expr.subquery);\n const resolvedValueType = fieldValueType ?? subqueryValueType;\n\n if (isUnsupportedInSubqueryValueType(resolvedValueType)) {\n throw new UnsupportedPredicateError(\n `IN/NOT IN subquery does not support ${String(resolvedValueType)} values`,\n { valueType: resolvedValueType },\n );\n }\n\n if (!isInSubqueryTypeCompatible(fieldValueType, subqueryValueType)) {\n throw new UnsupportedPredicateError(\n `IN/NOT IN type mismatch: field type \"${String(fieldValueType)}\" does not match subquery column type \"${String(subqueryValueType)}\"`,\n {\n fieldValueType,\n subqueryValueType,\n },\n );\n }\n\n const valueType = fieldValueType ?? subqueryValueType;\n if (expr.subquery.graphId === undefined) {\n throw new UnsupportedPredicateError(\n \"IN/NOT IN subquery must have a graphId\",\n );\n }\n const fieldSql = compileFieldValue(\n expr.field,\n ctx.dialect,\n valueType,\n undefined,\n undefined,\n ctx.cteColumnPrefix,\n );\n const subSql = ctx.compileQuery(expr.subquery, expr.subquery.graphId);\n return expr.negated ?\n sql`${fieldSql} NOT IN (${subSql})`\n : sql`${fieldSql} IN (${subSql})`;\n}\n\n/**\n * Compiles a vector similarity predicate.\n *\n * Vector similarity predicates require special handling at the query compilation\n * level to handle:\n * - JOIN to embeddings table\n * - ORDER BY distance ASC\n * - LIMIT k\n *\n * This function handles the minScore filter if present. The main query compiler\n * must detect vector_similarity predicates and set up the appropriate JOINs\n * and ordering.\n */\nfunction compileVectorSimilarityPredicate(\n _expr: VectorSimilarityPredicate,\n _ctx: PredicateCompilerContext,\n): SQL {\n // No-op: vector similarity is handled structurally (JOINs, ORDER BY, LIMIT)\n // by the main query compiler, not as a WHERE predicate. Returns 1=1 so it\n // composes safely with AND.\n return sql.raw(\"1=1\");\n}\n\n// ============================================================\n// Vector Similarity Helpers\n// ============================================================\n\n/**\n * Extracts all vector similarity predicates from a query's predicates.\n * Used by the main query compiler to set up JOINs, ORDER BY, and LIMIT.\n *\n * Vector predicates must appear at top level or under AND groups only.\n * Nesting under OR/NOT is rejected because vector search rewrites query\n * structure rather than behaving like a pure boolean predicate.\n */\nexport function extractVectorSimilarityPredicates(\n predicates: readonly { expression: PredicateExpression }[],\n): VectorSimilarityPredicate[] {\n const results: VectorSimilarityPredicate[] = [];\n\n function visit(expr: PredicateExpression, inDisallowedBranch: boolean): void {\n switch (expr.__type) {\n case \"vector_similarity\": {\n if (inDisallowedBranch) {\n throw new UnsupportedPredicateError(\n \"Vector similarity predicates cannot be nested under OR or NOT. \" +\n \"Use top-level AND combinations instead.\",\n );\n }\n results.push(expr);\n break;\n }\n case \"and\": {\n for (const p of expr.predicates) {\n visit(p, inDisallowedBranch);\n }\n break;\n }\n case \"or\": {\n for (const p of expr.predicates) {\n visit(p, true);\n }\n break;\n }\n case \"not\": {\n visit(expr.predicate, true);\n break;\n }\n case \"comparison\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"exists\":\n case \"in_subquery\": {\n // These predicate types don't contain nested vector_similarity\n break;\n }\n }\n }\n\n for (const pred of predicates) {\n visit(pred.expression, false);\n }\n\n return results;\n}\n\n// ============================================================\n// Exports for aggregate compilation\n// ============================================================\n\nexport { compileAggregateExpr };\n","import { UnsupportedPredicateError } from \"../../../errors\";\nimport type { QueryAst, VectorSimilarityPredicate } from \"../../ast\";\nimport type { DialectAdapter } from \"../../dialect\";\nimport { extractVectorSimilarityPredicates } from \"../predicates\";\n\nexport type VectorPredicatePassResult = Readonly<{\n vectorPredicate: VectorSimilarityPredicate | undefined;\n}>;\n\n/**\n * Validates vector predicate placement and cardinality.\n *\n * Invariants:\n * - Vector predicates must not appear under OR/NOT branches.\n * - At most one vector predicate is allowed per query.\n */\nexport function runVectorPredicatePass(\n ast: QueryAst,\n dialect: DialectAdapter,\n): VectorPredicatePassResult {\n const vectorPredicates = extractVectorSimilarityPredicates(ast.predicates);\n if (vectorPredicates.length > 1) {\n throw new UnsupportedPredicateError(\n \"Multiple vector similarity predicates in a single query are not supported\",\n );\n }\n\n const vectorPredicate = vectorPredicates[0];\n if (vectorPredicate === undefined) {\n return { vectorPredicate: undefined };\n }\n\n const vectorStrategy = dialect.capabilities.vectorPredicateStrategy;\n if (vectorStrategy === \"unsupported\" || !dialect.supportsVectors) {\n throw new UnsupportedPredicateError(\n `Vector similarity predicates are not supported for dialect \"${dialect.name}\"`,\n );\n }\n\n if (!dialect.capabilities.vectorMetrics.includes(vectorPredicate.metric)) {\n throw new UnsupportedPredicateError(\n `Vector metric \"${vectorPredicate.metric}\" is not supported for dialect \"${dialect.name}\"`,\n );\n }\n\n if (!Number.isFinite(vectorPredicate.limit) || vectorPredicate.limit <= 0) {\n throw new UnsupportedPredicateError(\n `Vector predicate limit must be a positive finite number, got ${String(vectorPredicate.limit)}`,\n );\n }\n\n const { minScore } = vectorPredicate;\n if (minScore !== undefined) {\n if (!Number.isFinite(minScore)) {\n throw new UnsupportedPredicateError(\n `Vector minScore must be a finite number, got ${String(minScore)}`,\n );\n }\n if (\n vectorPredicate.metric === \"cosine\" &&\n (minScore < -1 || minScore > 1)\n ) {\n throw new UnsupportedPredicateError(\n `Cosine minScore must be between -1 and 1, got ${String(minScore)}`,\n );\n }\n }\n\n return { vectorPredicate };\n}\n\n/**\n * Resolves the query LIMIT in the presence of vector similarity.\n *\n * If a vector predicate is present and AST limit is omitted, use the\n * predicate's built-in limit to bound nearest-neighbor search.\n */\nexport function resolveVectorAwareLimit(\n astLimit?: number,\n vectorPredicate?: VectorSimilarityPredicate,\n): number | undefined {\n if (vectorPredicate === undefined) {\n return astLimit;\n }\n if (astLimit === undefined) {\n return vectorPredicate.limit;\n }\n return Math.min(astLimit, vectorPredicate.limit);\n}\n","import { CompilerInvariantError } from \"../../../errors\";\nimport type {\n AggregateExpr,\n ComposableQuery,\n NodePredicate,\n QueryAst,\n SetOperation,\n VectorSimilarityPredicate,\n} from \"../../ast\";\nimport { getDialect, type SqlDialect } from \"../../dialect\";\nimport {\n resolveVectorAwareLimit,\n runRecursiveTraversalSelectionPass,\n runVectorPredicatePass,\n type VariableLengthTraversal,\n} from \"../passes\";\nimport type {\n AggregatePlanNode,\n LimitOffsetPlanNode,\n LogicalPlan,\n LogicalPlanNode,\n ProjectPlanNode,\n} from \"./types\";\n\nexport type LowerStandardQueryToLogicalPlanInput = Readonly<{\n ast: QueryAst;\n collapsedTraversalCteAlias?: string;\n dialect: SqlDialect;\n effectiveLimit?: number;\n graphId: string;\n vectorPredicate?: VectorSimilarityPredicate;\n}>;\n\nexport type LowerRecursiveQueryToLogicalPlanInput = Readonly<{\n ast: QueryAst;\n dialect: SqlDialect;\n graphId: string;\n traversal?: VariableLengthTraversal;\n}>;\n\nexport type LowerSetOperationToLogicalPlanInput = Readonly<{\n dialect: SqlDialect;\n graphId: string;\n op: SetOperation;\n}>;\n\n/**\n * Creates a sequential plan node ID generator scoped to a single compilation invocation.\n * IDs are NOT stable across compilations — different compilations of the same query\n * may produce different IDs depending on pass execution order.\n */\nfunction createPlanNodeIdFactory(): () => string {\n let current = 0;\n return function nextPlanNodeId(): string {\n current += 1;\n return `plan_${current.toString(36)}`;\n };\n}\n\nfunction extractAggregateExpressions(ast: QueryAst): readonly AggregateExpr[] {\n const aggregates: AggregateExpr[] = [];\n\n for (const field of ast.projection.fields) {\n if (\"__type\" in field.source && field.source.__type === \"aggregate\") {\n aggregates.push(field.source);\n }\n }\n\n return aggregates;\n}\n\nfunction getAliasPredicates(\n ast: QueryAst,\n alias: string,\n predicateTargetType: \"edge\" | \"node\",\n): readonly NodePredicate[] {\n return ast.predicates.filter((predicate) => {\n const targetType = predicate.targetType ?? \"node\";\n return (\n predicate.targetAlias === alias && targetType === predicateTargetType\n );\n });\n}\n\nfunction wrapWithAliasFilterNode(\n currentNode: LogicalPlanNode,\n ast: QueryAst,\n alias: string,\n predicateTargetType: \"edge\" | \"node\",\n nextPlanNodeId: () => string,\n): LogicalPlanNode {\n const aliasPredicates = getAliasPredicates(ast, alias, predicateTargetType);\n if (aliasPredicates.length === 0) {\n return currentNode;\n }\n\n return {\n alias,\n id: nextPlanNodeId(),\n input: currentNode,\n op: \"filter\",\n predicateTargetType,\n predicates: aliasPredicates.map((predicate) => predicate.expression),\n };\n}\n\nfunction appendAggregateSortLimitAndProjectNodes(\n currentNode: LogicalPlanNode,\n ast: QueryAst,\n nextPlanNodeId: () => string,\n limit: number | undefined,\n collapsedTraversalCteAlias?: string,\n): LogicalPlanNode {\n let node = currentNode;\n\n const aggregateExpressions = extractAggregateExpressions(ast);\n if (\n aggregateExpressions.length > 0 ||\n ast.groupBy !== undefined ||\n ast.having !== undefined\n ) {\n const aggregateNode: AggregatePlanNode = {\n aggregates: aggregateExpressions,\n groupBy: ast.groupBy?.fields ?? [],\n id: nextPlanNodeId(),\n input: node,\n op: \"aggregate\",\n };\n node =\n ast.having === undefined ?\n aggregateNode\n : { ...aggregateNode, having: ast.having };\n }\n\n if (ast.orderBy !== undefined && ast.orderBy.length > 0) {\n node = {\n id: nextPlanNodeId(),\n input: node,\n op: \"sort\",\n orderBy: ast.orderBy,\n };\n }\n\n if (limit !== undefined || ast.offset !== undefined) {\n const limitOffsetNodeBase: Omit<LimitOffsetPlanNode, \"limit\" | \"offset\"> = {\n id: nextPlanNodeId(),\n input: node,\n op: \"limit_offset\",\n };\n const hasLimit = limit !== undefined;\n const hasOffset = ast.offset !== undefined;\n\n if (hasLimit && hasOffset) {\n node = {\n ...limitOffsetNodeBase,\n limit,\n offset: ast.offset,\n };\n } else if (hasLimit) {\n node = { ...limitOffsetNodeBase, limit };\n } else if (hasOffset) {\n node = { ...limitOffsetNodeBase, offset: ast.offset };\n } else {\n throw new CompilerInvariantError(\n \"limit_offset node requires limit or offset to be present\",\n );\n }\n }\n\n const projectNodeBase: Omit<ProjectPlanNode, \"collapsedTraversalAlias\"> = {\n fields: ast.projection.fields,\n id: nextPlanNodeId(),\n input: node,\n op: \"project\",\n };\n return collapsedTraversalCteAlias === undefined ? projectNodeBase : (\n {\n ...projectNodeBase,\n collapsedTraversalAlias: collapsedTraversalCteAlias,\n }\n );\n}\n\ntype LowerStandardQueryToLogicalPlanNodeInput =\n LowerStandardQueryToLogicalPlanInput &\n Readonly<{\n nextPlanNodeId: () => string;\n }>;\n\nfunction lowerStandardQueryToLogicalPlanNode(\n input: LowerStandardQueryToLogicalPlanNodeInput,\n): LogicalPlanNode {\n const { ast, nextPlanNodeId } = input;\n\n let currentNode: LogicalPlanNode = {\n alias: ast.start.alias,\n graphId: input.graphId,\n id: nextPlanNodeId(),\n kinds: ast.start.kinds,\n op: \"scan\",\n source: \"nodes\",\n };\n\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n ast.start.alias,\n \"node\",\n nextPlanNodeId,\n );\n\n for (const traversal of ast.traversals) {\n currentNode = {\n direction: traversal.direction,\n edgeAlias: traversal.edgeAlias,\n edgeKinds: traversal.edgeKinds,\n id: nextPlanNodeId(),\n input: currentNode,\n inverseEdgeKinds: traversal.inverseEdgeKinds ?? [],\n joinFromAlias: traversal.joinFromAlias,\n joinType: traversal.optional ? \"left\" : \"inner\",\n nodeAlias: traversal.nodeAlias,\n nodeKinds: traversal.nodeKinds,\n op: \"join\",\n };\n\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n traversal.edgeAlias,\n \"edge\",\n nextPlanNodeId,\n );\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n traversal.nodeAlias,\n \"node\",\n nextPlanNodeId,\n );\n }\n\n if (input.vectorPredicate !== undefined) {\n currentNode = {\n id: nextPlanNodeId(),\n input: currentNode,\n op: \"vector_knn\",\n predicate: input.vectorPredicate,\n };\n }\n\n return appendAggregateSortLimitAndProjectNodes(\n currentNode,\n ast,\n nextPlanNodeId,\n input.effectiveLimit,\n input.collapsedTraversalCteAlias,\n );\n}\n\ntype LowerRecursiveQueryToLogicalPlanNodeInput =\n LowerRecursiveQueryToLogicalPlanInput &\n Readonly<{\n nextPlanNodeId: () => string;\n }>;\n\nfunction lowerRecursiveQueryToLogicalPlanNode(\n input: LowerRecursiveQueryToLogicalPlanNodeInput,\n): LogicalPlanNode {\n const { ast, nextPlanNodeId } = input;\n const traversal =\n input.traversal ?? runRecursiveTraversalSelectionPass(input.ast);\n\n let currentNode: LogicalPlanNode = {\n alias: ast.start.alias,\n graphId: input.graphId,\n id: nextPlanNodeId(),\n kinds: ast.start.kinds,\n op: \"scan\",\n source: \"nodes\",\n };\n\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n ast.start.alias,\n \"node\",\n nextPlanNodeId,\n );\n\n currentNode = {\n edgeAlias: traversal.edgeAlias,\n edgeKinds: traversal.edgeKinds,\n id: nextPlanNodeId(),\n input: currentNode,\n inverseEdgeKinds: traversal.inverseEdgeKinds ?? [],\n nodeAlias: traversal.nodeAlias,\n nodeKinds: traversal.nodeKinds,\n op: \"recursive_expand\",\n traversal: traversal.variableLength,\n };\n\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n traversal.edgeAlias,\n \"edge\",\n nextPlanNodeId,\n );\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n traversal.nodeAlias,\n \"node\",\n nextPlanNodeId,\n );\n\n return appendAggregateSortLimitAndProjectNodes(\n currentNode,\n ast,\n nextPlanNodeId,\n ast.limit,\n );\n}\n\nfunction lowerComposableQueryToLogicalPlanNode(\n query: ComposableQuery,\n dialect: SqlDialect,\n graphId: string,\n nextPlanNodeId: () => string,\n): LogicalPlanNode {\n if (\"__type\" in query) {\n return lowerSetOperationToLogicalPlanNode(\n query,\n graphId,\n dialect,\n nextPlanNodeId,\n );\n }\n\n const hasVariableLengthTraversal = query.traversals.some(\n (traversal) => traversal.variableLength !== undefined,\n );\n if (hasVariableLengthTraversal) {\n return lowerRecursiveQueryToLogicalPlanNode({\n ast: query,\n dialect,\n graphId,\n nextPlanNodeId,\n });\n }\n\n const vectorPredicate = runVectorPredicatePass(\n query,\n getDialect(dialect),\n ).vectorPredicate;\n const effectiveLimit = resolveVectorAwareLimit(query.limit, vectorPredicate);\n const loweringInput = {\n ast: query,\n dialect,\n graphId,\n nextPlanNodeId,\n ...(effectiveLimit === undefined ? {} : { effectiveLimit }),\n ...(vectorPredicate === undefined ? {} : { vectorPredicate }),\n };\n return lowerStandardQueryToLogicalPlanNode(loweringInput);\n}\n\nfunction lowerSetOperationToLogicalPlanNode(\n op: SetOperation,\n graphId: string,\n dialect: SqlDialect,\n nextPlanNodeId: () => string,\n): LogicalPlanNode {\n let currentNode: LogicalPlanNode = {\n id: nextPlanNodeId(),\n left: lowerComposableQueryToLogicalPlanNode(\n op.left,\n dialect,\n graphId,\n nextPlanNodeId,\n ),\n op: \"set_op\",\n operator: op.operator,\n right: lowerComposableQueryToLogicalPlanNode(\n op.right,\n dialect,\n graphId,\n nextPlanNodeId,\n ),\n };\n\n if (op.orderBy !== undefined && op.orderBy.length > 0) {\n currentNode = {\n id: nextPlanNodeId(),\n input: currentNode,\n op: \"sort\",\n orderBy: op.orderBy,\n };\n }\n\n if (op.limit !== undefined || op.offset !== undefined) {\n const limitOffsetBase = {\n id: nextPlanNodeId(),\n input: currentNode,\n op: \"limit_offset\" as const,\n };\n if (op.limit !== undefined && op.offset !== undefined) {\n currentNode = { ...limitOffsetBase, limit: op.limit, offset: op.offset };\n } else if (op.limit === undefined) {\n currentNode = { ...limitOffsetBase, offset: op.offset! };\n } else {\n currentNode = { ...limitOffsetBase, limit: op.limit };\n }\n }\n\n return currentNode;\n}\n\nexport function lowerStandardQueryToLogicalPlan(\n input: LowerStandardQueryToLogicalPlanInput,\n): LogicalPlan {\n const nextPlanNodeId = createPlanNodeIdFactory();\n return {\n metadata: {\n dialect: input.dialect,\n graphId: input.graphId,\n },\n root: lowerStandardQueryToLogicalPlanNode({\n ...input,\n nextPlanNodeId,\n }),\n };\n}\n\nexport function lowerRecursiveQueryToLogicalPlan(\n input: LowerRecursiveQueryToLogicalPlanInput,\n): LogicalPlan {\n const nextPlanNodeId = createPlanNodeIdFactory();\n return {\n metadata: {\n dialect: input.dialect,\n graphId: input.graphId,\n },\n root: lowerRecursiveQueryToLogicalPlanNode({\n ...input,\n nextPlanNodeId,\n }),\n };\n}\n\nexport function lowerSetOperationToLogicalPlan(\n input: LowerSetOperationToLogicalPlanInput,\n): LogicalPlan {\n const nextPlanNodeId = createPlanNodeIdFactory();\n return {\n metadata: {\n dialect: input.dialect,\n graphId: input.graphId,\n },\n root: lowerSetOperationToLogicalPlanNode(\n input.op,\n input.graphId,\n input.dialect,\n nextPlanNodeId,\n ),\n };\n}\n","import { CompilerInvariantError } from \"../../../errors\";\nimport {\n type LimitOffsetPlanNode,\n type LogicalPlan,\n type LogicalPlanNode,\n type ProjectPlanNode,\n type SortPlanNode,\n} from \"../plan\";\n\nexport type ProjectPlanShape = Readonly<{\n hasAggregate: boolean;\n hasLimitOffset: boolean;\n hasRecursiveExpand: boolean;\n hasSetOperation: boolean;\n hasSort: boolean;\n hasVectorKnn: boolean;\n limitOffsetNode: LimitOffsetPlanNode | undefined;\n rootProjectNode: ProjectPlanNode;\n sortNode: SortPlanNode | undefined;\n}>;\n\nexport type SetOperationPlanShape = Readonly<{\n hasLimitOffset: boolean;\n hasSetOperation: boolean;\n hasSort: boolean;\n limitOffsetNode: LimitOffsetPlanNode | undefined;\n sortNode: SortPlanNode | undefined;\n}>;\n\nfunction collectPlanOperations(node: LogicalPlanNode, ops: Set<string>): void {\n ops.add(node.op);\n\n switch (node.op) {\n case \"aggregate\":\n case \"filter\":\n case \"join\":\n case \"limit_offset\":\n case \"project\":\n case \"recursive_expand\":\n case \"sort\":\n case \"vector_knn\": {\n collectPlanOperations(node.input, ops);\n return;\n }\n case \"set_op\": {\n collectPlanOperations(node.left, ops);\n collectPlanOperations(node.right, ops);\n return;\n }\n case \"scan\": {\n return;\n }\n }\n}\n\nfunction findUnaryNodeInProjectChain<TNode extends LogicalPlanNode>(\n rootNode: ProjectPlanNode,\n op: TNode[\"op\"],\n): TNode | undefined {\n let currentNode: LogicalPlanNode = rootNode.input;\n\n for (;;) {\n if (currentNode.op === op) {\n return currentNode as TNode;\n }\n\n switch (currentNode.op) {\n case \"aggregate\":\n case \"filter\":\n case \"join\":\n case \"limit_offset\":\n case \"recursive_expand\":\n case \"sort\":\n case \"vector_knn\": {\n currentNode = currentNode.input;\n continue;\n }\n case \"project\":\n case \"scan\":\n case \"set_op\": {\n return undefined;\n }\n }\n }\n}\n\nfunction inspectProjectPlan(logicalPlan: LogicalPlan): ProjectPlanShape {\n if (logicalPlan.root.op !== \"project\") {\n throw new CompilerInvariantError(\n `SQL emitter expected logical plan root to be \"project\", got \"${logicalPlan.root.op}\"`,\n { component: \"plan-inspector\" },\n );\n }\n\n const operations = new Set<string>();\n collectPlanOperations(logicalPlan.root, operations);\n\n const limitOffsetNode = findUnaryNodeInProjectChain<LimitOffsetPlanNode>(\n logicalPlan.root,\n \"limit_offset\",\n );\n const sortNode = findUnaryNodeInProjectChain<SortPlanNode>(\n logicalPlan.root,\n \"sort\",\n );\n\n return {\n hasAggregate: operations.has(\"aggregate\"),\n hasLimitOffset: operations.has(\"limit_offset\"),\n hasRecursiveExpand: operations.has(\"recursive_expand\"),\n hasSetOperation: operations.has(\"set_op\"),\n hasSort: operations.has(\"sort\"),\n hasVectorKnn: operations.has(\"vector_knn\"),\n limitOffsetNode,\n rootProjectNode: logicalPlan.root,\n sortNode,\n };\n}\n\nexport function inspectStandardProjectPlan(\n logicalPlan: LogicalPlan,\n): ProjectPlanShape {\n const shape = inspectProjectPlan(logicalPlan);\n if (shape.hasSetOperation) {\n throw new CompilerInvariantError(\n 'Standard SQL emitter does not support plans containing \"set_op\" nodes',\n { component: \"plan-inspector\" },\n );\n }\n if (shape.hasRecursiveExpand) {\n throw new CompilerInvariantError(\n 'Standard SQL emitter does not support plans containing \"recursive_expand\" nodes',\n { component: \"plan-inspector\" },\n );\n }\n return shape;\n}\n\nexport function inspectRecursiveProjectPlan(\n logicalPlan: LogicalPlan,\n): ProjectPlanShape {\n const shape = inspectProjectPlan(logicalPlan);\n if (!shape.hasRecursiveExpand) {\n throw new CompilerInvariantError(\n 'Recursive SQL emitter expected logical plan to contain a \"recursive_expand\" node',\n { component: \"plan-inspector\" },\n );\n }\n if (shape.hasSetOperation) {\n throw new CompilerInvariantError(\n 'Recursive SQL emitter does not support plans containing \"set_op\" nodes',\n { component: \"plan-inspector\" },\n );\n }\n return shape;\n}\n\nfunction findTopLevelLimitOffsetNode(\n rootNode: LogicalPlanNode,\n): LimitOffsetPlanNode | undefined {\n let currentNode: LogicalPlanNode = rootNode;\n\n for (;;) {\n if (currentNode.op === \"limit_offset\") {\n return currentNode;\n }\n\n switch (currentNode.op) {\n case \"aggregate\":\n case \"filter\":\n case \"join\":\n case \"project\":\n case \"recursive_expand\":\n case \"sort\":\n case \"vector_knn\": {\n currentNode = currentNode.input;\n continue;\n }\n case \"scan\":\n case \"set_op\": {\n return undefined;\n }\n }\n }\n}\n\nfunction findTopLevelSortNode(\n rootNode: LogicalPlanNode,\n): SortPlanNode | undefined {\n let currentNode: LogicalPlanNode = rootNode;\n\n for (;;) {\n if (currentNode.op === \"sort\") {\n return currentNode;\n }\n\n switch (currentNode.op) {\n case \"aggregate\":\n case \"filter\":\n case \"join\":\n case \"limit_offset\":\n case \"project\":\n case \"recursive_expand\":\n case \"vector_knn\": {\n currentNode = currentNode.input;\n continue;\n }\n case \"scan\":\n case \"set_op\": {\n return undefined;\n }\n }\n }\n}\n\nexport function inspectSetOperationPlan(\n logicalPlan: LogicalPlan,\n): SetOperationPlanShape {\n const operations = new Set<string>();\n collectPlanOperations(logicalPlan.root, operations);\n\n if (!operations.has(\"set_op\")) {\n throw new CompilerInvariantError(\n 'Set-operation SQL emitter expected logical plan to contain a \"set_op\" node',\n { component: \"plan-inspector\" },\n );\n }\n\n const limitOffsetNode = findTopLevelLimitOffsetNode(logicalPlan.root);\n const sortNode = findTopLevelSortNode(logicalPlan.root);\n\n return {\n hasLimitOffset: limitOffsetNode !== undefined,\n hasSetOperation: true,\n hasSort: sortNode !== undefined,\n limitOffsetNode,\n sortNode,\n };\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { CompilerInvariantError } from \"../../../errors\";\nimport { type LogicalPlan } from \"../plan\";\nimport { inspectRecursiveProjectPlan } from \"./plan-inspector\";\n\nexport type RecursiveQueryEmitterInput = Readonly<{\n depthFilter: SQL;\n limitOffset?: SQL;\n logicalPlan: LogicalPlan;\n orderBy?: SQL;\n projection: SQL;\n recursiveCte: SQL;\n}>;\n\nfunction assertRecursiveEmitterClauseAlignment(\n logicalPlan: LogicalPlan,\n input: RecursiveQueryEmitterInput,\n): void {\n const planShape = inspectRecursiveProjectPlan(logicalPlan);\n if (planShape.hasSort && input.orderBy === undefined) {\n throw new CompilerInvariantError(\n \"Recursive SQL emitter expected ORDER BY clause for plan containing a sort node\",\n { component: \"recursive-emitter\" },\n );\n }\n if (!planShape.hasSort && input.orderBy !== undefined) {\n throw new CompilerInvariantError(\n \"Recursive SQL emitter received ORDER BY clause for a plan without sort nodes\",\n { component: \"recursive-emitter\" },\n );\n }\n if (planShape.hasLimitOffset && input.limitOffset === undefined) {\n throw new CompilerInvariantError(\n \"Recursive SQL emitter expected LIMIT/OFFSET clause for plan containing a limit_offset node\",\n { component: \"recursive-emitter\" },\n );\n }\n if (!planShape.hasLimitOffset && input.limitOffset !== undefined) {\n throw new CompilerInvariantError(\n \"Recursive SQL emitter received LIMIT/OFFSET clause for a plan without limit_offset nodes\",\n { component: \"recursive-emitter\" },\n );\n }\n}\n\nexport function emitRecursiveQuerySql(input: RecursiveQueryEmitterInput): SQL {\n assertRecursiveEmitterClauseAlignment(input.logicalPlan, input);\n\n const parts: SQL[] = [\n sql`WITH RECURSIVE`,\n input.recursiveCte,\n sql`SELECT ${input.projection}`,\n sql`FROM recursive_cte`,\n input.depthFilter,\n ];\n\n if (input.orderBy !== undefined) {\n parts.push(input.orderBy);\n }\n if (input.limitOffset !== undefined) {\n parts.push(input.limitOffset);\n }\n\n return sql.join(parts, sql` `);\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { CompilerInvariantError } from \"../../../errors\";\nimport { type LogicalPlan } from \"../plan\";\nimport { inspectSetOperationPlan } from \"./plan-inspector\";\n\nexport type SetOperationQueryEmitterInput = Readonly<{\n baseQuery: SQL;\n ctes?: readonly SQL[];\n logicalPlan: LogicalPlan;\n suffixClauses?: readonly SQL[];\n}>;\n\nfunction assertSetOperationEmitterClauseAlignment(\n logicalPlan: LogicalPlan,\n suffixClauses: readonly SQL[] | undefined,\n): void {\n const shape = inspectSetOperationPlan(logicalPlan);\n const hasSuffixClauses =\n suffixClauses !== undefined && suffixClauses.length > 0;\n\n if (!shape.hasSort && !shape.hasLimitOffset && hasSuffixClauses) {\n throw new CompilerInvariantError(\n \"Set-operation SQL emitter received suffix clauses for a plan without top-level sort or limit_offset nodes\",\n { component: \"set-operation-emitter\" },\n );\n }\n\n if (!hasSuffixClauses) {\n if (shape.hasSort || shape.hasLimitOffset) {\n throw new CompilerInvariantError(\n \"Set-operation SQL emitter expected suffix clauses for plan containing top-level sort or limit_offset nodes\",\n { component: \"set-operation-emitter\" },\n );\n }\n return;\n }\n\n const limitOffsetClauseCount =\n shape.limitOffsetNode === undefined ?\n 0\n : (shape.limitOffsetNode.limit === undefined ? 0 : 1) +\n (shape.limitOffsetNode.offset === undefined ? 0 : 1);\n const expectedClauseCount =\n (shape.sortNode === undefined ? 0 : 1) + limitOffsetClauseCount;\n\n if (suffixClauses.length !== expectedClauseCount) {\n throw new CompilerInvariantError(\n `Set-operation SQL emitter expected ${String(expectedClauseCount)} top-level suffix clause(s) from logical plan, got ${String(suffixClauses.length)}`,\n { component: \"set-operation-emitter\" },\n );\n }\n}\n\nexport function emitSetOperationQuerySql(\n input: SetOperationQueryEmitterInput,\n): SQL {\n assertSetOperationEmitterClauseAlignment(\n input.logicalPlan,\n input.suffixClauses,\n );\n\n const parts: SQL[] = [];\n if (input.ctes !== undefined && input.ctes.length > 0) {\n parts.push(sql`WITH ${sql.join([...input.ctes], sql`, `)}`);\n }\n\n parts.push(input.baseQuery);\n\n if (input.suffixClauses !== undefined && input.suffixClauses.length > 0) {\n parts.push(...input.suffixClauses);\n }\n\n return sql.join(parts, sql` `);\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { CompilerInvariantError } from \"../../../errors\";\nimport { type LogicalPlan } from \"../plan\";\nimport { inspectStandardProjectPlan } from \"./plan-inspector\";\n\nexport type StandardQueryEmitterInput = Readonly<{\n ctes: readonly SQL[];\n fromClause: SQL;\n groupBy?: SQL;\n having?: SQL;\n limitOffset?: SQL;\n logicalPlan: LogicalPlan;\n orderBy?: SQL;\n projection: SQL;\n}>;\n\nfunction assertStandardEmitterClauseAlignment(\n logicalPlan: LogicalPlan,\n input: StandardQueryEmitterInput,\n): void {\n const planShape = inspectStandardProjectPlan(logicalPlan);\n if (input.groupBy !== undefined && !planShape.hasAggregate) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter received GROUP BY clause for a plan without aggregate nodes\",\n { component: \"standard-emitter\" },\n );\n }\n if (input.having !== undefined && !planShape.hasAggregate) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter received HAVING clause for a plan without aggregate nodes\",\n { component: \"standard-emitter\" },\n );\n }\n const expectsOrderBy = planShape.hasSort || planShape.hasVectorKnn;\n if (expectsOrderBy && input.orderBy === undefined) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter expected ORDER BY clause for plan containing a sort or vector_knn node\",\n { component: \"standard-emitter\" },\n );\n }\n if (!expectsOrderBy && input.orderBy !== undefined) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter received ORDER BY clause for a plan without sort or vector_knn nodes\",\n { component: \"standard-emitter\" },\n );\n }\n if (planShape.hasLimitOffset && input.limitOffset === undefined) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter expected LIMIT/OFFSET clause for plan containing a limit_offset node\",\n { component: \"standard-emitter\" },\n );\n }\n if (!planShape.hasLimitOffset && input.limitOffset !== undefined) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter received LIMIT/OFFSET clause for a plan without limit_offset nodes\",\n { component: \"standard-emitter\" },\n );\n }\n}\n\nexport function emitStandardQuerySql(input: StandardQueryEmitterInput): SQL {\n assertStandardEmitterClauseAlignment(input.logicalPlan, input);\n\n const parts: SQL[] = [];\n if (input.ctes.length > 0) {\n parts.push(sql`WITH ${sql.join([...input.ctes], sql`, `)}`);\n }\n\n parts.push(sql`SELECT ${input.projection}`, input.fromClause);\n\n if (input.groupBy !== undefined) {\n parts.push(input.groupBy);\n }\n if (input.having !== undefined) {\n parts.push(input.having);\n }\n if (input.orderBy !== undefined) {\n parts.push(input.orderBy);\n }\n if (input.limitOffset !== undefined) {\n parts.push(input.limitOffset);\n }\n\n return sql.join(parts, sql` `);\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { CompilerInvariantError } from \"../../errors\";\nimport { type NodePredicate, type QueryAst } from \"../ast\";\nimport {\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"./predicates\";\n\nconst EMPTY_PREDICATES: readonly NodePredicate[] = [];\n\nexport type PredicateIndex = Readonly<{\n byAliasAndType: ReadonlyMap<string, readonly NodePredicate[]>;\n}>;\n\nfunction buildPredicateIndexKey(\n alias: string,\n targetType: \"node\" | \"edge\",\n): string {\n return `${alias}\\u0000${targetType}`;\n}\n\nfunction resolvePredicateTargetType(predicate: NodePredicate): \"node\" | \"edge\" {\n return predicate.targetType === \"edge\" ? \"edge\" : \"node\";\n}\n\nexport function buildPredicateIndex(ast: QueryAst): PredicateIndex {\n const byAliasAndType = new Map<string, NodePredicate[]>();\n for (const predicate of ast.predicates) {\n const key = buildPredicateIndexKey(\n predicate.targetAlias,\n resolvePredicateTargetType(predicate),\n );\n const existing = byAliasAndType.get(key);\n if (existing === undefined) {\n byAliasAndType.set(key, [predicate]);\n } else {\n existing.push(predicate);\n }\n }\n return { byAliasAndType };\n}\n\nexport function getPredicatesForAlias(\n predicateIndex: PredicateIndex,\n alias: string,\n targetType: \"node\" | \"edge\",\n): readonly NodePredicate[] {\n return (\n predicateIndex.byAliasAndType.get(\n buildPredicateIndexKey(alias, targetType),\n ) ?? EMPTY_PREDICATES\n );\n}\n\nexport function compilePredicateClauses(\n predicates: readonly NodePredicate[],\n predicateContext: PredicateCompilerContext,\n): SQL[] {\n return predicates.map((predicate) =>\n compilePredicateExpression(predicate.expression, predicateContext),\n );\n}\n\nexport function compileKindFilter(column: SQL, kinds: readonly string[]): SQL {\n if (kinds.length === 0) {\n return sql`1 = 0`;\n }\n if (kinds.length === 1) {\n return sql`${column} = ${kinds[0]}`;\n }\n return sql`${column} IN (${sql.join(\n kinds.map((kind) => sql`${kind}`),\n sql`, `,\n )})`;\n}\n\nexport function getNodeKindsForAlias(\n ast: QueryAst,\n alias: string,\n): readonly string[] {\n if (alias === ast.start.alias) {\n return ast.start.kinds;\n }\n\n for (const traversal of ast.traversals) {\n if (traversal.nodeAlias === alias) {\n return traversal.nodeKinds;\n }\n }\n\n throw new CompilerInvariantError(`Unknown traversal source alias: ${alias}`);\n}\n","import { type SQL } from \"drizzle-orm\";\n\nimport { type DialectAdapter } from \"../dialect\";\nimport { type JsonPointer } from \"../json-pointer\";\n\ntype JsonExtractFallback = \"json\" | \"text\";\n\ntype TypedJsonExtractInput = Readonly<{\n column: SQL;\n dialect: DialectAdapter;\n fallback?: JsonExtractFallback;\n pointer: JsonPointer;\n valueType: string | undefined;\n}>;\n\nexport function compileTypedJsonExtract(input: TypedJsonExtractInput): SQL {\n const { column, dialect, pointer, valueType } = input;\n const fallback = input.fallback ?? \"json\";\n\n switch (valueType) {\n case \"string\": {\n return dialect.jsonExtractText(column, pointer);\n }\n case \"number\": {\n return dialect.jsonExtractNumber(column, pointer);\n }\n case \"boolean\": {\n return dialect.jsonExtractBoolean(column, pointer);\n }\n case \"date\": {\n return dialect.jsonExtractDate(column, pointer);\n }\n case \"array\":\n case \"object\":\n case \"embedding\":\n case \"unknown\":\n case undefined: {\n return fallback === \"text\" ?\n dialect.jsonExtractText(column, pointer)\n : dialect.jsonExtract(column, pointer);\n }\n default: {\n return fallback === \"text\" ?\n dialect.jsonExtractText(column, pointer)\n : dialect.jsonExtract(column, pointer);\n }\n }\n}\n","/**\n * Shared Compiler Utilities\n *\n * Functions and constants shared between the standard and recursive compilers.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { type AggregateExpr, type FieldRef, type SelectiveField } from \"../ast\";\n\n// ============================================================\n// Constants\n// ============================================================\n\nexport const NODE_COLUMNS = [\n \"id\",\n \"kind\",\n \"props\",\n \"version\",\n \"valid_from\",\n \"valid_to\",\n \"created_at\",\n \"updated_at\",\n \"deleted_at\",\n] as const;\n\nexport const EDGE_COLUMNS = [\n \"id\",\n \"kind\",\n \"from_id\",\n \"to_id\",\n \"props\",\n \"valid_from\",\n \"valid_to\",\n \"created_at\",\n \"updated_at\",\n \"deleted_at\",\n] as const;\n\nexport type RequiredColumnsByAlias = ReadonlyMap<string, ReadonlySet<string>>;\nexport const EMPTY_REQUIRED_COLUMNS = new Set<string>();\n\n// ============================================================\n// SQL Helpers\n// ============================================================\n\nexport function quoteIdentifier(identifier: string): SQL {\n return sql.raw(`\"${identifier.replaceAll('\"', '\"\"')}\"`);\n}\n\n// ============================================================\n// Column Projection\n// ============================================================\n\n/**\n * Determines whether a column should be included in the projection.\n *\n * @param requiredColumns - Set of columns required by the query, or undefined to include all.\n * @param column - The column name to check.\n * @param alwaysRequiredColumns - Optional set of columns that are always projected\n * (e.g. join keys in recursive CTEs). Pass only from recursive compiler callers.\n */\nexport function shouldProjectColumn(\n requiredColumns: ReadonlySet<string> | undefined,\n column: string,\n alwaysRequiredColumns?: ReadonlySet<string>,\n): boolean {\n if (alwaysRequiredColumns?.has(column)) return true;\n if (requiredColumns === undefined) return true;\n return requiredColumns.has(column);\n}\n\n// ============================================================\n// Required Column Tracking\n// ============================================================\n\nexport function addRequiredColumn(\n requiredColumnsByAlias: Map<string, Set<string>>,\n alias: string,\n column: string,\n): void {\n const existing = requiredColumnsByAlias.get(alias);\n if (existing) {\n existing.add(column);\n return;\n }\n requiredColumnsByAlias.set(alias, new Set([column]));\n}\n\nexport function markFieldRefAsRequired(\n requiredColumnsByAlias: Map<string, Set<string>>,\n field: FieldRef,\n): void {\n const column = field.path[0];\n if (column === undefined) return;\n addRequiredColumn(requiredColumnsByAlias, field.alias, column);\n}\n\nexport function mapSelectiveSystemFieldToColumn(field: string): string {\n if (field === \"fromId\") return \"from_id\";\n if (field === \"toId\") return \"to_id\";\n if (field.startsWith(\"meta.\")) {\n return field\n .slice(5)\n .replaceAll(/([A-Z])/g, \"_$1\")\n .toLowerCase();\n }\n return field;\n}\n\nexport function markSelectiveFieldAsRequired(\n requiredColumnsByAlias: Map<string, Set<string>>,\n field: SelectiveField,\n): void {\n if (field.isSystemField) {\n addRequiredColumn(\n requiredColumnsByAlias,\n field.alias,\n mapSelectiveSystemFieldToColumn(field.field),\n );\n return;\n }\n addRequiredColumn(requiredColumnsByAlias, field.alias, \"props\");\n}\n\n// ============================================================\n// AST Type Guards\n// ============================================================\n\nexport function isIdFieldRef(field: FieldRef): boolean {\n return (\n field.path.length === 1 &&\n field.path[0] === \"id\" &&\n field.jsonPointer === undefined\n );\n}\n\nexport function isAggregateExpr(\n source: FieldRef | AggregateExpr,\n): source is AggregateExpr {\n return \"__type\" in source && source.__type === \"aggregate\";\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { UnsupportedPredicateError } from \"../../../errors\";\nimport {\n type AggregateExpr,\n type FieldRef,\n type QueryAst,\n type SelectiveField,\n type VectorSimilarityPredicate,\n} from \"../../ast\";\nimport { type DialectAdapter } from \"../../dialect\";\nimport { jsonPointer } from \"../../json-pointer\";\nimport { type TemporalFilterPass } from \"../passes\";\nimport {\n compileKindFilter,\n compilePredicateClauses,\n getNodeKindsForAlias,\n getPredicatesForAlias,\n type PredicateIndex,\n} from \"../predicate-utils\";\nimport {\n compileFieldValue,\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"../predicates\";\nimport { compileTypedJsonExtract } from \"../typed-json-extract\";\nimport {\n EDGE_COLUMNS,\n EMPTY_REQUIRED_COLUMNS,\n isAggregateExpr,\n mapSelectiveSystemFieldToColumn,\n NODE_COLUMNS,\n quoteIdentifier,\n type RequiredColumnsByAlias,\n shouldProjectColumn,\n} from \"../utils\";\n\nexport type StandardEmitterPredicateIndex = PredicateIndex;\n\nfunction compileColumnReference(\n tableAlias: string | undefined,\n column: string,\n): SQL {\n if (tableAlias === undefined) {\n return sql.raw(column);\n }\n return sql`${sql.raw(tableAlias)}.${sql.raw(column)}`;\n}\n\nfunction compileNodeSelectColumns(\n tableAlias: string | undefined,\n alias: string,\n requiredColumns: ReadonlySet<string> | undefined,\n): SQL[] {\n return NODE_COLUMNS.filter(\n (column) =>\n column === \"id\" ||\n column === \"kind\" ||\n shouldProjectColumn(requiredColumns, column),\n ).map(\n (column) =>\n sql`${compileColumnReference(tableAlias, column)} AS ${sql.raw(`${alias}_${column}`)}`,\n );\n}\n\nfunction compileEdgeSelectColumns(\n tableAlias: string | undefined,\n alias: string,\n requiredColumns: ReadonlySet<string> | undefined,\n): SQL[] {\n return EDGE_COLUMNS.filter((column) =>\n shouldProjectColumn(requiredColumns, column),\n ).map(\n (column) =>\n sql`${compileColumnReference(tableAlias, column)} AS ${sql.raw(`${alias}_${column}`)}`,\n );\n}\n\ntype BuildStandardStartCteInput = Readonly<{\n ast: QueryAst;\n ctx: PredicateCompilerContext;\n graphId: string;\n predicateIndex: StandardEmitterPredicateIndex;\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined;\n temporalFilterPass: TemporalFilterPass;\n}>;\n\nexport function buildStandardStartCte(input: BuildStandardStartCteInput): SQL {\n const { ast, ctx, graphId, predicateIndex, requiredColumnsByAlias } = input;\n const alias = ast.start.alias;\n const kinds = ast.start.kinds;\n\n const kindFilter = compileKindFilter(sql.raw(\"kind\"), kinds);\n const temporalFilter = input.temporalFilterPass.forAlias();\n const cteContext: PredicateCompilerContext = { ...ctx, cteColumnPrefix: \"\" };\n const predicateClauses = compilePredicateClauses(\n getPredicatesForAlias(predicateIndex, alias, \"node\"),\n cteContext,\n );\n\n const whereClauses = [\n sql`graph_id = ${graphId}`,\n kindFilter,\n temporalFilter,\n ...predicateClauses,\n ];\n\n const effectiveRequiredColumns =\n requiredColumnsByAlias ?\n (requiredColumnsByAlias.get(alias) ?? EMPTY_REQUIRED_COLUMNS)\n : undefined;\n\n return sql`\n cte_${sql.raw(alias)} AS (\n SELECT ${sql.join(\n compileNodeSelectColumns(undefined, alias, effectiveRequiredColumns),\n sql`, `,\n )}\n FROM ${ctx.schema.nodesTable}\n WHERE ${sql.join(whereClauses, sql` AND `)}\n )\n `;\n}\n\ntype BuildStandardTraversalCteInput = Readonly<{\n ast: QueryAst;\n carryForwardPreviousColumns: boolean;\n ctx: PredicateCompilerContext;\n graphId: string;\n materializeCte: boolean;\n predicateIndex: StandardEmitterPredicateIndex;\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined;\n temporalFilterPass: TemporalFilterPass;\n traversalIndex: number;\n traversalLimit: number | undefined;\n}>;\n\nexport function buildStandardTraversalCte(\n input: BuildStandardTraversalCteInput,\n): SQL {\n const {\n ast,\n carryForwardPreviousColumns,\n ctx,\n graphId,\n materializeCte,\n predicateIndex,\n requiredColumnsByAlias,\n temporalFilterPass,\n traversalIndex,\n traversalLimit,\n } = input;\n const traversal = ast.traversals[traversalIndex]!;\n const traversalLimitValue =\n traversalIndex === ast.traversals.length - 1 ? traversalLimit : undefined;\n\n const previousNodeKinds = getNodeKindsForAlias(ast, traversal.joinFromAlias);\n const directEdgeKinds = [...new Set(traversal.edgeKinds)];\n const inverseEdgeKinds =\n traversal.inverseEdgeKinds === undefined ?\n []\n : [...new Set(traversal.inverseEdgeKinds)];\n\n const nodeKinds = traversal.nodeKinds;\n const nodeKindFilter = compileKindFilter(sql.raw(\"n.kind\"), nodeKinds);\n\n const edgeTemporalFilter = temporalFilterPass.forAlias(\"e\");\n const nodeTemporalFilter = temporalFilterPass.forAlias(\"n\");\n\n const nodeCteContext: PredicateCompilerContext = {\n ...ctx,\n cteColumnPrefix: \"n\",\n };\n const nodePredicateClauses = compilePredicateClauses(\n getPredicatesForAlias(predicateIndex, traversal.nodeAlias, \"node\"),\n nodeCteContext,\n );\n\n const edgeCteContext: PredicateCompilerContext = {\n ...ctx,\n cteColumnPrefix: \"e\",\n };\n const edgePredicateClauses = compilePredicateClauses(\n getPredicatesForAlias(predicateIndex, traversal.edgeAlias, \"edge\"),\n edgeCteContext,\n );\n\n const baseWhereClauses = [\n sql`e.graph_id = ${graphId}`,\n nodeKindFilter,\n edgeTemporalFilter,\n nodeTemporalFilter,\n ...nodePredicateClauses,\n ...edgePredicateClauses,\n ];\n\n const previousAlias = traversal.joinFromAlias;\n const edgeAlias = traversal.edgeAlias;\n const nodeAlias = traversal.nodeAlias;\n const requiredNodeColumns =\n requiredColumnsByAlias ?\n (requiredColumnsByAlias.get(nodeAlias) ?? EMPTY_REQUIRED_COLUMNS)\n : undefined;\n const requiredEdgeColumns =\n requiredColumnsByAlias ?\n (requiredColumnsByAlias.get(edgeAlias) ?? EMPTY_REQUIRED_COLUMNS)\n : undefined;\n const previousRowColumns =\n carryForwardPreviousColumns ?\n [sql`cte_${sql.raw(previousAlias)}.*`]\n : [\n sql`cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_id AS ${sql.raw(previousAlias)}_id`,\n sql`cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_kind AS ${sql.raw(previousAlias)}_kind`,\n ];\n const selectColumns = [\n ...previousRowColumns,\n ...compileEdgeSelectColumns(\"e\", edgeAlias, requiredEdgeColumns),\n ...compileNodeSelectColumns(\"n\", nodeAlias, requiredNodeColumns),\n ];\n const cteMaterialization = materializeCte ? sql`MATERIALIZED ` : sql``;\n\n function compileTraversalBranch(\n branch: Readonly<{\n duplicateGuard?: SQL | undefined;\n edgeKinds: readonly string[];\n joinField: \"from_id\" | \"to_id\";\n joinKindField: \"from_kind\" | \"to_kind\";\n targetField: \"from_id\" | \"to_id\";\n targetKindField: \"from_kind\" | \"to_kind\";\n }>,\n ): SQL {\n const whereClauses = [\n ...baseWhereClauses,\n compileKindFilter(sql.raw(\"e.kind\"), branch.edgeKinds),\n compileKindFilter(\n sql.raw(`e.${branch.joinKindField}`),\n previousNodeKinds,\n ),\n compileKindFilter(sql.raw(`e.${branch.targetKindField}`), nodeKinds),\n ];\n\n if (branch.duplicateGuard !== undefined) {\n whereClauses.push(branch.duplicateGuard);\n }\n\n return sql`\n SELECT ${sql.join(selectColumns, sql`, `)}\n FROM cte_${sql.raw(previousAlias)}\n JOIN ${ctx.schema.edgesTable} e ON cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_id = e.${sql.raw(branch.joinField)}\n AND cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_kind = e.${sql.raw(branch.joinKindField)}\n JOIN ${ctx.schema.nodesTable} n ON n.graph_id = e.graph_id\n AND n.id = e.${sql.raw(branch.targetField)}\n AND n.kind = e.${sql.raw(branch.targetKindField)}\n WHERE ${sql.join(whereClauses, sql` AND `)}\n `;\n }\n\n const directJoinField = traversal.direction === \"out\" ? \"from_id\" : \"to_id\";\n const directTargetField = traversal.direction === \"out\" ? \"to_id\" : \"from_id\";\n const directJoinKindField =\n traversal.direction === \"out\" ? \"from_kind\" : \"to_kind\";\n const directTargetKindField =\n traversal.direction === \"out\" ? \"to_kind\" : \"from_kind\";\n\n const directBranch = compileTraversalBranch({\n edgeKinds: directEdgeKinds,\n joinField: directJoinField,\n joinKindField: directJoinKindField,\n targetField: directTargetField,\n targetKindField: directTargetKindField,\n });\n\n if (inverseEdgeKinds.length === 0) {\n if (traversalLimitValue !== undefined) {\n return sql`\n cte_${sql.raw(nodeAlias)} AS ${cteMaterialization}(\n SELECT * FROM (\n ${directBranch}\n ) AS traversal_rows\n LIMIT ${traversalLimitValue}\n )\n `;\n }\n\n return sql`\n cte_${sql.raw(nodeAlias)} AS ${cteMaterialization}(\n ${directBranch}\n )\n `;\n }\n\n const inverseJoinField = traversal.direction === \"out\" ? \"to_id\" : \"from_id\";\n const inverseTargetField =\n traversal.direction === \"out\" ? \"from_id\" : \"to_id\";\n const inverseJoinKindField =\n traversal.direction === \"out\" ? \"to_kind\" : \"from_kind\";\n const inverseTargetKindField =\n traversal.direction === \"out\" ? \"from_kind\" : \"to_kind\";\n\n const overlappingKinds = inverseEdgeKinds.filter((kind) =>\n directEdgeKinds.includes(kind),\n );\n\n const duplicateGuard =\n overlappingKinds.length > 0 ?\n sql`NOT (e.from_id = e.to_id AND ${compileKindFilter(\n sql.raw(\"e.kind\"),\n overlappingKinds,\n )})`\n : undefined;\n\n const inverseBranch = compileTraversalBranch({\n duplicateGuard,\n edgeKinds: inverseEdgeKinds,\n joinField: inverseJoinField,\n joinKindField: inverseJoinKindField,\n targetField: inverseTargetField,\n targetKindField: inverseTargetKindField,\n });\n\n if (traversalLimitValue !== undefined) {\n return sql`\n cte_${sql.raw(nodeAlias)} AS ${cteMaterialization}(\n SELECT * FROM (\n ${directBranch}\n UNION ALL\n ${inverseBranch}\n ) AS traversal_rows\n LIMIT ${traversalLimitValue}\n )\n `;\n }\n\n return sql`\n cte_${sql.raw(nodeAlias)} AS ${cteMaterialization}(\n ${directBranch}\n UNION ALL\n ${inverseBranch}\n )\n `;\n}\n\nfunction compileAggregateExprFromSource(\n expr: AggregateExpr,\n dialect: DialectAdapter,\n): SQL {\n const { field } = expr;\n const fn = expr.function;\n\n switch (fn) {\n case \"count\": {\n const cteAlias = `cte_${field.alias}`;\n return sql`COUNT(${sql.raw(cteAlias)}.${sql.raw(field.alias)}_id)`;\n }\n case \"countDistinct\": {\n const cteAlias = `cte_${field.alias}`;\n return sql`COUNT(DISTINCT ${sql.raw(cteAlias)}.${sql.raw(field.alias)}_id)`;\n }\n case \"sum\":\n case \"avg\":\n case \"min\":\n case \"max\": {\n const cteAlias = `cte_${field.alias}`;\n const column = compileFieldValue(\n field,\n dialect,\n field.valueType,\n cteAlias,\n );\n return sql`${sql.raw(fn.toUpperCase())}(${column})`;\n }\n default: {\n throw new UnsupportedPredicateError(\n `Unknown aggregate function: ${String(fn)}`,\n );\n }\n }\n}\n\nfunction compileProjectedSource(\n field: {\n cteAlias?: string;\n source: FieldRef | AggregateExpr;\n },\n dialect: DialectAdapter,\n): SQL {\n if (isAggregateExpr(field.source)) {\n return compileAggregateExprFromSource(field.source, dialect);\n }\n const cteAlias = field.cteAlias ?? `cte_${field.source.alias}`;\n return compileFieldValue(\n field.source,\n dialect,\n field.source.valueType,\n cteAlias,\n );\n}\n\ntype BuildStandardProjectionInput = Readonly<{\n ast: QueryAst;\n collapsedTraversalCteAlias?: string;\n dialect: DialectAdapter;\n}>;\n\nexport function buildStandardProjection(\n input: BuildStandardProjectionInput,\n): SQL {\n const { ast, collapsedTraversalCteAlias, dialect } = input;\n if (ast.selectiveFields && ast.selectiveFields.length > 0) {\n return compileSelectiveProjection(\n ast.selectiveFields,\n dialect,\n ast,\n collapsedTraversalCteAlias,\n );\n }\n\n const fields = ast.projection.fields;\n if (fields.length === 0) {\n return sql.raw(\"*\");\n }\n\n const projectedFields = fields.map((field) => {\n const source = compileProjectedSource(field, dialect);\n return sql`${source} AS ${quoteIdentifier(field.outputName)}`;\n });\n return sql.join(projectedFields, sql`, `);\n}\n\nfunction compileSelectiveProjection(\n fields: readonly SelectiveField[],\n dialect: DialectAdapter,\n ast: QueryAst,\n collapsedTraversalCteAlias?: string,\n): SQL {\n const aliasToCte = new Map<string, string>([\n [ast.start.alias, `cte_${ast.start.alias}`],\n ]);\n\n for (const traversal of ast.traversals) {\n aliasToCte.set(traversal.nodeAlias, `cte_${traversal.nodeAlias}`);\n aliasToCte.set(traversal.edgeAlias, `cte_${traversal.nodeAlias}`);\n }\n\n const columns = fields.map((field) => {\n const cteAlias =\n collapsedTraversalCteAlias ??\n aliasToCte.get(field.alias) ??\n `cte_${field.alias}`;\n\n if (field.isSystemField) {\n const dbColumn = mapSelectiveSystemFieldToColumn(field.field);\n\n return sql`${sql.raw(cteAlias)}.${sql.raw(`${field.alias}_${dbColumn}`)} AS ${quoteIdentifier(field.outputName)}`;\n }\n\n const propsColumn = `${field.alias}_props`;\n const column = sql`${sql.raw(cteAlias)}.${sql.raw(propsColumn)}`;\n const pointer = jsonPointer([field.field]);\n const extracted = compileTypedJsonExtract({\n column,\n dialect,\n pointer,\n valueType: field.valueType,\n });\n return sql`${extracted} AS ${quoteIdentifier(field.outputName)}`;\n });\n\n return sql.join(columns, sql`, `);\n}\n\ntype BuildStandardFromClauseInput = Readonly<{\n ast: QueryAst;\n collapsedTraversalCteAlias?: string;\n vectorPredicate?: VectorSimilarityPredicate;\n}>;\n\nexport function buildStandardFromClause(\n input: BuildStandardFromClauseInput,\n): SQL {\n const { ast, collapsedTraversalCteAlias, vectorPredicate } = input;\n if (collapsedTraversalCteAlias !== undefined) {\n return sql`FROM ${sql.raw(collapsedTraversalCteAlias)}`;\n }\n\n const startAlias = ast.start.alias;\n const fromClause = sql`FROM cte_${sql.raw(startAlias)}`;\n\n const joins: SQL[] = [];\n for (const traversal of ast.traversals) {\n const cteAlias = `cte_${traversal.nodeAlias}`;\n const previousAlias = traversal.joinFromAlias;\n const joinType = traversal.optional ? \"LEFT JOIN\" : \"INNER JOIN\";\n joins.push(\n sql`${sql.raw(joinType)} ${sql.raw(cteAlias)} ON ${sql.raw(cteAlias)}.${sql.raw(previousAlias)}_id = cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_id AND ${sql.raw(cteAlias)}.${sql.raw(previousAlias)}_kind = cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_kind`,\n );\n }\n\n if (vectorPredicate) {\n const nodeAlias = vectorPredicate.field.alias;\n joins.push(\n sql`INNER JOIN cte_embeddings ON cte_embeddings.node_id = cte_${sql.raw(nodeAlias)}.${sql.raw(nodeAlias)}_id`,\n );\n }\n\n return joins.length === 0 ?\n fromClause\n : sql`${fromClause} ${sql.join(joins, sql` `)}`;\n}\n\ntype BuildStandardOrderByInput = Readonly<{\n ast: QueryAst;\n collapsedTraversalCteAlias?: string;\n dialect: DialectAdapter;\n}>;\n\nexport function buildStandardOrderBy(\n input: BuildStandardOrderByInput,\n): SQL | undefined {\n const { ast, collapsedTraversalCteAlias, dialect } = input;\n if (!ast.orderBy || ast.orderBy.length === 0) {\n return undefined;\n }\n\n const parts: SQL[] = [];\n for (const orderSpec of ast.orderBy) {\n const valueType = orderSpec.field.valueType;\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Ordering by JSON arrays or objects is not supported\",\n );\n }\n const cteAlias =\n collapsedTraversalCteAlias ?? `cte_${orderSpec.field.alias}`;\n const field = compileFieldValue(\n orderSpec.field,\n dialect,\n valueType,\n cteAlias,\n );\n const direction = sql.raw(orderSpec.direction.toUpperCase());\n const nulls =\n orderSpec.nulls ?? (orderSpec.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDirection = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n parts.push(\n sql`(${field} IS NULL) ${nullsDirection}`,\n sql`${field} ${direction}`,\n );\n }\n\n return sql`ORDER BY ${sql.join(parts, sql`, `)}`;\n}\n\nfunction fieldRefKey(field: FieldRef): string {\n const pointer = field.jsonPointer ?? \"\";\n return `${field.alias}:${field.path.join(\".\")}:${pointer}`;\n}\n\ntype BuildStandardGroupByInput = Readonly<{\n ast: QueryAst;\n dialect: DialectAdapter;\n}>;\n\nexport function buildStandardGroupBy(\n input: BuildStandardGroupByInput,\n): SQL | undefined {\n const { ast, dialect } = input;\n if (!ast.groupBy || ast.groupBy.fields.length === 0) {\n return undefined;\n }\n\n const seenKeys = new Set<string>();\n const allFields: FieldRef[] = [];\n\n for (const projectedField of ast.projection.fields) {\n if (projectedField.source.__type === \"field_ref\") {\n const key = fieldRefKey(projectedField.source);\n if (!seenKeys.has(key)) {\n seenKeys.add(key);\n allFields.push(projectedField.source);\n }\n }\n }\n\n for (const field of ast.groupBy.fields) {\n const key = fieldRefKey(field);\n if (!seenKeys.has(key)) {\n seenKeys.add(key);\n allFields.push(field);\n }\n }\n\n if (allFields.length === 0) {\n return undefined;\n }\n\n const parts = allFields.map((field) =>\n compileFieldValue(field, dialect, field.valueType, `cte_${field.alias}`),\n );\n\n return sql`GROUP BY ${sql.join(parts, sql`, `)}`;\n}\n\ntype BuildStandardHavingInput = Readonly<{\n ast: QueryAst;\n ctx: PredicateCompilerContext;\n}>;\n\nexport function buildStandardHaving(\n input: BuildStandardHavingInput,\n): SQL | undefined {\n const { ast, ctx } = input;\n if (!ast.having) {\n return undefined;\n }\n\n const condition = compilePredicateExpression(ast.having, ctx);\n return sql`HAVING ${condition}`;\n}\n\ntype BuildStandardEmbeddingsCteInput = Readonly<{\n ctx: PredicateCompilerContext;\n graphId: string;\n vectorPredicate: VectorSimilarityPredicate;\n}>;\n\nexport function buildStandardEmbeddingsCte(\n input: BuildStandardEmbeddingsCteInput,\n): SQL {\n const { ctx, graphId, vectorPredicate } = input;\n const { dialect } = ctx;\n const { field, metric, minScore, queryEmbedding } = vectorPredicate;\n\n const fieldPath =\n field.jsonPointer ? (field.jsonPointer as string)\n : field.path.length > 1 && field.path[0] === \"props\" ?\n `/${field.path.slice(1).join(\"/\")}`\n : `/${field.path.join(\"/\")}`;\n\n const distanceExpr = dialect.vectorDistance(\n sql.raw(\"embedding\"),\n queryEmbedding,\n metric,\n );\n\n const conditions: SQL[] = [\n sql`graph_id = ${graphId}`,\n sql`field_path = ${fieldPath}`,\n ];\n\n if (minScore !== undefined) {\n // minScore validation (finiteness, cosine range) is handled by the vector\n // predicate pass in passes/vector.ts — no redundant check here.\n conditions.push(\n compileVectorMinScoreCondition(distanceExpr, metric, minScore),\n );\n }\n\n const scoreExpr = compileVectorScoreExpression(distanceExpr, metric);\n\n return sql`\n cte_embeddings AS (\n SELECT\n node_id,\n ${distanceExpr} AS distance,\n ${scoreExpr} AS score\n FROM ${ctx.schema.embeddingsTable}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${distanceExpr} ASC\n )\n `;\n}\n\nfunction compileVectorScoreExpression(\n distanceExpr: SQL,\n metric: VectorSimilarityPredicate[\"metric\"],\n): SQL {\n switch (metric) {\n case \"cosine\": {\n return sql`(1.0 - ${distanceExpr})`;\n }\n case \"l2\":\n case \"inner_product\": {\n return distanceExpr;\n }\n }\n}\n\nfunction compileVectorMinScoreCondition(\n distanceExpr: SQL,\n metric: VectorSimilarityPredicate[\"metric\"],\n minScore: number,\n): SQL {\n switch (metric) {\n case \"cosine\": {\n const threshold = 1 - minScore;\n return sql`${distanceExpr} <= ${threshold}`;\n }\n case \"l2\": {\n return sql`${distanceExpr} <= ${minScore}`;\n }\n case \"inner_product\": {\n const negativeThreshold = -minScore;\n return sql`${distanceExpr} <= ${negativeThreshold}`;\n }\n }\n}\n\ntype BuildStandardVectorOrderByInput = Readonly<{\n ast: QueryAst;\n dialect: DialectAdapter;\n}>;\n\nexport function buildStandardVectorOrderBy(\n input: BuildStandardVectorOrderByInput,\n): SQL {\n const { ast, dialect } = input;\n\n const distanceOrder = sql`cte_embeddings.distance ASC`;\n const additionalOrders: SQL[] = [];\n\n if (ast.orderBy && ast.orderBy.length > 0) {\n for (const orderSpec of ast.orderBy) {\n const valueType = orderSpec.field.valueType;\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Ordering by JSON arrays or objects is not supported\",\n );\n }\n const cteAlias = `cte_${orderSpec.field.alias}`;\n const field = compileFieldValue(\n orderSpec.field,\n dialect,\n valueType,\n cteAlias,\n );\n const direction = sql.raw(orderSpec.direction.toUpperCase());\n const nulls =\n orderSpec.nulls ?? (orderSpec.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDirection = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n additionalOrders.push(\n sql`(${field} IS NULL) ${nullsDirection}`,\n sql`${field} ${direction}`,\n );\n }\n }\n\n const allOrders = [distanceOrder, ...additionalOrders];\n return sql`ORDER BY ${sql.join(allOrders, sql`, `)}`;\n}\n\ntype BuildLimitOffsetClauseInput = Readonly<{\n limit: number | undefined;\n offset: number | undefined;\n}>;\n\nexport function buildLimitOffsetClause(\n input: BuildLimitOffsetClauseInput,\n): SQL | undefined {\n const { limit, offset } = input;\n const parts: SQL[] = [];\n\n if (limit !== undefined) {\n parts.push(sql`LIMIT ${limit}`);\n }\n if (offset !== undefined) {\n parts.push(sql`OFFSET ${offset}`);\n }\n\n return parts.length > 0 ? sql.join(parts, sql` `) : undefined;\n}\n","/**\n * Recursive CTE Compilation\n *\n * Compiles variable-length path traversals using WITH RECURSIVE.\n * Handles cycle detection and depth limiting using dialect-specific operations.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport {\n CompilerInvariantError,\n UnsupportedPredicateError,\n} from \"../../errors\";\nimport { type QueryAst, type SelectiveField } from \"../ast\";\nimport {\n type DialectAdapter,\n type DialectRecursiveQueryStrategy,\n} from \"../dialect\";\nimport { jsonPointer } from \"../json-pointer\";\nimport { emitRecursiveQuerySql } from \"./emitter\";\nimport {\n createTemporalFilterPass,\n runCompilerPass,\n runRecursiveTraversalSelectionPass,\n type TemporalFilterPass,\n type VariableLengthTraversal,\n} from \"./passes\";\nimport { type LogicalPlan, lowerRecursiveQueryToLogicalPlan } from \"./plan\";\nimport { compileKindFilter as sharedCompileKindFilter } from \"./predicate-utils\";\nimport {\n compileFieldValue,\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"./predicates\";\nimport { compileTypedJsonExtract } from \"./typed-json-extract\";\nimport {\n addRequiredColumn,\n EMPTY_REQUIRED_COLUMNS,\n mapSelectiveSystemFieldToColumn,\n markFieldRefAsRequired,\n markSelectiveFieldAsRequired,\n NODE_COLUMNS,\n quoteIdentifier,\n type RequiredColumnsByAlias,\n shouldProjectColumn,\n} from \"./utils\";\n\n// ============================================================\n// Constants\n// ============================================================\n\n/**\n * Maximum depth for recursive CTE queries when maxDepth is unlimited (-1).\n *\n * This default limit prevents runaway recursion for unbounded traversals while\n * still supporting typical neighborhood/path use-cases.\n */\nexport const MAX_RECURSIVE_DEPTH = 100;\n\n/**\n * Maximum depth for explicit maxDepth traversals.\n *\n * Explicit traversal bounds are opt-in and safe to allow at a higher ceiling\n * for stress testing and long-path workloads.\n */\nexport const MAX_EXPLICIT_RECURSIVE_DEPTH = 1000;\n\nconst NO_ALWAYS_REQUIRED_COLUMNS = new Set<string>();\n\ntype RecursiveQueryPassState = Readonly<{\n ast: QueryAst;\n ctx: PredicateCompilerContext;\n graphId: string;\n logicalPlan: LogicalPlan | undefined;\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined;\n temporalFilterPass: TemporalFilterPass | undefined;\n traversal: VariableLengthTraversal | undefined;\n}>;\n\nfunction runRecursiveQueryPassPipeline(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): RecursiveQueryPassState {\n let state: RecursiveQueryPassState = {\n ast,\n ctx,\n graphId,\n logicalPlan: undefined,\n requiredColumnsByAlias: undefined,\n temporalFilterPass: undefined,\n traversal: undefined,\n };\n\n const recursiveTraversalPass = runCompilerPass(state, {\n name: \"recursive_traversal\",\n execute(currentState): VariableLengthTraversal {\n return runRecursiveTraversalSelectionPass(currentState.ast);\n },\n update(currentState, traversal): RecursiveQueryPassState {\n return {\n ...currentState,\n traversal,\n };\n },\n });\n state = recursiveTraversalPass.state;\n\n const temporalPass = runCompilerPass(state, {\n name: \"temporal_filters\",\n execute(currentState): TemporalFilterPass {\n return createTemporalFilterPass(\n currentState.ast,\n currentState.ctx.dialect.currentTimestamp(),\n );\n },\n update(currentState, temporalFilterPass): RecursiveQueryPassState {\n return {\n ...currentState,\n temporalFilterPass,\n };\n },\n });\n state = temporalPass.state;\n\n const columnPruningPass = runCompilerPass(state, {\n name: \"column_pruning\",\n execute(currentState): RequiredColumnsByAlias | undefined {\n const traversal = currentState.traversal;\n if (traversal === undefined) {\n throw new CompilerInvariantError(\n \"Recursive traversal pass did not select traversal\",\n );\n }\n return collectRequiredColumnsByAlias(currentState.ast, traversal);\n },\n update(currentState, requiredColumnsByAlias): RecursiveQueryPassState {\n return {\n ...currentState,\n requiredColumnsByAlias,\n };\n },\n });\n state = columnPruningPass.state;\n\n const logicalPlanPass = runCompilerPass(state, {\n name: \"logical_plan\",\n execute(currentState): LogicalPlan {\n const loweringInput = {\n ast: currentState.ast,\n dialect: currentState.ctx.dialect.name,\n graphId: currentState.graphId,\n ...(currentState.traversal === undefined ?\n {}\n : { traversal: currentState.traversal }),\n };\n return lowerRecursiveQueryToLogicalPlan(loweringInput);\n },\n update(currentState, logicalPlan): RecursiveQueryPassState {\n return {\n ...currentState,\n logicalPlan,\n };\n },\n });\n state = logicalPlanPass.state;\n\n return state;\n}\n\n// ============================================================\n// Main Compiler\n// ============================================================\n\n/**\n * Compiles a variable-length query using recursive CTEs.\n *\n * @param ast - The query AST\n * @param graphId - The graph ID\n * @param ctx - Predicate compiler context\n * @returns SQL for the recursive query\n */\nexport function compileVariableLengthQuery(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const strategy = ctx.dialect.capabilities.recursiveQueryStrategy;\n const handler = RECURSIVE_QUERY_STRATEGY_HANDLERS[strategy];\n return handler(ast, graphId, ctx);\n}\n\ntype RecursiveQueryStrategyHandler = (\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n) => SQL;\n\nconst RECURSIVE_QUERY_STRATEGY_HANDLERS: Record<\n DialectRecursiveQueryStrategy,\n RecursiveQueryStrategyHandler\n> = {\n recursive_cte: compileVariableLengthQueryWithRecursiveCteStrategy,\n};\n\nfunction compileVariableLengthQueryWithRecursiveCteStrategy(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const passState = runRecursiveQueryPassPipeline(ast, graphId, ctx);\n\n const { dialect } = ctx;\n const {\n logicalPlan,\n requiredColumnsByAlias,\n temporalFilterPass,\n traversal: vlTraversal,\n } = passState;\n\n if (temporalFilterPass === undefined) {\n throw new CompilerInvariantError(\n \"Temporal filter pass did not initialize temporal state\",\n );\n }\n if (logicalPlan === undefined) {\n throw new CompilerInvariantError(\n \"Logical plan pass did not initialize plan state\",\n );\n }\n if (vlTraversal === undefined) {\n throw new CompilerInvariantError(\n \"Recursive traversal pass did not select traversal\",\n );\n }\n\n // Build the recursive CTE\n const recursiveCte = compileRecursiveCte(\n ast,\n vlTraversal,\n graphId,\n ctx,\n requiredColumnsByAlias,\n temporalFilterPass,\n );\n\n // Build projection\n const projection = compileRecursiveProjection(ast, vlTraversal, dialect);\n\n // Build final SELECT\n const minDepth = vlTraversal.variableLength.minDepth;\n const depthFilter =\n minDepth > 0 ? sql`WHERE depth >= ${minDepth}` : sql.raw(\"\");\n\n // Order by and limit/offset\n const orderBy = compileRecursiveOrderBy(ast, dialect);\n const limitOffset = compileLimitOffset(ast);\n\n return emitRecursiveQuerySql({\n depthFilter,\n ...(limitOffset === undefined ? {} : { limitOffset }),\n logicalPlan,\n ...(orderBy === undefined ? {} : { orderBy }),\n projection,\n recursiveCte,\n });\n}\n\n/**\n * Checks if a query contains variable-length traversals.\n */\nexport function hasVariableLengthTraversal(ast: QueryAst): boolean {\n return ast.traversals.some((t) => t.variableLength !== undefined);\n}\n\n// ============================================================\n// Recursive CTE Generation\n// ============================================================\n\n/**\n * Compiles the recursive CTE for variable-length traversal.\n */\nfunction compileRecursiveCte(\n ast: QueryAst,\n traversal: VariableLengthTraversal,\n graphId: string,\n ctx: PredicateCompilerContext,\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined,\n temporalFilterPass: TemporalFilterPass,\n): SQL {\n const { dialect } = ctx;\n const startAlias = ast.start.alias;\n const startKinds = ast.start.kinds;\n const nodeAlias = traversal.nodeAlias;\n const directEdgeKinds = [...new Set(traversal.edgeKinds)];\n const inverseEdgeKinds =\n traversal.inverseEdgeKinds === undefined ?\n []\n : [...new Set(traversal.inverseEdgeKinds)];\n const forceWorktableOuterJoinOrder =\n dialect.capabilities.forceRecursiveWorktableOuterJoinOrder;\n const nodeKinds = traversal.nodeKinds;\n const previousNodeKinds = [...new Set([...startKinds, ...nodeKinds])];\n const direction = traversal.direction;\n const vl = traversal.variableLength;\n const shouldEnforceCycleCheck = vl.cyclePolicy !== \"allow\";\n const shouldTrackPath = shouldEnforceCycleCheck || vl.pathAlias !== undefined;\n const recursiveJoinRequiredColumns = new Set<string>([\"id\"]);\n if (previousNodeKinds.length > 1) {\n recursiveJoinRequiredColumns.add(\"kind\");\n }\n const requiredStartColumns =\n requiredColumnsByAlias ?\n (requiredColumnsByAlias.get(startAlias) ?? EMPTY_REQUIRED_COLUMNS)\n : undefined;\n const requiredNodeColumns =\n requiredColumnsByAlias ?\n (requiredColumnsByAlias.get(nodeAlias) ?? EMPTY_REQUIRED_COLUMNS)\n : undefined;\n const startColumnsFromBase = compileNodeSelectColumnsFromTable(\n \"n0\",\n startAlias,\n requiredStartColumns,\n NO_ALWAYS_REQUIRED_COLUMNS,\n );\n const startColumnsFromRecursive = compileNodeSelectColumnsFromRecursiveRow(\n startAlias,\n requiredStartColumns,\n NO_ALWAYS_REQUIRED_COLUMNS,\n );\n const nodeColumnsFromBase = compileNodeSelectColumnsFromTable(\n \"n0\",\n nodeAlias,\n requiredNodeColumns,\n recursiveJoinRequiredColumns,\n );\n const nodeColumnsFromRecursive = compileNodeSelectColumnsFromTable(\n \"n\",\n nodeAlias,\n requiredNodeColumns,\n recursiveJoinRequiredColumns,\n );\n\n const startKindFilter = compileKindFilter(startKinds, \"n0.kind\");\n const nodeKindFilter = compileKindFilter(nodeKinds, \"n.kind\");\n\n const startTemporalFilter = temporalFilterPass.forAlias(\"n0\");\n const edgeTemporalFilter = temporalFilterPass.forAlias(\"e\");\n const nodeTemporalFilter = temporalFilterPass.forAlias(\"n\");\n\n // Start predicates (with cteColumnPrefix \"\" for raw n0 columns)\n const startContext = { ...ctx, cteColumnPrefix: \"\" };\n const startPredicates = compileNodePredicates(ast, startAlias, startContext);\n\n // Edge predicates (with cteColumnPrefix \"e\" for e.props)\n const edgeContext = { ...ctx, cteColumnPrefix: \"e\" };\n const edgePredicates = compileEdgePredicates(\n ast,\n traversal.edgeAlias,\n edgeContext,\n );\n\n // Target node predicates (with cteColumnPrefix \"n\" for n.props)\n const targetContext = { ...ctx, cteColumnPrefix: \"n\" };\n const targetNodePredicates = compileNodePredicates(\n ast,\n nodeAlias,\n targetContext,\n );\n\n // Max depth condition:\n // - unlimited traversals are capped at MAX_RECURSIVE_DEPTH\n // - explicit maxDepth traversals must not exceed MAX_EXPLICIT_RECURSIVE_DEPTH\n if (vl.maxDepth > MAX_EXPLICIT_RECURSIVE_DEPTH) {\n throw new UnsupportedPredicateError(\n `Recursive traversal maxHops(${vl.maxDepth}) exceeds maximum explicit depth of ${MAX_EXPLICIT_RECURSIVE_DEPTH}`,\n );\n }\n const effectiveMaxDepth = vl.maxDepth > 0 ? vl.maxDepth : MAX_RECURSIVE_DEPTH;\n const maxDepthCondition = sql`r.depth < ${effectiveMaxDepth}`;\n\n const cycleCheck =\n shouldEnforceCycleCheck ?\n dialect.cycleCheck(sql.raw(\"n.id\"), sql.raw(\"r.path\"))\n : undefined;\n const initialPath =\n shouldTrackPath ? dialect.initializePath(sql.raw(\"n0.id\")) : undefined;\n const pathExtension =\n shouldTrackPath ?\n dialect.extendPath(sql.raw(\"r.path\"), sql.raw(\"n.id\"))\n : undefined;\n\n // Base case WHERE clauses\n const baseWhereClauses = [\n sql`n0.graph_id = ${graphId}`,\n startKindFilter,\n startTemporalFilter,\n ...startPredicates,\n ];\n\n const recursiveBaseWhereClauses: SQL[] = [\n sql`e.graph_id = ${graphId}`,\n nodeKindFilter,\n edgeTemporalFilter,\n nodeTemporalFilter,\n maxDepthCondition,\n ];\n if (cycleCheck !== undefined) {\n recursiveBaseWhereClauses.push(cycleCheck);\n }\n recursiveBaseWhereClauses.push(...edgePredicates, ...targetNodePredicates);\n\n function compileRecursiveBranch(\n branch: Readonly<{\n joinField: \"from_id\" | \"to_id\";\n targetField: \"from_id\" | \"to_id\";\n joinKindField: \"from_kind\" | \"to_kind\";\n targetKindField: \"from_kind\" | \"to_kind\";\n edgeKinds: readonly string[];\n duplicateGuard?: SQL | undefined;\n }>,\n ): SQL {\n const recursiveFilterClauses = [\n ...recursiveBaseWhereClauses,\n compileKindFilter(branch.edgeKinds, \"e.kind\"),\n compileKindFilter(previousNodeKinds, `e.${branch.joinKindField}`),\n compileKindFilter(nodeKinds, `e.${branch.targetKindField}`),\n ];\n\n if (branch.duplicateGuard !== undefined) {\n recursiveFilterClauses.push(branch.duplicateGuard);\n }\n\n const recursiveSelectColumns = [\n ...startColumnsFromRecursive,\n ...nodeColumnsFromRecursive,\n sql`r.depth + 1 AS depth`,\n ];\n if (pathExtension !== undefined) {\n recursiveSelectColumns.push(sql`${pathExtension} AS path`);\n }\n const recursiveJoinClauses: SQL[] = [\n sql`e.${sql.raw(branch.joinField)} = r.${sql.raw(nodeAlias)}_id`,\n ];\n if (previousNodeKinds.length > 1) {\n recursiveJoinClauses.push(\n sql`e.${sql.raw(branch.joinKindField)} = r.${sql.raw(nodeAlias)}_kind`,\n );\n }\n\n if (forceWorktableOuterJoinOrder) {\n const recursiveWhereClauses = [\n ...recursiveJoinClauses,\n ...recursiveFilterClauses,\n ];\n\n return sql`\n SELECT ${sql.join(recursiveSelectColumns, sql`, `)}\n FROM recursive_cte r\n CROSS JOIN ${ctx.schema.edgesTable} e\n JOIN ${ctx.schema.nodesTable} n ON n.graph_id = e.graph_id\n AND n.id = e.${sql.raw(branch.targetField)}\n AND n.kind = e.${sql.raw(branch.targetKindField)}\n WHERE ${sql.join(recursiveWhereClauses, sql` AND `)}\n `;\n }\n\n return sql`\n SELECT ${sql.join(recursiveSelectColumns, sql`, `)}\n FROM recursive_cte r\n JOIN ${ctx.schema.edgesTable} e ON ${sql.join(recursiveJoinClauses, sql` AND `)}\n JOIN ${ctx.schema.nodesTable} n ON n.graph_id = e.graph_id\n AND n.id = e.${sql.raw(branch.targetField)}\n AND n.kind = e.${sql.raw(branch.targetKindField)}\n WHERE ${sql.join(recursiveFilterClauses, sql` AND `)}\n `;\n }\n\n const directJoinField = direction === \"out\" ? \"from_id\" : \"to_id\";\n const directTargetField = direction === \"out\" ? \"to_id\" : \"from_id\";\n const directJoinKindField = direction === \"out\" ? \"from_kind\" : \"to_kind\";\n const directTargetKindField = direction === \"out\" ? \"to_kind\" : \"from_kind\";\n\n const directBranch = compileRecursiveBranch({\n joinField: directJoinField,\n targetField: directTargetField,\n joinKindField: directJoinKindField,\n targetKindField: directTargetKindField,\n edgeKinds: directEdgeKinds,\n });\n\n function compileInverseRecursiveBranch(): SQL {\n const inverseJoinField = direction === \"out\" ? \"to_id\" : \"from_id\";\n const inverseTargetField = direction === \"out\" ? \"from_id\" : \"to_id\";\n const inverseJoinKindField = direction === \"out\" ? \"to_kind\" : \"from_kind\";\n const inverseTargetKindField =\n direction === \"out\" ? \"from_kind\" : \"to_kind\";\n const overlappingKinds = inverseEdgeKinds.filter((kind) =>\n directEdgeKinds.includes(kind),\n );\n\n const duplicateGuard =\n overlappingKinds.length > 0 ?\n sql`NOT (e.from_id = e.to_id AND ${compileKindFilter(overlappingKinds, \"e.kind\")})`\n : undefined;\n\n const inverseBranch = compileRecursiveBranch({\n joinField: inverseJoinField,\n targetField: inverseTargetField,\n joinKindField: inverseJoinKindField,\n targetKindField: inverseTargetKindField,\n edgeKinds: inverseEdgeKinds,\n duplicateGuard,\n });\n\n return sql`\n ${directBranch}\n UNION ALL\n ${inverseBranch}\n `;\n }\n\n const recursiveBranchSql =\n inverseEdgeKinds.length === 0 ?\n directBranch\n : compileInverseRecursiveBranch();\n const baseSelectColumns = [\n ...startColumnsFromBase,\n ...nodeColumnsFromBase,\n sql`0 AS depth`,\n ];\n if (initialPath !== undefined) {\n baseSelectColumns.push(sql`${initialPath} AS path`);\n }\n\n return sql`\n recursive_cte AS (\n -- Base case: starting nodes\n SELECT ${sql.join(baseSelectColumns, sql`, `)}\n FROM ${ctx.schema.nodesTable} n0\n WHERE ${sql.join(baseWhereClauses, sql` AND `)}\n\n UNION ALL\n\n -- Recursive case: follow edges\n ${recursiveBranchSql}\n )\n `;\n}\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\n/**\n * Compiles a kind filter for IN clause.\n * Delegates to the shared compileKindFilter from predicate-utils\n * with a raw SQL column expression.\n */\nfunction compileKindFilter(kinds: readonly string[], columnExpr: string): SQL {\n return sharedCompileKindFilter(sql.raw(columnExpr), kinds);\n}\n\n/**\n * Compiles node predicates for a specific alias.\n * Filters by alias and excludes edge predicates (targetType !== \"edge\").\n */\nfunction compileNodePredicates(\n ast: QueryAst,\n alias: string,\n ctx: PredicateCompilerContext,\n): SQL[] {\n return ast.predicates\n .filter((p) => p.targetAlias === alias && p.targetType !== \"edge\")\n .map((p) => compilePredicateExpression(p.expression, ctx));\n}\n\n/**\n * Compiles edge predicates for a specific edge alias.\n * Filters by alias and only includes edge predicates (targetType === \"edge\").\n */\nfunction compileEdgePredicates(\n ast: QueryAst,\n edgeAlias: string,\n ctx: PredicateCompilerContext,\n): SQL[] {\n return ast.predicates\n .filter((p) => p.targetAlias === edgeAlias && p.targetType === \"edge\")\n .map((p) => compilePredicateExpression(p.expression, ctx));\n}\n\nfunction collectRequiredColumnsByAlias(\n ast: QueryAst,\n traversal: VariableLengthTraversal,\n): RequiredColumnsByAlias | undefined {\n const selectiveFields = ast.selectiveFields;\n if (selectiveFields === undefined || selectiveFields.length === 0) {\n return undefined;\n }\n\n const requiredColumnsByAlias = new Map<string, Set<string>>();\n const previousNodeKinds = [\n ...new Set([...ast.start.kinds, ...traversal.nodeKinds]),\n ];\n\n // Recursive expansion always needs node alias id for joins/cycle checks.\n addRequiredColumn(requiredColumnsByAlias, traversal.nodeAlias, \"id\");\n if (previousNodeKinds.length > 1) {\n addRequiredColumn(requiredColumnsByAlias, traversal.nodeAlias, \"kind\");\n }\n\n for (const field of selectiveFields) {\n markSelectiveFieldAsRequired(requiredColumnsByAlias, field);\n }\n\n if (ast.orderBy) {\n for (const orderSpec of ast.orderBy) {\n markFieldRefAsRequired(requiredColumnsByAlias, orderSpec.field);\n }\n }\n\n return requiredColumnsByAlias;\n}\n\nfunction compileNodeSelectColumnsFromTable(\n tableAlias: string,\n alias: string,\n requiredColumns: ReadonlySet<string> | undefined,\n alwaysRequiredColumns: ReadonlySet<string>,\n): SQL[] {\n return NODE_COLUMNS.filter((column) =>\n shouldProjectColumn(requiredColumns, column, alwaysRequiredColumns),\n ).map(\n (column) =>\n sql`${sql.raw(tableAlias)}.${sql.raw(column)} AS ${sql.raw(`${alias}_${column}`)}`,\n );\n}\n\nfunction compileNodeSelectColumnsFromRecursiveRow(\n alias: string,\n requiredColumns: ReadonlySet<string> | undefined,\n alwaysRequiredColumns: ReadonlySet<string>,\n): SQL[] {\n return NODE_COLUMNS.filter((column) =>\n shouldProjectColumn(requiredColumns, column, alwaysRequiredColumns),\n ).map((column) => {\n const projected = `${alias}_${column}`;\n return sql`r.${sql.raw(projected)} AS ${sql.raw(projected)}`;\n });\n}\n\n/**\n * Compiles projection for recursive query results.\n */\nfunction compileRecursiveProjection(\n ast: QueryAst,\n traversal: VariableLengthTraversal,\n dialect: DialectAdapter,\n): SQL {\n if (ast.selectiveFields && ast.selectiveFields.length > 0) {\n return compileRecursiveSelectiveProjection(\n ast.selectiveFields,\n ast,\n traversal,\n dialect,\n );\n }\n\n const startAlias = ast.start.alias;\n const nodeAlias = traversal.nodeAlias;\n const vl = traversal.variableLength;\n\n const fields: SQL[] = [\n // Start alias fields with metadata\n sql`${sql.raw(startAlias)}_id`,\n sql`${sql.raw(startAlias)}_kind`,\n sql`${sql.raw(startAlias)}_props`,\n sql`${sql.raw(startAlias)}_version`,\n sql`${sql.raw(startAlias)}_valid_from`,\n sql`${sql.raw(startAlias)}_valid_to`,\n sql`${sql.raw(startAlias)}_created_at`,\n sql`${sql.raw(startAlias)}_updated_at`,\n sql`${sql.raw(startAlias)}_deleted_at`,\n // Node alias fields with metadata\n sql`${sql.raw(nodeAlias)}_id`,\n sql`${sql.raw(nodeAlias)}_kind`,\n sql`${sql.raw(nodeAlias)}_props`,\n sql`${sql.raw(nodeAlias)}_version`,\n sql`${sql.raw(nodeAlias)}_valid_from`,\n sql`${sql.raw(nodeAlias)}_valid_to`,\n sql`${sql.raw(nodeAlias)}_created_at`,\n sql`${sql.raw(nodeAlias)}_updated_at`,\n sql`${sql.raw(nodeAlias)}_deleted_at`,\n ];\n\n if (vl.depthAlias !== undefined) {\n fields.push(sql`depth AS ${quoteIdentifier(vl.depthAlias)}`);\n }\n\n if (vl.pathAlias !== undefined) {\n fields.push(sql`path AS ${quoteIdentifier(vl.pathAlias)}`);\n }\n\n return sql.join(fields, sql`, `);\n}\n\nfunction compileRecursiveSelectiveProjection(\n fields: readonly SelectiveField[],\n ast: QueryAst,\n traversal: VariableLengthTraversal,\n dialect: DialectAdapter,\n): SQL {\n const allowedAliases = new Set([ast.start.alias, traversal.nodeAlias]);\n\n const columns: SQL[] = fields.map((field) => {\n if (!allowedAliases.has(field.alias)) {\n throw new UnsupportedPredicateError(\n `Selective projection for recursive traversals does not support alias \"${field.alias}\"`,\n );\n }\n\n if (field.isSystemField) {\n const dbColumn = mapSelectiveSystemFieldToColumn(field.field);\n return sql`${sql.raw(`${field.alias}_${dbColumn}`)} AS ${quoteIdentifier(field.outputName)}`;\n }\n\n const column = sql.raw(`${field.alias}_props`);\n const extracted = compileTypedJsonExtract({\n column,\n dialect,\n pointer: jsonPointer([field.field]),\n valueType: field.valueType,\n });\n return sql`${extracted} AS ${quoteIdentifier(field.outputName)}`;\n });\n\n // Include recursive depth/path columns when present\n const vl = traversal.variableLength;\n if (vl.depthAlias !== undefined) {\n columns.push(sql`depth AS ${quoteIdentifier(vl.depthAlias)}`);\n }\n if (vl.pathAlias !== undefined) {\n columns.push(sql`path AS ${quoteIdentifier(vl.pathAlias)}`);\n }\n\n return sql.join(columns, sql`, `);\n}\n\n/**\n * Compiles ORDER BY for recursive query.\n */\nfunction compileRecursiveOrderBy(\n ast: QueryAst,\n dialect: DialectAdapter,\n): SQL | undefined {\n if (!ast.orderBy || ast.orderBy.length === 0) {\n return undefined;\n }\n\n const parts: SQL[] = [];\n\n for (const orderSpec of ast.orderBy) {\n const valueType = orderSpec.field.valueType;\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Ordering by JSON arrays or objects is not supported\",\n );\n }\n const field = compileFieldValue(orderSpec.field, dialect, valueType);\n const direction = sql.raw(orderSpec.direction.toUpperCase());\n const nulls =\n orderSpec.nulls ?? (orderSpec.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDirection = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n\n parts.push(\n sql`(${field} IS NULL) ${nullsDirection}`,\n sql`${field} ${direction}`,\n );\n }\n\n return sql`ORDER BY ${sql.join(parts, sql`, `)}`;\n}\n\n/**\n * Compiles LIMIT and OFFSET clauses.\n */\nfunction compileLimitOffset(ast: QueryAst): SQL | undefined {\n const parts: SQL[] = [];\n\n if (ast.limit !== undefined) {\n parts.push(sql`LIMIT ${ast.limit}`);\n }\n if (ast.offset !== undefined) {\n parts.push(sql`OFFSET ${ast.offset}`);\n }\n\n return parts.length > 0 ? sql.join(parts, sql` `) : undefined;\n}\n","/**\n * SQL Schema Configuration for Query Compilation\n *\n * Provides table and column identifiers that the query compiler uses.\n * This allows the compiler to work with custom table names instead of\n * hard-coded defaults.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { ConfigurationError } from \"../../errors\";\n\n/**\n * Table names for TypeGraph SQL schema.\n */\nexport type SqlTableNames = Readonly<{\n /** Nodes table name (default: \"typegraph_nodes\") */\n nodes: string;\n /** Edges table name (default: \"typegraph_edges\") */\n edges: string;\n /** Node embeddings table name (default: \"typegraph_node_embeddings\") */\n embeddings: string;\n}>;\n\n/**\n * SQL schema configuration for query compilation.\n * Contains table identifiers and utility methods for generating SQL references.\n */\nexport type SqlSchema = Readonly<{\n /** Table names */\n tables: SqlTableNames;\n /** Get a SQL reference to the nodes table */\n nodesTable: SQL;\n /** Get a SQL reference to the edges table */\n edgesTable: SQL;\n /** Get a SQL reference to the embeddings table */\n embeddingsTable: SQL;\n}>;\n\n/**\n * Default table names matching the standard TypeGraph schema.\n */\nconst DEFAULT_TABLE_NAMES: SqlTableNames = {\n nodes: \"typegraph_nodes\",\n edges: \"typegraph_edges\",\n embeddings: \"typegraph_node_embeddings\",\n};\n\n/**\n * Maximum identifier length.\n * PostgreSQL uses NAMEDATALEN (64) - 1 = 63 as the max identifier length.\n * SQLite has no practical limit but we use PostgreSQL's for cross-database safety.\n */\nconst MAX_IDENTIFIER_LENGTH = 63;\n\n/**\n * Regex for valid SQL identifiers.\n * Must start with a letter or underscore.\n * Can contain letters, digits, underscores, and dollar signs.\n * Dollar signs are a PostgreSQL extension but commonly supported.\n */\nconst VALID_IDENTIFIER_PATTERN = /^[a-z_][a-z0-9_$]*$/i;\n\n/**\n * Validates that a table name is a valid SQL identifier.\n *\n * @throws Error if the table name is invalid\n */\nfunction validateTableName(name: string, label: string): void {\n if (!name || name.length === 0) {\n throw new ConfigurationError(`${label} table name cannot be empty`);\n }\n if (name.length > MAX_IDENTIFIER_LENGTH) {\n throw new ConfigurationError(\n `${label} table name exceeds maximum length of ${MAX_IDENTIFIER_LENGTH} characters`,\n );\n }\n if (!VALID_IDENTIFIER_PATTERN.test(name)) {\n throw new ConfigurationError(\n `${label} table name \"${name}\" is not a valid SQL identifier. ` +\n `Table names must start with a letter or underscore and contain only letters, digits, underscores, or dollar signs.`,\n );\n }\n}\n\n/**\n * Quotes a SQL identifier using ANSI SQL standard double quotes.\n * Escapes any embedded double quotes by doubling them.\n *\n * This works for both SQLite and PostgreSQL.\n */\nfunction quoteIdentifier(name: string): string {\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n}\n\n/**\n * Creates a SqlSchema configuration from table names.\n *\n * Table names are validated to ensure they are valid SQL identifiers.\n * This prevents SQL injection and ensures compatibility across databases.\n *\n * @param names - Optional custom table names (defaults to standard names)\n * @returns SqlSchema configuration for query compilation\n * @throws Error if any table name is invalid\n *\n * @example\n * ```typescript\n * // Use default table names\n * const schema = createSqlSchema();\n *\n * // Use custom table names\n * const schema = createSqlSchema({\n * nodes: \"myapp_nodes\",\n * edges: \"myapp_edges\",\n * embeddings: \"myapp_embeddings\",\n * });\n * ```\n */\nexport function createSqlSchema(names: Partial<SqlTableNames> = {}): SqlSchema {\n const tables: SqlTableNames = { ...DEFAULT_TABLE_NAMES, ...names };\n\n // Validate all table names\n validateTableName(tables.nodes, \"nodes\");\n validateTableName(tables.edges, \"edges\");\n validateTableName(tables.embeddings, \"embeddings\");\n\n return {\n tables,\n nodesTable: sql.raw(quoteIdentifier(tables.nodes)),\n edgesTable: sql.raw(quoteIdentifier(tables.edges)),\n embeddingsTable: sql.raw(quoteIdentifier(tables.embeddings)),\n };\n}\n\n/**\n * Default SqlSchema using standard TypeGraph table names.\n */\nexport const DEFAULT_SQL_SCHEMA: SqlSchema = createSqlSchema();\n","/**\n * Set Operation Compilation\n *\n * Compiles UNION, INTERSECT, and EXCEPT operations to SQL.\n *\n * For SQLite, special handling is required because:\n * - CTEs (WITH clauses) cannot be wrapped in parentheses\n * - Compound SELECT statements can only have a single WITH clause at the start\n *\n * This module handles these requirements by:\n * - For simple queries (no traversals): Compiling without CTEs, using direct table queries\n * - For complex queries: Merging all CTEs into a single WITH clause with unique prefixes\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport {\n CompilerInvariantError,\n UnsupportedPredicateError,\n} from \"../../errors\";\nimport type { SetOperationType } from \"../ast\";\nimport {\n type ComposableQuery,\n type FieldRef,\n type ProjectedField,\n type Projection,\n type QueryAst,\n type SetOperation,\n} from \"../ast\";\nimport {\n type DialectAdapter,\n type DialectSetOperationStrategy,\n} from \"../dialect\";\nimport { type JsonPointer, jsonPointer } from \"../json-pointer\";\nimport { emitSetOperationQuerySql } from \"./emitter\";\nimport { createTemporalFilterPass, runCompilerPass } from \"./passes\";\nimport { type LogicalPlan, lowerSetOperationToLogicalPlan } from \"./plan\";\nimport {\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"./predicates\";\nimport { type SqlSchema } from \"./schema\";\nimport { compileTypedJsonExtract } from \"./typed-json-extract\";\n\n/**\n * Type for the query compiler function.\n */\nexport type QueryCompilerFunction = (ast: QueryAst, graphId: string) => SQL;\n\ntype SetOperationStrategyHandler = (\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n logicalPlan: LogicalPlan,\n schema: SqlSchema,\n compileQuery: QueryCompilerFunction,\n) => SQL;\n\n/**\n * Operator mapping for set operations.\n */\nconst OPERATOR_MAP: Record<SetOperationType, string> = {\n union: \"UNION\",\n unionAll: \"UNION ALL\",\n intersect: \"INTERSECT\",\n except: \"EXCEPT\",\n};\n\nfunction compileSetOperationWithStandardParenthesizedStrategy(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n logicalPlan: LogicalPlan,\n _schema: SqlSchema,\n compileQuery: QueryCompilerFunction,\n): SQL {\n return compileSetOperationStandard(\n op,\n graphId,\n dialect,\n logicalPlan,\n compileQuery,\n );\n}\n\nfunction compileSetOperationWithSqliteCompoundStrategy(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n logicalPlan: LogicalPlan,\n schema: SqlSchema,\n _compileQuery: QueryCompilerFunction,\n): SQL {\n return compileSetOperationForSqlite(\n op,\n graphId,\n dialect,\n logicalPlan,\n schema,\n );\n}\n\nconst SET_OPERATION_STRATEGY_HANDLERS: Record<\n DialectSetOperationStrategy,\n SetOperationStrategyHandler\n> = {\n standard_parenthesized: compileSetOperationWithStandardParenthesizedStrategy,\n sqlite_compound: compileSetOperationWithSqliteCompoundStrategy,\n};\n\ntype SetOperationPassState = Readonly<{\n dialect: DialectAdapter;\n graphId: string;\n logicalPlan: LogicalPlan | undefined;\n op: SetOperation;\n}>;\n\nfunction runSetOperationPassPipeline(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n): SetOperationPassState {\n let state: SetOperationPassState = {\n dialect,\n graphId,\n logicalPlan: undefined,\n op,\n };\n\n const logicalPlanPass = runCompilerPass(state, {\n name: \"logical_plan\",\n execute(currentState): LogicalPlan {\n return lowerSetOperationToLogicalPlan({\n dialect: currentState.dialect.name,\n graphId: currentState.graphId,\n op: currentState.op,\n });\n },\n update(currentState, logicalPlan): SetOperationPassState {\n return {\n ...currentState,\n logicalPlan,\n };\n },\n });\n state = logicalPlanPass.state;\n\n return state;\n}\n\n// ============================================================\n// Main Entry Point\n// ============================================================\n\n/**\n * Compiles a set operation to SQL.\n *\n * For SQLite, uses a special compilation strategy that avoids wrapping\n * CTEs in parentheses. For other databases, uses the standard approach.\n *\n * @param op - The set operation AST\n * @param graphId - The graph ID\n * @param dialect - The dialect adapter\n * @param schema - SQL schema configuration for table names\n * @param compileQuery - Function to compile regular queries\n * @returns SQL for the set operation\n */\nexport function compileSetOperation(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n schema: SqlSchema,\n compileQuery: QueryCompilerFunction,\n): SQL {\n const passState = runSetOperationPassPipeline(op, graphId, dialect);\n const { logicalPlan } = passState;\n if (logicalPlan === undefined) {\n throw new CompilerInvariantError(\n \"Logical plan pass did not initialize plan state\",\n );\n }\n\n const strategy = dialect.capabilities.setOperationStrategy;\n const handler = SET_OPERATION_STRATEGY_HANDLERS[strategy];\n return handler(op, graphId, dialect, logicalPlan, schema, compileQuery);\n}\n\n// ============================================================\n// Standard (PostgreSQL) Compilation\n// ============================================================\n\n/**\n * Standard set operation compilation for databases that support CTEs in parentheses.\n */\nfunction compileSetOperationStandard(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n logicalPlan: LogicalPlan,\n compileQuery: QueryCompilerFunction,\n): SQL {\n const coreSql = compileSetOperationCoreStandard(\n op,\n graphId,\n dialect,\n compileQuery,\n );\n\n const suffixClauses = buildSetOperationSuffixClauses(op, dialect);\n return emitSetOperationQuerySql({\n baseQuery: coreSql,\n logicalPlan,\n ...(suffixClauses.length === 0 ? {} : { suffixClauses }),\n });\n}\n\n/**\n * Compiles the core set operation with parentheses (standard approach).\n */\nfunction compileSetOperationCoreStandard(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n compileQuery: QueryCompilerFunction,\n): SQL {\n const left = compileComposableQueryStandard(\n op.left,\n graphId,\n dialect,\n compileQuery,\n );\n const right = compileComposableQueryStandard(\n op.right,\n graphId,\n dialect,\n compileQuery,\n );\n\n const opSql = sql.raw(OPERATOR_MAP[op.operator]);\n\n return sql`(${left}) ${opSql} (${right})`;\n}\n\n/**\n * Compiles a composable query for standard databases.\n */\nfunction compileComposableQueryStandard(\n query: ComposableQuery,\n graphId: string,\n dialect: DialectAdapter,\n compileQuery: QueryCompilerFunction,\n): SQL {\n if (\"__type\" in query) {\n return compileSetOperationCoreStandard(\n query,\n graphId,\n dialect,\n compileQuery,\n );\n }\n return compileQuery(query, graphId);\n}\n\n// ============================================================\n// SQLite Compilation\n// ============================================================\n\ntype SqliteSetOperationLeaf = Readonly<{\n ast: QueryAst;\n prefix: string;\n}>;\n\ntype SqliteSetOperationValidationPassResult = Readonly<{\n leaves: readonly SqliteSetOperationLeaf[];\n}>;\n\n/**\n * Validates and prepares SQLite set-operation leaves.\n *\n * Invariants:\n * - All leaves are flattened with stable prefixes.\n * - Every leaf passes SQLite compound-query compatibility checks.\n */\nfunction runSqliteSetOperationValidationPass(\n op: SetOperation,\n): SqliteSetOperationValidationPassResult {\n const leaves: SqliteSetOperationLeaf[] = [];\n collectLeafQueries(op, leaves, \"q\");\n\n for (const leaf of leaves) {\n validateSqliteSetOpLeaf(leaf.ast);\n }\n\n return { leaves };\n}\n\n/**\n * SQLite-specific set operation compilation.\n *\n * SQLite compound SELECT statements cannot have parentheses around\n * queries that include CTEs. This function compiles set operations\n * by merging all CTEs into a single WITH clause at the top.\n *\n * @throws Error if any leaf query contains traversals (not yet supported)\n */\nfunction compileSetOperationForSqlite(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n logicalPlan: LogicalPlan,\n schema: SqlSchema,\n): SQL {\n const { leaves } = runSqliteSetOperationValidationPass(op);\n\n // Build all CTEs with unique prefixes\n const allCtes: SQL[] = [];\n const ctx: PredicateCompilerContext = {\n dialect,\n schema,\n compileQuery: () => {\n throw new CompilerInvariantError(\n \"compileQuery is not available in set-operation CTE compilation\",\n );\n },\n };\n\n for (const leaf of leaves) {\n const cte = compilePrefixedStartCte(leaf.ast, leaf.prefix, graphId, ctx);\n allCtes.push(cte);\n }\n\n // Build SELECT statements for each leaf\n const selectStatements: SQL[] = [];\n for (const leaf of leaves) {\n const select = compilePrefixedSelect(leaf.ast, leaf.prefix, dialect);\n selectStatements.push(select);\n }\n\n // Build compound SELECT from the set operation structure\n const compoundSelect = buildCompoundSelect(op, leaves, selectStatements);\n\n const suffixClauses = buildSetOperationSuffixClauses(op, dialect);\n return emitSetOperationQuerySql({\n baseQuery: compoundSelect,\n ...(allCtes.length === 0 ? {} : { ctes: allCtes }),\n logicalPlan,\n ...(suffixClauses.length === 0 ? {} : { suffixClauses }),\n });\n}\n\n/**\n * Validates that a leaf query is compatible with SQLite set operations.\n * SQLite's compound SELECT has significant limitations compared to PostgreSQL.\n *\n * @throws Error if the query uses unsupported features\n */\nfunction validateSqliteSetOpLeaf(ast: QueryAst): void {\n const unsupported: string[] = [];\n\n // Traversals require multiple CTEs which SQLite can't handle in compound statements\n if (ast.traversals.length > 0) {\n unsupported.push(\"traversals\");\n }\n\n // Subqueries (EXISTS/IN) would need CTEs or nested queries\n if (hasSubqueryPredicates(ast)) {\n unsupported.push(\"EXISTS/IN subqueries\");\n }\n\n // Vector similarity requires the embeddings table join\n if (hasVectorSimilarityPredicates(ast)) {\n unsupported.push(\"vector similarity predicates\");\n }\n\n // GROUP BY/HAVING would need to be applied to the individual leaf, not the compound result\n if (ast.groupBy !== undefined) {\n unsupported.push(\"GROUP BY\");\n }\n if (ast.having !== undefined) {\n unsupported.push(\"HAVING\");\n }\n\n // Per-leaf ORDER BY/LIMIT/OFFSET would silently be ignored in compound statements\n // (only the outer ORDER BY/LIMIT/OFFSET apply)\n if (ast.orderBy !== undefined && ast.orderBy.length > 0) {\n unsupported.push(\n \"per-query ORDER BY (use set operation's orderBy instead)\",\n );\n }\n if (ast.limit !== undefined) {\n unsupported.push(\"per-query LIMIT (use set operation's limit instead)\");\n }\n if (ast.offset !== undefined) {\n unsupported.push(\"per-query OFFSET (use set operation's offset instead)\");\n }\n\n if (unsupported.length > 0) {\n throw new UnsupportedPredicateError(\n `SQLite set operations (UNION/INTERSECT/EXCEPT) do not support: ${unsupported.join(\", \")}. ` +\n \"Use PostgreSQL for complex set operations, or refactor to separate queries.\",\n );\n }\n}\n\n/**\n * Checks if a query AST has vector similarity predicates.\n */\nfunction hasVectorSimilarityPredicates(ast: QueryAst): boolean {\n return ast.predicates.some((predicate) =>\n hasVectorSimilarityInExpression(predicate.expression),\n );\n}\n\n/**\n * Recursively checks if a predicate expression contains vector similarity.\n */\nfunction hasVectorSimilarityInExpression(\n expr: QueryAst[\"predicates\"][0][\"expression\"],\n): boolean {\n if (\"__type\" in expr) {\n switch (expr.__type) {\n case \"and\":\n case \"or\": {\n return expr.predicates.some((p) => hasVectorSimilarityInExpression(p));\n }\n case \"not\": {\n return hasVectorSimilarityInExpression(expr.predicate);\n }\n case \"vector_similarity\": {\n return true;\n }\n case \"exists\":\n case \"in_subquery\":\n case \"comparison\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\": {\n return false;\n }\n }\n }\n return false;\n}\n\n/**\n * Checks if a query AST has predicates with subqueries (EXISTS/IN with subquery).\n */\nfunction hasSubqueryPredicates(ast: QueryAst): boolean {\n return ast.predicates.some((predicate) =>\n hasSubqueryInExpression(predicate.expression),\n );\n}\n\n/**\n * Recursively checks if a predicate expression contains subqueries.\n */\nfunction hasSubqueryInExpression(\n expr: QueryAst[\"predicates\"][0][\"expression\"],\n): boolean {\n if (\"__type\" in expr) {\n switch (expr.__type) {\n case \"and\":\n case \"or\": {\n return expr.predicates.some((p) => hasSubqueryInExpression(p));\n }\n case \"not\": {\n return hasSubqueryInExpression(expr.predicate);\n }\n case \"exists\": {\n return true; // EXISTS always has a subquery\n }\n case \"in_subquery\": {\n return true; // IN with subquery\n }\n // These expression types don't contain subqueries\n case \"comparison\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"vector_similarity\": {\n return false;\n }\n }\n }\n return false;\n}\n\n/**\n * Recursively collects all leaf QueryAst nodes from a set operation tree.\n * Assigns unique prefixes to each leaf (q0, q1, q2, etc.).\n */\nfunction collectLeafQueries(\n query: ComposableQuery,\n leaves: SqliteSetOperationLeaf[],\n basePrefix: string,\n): void {\n if (\"__type\" in query) {\n // This is a SetOperation, recurse\n collectLeafQueries(query.left, leaves, basePrefix);\n collectLeafQueries(query.right, leaves, basePrefix);\n } else {\n // This is a QueryAst leaf\n const index = leaves.length;\n leaves.push({ ast: query, prefix: `${basePrefix}${index}` });\n }\n}\n\n/**\n * Compiles a CTE for the start node selection with a unique prefix.\n */\nfunction compilePrefixedStartCte(\n ast: QueryAst,\n prefix: string,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const temporalFilterPass = createTemporalFilterPass(\n ast,\n ctx.dialect.currentTimestamp(),\n );\n const alias = ast.start.alias;\n const kinds = ast.start.kinds;\n\n // Kind filter\n const kindFilter =\n kinds.length === 1 ?\n sql`kind = ${kinds[0]}`\n : sql`kind IN (${sql.join(\n kinds.map((k) => sql`${k}`),\n sql`, `,\n )})`;\n\n // Temporal filter\n const temporalFilter = temporalFilterPass.forAlias();\n\n // Node predicates for this alias\n const cteContext: PredicateCompilerContext = { ...ctx, cteColumnPrefix: \"\" };\n const predicateClauses = ast.predicates\n .filter((p) => p.targetAlias === alias)\n .map((p) => compilePredicateExpression(p.expression, cteContext));\n\n // Combine all WHERE clauses\n const whereClauses = [\n sql`graph_id = ${graphId}`,\n kindFilter,\n temporalFilter,\n ...predicateClauses,\n ];\n\n // Use prefixed CTE name: cte_q0_c, cte_q1_c, etc.\n const cteName = `cte_${prefix}_${alias}`;\n\n return sql`\n ${sql.raw(cteName)} AS (\n SELECT\n id AS ${sql.raw(alias)}_id,\n kind AS ${sql.raw(alias)}_kind,\n props AS ${sql.raw(alias)}_props,\n version AS ${sql.raw(alias)}_version,\n valid_from AS ${sql.raw(alias)}_valid_from,\n valid_to AS ${sql.raw(alias)}_valid_to,\n created_at AS ${sql.raw(alias)}_created_at,\n updated_at AS ${sql.raw(alias)}_updated_at,\n deleted_at AS ${sql.raw(alias)}_deleted_at\n FROM ${ctx.schema.nodesTable}\n WHERE ${sql.join(whereClauses, sql` AND `)}\n )\n `;\n}\n\n/**\n * Compiles the SELECT statement for a leaf query using the prefixed CTE.\n */\nfunction compilePrefixedSelect(\n ast: QueryAst,\n prefix: string,\n dialect: DialectAdapter,\n): SQL {\n const alias = ast.start.alias;\n const cteName = `cte_${prefix}_${alias}`;\n const fields = ast.projection.fields;\n\n // Build projection\n const projection =\n fields.length === 0 ?\n sql.raw(\"*\")\n : sql.join(\n fields.map((f) => {\n const source = compileFieldValueForSetOp(\n f.source,\n prefix,\n alias,\n dialect,\n );\n return sql`${source} AS ${sql.raw(dialect.quoteIdentifier(f.outputName))}`;\n }),\n sql`, `,\n );\n\n return sql`SELECT ${projection} FROM ${sql.raw(cteName)}`;\n}\n\n/**\n * Compiles a field value reference for set operation queries.\n */\nfunction compileFieldValueForSetOp(\n source: QueryAst[\"projection\"][\"fields\"][0][\"source\"],\n prefix: string,\n alias: string,\n dialect: DialectAdapter,\n): SQL {\n if (\"__type\" in source && source.__type === \"aggregate\") {\n // Aggregate expressions\n const { field, function: fn } = source;\n const cteName = `cte_${prefix}_${field.alias}`;\n\n switch (fn) {\n case \"count\": {\n return sql`COUNT(${sql.raw(cteName)}.${sql.raw(field.alias)}_id)`;\n }\n case \"countDistinct\": {\n return sql`COUNT(DISTINCT ${sql.raw(cteName)}.${sql.raw(field.alias)}_id)`;\n }\n case \"sum\":\n case \"avg\":\n case \"min\":\n case \"max\": {\n const column = compileFieldColumnForSetOp(field, prefix, dialect);\n return sql`${sql.raw(fn.toUpperCase())}(${column})`;\n }\n default: {\n throw new CompilerInvariantError(\n `Unknown aggregate function: ${String(fn)}`,\n );\n }\n }\n }\n\n // Field reference\n return compileFieldColumnForSetOp(source, prefix, dialect);\n}\n\n/**\n * Compiles a field column reference for set operation queries.\n */\nfunction compileFieldColumnForSetOp(\n field: {\n alias: string;\n path: readonly string[];\n jsonPointer?: JsonPointer | undefined;\n valueType?: string | undefined;\n },\n prefix: string,\n dialect: DialectAdapter,\n): SQL {\n const cteName = `cte_${prefix}_${field.alias}`;\n const alias = field.alias;\n\n // Handle direct column references\n if (field.path.length === 1) {\n const columnName = field.path[0];\n // Map path names to column names\n const columnMap: Record<string, string> = {\n id: \"_id\",\n kind: \"_kind\",\n props: \"_props\",\n version: \"_version\",\n valid_from: \"_valid_from\",\n valid_to: \"_valid_to\",\n created_at: \"_created_at\",\n updated_at: \"_updated_at\",\n deleted_at: \"_deleted_at\",\n };\n const suffix = columnMap[columnName!];\n if (suffix) {\n return sql.raw(`${cteName}.${alias}${suffix}`);\n }\n }\n\n // JSON field (path starts with \"props\" and has a json pointer)\n const column = sql.raw(`${cteName}.${alias}_props`);\n const pointer = field.jsonPointer;\n\n if (!pointer) {\n return column;\n }\n\n return compileTypedJsonExtract({\n column,\n dialect,\n fallback: \"text\",\n pointer,\n valueType: field.valueType,\n });\n}\n\n/**\n * Builds the compound SELECT statement from the set operation structure.\n */\nfunction buildCompoundSelect(\n op: SetOperation,\n leaves: readonly SqliteSetOperationLeaf[],\n selectStatements: readonly SQL[],\n): SQL {\n // Build a map from prefix to select statement\n const prefixToSelect = new Map<string, SQL>();\n for (const [index, leaf] of leaves.entries()) {\n prefixToSelect.set(leaf.prefix, selectStatements[index]!);\n }\n\n // Recursively build compound select\n return buildCompoundSelectRecursive(op, leaves, prefixToSelect);\n}\n\n/**\n * Recursively builds compound SELECT with proper operator placement.\n */\nfunction buildCompoundSelectRecursive(\n query: ComposableQuery,\n leaves: readonly SqliteSetOperationLeaf[],\n prefixToSelect: Map<string, SQL>,\n): SQL {\n if (!(\"__type\" in query)) {\n // This is a leaf QueryAst - find its prefix and return the SELECT\n const leaf = leaves.find((l) => l.ast === query);\n if (!leaf) {\n throw new CompilerInvariantError(\"Leaf query not found in leaves array\");\n }\n return prefixToSelect.get(leaf.prefix)!;\n }\n\n // This is a SetOperation\n const left = buildCompoundSelectRecursive(query.left, leaves, prefixToSelect);\n const right = buildCompoundSelectRecursive(\n query.right,\n leaves,\n prefixToSelect,\n );\n const opSql = sql.raw(OPERATOR_MAP[query.operator]);\n\n return sql`${left} ${opSql} ${right}`;\n}\n\n// ============================================================\n// Shared Utilities\n// ============================================================\n\n/**\n * Gets the leftmost leaf's projection from a set operation.\n * The leftmost leaf defines the output column names for the compound query.\n */\nfunction getLeftmostProjection(op: SetOperation): Projection {\n let current: ComposableQuery = op.left;\n while (\"__type\" in current) {\n // current is a SetOperation, traverse left\n current = current.left;\n }\n // current is now a QueryAst (the leftmost leaf)\n return current.projection;\n}\n\n/**\n * Normalizes a FieldRef to a canonical key for comparison.\n *\n * Handles equivalent representations:\n * - path: [\"props\", \"name\"] (no jsonPointer) → \"alias:props:/name\"\n * - path: [\"props\"], jsonPointer: \"/name\" → \"alias:props:/name\"\n *\n * This matches the normalization logic in compileFieldValue/getFieldPointer.\n */\nfunction normalizeFieldRefKey(field: FieldRef): string {\n // Derive JSON pointer from path if not explicitly set (same logic as predicates.ts getFieldPointer)\n let pointer: JsonPointer | undefined = field.jsonPointer;\n if (\n pointer === undefined &&\n field.path.length > 1 &&\n field.path[0] === \"props\"\n ) {\n pointer = jsonPointer(field.path.slice(1));\n }\n\n // Normalize base path: for JSON fields, always use [\"props\"]\n const basePath =\n field.path.length > 0 && field.path[0] === \"props\" ?\n \"props\"\n : field.path.join(\".\");\n\n return `${field.alias}:${basePath}:${pointer ?? \"\"}`;\n}\n\n/**\n * Matches a FieldRef from ORDER BY to a ProjectedField in the projection.\n * Returns the matching ProjectedField or undefined if no match.\n *\n * Uses normalized keys to handle equivalent field representations.\n */\nfunction matchFieldToProjection(\n field: FieldRef,\n projection: Projection,\n): ProjectedField | undefined {\n const targetKey = normalizeFieldRefKey(field);\n\n for (const projected of projection.fields) {\n const source = projected.source;\n\n // Only match against FieldRef sources (not aggregates)\n if (!(\"__type\" in source) || source.__type !== \"field_ref\") continue;\n\n // Compare normalized keys\n if (normalizeFieldRefKey(source) === targetKey) {\n return projected;\n }\n }\n return undefined;\n}\n\n/**\n * Builds ORDER BY, LIMIT, OFFSET clauses for set operations.\n *\n * For set operations, ORDER BY must reference output column names from\n * the compound result, not internal CTE columns. This function:\n * 1. Maps each ORDER BY field to its output name from the leftmost projection\n * 2. Uses IS NULL emulation for consistent NULLS FIRST/LAST across dialects\n * 3. Throws a descriptive error if an ORDER BY field isn't in the projection\n */\nfunction buildSetOperationSuffixClauses(\n op: SetOperation,\n dialect: DialectAdapter,\n): SQL[] {\n const clauses: SQL[] = [];\n\n // Handle ORDER BY if present\n if (op.orderBy && op.orderBy.length > 0) {\n const projection = getLeftmostProjection(op);\n\n // Check for SELECT * (empty projection) - can't order by named columns\n if (projection.fields.length === 0) {\n throw new UnsupportedPredicateError(\n \"Set operation ORDER BY requires explicit field projection. \" +\n \"SELECT * does not provide stable output column names for ordering. \" +\n \"Use .select() to specify which fields to project.\",\n );\n }\n\n const orderParts: SQL[] = [];\n\n for (const o of op.orderBy) {\n const projected = matchFieldToProjection(o.field, projection);\n\n if (!projected) {\n // Build a descriptive error message\n const fieldDesc =\n o.field.jsonPointer ?\n `${o.field.alias}.props${o.field.jsonPointer}`\n : `${o.field.alias}.${o.field.path.join(\".\")}`;\n const availableFields = projection.fields\n .map((f) => f.outputName)\n .join(\", \");\n throw new UnsupportedPredicateError(\n `Set operation ORDER BY field \"${fieldDesc}\" is not in the projection. ` +\n `ORDER BY for UNION/INTERSECT/EXCEPT must reference projected columns. ` +\n `Available columns: ${availableFields}`,\n );\n }\n\n // Use output column name with proper quoting\n const columnRef = sql.raw(dialect.quoteIdentifier(projected.outputName));\n const dir = sql.raw(o.direction.toUpperCase());\n\n // Handle nulls with IS NULL emulation for cross-dialect consistency\n // Default: ASC → NULLS LAST, DESC → NULLS FIRST\n const nulls = o.nulls ?? (o.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDir = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n\n // Emulate NULLS FIRST/LAST: (col IS NULL) ASC/DESC, col DIR\n orderParts.push(\n sql`(${columnRef} IS NULL) ${nullsDir}`,\n sql`${columnRef} ${dir}`,\n );\n }\n\n clauses.push(sql`ORDER BY ${sql.join(orderParts, sql`, `)}`);\n }\n\n // Handle LIMIT\n if (op.limit !== undefined) {\n clauses.push(sql`LIMIT ${op.limit}`);\n }\n\n // Handle OFFSET\n if (op.offset !== undefined) {\n clauses.push(sql`OFFSET ${op.offset}`);\n }\n\n return clauses;\n}\n","import type {\n PredicateExpression,\n QueryAst,\n VectorSimilarityPredicate,\n} from \"../ast\";\nimport { type DialectAdapter } from \"../dialect\";\nimport {\n createTemporalFilterPass,\n resolveVectorAwareLimit,\n runCompilerPass,\n runVectorPredicatePass,\n type TemporalFilterPass,\n} from \"./passes\";\nimport { type LogicalPlan, lowerStandardQueryToLogicalPlan } from \"./plan\";\nimport {\n buildPredicateIndex,\n getPredicatesForAlias,\n type PredicateIndex,\n} from \"./predicate-utils\";\nimport { type PredicateCompilerContext } from \"./predicates\";\nimport {\n addRequiredColumn,\n isIdFieldRef,\n markFieldRefAsRequired,\n markSelectiveFieldAsRequired,\n type RequiredColumnsByAlias,\n} from \"./utils\";\n\n/**\n * Heuristics for pushing LIMIT into traversal CTEs to cap intermediate row counts.\n * - 8x multiplier accounts for edge fan-out (each node may connect to multiple edges).\n * - 10K cap prevents runaway memory allocation for large intermediate result sets.\n */\nconst TRAVERSAL_LIMIT_PUSHDOWN_MULTIPLIER = 8;\nconst TRAVERSAL_LIMIT_PUSHDOWN_MAX = 10_000;\n\nfunction isColumnPruningEnabled(ast: QueryAst): boolean {\n if (ast.selectiveFields && ast.selectiveFields.length > 0) {\n return true;\n }\n if (ast.groupBy || ast.having) {\n return true;\n }\n return ast.projection.fields.some(\n (field) => field.source.__type === \"aggregate\",\n );\n}\n\nfunction markPredicateFieldsAsRequired(\n requiredColumnsByAlias: Map<string, Set<string>>,\n expression: PredicateExpression,\n): void {\n switch (expression.__type) {\n case \"comparison\": {\n markFieldRefAsRequired(requiredColumnsByAlias, expression.left);\n return;\n }\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\": {\n markFieldRefAsRequired(requiredColumnsByAlias, expression.field);\n return;\n }\n case \"and\":\n case \"or\": {\n for (const predicate of expression.predicates) {\n markPredicateFieldsAsRequired(requiredColumnsByAlias, predicate);\n }\n return;\n }\n case \"not\": {\n markPredicateFieldsAsRequired(\n requiredColumnsByAlias,\n expression.predicate,\n );\n return;\n }\n case \"aggregate_comparison\": {\n markFieldRefAsRequired(\n requiredColumnsByAlias,\n expression.aggregate.field,\n );\n return;\n }\n case \"in_subquery\": {\n markFieldRefAsRequired(requiredColumnsByAlias, expression.field);\n return;\n }\n case \"vector_similarity\": {\n markFieldRefAsRequired(requiredColumnsByAlias, expression.field);\n return;\n }\n case \"exists\": {\n return;\n }\n }\n}\n\nfunction collectRequiredColumnsByAlias(ast: QueryAst): RequiredColumnsByAlias {\n const requiredColumnsByAlias = new Map<string, Set<string>>();\n\n addRequiredColumn(requiredColumnsByAlias, ast.start.alias, \"id\");\n for (const traversal of ast.traversals) {\n addRequiredColumn(requiredColumnsByAlias, traversal.nodeAlias, \"id\");\n }\n\n if (ast.selectiveFields && ast.selectiveFields.length > 0) {\n for (const field of ast.selectiveFields) {\n markSelectiveFieldAsRequired(requiredColumnsByAlias, field);\n }\n } else {\n for (const projectedField of ast.projection.fields) {\n const source = projectedField.source;\n if (source.__type === \"field_ref\") {\n markFieldRefAsRequired(requiredColumnsByAlias, source);\n } else {\n addRequiredColumn(requiredColumnsByAlias, source.field.alias, \"id\");\n if (\n source.function !== \"count\" &&\n source.function !== \"countDistinct\"\n ) {\n markFieldRefAsRequired(requiredColumnsByAlias, source.field);\n }\n }\n }\n }\n\n if (ast.groupBy) {\n for (const field of ast.groupBy.fields) {\n markFieldRefAsRequired(requiredColumnsByAlias, field);\n }\n }\n\n if (ast.orderBy) {\n for (const orderSpec of ast.orderBy) {\n markFieldRefAsRequired(requiredColumnsByAlias, orderSpec.field);\n }\n }\n\n if (ast.having) {\n markPredicateFieldsAsRequired(requiredColumnsByAlias, ast.having);\n }\n\n for (const predicate of ast.predicates) {\n markPredicateFieldsAsRequired(requiredColumnsByAlias, predicate.expression);\n }\n\n return requiredColumnsByAlias;\n}\n\nfunction hasIdEqualityPredicate(\n expression: PredicateExpression,\n alias: string,\n): boolean {\n switch (expression.__type) {\n case \"comparison\": {\n return (\n expression.op === \"eq\" &&\n expression.left.alias === alias &&\n isIdFieldRef(expression.left)\n );\n }\n case \"and\": {\n return expression.predicates.some((predicate) =>\n hasIdEqualityPredicate(predicate, alias),\n );\n }\n case \"or\":\n case \"not\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"exists\":\n case \"in_subquery\":\n case \"vector_similarity\": {\n return false;\n }\n }\n}\n\nfunction isStartAliasBoundToSingleId(\n ast: QueryAst,\n predicateIndex: PredicateIndex,\n): boolean {\n return getPredicatesForAlias(predicateIndex, ast.start.alias, \"node\").some(\n (predicate) =>\n hasIdEqualityPredicate(predicate.expression, ast.start.alias),\n );\n}\n\nfunction resolveTraversalCteLimit(\n ast: QueryAst,\n predicateIndex: PredicateIndex,\n): number | undefined {\n if (ast.limit === undefined) {\n return undefined;\n }\n\n if (ast.offset !== undefined) {\n return undefined;\n }\n\n if (ast.limit <= 0) {\n return 0;\n }\n\n if (ast.groupBy || ast.having) {\n return undefined;\n }\n\n if (ast.orderBy && ast.orderBy.length > 0) {\n return undefined;\n }\n\n if (ast.traversals.length < 2) {\n return undefined;\n }\n\n if (ast.traversals.some((traversal) => traversal.optional)) {\n return undefined;\n }\n\n if (!isStartAliasBoundToSingleId(ast, predicateIndex)) {\n return undefined;\n }\n\n const pushdownLimit = Math.min(\n ast.limit * TRAVERSAL_LIMIT_PUSHDOWN_MULTIPLIER,\n TRAVERSAL_LIMIT_PUSHDOWN_MAX,\n );\n\n return Math.max(ast.limit, pushdownLimit);\n}\n\nfunction canCollapseSelectiveTraversalRowset(\n ast: QueryAst,\n vectorPredicate: VectorSimilarityPredicate | undefined,\n): boolean {\n if (vectorPredicate !== undefined) {\n return false;\n }\n\n if (ast.traversals.length === 0) {\n return false;\n }\n\n if (ast.traversals.some((traversal) => traversal.optional)) {\n return false;\n }\n\n let expectedJoinFromAlias = ast.start.alias;\n for (const traversal of ast.traversals) {\n if (traversal.joinFromAlias !== expectedJoinFromAlias) {\n return false;\n }\n expectedJoinFromAlias = traversal.nodeAlias;\n }\n\n if (!ast.selectiveFields || ast.selectiveFields.length === 0) {\n return false;\n }\n\n if (ast.groupBy || ast.having) {\n return false;\n }\n\n if (\n ast.projection.fields.some((field) => field.source.__type === \"aggregate\")\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function shouldMaterializeTraversalCte(\n dialect: DialectAdapter,\n traversalCount: number,\n traversalIndex: number,\n): boolean {\n if (!dialect.capabilities.materializeIntermediateTraversalCtes) {\n return false;\n }\n\n if (traversalCount <= 1) {\n return false;\n }\n\n return traversalIndex < traversalCount - 1;\n}\n\ntype StandardQueryPassState = Readonly<{\n ast: QueryAst;\n collapsedTraversalCteAlias: string | undefined;\n ctx: PredicateCompilerContext;\n effectiveLimit: number | undefined;\n logicalPlan: LogicalPlan | undefined;\n predicateIndex: PredicateIndex;\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined;\n shouldCollapseSelectiveTraversalRowset: boolean;\n temporalFilterPass: TemporalFilterPass | undefined;\n traversalCteLimit: number | undefined;\n vectorPredicate: VectorSimilarityPredicate | undefined;\n}>;\n\nexport function runStandardQueryPassPipeline(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): StandardQueryPassState {\n let state: StandardQueryPassState = {\n ast,\n collapsedTraversalCteAlias: undefined,\n ctx,\n effectiveLimit: undefined,\n logicalPlan: undefined,\n predicateIndex: buildPredicateIndex(ast),\n requiredColumnsByAlias: undefined,\n shouldCollapseSelectiveTraversalRowset: false,\n temporalFilterPass: undefined,\n traversalCteLimit: undefined,\n vectorPredicate: undefined,\n };\n\n const vectorPass = runCompilerPass(state, {\n name: \"vector_predicate\",\n execute(currentState): VectorSimilarityPredicate | undefined {\n return runVectorPredicatePass(currentState.ast, currentState.ctx.dialect)\n .vectorPredicate;\n },\n update(currentState, vectorPredicate): StandardQueryPassState {\n return {\n ...currentState,\n vectorPredicate,\n };\n },\n });\n state = vectorPass.state;\n\n const temporalPass = runCompilerPass(state, {\n name: \"temporal_filters\",\n execute(currentState): TemporalFilterPass {\n return createTemporalFilterPass(\n currentState.ast,\n currentState.ctx.dialect.currentTimestamp(),\n );\n },\n update(currentState, temporalFilterPass): StandardQueryPassState {\n return {\n ...currentState,\n temporalFilterPass,\n };\n },\n });\n state = temporalPass.state;\n\n const columnPruningPass = runCompilerPass(state, {\n name: \"column_pruning\",\n execute(currentState): RequiredColumnsByAlias | undefined {\n return isColumnPruningEnabled(currentState.ast) ?\n collectRequiredColumnsByAlias(currentState.ast)\n : undefined;\n },\n update(currentState, requiredColumnsByAlias): StandardQueryPassState {\n return {\n ...currentState,\n requiredColumnsByAlias,\n };\n },\n });\n state = columnPruningPass.state;\n\n const selectiveTraversalRowsetPass = runCompilerPass(state, {\n name: \"selective_traversal_rowset\",\n execute(currentState): Readonly<{\n collapsedTraversalCteAlias: string | undefined;\n shouldCollapseSelectiveTraversalRowset: boolean;\n }> {\n const shouldCollapseSelectiveTraversalRowset =\n canCollapseSelectiveTraversalRowset(\n currentState.ast,\n currentState.vectorPredicate,\n );\n const lastTraversal = currentState.ast.traversals.at(-1);\n const collapsedTraversalCteAlias =\n shouldCollapseSelectiveTraversalRowset && lastTraversal !== undefined ?\n `cte_${lastTraversal.nodeAlias}`\n : undefined;\n\n return {\n collapsedTraversalCteAlias,\n shouldCollapseSelectiveTraversalRowset,\n };\n },\n update(\n currentState,\n { collapsedTraversalCteAlias, shouldCollapseSelectiveTraversalRowset },\n ): StandardQueryPassState {\n return {\n ...currentState,\n collapsedTraversalCteAlias,\n shouldCollapseSelectiveTraversalRowset,\n };\n },\n });\n state = selectiveTraversalRowsetPass.state;\n\n const traversalLimitPass = runCompilerPass(state, {\n name: \"traversal_limit\",\n execute(currentState): number | undefined {\n return resolveTraversalCteLimit(\n currentState.ast,\n currentState.predicateIndex,\n );\n },\n update(currentState, traversalCteLimit): StandardQueryPassState {\n return {\n ...currentState,\n traversalCteLimit,\n };\n },\n });\n state = traversalLimitPass.state;\n\n // Compute effectiveLimit once — used by both logical plan lowering and SQL LIMIT/OFFSET.\n state = {\n ...state,\n effectiveLimit: resolveVectorAwareLimit(\n state.ast.limit,\n state.vectorPredicate,\n ),\n };\n\n const logicalPlanPass = runCompilerPass(state, {\n name: \"logical_plan\",\n execute(currentState): LogicalPlan {\n const loweringInput = {\n ast: currentState.ast,\n dialect: currentState.ctx.dialect.name,\n graphId,\n };\n\n return lowerStandardQueryToLogicalPlan({\n ...loweringInput,\n ...(currentState.collapsedTraversalCteAlias === undefined ?\n {}\n : {\n collapsedTraversalCteAlias: currentState.collapsedTraversalCteAlias,\n }),\n ...(currentState.effectiveLimit === undefined ?\n {}\n : { effectiveLimit: currentState.effectiveLimit }),\n ...(currentState.vectorPredicate === undefined ?\n {}\n : { vectorPredicate: currentState.vectorPredicate }),\n });\n },\n update(currentState, logicalPlan): StandardQueryPassState {\n return {\n ...currentState,\n logicalPlan,\n };\n },\n });\n state = logicalPlanPass.state;\n\n return state;\n}\n","/**\n * Query Compiler Module\n *\n * Main entry point for compiling query ASTs to SQL.\n * Re-exports individual compiler modules and provides the main compile functions.\n */\n\n// Re-export sub-modules\nexport {\n type LogicalPlan,\n type LogicalPlanNode,\n lowerRecursiveQueryToLogicalPlan,\n lowerSetOperationToLogicalPlan,\n lowerStandardQueryToLogicalPlan,\n} from \"./plan\";\nexport {\n compileAggregateExpr,\n compileFieldColumn,\n compileFieldValue,\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"./predicates\";\nexport {\n compileVariableLengthQuery,\n hasVariableLengthTraversal,\n MAX_EXPLICIT_RECURSIVE_DEPTH,\n MAX_RECURSIVE_DEPTH,\n} from \"./recursive\";\nexport {\n createSqlSchema,\n DEFAULT_SQL_SCHEMA,\n type SqlSchema,\n type SqlTableNames,\n} from \"./schema\";\nexport {\n compileTemporalFilter,\n extractTemporalOptions,\n type TemporalFilterOptions,\n} from \"./temporal\";\n\n// Re-export dialect types\nexport { type DialectAdapter, getDialect, type SqlDialect } from \"../dialect\";\n\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { CompilerInvariantError } from \"../../errors\";\nimport { type QueryAst, type SetOperation } from \"../ast\";\nimport {\n type DialectStandardQueryStrategy,\n getDialect,\n type SqlDialect,\n} from \"../dialect\";\nimport { emitStandardQuerySql } from \"./emitter\";\nimport {\n buildLimitOffsetClause,\n buildStandardEmbeddingsCte,\n buildStandardFromClause,\n buildStandardGroupBy,\n buildStandardHaving,\n buildStandardOrderBy,\n buildStandardProjection,\n buildStandardStartCte,\n buildStandardTraversalCte,\n buildStandardVectorOrderBy,\n} from \"./emitter\";\nimport { type TemporalFilterPass } from \"./passes\";\nimport { type LogicalPlan } from \"./plan\";\nimport {\n compileKindFilter,\n compilePredicateClauses,\n getNodeKindsForAlias,\n getPredicatesForAlias,\n type PredicateIndex,\n} from \"./predicate-utils\";\nimport { compileFieldValue, type PredicateCompilerContext } from \"./predicates\";\nimport {\n compileVariableLengthQuery,\n hasVariableLengthTraversal,\n} from \"./recursive\";\nimport { DEFAULT_SQL_SCHEMA, type SqlSchema } from \"./schema\";\nimport { compileSetOperation as compileSetOp } from \"./set-operations\";\nimport {\n runStandardQueryPassPipeline,\n shouldMaterializeTraversalCte,\n} from \"./standard-pass-pipeline\";\nimport {\n isAggregateExpr,\n isIdFieldRef,\n quoteIdentifier,\n type RequiredColumnsByAlias,\n} from \"./utils\";\n\n// ============================================================\n// Main Query Compiler\n// ============================================================\n\n/**\n * Options for query compilation.\n */\nexport type CompileQueryOptions = Readonly<{\n /** SQL dialect (\"sqlite\" or \"postgres\"). Defaults to \"sqlite\". */\n dialect?: SqlDialect | undefined;\n /** SQL schema configuration for table names. Defaults to standard names. */\n schema?: SqlSchema | undefined;\n}>;\n\n/**\n * Compiles a query AST to SQL.\n *\n * This is the main entry point for query compilation. It dispatches to\n * the appropriate compiler based on the query type (standard, recursive,\n * or set operation).\n *\n * @param ast - The query AST to compile\n * @param graphId - The graph ID for filtering\n * @param options - Compilation options (dialect, schema)\n * @returns Drizzle SQL object ready for execution\n *\n * @example\n * ```typescript\n * const ast = query.toAst();\n * const sql = compileQuery(ast, \"my_graph\", { dialect: \"postgres\" });\n * const results = await db.execute(sql);\n * ```\n *\n * @example\n * ```typescript\n * // With custom table names\n * const schema = createSqlSchema({ nodes: \"myapp_nodes\", edges: \"myapp_edges\" });\n * const sql = compileQuery(ast, \"my_graph\", { dialect: \"postgres\", schema });\n * ```\n */\nexport function compileQuery(\n ast: QueryAst,\n graphId: string,\n options: CompileQueryOptions | SqlDialect = \"sqlite\",\n): SQL {\n // Support legacy signature: compileQuery(ast, graphId, dialect)\n const options_: CompileQueryOptions =\n typeof options === \"string\" ? { dialect: options } : options;\n const dialect = options_.dialect ?? \"sqlite\";\n const schema = options_.schema ?? DEFAULT_SQL_SCHEMA;\n\n const adapter = getDialect(dialect);\n const ctx: PredicateCompilerContext = {\n dialect: adapter,\n schema,\n compileQuery: (subAst, subGraphId) =>\n compileQuery(subAst, subGraphId, { dialect, schema }),\n };\n\n // Check for variable-length traversals\n if (hasVariableLengthTraversal(ast)) {\n const lowered = tryLowerSingleHopRecursiveTraversal(ast);\n if (lowered !== undefined) {\n return compileStandardQuery(lowered, graphId, ctx);\n }\n return compileVariableLengthQuery(ast, graphId, ctx);\n }\n\n // Standard query compilation\n return compileStandardQuery(ast, graphId, ctx);\n}\n\nfunction tryLowerSingleHopRecursiveTraversal(\n ast: QueryAst,\n): QueryAst | undefined {\n if (ast.traversals.length !== 1) {\n return undefined;\n }\n\n const traversal = ast.traversals[0]!;\n const variableLength = traversal.variableLength;\n if (!variableLength) {\n return undefined;\n }\n\n if (variableLength.minDepth !== 1 || variableLength.maxDepth !== 1) {\n return undefined;\n }\n if (\n variableLength.pathAlias !== undefined ||\n variableLength.depthAlias !== undefined\n ) {\n return undefined;\n }\n\n const { variableLength: _vl, ...nonRecursiveTraversal } = traversal;\n\n return {\n ...ast,\n traversals: [nonRecursiveTraversal],\n };\n}\n\n/**\n * Compiles a set operation (UNION/INTERSECT/EXCEPT) to SQL.\n *\n * @param op - The set operation AST\n * @param graphId - The graph ID for filtering\n * @param options - Compilation options (dialect, schema)\n * @returns Drizzle SQL object\n */\nexport function compileSetOperation(\n op: SetOperation,\n graphId: string,\n options: CompileQueryOptions | SqlDialect = \"sqlite\",\n): SQL {\n // Support legacy signature: compileSetOperation(op, graphId, dialect)\n const options_: CompileQueryOptions =\n typeof options === \"string\" ? { dialect: options } : options;\n const dialect = options_.dialect ?? \"sqlite\";\n const schema = options_.schema ?? DEFAULT_SQL_SCHEMA;\n\n const adapter = getDialect(dialect);\n return compileSetOp(op, graphId, adapter, schema, (ast, gid) =>\n compileQuery(ast, gid, { dialect, schema }),\n );\n}\n\n// ============================================================\n// Standard Query Compilation\n// ============================================================\n\ntype CountAggregateFastPathPlan = Readonly<{\n traversal: QueryAst[\"traversals\"][number];\n requiresCount: boolean;\n requiresCountDistinct: boolean;\n}>;\n\nfunction resolveCountAggregateFastPath(\n ast: QueryAst,\n): CountAggregateFastPathPlan | undefined {\n if (ast.traversals.length !== 1) {\n return undefined;\n }\n\n if (ast.groupBy?.fields.length !== 1) {\n return undefined;\n }\n\n if (ast.having !== undefined) {\n return undefined;\n }\n\n if (\n ast.orderBy?.some((orderSpec) => orderSpec.field.alias !== ast.start.alias)\n ) {\n return undefined;\n }\n\n const traversal = ast.traversals[0]!;\n if ((traversal.inverseEdgeKinds?.length ?? 0) > 0) {\n return undefined;\n }\n\n const groupField = ast.groupBy.fields[0]!;\n if (groupField.alias !== ast.start.alias || !isIdFieldRef(groupField)) {\n return undefined;\n }\n\n let requiresCount = false;\n let requiresCountDistinct = false;\n\n for (const projectedField of ast.projection.fields) {\n const source = projectedField.source;\n\n if (!isAggregateExpr(source)) {\n if (source.alias !== ast.start.alias) {\n return undefined;\n }\n continue;\n }\n\n if (\n source.field.alias !== traversal.nodeAlias ||\n !isIdFieldRef(source.field)\n ) {\n return undefined;\n }\n\n if (source.function === \"count\") {\n requiresCount = true;\n continue;\n }\n\n if (source.function === \"countDistinct\") {\n requiresCountDistinct = true;\n continue;\n }\n\n return undefined;\n }\n\n if (!requiresCount && !requiresCountDistinct) {\n return undefined;\n }\n\n return {\n traversal,\n requiresCount,\n requiresCountDistinct,\n };\n}\n\nfunction compileCountAggregateFastPath(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n logicalPlan: LogicalPlan,\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined,\n predicateIndex: PredicateIndex,\n temporalFilterPass: TemporalFilterPass,\n): SQL | undefined {\n const plan = resolveCountAggregateFastPath(ast);\n if (!plan) {\n return undefined;\n }\n\n const { traversal, requiresCount, requiresCountDistinct } = plan;\n const { dialect } = ctx;\n const startAlias = ast.start.alias;\n const previousAlias = traversal.joinFromAlias;\n const previousAliasIdColumn = `${previousAlias}_id`;\n const previousAliasKindColumn = `${previousAlias}_kind`;\n const countCteAlias = `cte_${traversal.nodeAlias}_counts`;\n const countColumn = `${traversal.nodeAlias}_count`;\n const countDistinctColumn = `${traversal.nodeAlias}_count_distinct`;\n\n const previousNodeKinds = getNodeKindsForAlias(ast, traversal.joinFromAlias);\n const edgeKinds = [...new Set(traversal.edgeKinds)];\n const nodeKinds = traversal.nodeKinds;\n\n const edgeTemporalFilter = temporalFilterPass.forAlias(\"e\");\n const nodeTemporalFilter = temporalFilterPass.forAlias(\"n\");\n\n const nodePredicateContext: PredicateCompilerContext = {\n ...ctx,\n cteColumnPrefix: \"n\",\n };\n const nodePredicateClauses = compilePredicateClauses(\n getPredicatesForAlias(predicateIndex, traversal.nodeAlias, \"node\"),\n nodePredicateContext,\n );\n\n const edgePredicateContext: PredicateCompilerContext = {\n ...ctx,\n cteColumnPrefix: \"e\",\n };\n const edgePredicateClauses = compilePredicateClauses(\n getPredicatesForAlias(predicateIndex, traversal.edgeAlias, \"edge\"),\n edgePredicateContext,\n );\n\n const joinField = traversal.direction === \"out\" ? \"from_id\" : \"to_id\";\n const targetField = traversal.direction === \"out\" ? \"to_id\" : \"from_id\";\n const joinKindField = traversal.direction === \"out\" ? \"from_kind\" : \"to_kind\";\n const targetKindField =\n traversal.direction === \"out\" ? \"to_kind\" : \"from_kind\";\n\n const whereClauses = [\n sql`e.graph_id = ${graphId}`,\n compileKindFilter(sql.raw(\"e.kind\"), edgeKinds),\n compileKindFilter(sql.raw(`e.${joinKindField}`), previousNodeKinds),\n compileKindFilter(sql.raw(`e.${targetKindField}`), nodeKinds),\n compileKindFilter(sql.raw(\"n.kind\"), nodeKinds),\n edgeTemporalFilter,\n nodeTemporalFilter,\n ...nodePredicateClauses,\n ...edgePredicateClauses,\n ];\n\n const aggregateColumns: SQL[] = [];\n if (requiresCount) {\n aggregateColumns.push(sql`COUNT(n.id) AS ${sql.raw(countColumn)}`);\n }\n if (requiresCountDistinct) {\n aggregateColumns.push(\n sql`COUNT(DISTINCT n.id) AS ${sql.raw(countDistinctColumn)}`,\n );\n }\n\n const startCte = buildStandardStartCte({\n ast,\n ctx,\n graphId,\n predicateIndex,\n requiredColumnsByAlias,\n temporalFilterPass,\n });\n const countCte = sql`\n ${sql.raw(countCteAlias)} AS (\n SELECT\n cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasIdColumn)} AS ${sql.raw(previousAliasIdColumn)},\n cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)} AS ${sql.raw(previousAliasKindColumn)},\n ${sql.join(aggregateColumns, sql`, `)}\n FROM cte_${sql.raw(previousAlias)}\n JOIN ${ctx.schema.edgesTable} e ON cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasIdColumn)} = e.${sql.raw(joinField)}\n AND cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)} = e.${sql.raw(joinKindField)}\n JOIN ${ctx.schema.nodesTable} n ON n.graph_id = e.graph_id\n AND n.id = e.${sql.raw(targetField)}\n AND n.kind = e.${sql.raw(targetKindField)}\n WHERE ${sql.join(whereClauses, sql` AND `)}\n GROUP BY\n cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasIdColumn)},\n cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)}\n )\n `;\n\n const projection = sql.join(\n ast.projection.fields.map((projectedField) => {\n const source = projectedField.source;\n\n if (!isAggregateExpr(source)) {\n const value = compileFieldValue(\n source,\n dialect,\n source.valueType,\n `cte_${source.alias}`,\n );\n return sql`${value} AS ${quoteIdentifier(projectedField.outputName)}`;\n }\n\n const projectedCountColumn =\n source.function === \"countDistinct\" ? countDistinctColumn : countColumn;\n const countValue = sql`${sql.raw(countCteAlias)}.${sql.raw(projectedCountColumn)}`;\n const aggregateValue =\n traversal.optional ? sql`COALESCE(${countValue}, 0)` : countValue;\n\n return sql`${aggregateValue} AS ${quoteIdentifier(projectedField.outputName)}`;\n }),\n sql`, `,\n );\n\n const joinType = traversal.optional ? \"LEFT JOIN\" : \"INNER JOIN\";\n const fromClause = sql`\n FROM cte_${sql.raw(startAlias)}\n ${sql.raw(joinType)} ${sql.raw(countCteAlias)}\n ON ${sql.raw(countCteAlias)}.${sql.raw(previousAliasIdColumn)} = cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasIdColumn)}\n AND ${sql.raw(countCteAlias)}.${sql.raw(previousAliasKindColumn)} = cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)}\n `;\n\n const orderBy = buildStandardOrderBy({ ast, dialect });\n const limitOffset = buildLimitOffsetClause({\n limit: ast.limit,\n offset: ast.offset,\n });\n\n return emitStandardQuerySql({\n ctes: [startCte, countCte],\n fromClause,\n ...(orderBy === undefined ? {} : { orderBy }),\n ...(limitOffset === undefined ? {} : { limitOffset }),\n logicalPlan,\n projection,\n });\n}\n\n/**\n * Compiles a standard (non-recursive) query to SQL using CTEs.\n */\ntype StandardQueryStrategyHandler = (\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n) => SQL;\n\nconst STANDARD_QUERY_STRATEGY_HANDLERS: Record<\n DialectStandardQueryStrategy,\n StandardQueryStrategyHandler\n> = {\n cte_project: compileStandardQueryWithCteStrategy,\n};\n\nfunction compileStandardQuery(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const strategy = ctx.dialect.capabilities.standardQueryStrategy;\n const handler = STANDARD_QUERY_STRATEGY_HANDLERS[strategy];\n return handler(ast, graphId, ctx);\n}\n\nfunction compileStandardQueryWithCteStrategy(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const { dialect } = ctx;\n const {\n collapsedTraversalCteAlias,\n effectiveLimit,\n logicalPlan,\n predicateIndex,\n requiredColumnsByAlias,\n shouldCollapseSelectiveTraversalRowset,\n temporalFilterPass,\n traversalCteLimit,\n vectorPredicate,\n } = runStandardQueryPassPipeline(ast, graphId, ctx);\n\n if (temporalFilterPass === undefined) {\n throw new CompilerInvariantError(\n \"Temporal filter pass did not initialize temporal state\",\n { phase: \"standard-pass-pipeline\" },\n );\n }\n if (logicalPlan === undefined) {\n throw new CompilerInvariantError(\n \"Logical plan pass did not initialize plan state\",\n { phase: \"standard-pass-pipeline\" },\n );\n }\n\n if (!vectorPredicate) {\n const fastPathSql = compileCountAggregateFastPath(\n ast,\n graphId,\n ctx,\n logicalPlan,\n requiredColumnsByAlias,\n predicateIndex,\n temporalFilterPass,\n );\n if (fastPathSql) {\n return fastPathSql;\n }\n }\n\n // Build CTEs\n const ctes: SQL[] = [\n buildStandardStartCte({\n ast,\n ctx,\n graphId,\n predicateIndex,\n requiredColumnsByAlias,\n temporalFilterPass,\n }),\n ];\n\n // Traversal CTEs\n for (let index = 0; index < ast.traversals.length; index++) {\n const materializeTraversalCte = shouldMaterializeTraversalCte(\n dialect,\n ast.traversals.length,\n index,\n );\n ctes.push(\n buildStandardTraversalCte({\n ast,\n carryForwardPreviousColumns: shouldCollapseSelectiveTraversalRowset,\n ctx,\n graphId,\n materializeCte: materializeTraversalCte,\n predicateIndex,\n requiredColumnsByAlias,\n temporalFilterPass,\n traversalIndex: index,\n traversalLimit: traversalCteLimit,\n }),\n );\n }\n\n // Add embeddings CTE if vector similarity is used\n if (vectorPredicate) {\n ctes.push(buildStandardEmbeddingsCte({ ctx, graphId, vectorPredicate }));\n }\n\n // Build main SELECT\n const projection = buildStandardProjection({\n ast,\n ...(collapsedTraversalCteAlias === undefined ?\n {}\n : { collapsedTraversalCteAlias }),\n dialect,\n });\n const fromClause = buildStandardFromClause({\n ast,\n ...(collapsedTraversalCteAlias === undefined ?\n {}\n : { collapsedTraversalCteAlias }),\n ...(vectorPredicate === undefined ? {} : { vectorPredicate }),\n });\n const groupBy = buildStandardGroupBy({ ast, dialect });\n const having = buildStandardHaving({ ast, ctx });\n\n // Order by distance if vector similarity, otherwise use AST order\n const orderBy =\n vectorPredicate ?\n buildStandardVectorOrderBy({ ast, dialect })\n : buildStandardOrderBy({\n ast,\n ...(collapsedTraversalCteAlias === undefined ?\n {}\n : { collapsedTraversalCteAlias }),\n dialect,\n });\n\n const limitOffset = buildLimitOffsetClause({\n limit: effectiveLimit,\n offset: ast.offset,\n });\n\n return emitStandardQuerySql({\n ctes,\n fromClause,\n ...(groupBy === undefined ? {} : { groupBy }),\n ...(having === undefined ? {} : { having }),\n ...(orderBy === undefined ? {} : { orderBy }),\n ...(limitOffset === undefined ? {} : { limitOffset }),\n logicalPlan,\n projection,\n });\n}\n","/**\n * Cursor encoding/decoding for keyset pagination.\n *\n * Cursors are opaque URL-safe base64-encoded JSON containing:\n * - Column values at cursor position\n * - Direction indicator\n * - Version for forward compatibility\n */\n\nimport { ValidationError } from \"../errors\";\nimport { type OrderSpec } from \"./ast\";\nimport { parseJsonPointer } from \"./json-pointer\";\n\n// ============================================================\n// Types\n// ============================================================\n\nconst CURSOR_VERSION = 1;\n\n/**\n * Internal cursor data structure.\n */\nexport type CursorData = Readonly<{\n /** Version for forward compatibility */\n v: number;\n /** Direction: 'f' = forward, 'b' = backward */\n d: \"f\" | \"b\";\n /** ORDER BY column values at cursor position */\n vals: readonly unknown[];\n /** Column identifiers for validation */\n cols: readonly string[];\n}>;\n\n// ============================================================\n// Encoding / Decoding\n// ============================================================\n\n/**\n * Encodes cursor data to a URL-safe base64 string.\n */\nexport function encodeCursor(data: CursorData): string {\n const json = JSON.stringify(data);\n // Use URL-safe base64: replace + with -, / with _, remove padding\n return btoa(json)\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/, \"\");\n}\n\n/**\n * Decodes a cursor string to cursor data.\n *\n * @throws ValidationError if cursor is invalid or incompatible\n */\nexport function decodeCursor(cursor: string): CursorData {\n try {\n // Restore standard base64\n let base64 = cursor.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n // Add padding if needed\n while (base64.length % 4) {\n base64 += \"=\";\n }\n const json = atob(base64);\n const raw = JSON.parse(json) as Record<string, unknown>;\n\n if (typeof raw.v !== \"number\" || raw.v > CURSOR_VERSION) {\n throw new ValidationError(\n `Unsupported cursor version: ${String(raw.v)}. Maximum supported: ${CURSOR_VERSION}`,\n {\n issues: [\n {\n path: \"cursor\",\n message: `Cursor version ${String(raw.v)} is not supported`,\n },\n ],\n },\n {\n suggestion: `This cursor was created with a newer version. Re-fetch the data to get a compatible cursor.`,\n },\n );\n }\n\n if (raw.d !== \"f\" && raw.d !== \"b\") {\n throw new ValidationError(`Invalid cursor direction: ${String(raw.d)}`, {\n issues: [\n {\n path: \"cursor\",\n message: `Direction must be \"f\" (forward) or \"b\" (backward)`,\n },\n ],\n });\n }\n\n if (!Array.isArray(raw.vals) || !Array.isArray(raw.cols)) {\n throw new ValidationError(\"Invalid cursor structure\", {\n issues: [\n {\n path: \"cursor\",\n message: \"Cursor must contain vals and cols arrays\",\n },\n ],\n });\n }\n\n if (raw.vals.length !== raw.cols.length) {\n throw new ValidationError(\"Cursor column count mismatch\", {\n issues: [\n {\n path: \"cursor\",\n message: `vals (${raw.vals.length}) and cols (${raw.cols.length}) must have same length`,\n },\n ],\n });\n }\n\n return {\n v: raw.v,\n d: raw.d,\n vals: raw.vals as readonly unknown[],\n cols: raw.cols as readonly string[],\n };\n } catch (error) {\n if (error instanceof ValidationError) {\n throw error;\n }\n throw new ValidationError(\n \"Invalid cursor format\",\n {\n issues: [{ path: \"cursor\", message: \"Failed to decode cursor\" }],\n },\n { cause: error },\n );\n }\n}\n\n// ============================================================\n// Cursor Building\n// ============================================================\n\n/**\n * Builds a column identifier from an order spec.\n *\n * Format: \"alias.fieldName\" for property fields, \"alias.path[0]...\" for system fields.\n * Handles two field ref formats:\n * 1. New format: path=[\"props\"], jsonPointer=\"/name\"\n * 2. Legacy format: path=[\"props\", \"name\"]\n *\n * In both cases, outputs flattened format \"p.name\" to match the flattened API.\n */\nexport function buildColumnId(spec: OrderSpec): string {\n const { alias, path, jsonPointer } = spec.field;\n\n // New format: path=[\"props\"] with jsonPointer=\"/fieldName\"\n // jsonPointer is a branded string like \"/name\" or \"/nested/field\"\n if (path.length === 1 && path[0] === \"props\" && jsonPointer) {\n const parts = (jsonPointer as string).split(\"/\").filter(Boolean);\n return `${alias}.${parts.join(\".\")}`;\n }\n\n // Legacy format: path=[\"props\", \"fieldName\", ...] without jsonPointer\n if (path.length >= 2 && path[0] === \"props\") {\n return `${alias}.${path.slice(1).join(\".\")}`;\n }\n\n // System fields (id, kind) or other paths\n return `${alias}.${path.join(\".\")}`;\n}\n\n/**\n * Extracts the value for a cursor column from a result row.\n *\n * The row can be in two formats:\n * 1. Raw database row with flat column names\n * 2. Mapped result with alias-keyed nested data\n *\n * For mapped results, we navigate through the path and then jsonPointer.\n */\nexport function extractCursorValue(\n row: Record<string, unknown>,\n spec: OrderSpec,\n): unknown {\n const { alias, path, jsonPointer } = spec.field;\n\n // Try alias-keyed format first (mapped results)\n let current: unknown = row[alias];\n if (current !== undefined) {\n // Follow path first (e.g., [\"props\"])\n for (const segment of path) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n\n const record = current as Record<string, unknown>;\n if (segment === \"props\" && !Object.hasOwn(record, segment)) {\n continue;\n }\n\n current = record[segment];\n }\n\n // Then follow jsonPointer if present (e.g., \"/name\")\n if (jsonPointer) {\n const segments = parseJsonPointer(jsonPointer);\n for (const segment of segments) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n }\n\n return current;\n }\n\n // Fallback: try direct path lookup for raw rows\n current = row;\n for (const segment of path) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\n/**\n * Builds a cursor from a result row and order specifications.\n *\n * @param row - The result row (mapped with alias-keyed data)\n * @param orderSpecs - The ORDER BY specifications\n * @param direction - Pagination direction\n * @returns Encoded cursor string\n */\nexport function buildCursorFromRow(\n row: Record<string, unknown>,\n orderSpecs: readonly OrderSpec[],\n direction: \"f\" | \"b\",\n): string {\n const vals = orderSpecs.map((spec) => extractCursorValue(row, spec));\n const cols = orderSpecs.map((spec) => buildColumnId(spec));\n\n return encodeCursor({\n v: CURSOR_VERSION,\n d: direction,\n vals,\n cols,\n });\n}\n\n/**\n * Validates that cursor columns match the query's ORDER BY columns.\n *\n * @throws ValidationError if columns don't match\n */\nexport function validateCursorColumns(\n cursorData: CursorData,\n orderSpecs: readonly OrderSpec[],\n): void {\n const expectedCols = orderSpecs.map((spec) => buildColumnId(spec));\n\n if (cursorData.cols.length !== expectedCols.length) {\n throw new ValidationError(\n `Cursor has ${cursorData.cols.length} columns but query has ${expectedCols.length} ORDER BY columns`,\n {\n issues: [\n {\n path: \"cursor\",\n message: `Column count mismatch: cursor has ${cursorData.cols.length}, query has ${expectedCols.length}`,\n },\n ],\n },\n {\n suggestion: `The cursor was created with a different ORDER BY. Re-fetch with consistent ordering.`,\n },\n );\n }\n\n for (const [index, expectedCol] of expectedCols.entries()) {\n if (cursorData.cols[index] !== expectedCol) {\n throw new ValidationError(\n `Cursor column mismatch at position ${index}: expected \"${expectedCol}\", got \"${cursorData.cols[index]}\"`,\n {\n issues: [\n {\n path: \"cursor\",\n message: `Column ${index}: expected \"${expectedCol}\", got \"${cursorData.cols[index]}\"`,\n },\n ],\n },\n {\n suggestion: `The cursor was created with a different ORDER BY. Re-fetch with consistent ordering.`,\n },\n );\n }\n }\n}\n","import { nanoid } from \"nanoid\";\n\n/**\n * ID generation utilities.\n *\n * Default implementation uses nanoid.\n * Benefits:\n * - URL-safe\n * - Compact (21 characters by default)\n * - Secure random generation\n */\n\n/**\n * Generates a new unique ID.\n */\nexport function generateId(): string {\n return nanoid();\n}\n\n/**\n * ID generator function type.\n */\nexport type IdGenerator = () => string;\n\n/**\n * Default ID generator configuration.\n */\nexport type IdConfig = Readonly<{\n /** Generator for node IDs */\n nodeIdGenerator: IdGenerator;\n /** Generator for edge IDs */\n edgeIdGenerator: IdGenerator;\n}>;\n","/**\n * Path utilities for variable-length traversal results.\n *\n * SQLite doesn't support native arrays, so paths are stored as pipe-delimited\n * strings: \"|id1|id2|id3|\". PostgreSQL returns native arrays.\n */\n\n/**\n * Parses a SQLite path string into an array of node IDs.\n *\n * @param path - Pipe-delimited path string like \"|id1|id2|id3|\"\n * @returns Array of node IDs like [\"id1\", \"id2\", \"id3\"]\n *\n * @example\n * parseSqlitePath(\"|abc|def|ghi|\") // [\"abc\", \"def\", \"ghi\"]\n * parseSqlitePath(\"|single|\") // [\"single\"]\n * parseSqlitePath(\"||\") // []\n */\nexport function parseSqlitePath(path: string): readonly string[] {\n if (!path || path === \"||\") return [];\n\n // Remove leading and trailing pipes, then split\n const trimmed = path.slice(1, -1);\n if (trimmed === \"\") return [];\n\n return trimmed.split(\"|\");\n}\n\n/**\n * Type guard to check if a value is a SQLite path string.\n * SQLite paths start and end with \"|\".\n */\nexport function isSqlitePath(value: unknown): value is string {\n return (\n typeof value === \"string\" && value.startsWith(\"|\") && value.endsWith(\"|\")\n );\n}\n\n/**\n * Normalizes a path value to an array.\n * - If already an array (PostgreSQL native), returns as-is\n * - If a SQLite path string (|id1|id2|), parses it\n * - If a PostgreSQL text array ({id1,id2}), parses it\n * - Otherwise returns empty array\n */\nexport function normalizePath(value: unknown): readonly string[] {\n if (Array.isArray(value)) {\n return value as string[];\n }\n if (isSqlitePath(value)) {\n return parseSqlitePath(value);\n }\n if (isPostgresTextArray(value)) {\n return parsePostgresTextArray(value);\n }\n return [];\n}\n\n/**\n * Type guard for PostgreSQL text array format: {id1,id2,id3}\n */\nfunction isPostgresTextArray(value: unknown): value is string {\n return (\n typeof value === \"string\" && value.startsWith(\"{\") && value.endsWith(\"}\")\n );\n}\n\n/**\n * Parses a PostgreSQL text array string into an array of strings.\n * Input format: {id1,id2,id3} or {} for empty.\n */\nfunction parsePostgresTextArray(value: string): readonly string[] {\n const inner = value.slice(1, -1);\n if (inner === \"\") return [];\n return inner.split(\",\");\n}\n","/**\n * Result mapping utilities for query execution.\n *\n * Transforms raw database rows into typed SelectContext and result objects.\n */\nimport { type NodeType } from \"../../core/types\";\nimport { normalizePath } from \"../../utils\";\nimport { type Traversal } from \"../ast\";\nimport type {\n AliasMap,\n EdgeAliasMap,\n QueryBuilderState,\n RecursiveAliasMap,\n SelectableEdge,\n SelectableNode,\n SelectContext,\n} from \"../builder/types\";\nimport { type SqlDialect } from \"../compiler/index\";\n\n/**\n * Transforms SQLite path columns from pipe-delimited strings to arrays.\n * PostgreSQL returns native arrays, so no transformation needed.\n */\nexport function transformPathColumns(\n rows: readonly Record<string, unknown>[],\n state: QueryBuilderState,\n _dialect: SqlDialect,\n): readonly Record<string, unknown>[] {\n // Find path columns from variable-length traversals\n const pathAliases: string[] = [];\n for (const t of state.traversals) {\n if (t.variableLength?.pathAlias !== undefined) {\n pathAliases.push(t.variableLength.pathAlias);\n }\n }\n\n if (pathAliases.length === 0) return rows;\n\n const result: Record<string, unknown>[] = [];\n let changed = false;\n for (const row of rows) {\n let transformed: Record<string, unknown> | undefined;\n for (const alias of pathAliases) {\n const value = row[alias];\n if (value !== undefined && !Array.isArray(value)) {\n transformed ??= { ...row };\n transformed[alias] = normalizePath(value);\n }\n }\n if (transformed === undefined) {\n result.push(row);\n } else {\n changed = true;\n result.push(transformed);\n }\n }\n // Preserve reference identity when no rows were transformed\n return changed ? result : rows;\n}\n\n// Reserved keys that cannot be overwritten by user props\nconst RESERVED_NODE_KEYS = new Set([\"id\", \"kind\", \"meta\"]);\nconst RESERVED_EDGE_KEYS = new Set([\"id\", \"kind\", \"fromId\", \"toId\", \"meta\"]);\n\n/**\n * Converts null to undefined for consistent typing.\n * Database backends return null for missing values, but our types use undefined.\n */\nfunction nullToUndefined<T>(value: T | null | undefined): T | undefined {\n return value === null ? undefined : value;\n}\n\n/**\n * Assigns props to a target object, excluding reserved keys to prevent runtime\n * collisions with system fields (id, kind, meta, etc).\n */\nfunction assignPropsExcludingReserved(\n target: Record<string, unknown>,\n props: Record<string, unknown>,\n reservedKeys: Set<string>,\n): void {\n for (const [key, value] of Object.entries(props)) {\n if (!reservedKeys.has(key)) {\n target[key] = value;\n }\n }\n}\n\n/**\n * Builds a SelectableNode from row data for a given alias.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys (id, kind, meta) in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n */\nexport function buildSelectableNode(\n row: Record<string, unknown>,\n alias: string,\n): SelectableNode<NodeType> {\n const id = row[`${alias}_id`] as string;\n const kind = row[`${alias}_kind`] as string;\n const propsRaw: unknown = row[`${alias}_props`];\n const rawProps: Record<string, unknown> =\n typeof propsRaw === \"string\" ?\n (JSON.parse(propsRaw) as Record<string, unknown>)\n : ((propsRaw as Record<string, unknown> | undefined) ?? {});\n\n // Metadata columns - these are now always projected in CTEs\n // Normalize null → undefined for optional fields\n const version = row[`${alias}_version`] as number;\n const validFrom = nullToUndefined(\n row[`${alias}_valid_from`] as string | null,\n );\n const validTo = nullToUndefined(row[`${alias}_valid_to`] as string | null);\n const createdAt = row[`${alias}_created_at`] as string;\n const updatedAt = row[`${alias}_updated_at`] as string;\n const deletedAt = nullToUndefined(\n row[`${alias}_deleted_at`] as string | null,\n );\n\n const result: Record<string, unknown> = {\n id,\n kind,\n meta: {\n version,\n validFrom,\n validTo,\n createdAt,\n updatedAt,\n deletedAt,\n },\n };\n\n assignPropsExcludingReserved(result, rawProps, RESERVED_NODE_KEYS);\n return result as SelectableNode<NodeType>;\n}\n\n/**\n * Builds a SelectableNode from row data, returning undefined when the node\n * doesn't exist (for optional traversals with LEFT JOIN).\n */\nfunction buildSelectableNodeOrUndefined(\n row: Record<string, unknown>,\n alias: string,\n): SelectableNode<NodeType> | undefined {\n const id = row[`${alias}_id`] as string | null | undefined;\n if (id === null || id === undefined) {\n return undefined;\n }\n return buildSelectableNode(row, alias);\n}\n\n/**\n * Builds a SelectableEdge from row data for a given edge alias.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys (id, kind, fromId, toId, meta) in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n * Returns undefined if the edge doesn't exist (for optional traversals with LEFT JOIN).\n */\nfunction buildSelectableEdge(\n row: Record<string, unknown>,\n alias: string,\n): SelectableEdge | undefined {\n const id = row[`${alias}_id`] as string | null | undefined;\n\n // For optional traversals, edge may be null (LEFT JOIN)\n if (id === null || id === undefined) {\n return undefined;\n }\n\n const kind = row[`${alias}_kind`] as string;\n const fromId = row[`${alias}_from_id`] as string;\n const toId = row[`${alias}_to_id`] as string;\n\n const propsRaw: unknown = row[`${alias}_props`];\n const rawProps: Record<string, unknown> =\n typeof propsRaw === \"string\" ?\n (JSON.parse(propsRaw) as Record<string, unknown>)\n : ((propsRaw as Record<string, unknown> | undefined) ?? {});\n\n // Metadata columns - these are always projected in traversal CTEs\n // Normalize null → undefined for optional fields\n const validFrom = nullToUndefined(\n row[`${alias}_valid_from`] as string | null,\n );\n const validTo = nullToUndefined(row[`${alias}_valid_to`] as string | null);\n const createdAt = row[`${alias}_created_at`] as string;\n const updatedAt = row[`${alias}_updated_at`] as string;\n const deletedAt = nullToUndefined(\n row[`${alias}_deleted_at`] as string | null,\n );\n\n const result: Record<string, unknown> = {\n id,\n kind,\n fromId,\n toId,\n meta: {\n validFrom,\n validTo,\n createdAt,\n updatedAt,\n deletedAt,\n },\n };\n\n assignPropsExcludingReserved(result, rawProps, RESERVED_EDGE_KEYS);\n return result as SelectableEdge;\n}\n\n/**\n * Builds a SelectContext from a raw database row.\n * Includes node aliases, edge aliases, and recursive metadata (depth/path).\n */\nexport function buildSelectContext<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty when no recursive aliases\n RecursiveAliases extends RecursiveAliasMap = {},\n>(\n row: Record<string, unknown>,\n startAlias: string,\n traversals: readonly Traversal[],\n): SelectContext<Aliases, EdgeAliases, RecursiveAliases> {\n // Build the start node as initial context entry\n const context: Record<\n string,\n | SelectableNode<NodeType>\n | SelectableEdge\n | number\n | readonly string[]\n | undefined\n > = {\n [startAlias]: buildSelectableNode(row, startAlias),\n };\n\n // Build traversal nodes and edges\n for (const traversal of traversals) {\n const nodeAlias = traversal.nodeAlias;\n const edgeAlias = traversal.edgeAlias;\n\n // Add node\n context[nodeAlias] =\n traversal.optional ?\n buildSelectableNodeOrUndefined(row, nodeAlias)\n : buildSelectableNode(row, nodeAlias);\n\n // Add edge (may be undefined for optional traversals)\n context[edgeAlias] = buildSelectableEdge(row, edgeAlias);\n\n // Add recursive depth/path values\n const vl = traversal.variableLength;\n if (vl !== undefined) {\n if (vl.depthAlias !== undefined) {\n context[vl.depthAlias] = row[vl.depthAlias] as number;\n }\n if (vl.pathAlias !== undefined) {\n context[vl.pathAlias] = row[vl.pathAlias] as readonly string[];\n }\n }\n }\n\n return context as SelectContext<Aliases, EdgeAliases, RecursiveAliases>;\n}\n\n/**\n * Maps raw database rows to typed results using a select function.\n */\nexport function mapResults<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n R,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty when no recursive aliases\n RA extends RecursiveAliasMap = {},\n>(\n rows: readonly Record<string, unknown>[],\n startAlias: string,\n traversals: readonly Traversal[],\n selectFunction: (context: SelectContext<Aliases, EdgeAliases, RA>) => R,\n): readonly R[] {\n return rows.map((row) => {\n const context = buildSelectContext<Aliases, EdgeAliases, RA>(\n row,\n startAlias,\n traversals,\n );\n return selectFunction(context);\n });\n}\n","/**\n * Cursor-based pagination utilities.\n *\n * Provides pagination logic for ExecutableQuery including cursor predicate\n * building and result page construction.\n */\nimport {\n type FieldRef,\n type NodePredicate,\n type OrderSpec,\n type PredicateExpression,\n} from \"../ast\";\nimport type {\n AliasMap,\n EdgeAliasMap,\n PaginatedResult,\n PaginateOptions,\n SelectContext,\n StreamOptions,\n} from \"../builder/types\";\nimport {\n buildCursorFromRow,\n type CursorData,\n decodeCursor,\n validateCursorColumns,\n} from \"../cursor\";\n\n/**\n * Parses pagination options into internal format.\n */\nexport function parsePaginateOptions(options: PaginateOptions): {\n isBackward: boolean;\n limit: number;\n cursor: string | undefined;\n cursorData: CursorData | undefined;\n orderBy: readonly OrderSpec[];\n} {\n const isBackward = options.last !== undefined || options.before !== undefined;\n const limit = options.first ?? options.last ?? 20;\n const cursor = options.after ?? options.before;\n\n let cursorData: CursorData | undefined;\n if (cursor) {\n cursorData = decodeCursor(cursor);\n }\n\n return { isBackward, limit, cursor, cursorData, orderBy: [] };\n}\n\n/**\n * Validates cursor data against ORDER BY columns.\n */\nexport function validateCursor(\n cursorData: CursorData | undefined,\n orderBy: readonly OrderSpec[],\n): void {\n if (cursorData) {\n validateCursorColumns(cursorData, orderBy);\n }\n}\n\n/**\n * Adjusts ORDER BY for backward pagination (reverses directions).\n */\nexport function adjustOrderByForDirection(\n orderBy: readonly OrderSpec[],\n direction: \"forward\" | \"backward\",\n): readonly OrderSpec[] {\n if (direction === \"forward\") {\n return orderBy;\n }\n return orderBy.map((spec) => ({\n ...spec,\n direction: spec.direction === \"asc\" ? (\"desc\" as const) : (\"asc\" as const),\n }));\n}\n\n/**\n * Builds a cursor predicate for keyset pagination.\n * Generates (col1 > val1) OR (col1 = val1 AND col2 > val2) OR ... pattern.\n */\nexport function buildCursorPredicate(\n cursorData: CursorData,\n orderBy: readonly OrderSpec[],\n direction: \"forward\" | \"backward\",\n targetAlias: string,\n): NodePredicate {\n const values = cursorData.vals;\n\n // Build OR of progressively longer AND conditions\n const orConditions: PredicateExpression[] = [];\n\n for (let index = 0; index < orderBy.length; index++) {\n const andConditions: PredicateExpression[] = [];\n\n // All preceding columns must be equal\n for (let index_ = 0; index_ < index; index_++) {\n const spec = orderBy[index_]!;\n const value = values[index_];\n andConditions.push(buildEqualityPredicate(spec.field, value));\n }\n\n // Current column uses comparison\n const currentSpec = orderBy[index]!;\n const currentValue = values[index];\n const isAsc = currentSpec.direction === \"asc\";\n const isForward = direction === \"forward\";\n // ASC + forward = gt | ASC + backward = lt\n // DESC + forward = lt | DESC + backward = gt\n const op = isAsc === isForward ? \"gt\" : \"lt\";\n\n andConditions.push(\n buildComparisonPredicate(currentSpec.field, op, currentValue),\n );\n\n // Combine with AND\n if (andConditions.length === 1) {\n orConditions.push(andConditions[0]!);\n } else {\n orConditions.push({ __type: \"and\", predicates: andConditions });\n }\n }\n\n // Combine with OR\n const expression: PredicateExpression =\n orConditions.length === 1 ?\n orConditions[0]!\n : { __type: \"or\", predicates: orConditions };\n\n return {\n targetAlias,\n expression,\n };\n}\n\n/**\n * Builds an equality predicate for cursor pagination.\n */\nfunction buildEqualityPredicate(\n field: FieldRef,\n value: unknown,\n): PredicateExpression {\n if (value === null || value === undefined) {\n return { __type: \"null_check\", op: \"isNull\", field };\n }\n return {\n __type: \"comparison\",\n op: \"eq\",\n left: field,\n right: { __type: \"literal\", value: value as string | number | boolean },\n };\n}\n\n/**\n * Builds a comparison predicate for cursor pagination.\n */\nfunction buildComparisonPredicate(\n field: FieldRef,\n op: \"gt\" | \"lt\",\n value: unknown,\n): PredicateExpression {\n if (value === null || value === undefined) {\n // For null, the comparison depends on NULLS FIRST/LAST behavior\n // For simplicity, treat as IS NOT NULL for forward, fail for backward\n return { __type: \"null_check\", op: \"isNotNull\", field };\n }\n return {\n __type: \"comparison\",\n op,\n left: field,\n right: { __type: \"literal\", value: value as string | number | boolean },\n };\n}\n\n/**\n * Builds cursor string from a context row.\n */\nexport function buildCursorFromContext<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n>(\n context: SelectContext<Aliases, EdgeAliases>,\n orderBy: readonly OrderSpec[],\n direction: \"f\" | \"b\",\n): string {\n return buildCursorFromRow(\n context as unknown as Record<string, unknown>,\n orderBy,\n direction,\n );\n}\n\n/**\n * Constructs a PaginatedResult from query results.\n */\nexport function buildPaginatedResult<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n R,\n>(\n data: readonly R[],\n orderedRows: readonly Record<string, unknown>[],\n orderBy: readonly OrderSpec[],\n limit: number,\n hasMore: boolean,\n isBackward: boolean,\n cursor: string | undefined,\n buildContext: (\n row: Record<string, unknown>,\n ) => SelectContext<Aliases, EdgeAliases>,\n): PaginatedResult<R> {\n let nextCursor: string | undefined;\n let previousCursor: string | undefined;\n\n if (orderedRows.length > 0) {\n const firstRow = orderedRows[0]!;\n const lastRow = orderedRows.at(-1)!;\n\n // Build cursors using mapped result context\n const firstContext = buildContext(firstRow);\n const lastContext = buildContext(lastRow);\n\n // Extract values for ORDER BY columns from the context\n previousCursor = buildCursorFromContext(firstContext, orderBy, \"b\");\n nextCursor = buildCursorFromContext(lastContext, orderBy, \"f\");\n }\n\n return {\n data,\n nextCursor: hasMore || isBackward ? nextCursor : undefined,\n prevCursor:\n cursor !== undefined || (isBackward && hasMore) ?\n previousCursor\n : undefined,\n hasNextPage: isBackward ? cursor !== undefined : hasMore,\n hasPrevPage: isBackward ? hasMore : cursor !== undefined,\n };\n}\n\n/**\n * Creates an async iterable that streams results using cursor pagination.\n */\nexport async function* createStreamIterable<R>(\n batchSize: number,\n paginate: (options: PaginateOptions) => Promise<PaginatedResult<R>>,\n): AsyncGenerator<R> {\n let cursor: string | undefined;\n let hasMore = true;\n\n while (hasMore) {\n const options: PaginateOptions =\n cursor ? { first: batchSize, after: cursor } : { first: batchSize };\n const page = await paginate(options);\n\n for (const item of page.data) {\n yield item;\n }\n\n cursor = page.nextCursor;\n hasMore = page.hasNextPage;\n }\n}\n\n/**\n * Gets default stream options.\n */\nexport function getStreamBatchSize(options?: StreamOptions): number {\n return options?.batchSize ?? 1000;\n}\n","/**\n * Query AST types.\n *\n * Defines the abstract syntax tree for TypeGraph queries.\n * This portable representation can be compiled to SQL (today)\n * or other query languages (Cypher, SPARQL) in the future.\n */\nimport { type TemporalMode } from \"../core/types\";\nimport { type JsonPointer } from \"./json-pointer\";\n\n// ============================================================\n// Predicate Expressions\n// ============================================================\n\n/**\n * A field reference in a predicate.\n */\nexport type FieldRef = Readonly<{\n __type: \"field_ref\";\n alias: string;\n path: readonly string[]; // [\"props\", \"name\"] or [\"id\"]\n jsonPointer?: JsonPointer | undefined; // JSON Pointer into props\n valueType?: ValueType | undefined;\n elementType?: ValueType | undefined;\n}>;\n\n/**\n * A literal value in a predicate.\n */\nexport type LiteralValue = Readonly<{\n __type: \"literal\";\n value: string | number | boolean;\n valueType?: ValueType | undefined;\n}>;\n\n/**\n * A parameter reference for prepared queries.\n *\n * Used in place of a literal value to create parameterized queries\n * that can be executed multiple times with different bindings.\n */\nexport type ParameterRef = Readonly<{\n __type: \"parameter\";\n name: string;\n valueType?: ValueType | undefined;\n}>;\n\n/**\n * Supported value types for predicates.\n */\nexport type ValueType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"array\"\n | \"object\"\n | \"embedding\"\n | \"unknown\";\n\n/**\n * Comparison operators.\n */\nexport type ComparisonOp =\n | \"eq\"\n | \"neq\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\"\n | \"in\"\n | \"notIn\";\n\n/**\n * String operators.\n */\nexport type StringOp =\n | \"contains\"\n | \"startsWith\"\n | \"endsWith\"\n | \"like\"\n | \"ilike\";\n\n/**\n * A comparison predicate.\n */\nexport type ComparisonPredicate = Readonly<{\n __type: \"comparison\";\n op: ComparisonOp;\n left: FieldRef;\n right: LiteralValue | LiteralValue[] | ParameterRef;\n}>;\n\n/**\n * A string predicate.\n */\nexport type StringPredicate = Readonly<{\n __type: \"string_op\";\n op: StringOp;\n field: FieldRef;\n pattern: string | ParameterRef;\n}>;\n\n/**\n * A null check predicate.\n */\nexport type NullPredicate = Readonly<{\n __type: \"null_check\";\n op: \"isNull\" | \"isNotNull\";\n field: FieldRef;\n}>;\n\n/**\n * A between predicate.\n */\nexport type BetweenPredicate = Readonly<{\n __type: \"between\";\n field: FieldRef;\n lower: LiteralValue | ParameterRef;\n upper: LiteralValue | ParameterRef;\n}>;\n\n// ============================================================\n// Array Predicates\n// ============================================================\n\n/**\n * Array operators.\n */\nexport type ArrayOp =\n | \"contains\" // Array contains a single value\n | \"containsAll\" // Array contains all specified values\n | \"containsAny\" // Array contains any of the specified values (overlaps)\n | \"isEmpty\" // Array is empty\n | \"isNotEmpty\" // Array is not empty\n | \"lengthEq\" // Array length equals\n | \"lengthGt\" // Array length greater than\n | \"lengthGte\" // Array length greater than or equal\n | \"lengthLt\" // Array length less than\n | \"lengthLte\"; // Array length less than or equal\n\n/**\n * An array predicate.\n */\nexport type ArrayPredicate = Readonly<{\n __type: \"array_op\";\n op: ArrayOp;\n field: FieldRef;\n values?: readonly LiteralValue[]; // For contains/containsAll/containsAny\n length?: number; // For length comparisons\n}>;\n\n// ============================================================\n// Object/JSON Predicates\n// ============================================================\n\n/**\n * Object operators.\n */\nexport type ObjectOp =\n | \"hasKey\" // Object has a specific key at root level\n | \"hasPath\" // Object has a nested path\n | \"pathEquals\" // Value at path equals\n | \"pathContains\" // Value at path contains (for nested arrays)\n | \"pathIsNull\" // Value at path is null\n | \"pathIsNotNull\"; // Value at path is not null\n\n/**\n * An object/JSON predicate.\n */\nexport type ObjectPredicate = Readonly<{\n __type: \"object_op\";\n op: ObjectOp;\n field: FieldRef;\n pointer: JsonPointer; // Relative JSON Pointer\n value?: LiteralValue; // For pathEquals, pathContains\n valueType?: ValueType;\n elementType?: ValueType;\n}>;\n\n/**\n * Logical AND predicate.\n */\ntype AndPredicate = Readonly<{\n __type: \"and\";\n predicates: readonly PredicateExpression[];\n}>;\n\n/**\n * Logical OR predicate.\n */\ntype OrPredicate = Readonly<{\n __type: \"or\";\n predicates: readonly PredicateExpression[];\n}>;\n\n/**\n * Logical NOT predicate.\n */\ntype NotPredicate = Readonly<{\n __type: \"not\";\n predicate: PredicateExpression;\n}>;\n\n/**\n * An aggregate comparison predicate (for HAVING clauses).\n */\nexport type AggregateComparisonPredicate = Readonly<{\n __type: \"aggregate_comparison\";\n op: ComparisonOp;\n aggregate: AggregateExpr;\n value: LiteralValue;\n}>;\n\n// ============================================================\n// Subquery Predicates\n// ============================================================\n\n/**\n * An EXISTS subquery predicate.\n * Tests whether the subquery returns any rows.\n */\nexport type ExistsSubquery = Readonly<{\n __type: \"exists\";\n subquery: QueryAst;\n negated: boolean; // for NOT EXISTS\n}>;\n\n/**\n * An IN subquery predicate.\n * Tests whether a field value is in the subquery results.\n */\nexport type InSubquery = Readonly<{\n __type: \"in_subquery\";\n field: FieldRef;\n subquery: QueryAst;\n negated: boolean; // for NOT IN\n}>;\n\n// ============================================================\n// Vector Predicates\n// ============================================================\n\n/**\n * Vector similarity metric types.\n */\nexport type VectorMetricType = \"cosine\" | \"l2\" | \"inner_product\";\n\n/**\n * A vector similarity predicate.\n * Finds nodes with embeddings similar to the query embedding.\n *\n * This predicate affects query execution by:\n * - Joining with the embeddings table\n * - Adding ORDER BY distance (ascending)\n * - Applying LIMIT (top k results)\n * - Optionally filtering by minimum score\n */\nexport type VectorSimilarityPredicate = Readonly<{\n __type: \"vector_similarity\";\n /** The embedding field reference */\n field: FieldRef;\n /** The query embedding to compare against */\n queryEmbedding: readonly number[];\n /** Similarity metric to use */\n metric: VectorMetricType;\n /** Maximum number of results to return */\n limit: number;\n /** Optional minimum similarity score (0-1 for cosine) */\n minScore?: number;\n}>;\n\n/**\n * All predicate expression types.\n */\nexport type PredicateExpression =\n | ComparisonPredicate\n | StringPredicate\n | NullPredicate\n | BetweenPredicate\n | ArrayPredicate\n | ObjectPredicate\n | AndPredicate\n | OrPredicate\n | NotPredicate\n | AggregateComparisonPredicate\n | ExistsSubquery\n | InSubquery\n | VectorSimilarityPredicate;\n\n// ============================================================\n// Query Start\n// ============================================================\n\n/**\n * The starting point of a query (the FROM clause).\n */\nexport type QueryStart = Readonly<{\n alias: string;\n kinds: readonly string[]; // Expanded via ontology if includeSubClasses\n includeSubClasses: boolean;\n}>;\n\n// ============================================================\n// Traversals\n// ============================================================\n\n/**\n * Direction of edge traversal.\n */\nexport type TraversalDirection = \"out\" | \"in\";\n\n/**\n * Traversal ontology expansion behavior.\n *\n * - `\"none\"` — follow only the exact edge kind specified\n * - `\"implying\"` — also follow edge kinds that imply the specified kind (subClassOf)\n * - `\"inverse\"` — also follow the ontological inverse edge kind (inverseOf)\n * - `\"all\"` — follow both implying and inverse expansions\n */\nexport type TraversalExpansion = \"none\" | \"implying\" | \"inverse\" | \"all\";\n\n/**\n * Cycle handling policy for recursive traversals.\n */\nexport type RecursiveCyclePolicy = \"prevent\" | \"allow\";\n\n/**\n * Variable-length traversal specification for recursive graph traversals.\n */\nexport type VariableLengthSpec = Readonly<{\n /** Minimum number of hops before including results (default: 1) */\n minDepth: number;\n /** Maximum number of hops (-1 = unlimited, default: -1) */\n maxDepth: number;\n /**\n * Cycle handling mode.\n *\n * - \"prevent\": Track visited nodes per path and reject revisits\n * - \"allow\": Skip cycle checks (faster, may revisit nodes)\n */\n cyclePolicy: RecursiveCyclePolicy;\n /** Optional column alias for projected traversal path array */\n pathAlias?: string;\n /** Optional column alias for projected traversal depth */\n depthAlias?: string;\n}>;\n\n/**\n * A traversal step in the query.\n */\nexport type Traversal = Readonly<{\n edgeAlias: string;\n edgeKinds: readonly string[]; // Expanded via ontology based on traversal expand mode\n /**\n * Edge kinds traversed in the opposite direction.\n *\n * Populated when query options request inverse/symmetric expansion.\n */\n inverseEdgeKinds?: readonly string[];\n direction: TraversalDirection;\n nodeAlias: string;\n nodeKinds: readonly string[];\n joinFromAlias: string;\n joinEdgeField: \"from_id\" | \"to_id\";\n /** If true, use LEFT JOIN instead of INNER JOIN (optional match) */\n optional: boolean;\n /** Variable-length traversal configuration (for recursive CTEs) */\n variableLength?: VariableLengthSpec;\n}>;\n\n/**\n * Returns the full set of edge kind names for a traversal, merging\n * forward and inverse kinds with deduplication.\n */\nexport function mergeEdgeKinds(traversal: Traversal): readonly string[] {\n const inverse = traversal.inverseEdgeKinds;\n if (inverse === undefined || inverse.length === 0) return traversal.edgeKinds;\n\n return [\n ...traversal.edgeKinds,\n ...inverse.filter((kind) => !traversal.edgeKinds.includes(kind)),\n ];\n}\n\n// ============================================================\n// Aggregations\n// ============================================================\n\n/**\n * Supported aggregate functions.\n */\nexport type AggregateFunction =\n | \"count\"\n | \"countDistinct\"\n | \"sum\"\n | \"avg\"\n | \"min\"\n | \"max\";\n\n/**\n * An aggregate expression.\n */\nexport type AggregateExpr = Readonly<{\n __type: \"aggregate\";\n function: AggregateFunction;\n field: FieldRef;\n}>;\n\n/**\n * A GROUP BY specification.\n */\nexport type GroupBySpec = Readonly<{\n fields: readonly FieldRef[];\n}>;\n\n// ============================================================\n// Projections\n// ============================================================\n\n/**\n * A projected field in the SELECT clause.\n * Can be either a direct field reference or an aggregate expression.\n */\nexport type ProjectedField = Readonly<{\n outputName: string;\n source: FieldRef | AggregateExpr;\n /** Override the CTE alias for this field (used for edge fields in node CTEs) */\n cteAlias?: string;\n}>;\n\n/**\n * The projection (SELECT) clause.\n */\nexport type Projection = Readonly<{\n fields: readonly ProjectedField[];\n}>;\n\n/**\n * A selectively projected field for optimized queries.\n *\n * Used when the select callback only accesses specific fields,\n * allowing the compiler to generate optimized SQL that fetches\n * only those fields instead of the full props blob.\n */\nexport type SelectiveField = Readonly<{\n /** The alias (node or edge) this field belongs to */\n alias: string;\n /** The field name (e.g., \"email\", \"name\", \"id\") */\n field: string;\n /** The output column name in the result (e.g., \"p_email\") */\n outputName: string;\n /** True if this is a system field (id, kind, etc.), false for props */\n isSystemField: boolean;\n /**\n * Optional value type for props fields.\n *\n * When present, the compiler can use type-aware JSON extraction\n * (e.g. numeric/date casts) to better match predicate compilation\n * and enable expression index coverage.\n */\n valueType?: ValueType | undefined;\n}>;\n\n// ============================================================\n// Ordering\n// ============================================================\n\n/**\n * Null ordering preference.\n */\nexport type NullOrdering = \"first\" | \"last\";\n\n/**\n * Sort direction.\n */\nexport type SortDirection = \"asc\" | \"desc\";\n\n/**\n * An ordering specification.\n */\nexport type OrderSpec = Readonly<{\n field: FieldRef;\n direction: SortDirection;\n nulls?: NullOrdering;\n}>;\n\n// ============================================================\n// Node Predicate\n// ============================================================\n\n/**\n * A predicate applied to a specific node or edge alias.\n */\nexport type NodePredicate = Readonly<{\n targetAlias: string;\n /** Whether this predicate targets a node or edge. Defaults to \"node\". */\n targetType?: \"node\" | \"edge\";\n expression: PredicateExpression;\n}>;\n\n// ============================================================\n// Temporal Options\n// ============================================================\n\n/**\n * Temporal query options.\n */\nexport type TemporalOptions = Readonly<{\n mode: TemporalMode;\n asOf?: string;\n}>;\n\n// ============================================================\n// Query AST\n// ============================================================\n\n/**\n * The complete query AST.\n */\nexport type QueryAst = Readonly<{\n /** The graph ID this query is for (used for subqueries) */\n graphId?: string;\n start: QueryStart;\n traversals: readonly Traversal[];\n predicates: readonly NodePredicate[];\n projection: Projection;\n temporalMode: TemporalOptions;\n orderBy?: readonly OrderSpec[];\n limit?: number;\n offset?: number;\n /** GROUP BY specification for aggregate queries */\n groupBy?: GroupBySpec;\n /** HAVING clause - predicates applied after GROUP BY */\n having?: PredicateExpression;\n /**\n * Selective fields for optimized queries.\n * When present, the compiler generates SQL that only fetches these specific\n * fields instead of the full props blob, enabling covered index usage.\n */\n selectiveFields?: readonly SelectiveField[];\n}>;\n\n// ============================================================\n// Set Operations\n// ============================================================\n\n/**\n * Set operation types for combining queries.\n */\nexport type SetOperationType = \"union\" | \"unionAll\" | \"intersect\" | \"except\";\n\n/**\n * A set operation combining two queries.\n */\nexport type SetOperation = Readonly<{\n __type: \"set_operation\";\n operator: SetOperationType;\n left: ComposableQuery;\n right: ComposableQuery;\n orderBy?: readonly OrderSpec[];\n limit?: number;\n offset?: number;\n}>;\n\n/**\n * A composable query - either a base query or a set operation.\n */\nexport type ComposableQuery = QueryAst | SetOperation;\n","/**\n * Field Tracking for Smart Select Optimization.\n *\n * Provides infrastructure for tracking which fields are accessed during\n * a select callback, enabling the query compiler to selectively project\n * only those fields instead of fetching the full props blob.\n */\n\nimport { EDGE_META_KEYS, NODE_META_KEYS } from \"../../system-fields\";\nimport { mergeEdgeKinds, type SelectiveField, type ValueType } from \"../ast\";\nimport { type QueryBuilderState } from \"../builder/types\";\nimport {\n type FieldTypeInfo,\n type SchemaIntrospector,\n} from \"../schema-introspector\";\n\n// ============================================================\n// Types\n// ============================================================\n\ntype TrackingValueMode = \"falsy\" | \"truthy\" | \"max\";\n\ntype AccessedField = Readonly<{\n alias: string;\n field: string;\n isSystemField: boolean;\n}>;\n\nexport type TrackingContextOptions = Readonly<{\n schemaIntrospector: SchemaIntrospector;\n mode: TrackingValueMode;\n /**\n * When \"absent\", optional traversal aliases are set to undefined to\n * encourage exploring fallback branches (e.g., `ctx.friend ? ... : ...`).\n */\n optionalTraversalAliases: \"present\" | \"absent\";\n}>;\n\n// ============================================================\n// Constants\n// ============================================================\n\nconst OBJECT_PROTOTYPE_PROPERTIES = new Set<string>([\n \"__proto__\",\n \"constructor\",\n \"hasOwnProperty\",\n \"isPrototypeOf\",\n \"propertyIsEnumerable\",\n \"toLocaleString\",\n \"toString\",\n \"valueOf\",\n]);\n\n// ============================================================\n// FieldAccessTracker\n// ============================================================\n\nexport class FieldAccessTracker {\n readonly #fields = new Map<string, AccessedField>();\n\n record(alias: string, field: string, isSystemField: boolean): void {\n const key = `${alias}\\u0000${field}`;\n this.#fields.set(key, { alias, field, isSystemField });\n }\n\n getAccessedFields(): readonly AccessedField[] {\n return [...this.#fields.values()];\n }\n}\n\n// ============================================================\n// Tracking Context Creation\n// ============================================================\n\nexport function createTrackingContext(\n state: QueryBuilderState,\n tracker: FieldAccessTracker,\n options: TrackingContextOptions,\n): Record<string, unknown> {\n const context: Record<string, unknown> = {\n [state.startAlias]: createNodeTrackingProxy(\n state.startAlias,\n state.startKinds,\n tracker,\n options,\n ),\n };\n\n for (const traversal of state.traversals) {\n const edgeKindNames = mergeEdgeKinds(traversal);\n\n const optionalAbsent =\n options.optionalTraversalAliases === \"absent\" && traversal.optional;\n\n context[traversal.nodeAlias] =\n optionalAbsent ? undefined : (\n createNodeTrackingProxy(\n traversal.nodeAlias,\n traversal.nodeKinds,\n tracker,\n options,\n )\n );\n\n context[traversal.edgeAlias] =\n optionalAbsent ? undefined : (\n createEdgeTrackingProxy(\n traversal.edgeAlias,\n edgeKindNames,\n tracker,\n options,\n )\n );\n\n // Provide placeholder values for recursive depth/path so the\n // select callback can access them without crashing during tracking.\n const vl = traversal.variableLength;\n if (vl !== undefined) {\n if (vl.depthAlias !== undefined) {\n context[vl.depthAlias] = options.mode === \"falsy\" ? 0 : 1;\n }\n if (vl.pathAlias !== undefined) {\n context[vl.pathAlias] = options.mode === \"falsy\" ? [] : [\"placeholder\"];\n }\n }\n }\n\n return context;\n}\n\nfunction createNodeTrackingProxy(\n alias: string,\n kindNames: readonly string[],\n tracker: FieldAccessTracker,\n options: TrackingContextOptions,\n): unknown {\n return new Proxy(\n {},\n {\n get: (_, property: string | symbol) => {\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n if (OBJECT_PROTOTYPE_PROPERTIES.has(property)) {\n if (property === \"constructor\") return Object;\n if (property === \"__proto__\") return Object.prototype;\n return Reflect.get(Object.prototype, property) as unknown;\n }\n\n if (property === \"id\" || property === \"kind\") {\n tracker.record(alias, property, true);\n return getPlaceholderForSystemField(property, options.mode);\n }\n\n if (property === \"meta\") {\n for (const key of NODE_META_KEYS) {\n tracker.record(alias, `meta.${key}`, true);\n }\n return buildNodeMetaPlaceholder(options.mode);\n }\n\n tracker.record(alias, property, false);\n const typeInfo = options.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n property,\n );\n return getPlaceholderForTypeInfo(typeInfo, options.mode);\n },\n },\n );\n}\n\nfunction createEdgeTrackingProxy(\n alias: string,\n edgeKindNames: readonly string[],\n tracker: FieldAccessTracker,\n options: TrackingContextOptions,\n): unknown {\n return new Proxy(\n {},\n {\n get: (_, property: string | symbol) => {\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n if (OBJECT_PROTOTYPE_PROPERTIES.has(property)) {\n if (property === \"constructor\") return Object;\n if (property === \"__proto__\") return Object.prototype;\n return Reflect.get(Object.prototype, property) as unknown;\n }\n\n if (\n property === \"id\" ||\n property === \"kind\" ||\n property === \"fromId\" ||\n property === \"toId\"\n ) {\n tracker.record(alias, property, true);\n return getPlaceholderForSystemField(property, options.mode);\n }\n\n if (property === \"meta\") {\n for (const key of EDGE_META_KEYS) {\n tracker.record(alias, `meta.${key}`, true);\n }\n return buildEdgeMetaPlaceholder(options.mode);\n }\n\n tracker.record(alias, property, false);\n const typeInfo = options.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n edgeKindNames,\n property,\n );\n return getPlaceholderForTypeInfo(typeInfo, options.mode);\n },\n },\n );\n}\n\n// ============================================================\n// Selective Field Construction\n// ============================================================\n\ntype BuildSelectiveFieldsOptions = Readonly<{\n state: QueryBuilderState;\n schemaIntrospector: SchemaIntrospector;\n}>;\n\nexport function buildSelectiveFields(\n accessedFields: readonly AccessedField[],\n options?: BuildSelectiveFieldsOptions,\n): readonly SelectiveField[] {\n const aliasInfo = options ? buildAliasKindMap(options.state) : undefined;\n\n return accessedFields\n .map((access) => {\n const base: SelectiveField = {\n alias: access.alias,\n field: access.field,\n outputName: `${access.alias}_${access.field}`,\n isSystemField: access.isSystemField,\n };\n\n if (!options || access.isSystemField) {\n return base;\n }\n\n const info = aliasInfo?.get(access.alias);\n if (!info) {\n return base;\n }\n\n const typeInfo =\n info.kind === \"node\" ?\n options.schemaIntrospector.getSharedFieldTypeInfo(\n info.kindNames,\n access.field,\n )\n : options.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n info.kindNames,\n access.field,\n );\n\n return {\n ...base,\n valueType: typeInfo?.valueType,\n };\n })\n .toSorted((a, b) => {\n const aliasCompare = a.alias.localeCompare(b.alias);\n if (aliasCompare !== 0) return aliasCompare;\n return a.field.localeCompare(b.field);\n });\n}\n\ntype AliasKind = \"node\" | \"edge\";\n\ntype AliasKindInfo = Readonly<{\n kind: AliasKind;\n kindNames: readonly string[];\n}>;\n\nfunction buildAliasKindMap(\n state: QueryBuilderState,\n): ReadonlyMap<string, AliasKindInfo> {\n const map = new Map<string, AliasKindInfo>([\n [\n state.startAlias,\n {\n kind: \"node\",\n kindNames: state.startKinds,\n },\n ],\n ]);\n\n for (const traversal of state.traversals) {\n const edgeKindNames = mergeEdgeKinds(traversal);\n\n map.set(traversal.nodeAlias, {\n kind: \"node\",\n kindNames: traversal.nodeKinds,\n });\n map.set(traversal.edgeAlias, {\n kind: \"edge\",\n kindNames: edgeKindNames,\n });\n }\n\n return map;\n}\n\n// ============================================================\n// Placeholder Values\n// ============================================================\n\nfunction getPlaceholderForSystemField(\n field: string,\n mode: TrackingValueMode,\n): unknown {\n if (\n field === \"id\" ||\n field === \"kind\" ||\n field === \"fromId\" ||\n field === \"toId\"\n ) {\n return mode === \"falsy\" ? \"\" : \"x\";\n }\n return undefined;\n}\n\nfunction buildNodeMetaPlaceholder(mode: TrackingValueMode): Readonly<{\n version: number;\n validFrom: string | undefined;\n validTo: string | undefined;\n createdAt: string;\n updatedAt: string;\n deletedAt: string | undefined;\n}> {\n const empty = mode === \"falsy\";\n return {\n version: empty ? 0 : 1,\n validFrom: empty ? undefined : \"2020-01-01T00:00:00.000Z\",\n validTo: undefined,\n createdAt: \"2020-01-01T00:00:00.000Z\",\n updatedAt: \"2020-01-01T00:00:00.000Z\",\n deletedAt: undefined,\n };\n}\n\nfunction buildEdgeMetaPlaceholder(mode: TrackingValueMode): Readonly<{\n validFrom: string | undefined;\n validTo: string | undefined;\n createdAt: string;\n updatedAt: string;\n deletedAt: string | undefined;\n}> {\n const empty = mode === \"falsy\";\n return {\n validFrom: empty ? undefined : \"2020-01-01T00:00:00.000Z\",\n validTo: undefined,\n createdAt: \"2020-01-01T00:00:00.000Z\",\n updatedAt: \"2020-01-01T00:00:00.000Z\",\n deletedAt: undefined,\n };\n}\n\nfunction getPlaceholderForTypeInfo(\n typeInfo: FieldTypeInfo | undefined,\n mode: TrackingValueMode,\n): unknown {\n if (!typeInfo) {\n return undefined;\n }\n\n return getPlaceholderForValueType(typeInfo.valueType, mode);\n}\n\nfunction getPlaceholderForValueType(\n valueType: ValueType,\n mode: TrackingValueMode,\n): unknown {\n switch (valueType) {\n case \"string\":\n case \"date\": {\n if (mode === \"falsy\") return \"\";\n if (mode === \"max\") return \"active\";\n return \"x\";\n }\n case \"number\": {\n if (mode === \"falsy\") return 0;\n if (mode === \"max\") return 100;\n return 1;\n }\n case \"boolean\": {\n return mode !== \"falsy\";\n }\n case \"array\":\n case \"embedding\": {\n return [];\n }\n case \"object\": {\n return {};\n }\n case \"unknown\": {\n return undefined;\n }\n }\n}\n","/**\n * Value decoding utilities for query execution.\n *\n * Selective projection queries return values extracted directly from JSON\n * columns. Some dialects return booleans/numbers as different JS types, and\n * arrays/objects may be returned as JSON text. This module normalizes those\n * values based on schema type information.\n */\n\nimport { type ValueType } from \"../ast\";\nimport { type FieldTypeInfo } from \"../schema-introspector\";\n\nexport function nullToUndefined(value: unknown): unknown {\n return value === null ? undefined : value;\n}\n\nexport function decodeSelectedValue(\n value: unknown,\n typeInfo: FieldTypeInfo | undefined,\n): unknown {\n const normalized = nullToUndefined(value);\n if (normalized === undefined) return undefined;\n\n if (typeInfo === undefined) {\n return normalized;\n }\n\n return decodeByValueType(normalized, typeInfo.valueType);\n}\n\nfunction decodeByValueType(value: unknown, valueType: ValueType): unknown {\n switch (valueType) {\n case \"boolean\": {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n if (value === \"0\") return false;\n if (value === \"1\") return true;\n if (value.toLowerCase() === \"true\") return true;\n if (value.toLowerCase() === \"false\") return false;\n }\n return Boolean(value);\n }\n case \"number\": {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const parsed = Number(value);\n return Number.isNaN(parsed) ? value : parsed;\n }\n return value;\n }\n case \"array\":\n case \"object\":\n case \"embedding\": {\n if (typeof value !== \"string\") return value;\n const trimmed = value.trim();\n const looksJson = trimmed.startsWith(\"[\") || trimmed.startsWith(\"{\");\n if (!looksJson) return value;\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n return value;\n }\n }\n case \"string\":\n case \"date\":\n case \"unknown\": {\n return value;\n }\n default: {\n const _exhaustive: never = valueType;\n void _exhaustive;\n return value;\n }\n }\n}\n","/**\n * Selective Result Mapping for Smart Select Optimization.\n *\n * Converts rows returned from a selective projection query into the\n * SelectContext expected by the select callback, while guarding against\n * missing fields and unsupported \"return whole node/edge\" selections.\n */\n\nimport { normalizePath } from \"../../utils\";\nimport { mergeEdgeKinds, type SelectiveField, type Traversal } from \"../ast\";\nimport type {\n AliasMap,\n EdgeAliasMap,\n QueryBuilderState,\n SelectContext,\n} from \"../builder/types\";\nimport {\n type FieldTypeInfo,\n type SchemaIntrospector,\n} from \"../schema-introspector\";\nimport { decodeSelectedValue, nullToUndefined } from \"./value-decoder\";\n\n// ============================================================\n// Errors\n// ============================================================\n\nexport class MissingSelectiveFieldError extends Error {\n readonly alias: string;\n readonly field: string;\n\n constructor(alias: string, field: string) {\n super(`Smart select missing field: ${alias}.${field}`);\n this.alias = alias;\n this.field = field;\n }\n}\n\n// ============================================================\n// Internal Types\n// ============================================================\n\ntype AliasKind = \"node\" | \"edge\";\n\ntype SystemFieldPlan = Readonly<{\n field: string;\n outputName: string;\n}>;\n\ntype MetaFieldPlan = Readonly<{\n metaKey: string;\n outputName: string;\n}>;\n\ntype PropsFieldPlan = Readonly<{\n field: string;\n outputName: string;\n typeInfo: FieldTypeInfo | undefined;\n}>;\n\ntype AliasPlan = Readonly<{\n alias: string;\n kind: AliasKind;\n optional: boolean;\n systemFields: readonly SystemFieldPlan[];\n metaFields: readonly MetaFieldPlan[];\n propsFields: readonly PropsFieldPlan[];\n idOutputName: string | undefined;\n metaOutputNames: ReadonlySet<string>;\n propsOutputNames: ReadonlySet<string>;\n systemOutputNames: ReadonlySet<string>;\n}>;\n\n// ============================================================\n// Marker for \"whole alias object\" detection\n// ============================================================\n\nconst SELECTABLE_ALIAS_MARKER = Symbol(\"selectable_alias_marker\");\n\ntype SelectableAliasMarker = Readonly<{\n alias: string;\n kind: AliasKind;\n}>;\n\nfunction isSelectableAliasObject(\n value: unknown,\n): value is SelectableAliasMarker {\n return (\n typeof value === \"object\" &&\n value !== null &&\n SELECTABLE_ALIAS_MARKER in value\n );\n}\n\nfunction containsSelectableAliasObject(value: unknown): boolean {\n const visited = new WeakSet<object>();\n\n function walk(current: unknown): boolean {\n if (isSelectableAliasObject(current)) return true;\n\n if (Array.isArray(current)) {\n for (const item of current) {\n if (walk(item)) return true;\n }\n return false;\n }\n\n if (typeof current !== \"object\" || current === null) {\n return false;\n }\n\n if (visited.has(current)) return false;\n visited.add(current);\n\n for (const value of Object.values(current)) {\n if (walk(value)) return true;\n }\n return false;\n }\n\n return walk(value);\n}\n\n// ============================================================\n// Public API\n// ============================================================\n\nexport function mapSelectiveResults<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n R,\n>(\n rows: readonly Record<string, unknown>[],\n state: QueryBuilderState,\n selectiveFields: readonly SelectiveField[],\n schemaIntrospector: SchemaIntrospector,\n selectFunction: (context: SelectContext<Aliases, EdgeAliases>) => R,\n): readonly R[] {\n const plans = buildAliasPlans(state, selectiveFields, schemaIntrospector);\n\n return rows.map((row) => {\n const context = buildSelectiveContext<Aliases, EdgeAliases>(\n row,\n plans,\n state.traversals,\n );\n const result = selectFunction(context);\n\n // Returning whole alias objects is not supported by selective projection.\n // If it happens, fall back to the full fetch path.\n if (containsSelectableAliasObject(result)) {\n throw new MissingSelectiveFieldError(\n state.startAlias,\n \"whole node/edge selection\",\n );\n }\n\n return result;\n });\n}\n\n// ============================================================\n// Plan Construction\n// ============================================================\n\nfunction buildAliasPlans(\n state: QueryBuilderState,\n selectiveFields: readonly SelectiveField[],\n schemaIntrospector: SchemaIntrospector,\n): readonly AliasPlan[] {\n const aliasInfo = new Map<\n string,\n Readonly<{\n kind: AliasKind;\n optional: boolean;\n kindNames: readonly string[];\n }>\n >([\n [\n state.startAlias,\n {\n kind: \"node\",\n optional: false,\n kindNames: state.startKinds,\n },\n ],\n ]);\n\n for (const traversal of state.traversals) {\n const edgeKindNames = mergeEdgeKinds(traversal);\n\n aliasInfo.set(traversal.nodeAlias, {\n kind: \"node\",\n optional: traversal.optional,\n kindNames: traversal.nodeKinds,\n });\n aliasInfo.set(traversal.edgeAlias, {\n kind: \"edge\",\n optional: traversal.optional,\n kindNames: edgeKindNames,\n });\n }\n\n const fieldsByAlias = new Map<string, SelectiveField[]>();\n for (const field of selectiveFields) {\n const existing = fieldsByAlias.get(field.alias) ?? [];\n existing.push(field);\n fieldsByAlias.set(field.alias, existing);\n }\n\n const plans: AliasPlan[] = [];\n\n for (const [alias, info] of aliasInfo.entries()) {\n const fields = fieldsByAlias.get(alias) ?? [];\n\n const systemFields: SystemFieldPlan[] = [];\n const metaFields: MetaFieldPlan[] = [];\n const propsFields: PropsFieldPlan[] = [];\n\n for (const field of fields) {\n if (field.isSystemField) {\n if (field.field.startsWith(\"meta.\")) {\n metaFields.push({\n metaKey: field.field.slice(5),\n outputName: field.outputName,\n });\n } else {\n systemFields.push({\n field: field.field,\n outputName: field.outputName,\n });\n }\n } else {\n const typeInfo =\n info.kind === \"node\" ?\n schemaIntrospector.getSharedFieldTypeInfo(\n info.kindNames,\n field.field,\n )\n : schemaIntrospector.getSharedEdgeFieldTypeInfo(\n info.kindNames,\n field.field,\n );\n\n propsFields.push({\n field: field.field,\n outputName: field.outputName,\n typeInfo,\n });\n }\n }\n\n const idOutputName =\n systemFields.find((f) => f.field === \"id\")?.outputName ?? undefined;\n\n plans.push({\n alias,\n kind: info.kind,\n optional: info.optional,\n systemFields,\n metaFields,\n propsFields,\n idOutputName,\n metaOutputNames: new Set(metaFields.map((f) => f.outputName)),\n propsOutputNames: new Set(propsFields.map((f) => f.outputName)),\n systemOutputNames: new Set(systemFields.map((f) => f.outputName)),\n });\n }\n\n // Keep plan iteration stable.\n return plans.toSorted((a, b) => a.alias.localeCompare(b.alias));\n}\n\n// ============================================================\n// Context Building\n// ============================================================\n\nfunction buildSelectiveContext<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n>(\n row: Record<string, unknown>,\n plans: readonly AliasPlan[],\n traversals: readonly Traversal[],\n): SelectContext<Aliases, EdgeAliases> {\n const context: Record<string, unknown> = {};\n\n for (const plan of plans) {\n const value =\n plan.optional && plan.idOutputName !== undefined ?\n buildOptionalAliasValue(row, plan)\n : buildRequiredAliasValue(row, plan);\n context[plan.alias] = value;\n }\n\n // Extract recursive depth/path values from the row\n for (const traversal of traversals) {\n const vl = traversal.variableLength;\n if (vl !== undefined) {\n if (vl.depthAlias !== undefined) {\n context[vl.depthAlias] = row[vl.depthAlias];\n }\n if (vl.pathAlias !== undefined) {\n context[vl.pathAlias] = normalizePath(row[vl.pathAlias]);\n }\n }\n }\n\n return context as SelectContext<Aliases, EdgeAliases>;\n}\n\nfunction buildOptionalAliasValue(\n row: Record<string, unknown>,\n plan: AliasPlan,\n): unknown {\n const idValue = row[plan.idOutputName!];\n\n if (idValue === null || idValue === undefined) {\n return undefined;\n }\n return buildRequiredAliasValue(row, plan);\n}\n\nfunction buildRequiredAliasValue(\n row: Record<string, unknown>,\n plan: AliasPlan,\n): unknown {\n const base: Record<string, unknown> = {\n [SELECTABLE_ALIAS_MARKER]: {\n alias: plan.alias,\n kind: plan.kind,\n } satisfies SelectableAliasMarker,\n };\n\n for (const field of plan.systemFields) {\n base[field.field] = nullToUndefined(row[field.outputName]);\n }\n\n if (plan.metaFields.length > 0) {\n const meta: Record<string, unknown> = {};\n for (const field of plan.metaFields) {\n meta[field.metaKey] = nullToUndefined(row[field.outputName]);\n }\n base.meta = createGuardedProxy(meta, `${plan.alias}.meta`);\n }\n\n for (const field of plan.propsFields) {\n const decoded = decodeSelectedValue(row[field.outputName], field.typeInfo);\n base[field.field] = decoded;\n }\n\n return createGuardedProxy(base, plan.alias);\n}\n\nfunction createGuardedProxy(\n target: Record<string, unknown>,\n debugPath: string,\n): unknown {\n return new Proxy(target, {\n get: (object, property: string | symbol, receiver) => {\n if (typeof property === \"symbol\") {\n return Reflect.get(object, property, receiver) as unknown;\n }\n\n if (property === \"then\" || property === \"toJSON\") {\n return;\n }\n\n if (property in object) {\n return Reflect.get(object, property, receiver);\n }\n\n if (property in Object.prototype) {\n return Reflect.get(Object.prototype, property, receiver) as unknown;\n }\n\n throw new MissingSelectiveFieldError(debugPath, property);\n },\n });\n}\n","/**\n * SQL Identifier Validation\n *\n * Validates aliases and identifiers to prevent SQL injection.\n */\nimport { ValidationError } from \"../../errors\";\nimport { type PredicateExpression } from \"../ast\";\n\n/**\n * Pattern for valid SQL identifiers (aliases).\n * Must start with a letter or underscore, followed by letters, digits, or underscores.\n * Maximum length of 63 characters (PostgreSQL limit).\n */\nconst SQL_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;\n\n/**\n * Reserved SQL keywords that cannot be used as aliases.\n */\nconst SQL_RESERVED_KEYWORDS = new Set([\n \"select\",\n \"from\",\n \"where\",\n \"and\",\n \"or\",\n \"not\",\n \"in\",\n \"is\",\n \"null\",\n \"true\",\n \"false\",\n \"as\",\n \"on\",\n \"join\",\n \"left\",\n \"right\",\n \"inner\",\n \"outer\",\n \"cross\",\n \"full\",\n \"group\",\n \"by\",\n \"having\",\n \"order\",\n \"asc\",\n \"desc\",\n \"limit\",\n \"offset\",\n \"union\",\n \"intersect\",\n \"except\",\n \"all\",\n \"distinct\",\n \"case\",\n \"when\",\n \"then\",\n \"else\",\n \"end\",\n \"exists\",\n \"between\",\n \"like\",\n \"ilike\",\n \"insert\",\n \"update\",\n \"delete\",\n \"create\",\n \"drop\",\n \"alter\",\n \"table\",\n \"index\",\n \"view\",\n \"with\",\n \"recursive\",\n]);\n\n/**\n * Validates that an alias is a safe SQL identifier.\n *\n * @param alias - The alias to validate\n * @throws ValidationError if the alias is not a valid SQL identifier\n */\nexport function validateSqlIdentifier(alias: string): void {\n if (!SQL_IDENTIFIER_PATTERN.test(alias)) {\n throw new ValidationError(\n `Invalid alias \"${alias}\": must start with a letter or underscore, ` +\n `contain only letters, digits, and underscores, and be at most 63 characters`,\n {\n issues: [\n {\n path: \"alias\",\n message: `\"${alias}\" is not a valid SQL identifier`,\n },\n ],\n },\n {\n suggestion: `Use a simple identifier like \"p\", \"e\", \"node1\", or \"my_alias\".`,\n },\n );\n }\n\n if (alias.toLowerCase().startsWith(\"cte_\")) {\n throw new ValidationError(\n `Invalid alias \"${alias}\": aliases starting with \"cte_\" are reserved for internal use`,\n {\n issues: [\n {\n path: \"alias\",\n message: `\"${alias}\" conflicts with internal CTE naming`,\n },\n ],\n },\n {\n suggestion: `Choose an alias that does not start with \"cte_\".`,\n },\n );\n }\n\n if (SQL_RESERVED_KEYWORDS.has(alias.toLowerCase())) {\n throw new ValidationError(\n `Invalid alias \"${alias}\": \"${alias}\" is a reserved SQL keyword`,\n {\n issues: [\n { path: \"alias\", message: `\"${alias}\" is a reserved SQL keyword` },\n ],\n },\n {\n suggestion: `Choose a different alias. Reserved words like SELECT, FROM, WHERE cannot be used.`,\n },\n );\n }\n}\n\nfunction throwInvalidVectorPredicatePlacement(path: string): never {\n throw new ValidationError(\n \"Vector similarity predicates cannot be nested under OR or NOT. \" +\n \"Use top-level AND combinations instead.\",\n {\n issues: [\n {\n path,\n message:\n \"Vector similarity predicates are only supported at top-level \" +\n \"or inside AND groups.\",\n },\n ],\n },\n {\n suggestion:\n \"Rewrite the predicate to keep vector similarity at top-level \" +\n \"or combine with additional filters using AND.\",\n },\n );\n}\n\nfunction validateVectorPredicateExpression(\n expression: PredicateExpression,\n inDisallowedBranch: boolean,\n path: string,\n): void {\n switch (expression.__type) {\n case \"vector_similarity\": {\n if (inDisallowedBranch) {\n throwInvalidVectorPredicatePlacement(path);\n }\n return;\n }\n case \"and\": {\n for (const [\n predicateIndex,\n predicate,\n ] of expression.predicates.entries()) {\n validateVectorPredicateExpression(\n predicate,\n inDisallowedBranch,\n `${path}.predicates[${predicateIndex}]`,\n );\n }\n return;\n }\n case \"or\": {\n for (const [\n predicateIndex,\n predicate,\n ] of expression.predicates.entries()) {\n validateVectorPredicateExpression(\n predicate,\n true,\n `${path}.predicates[${predicateIndex}]`,\n );\n }\n return;\n }\n case \"not\": {\n validateVectorPredicateExpression(\n expression.predicate,\n true,\n `${path}.predicate`,\n );\n return;\n }\n case \"comparison\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"exists\":\n case \"in_subquery\": {\n return;\n }\n }\n}\n\nexport function validateVectorPredicatePlacement(\n predicates: readonly { expression: PredicateExpression }[],\n): void {\n for (const [predicateIndex, predicate] of predicates.entries()) {\n validateVectorPredicateExpression(\n predicate.expression,\n false,\n `predicates[${predicateIndex}].expression`,\n );\n }\n}\n","/**\n * AST Builder utilities for query construction.\n *\n * Provides shared functions for building QueryAst objects from builder state.\n */\nimport { type QueryAst } from \"../ast\";\nimport type { QueryBuilderConfig, QueryBuilderState } from \"./types\";\nimport { validateVectorPredicatePlacement } from \"./validation\";\n\n/**\n * Builds a QueryAst from builder config and state.\n *\n * This is shared by ExecutableQuery and ExecutableAggregateQuery to avoid\n * duplicating the AST construction logic.\n */\nexport function buildQueryAst(\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n): QueryAst {\n validateVectorPredicatePlacement(state.predicates);\n\n const temporalMode: { mode: typeof state.temporalMode; asOf?: string } = {\n mode: state.temporalMode,\n };\n if (state.asOf !== undefined) {\n temporalMode.asOf = state.asOf;\n }\n\n return {\n graphId: config.graphId,\n start: {\n alias: state.startAlias,\n kinds: state.startKinds,\n includeSubClasses: state.includeSubClasses,\n },\n traversals: state.traversals,\n predicates: state.predicates,\n projection: {\n fields: state.projection,\n },\n temporalMode,\n ...(state.orderBy.length > 0 && { orderBy: state.orderBy }),\n ...(state.limit !== undefined && { limit: state.limit }),\n ...(state.offset !== undefined && { offset: state.offset }),\n ...(state.groupBy !== undefined && { groupBy: state.groupBy }),\n ...(state.having !== undefined && { having: state.having }),\n };\n}\n","/**\n * PreparedQuery — a pre-compiled, parameterized query.\n *\n * Created via `ExecutableQuery.prepare()`. Compiles the query AST to SQL once\n * at prepare time, then executes with different parameter bindings on each call.\n *\n * Fast path: when `backend.executeRaw` is available, executes pre-compiled SQL\n * text directly with substituted parameter values.\n *\n * Fallback: substitutes parameter refs in the AST, recompiles to SQL, and\n * executes via the standard `backend.execute` path.\n */\nimport { Placeholder } from \"drizzle-orm\";\n\nimport { type GraphBackend } from \"../../backend/types\";\nimport { ConfigurationError, UnsupportedPredicateError } from \"../../errors\";\nimport {\n type BetweenPredicate,\n type ComparisonPredicate,\n type ComposableQuery,\n type LiteralValue,\n type PredicateExpression,\n type QueryAst,\n type SelectiveField,\n type StringPredicate,\n} from \"../ast\";\nimport { compileQuery, type CompileQueryOptions } from \"../compiler/index\";\nimport { getDialect } from \"../dialect\";\nimport { type SqlDialect } from \"../dialect/types\";\nimport {\n mapResults,\n mapSelectiveResults,\n MissingSelectiveFieldError,\n transformPathColumns,\n} from \"../execution\";\nimport { isParameterRef } from \"../predicates\";\nimport { type SchemaIntrospector } from \"../schema-introspector\";\nimport {\n type AliasMap,\n type EdgeAliasMap,\n type QueryBuilderState,\n type SelectContext,\n} from \"./types\";\n\n// ============================================================\n// Parameter Substitution\n// ============================================================\n\nfunction toLiteral(value: unknown): LiteralValue {\n if (value === null) {\n throw new ConfigurationError(\n \"Parameter value must not be null (use undefined-based patterns instead)\",\n { parameterName: \"value\", valueType: \"null\" },\n );\n }\n if (value instanceof Date) {\n return { __type: \"literal\", value: value.toISOString(), valueType: \"date\" };\n }\n if (typeof value === \"string\") {\n return { __type: \"literal\", value, valueType: \"string\" };\n }\n if (typeof value === \"number\") {\n return { __type: \"literal\", value, valueType: \"number\" };\n }\n if (typeof value === \"boolean\") {\n return { __type: \"literal\", value, valueType: \"boolean\" };\n }\n throw new ConfigurationError(\n `Unsupported parameter value type: ${typeof value}`,\n { parameterName: \"value\", actualType: typeof value },\n );\n}\n\n/**\n * Walks a predicate expression tree and replaces ParameterRef nodes\n * with LiteralValue nodes using the provided bindings.\n */\nfunction substitutePredicateExpression(\n expr: PredicateExpression,\n bindings: Readonly<Record<string, unknown>>,\n): PredicateExpression {\n switch (expr.__type) {\n case \"comparison\": {\n if (isParameterRef(expr.right)) {\n const value = bindings[expr.right.name];\n if (value === undefined) {\n throw new ConfigurationError(\n `Missing binding for parameter \"${expr.right.name}\"`,\n { parameterName: expr.right.name },\n );\n }\n return {\n ...expr,\n right: toLiteral(value),\n } satisfies ComparisonPredicate;\n }\n return expr;\n }\n\n case \"string_op\": {\n if (isParameterRef(expr.pattern)) {\n const value = bindings[expr.pattern.name];\n if (value === undefined) {\n throw new ConfigurationError(\n `Missing binding for parameter \"${expr.pattern.name}\"`,\n { parameterName: expr.pattern.name },\n );\n }\n if (typeof value !== \"string\") {\n throw new ConfigurationError(\n `Parameter \"${expr.pattern.name}\" must be a string for string operations`,\n { parameterName: expr.pattern.name, actualType: typeof value },\n );\n }\n return {\n ...expr,\n pattern: value,\n } satisfies StringPredicate;\n }\n return expr;\n }\n\n case \"between\": {\n const lowerIsParam = isParameterRef(expr.lower);\n const upperIsParam = isParameterRef(expr.upper);\n if (!lowerIsParam && !upperIsParam) return expr;\n\n const lower =\n lowerIsParam ?\n toLiteral(resolveBinding(bindings, expr.lower.name))\n : expr.lower;\n const upper =\n upperIsParam ?\n toLiteral(resolveBinding(bindings, expr.upper.name))\n : expr.upper;\n return { ...expr, lower, upper } satisfies BetweenPredicate;\n }\n\n case \"and\": {\n return {\n ...expr,\n predicates: expr.predicates.map((p) =>\n substitutePredicateExpression(p, bindings),\n ),\n };\n }\n\n case \"or\": {\n return {\n ...expr,\n predicates: expr.predicates.map((p) =>\n substitutePredicateExpression(p, bindings),\n ),\n };\n }\n\n case \"not\": {\n return {\n ...expr,\n predicate: substitutePredicateExpression(expr.predicate, bindings),\n };\n }\n\n // These predicate types don't contain ParameterRef nodes\n case \"null_check\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"vector_similarity\": {\n return expr;\n }\n\n case \"exists\": {\n return {\n ...expr,\n subquery: substituteParameters(expr.subquery, bindings),\n };\n }\n\n case \"in_subquery\": {\n return {\n ...expr,\n subquery: substituteParameters(expr.subquery, bindings),\n };\n }\n }\n}\n\nfunction resolveBinding(\n bindings: Readonly<Record<string, unknown>>,\n name: string,\n): unknown {\n const value = bindings[name];\n if (value === undefined) {\n throw new ConfigurationError(`Missing binding for parameter \"${name}\"`, {\n parameterName: name,\n });\n }\n return value;\n}\n\n/**\n * Substitutes all ParameterRef nodes in a QueryAst with concrete values.\n */\nfunction substituteParameters(\n ast: QueryAst,\n bindings: Readonly<Record<string, unknown>>,\n): QueryAst {\n return {\n ...ast,\n predicates: ast.predicates.map((pred) => ({\n ...pred,\n expression: substitutePredicateExpression(pred.expression, bindings),\n })),\n ...(ast.having !== undefined && {\n having: substitutePredicateExpression(ast.having, bindings),\n }),\n };\n}\n\n// ============================================================\n// Placeholder Substitution for executeRaw Fast Path\n// ============================================================\n\n/**\n * Fills placeholder values in a parameter array.\n *\n * Drizzle's `sql.placeholder()` produces `Placeholder` objects in the params\n * array. This function replaces them with the actual bound values.\n */\nfunction fillPlaceholders(\n params: readonly unknown[],\n bindings: Readonly<Record<string, unknown>>,\n dialect: SqlDialect,\n): unknown[] {\n const adapter = getDialect(dialect);\n return params.map((parameter) => {\n if (parameter instanceof Placeholder) {\n const name = parameter.name as string;\n const value = bindings[name];\n if (value === undefined) {\n throw new ConfigurationError(\n `Missing binding for parameter \"${name}\"`,\n { parameterName: name },\n );\n }\n if (value instanceof Date) return value.toISOString();\n return adapter.bindValue(value);\n }\n return parameter;\n });\n}\n\n// ============================================================\n// PreparedQuery\n// ============================================================\n\ntype PreparedQueryConfig<R> = Readonly<{\n ast: QueryAst;\n unoptimizedAst: QueryAst;\n sqlText: string | undefined;\n sqlParams: readonly unknown[] | undefined;\n unoptimizedSqlText: string | undefined;\n unoptimizedSqlParams: readonly unknown[] | undefined;\n backend: GraphBackend;\n dialect: SqlDialect;\n graphId: string;\n compileOptions: CompileQueryOptions;\n state: QueryBuilderState;\n selectiveFields: readonly SelectiveField[] | undefined;\n selectFn: (context: SelectContext<AliasMap, EdgeAliasMap>) => R;\n schemaIntrospector: SchemaIntrospector;\n}>;\n\n/**\n * A pre-compiled, parameterized query.\n *\n * @example\n * ```typescript\n * const prepared = store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(param(\"name\")))\n * .select((ctx) => ctx.p)\n * .prepare();\n *\n * // Execute with different bindings\n * const alice = await prepared.execute({ name: \"Alice\" });\n * const bob = await prepared.execute({ name: \"Bob\" });\n * ```\n */\nexport class PreparedQuery<R> {\n readonly #ast: QueryAst;\n readonly #unoptimizedAst: QueryAst;\n readonly #sqlText: string | undefined;\n readonly #sqlParams: readonly unknown[] | undefined;\n readonly #unoptimizedSqlText: string | undefined;\n readonly #unoptimizedSqlParams: readonly unknown[] | undefined;\n readonly #backend: GraphBackend;\n readonly #dialect: SqlDialect;\n readonly #graphId: string;\n readonly #compileOptions: CompileQueryOptions;\n readonly #state: QueryBuilderState;\n readonly #selectiveFields: readonly SelectiveField[] | undefined;\n readonly #selectFn: (context: SelectContext<AliasMap, EdgeAliasMap>) => R;\n readonly #schemaIntrospector: SchemaIntrospector;\n readonly #parameterMetadata: ParameterMetadata;\n\n constructor(config: PreparedQueryConfig<R>) {\n this.#ast = config.ast;\n this.#unoptimizedAst = config.unoptimizedAst;\n this.#sqlText = config.sqlText;\n this.#sqlParams = config.sqlParams;\n this.#unoptimizedSqlText = config.unoptimizedSqlText;\n this.#unoptimizedSqlParams = config.unoptimizedSqlParams;\n this.#backend = config.backend;\n this.#dialect = config.dialect;\n this.#graphId = config.graphId;\n this.#compileOptions = config.compileOptions;\n this.#state = config.state;\n this.#selectiveFields = config.selectiveFields;\n this.#selectFn = config.selectFn;\n this.#schemaIntrospector = config.schemaIntrospector;\n this.#parameterMetadata = collectParameterMetadata(this.#ast);\n }\n\n /** The set of parameter names required by this prepared query. */\n get parameterNames(): ReadonlySet<string> {\n return this.#parameterMetadata.names;\n }\n\n /**\n * Executes the prepared query with the given parameter bindings.\n *\n * @param bindings - A record mapping parameter names to their values\n * @returns The query results\n */\n async execute(\n bindings: Readonly<Record<string, unknown>> = {},\n ): Promise<readonly R[]> {\n validateBindings(bindings, this.#parameterMetadata);\n\n if (this.#selectiveFields !== undefined) {\n try {\n const rows = await this.#executeSelectiveRows(bindings);\n return mapSelectiveResults<AliasMap, EdgeAliasMap, R>(\n rows,\n this.#state,\n this.#selectiveFields,\n this.#schemaIntrospector,\n this.#selectFn,\n );\n } catch (error) {\n if (\n error instanceof MissingSelectiveFieldError ||\n error instanceof UnsupportedPredicateError\n ) {\n // Fall back per-call without permanently disabling the optimized path,\n // since different bindings may succeed on the optimized path.\n // Note: this fallback is observable via query profiler hooks (onQueryStart\n // fires twice — once for the optimized attempt, once for the fallback).\n return this.#executeUnoptimized(bindings);\n }\n throw error;\n }\n }\n\n return this.#executeUnoptimized(bindings);\n }\n\n async #executeSelectiveRows(\n bindings: Readonly<Record<string, unknown>>,\n ): Promise<readonly Record<string, unknown>[]> {\n if (\n this.#sqlText !== undefined &&\n this.#sqlParams !== undefined &&\n this.#backend.executeRaw !== undefined\n ) {\n const filledParams = fillPlaceholders(\n this.#sqlParams,\n bindings,\n this.#dialect,\n );\n const rawRows = await this.#backend.executeRaw<Record<string, unknown>>(\n this.#sqlText,\n filledParams,\n );\n return transformPathColumns(rawRows, this.#state, this.#dialect);\n }\n\n const concreteAst = substituteParameters(this.#ast, bindings);\n const compiled = compileQuery(\n concreteAst,\n this.#graphId,\n this.#compileOptions,\n );\n const rawRows =\n await this.#backend.execute<Record<string, unknown>>(compiled);\n return transformPathColumns(rawRows, this.#state, this.#dialect);\n }\n\n async #executeUnoptimized(\n bindings: Readonly<Record<string, unknown>>,\n ): Promise<readonly R[]> {\n const rows = await this.#executeUnoptimizedRows(bindings);\n return mapResults<AliasMap, EdgeAliasMap, R>(\n rows,\n this.#state.startAlias,\n this.#state.traversals,\n this.#selectFn,\n );\n }\n\n async #executeUnoptimizedRows(\n bindings: Readonly<Record<string, unknown>>,\n ): Promise<readonly Record<string, unknown>[]> {\n if (\n this.#unoptimizedSqlText !== undefined &&\n this.#unoptimizedSqlParams !== undefined &&\n this.#backend.executeRaw !== undefined\n ) {\n const filledParams = fillPlaceholders(\n this.#unoptimizedSqlParams,\n bindings,\n this.#dialect,\n );\n const rawRows = await this.#backend.executeRaw<Record<string, unknown>>(\n this.#unoptimizedSqlText,\n filledParams,\n );\n return transformPathColumns(rawRows, this.#state, this.#dialect);\n }\n\n const concreteAst = substituteParameters(this.#unoptimizedAst, bindings);\n const compiled = compileQuery(\n concreteAst,\n this.#graphId,\n this.#compileOptions,\n );\n const rawRows =\n await this.#backend.execute<Record<string, unknown>>(compiled);\n return transformPathColumns(rawRows, this.#state, this.#dialect);\n }\n}\n\ntype ParameterMetadata = Readonly<{\n names: ReadonlySet<string>;\n /** Parameters used in string_op predicates (must receive string values). */\n stringOpParameters: ReadonlySet<string>;\n}>;\n\nfunction collectParameterMetadata(ast: QueryAst): ParameterMetadata {\n const names = new Set<string>();\n const stringOpParameters = new Set<string>();\n\n collectParameterMetadataFromAst(ast, names, stringOpParameters);\n\n return { names, stringOpParameters };\n}\n\nexport function hasParameterReferences(ast: QueryAst): boolean {\n return collectParameterMetadata(ast).names.size > 0;\n}\n\nexport function composableQueryHasParameterReferences(\n query: ComposableQuery,\n): boolean {\n if (\"__type\" in query) {\n return (\n composableQueryHasParameterReferences(query.left) ||\n composableQueryHasParameterReferences(query.right)\n );\n }\n return hasParameterReferences(query);\n}\n\nfunction collectParameterMetadataFromAst(\n ast: QueryAst,\n names: Set<string>,\n stringOpParameters: Set<string>,\n): void {\n for (const predicate of ast.predicates) {\n collectParameterMetadataFromExpression(\n predicate.expression,\n names,\n stringOpParameters,\n );\n }\n if (ast.having !== undefined) {\n collectParameterMetadataFromExpression(\n ast.having,\n names,\n stringOpParameters,\n );\n }\n}\n\nfunction collectParameterMetadataFromExpression(\n expression: PredicateExpression,\n names: Set<string>,\n stringOpParameters: Set<string>,\n): void {\n switch (expression.__type) {\n case \"comparison\": {\n if (isParameterRef(expression.right)) {\n names.add(expression.right.name);\n }\n return;\n }\n case \"string_op\": {\n if (isParameterRef(expression.pattern)) {\n names.add(expression.pattern.name);\n stringOpParameters.add(expression.pattern.name);\n }\n return;\n }\n case \"between\": {\n if (isParameterRef(expression.lower)) {\n names.add(expression.lower.name);\n }\n if (isParameterRef(expression.upper)) {\n names.add(expression.upper.name);\n }\n return;\n }\n case \"and\":\n case \"or\": {\n for (const predicate of expression.predicates) {\n collectParameterMetadataFromExpression(\n predicate,\n names,\n stringOpParameters,\n );\n }\n return;\n }\n case \"not\": {\n collectParameterMetadataFromExpression(\n expression.predicate,\n names,\n stringOpParameters,\n );\n return;\n }\n case \"null_check\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"vector_similarity\": {\n return;\n }\n case \"exists\": {\n collectParameterMetadataFromAst(\n expression.subquery,\n names,\n stringOpParameters,\n );\n return;\n }\n case \"in_subquery\": {\n collectParameterMetadataFromAst(\n expression.subquery,\n names,\n stringOpParameters,\n );\n return;\n }\n }\n}\n\nfunction validateBindings(\n bindings: Readonly<Record<string, unknown>>,\n metadata: ParameterMetadata,\n): void {\n const { names: expectedNames, stringOpParameters } = metadata;\n\n const missing: string[] = [];\n for (const name of expectedNames) {\n if (bindings[name] === undefined) {\n missing.push(name);\n }\n }\n\n if (missing.length > 0) {\n throw new ConfigurationError(\n `Missing bindings for parameter${missing.length === 1 ? \"\" : \"s\"}: ${missing.map((name) => `\"${name}\"`).join(\", \")}`,\n { missingParameters: missing },\n );\n }\n\n const unexpected = Object.keys(bindings).filter(\n (name) => !expectedNames.has(name),\n );\n if (unexpected.length > 0) {\n throw new ConfigurationError(\n `Unexpected bindings provided: ${unexpected.map((name) => `\"${name}\"`).join(\", \")}`,\n { unexpectedParameters: unexpected },\n );\n }\n\n // Validate value types upfront so both the fast path (executeRaw) and the\n // fallback path (AST substitution) reject the same invalid inputs.\n for (const name of expectedNames) {\n const value = bindings[name];\n validateBindingValue(name, value, stringOpParameters.has(name));\n }\n}\n\nfunction validateBindingValue(\n name: string,\n value: unknown,\n isStringOp: boolean,\n): void {\n if (value === null) {\n throw new ConfigurationError(\n \"Parameter value must not be null (use undefined-based patterns instead)\",\n { parameterName: name, valueType: \"null\" },\n );\n }\n if (isStringOp) {\n if (typeof value !== \"string\") {\n throw new ConfigurationError(\n `Parameter \"${name}\" must be a string for string operations`,\n { parameterName: name, actualType: typeof value },\n );\n }\n return;\n }\n if (\n value instanceof Date ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return;\n }\n throw new ConfigurationError(\n `Unsupported parameter value type: ${typeof value}`,\n { parameterName: name, actualType: typeof value },\n );\n}\n","/**\n * ExecutableQuery - A query that can be executed, paginated, or streamed.\n */\nimport { type SQL } from \"drizzle-orm\";\n\nimport { type GraphBackend } from \"../../backend/types\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { UnsupportedPredicateError, ValidationError } from \"../../errors\";\nimport {\n type OrderSpec,\n type QueryAst,\n type SelectiveField,\n type SortDirection,\n} from \"../ast\";\nimport { compileQuery, type CompileQueryOptions } from \"../compiler/index\";\nimport {\n buildCursorFromRow,\n type CursorData,\n decodeCursor,\n validateCursorColumns,\n} from \"../cursor\";\nimport {\n buildCursorPredicate,\n buildPaginatedResult,\n buildSelectContext,\n buildSelectiveFields,\n createStreamIterable,\n createTrackingContext,\n decodeSelectedValue,\n FieldAccessTracker,\n getStreamBatchSize,\n mapResults,\n mapSelectiveResults,\n MissingSelectiveFieldError,\n transformPathColumns,\n} from \"../execution\";\nimport { jsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport { fieldRef } from \"../predicates\";\nimport { buildQueryAst } from \"./ast-builder\";\nimport { hasParameterReferences, PreparedQuery } from \"./prepared-query\";\nimport {\n type AliasMap,\n type EdgeAliasMap,\n type PaginatedResult,\n type PaginateOptions,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type RecursiveAliasMap,\n type SelectContext,\n type StreamOptions,\n} from \"./types\";\nimport { type UnionableQuery } from \"./unionable-query\";\n\nconst NOT_COMPUTED = Symbol(\"NOT_COMPUTED\");\n\n// Forward declaration for UnionableQuery to avoid circular imports\ntype UnionableQueryConstructor = new (\n config: QueryBuilderConfig,\n state: {\n left: QueryAst;\n operator: \"union\" | \"unionAll\" | \"intersect\" | \"except\";\n right: QueryAst;\n // Additional state for result transformation\n startAlias: string;\n traversals: QueryBuilderState[\"traversals\"];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any select function type for set operations\n selectFn: (context: SelectContext<any, any>) => unknown;\n },\n) => unknown;\n\nlet UnionableQueryClass: UnionableQueryConstructor;\n\n/**\n * Sets the UnionableQuery class reference.\n * Called during module initialization to break circular dependency.\n */\nexport function setUnionableQueryClass(cls: UnionableQueryConstructor): void {\n UnionableQueryClass = cls;\n}\n\n/**\n * A query that can be executed.\n */\nexport class ExecutableQuery<\n G extends GraphDef,\n Aliases extends AliasMap,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty edge alias map\n EdgeAliases extends EdgeAliasMap = {},\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty when no recursive aliases\n RecursiveAliases extends RecursiveAliasMap = {},\n R = unknown,\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n readonly #selectFn: (\n context: SelectContext<Aliases, EdgeAliases, RecursiveAliases>,\n ) => R;\n #cachedCompiled: SQL | typeof NOT_COMPUTED = NOT_COMPUTED;\n #cachedOptimizedCompiled: SQL | typeof NOT_COMPUTED = NOT_COMPUTED;\n #cachedSelectiveFieldsForExecute:\n | readonly SelectiveField[]\n | typeof NOT_COMPUTED\n | undefined = NOT_COMPUTED;\n #cachedSelectiveFieldsForPagination:\n | readonly SelectiveField[]\n | typeof NOT_COMPUTED\n | undefined = NOT_COMPUTED;\n\n constructor(\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n selectFunction: (\n context: SelectContext<Aliases, EdgeAliases, RecursiveAliases>,\n ) => R,\n ) {\n this.#config = config;\n this.#state = state;\n this.#selectFn = selectFunction;\n }\n\n /**\n * Builds the query AST.\n */\n toAst(): QueryAst {\n return buildQueryAst(this.#config, this.#state);\n }\n\n /**\n * Orders results.\n */\n orderBy<A extends keyof Aliases & string>(\n alias: A,\n field: string,\n direction: SortDirection = \"asc\",\n ): ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, R> {\n const kindNames =\n alias === this.#state.startAlias ?\n this.#state.startKinds\n : this.#state.traversals.find(\n (traversal) => traversal.nodeAlias === alias,\n )?.nodeKinds;\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(kindNames, field)\n : undefined;\n\n const orderSpec: OrderSpec = {\n field: fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([field]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n }),\n direction,\n };\n\n const newState: QueryBuilderState = {\n ...this.#state,\n orderBy: [...this.#state.orderBy, orderSpec],\n };\n\n return new ExecutableQuery(this.#config, newState, this.#selectFn);\n }\n\n /**\n * Limits the number of results.\n */\n limit(\n n: number,\n ): ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, R> {\n return new ExecutableQuery(\n this.#config,\n { ...this.#state, limit: n },\n this.#selectFn,\n );\n }\n\n /**\n * Offsets the results.\n */\n offset(\n n: number,\n ): ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, R> {\n return new ExecutableQuery(\n this.#config,\n { ...this.#state, offset: n },\n this.#selectFn,\n );\n }\n\n /**\n * Applies a query fragment to transform this executable query.\n *\n * Useful for applying post-select transformations like ordering,\n * limits, and offsets from reusable fragments.\n *\n * @example\n * ```typescript\n * const paginated = (q) => q.orderBy(\"u\", \"createdAt\", \"desc\").limit(10);\n *\n * const results = await query()\n * .from(\"User\", \"u\")\n * .select((ctx) => ctx.u)\n * .pipe(paginated)\n * .execute();\n * ```\n *\n * @param fragment - A function that transforms the executable query\n * @returns The transformed executable query\n */\n pipe<NewR = R>(\n fragment: (\n query: ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, R>,\n ) => ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, NewR>,\n ): ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, NewR> {\n return fragment(this);\n }\n\n /**\n * Combines this query with another using UNION (removes duplicates).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n union(other: ExecutableQuery<G, any, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"union\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Combines this query with another using UNION ALL (keeps duplicates).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n unionAll(other: ExecutableQuery<G, any, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"unionAll\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Combines this query with another using INTERSECT.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n intersect(other: ExecutableQuery<G, any, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"intersect\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Combines this query with another using EXCEPT.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n except(other: ExecutableQuery<G, any, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"except\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Compiles the query and returns the SQL text and parameters.\n *\n * Requires a backend to be configured (the backend determines the SQL dialect).\n * Use this for debugging, logging, or running the query with a custom executor.\n */\n toSQL(): Readonly<{ sql: string; params: readonly unknown[] }> {\n if (!this.#config.backend?.compileSql) {\n throw new Error(\n \"Cannot convert to SQL: no backend configured or backend does not support compileSql. \" +\n \"Use store.query() to get a backend-aware query builder.\",\n );\n }\n return this.#config.backend.compileSql(this.compile());\n }\n\n /**\n * Compiles the query to a Drizzle SQL object.\n *\n * Returns a Drizzle SQL object that can be executed directly\n * with db.all(), db.get(), etc.\n */\n compile(): SQL {\n if (this.#cachedCompiled !== NOT_COMPUTED) return this.#cachedCompiled;\n const ast = this.toAst();\n const compiled = compileQuery(\n ast,\n this.#config.graphId,\n this.#compileOptions(),\n );\n this.#cachedCompiled = compiled;\n return compiled;\n }\n\n /**\n * Creates a prepared (pre-compiled) query that can be executed\n * multiple times with different parameter bindings.\n *\n * Use `param(\"name\")` in predicates to create parameterized slots,\n * then pass values via `prepared.execute({ name: \"value\" })`.\n *\n * @example\n * ```typescript\n * import { param } from \"@nicia-ai/typegraph\";\n *\n * const prepared = store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(param(\"name\")))\n * .select((ctx) => ctx.p)\n * .prepare();\n *\n * const alice = await prepared.execute({ name: \"Alice\" });\n * const bob = await prepared.execute({ name: \"Bob\" });\n * ```\n *\n * @throws Error if no backend is configured\n */\n prepare(): PreparedQuery<R> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot prepare query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n // Build AST once\n const baseAst = buildQueryAst(this.#config, this.#state);\n\n // Attempt selective field optimization\n const selectiveFields = this.#getSelectiveFieldsForExecute();\n const ast =\n selectiveFields === undefined ? baseAst : { ...baseAst, selectiveFields };\n const unoptimizedAst = baseAst;\n\n // Compile once\n const compileOptions = this.#compileOptions();\n const compiled = compileQuery(ast, this.#config.graphId, compileOptions);\n\n // Pre-compile to SQL text if the backend supports it\n let sqlText: string | undefined;\n let sqlParams: readonly unknown[] | undefined;\n let unoptimizedSqlText: string | undefined;\n let unoptimizedSqlParams: readonly unknown[] | undefined;\n if (this.#config.backend.compileSql !== undefined) {\n const result = this.#config.backend.compileSql(compiled);\n sqlText = result.sql;\n sqlParams = result.params;\n\n const unoptimizedCompiled = compileQuery(\n unoptimizedAst,\n this.#config.graphId,\n compileOptions,\n );\n const unoptimizedResult =\n this.#config.backend.compileSql(unoptimizedCompiled);\n unoptimizedSqlText = unoptimizedResult.sql;\n unoptimizedSqlParams = unoptimizedResult.params;\n }\n\n return new PreparedQuery({\n ast,\n unoptimizedAst,\n sqlText,\n sqlParams,\n unoptimizedSqlText,\n unoptimizedSqlParams,\n backend: this.#config.backend,\n dialect: this.#config.dialect ?? \"sqlite\",\n graphId: this.#config.graphId,\n compileOptions: compileOptions,\n state: this.#state,\n selectiveFields,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure needed for PreparedQuery which uses AliasMap\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => R,\n schemaIntrospector: this.#config.schemaIntrospector,\n });\n }\n\n /**\n * Builds compile options from the config.\n */\n #compileOptions(): CompileQueryOptions {\n return {\n dialect: this.#config.dialect ?? \"sqlite\",\n schema: this.#config.schema,\n };\n }\n\n #requireBackend(): GraphBackend {\n const { backend } = this.#config;\n if (backend === undefined) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Provide a backend when creating the QueryBuilder.\",\n );\n }\n return backend;\n }\n\n /**\n * Executes the query and returns typed results.\n *\n * Uses smart optimization to detect when only specific fields are accessed\n * in the select callback. If the callback only accesses simple field\n * references (no method calls or computations), generates optimized SQL\n * that only extracts those fields instead of the full props blob.\n *\n * @throws Error if no backend is configured\n */\n async execute(): Promise<readonly R[]> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n // Guard: reject queries with param() refs — must use .prepare().execute({...})\n if (hasParameterReferences(this.toAst())) {\n throw new Error(\n \"Query contains param() references. Use .prepare().execute({...}) instead of .execute().\",\n );\n }\n\n // Phase 1: Try optimized execution\n const optimizedResult = await this.#tryOptimizedExecution();\n if (optimizedResult !== undefined) {\n return optimizedResult;\n }\n\n // Phase 2: Fall back to full fetch (existing behavior)\n const compiled = this.compile();\n const rawRows =\n await this.#config.backend.execute<Record<string, unknown>>(compiled);\n\n // Transform path columns for SQLite (converts \"|id1|id2|\" to [\"id1\", \"id2\"])\n const dialect = this.#config.dialect ?? \"sqlite\";\n const rows = transformPathColumns(rawRows, this.#state, dialect);\n\n // Cast: runtime context includes recursive aliases; type erasure in mapResults is safe\n return mapResults<Aliases, EdgeAliases, R, RecursiveAliases>(\n rows,\n this.#state.startAlias,\n this.#state.traversals,\n this.#selectFn,\n );\n }\n\n /**\n * Attempts optimized execution by tracking which fields the select callback accesses.\n *\n * Returns undefined if optimization is not possible (callback uses method calls,\n * computations, or returns whole nodes).\n */\n async #tryOptimizedExecution(): Promise<readonly R[] | undefined> {\n const selectiveFields = this.#getSelectiveFieldsForExecute();\n if (selectiveFields === undefined) {\n return undefined;\n }\n\n // Build and compile optimized query (cached per instance)\n let compiled: SQL;\n if (this.#cachedOptimizedCompiled === NOT_COMPUTED) {\n const baseAst = buildQueryAst(this.#config, this.#state);\n const selectiveAst = {\n ...baseAst,\n selectiveFields,\n };\n compiled = compileQuery(\n selectiveAst,\n this.#config.graphId,\n this.#compileOptions(),\n );\n this.#cachedOptimizedCompiled = compiled;\n } else {\n compiled = this.#cachedOptimizedCompiled;\n }\n\n const rawSelectiveRows =\n await this.#requireBackend().execute<Record<string, unknown>>(compiled);\n const dialect = this.#config.dialect ?? \"sqlite\";\n const rows = transformPathColumns(rawSelectiveRows, this.#state, dialect);\n\n try {\n // RecursiveAliases are populated at runtime but erased in mapSelectiveResults' signature\n return mapSelectiveResults<Aliases, EdgeAliases, R>(\n rows,\n this.#state,\n selectiveFields,\n this.#config.schemaIntrospector,\n this.#selectFn as (context: SelectContext<Aliases, EdgeAliases>) => R,\n );\n } catch (error) {\n if (error instanceof MissingSelectiveFieldError) {\n this.#cachedSelectiveFieldsForExecute = undefined;\n this.#cachedOptimizedCompiled = NOT_COMPUTED;\n return undefined;\n }\n if (error instanceof UnsupportedPredicateError) {\n this.#cachedSelectiveFieldsForExecute = undefined;\n this.#cachedOptimizedCompiled = NOT_COMPUTED;\n return undefined;\n }\n throw error;\n }\n }\n\n #trackSelectFunctionAccesses(tracker: FieldAccessTracker): void {\n const hasOptionalTraversal = this.#state.traversals.some(\n (traversal) => traversal.optional,\n );\n\n const trackingRuns =\n hasOptionalTraversal ?\n ([\n {\n mode: \"truthy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n {\n mode: \"falsy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n {\n mode: \"falsy\" as const,\n optionalTraversalAliases: \"absent\" as const,\n },\n ] as const)\n : ([\n {\n mode: \"truthy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n {\n mode: \"falsy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n ] as const);\n\n for (const run of trackingRuns) {\n const trackingContext = createTrackingContext(this.#state, tracker, {\n schemaIntrospector: this.#config.schemaIntrospector,\n mode: run.mode,\n optionalTraversalAliases: run.optionalTraversalAliases,\n });\n\n try {\n // Execute the select callback against a lightweight tracking context.\n // We intentionally ignore the return value: we only need accessed fields.\n void this.#selectFn(\n trackingContext as SelectContext<\n Aliases,\n EdgeAliases,\n RecursiveAliases\n >,\n );\n } catch {\n // Best-effort tracking: any runtime errors in the callback (e.g. calling\n // a method on an undefined optional field) should simply disable or\n // reduce optimization, never change correctness.\n }\n }\n }\n\n #getSelectiveFieldsForExecute(): readonly SelectiveField[] | undefined {\n if (this.#cachedSelectiveFieldsForExecute === undefined) {\n return undefined;\n }\n\n if (this.#cachedSelectiveFieldsForExecute !== NOT_COMPUTED) {\n return this.#cachedSelectiveFieldsForExecute;\n }\n\n const tracker = new FieldAccessTracker();\n this.#trackSelectFunctionAccesses(tracker);\n\n const accessed = tracker.getAccessedFields();\n if (accessed.length === 0) {\n this.#cachedSelectiveFieldsForExecute = undefined;\n return undefined;\n }\n\n const selectiveFields = this.#ensureOptionalTraversalIdsSelected(\n buildSelectiveFields(accessed, {\n state: this.#state,\n schemaIntrospector: this.#config.schemaIntrospector,\n }),\n );\n this.#cachedSelectiveFieldsForExecute = selectiveFields;\n return selectiveFields;\n }\n\n #getSelectiveFieldsForPagination(): readonly SelectiveField[] | undefined {\n if (this.#cachedSelectiveFieldsForPagination === undefined) {\n return undefined;\n }\n\n if (this.#cachedSelectiveFieldsForPagination !== NOT_COMPUTED) {\n return this.#cachedSelectiveFieldsForPagination;\n }\n\n const tracker = new FieldAccessTracker();\n this.#trackSelectFunctionAccesses(tracker);\n if (!this.#recordOrderByFieldsForPagination(tracker)) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n\n const selectiveFields = this.#ensureOptionalTraversalIdsSelected(\n buildSelectiveFields(tracker.getAccessedFields(), {\n state: this.#state,\n schemaIntrospector: this.#config.schemaIntrospector,\n }),\n );\n this.#cachedSelectiveFieldsForPagination = selectiveFields;\n return selectiveFields;\n }\n\n #ensureOptionalTraversalIdsSelected(\n selectiveFields: readonly SelectiveField[],\n ): readonly SelectiveField[] {\n const result = [...selectiveFields];\n const keys = new Set(\n result.map(\n (field) =>\n `${field.alias}\\u0000${field.field}\\u0000${String(field.isSystemField)}`,\n ),\n );\n\n function add(alias: string): void {\n const key = `${alias}\\u0000id\\u0000true`;\n if (keys.has(key)) return;\n keys.add(key);\n result.push({\n alias,\n field: \"id\",\n outputName: `${alias}_id`,\n isSystemField: true,\n });\n }\n\n for (const traversal of this.#state.traversals) {\n if (!traversal.optional) continue;\n add(traversal.nodeAlias);\n add(traversal.edgeAlias);\n }\n\n return result.toSorted((a, b) => {\n const aliasCompare = a.alias.localeCompare(b.alias);\n if (aliasCompare !== 0) return aliasCompare;\n return a.field.localeCompare(b.field);\n });\n }\n\n async #tryOptimizedPaginate(\n cursorData: CursorData | undefined,\n direction: \"forward\" | \"backward\",\n pageLimit: number,\n fetchLimit: number,\n cursor: string | undefined,\n isBackward: boolean,\n ): Promise<PaginatedResult<R> | undefined> {\n const selectiveFields = this.#getSelectiveFieldsForPagination();\n if (selectiveFields === undefined) {\n return undefined;\n }\n\n let rows: readonly Record<string, unknown>[];\n try {\n rows = await this.#executeWithCursor(cursorData, direction, fetchLimit, {\n selectiveFields,\n });\n } catch (error) {\n if (error instanceof UnsupportedPredicateError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n throw error;\n }\n\n const hasMore = rows.length > pageLimit;\n const resultRows = hasMore ? rows.slice(0, pageLimit) : rows;\n const paginationDialect = this.#config.dialect ?? \"sqlite\";\n const orderedRows = transformPathColumns(\n isBackward ? resultRows.toReversed() : resultRows,\n this.#state,\n paginationDialect,\n );\n\n let data: readonly R[];\n try {\n // RecursiveAliases are populated at runtime but erased in mapSelectiveResults' signature\n data = mapSelectiveResults<Aliases, EdgeAliases, R>(\n orderedRows,\n this.#state,\n selectiveFields,\n this.#config.schemaIntrospector,\n this.#selectFn as (context: SelectContext<Aliases, EdgeAliases>) => R,\n );\n } catch (error) {\n if (error instanceof MissingSelectiveFieldError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n if (error instanceof UnsupportedPredicateError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n throw error;\n }\n\n let nextCursor: string | undefined;\n let previousCursor: string | undefined;\n\n if (orderedRows.length > 0) {\n try {\n previousCursor = this.#buildCursorFromSelectiveRow(\n orderedRows[0]!,\n selectiveFields,\n \"b\",\n );\n nextCursor = this.#buildCursorFromSelectiveRow(\n orderedRows.at(-1)!,\n selectiveFields,\n \"f\",\n );\n } catch (error) {\n if (error instanceof MissingSelectiveFieldError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n if (error instanceof UnsupportedPredicateError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n throw error;\n }\n }\n\n return {\n data,\n nextCursor: hasMore || isBackward ? nextCursor : undefined,\n prevCursor:\n cursor !== undefined || (isBackward && hasMore) ?\n previousCursor\n : undefined,\n hasNextPage: isBackward ? cursor !== undefined : hasMore,\n hasPrevPage: isBackward ? hasMore : cursor !== undefined,\n };\n }\n\n #recordOrderByFieldsForPagination(tracker: FieldAccessTracker): boolean {\n for (const spec of this.#state.orderBy) {\n const field = spec.field;\n if (field.path.length !== 1 || field.path[0] !== \"props\") {\n return false;\n }\n\n if (field.jsonPointer === undefined) {\n return false;\n }\n\n const segments = parseJsonPointer(field.jsonPointer);\n if (segments.length !== 1) {\n return false;\n }\n\n tracker.record(field.alias, segments[0]!, false);\n }\n\n return true;\n }\n\n #buildCursorFromSelectiveRow(\n row: Record<string, unknown>,\n selectiveFields: readonly SelectiveField[],\n direction: \"f\" | \"b\",\n ): string {\n const contextRow = this.#buildCursorContextFromSelectiveRow(\n row,\n selectiveFields,\n );\n return buildCursorFromRow(contextRow, this.#state.orderBy, direction);\n }\n\n #buildCursorContextFromSelectiveRow(\n row: Record<string, unknown>,\n selectiveFields: readonly SelectiveField[],\n ): Record<string, unknown> {\n const outputNameByAliasField = new Map<string, string>();\n for (const field of selectiveFields) {\n outputNameByAliasField.set(\n `${field.alias}\\u0000${field.field}`,\n field.outputName,\n );\n }\n\n const optionalNodeAliases = new Set<string>();\n for (const traversal of this.#state.traversals) {\n if (traversal.optional) {\n optionalNodeAliases.add(traversal.nodeAlias);\n }\n }\n\n const cursorContext: Record<string, unknown> = {};\n\n for (const spec of this.#state.orderBy) {\n const alias = spec.field.alias;\n const jsonPointer = spec.field.jsonPointer;\n if (jsonPointer === undefined) {\n throw new MissingSelectiveFieldError(alias, \"orderBy\");\n }\n\n const segments = parseJsonPointer(jsonPointer);\n if (segments.length === 0) {\n throw new MissingSelectiveFieldError(alias, \"orderBy\");\n }\n\n const topField = segments[0]!;\n const outputName = outputNameByAliasField.get(\n `${alias}\\u0000${topField}`,\n );\n if (outputName === undefined) {\n throw new MissingSelectiveFieldError(alias, topField);\n }\n\n if (optionalNodeAliases.has(alias)) {\n const idOutputName = outputNameByAliasField.get(`${alias}\\u0000id`);\n if (idOutputName === undefined) {\n throw new MissingSelectiveFieldError(alias, \"id\");\n }\n const idValue = row[idOutputName];\n if (idValue === null || idValue === undefined) {\n continue;\n }\n }\n\n let aliasObject: Record<string, unknown>;\n const existing = cursorContext[alias];\n if (typeof existing === \"object\" && existing !== null) {\n aliasObject = existing as Record<string, unknown>;\n } else {\n aliasObject = {};\n cursorContext[alias] = aliasObject;\n }\n\n const kindNames = this.#getNodeKindNamesForAlias(alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n topField,\n )\n : undefined;\n\n const decoded = decodeSelectedValue(row[outputName], typeInfo);\n\n if (segments.length === 1) {\n aliasObject[topField] = decoded;\n continue;\n }\n\n let current = aliasObject;\n for (let index = 0; index < segments.length - 1; index++) {\n const segment = segments[index]!;\n const existing_ = current[segment];\n if (typeof existing_ === \"object\" && existing_ !== null) {\n current = existing_ as Record<string, unknown>;\n } else {\n const created: Record<string, unknown> = {};\n current[segment] = created;\n current = created;\n }\n }\n current[segments.at(-1)!] = decoded;\n }\n\n return cursorContext;\n }\n\n #getNodeKindNamesForAlias(alias: string): readonly string[] | undefined {\n if (alias === this.#state.startAlias) {\n return this.#state.startKinds;\n }\n return this.#state.traversals.find((t) => t.nodeAlias === alias)?.nodeKinds;\n }\n\n /**\n * Executes a paginated query using cursor-based keyset pagination.\n *\n * Cursor pagination is efficient for large datasets as it avoids OFFSET.\n * Requires ORDER BY to be specified for deterministic results.\n *\n * @param options - Pagination options (first/after for forward, last/before for backward)\n * @throws ValidationError if ORDER BY is not specified\n * @throws ValidationError if cursor columns don't match query ORDER BY columns\n */\n async paginate(options: PaginateOptions): Promise<PaginatedResult<R>> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n // Validate ORDER BY is present\n if (this.#state.orderBy.length === 0) {\n throw new ValidationError(\n \"Cursor pagination requires ORDER BY. Add .orderBy() before .paginate()\",\n {\n issues: [\n {\n path: \"orderBy\",\n message: \"ORDER BY is required for cursor pagination\",\n },\n ],\n },\n {\n suggestion: `Add .orderBy(alias, field) before .paginate() to specify sort order.`,\n },\n );\n }\n\n // Determine pagination direction and parameters\n const isBackward =\n options.last !== undefined || options.before !== undefined;\n const limit = options.first ?? options.last ?? 20;\n const cursor = options.after ?? options.before;\n\n // Decode and validate cursor if provided\n let cursorData: CursorData | undefined;\n if (cursor) {\n cursorData = decodeCursor(cursor);\n validateCursorColumns(cursorData, this.#state.orderBy);\n }\n\n // Fetch limit + 1 to detect if there are more pages\n const fetchLimit = limit + 1;\n\n const direction = isBackward ? \"backward\" : \"forward\";\n const optimized = await this.#tryOptimizedPaginate(\n cursorData,\n direction,\n limit,\n fetchLimit,\n cursor,\n isBackward,\n );\n if (optimized !== undefined) {\n return optimized;\n }\n\n // Build and execute query with cursor condition\n const rows = await this.#executeWithCursor(\n cursorData,\n direction,\n fetchLimit,\n );\n\n // Detect if there are more items\n const hasMore = rows.length > limit;\n const resultRows = hasMore ? rows.slice(0, limit) : rows;\n\n // For backward pagination, reverse the results to maintain natural order\n const orderedRows = isBackward ? resultRows.toReversed() : resultRows;\n\n // Map to typed results\n const data = mapResults<Aliases, EdgeAliases, R, RecursiveAliases>(\n orderedRows,\n this.#state.startAlias,\n this.#state.traversals,\n this.#selectFn,\n );\n\n // Build paginated result with cursors\n return buildPaginatedResult(\n data,\n orderedRows,\n this.#state.orderBy,\n limit,\n hasMore,\n isBackward,\n cursor,\n (row) =>\n buildSelectContext<Aliases, EdgeAliases, RecursiveAliases>(\n row,\n this.#state.startAlias,\n this.#state.traversals,\n ),\n );\n }\n\n /**\n * Returns an async iterator that streams results in batches.\n *\n * Uses cursor pagination internally for efficient memory usage.\n * Requires ORDER BY to be specified for deterministic results.\n *\n * @param options - Stream options (batchSize defaults to 1000)\n * @throws ValidationError if ORDER BY is not specified\n */\n stream(options?: StreamOptions): AsyncIterable<R> {\n // Validate ORDER BY is present\n if (this.#state.orderBy.length === 0) {\n throw new ValidationError(\n \"Streaming requires ORDER BY. Add .orderBy() before .stream()\",\n {\n issues: [\n { path: \"orderBy\", message: \"ORDER BY is required for streaming\" },\n ],\n },\n {\n suggestion: `Add .orderBy(alias, field) before .stream() to specify sort order.`,\n },\n );\n }\n\n const batchSize = getStreamBatchSize(options);\n return createStreamIterable(batchSize, (paginateOptions) =>\n this.paginate(paginateOptions),\n );\n }\n\n /**\n * Executes a query with cursor conditions applied.\n */\n async #executeWithCursor(\n cursorData: CursorData | undefined,\n direction: \"forward\" | \"backward\",\n limit: number,\n options?: Readonly<{ selectiveFields?: readonly SelectiveField[] }>,\n ): Promise<readonly Record<string, unknown>[]> {\n const ast = this.toAst();\n\n // Adjust ORDER BY for backward pagination (reverse all directions)\n let orderBy = this.#state.orderBy;\n if (direction === \"backward\") {\n orderBy = orderBy.map((spec) => ({\n ...spec,\n direction:\n spec.direction === \"asc\" ? (\"desc\" as const) : (\"asc\" as const),\n }));\n }\n\n // Build cursor predicates if we have cursor data\n let predicates = [...this.#state.predicates];\n if (cursorData) {\n const cursorPredicate = buildCursorPredicate(\n cursorData,\n this.#state.orderBy,\n direction,\n this.#state.startAlias,\n );\n predicates = [...predicates, cursorPredicate];\n }\n\n // Apply modified ORDER BY, predicates, and limit to AST (discard offset)\n const { offset: _discarded, ...astWithoutOffset } = ast;\n const modifiedAst = {\n ...astWithoutOffset,\n predicates,\n orderBy,\n limit,\n ...(options?.selectiveFields !== undefined && {\n selectiveFields: options.selectiveFields,\n }),\n };\n\n // Compile and execute\n const compiled = compileQuery(\n modifiedAst,\n this.#config.graphId,\n this.#compileOptions(),\n );\n const rawRows =\n await this.#requireBackend().execute<Record<string, unknown>>(compiled);\n const dialect = this.#config.dialect ?? \"sqlite\";\n return transformPathColumns(rawRows, this.#state, dialect);\n }\n}\n","/**\n * ExecutableAggregateQuery - A query with aggregate functions that can be executed.\n */\nimport { type SQL } from \"drizzle-orm\";\n\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type AggregateExpr, type FieldRef, type QueryAst } from \"../ast\";\nimport { compileQuery, type CompileQueryOptions } from \"../compiler/index\";\nimport { buildQueryAst } from \"./ast-builder\";\nimport {\n type AliasMap,\n type QueryBuilderConfig,\n type QueryBuilderState,\n} from \"./types\";\n\nconst NOT_COMPUTED = Symbol(\"NOT_COMPUTED\");\n\n/**\n * Result type for aggregate queries.\n * Maps field refs to their value types and aggregates to numbers.\n */\nexport type AggregateResult<\n R extends Record<string, FieldRef | AggregateExpr>,\n> = {\n [K in keyof R]: R[K] extends AggregateExpr ? number\n : R[K] extends FieldRef ? unknown\n : never;\n};\n\n/**\n * An aggregate query that can be executed.\n */\nexport class ExecutableAggregateQuery<\n G extends GraphDef,\n Aliases extends AliasMap,\n R extends Record<string, FieldRef | AggregateExpr>,\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n readonly #fields: R;\n #cachedCompiled: SQL | typeof NOT_COMPUTED = NOT_COMPUTED;\n\n constructor(config: QueryBuilderConfig, state: QueryBuilderState, fields: R) {\n this.#config = config;\n this.#state = state;\n this.#fields = fields;\n }\n\n /**\n * Builds the query AST.\n */\n toAst(): QueryAst {\n return buildQueryAst(this.#config, this.#state);\n }\n\n /**\n * Limits the number of results.\n */\n limit(n: number): ExecutableAggregateQuery<G, Aliases, R> {\n return new ExecutableAggregateQuery(\n this.#config,\n { ...this.#state, limit: n },\n this.#fields,\n );\n }\n\n /**\n * Offsets the results.\n */\n offset(n: number): ExecutableAggregateQuery<G, Aliases, R> {\n return new ExecutableAggregateQuery(\n this.#config,\n { ...this.#state, offset: n },\n this.#fields,\n );\n }\n\n /**\n * Compiles the query and returns the SQL text and parameters.\n *\n * Requires a backend to be configured (the backend determines the SQL dialect).\n * Use this for debugging, logging, or running the query with a custom executor.\n */\n toSQL(): Readonly<{ sql: string; params: readonly unknown[] }> {\n if (!this.#config.backend?.compileSql) {\n throw new Error(\n \"Cannot convert to SQL: no backend configured or backend does not support compileSql. \" +\n \"Use store.query() to get a backend-aware query builder.\",\n );\n }\n return this.#config.backend.compileSql(this.compile());\n }\n\n /**\n * Compiles the query to a Drizzle SQL object.\n */\n compile(): SQL {\n if (this.#cachedCompiled !== NOT_COMPUTED) {\n return this.#cachedCompiled;\n }\n const ast = this.toAst();\n const compiled = compileQuery(\n ast,\n this.#config.graphId,\n this.#compileOptions(),\n );\n this.#cachedCompiled = compiled;\n return compiled;\n }\n\n /**\n * Builds compile options from the config.\n */\n #compileOptions(): CompileQueryOptions {\n return {\n dialect: this.#config.dialect ?? \"sqlite\",\n schema: this.#config.schema,\n };\n }\n\n /**\n * Executes the query and returns typed results.\n *\n * @throws Error if no backend is configured\n */\n async execute(): Promise<readonly AggregateResult<R>[]> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n const compiled = this.compile();\n const rows =\n await this.#config.backend.execute<Record<string, unknown>>(compiled);\n\n return this.#mapResults(rows);\n }\n\n /**\n * Maps raw database rows to typed results.\n * Handles database-specific value conversions:\n * - PostgreSQL returns bigint/numeric as strings → convert to numbers\n * - SQLite returns JSON booleans as 0/1 numbers → convert to booleans\n * - PostgreSQL returns JSON booleans as \"true\"/\"false\" strings → convert to booleans\n */\n #mapResults(\n rows: readonly Record<string, unknown>[],\n ): readonly AggregateResult<R>[] {\n return rows.map((row) => {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(this.#fields)) {\n const field = this.#fields[key];\n if (!field) continue;\n const value = row[key];\n\n if (field.__type === \"aggregate\") {\n // PostgreSQL returns aggregate bigint/numeric as strings.\n result[key] = typeof value === \"string\" ? Number(value) : value;\n continue;\n }\n\n result[key] = normalizeFieldValue(field, value);\n }\n return result as AggregateResult<R>;\n });\n }\n}\n\n/**\n * Converts database-specific boolean encodings to JS booleans.\n *\n * - SQLite json_extract() returns 0/1 for JSON booleans\n * - PostgreSQL #>> returns \"true\"/\"false\" for JSON booleans\n */\nfunction normalizeBooleanValue(value: unknown): unknown {\n if (value === null) return undefined;\n if (value === true || value === false) return value;\n if (value === 1) return true;\n if (value === 0) return false;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value === \"1\") return true;\n if (value === \"0\") return false;\n return value;\n}\n\nfunction normalizeFieldValue(field: FieldRef, value: unknown): unknown {\n if (field.valueType === \"boolean\") {\n return normalizeBooleanValue(value);\n }\n\n return value === null ? undefined : value;\n}\n","/**\n * TraversalBuilder - Intermediate builder for edge traversals.\n */\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type AnyEdgeType, type NodeType } from \"../../core/types\";\nimport {\n type NodePredicate,\n type RecursiveCyclePolicy,\n type Traversal,\n type TraversalDirection,\n} from \"../ast\";\nimport { MAX_EXPLICIT_RECURSIVE_DEPTH } from \"../compiler\";\nimport { jsonPointer } from \"../json-pointer\";\nimport {\n arrayField,\n baseField,\n dateField,\n fieldRef,\n numberField,\n objectField,\n type Predicate,\n stringField,\n} from \"../predicates\";\n// Type-only import to get the QueryBuilder type without runtime circular dependency\nimport { type QueryBuilder } from \"./query-builder\";\nimport {\n type AliasMap,\n type BaseFieldAccessor,\n type BuildRecursiveAliases,\n type EdgeAccessor,\n type EdgeAlias,\n type EdgeAliasMap,\n type NodeAlias,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type RecursiveAliasMap,\n type RecursiveTraversalOptions,\n type UniqueAlias,\n type ValidEdgeTargets,\n} from \"./types\";\nimport { validateSqlIdentifier } from \"./validation\";\n\n// Forward declaration - actual import would cause circular dependency\ntype QueryBuilderConstructor = new (\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n) => unknown;\n\n// This will be set by the main builder module to avoid circular imports\nlet QueryBuilderClass: QueryBuilderConstructor;\n\n/**\n * Sets the QueryBuilder class reference for use by TraversalBuilder.\n * Called during module initialization to break circular dependency.\n */\nexport function setQueryBuilderClass(cls: QueryBuilderConstructor): void {\n QueryBuilderClass = cls;\n}\n\n/**\n * State for variable-length traversal configuration.\n */\ninterface VariableLengthState {\n enabled: boolean;\n minDepth: number;\n maxDepth: number;\n cyclePolicy: RecursiveCyclePolicy;\n pathEnabled: boolean;\n pathAlias?: string;\n depthEnabled: boolean;\n depthAlias?: string;\n}\n\n/**\n * Default variable-length state (disabled).\n */\nconst DEFAULT_VARIABLE_LENGTH_STATE: VariableLengthState = {\n enabled: false,\n minDepth: 1,\n maxDepth: -1,\n cyclePolicy: \"prevent\",\n pathEnabled: false,\n depthEnabled: false,\n};\n\nfunction validateMaxHops(max: number): void {\n if (!Number.isFinite(max) || !Number.isInteger(max)) {\n throw new TypeError(\"maxHops must be a finite integer\");\n }\n if (max < 1) {\n throw new Error(\"maxHops must be >= 1\");\n }\n if (max > MAX_EXPLICIT_RECURSIVE_DEPTH) {\n throw new Error(\n `maxHops must be <= ${MAX_EXPLICIT_RECURSIVE_DEPTH}. ` +\n `Use a smaller bound to prevent runaway recursive queries.`,\n );\n }\n}\n\nfunction validateMinHops(min: number): void {\n if (!Number.isFinite(min) || !Number.isInteger(min)) {\n throw new TypeError(\"minHops must be a finite integer\");\n }\n if (min < 0) {\n throw new Error(\"minHops must be >= 0\");\n }\n}\n\nfunction resolveAliasOption(\n option: boolean | string | undefined,\n): string | undefined {\n if (option === undefined || option === false) {\n return;\n }\n\n if (option === true) {\n return;\n }\n\n return option;\n}\n\n/**\n * Intermediate builder for traversal operations.\n *\n * Type parameters track the edge kind and direction to constrain\n * which node kinds are valid targets in the `to()` method.\n */\nexport class TraversalBuilder<\n G extends GraphDef,\n Aliases extends AliasMap,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty edge alias map\n EdgeAliases extends EdgeAliasMap = {},\n EK extends keyof G[\"edges\"] & string = keyof G[\"edges\"] & string,\n EA extends string = string,\n Dir extends TraversalDirection = \"out\",\n Optional extends boolean = false,\n DC extends boolean | string = false,\n PC extends boolean | string = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty when no recursive aliases accumulated\n RecAliases extends RecursiveAliasMap = {},\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n readonly #edgeKinds: readonly string[];\n readonly #inverseEdgeKinds: readonly string[];\n readonly #edgeAlias: EA;\n readonly #direction: Dir;\n readonly #fromAlias: string;\n readonly #optional: Optional;\n readonly #variableLength: VariableLengthState;\n readonly #pendingEdgePredicates: readonly NodePredicate[];\n\n constructor(\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n edgeKinds: readonly string[],\n edgeAlias: EA,\n direction: Dir,\n fromAlias: string,\n inverseEdgeKinds: readonly string[] = [],\n optional: Optional = false as Optional,\n variableLength: VariableLengthState = DEFAULT_VARIABLE_LENGTH_STATE,\n pendingEdgePredicates: readonly NodePredicate[] = [],\n ) {\n this.#config = config;\n this.#state = state;\n this.#edgeKinds = edgeKinds;\n this.#inverseEdgeKinds = inverseEdgeKinds;\n this.#edgeAlias = edgeAlias;\n this.#direction = direction;\n this.#fromAlias = fromAlias;\n this.#optional = optional;\n this.#variableLength = variableLength;\n this.#pendingEdgePredicates = pendingEdgePredicates;\n }\n\n /**\n * Enables variable-length (recursive) traversal.\n * By default, traverses unlimited depth with cycle prevention.\n */\n recursive<const O extends RecursiveTraversalOptions = Record<string, never>>(\n options?: O,\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n Dir,\n Optional,\n O extends { depth: infer D extends boolean | string } ? D : DC,\n O extends { path: infer P extends boolean | string } ? P : PC,\n RecAliases\n > {\n const minDepth = options?.minHops ?? this.#variableLength.minDepth;\n const maxDepth = options?.maxHops ?? this.#variableLength.maxDepth;\n validateMinHops(minDepth);\n if (options?.maxHops !== undefined) {\n validateMaxHops(maxDepth);\n }\n if (maxDepth > 0 && minDepth > maxDepth) {\n throw new Error(\"minHops must be <= maxHops\");\n }\n\n const pathAlias = resolveAliasOption(options?.path);\n const depthAlias = resolveAliasOption(options?.depth);\n if (pathAlias !== undefined) validateSqlIdentifier(pathAlias);\n if (depthAlias !== undefined) validateSqlIdentifier(depthAlias);\n const cyclePolicy =\n options?.cyclePolicy ?? this.#variableLength.cyclePolicy;\n\n return new TraversalBuilder(\n this.#config,\n this.#state,\n this.#edgeKinds,\n this.#edgeAlias,\n this.#direction,\n this.#fromAlias,\n this.#inverseEdgeKinds,\n this.#optional,\n {\n ...this.#variableLength,\n enabled: true,\n minDepth,\n maxDepth,\n cyclePolicy,\n ...(options?.path !== undefined && {\n pathEnabled: options.path !== false,\n ...(pathAlias !== undefined && { pathAlias }),\n }),\n ...(options?.depth !== undefined && {\n depthEnabled: options.depth !== false,\n ...(depthAlias !== undefined && { depthAlias }),\n }),\n },\n this.#pendingEdgePredicates,\n );\n }\n\n /**\n * Adds a WHERE clause for the edge being traversed.\n *\n * @param alias - The edge alias to filter on (must be the current edge alias)\n * @param predicateFunction - A function that builds predicates using the edge accessor\n */\n whereEdge(\n alias: EA,\n predicateFunction: (\n edge: EdgeAccessor<G[\"edges\"][EK][\"type\"]>,\n ) => Predicate,\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n Dir,\n Optional,\n DC,\n PC,\n RecAliases\n > {\n const accessor = this.#createEdgeAccessor(alias);\n const predicate = predicateFunction(\n accessor as EdgeAccessor<G[\"edges\"][EK][\"type\"]>,\n );\n\n const newPredicate: NodePredicate = {\n targetAlias: alias,\n targetType: \"edge\",\n expression: predicate.__expr,\n };\n\n return new TraversalBuilder(\n this.#config,\n this.#state,\n this.#edgeKinds,\n this.#edgeAlias,\n this.#direction,\n this.#fromAlias,\n this.#inverseEdgeKinds,\n this.#optional,\n this.#variableLength,\n [...this.#pendingEdgePredicates, newPredicate],\n );\n }\n\n /**\n * Creates a type-safe accessor for edge properties.\n */\n #createEdgeAccessor(alias: string): EdgeAccessor<AnyEdgeType> {\n const allEdgeKinds = [\n ...this.#edgeKinds,\n ...this.#inverseEdgeKinds.filter(\n (kind) => !this.#edgeKinds.includes(kind),\n ),\n ];\n\n // Pre-compute system field accessors\n const idAccessor = stringField(\n fieldRef(alias, [\"id\"], { valueType: \"string\" }),\n );\n const kindAccessor = stringField(\n fieldRef(alias, [\"kind\"], { valueType: \"string\" }),\n );\n const fromIdAccessor = stringField(\n fieldRef(alias, [\"from_id\"], { valueType: \"string\" }),\n );\n const toIdAccessor = stringField(\n fieldRef(alias, [\"to_id\"], { valueType: \"string\" }),\n );\n\n // Build field accessor for a schema property\n const buildFieldAccessor = (propertyName: string): BaseFieldAccessor => {\n const typeInfo =\n this.#config.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n allEdgeKinds,\n propertyName,\n );\n\n const valueType = typeInfo?.valueType;\n const elementType = typeInfo?.elementType;\n\n const ref = fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([propertyName]),\n valueType,\n elementType,\n });\n\n switch (valueType) {\n case \"string\": {\n return stringField(ref);\n }\n case \"number\": {\n return numberField(ref);\n }\n case \"boolean\": {\n return baseField(ref);\n }\n case \"date\": {\n return dateField(ref);\n }\n case \"array\": {\n return arrayField(ref);\n }\n case \"object\": {\n return objectField(ref);\n }\n case \"embedding\":\n case \"unknown\":\n case undefined: {\n // Embedding, unknown, or unresolved type - return base field\n return baseField(ref);\n }\n }\n };\n\n // Use a Proxy to provide flattened property access\n return new Proxy({} as EdgeAccessor<AnyEdgeType>, {\n get: (_, property: string | symbol) => {\n // Handle symbols and special properties to avoid infinite loops\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n // System fields\n if (property === \"id\") return idAccessor;\n if (property === \"kind\") return kindAccessor;\n if (property === \"fromId\") return fromIdAccessor;\n if (property === \"toId\") return toIdAccessor;\n\n // Schema properties\n return buildFieldAccessor(property);\n },\n });\n }\n\n /**\n * Specifies the target node kind.\n *\n * The kind must be a valid target for this edge based on the traversal direction:\n * - \"out\" direction: kind must be in the edge's \"to\" array\n * - \"in\" direction: kind must be in the edge's \"from\" array\n *\n * @param kind - The target node kind\n * @param alias - A unique alias for this node (compile-time error if duplicate)\n */\n to<K extends ValidEdgeTargets<G, EK, Dir>, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: false },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<G[\"nodes\"][K][\"type\"], Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>,\n RecAliases & BuildRecursiveAliases<DC, PC, A>\n >;\n\n to<K extends ValidEdgeTargets<G, EK, Dir>, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options: { includeSubClasses: true },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<NodeType, Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>,\n RecAliases & BuildRecursiveAliases<DC, PC, A>\n >;\n\n to<K extends ValidEdgeTargets<G, EK, Dir>, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: boolean },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<NodeType, Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>,\n RecAliases & BuildRecursiveAliases<DC, PC, A>\n > {\n // Validate node alias to prevent SQL injection\n validateSqlIdentifier(alias);\n\n const includeSubClasses = options?.includeSubClasses ?? false;\n const kinds =\n includeSubClasses ? this.#config.registry.expandSubClasses(kind) : [kind];\n\n // Build base traversal\n const traversalBase: Traversal = {\n edgeAlias: this.#edgeAlias,\n edgeKinds: this.#edgeKinds,\n direction: this.#direction,\n nodeAlias: alias,\n nodeKinds: kinds,\n joinFromAlias: this.#fromAlias,\n joinEdgeField: this.#direction === \"out\" ? \"from_id\" : \"to_id\",\n optional: this.#optional,\n };\n\n const baseTraversal: Traversal =\n this.#inverseEdgeKinds.length > 0 ?\n { ...traversalBase, inverseEdgeKinds: this.#inverseEdgeKinds }\n : traversalBase;\n\n // Add variable-length spec if enabled\n const traversal: Traversal =\n this.#variableLength.enabled ?\n {\n ...baseTraversal,\n variableLength: {\n minDepth: this.#variableLength.minDepth,\n maxDepth: this.#variableLength.maxDepth,\n cyclePolicy: this.#variableLength.cyclePolicy,\n ...(this.#variableLength.pathEnabled && {\n pathAlias: this.#variableLength.pathAlias ?? `${alias}_path`,\n }),\n ...(this.#variableLength.depthEnabled && {\n depthAlias: this.#variableLength.depthAlias ?? `${alias}_depth`,\n }),\n },\n }\n : baseTraversal;\n\n const newState: QueryBuilderState = {\n ...this.#state,\n traversals: [...this.#state.traversals, traversal],\n predicates: [...this.#state.predicates, ...this.#pendingEdgePredicates],\n currentAlias: alias, // Update current alias to this traversal's target\n };\n\n // Cast is safe because the overloads provide compile-time type safety\n // The runtime QueryBuilderClass is the correct implementation\n return new QueryBuilderClass(this.#config, newState) as QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<NodeType, Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>,\n RecAliases & BuildRecursiveAliases<DC, PC, A>\n >;\n }\n}\n","/**\n * QueryBuilder - The fluent query builder.\n */\nimport { type GraphDef } from \"../../core/define-graph\";\nimport {\n type EdgeType,\n type NodeType,\n type TemporalMode,\n} from \"../../core/types\";\nimport { ValidationError } from \"../../errors\";\nimport {\n type AggregateExpr,\n type FieldRef,\n type GroupBySpec,\n mergeEdgeKinds,\n type OrderSpec,\n type PredicateExpression,\n type ProjectedField,\n type SortDirection,\n type TraversalDirection,\n type TraversalExpansion,\n} from \"../ast\";\nimport { jsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport {\n arrayField,\n baseField,\n dateField,\n embeddingField,\n fieldRef,\n numberField,\n objectField,\n type Predicate,\n stringField,\n} from \"../predicates\";\nimport { type FieldTypeInfo } from \"../schema-introspector\";\nimport { ExecutableAggregateQuery } from \"./executable-aggregate-query\";\nimport { ExecutableQuery } from \"./executable-query\";\nimport { TraversalBuilder } from \"./traversal-builder\";\nimport {\n type AliasMap,\n type BaseFieldAccessor,\n type EdgeAccessor,\n type EdgeAliasMap,\n type NodeAccessor,\n type NodeAlias,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type RecursiveAliasMap,\n type SelectContext,\n type UniqueAlias,\n} from \"./types\";\nimport { validateSqlIdentifier } from \"./validation\";\n\n/**\n * Builds projected fields for a node alias (including all metadata columns).\n */\nfunction buildNodeFields(alias: string): ProjectedField[] {\n return [\n {\n outputName: `${alias}_id`,\n source: fieldRef(alias, [\"id\"]),\n },\n {\n outputName: `${alias}_kind`,\n source: fieldRef(alias, [\"kind\"]),\n },\n {\n outputName: `${alias}_props`,\n source: fieldRef(alias, [\"props\"]),\n },\n {\n outputName: `${alias}_version`,\n source: fieldRef(alias, [\"version\"]),\n },\n {\n outputName: `${alias}_valid_from`,\n source: fieldRef(alias, [\"valid_from\"]),\n },\n {\n outputName: `${alias}_valid_to`,\n source: fieldRef(alias, [\"valid_to\"]),\n },\n {\n outputName: `${alias}_created_at`,\n source: fieldRef(alias, [\"created_at\"]),\n },\n {\n outputName: `${alias}_updated_at`,\n source: fieldRef(alias, [\"updated_at\"]),\n },\n {\n outputName: `${alias}_deleted_at`,\n source: fieldRef(alias, [\"deleted_at\"]),\n },\n ];\n}\n\n/**\n * Builds projected fields for an edge alias (including all metadata columns).\n *\n * Edge columns are stored in the traversal's node CTE (e.g., cte_c contains e_id, e_kind, etc.).\n * The nodeCteAlias parameter specifies which CTE contains these columns.\n */\nfunction buildEdgeFields(\n edgeAlias: string,\n nodeCteAlias: string,\n): ProjectedField[] {\n const cteAlias = `cte_${nodeCteAlias}`;\n return [\n {\n outputName: `${edgeAlias}_id`,\n source: fieldRef(edgeAlias, [\"id\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_kind`,\n source: fieldRef(edgeAlias, [\"kind\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_from_id`,\n source: fieldRef(edgeAlias, [\"from_id\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_to_id`,\n source: fieldRef(edgeAlias, [\"to_id\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_props`,\n source: fieldRef(edgeAlias, [\"props\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_valid_from`,\n source: fieldRef(edgeAlias, [\"valid_from\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_valid_to`,\n source: fieldRef(edgeAlias, [\"valid_to\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_created_at`,\n source: fieldRef(edgeAlias, [\"created_at\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_updated_at`,\n source: fieldRef(edgeAlias, [\"updated_at\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_deleted_at`,\n source: fieldRef(edgeAlias, [\"deleted_at\"]),\n cteAlias,\n },\n ];\n}\n\n/**\n * The fluent query builder.\n *\n * Type parameters accumulate as methods are chained:\n * - G: The graph definition\n * - Aliases: Map of alias names to their node kinds\n * - EdgeAliases: Map of alias names to their edge kinds (accumulated during traversals)\n */\nexport class QueryBuilder<\n G extends GraphDef,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty alias map\n Aliases extends AliasMap = {},\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty edge alias map\n EdgeAliases extends EdgeAliasMap = {},\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty when no recursive aliases\n RecursiveAliases extends RecursiveAliasMap = {},\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n\n constructor(config: QueryBuilderConfig, state: QueryBuilderState) {\n this.#config = config;\n this.#state = state;\n }\n\n /**\n * Starts a query from a node kind.\n *\n * @param kind - The node kind to start from\n * @param alias - A unique alias for this node (compile-time error if duplicate)\n */\n from<K extends keyof G[\"nodes\"] & string, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: false },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<G[\"nodes\"][K][\"type\"]>>,\n EdgeAliases,\n RecursiveAliases\n >;\n\n from<K extends keyof G[\"nodes\"] & string, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options: { includeSubClasses: true },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias>,\n EdgeAliases,\n RecursiveAliases\n >;\n\n from<K extends keyof G[\"nodes\"] & string, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: boolean },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias>,\n EdgeAliases,\n RecursiveAliases\n > {\n // Validate alias to prevent SQL injection\n validateSqlIdentifier(alias);\n\n const includeSubClasses = options?.includeSubClasses ?? false;\n\n // Expand kinds if including subclasses\n const kinds =\n includeSubClasses ? this.#config.registry.expandSubClasses(kind) : [kind];\n\n const newState: QueryBuilderState = {\n ...this.#state,\n startAlias: alias,\n currentAlias: alias,\n startKinds: kinds,\n includeSubClasses,\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Adds a WHERE clause for a node.\n */\n whereNode<A extends keyof Aliases & string>(\n alias: A,\n predicateFunction: (n: NodeAccessor<Aliases[A][\"type\"]>) => Predicate,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n const accessor = this.#createNodeAccessor(alias);\n const predicate = predicateFunction(\n accessor as NodeAccessor<Aliases[A][\"type\"]>,\n );\n\n const newState: QueryBuilderState = {\n ...this.#state,\n predicates: [\n ...this.#state.predicates,\n {\n targetAlias: alias,\n expression: predicate.__expr,\n },\n ],\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Adds a WHERE clause for an edge.\n *\n * @param alias - The edge alias to filter on\n * @param predicateFunction - A function that builds predicates using the edge accessor\n */\n whereEdge<EA extends keyof EdgeAliases & string>(\n alias: EA,\n predicateFunction: (\n edge: EdgeAccessor<EdgeAliases[EA][\"type\"]>,\n ) => Predicate,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n const accessor = this.#createEdgeAccessor(alias);\n const predicate = predicateFunction(\n accessor as EdgeAccessor<EdgeAliases[EA][\"type\"]>,\n );\n\n const newState: QueryBuilderState = {\n ...this.#state,\n predicates: [\n ...this.#state.predicates,\n {\n targetAlias: alias,\n targetType: \"edge\",\n expression: predicate.__expr,\n },\n ],\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Traverses an edge to another node (outgoing direction).\n *\n * By default, traverses from the current node (last traversal target, or start node).\n * Use the `from` option to traverse from a different alias (fan-out pattern).\n *\n * @param options.expand - Ontology expansion mode for implying/inverse edges\n * @param options.from - Alias to traverse from (defaults to current/last traversal target)\n */\n traverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: \"out\";\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n \"out\",\n false,\n false,\n false,\n RecursiveAliases\n >;\n\n /**\n * Traverses an edge to another node (incoming direction).\n *\n * By default, traverses from the current node (last traversal target, or start node).\n * Use the `from` option to traverse from a different alias (fan-out pattern).\n *\n * @param options.direction - Set to \"in\" for incoming edge traversal\n * @param options.expand - Ontology expansion mode for implying/inverse edges\n * @param options.from - Alias to traverse from (defaults to current/last traversal target)\n */\n traverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options: {\n direction: \"in\";\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n \"in\",\n false,\n false,\n false,\n RecursiveAliases\n >;\n\n traverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: TraversalDirection;\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n TraversalDirection,\n false,\n false,\n false,\n RecursiveAliases\n > {\n // Validate edge alias to prevent SQL injection\n validateSqlIdentifier(edgeAlias);\n\n const direction = options?.direction ?? \"out\";\n const expansion = options?.expand ?? this.#config.defaultTraversalExpansion;\n const includeImplyingEdges =\n expansion === \"implying\" || expansion === \"all\";\n const includeInverseEdges = expansion === \"inverse\" || expansion === \"all\";\n // Use explicit `from` if provided, otherwise chain from currentAlias\n const fromAlias = options?.from ?? this.#state.currentAlias;\n\n // Expand edge kinds if including implying edges\n const edgeKinds = this.#expandTraversalEdgeKinds(\n edgeKind,\n includeImplyingEdges,\n );\n const inverseEdgeKinds =\n includeInverseEdges ?\n this.#expandInverseTraversalEdgeKinds(edgeKinds, includeImplyingEdges)\n : [];\n\n return new TraversalBuilder(\n this.#config,\n this.#state,\n edgeKinds,\n edgeAlias,\n direction,\n fromAlias,\n inverseEdgeKinds,\n false,\n );\n }\n\n /**\n * Optionally traverses an edge to another node (LEFT JOIN semantics).\n * If no matching edge/node exists, the result will include null values.\n *\n * By default, traverses from the current node (last traversal target, or start node).\n * Use the `from` option to traverse from a different alias (fan-out pattern).\n *\n * @param options.direction - Direction of traversal: \"out\" (default) or \"in\"\n * @param options.expand - Ontology expansion mode for implying/inverse edges\n * @param options.from - Alias to traverse from (defaults to current/last traversal target)\n */\n optionalTraverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: \"out\";\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n \"out\",\n true,\n false,\n false,\n RecursiveAliases\n >;\n\n optionalTraverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options: {\n direction: \"in\";\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n \"in\",\n true,\n false,\n false,\n RecursiveAliases\n >;\n\n optionalTraverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: TraversalDirection;\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n TraversalDirection,\n true,\n false,\n false,\n RecursiveAliases\n > {\n // Validate edge alias to prevent SQL injection\n validateSqlIdentifier(edgeAlias);\n\n const direction = options?.direction ?? \"out\";\n const expansion = options?.expand ?? this.#config.defaultTraversalExpansion;\n const includeImplyingEdges =\n expansion === \"implying\" || expansion === \"all\";\n const includeInverseEdges = expansion === \"inverse\" || expansion === \"all\";\n // Use explicit `from` if provided, otherwise chain from currentAlias\n const fromAlias = options?.from ?? this.#state.currentAlias;\n\n // Expand edge kinds if including implying edges\n const edgeKinds = this.#expandTraversalEdgeKinds(\n edgeKind,\n includeImplyingEdges,\n );\n const inverseEdgeKinds =\n includeInverseEdges ?\n this.#expandInverseTraversalEdgeKinds(edgeKinds, includeImplyingEdges)\n : [];\n\n return new TraversalBuilder(\n this.#config,\n this.#state,\n edgeKinds,\n edgeAlias,\n direction,\n fromAlias,\n inverseEdgeKinds,\n true,\n );\n }\n\n /**\n * Selects fields to return.\n */\n select<R>(\n selectFunction: (\n context: SelectContext<Aliases, EdgeAliases, RecursiveAliases>,\n ) => R,\n ): ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, R> {\n // For now, project all fields from all aliases\n // A more sophisticated implementation would parse the selectFn\n\n // Start node fields (including metadata)\n const startFields = buildNodeFields(this.#state.startAlias);\n\n // Traversal node and edge fields (including metadata)\n // Edge fields are in the node's CTE, so we pass the node alias for CTE reference\n const traversalFields = this.#state.traversals.flatMap((traversal) => [\n ...buildEdgeFields(traversal.edgeAlias, traversal.nodeAlias),\n ...buildNodeFields(traversal.nodeAlias),\n ]);\n\n const projection = [...startFields, ...traversalFields];\n\n const newState: QueryBuilderState = {\n ...this.#state,\n projection,\n };\n\n return new ExecutableQuery(this.#config, newState, selectFunction);\n }\n\n /**\n * Selects fields including aggregates.\n * Use with groupBy() for aggregate queries.\n *\n * @param fields - Object mapping output names to field refs or aggregate expressions\n */\n aggregate<R extends Record<string, FieldRef | AggregateExpr>>(\n fields: R,\n ): ExecutableAggregateQuery<G, Aliases, R> {\n const resolvedFields = Object.fromEntries(\n Object.entries(fields).map(([outputName, source]) => {\n if (source.__type !== \"field_ref\") {\n return [outputName, source];\n }\n\n if (\n source.valueType !== undefined ||\n source.path.length !== 1 ||\n source.path[0] !== \"props\" ||\n source.jsonPointer === undefined\n ) {\n return [outputName, source];\n }\n\n const segments = parseJsonPointer(source.jsonPointer);\n if (segments.length !== 1) {\n return [outputName, source];\n }\n\n const propertyName = segments[0];\n if (propertyName === undefined) {\n return [outputName, source];\n }\n\n const kindNames = this.#getKindNamesForAlias(source.alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n propertyName,\n )\n : undefined;\n\n if (!typeInfo) {\n return [outputName, source];\n }\n\n return [\n outputName,\n {\n ...source,\n valueType: typeInfo.valueType,\n elementType: typeInfo.elementType,\n } satisfies FieldRef,\n ];\n }),\n ) as R;\n\n const projection: ProjectedField[] = Object.entries(resolvedFields).map(\n ([outputName, source]) => ({\n outputName,\n source,\n }),\n );\n\n const newState: QueryBuilderState = {\n ...this.#state,\n projection,\n };\n\n return new ExecutableAggregateQuery(this.#config, newState, resolvedFields);\n }\n\n /**\n * Orders results.\n */\n orderBy<A extends keyof Aliases & string>(\n alias: A,\n field: string,\n direction: SortDirection = \"asc\",\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n const kindNames = this.#getKindNamesForAlias(alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(kindNames, field)\n : undefined;\n\n const orderSpec: OrderSpec = {\n field: fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([field]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n }),\n direction,\n };\n\n const newState: QueryBuilderState = {\n ...this.#state,\n orderBy: [...this.#state.orderBy, orderSpec],\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Limits the number of results.\n */\n limit(n: number): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n return new QueryBuilder(this.#config, {\n ...this.#state,\n limit: n,\n });\n }\n\n /**\n * Offsets the results.\n */\n offset(n: number): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n return new QueryBuilder(this.#config, {\n ...this.#state,\n offset: n,\n });\n }\n\n /**\n * Sets temporal mode.\n *\n * @param mode - The temporal mode to use\n * @param asOf - Required timestamp for \"asOf\" mode (ISO 8601 string)\n * @throws ValidationError if mode is \"asOf\" but no timestamp is provided\n */\n temporal(\n mode: TemporalMode,\n asOf?: string,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n if (mode === \"asOf\" && asOf === undefined) {\n throw new ValidationError(\n 'Temporal mode \"asOf\" requires a timestamp',\n {\n issues: [\n { path: \"asOf\", message: \"Timestamp is required for asOf mode\" },\n ],\n },\n {\n suggestion: `Use .temporal(\"asOf\", \"2024-01-15T10:00:00.000Z\") or .temporal(\"current\") for current time.`,\n },\n );\n }\n return new QueryBuilder(this.#config, {\n ...this.#state,\n temporalMode: mode,\n asOf,\n });\n }\n\n /**\n * Groups results by the specified field.\n * Use with aggregate functions like COUNT, SUM, AVG in select().\n *\n * @param alias - The node alias to group by\n * @param field - The field name to group by\n */\n groupBy<A extends keyof Aliases & string>(\n alias: A,\n field: string,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n const kindNames = this.#getKindNamesForAlias(alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(kindNames, field)\n : undefined;\n\n const fieldRefValue: FieldRef = {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n };\n\n const existingFields = this.#state.groupBy?.fields ?? [];\n const newGroupBy: GroupBySpec = {\n fields: [...existingFields, fieldRefValue],\n };\n\n return new QueryBuilder(this.#config, {\n ...this.#state,\n groupBy: newGroupBy,\n });\n }\n\n /**\n * Groups results by the node ID.\n * Use when you want to group by a complete node rather than a specific field.\n *\n * @param alias - The node alias to group by (uses the node's ID)\n */\n groupByNode<A extends keyof Aliases & string>(\n alias: A,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n const fieldRefValue: FieldRef = {\n __type: \"field_ref\",\n alias,\n path: [\"id\"],\n valueType: \"string\",\n };\n\n const existingFields = this.#state.groupBy?.fields ?? [];\n const newGroupBy: GroupBySpec = {\n fields: [...existingFields, fieldRefValue],\n };\n\n return new QueryBuilder(this.#config, {\n ...this.#state,\n groupBy: newGroupBy,\n });\n }\n\n /**\n * Filters grouped results using aggregate conditions (HAVING clause).\n * Use after groupBy() to filter based on aggregate values.\n *\n * @param predicate - A predicate expression to filter groups\n */\n having(\n predicate: PredicateExpression,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n return new QueryBuilder(this.#config, {\n ...this.#state,\n having: predicate,\n });\n }\n\n /**\n * Applies a query fragment to transform this builder.\n *\n * Fragments are reusable query transformations that can add predicates,\n * traversals, ordering, and other query operations. Use this for\n * composing complex queries from simpler, reusable parts.\n *\n * @example\n * ```typescript\n * // Define a reusable fragment\n * const activeUsers = createFragment<MyGraph>()((q) =>\n * q.whereNode(\"u\", ({ status }) => status.eq(\"active\"))\n * );\n *\n * // Apply the fragment\n * const results = await query()\n * .from(\"User\", \"u\")\n * .pipe(activeUsers)\n * .select((ctx) => ctx.u)\n * .execute();\n * ```\n *\n * @param fragment - A function that transforms the builder\n * @returns The transformed builder\n */\n pipe<\n OutAliases extends AliasMap,\n OutEdgeAliases extends EdgeAliasMap = EdgeAliases,\n OutRecAliases extends RecursiveAliasMap = RecursiveAliases,\n >(\n fragment: (\n builder: QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases>,\n ) => QueryBuilder<G, OutAliases, OutEdgeAliases, OutRecAliases>,\n ): QueryBuilder<G, OutAliases, OutEdgeAliases, OutRecAliases> {\n return fragment(this);\n }\n\n /**\n * Gets all kind names for an alias.\n */\n #getKindNamesForAlias(alias: string): readonly string[] | undefined {\n if (alias === this.#state.startAlias) {\n return this.#state.startKinds;\n }\n for (const traversal of this.#state.traversals) {\n if (traversal.nodeAlias === alias) {\n return traversal.nodeKinds;\n }\n }\n return undefined;\n }\n\n /**\n * Determines the appropriate field builder based on Zod schema type.\n */\n #getFieldBuilderForProperty(\n kindNames: readonly string[] | undefined,\n property: string,\n alias: string,\n ): BaseFieldAccessor {\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n property,\n )\n : undefined;\n\n const ref = fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([property]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n });\n\n return this.#buildFieldBuilderForTypeInfo(ref, typeInfo);\n }\n\n #buildFieldBuilderForTypeInfo(\n ref: ReturnType<typeof fieldRef>,\n typeInfo: FieldTypeInfo | undefined,\n ): BaseFieldAccessor {\n if (!typeInfo) {\n return baseField(ref);\n }\n\n switch (typeInfo.valueType) {\n case \"string\": {\n return stringField(ref);\n }\n case \"number\": {\n return numberField(ref);\n }\n case \"boolean\": {\n return baseField(ref);\n }\n case \"date\": {\n return dateField(ref);\n }\n case \"array\": {\n return arrayField(ref);\n }\n case \"object\": {\n return objectField(ref, { typeInfo });\n }\n case \"embedding\": {\n return embeddingField(ref);\n }\n case \"unknown\": {\n return baseField(ref);\n }\n }\n }\n\n #createNodeAccessor(alias: string): NodeAccessor<NodeType> {\n const kindNames = this.#getKindNamesForAlias(alias);\n const idAccessor = stringField(\n fieldRef(alias, [\"id\"], { valueType: \"string\" }),\n );\n const kindAccessor = stringField(\n fieldRef(alias, [\"kind\"], { valueType: \"string\" }),\n );\n\n // Use a Proxy to provide flattened property access\n return new Proxy({} as NodeAccessor<NodeType>, {\n get: (_, property: string | symbol) => {\n // Handle symbols and special properties to avoid infinite loops\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n // System fields\n if (property === \"id\") return idAccessor;\n if (property === \"kind\") return kindAccessor;\n\n // Schema properties\n return this.#getFieldBuilderForProperty(kindNames, property, alias);\n },\n });\n }\n\n #expandTraversalEdgeKinds(\n edgeKind: keyof G[\"edges\"] & string,\n includeImplyingEdges: boolean,\n ): readonly string[] {\n return includeImplyingEdges ?\n this.#config.registry.expandImplyingEdges(edgeKind)\n : [edgeKind];\n }\n\n #expandInverseTraversalEdgeKinds(\n edgeKinds: readonly string[],\n includeImplyingEdges: boolean,\n ): readonly string[] {\n const inverseKinds = new Set<string>();\n\n for (const kind of edgeKinds) {\n const inverseKind = this.#config.registry.getInverseEdge(kind);\n if (inverseKind === undefined) {\n continue;\n }\n\n inverseKinds.add(inverseKind);\n\n if (!includeImplyingEdges) {\n continue;\n }\n\n for (const implyingKind of this.#config.registry.expandImplyingEdges(\n inverseKind,\n )) {\n inverseKinds.add(implyingKind);\n }\n }\n\n return [...inverseKinds];\n }\n\n /**\n * Gets edge kind names for an edge alias.\n */\n #getEdgeKindNamesForAlias(alias: string): readonly string[] | undefined {\n for (const traversal of this.#state.traversals) {\n if (traversal.edgeAlias === alias) {\n return mergeEdgeKinds(traversal);\n }\n }\n return undefined;\n }\n\n /**\n * Determines the appropriate field builder for an edge property based on Zod schema type.\n */\n #getFieldBuilderForEdgeProperty(\n edgeKindNames: readonly string[] | undefined,\n property: string,\n alias: string,\n ): BaseFieldAccessor {\n const typeInfo =\n edgeKindNames ?\n this.#config.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n edgeKindNames,\n property,\n )\n : undefined;\n\n const ref = fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([property]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n });\n\n return this.#buildFieldBuilderForTypeInfo(ref, typeInfo);\n }\n\n #createEdgeAccessor(alias: string): EdgeAccessor<EdgeType> {\n const edgeKindNames = this.#getEdgeKindNamesForAlias(alias);\n const idAccessor = stringField(\n fieldRef(alias, [\"id\"], { valueType: \"string\" }),\n );\n const kindAccessor = stringField(\n fieldRef(alias, [\"kind\"], { valueType: \"string\" }),\n );\n const fromIdAccessor = stringField(\n fieldRef(alias, [\"from_id\"], { valueType: \"string\" }),\n );\n const toIdAccessor = stringField(\n fieldRef(alias, [\"to_id\"], { valueType: \"string\" }),\n );\n\n // Use a Proxy to provide flattened property access\n return new Proxy({} as EdgeAccessor<EdgeType>, {\n get: (_, property: string | symbol) => {\n // Handle symbols and special properties to avoid infinite loops\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n // System fields\n if (property === \"id\") return idAccessor;\n if (property === \"kind\") return kindAccessor;\n if (property === \"fromId\") return fromIdAccessor;\n if (property === \"toId\") return toIdAccessor;\n\n // Schema properties\n return this.#getFieldBuilderForEdgeProperty(\n edgeKindNames,\n property,\n alias,\n );\n },\n });\n }\n}\n","/**\n * UnionableQuery - A query formed by combining multiple queries with set operations.\n */\nimport { type SQL } from \"drizzle-orm\";\n\nimport { type GraphDef } from \"../../core/define-graph\";\nimport {\n type ComposableQuery,\n type QueryAst,\n type SetOperation,\n type SetOperationType,\n type Traversal,\n} from \"../ast\";\nimport {\n type CompileQueryOptions,\n compileSetOperation,\n} from \"../compiler/index\";\nimport { mapResults } from \"../execution\";\nimport { composableQueryHasParameterReferences } from \"./prepared-query\";\nimport {\n type AliasMap,\n type EdgeAliasMap,\n type QueryBuilderConfig,\n type SelectContext,\n} from \"./types\";\n\nconst NOT_COMPUTED = Symbol(\"NOT_COMPUTED\");\n\n// Forward declaration for ExecutableQuery to avoid circular imports\n// G and R are used for type compatibility with ExecutableQuery but not accessed in the interface body\ninterface ExecutableQueryLike<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Used for type compatibility\n G extends GraphDef,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Used for type compatibility\n R,\n> {\n toAst(): QueryAst;\n}\n\n/**\n * Internal state for unionable query.\n */\ntype UnionableQueryState = Readonly<{\n left: ComposableQuery;\n operator: SetOperationType;\n right: ComposableQuery;\n limit?: number;\n offset?: number;\n // For result transformation\n startAlias?: string;\n traversals?: readonly Traversal[];\n selectFn?: (context: SelectContext<AliasMap, EdgeAliasMap>) => unknown;\n}>;\n\n/**\n * A query formed by combining multiple queries with set operations.\n * Supports chaining: q1.union(q2).intersect(q3)\n */\nexport class UnionableQuery<G extends GraphDef, R> {\n readonly #config: QueryBuilderConfig;\n readonly #state: UnionableQueryState;\n #cachedCompiled: SQL | typeof NOT_COMPUTED = NOT_COMPUTED;\n\n constructor(config: QueryBuilderConfig, state: UnionableQueryState) {\n this.#config = config;\n this.#state = state;\n }\n\n /**\n * Combines with another query using UNION.\n */\n union(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"union\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Combines with another query using UNION ALL.\n */\n unionAll(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"unionAll\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Combines with another query using INTERSECT.\n */\n intersect(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"intersect\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Combines with another query using EXCEPT.\n */\n except(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"except\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Limits the number of results from the combined query.\n */\n limit(n: number): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, { ...this.#state, limit: n });\n }\n\n /**\n * Offsets the results from the combined query.\n */\n offset(n: number): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, { ...this.#state, offset: n });\n }\n\n /**\n * Builds the set operation AST.\n */\n toAst(): SetOperation {\n return {\n __type: \"set_operation\",\n operator: this.#state.operator,\n left: this.#state.left,\n right: this.#state.right,\n ...(this.#state.limit !== undefined && { limit: this.#state.limit }),\n ...(this.#state.offset !== undefined && { offset: this.#state.offset }),\n };\n }\n\n /**\n * Compiles the query and returns the SQL text and parameters.\n *\n * Requires a backend to be configured (the backend determines the SQL dialect).\n * Use this for debugging, logging, or running the query with a custom executor.\n */\n toSQL(): Readonly<{ sql: string; params: readonly unknown[] }> {\n if (!this.#config.backend?.compileSql) {\n throw new Error(\n \"Cannot convert to SQL: no backend configured or backend does not support compileSql. \" +\n \"Use store.query() to get a backend-aware query builder.\",\n );\n }\n return this.#config.backend.compileSql(this.compile());\n }\n\n /**\n * Compiles the set operation to SQL.\n */\n compile(): SQL {\n if (this.#cachedCompiled !== NOT_COMPUTED) {\n return this.#cachedCompiled;\n }\n\n const compiled = compileSetOperation(\n this.toAst(),\n this.#config.graphId,\n this.#compileOptions(),\n );\n this.#cachedCompiled = compiled;\n return compiled;\n }\n\n /**\n * Builds compile options from the config.\n */\n #compileOptions(): CompileQueryOptions {\n return {\n dialect: this.#config.dialect ?? \"sqlite\",\n schema: this.#config.schema,\n };\n }\n\n /**\n * Executes the combined query.\n */\n async execute(): Promise<readonly R[]> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n if (composableQueryHasParameterReferences(this.toAst())) {\n throw new Error(\n \"Query contains param() references. Use .prepare().execute({...}) instead of .execute().\",\n );\n }\n\n const compiled = this.compile();\n const rows =\n await this.#config.backend.execute<Record<string, unknown>>(compiled);\n\n // Apply select function transformation if available\n if (this.#state.selectFn && this.#state.startAlias) {\n return mapResults(\n rows,\n this.#state.startAlias,\n this.#state.traversals ?? [],\n this.#state.selectFn,\n ) as readonly R[];\n }\n\n return rows as readonly R[];\n }\n}\n","/**\n * Aggregate and HAVING Helper Functions\n *\n * Provides factory functions for creating aggregate expressions (COUNT, SUM, etc.)\n * and HAVING clause predicates for use in GROUP BY queries.\n */\nimport {\n type AggregateComparisonPredicate,\n type AggregateExpr,\n type ComparisonOp,\n type FieldRef,\n} from \"../ast\";\nimport { jsonPointer } from \"../json-pointer\";\n\n// ============================================================\n// Aggregate Helpers\n// ============================================================\n\n/**\n * Creates a COUNT aggregate expression.\n *\n * @param alias - The node alias to count\n * @param field - Optional field to count (defaults to counting nodes by ID)\n *\n * @example\n * ```typescript\n * // COUNT all persons\n * count(\"p\")\n *\n * // COUNT persons with email field\n * count(\"p\", \"email\")\n * ```\n */\nexport function count(alias: string, field?: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"count\",\n field: {\n __type: \"field_ref\",\n alias,\n path: field ? [\"props\"] : [\"id\"],\n jsonPointer: field ? jsonPointer([field]) : undefined,\n valueType: field ? undefined : \"string\",\n },\n };\n}\n\n/**\n * Creates a COUNT DISTINCT aggregate expression.\n *\n * @param alias - The node alias to count\n * @param field - Optional field to count distinct values of\n */\nexport function countDistinct(alias: string, field?: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"countDistinct\",\n field: {\n __type: \"field_ref\",\n alias,\n path: field ? [\"props\"] : [\"id\"],\n jsonPointer: field ? jsonPointer([field]) : undefined,\n valueType: field ? undefined : \"string\",\n },\n };\n}\n\n/**\n * Creates a SUM aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The numeric field to sum\n */\nexport function sum(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"sum\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates an AVG aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The numeric field to average\n */\nexport function avg(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"avg\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates a MIN aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The field to find minimum of\n */\nexport function min(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"min\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates a MAX aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The field to find maximum of\n */\nexport function max(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"max\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates a field reference for use in aggregate.\n *\n * @param alias - The node alias\n * @param path - Path to the field. Use \"id\" for node ID, \"kind\" for node kind,\n * or the property name directly (e.g., \"title\", \"year\").\n *\n * @example\n * ```typescript\n * field(\"p\", \"id\") // Node ID\n * field(\"p\", \"kind\") // Node kind\n * field(\"p\", \"title\") // Property field\n * field(\"p\", \"nested\", \"field\") // Nested property\n * ```\n */\nexport function field(alias: string, ...path: string[]): FieldRef {\n if (path.length === 0 || path[0] === \"id\") {\n return {\n __type: \"field_ref\",\n alias,\n path: [\"id\"],\n valueType: \"string\",\n };\n }\n if (path[0] === \"kind\") {\n return {\n __type: \"field_ref\",\n alias,\n path: [\"kind\"],\n valueType: \"string\",\n };\n }\n if (path[0] === \"props\") {\n throw new Error(\n `field(): Do not include \"props\" in the path. Use field(\"${alias}\", ${path\n .slice(1)\n .map((p) => `\"${p}\"`)\n .join(\", \")}) instead.`,\n );\n }\n return {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer(path),\n };\n}\n\n// ============================================================\n// HAVING Helpers\n// ============================================================\n\n/**\n * Creates a HAVING predicate that compares an aggregate to a value.\n *\n * @param aggregate - The aggregate expression (count, sum, avg, etc.)\n * @param op - The comparison operator\n * @param value - The value to compare against\n *\n * @example\n * ```typescript\n * // HAVING COUNT(*) > 10\n * having(count(\"p\"), \"gt\", 10)\n *\n * // HAVING AVG(salary) >= 50000\n * having(avg(\"p\", \"salary\"), \"gte\", 50000)\n * ```\n */\nexport function having(\n aggregate: AggregateExpr,\n op: ComparisonOp,\n value: number | string | boolean,\n): AggregateComparisonPredicate {\n return {\n __type: \"aggregate_comparison\",\n op,\n aggregate,\n value: {\n __type: \"literal\",\n value,\n valueType: typeof value === \"number\" ? \"number\" : \"string\",\n },\n };\n}\n\n/**\n * Creates a HAVING predicate: aggregate > value\n */\nexport function havingGt(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"gt\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate >= value\n */\nexport function havingGte(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"gte\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate < value\n */\nexport function havingLt(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"lt\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate <= value\n */\nexport function havingLte(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"lte\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate = value\n */\nexport function havingEq(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"eq\", value);\n}\n","/**\n * Query Fragment Composition\n *\n * Provides types and utilities for creating reusable query fragments\n * that can be composed together using the pipe() method.\n *\n * @example\n * ```typescript\n * // Define a reusable fragment\n * const activeUsers = createFragment<MyGraph>()((q) =>\n * q.whereNode(\"u\", ({ status }) => status.eq(\"active\"))\n * );\n *\n * // Use in queries\n * const results = await query()\n * .from(\"User\", \"u\")\n * .pipe(activeUsers)\n * .select((ctx) => ctx.u)\n * .execute();\n * ```\n */\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type QueryBuilder } from \"./query-builder\";\nimport { type TraversalBuilder } from \"./traversal-builder\";\nimport { type AliasMap, type EdgeAliasMap } from \"./types\";\n\n// ============================================================\n// Fragment Types\n// ============================================================\n\n/**\n * A query fragment that transforms a QueryBuilder.\n *\n * Fragments are functions that take a builder and return a modified builder.\n * They can add predicates, traversals, ordering, and other query operations.\n *\n * @typeParam G - The graph definition\n * @typeParam InAliases - Input alias map (what the fragment requires)\n * @typeParam OutAliases - Output alias map (what the fragment produces)\n * @typeParam InEdgeAliases - Input edge alias map\n * @typeParam OutEdgeAliases - Output edge alias map\n */\nexport type QueryFragment<\n G extends GraphDef,\n InAliases extends AliasMap = AliasMap,\n OutAliases extends AliasMap = InAliases,\n InEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n OutEdgeAliases extends EdgeAliasMap = InEdgeAliases,\n> = (\n builder: QueryBuilder<G, InAliases, InEdgeAliases>,\n) => QueryBuilder<G, OutAliases, OutEdgeAliases>;\n\n/**\n * A flexible query fragment that works with any compatible builder.\n *\n * Use this when you want a fragment that only requires certain aliases\n * to exist, but doesn't care about other aliases that may be present.\n */\nexport type FlexibleQueryFragment<\n G extends GraphDef,\n RequiredAliases extends AliasMap = AliasMap,\n AddedAliases extends AliasMap = AliasMap,\n RequiredEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n AddedEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n> = <Aliases extends RequiredAliases, EdgeAliases extends RequiredEdgeAliases>(\n builder: QueryBuilder<G, Aliases, EdgeAliases>,\n) => QueryBuilder<G, Aliases & AddedAliases, EdgeAliases & AddedEdgeAliases>;\n\n/**\n * A traversal fragment that transforms a TraversalBuilder.\n *\n * Use this for reusable traversal patterns including edge filtering,\n * recursive traversals, and path collection.\n */\nexport type TraversalFragment<\n G extends GraphDef,\n EK extends keyof G[\"edges\"] & string,\n EA extends string,\n InAliases extends AliasMap = AliasMap,\n InEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n> = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Direction type is context-dependent\n builder: TraversalBuilder<G, InAliases, InEdgeAliases, EK, EA, any>,\n) => unknown;\n\n// ============================================================\n// Fragment Factory\n// ============================================================\n\n/**\n * Creates a typed query fragment factory for a specific graph.\n *\n * This is the recommended way to create reusable fragments with full type safety.\n * The factory returns a function that creates fragments bound to your graph type.\n *\n * @example\n * ```typescript\n * // Create a factory for your graph\n * const fragment = createFragment<MyGraph>();\n *\n * // Define a simple filter fragment\n * const activeOnly = fragment((q) =>\n * q.whereNode(\"u\", ({ isActive }) => isActive.eq(true))\n * );\n *\n * // Define a traversal fragment\n * const withManager = fragment((q) =>\n * q.traverse(\"reportsTo\", \"r\").to(\"User\", \"manager\")\n * );\n *\n * // Compose fragments\n * query()\n * .from(\"User\", \"u\")\n * .pipe(activeOnly)\n * .pipe(withManager)\n * .select((ctx) => ({ user: ctx.u, manager: ctx.manager }))\n * ```\n */\n/**\n * Identity function used by createFragment to return the fragment unchanged.\n * Defined at module scope to satisfy consistent-function-scoping lint rule.\n */\nfunction fragmentIdentity<\n G extends GraphDef,\n InAliases extends AliasMap,\n OutAliases extends AliasMap,\n InEdgeAliases extends EdgeAliasMap,\n OutEdgeAliases extends EdgeAliasMap,\n>(\n fn: (\n builder: QueryBuilder<G, InAliases, InEdgeAliases>,\n ) => QueryBuilder<G, OutAliases, OutEdgeAliases>,\n): QueryFragment<G, InAliases, OutAliases, InEdgeAliases, OutEdgeAliases> {\n return fn;\n}\n\nexport function createFragment<G extends GraphDef>(): <\n InAliases extends AliasMap,\n OutAliases extends AliasMap,\n InEdgeAliases extends EdgeAliasMap,\n OutEdgeAliases extends EdgeAliasMap,\n>(\n fn: (\n builder: QueryBuilder<G, InAliases, InEdgeAliases>,\n ) => QueryBuilder<G, OutAliases, OutEdgeAliases>,\n) => QueryFragment<G, InAliases, OutAliases, InEdgeAliases, OutEdgeAliases> {\n return fragmentIdentity;\n}\n\n/**\n * Combines multiple fragments into a single fragment.\n *\n * Fragments are applied in order from left to right.\n *\n * @example\n * ```typescript\n * const combinedFragment = composeFragments(\n * activeOnly,\n * withManager,\n * recentlyUpdated\n * );\n *\n * query()\n * .from(\"User\", \"u\")\n * .pipe(combinedFragment)\n * .select(...)\n * ```\n */\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n>(f1: QueryFragment<G, A1, A2, E1, E2>): QueryFragment<G, A1, A2, E1, E2>;\n\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n A3 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n E3 extends EdgeAliasMap,\n>(\n f1: QueryFragment<G, A1, A2, E1, E2>,\n f2: QueryFragment<G, A2, A3, E2, E3>,\n): QueryFragment<G, A1, A3, E1, E3>;\n\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n A3 extends AliasMap,\n A4 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n E3 extends EdgeAliasMap,\n E4 extends EdgeAliasMap,\n>(\n f1: QueryFragment<G, A1, A2, E1, E2>,\n f2: QueryFragment<G, A2, A3, E2, E3>,\n f3: QueryFragment<G, A3, A4, E3, E4>,\n): QueryFragment<G, A1, A4, E1, E4>;\n\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n A3 extends AliasMap,\n A4 extends AliasMap,\n A5 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n E3 extends EdgeAliasMap,\n E4 extends EdgeAliasMap,\n E5 extends EdgeAliasMap,\n>(\n f1: QueryFragment<G, A1, A2, E1, E2>,\n f2: QueryFragment<G, A2, A3, E2, E3>,\n f3: QueryFragment<G, A3, A4, E3, E4>,\n f4: QueryFragment<G, A4, A5, E4, E5>,\n): QueryFragment<G, A1, A5, E1, E5>;\n\nexport function composeFragments<G extends GraphDef>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Variadic composition requires any\n ...fragments: QueryFragment<G, any, any, any, any>[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Return type depends on input types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => {\n let result = builder;\n for (const fragment of fragments) {\n result = fragment(result);\n }\n return result;\n };\n}\n\n// ============================================================\n// Common Fragment Patterns\n// ============================================================\n\n/**\n * Creates a fragment that adds ordering.\n *\n * @example\n * ```typescript\n * const byCreatedAt = orderByFragment<MyGraph, \"u\">(\"u\", \"createdAt\", \"desc\");\n * ```\n */\nexport function orderByFragment<G extends GraphDef, A extends string>(\n alias: A,\n field: string,\n direction: \"asc\" | \"desc\" = \"asc\",\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Flexible alias types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => builder.orderBy(alias, field, direction);\n}\n\n/**\n * Creates a fragment that adds a limit.\n *\n * @example\n * ```typescript\n * const first10 = limitFragment<MyGraph>(10);\n * ```\n */\nexport function limitFragment<G extends GraphDef>(\n n: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Flexible alias types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => builder.limit(n);\n}\n\n/**\n * Creates a fragment that adds an offset.\n *\n * @example\n * ```typescript\n * const skip10 = offsetFragment<MyGraph>(10);\n * ```\n */\nexport function offsetFragment<G extends GraphDef>(\n n: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Flexible alias types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => builder.offset(n);\n}\n","/**\n * Query Builder Module\n *\n * Re-exports from the builder submodules for clean imports.\n * Also wires up circular dependencies between classes.\n */\n\n// Import classes for circular dependency wiring\nimport { setUnionableQueryClass } from \"./executable-query\";\nimport { QueryBuilder } from \"./query-builder\";\nimport { setQueryBuilderClass } from \"./traversal-builder\";\nimport { UnionableQuery } from \"./unionable-query\";\n\n// Wire up circular dependencies.\n// Type assertions are needed because the circular dependency resolution\n// requires passing classes that TypeScript can't verify at module init time.\nsetQueryBuilderClass(\n QueryBuilder as unknown as Parameters<typeof setQueryBuilderClass>[0],\n);\nsetUnionableQueryClass(\n UnionableQuery as unknown as Parameters<typeof setUnionableQueryClass>[0],\n);\n\n// Classes\nexport {\n type AggregateResult,\n ExecutableAggregateQuery,\n} from \"./executable-aggregate-query\";\nexport { ExecutableQuery } from \"./executable-query\";\nexport { PreparedQuery } from \"./prepared-query\";\nexport { QueryBuilder } from \"./query-builder\";\nexport { TraversalBuilder } from \"./traversal-builder\";\nexport { UnionableQuery } from \"./unionable-query\";\n\n// Aggregate helpers\nexport {\n avg,\n count,\n countDistinct,\n field,\n having,\n havingEq,\n havingGt,\n havingGte,\n havingLt,\n havingLte,\n max,\n min,\n sum,\n} from \"./aggregates\";\n\n// Fragment composition\nexport {\n composeFragments,\n createFragment,\n type FlexibleQueryFragment,\n limitFragment,\n offsetFragment,\n orderByFragment,\n type QueryFragment,\n type TraversalFragment,\n} from \"./fragment\";\n\n// AST building utilities\nexport { buildQueryAst } from \"./ast-builder\";\n\n// Types\nexport {\n type AliasMap,\n type ArrayFieldAccessor,\n type BaseFieldAccessor,\n type BooleanFieldAccessor,\n type CreateQueryBuilderOptions,\n type DateFieldAccessor,\n type EdgeAccessor,\n type EmbeddingFieldAccessor,\n type FieldAccessor,\n type NodeAccessor,\n type NodeAlias,\n type NumberFieldAccessor,\n type ObjectFieldAccessor,\n type PaginatedResult,\n type PaginateOptions,\n type PropsAccessor,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type RecursiveAlias,\n type RecursiveAliasMap,\n type RecursiveAliasValue,\n type RecursiveTraversalOptions,\n type SelectableEdge,\n type SelectableNode,\n type SelectContext,\n type StreamOptions,\n type StringFieldAccessor,\n type TraversalExpansion,\n type UniqueAlias,\n type ValidEdgeTargets,\n} from \"./types\";\n\n// Validation utilities\nexport { validateSqlIdentifier } from \"./validation\";\n","/**\n * Fluent query builder for TypeGraph.\n *\n * Provides a type-safe, chainable API for building queries.\n * Each method returns a new builder instance with expanded type information.\n *\n * This module re-exports from the builder submodules and provides the\n * createQueryBuilder factory function.\n */\nimport { type GraphDef } from \"../core/define-graph\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\nimport {\n type CreateQueryBuilderOptions,\n QueryBuilder,\n type QueryBuilderConfig,\n type QueryBuilderState,\n} from \"./builder/index\";\nimport { createSchemaIntrospector } from \"./schema-introspector\";\n\n// Re-export all classes\nexport {\n ExecutableAggregateQuery,\n ExecutableQuery,\n QueryBuilder,\n} from \"./builder/index\";\n\n// Re-export aggregate helpers\nexport {\n avg,\n count,\n countDistinct,\n field,\n having,\n havingEq,\n havingGt,\n havingGte,\n havingLt,\n havingLte,\n max,\n min,\n sum,\n} from \"./builder/index\";\n\n// Re-export types\nexport type {\n AggregateResult,\n AliasMap,\n EdgeAccessor,\n FieldAccessor,\n NodeAccessor,\n NodeAlias,\n PaginatedResult,\n PaginateOptions,\n PropsAccessor,\n RecursiveTraversalOptions,\n SelectableEdge,\n SelectableNode,\n SelectContext,\n StreamOptions,\n TraversalExpansion,\n} from \"./builder/index\";\n\n// ============================================================\n// Factory Function\n// ============================================================\n\n/**\n * Creates a new query builder for a graph.\n *\n * @param graphId - The graph identifier\n * @param registry - The kind registry for ontology lookups\n * @param options - Optional backend and dialect configuration\n * @returns A new QueryBuilder instance\n *\n * @example\n * ```typescript\n * // Without execution capability (compile only)\n * const builder = createQueryBuilder<MyGraph>(\"my_graph\", registry);\n *\n * // With execution capability\n * const builder = createQueryBuilder<MyGraph>(\"my_graph\", registry, {\n * backend: myBackend,\n * dialect: \"sqlite\",\n * });\n * ```\n */\nexport function createQueryBuilder<G extends GraphDef>(\n graphId: string,\n registry: KindRegistry,\n options?: CreateQueryBuilderOptions,\n): QueryBuilder<G> {\n const schemaIntrospector = createSchemaIntrospector(\n registry.nodeKinds,\n registry.edgeKinds,\n );\n\n // Build config, only including optional properties if defined\n const config: QueryBuilderConfig = {\n graphId,\n registry,\n schemaIntrospector,\n defaultTraversalExpansion: options?.defaultTraversalExpansion ?? \"inverse\",\n ...(options?.backend !== undefined && { backend: options.backend }),\n ...(options?.dialect !== undefined && { dialect: options.dialect }),\n ...(options?.schema !== undefined && { schema: options.schema }),\n };\n\n const initialState: QueryBuilderState = {\n startAlias: \"\",\n currentAlias: \"\",\n startKinds: [],\n includeSubClasses: false,\n traversals: [],\n predicates: [],\n projection: [],\n orderBy: [],\n limit: undefined,\n offset: undefined,\n temporalMode: \"current\",\n asOf: undefined,\n groupBy: undefined,\n having: undefined,\n };\n\n return new QueryBuilder(config, initialState);\n}\n","/**\n * Builder functions for creating KindRegistry from GraphDef.\n */\nimport {\n getEdgeKinds,\n getNodeKinds,\n type GraphDef,\n} from \"../core/define-graph\";\nimport {\n type AnyEdgeType,\n type EdgeRegistration,\n type NodeRegistration,\n type NodeType,\n} from \"../core/types\";\nimport {\n computeClosuresFromOntology,\n createEmptyClosures,\n KindRegistry,\n} from \"./kind-registry\";\n\n// ============================================================\n// Build Registry from GraphDef\n// ============================================================\n\n/**\n * Builds a KindRegistry from a GraphDef.\n *\n * This precomputes all transitive closures for efficient runtime queries.\n *\n * @example\n * ```typescript\n * const graph = defineGraph({\n * id: \"my_graph\",\n * nodes: { Person: { type: Person }, Company: { type: Company } },\n * edges: { worksAt: { type: worksAt, from: [Person], to: [Company] } },\n * ontology: [subClassOf(Company, Organization)],\n * });\n *\n * const registry = buildKindRegistry(graph);\n * registry.isSubClassOf(\"Company\", \"Organization\"); // true\n * ```\n */\nexport function buildKindRegistry<G extends GraphDef>(graph: G): KindRegistry {\n // Extract node types\n const nodeTypes = extractNodeTypes(graph);\n\n // Extract edge types\n const edgeTypes = extractEdgeTypes(graph);\n\n // Compute closures from ontology\n const closures =\n graph.ontology.length > 0 ?\n computeClosuresFromOntology(graph.ontology)\n : createEmptyClosures();\n\n return new KindRegistry(nodeTypes, edgeTypes, closures);\n}\n\n// ============================================================\n// Node Kind Extraction\n// ============================================================\n\n/**\n * Extracts all node types from a GraphDef into a Map.\n */\nfunction extractNodeTypes<G extends GraphDef>(\n graph: G,\n): ReadonlyMap<string, NodeType> {\n const result = new Map<string, NodeType>();\n\n for (const typeName of getNodeKinds(graph)) {\n const registration = graph.nodes[typeName] as NodeRegistration;\n result.set(typeName, registration.type);\n }\n\n return result;\n}\n\n// ============================================================\n// Edge Type Extraction\n// ============================================================\n\n/**\n * Extracts all edge types from a GraphDef into a Map.\n */\nfunction extractEdgeTypes<G extends GraphDef>(\n graph: G,\n): ReadonlyMap<string, AnyEdgeType> {\n const result = new Map<string, AnyEdgeType>();\n\n for (const typeName of getEdgeKinds(graph)) {\n const registration = graph.edges[typeName] as EdgeRegistration;\n result.set(typeName, registration.type);\n }\n\n return result;\n}\n","/**\n * EdgeCollection implementation.\n *\n * Provides an ergonomic API for CRUD operations on a specific edge type.\n */\nimport { type z } from \"zod\";\n\nimport {\n type GraphBackend,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type AnyEdgeType, type TemporalMode } from \"../../core/types\";\nimport { UnsupportedPredicateError } from \"../../errors\";\nimport { type QueryBuilder } from \"../../query/builder\";\nimport { nowIso } from \"../../utils/date\";\nimport { type EdgeRow } from \"../row-mappers\";\nimport {\n type CreateEdgeInput,\n type Edge,\n type EdgeCollection,\n type EdgeFindByEndpointsOptions,\n type EdgeGetOrCreateByEndpointsOptions,\n type EdgeGetOrCreateByEndpointsResult,\n type GetOrCreateAction,\n type IfExistsMode,\n type NodeRef,\n type QueryOptions,\n} from \"../types\";\n\n/**\n * Narrows unparameterized Edge to Edge<E>.\n * Safe: props are validated by Zod at creation/update boundaries.\n */\nfunction narrowEdge<E extends AnyEdgeType>(edge: Edge): Edge<E> {\n return edge as Edge<E>;\n}\n\n/**\n * Narrows a readonly Edge array to Edge<E>[].\n */\nfunction narrowEdges<E extends AnyEdgeType>(edges: readonly Edge[]): Edge<E>[] {\n return edges as Edge<E>[];\n}\n\n/**\n * Config for creating an EdgeCollection.\n */\nexport type EdgeCollectionConfig = Readonly<{\n graphId: string;\n kind: string;\n backend: GraphBackend | TransactionBackend;\n defaultTemporalMode: TemporalMode;\n rowToEdge: (row: EdgeRow) => Edge;\n executeCreate: (\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>;\n executeCreateNoReturnBatch: (\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeCreateBatch: (\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<readonly Edge[]>;\n executeUpdate: (\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>;\n executeUpsertUpdate: (\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Edge>;\n executeDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeHardDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n matchesTemporalMode: (row: EdgeRow, options?: QueryOptions) => boolean;\n createQuery?: () => QueryBuilder<GraphDef>;\n executeGetOrCreateByEndpoints: (\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n ) => Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>>;\n executeBulkGetOrCreateByEndpoints: (\n kind: string,\n items: readonly Readonly<{\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n }>[],\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n ) => Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>[]>;\n executeFindByEndpoints: (\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n props?: Record<string, unknown>;\n }>,\n ) => Promise<Edge | undefined>;\n}>;\n\nfunction mapBulkEdgeInputs(\n kind: string,\n items: readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props?: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n): CreateEdgeInput[] {\n return items.map((item) => {\n const input: {\n kind: string;\n id?: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind,\n fromKind: item.from.kind,\n fromId: item.from.id,\n toKind: item.to.kind,\n toId: item.to.id,\n props: item.props ?? {},\n };\n if (item.id !== undefined) input.id = item.id;\n if (item.validFrom !== undefined) input.validFrom = item.validFrom;\n if (item.validTo !== undefined) input.validTo = item.validTo;\n return input;\n });\n}\n\n/**\n * Creates an EdgeCollection for a specific edge type.\n */\nexport function createEdgeCollection<\n G extends GraphDef,\n K extends keyof G[\"edges\"] & string,\n>(config: EdgeCollectionConfig): EdgeCollection<G[\"edges\"][K][\"type\"]> {\n type E = G[\"edges\"][K][\"type\"];\n\n const {\n graphId,\n kind,\n backend,\n defaultTemporalMode,\n rowToEdge,\n executeCreate: executeEdgeCreate,\n executeCreateNoReturnBatch: executeEdgeCreateNoReturnBatch,\n executeCreateBatch: executeEdgeCreateBatch,\n executeUpdate: executeEdgeUpdate,\n executeUpsertUpdate: executeEdgeUpsertUpdate,\n executeDelete: executeEdgeDelete,\n executeHardDelete: executeEdgeHardDelete,\n matchesTemporalMode,\n } = config;\n\n return {\n async create(\n from: NodeRef,\n to: NodeRef,\n props?: z.input<E[\"schema\"]>,\n options?: Readonly<{ id?: string; validFrom?: string; validTo?: string }>,\n ): Promise<Edge<E>> {\n const input: {\n kind: string;\n id?: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n fromKind: from.kind,\n fromId: from.id,\n toKind: to.kind,\n toId: to.id,\n props: (props ?? {}) as Record<string, unknown>,\n };\n if (options?.id !== undefined) input.id = options.id;\n if (options?.validFrom !== undefined) input.validFrom = options.validFrom;\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeEdgeCreate(input, backend);\n return narrowEdge<E>(result);\n },\n\n async getById(\n id: string,\n options?: QueryOptions,\n ): Promise<Edge<E> | undefined> {\n const row = await backend.getEdge(graphId, id);\n if (!row) return undefined;\n if (row.kind !== kind) return undefined; // Edge is a different type\n if (!matchesTemporalMode(row, options)) return undefined;\n return narrowEdge<E>(rowToEdge(row));\n },\n\n async getByIds(\n ids: readonly string[],\n options?: QueryOptions,\n ): Promise<readonly (Edge<E> | undefined)[]> {\n if (ids.length === 0) return [];\n\n if (backend.getEdges !== undefined) {\n const rows = await backend.getEdges(graphId, ids);\n const rowMap = new Map<string, (typeof rows)[number]>();\n for (const row of rows) {\n rowMap.set(row.id, row);\n }\n return ids.map((id) => {\n const row = rowMap.get(id);\n if (!row) return;\n if (row.kind !== kind) return;\n if (!matchesTemporalMode(row, options)) return;\n return narrowEdge<E>(rowToEdge(row));\n });\n }\n\n return Promise.all(\n ids.map(async (id) => {\n const row = await backend.getEdge(graphId, id);\n if (!row) return;\n if (row.kind !== kind) return;\n if (!matchesTemporalMode(row, options)) return;\n return narrowEdge<E>(rowToEdge(row));\n }),\n );\n },\n\n async update(\n id: string,\n props: Partial<z.input<E[\"schema\"]>>,\n options?: Readonly<{ validTo?: string }>,\n ): Promise<Edge<E>> {\n const input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n id,\n props: props as Partial<Record<string, unknown>>,\n };\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeEdgeUpdate(input, backend);\n return narrowEdge<E>(result);\n },\n\n async findFrom(from: NodeRef): Promise<Edge<E>[]> {\n const rows = await backend.findEdgesByKind({\n graphId,\n kind,\n fromKind: from.kind,\n fromId: from.id,\n excludeDeleted: true,\n });\n return rows.map((row) => narrowEdge<E>(rowToEdge(row)));\n },\n\n async findTo(to: NodeRef): Promise<Edge<E>[]> {\n const rows = await backend.findEdgesByKind({\n graphId,\n kind,\n toKind: to.kind,\n toId: to.id,\n excludeDeleted: true,\n });\n return rows.map((row) => narrowEdge<E>(rowToEdge(row)));\n },\n\n async delete(id: string): Promise<void> {\n await executeEdgeDelete(id, backend);\n },\n\n async hardDelete(id: string): Promise<void> {\n await executeEdgeHardDelete(id, backend);\n },\n\n async find(\n options?: Readonly<{\n from?: NodeRef;\n to?: NodeRef;\n limit?: number;\n offset?: number;\n temporalMode?: TemporalMode;\n asOf?: string;\n }>,\n ): Promise<Edge<E>[]> {\n const untypedOptions = options as\n | Readonly<{ where?: unknown }>\n | undefined;\n if (untypedOptions?.where !== undefined) {\n throw new UnsupportedPredicateError(\n `store.edges.${kind}.find({ where }) is not supported. ` +\n `Use store.query().traverse(...).whereEdge(...) for edge property filters.`,\n { kind, operation: \"find\" },\n );\n }\n\n const mode = options?.temporalMode ?? defaultTemporalMode;\n const params: {\n graphId: string;\n kind: string;\n fromKind?: string;\n fromId?: string;\n toKind?: string;\n toId?: string;\n limit?: number;\n offset?: number;\n excludeDeleted: boolean;\n temporalMode: TemporalMode;\n asOf?: string;\n } = {\n graphId,\n kind,\n excludeDeleted: mode !== \"includeTombstones\",\n temporalMode: mode,\n };\n if (mode === \"current\" || mode === \"asOf\") {\n params.asOf = options?.asOf ?? nowIso();\n }\n if (options?.from?.kind !== undefined)\n params.fromKind = options.from.kind;\n if (options?.from?.id !== undefined) params.fromId = options.from.id;\n if (options?.to?.kind !== undefined) params.toKind = options.to.kind;\n if (options?.to?.id !== undefined) params.toId = options.to.id;\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.offset !== undefined) params.offset = options.offset;\n\n const rows = await backend.findEdgesByKind(params);\n return rows.map((row) => narrowEdge<E>(rowToEdge(row)));\n },\n\n async count(\n options?: Readonly<{\n from?: NodeRef;\n to?: NodeRef;\n temporalMode?: TemporalMode;\n asOf?: string;\n }>,\n ): Promise<number> {\n const mode = options?.temporalMode ?? defaultTemporalMode;\n const params: {\n graphId: string;\n kind: string;\n fromKind?: string;\n fromId?: string;\n toKind?: string;\n toId?: string;\n excludeDeleted: boolean;\n temporalMode: TemporalMode;\n asOf?: string;\n } = {\n graphId,\n kind,\n excludeDeleted: mode !== \"includeTombstones\",\n temporalMode: mode,\n };\n if (mode === \"current\" || mode === \"asOf\") {\n params.asOf = options?.asOf ?? nowIso();\n }\n if (options?.from?.kind !== undefined)\n params.fromKind = options.from.kind;\n if (options?.from?.id !== undefined) params.fromId = options.from.id;\n if (options?.to?.kind !== undefined) params.toKind = options.to.kind;\n if (options?.to?.id !== undefined) params.toId = options.to.id;\n\n return backend.countEdgesByKind(params);\n },\n\n async bulkCreate(\n items: readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props?: z.input<E[\"schema\"]>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<Edge<E>[]> {\n const batchInputs = mapBulkEdgeInputs(\n kind,\n items as readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props?: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n );\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n const results = await backend.transaction(async (txBackend) =>\n executeEdgeCreateBatch(batchInputs, txBackend),\n );\n return narrowEdges<E>(results);\n }\n const results = await executeEdgeCreateBatch(batchInputs, backend);\n return narrowEdges<E>(results);\n },\n\n async bulkUpsertById(\n items: readonly Readonly<{\n id: string;\n from: NodeRef;\n to: NodeRef;\n props?: z.input<E[\"schema\"]>;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<Edge<E>[]> {\n if (items.length === 0) return [];\n\n const upsertAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<Edge<E>[]> => {\n const ids = items.map((item) => item.id);\n const existingMap = new Map<\n string,\n { deleted_at: string | undefined }\n >();\n\n if (target.getEdges === undefined) {\n const rows = await Promise.all(\n ids.map((id) => target.getEdge(graphId, id)),\n );\n for (const row of rows) {\n if (row !== undefined) existingMap.set(row.id, row);\n }\n } else {\n const rows = await target.getEdges(graphId, ids);\n for (const row of rows) {\n existingMap.set(row.id, row);\n }\n }\n\n // Bucket items into creates and updates\n const toCreate: { index: number; input: CreateEdgeInput }[] = [];\n const toUpdate: {\n index: number;\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n };\n clearDeleted: boolean;\n }[] = [];\n\n let itemIndex = 0;\n for (const item of items) {\n const existing = existingMap.get(item.id);\n\n if (existing) {\n const input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n id: item.id,\n props: item.props as Record<string, unknown>,\n };\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n toUpdate.push({\n index: itemIndex,\n input,\n clearDeleted: existing.deleted_at !== undefined,\n });\n } else {\n const input: {\n kind: string;\n id?: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind,\n id: item.id,\n fromKind: item.from.kind,\n fromId: item.from.id,\n toKind: item.to.kind,\n toId: item.to.id,\n props: item.props as Record<string, unknown>,\n };\n if (item.validFrom !== undefined) input.validFrom = item.validFrom;\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n toCreate.push({ index: itemIndex, input });\n }\n itemIndex++;\n }\n\n // Hookless batch create\n const results: Edge<E>[] = Array.from({ length: items.length });\n\n if (toCreate.length > 0) {\n const createInputs = toCreate.map((entry) => entry.input);\n const created = await executeEdgeCreateBatch(createInputs, target);\n for (const [index, entry] of toCreate.entries()) {\n results[entry.index] = narrowEdge<E>(created[index]!);\n }\n }\n\n // Hookless individual updates (executeEdgeUpsertUpdate is already hookless)\n for (const entry of toUpdate) {\n const result = await executeEdgeUpsertUpdate(entry.input, target, {\n clearDeleted: entry.clearDeleted,\n });\n results[entry.index] = narrowEdge<E>(result);\n }\n\n return results;\n };\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n return backend.transaction(async (txBackend) => upsertAll(txBackend));\n }\n return upsertAll(backend);\n },\n\n async bulkInsert(\n items: readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props?: z.input<E[\"schema\"]>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<void> {\n const batchInputs = mapBulkEdgeInputs(\n kind,\n items as readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props?: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n );\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n await backend.transaction(async (txBackend) => {\n await executeEdgeCreateNoReturnBatch(batchInputs, txBackend);\n });\n return;\n }\n\n await executeEdgeCreateNoReturnBatch(batchInputs, backend);\n },\n\n async bulkDelete(ids: readonly string[]): Promise<void> {\n if (ids.length === 0) return;\n const deleteAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<void> => {\n for (const id of ids) {\n await executeEdgeDelete(id, target);\n }\n };\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n await backend.transaction(async (txBackend) => deleteAll(txBackend));\n return;\n }\n await deleteAll(backend);\n },\n\n async findByEndpoints(\n from: NodeRef,\n to: NodeRef,\n options?: EdgeFindByEndpointsOptions<E>,\n ): Promise<Edge<E> | undefined> {\n const findOptions: {\n matchOn?: readonly string[];\n props?: Record<string, unknown>;\n } = {};\n if (options?.matchOn !== undefined)\n findOptions.matchOn = options.matchOn as readonly string[];\n if (options?.props !== undefined)\n findOptions.props = options.props as Record<string, unknown>;\n\n const result = await config.executeFindByEndpoints(\n kind,\n from.kind,\n from.id,\n to.kind,\n to.id,\n backend,\n findOptions,\n );\n return result === undefined ? undefined : narrowEdge<E>(result);\n },\n\n async getOrCreateByEndpoints(\n from: NodeRef,\n to: NodeRef,\n props: z.input<E[\"schema\"]>,\n options?: EdgeGetOrCreateByEndpointsOptions<E>,\n ): Promise<EdgeGetOrCreateByEndpointsResult<E>> {\n const getOrCreateOptions: {\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n } = {};\n if (options?.matchOn !== undefined)\n getOrCreateOptions.matchOn = options.matchOn as readonly string[];\n if (options?.ifExists !== undefined)\n getOrCreateOptions.ifExists = options.ifExists;\n\n const result = await config.executeGetOrCreateByEndpoints(\n kind,\n from.kind,\n from.id,\n to.kind,\n to.id,\n props as Record<string, unknown>,\n backend,\n getOrCreateOptions,\n );\n return { edge: narrowEdge<E>(result.edge), action: result.action };\n },\n\n async bulkGetOrCreateByEndpoints(\n items: readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props: z.input<E[\"schema\"]>;\n }>[],\n options?: EdgeGetOrCreateByEndpointsOptions<E>,\n ): Promise<EdgeGetOrCreateByEndpointsResult<E>[]> {\n if (items.length === 0) return [];\n\n const mappedItems = items.map((item) => ({\n fromKind: item.from.kind,\n fromId: item.from.id,\n toKind: item.to.kind,\n toId: item.to.id,\n props: item.props as Record<string, unknown>,\n }));\n\n const getOrCreateOptions: {\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n } = {};\n if (options?.matchOn !== undefined)\n getOrCreateOptions.matchOn = options.matchOn as readonly string[];\n if (options?.ifExists !== undefined)\n getOrCreateOptions.ifExists = options.ifExists;\n\n const getOrCreateAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<EdgeGetOrCreateByEndpointsResult<E>[]> => {\n const results = await config.executeBulkGetOrCreateByEndpoints(\n kind,\n mappedItems,\n target,\n getOrCreateOptions,\n );\n return results.map((result) => ({\n edge: narrowEdge<E>(result.edge),\n action: result.action,\n }));\n };\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n return backend.transaction(async (txBackend) =>\n getOrCreateAll(txBackend),\n );\n }\n return getOrCreateAll(backend);\n },\n };\n}\n","/**\n * NodeCollection implementation.\n *\n * Provides an ergonomic API for CRUD operations on a specific node type.\n */\nimport { type z } from \"zod\";\n\nimport {\n type GraphBackend,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type NodeId, type TemporalMode } from \"../../core/types\";\nimport { type NodeType } from \"../../core/types\";\nimport { ConfigurationError } from \"../../errors\";\nimport { type QueryBuilder } from \"../../query/builder\";\nimport { nowIso } from \"../../utils/date\";\nimport { type NodeRow } from \"../row-mappers\";\nimport {\n type CreateNodeInput,\n type GetOrCreateAction,\n type Node,\n type NodeCollection,\n type NodeGetOrCreateByConstraintOptions,\n type NodeGetOrCreateByConstraintResult,\n type QueryOptions,\n type UpdateNodeInput,\n} from \"../types\";\n\n/**\n * Narrows unparameterized Node to Node<N>.\n * Safe: props are validated by Zod at creation/update boundaries.\n */\nfunction narrowNode<N extends NodeType>(node: Node): Node<N> {\n return node as Node<N>;\n}\n\n/**\n * Narrows a readonly Node array to Node<N>[].\n */\nfunction narrowNodes<N extends NodeType>(nodes: readonly Node[]): Node<N>[] {\n return nodes as Node<N>[];\n}\n\n/**\n * Config for creating a NodeCollection.\n */\nexport type NodeCollectionConfig = Readonly<{\n graphId: string;\n kind: string;\n backend: GraphBackend | TransactionBackend;\n defaultTemporalMode: TemporalMode;\n rowToNode: (row: NodeRow) => Node;\n executeCreate: (\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Node>;\n executeCreateNoReturnBatch: (\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeCreateBatch: (\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<readonly Node[]>;\n executeUpdate: (\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Node>;\n executeUpsertUpdate: (\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Node>;\n executeDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeHardDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n matchesTemporalMode: (row: NodeRow, options?: QueryOptions) => boolean;\n createQuery?: () => QueryBuilder<GraphDef>;\n executeGetOrCreateByConstraint: (\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n ) => Promise<Readonly<{ node: Node; action: GetOrCreateAction }>>;\n executeBulkGetOrCreateByConstraint: (\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n ) => Promise<Readonly<{ node: Node; action: GetOrCreateAction }>[]>;\n executeFindByConstraint: (\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Node | undefined>;\n executeBulkFindByConstraint: (\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<(Node | undefined)[]>;\n}>;\n\nfunction mapBulkNodeInputs(\n kind: string,\n items: readonly Readonly<{\n props: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n): CreateNodeInput[] {\n return items.map((item) => {\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind,\n props: item.props,\n };\n if (item.id !== undefined) input.id = item.id;\n if (item.validFrom !== undefined) input.validFrom = item.validFrom;\n if (item.validTo !== undefined) input.validTo = item.validTo;\n return input;\n });\n}\n\n/**\n * Creates a NodeCollection for a specific node type.\n */\nexport function createNodeCollection<\n G extends GraphDef,\n K extends keyof G[\"nodes\"] & string,\n>(config: NodeCollectionConfig): NodeCollection<G[\"nodes\"][K][\"type\"]> {\n type N = G[\"nodes\"][K][\"type\"];\n\n const {\n graphId,\n kind,\n backend,\n defaultTemporalMode,\n rowToNode,\n executeCreate: executeNodeCreate,\n executeCreateNoReturnBatch: executeNodeCreateNoReturnBatch,\n executeCreateBatch: executeNodeCreateBatch,\n executeUpdate: executeNodeUpdate,\n executeUpsertUpdate: executeNodeUpsertUpdate,\n executeDelete: executeNodeDelete,\n executeHardDelete: executeNodeHardDelete,\n matchesTemporalMode,\n createQuery,\n executeGetOrCreateByConstraint,\n executeBulkGetOrCreateByConstraint,\n executeFindByConstraint,\n executeBulkFindByConstraint,\n } = config;\n\n return {\n async create(\n props: z.input<N[\"schema\"]>,\n options?: Readonly<{ id?: string; validFrom?: string; validTo?: string }>,\n ): Promise<Node<N>> {\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n props: props as Record<string, unknown>,\n };\n if (options?.id !== undefined) input.id = options.id;\n if (options?.validFrom !== undefined) input.validFrom = options.validFrom;\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeNodeCreate(input, backend);\n return narrowNode<N>(result);\n },\n\n async getById(\n id: NodeId<N>,\n options?: QueryOptions,\n ): Promise<Node<N> | undefined> {\n const row = await backend.getNode(graphId, kind, id);\n if (!row) return undefined;\n if (!matchesTemporalMode(row, options)) return undefined;\n return narrowNode<N>(rowToNode(row));\n },\n\n async getByIds(\n ids: readonly NodeId<N>[],\n options?: QueryOptions,\n ): Promise<readonly (Node<N> | undefined)[]> {\n if (ids.length === 0) return [];\n\n if (backend.getNodes !== undefined) {\n const rows = await backend.getNodes(\n graphId,\n kind,\n ids as readonly string[],\n );\n const rowMap = new Map<string, (typeof rows)[number]>();\n for (const row of rows) {\n rowMap.set(row.id, row);\n }\n return ids.map((id) => {\n const row = rowMap.get(id as string);\n if (!row) return;\n if (!matchesTemporalMode(row, options)) return;\n return narrowNode<N>(rowToNode(row));\n });\n }\n\n return Promise.all(\n ids.map(async (id) => {\n const row = await backend.getNode(graphId, kind, id as string);\n if (!row) return;\n if (!matchesTemporalMode(row, options)) return;\n return narrowNode<N>(rowToNode(row));\n }),\n );\n },\n\n async update(\n id: NodeId<N>,\n props: Partial<z.input<N[\"schema\"]>>,\n options?: Readonly<{ validTo?: string }>,\n ): Promise<Node<N>> {\n const input: {\n kind: string;\n id: NodeId<N>;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n kind: kind,\n id,\n props: props as Partial<Record<string, unknown>>,\n };\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeNodeUpdate(input, backend);\n return narrowNode<N>(result);\n },\n\n async delete(id: NodeId<N>): Promise<void> {\n await executeNodeDelete(kind, id as string, backend);\n },\n\n async hardDelete(id: NodeId<N>): Promise<void> {\n await executeNodeHardDelete(kind, id as string, backend);\n },\n\n async find(\n options?: Readonly<{\n where?: (accessor: never) => unknown;\n limit?: number;\n offset?: number;\n temporalMode?: TemporalMode;\n asOf?: string;\n }>,\n ): Promise<Node<N>[]> {\n if (options?.where !== undefined && createQuery === undefined) {\n throw new ConfigurationError(\n `store.nodes.${kind}.find({ where }) requires a query-capable store`,\n { kind, operation: \"find\" },\n );\n }\n if (options?.where !== undefined && createQuery !== undefined) {\n const mode = options.temporalMode ?? defaultTemporalMode;\n let query = createQuery()\n .from(kind, \"_n\")\n .temporal(\n mode,\n mode === \"asOf\" ? (options.asOf ?? nowIso()) : undefined,\n )\n .whereNode(\"_n\", options.where as never)\n .select((ctx: Record<string, unknown>) => ctx._n);\n if (options.limit !== undefined) query = query.limit(options.limit);\n if (options.offset !== undefined) query = query.offset(options.offset);\n const results = await query.execute();\n return results as Node<N>[];\n }\n\n const mode = options?.temporalMode ?? defaultTemporalMode;\n const params: {\n graphId: string;\n kind: string;\n limit?: number;\n offset?: number;\n excludeDeleted: boolean;\n temporalMode: TemporalMode;\n asOf?: string;\n } = {\n graphId,\n kind,\n excludeDeleted: mode !== \"includeTombstones\",\n temporalMode: mode,\n };\n if (mode === \"current\" || mode === \"asOf\") {\n params.asOf = options?.asOf ?? nowIso();\n }\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.offset !== undefined) params.offset = options.offset;\n\n const rows = await backend.findNodesByKind(params);\n return rows.map((row) => narrowNode<N>(rowToNode(row)));\n },\n\n async count(options?: QueryOptions): Promise<number> {\n const mode = options?.temporalMode ?? defaultTemporalMode;\n const params: {\n graphId: string;\n kind: string;\n excludeDeleted: boolean;\n temporalMode: TemporalMode;\n asOf?: string;\n } = {\n graphId,\n kind,\n excludeDeleted: mode !== \"includeTombstones\",\n temporalMode: mode,\n };\n if (mode === \"current\" || mode === \"asOf\") {\n params.asOf = options?.asOf ?? nowIso();\n }\n return backend.countNodesByKind(params);\n },\n\n async upsertById(\n id: string,\n props: z.input<N[\"schema\"]>,\n options?: Readonly<{ validFrom?: string; validTo?: string }>,\n ): Promise<Node<N>> {\n // Check if node exists (including soft-deleted nodes)\n const existing = await backend.getNode(graphId, kind, id);\n\n if (existing) {\n // Update existing node (this also un-deletes soft-deleted nodes)\n const input: {\n kind: string;\n id: NodeId<N>;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n kind: kind,\n id: id as NodeId<N>,\n props: props as Record<string, unknown>,\n };\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n // If the node is soft-deleted, clear the deletion\n const clearDeleted = existing.deleted_at !== undefined;\n const result = await executeNodeUpdate(input, backend, {\n clearDeleted,\n });\n return narrowNode<N>(result);\n } else {\n // Create new node\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n id,\n props: props as Record<string, unknown>,\n };\n if (options?.validFrom !== undefined)\n input.validFrom = options.validFrom;\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeNodeCreate(input, backend);\n return narrowNode<N>(result);\n }\n },\n\n async bulkCreate(\n items: readonly Readonly<{\n props: z.input<N[\"schema\"]>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<Node<N>[]> {\n const batchInputs = mapBulkNodeInputs(\n kind,\n items as readonly Readonly<{\n props: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n );\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n const results = await backend.transaction(async (txBackend) =>\n executeNodeCreateBatch(batchInputs, txBackend),\n );\n return narrowNodes<N>(results);\n }\n const results = await executeNodeCreateBatch(batchInputs, backend);\n return narrowNodes<N>(results);\n },\n\n async bulkUpsertById(\n items: readonly Readonly<{\n id: string;\n props: z.input<N[\"schema\"]>;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<Node<N>[]> {\n if (items.length === 0) return [];\n\n const upsertAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<Node<N>[]> => {\n const ids = items.map((item) => item.id);\n const existingMap = new Map<\n string,\n {\n deleted_at: string | undefined;\n }\n >();\n\n if (target.getNodes === undefined) {\n const rows = await Promise.all(\n ids.map((id) => target.getNode(graphId, kind, id)),\n );\n for (const row of rows) {\n if (row !== undefined) existingMap.set(row.id, row);\n }\n } else {\n const rows = await target.getNodes(\n graphId,\n kind,\n ids as readonly string[],\n );\n for (const row of rows) {\n existingMap.set(row.id, row);\n }\n }\n\n // Bucket items into creates and updates\n const toCreate: { index: number; input: CreateNodeInput }[] = [];\n const toUpdate: {\n index: number;\n input: UpdateNodeInput;\n clearDeleted: boolean;\n }[] = [];\n\n let itemIndex = 0;\n for (const item of items) {\n const existing = existingMap.get(item.id);\n\n if (existing) {\n const input: {\n kind: string;\n id: NodeId<N>;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n kind,\n id: item.id as NodeId<N>,\n props: item.props as Record<string, unknown>,\n };\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n toUpdate.push({\n index: itemIndex,\n input,\n clearDeleted: existing.deleted_at !== undefined,\n });\n } else {\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind,\n id: item.id,\n props: item.props as Record<string, unknown>,\n };\n if (item.validFrom !== undefined) input.validFrom = item.validFrom;\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n toCreate.push({ index: itemIndex, input });\n }\n itemIndex++;\n }\n\n // Hookless batch create\n const results: Node<N>[] = Array.from({ length: items.length });\n\n if (toCreate.length > 0) {\n const createInputs = toCreate.map((entry) => entry.input);\n const created = await executeNodeCreateBatch(createInputs, target);\n for (const [index, entry] of toCreate.entries()) {\n results[entry.index] = narrowNode<N>(created[index]!);\n }\n }\n\n // Hookless individual updates\n for (const entry of toUpdate) {\n const result = await executeNodeUpsertUpdate(entry.input, target, {\n clearDeleted: entry.clearDeleted,\n });\n results[entry.index] = narrowNode<N>(result);\n }\n\n return results;\n };\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n return backend.transaction(async (txBackend) => upsertAll(txBackend));\n }\n return upsertAll(backend);\n },\n\n async bulkInsert(\n items: readonly Readonly<{\n props: z.input<N[\"schema\"]>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<void> {\n const batchInputs = mapBulkNodeInputs(\n kind,\n items as readonly Readonly<{\n props: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n );\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n await backend.transaction(async (txBackend) => {\n await executeNodeCreateNoReturnBatch(batchInputs, txBackend);\n });\n return;\n }\n\n await executeNodeCreateNoReturnBatch(batchInputs, backend);\n },\n\n async bulkDelete(ids: readonly NodeId<N>[]): Promise<void> {\n if (ids.length === 0) return;\n const deleteAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<void> => {\n for (const id of ids) {\n await executeNodeDelete(kind, id as string, target);\n }\n };\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n await backend.transaction(async (txBackend) => deleteAll(txBackend));\n return;\n }\n await deleteAll(backend);\n },\n\n async findByConstraint(\n constraintName: string,\n props: z.input<N[\"schema\"]>,\n ): Promise<Node<N> | undefined> {\n const result = await executeFindByConstraint(\n kind,\n constraintName,\n props as Record<string, unknown>,\n backend,\n );\n return result === undefined ? undefined : narrowNode<N>(result);\n },\n\n async bulkFindByConstraint(\n constraintName: string,\n items: readonly Readonly<{\n props: z.input<N[\"schema\"]>;\n }>[],\n ): Promise<(Node<N> | undefined)[]> {\n if (items.length === 0) return [];\n\n const mappedItems = items.map((item) => ({\n props: item.props as Record<string, unknown>,\n }));\n\n const results = await executeBulkFindByConstraint(\n kind,\n constraintName,\n mappedItems,\n backend,\n );\n return results.map((result) =>\n result === undefined ? undefined : narrowNode<N>(result),\n );\n },\n\n async getOrCreateByConstraint(\n constraintName: string,\n props: z.input<N[\"schema\"]>,\n options?: NodeGetOrCreateByConstraintOptions,\n ): Promise<NodeGetOrCreateByConstraintResult<N>> {\n const execute = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<NodeGetOrCreateByConstraintResult<N>> => {\n const result = await executeGetOrCreateByConstraint(\n kind,\n constraintName,\n props as Record<string, unknown>,\n target,\n options,\n );\n return result as NodeGetOrCreateByConstraintResult<N>;\n };\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n return backend.transaction(async (txBackend) => execute(txBackend));\n }\n return execute(backend);\n },\n\n async bulkGetOrCreateByConstraint(\n constraintName: string,\n items: readonly Readonly<{\n props: z.input<N[\"schema\"]>;\n }>[],\n options?: NodeGetOrCreateByConstraintOptions,\n ): Promise<NodeGetOrCreateByConstraintResult<N>[]> {\n if (items.length === 0) return [];\n\n const mappedItems = items.map((item) => ({\n props: item.props as Record<string, unknown>,\n }));\n\n const getOrCreateAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<NodeGetOrCreateByConstraintResult<N>[]> => {\n const results = await executeBulkGetOrCreateByConstraint(\n kind,\n constraintName,\n mappedItems,\n target,\n options,\n );\n return results as NodeGetOrCreateByConstraintResult<N>[];\n };\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n return backend.transaction(async (txBackend) =>\n getOrCreateAll(txBackend),\n );\n }\n return getOrCreateAll(backend);\n },\n };\n}\n","/**\n * Collection Factory for Store\n *\n * Creates typed node and edge collection proxies for both\n * Store and TransactionContext to reduce code duplication.\n */\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport { type GraphDef } from \"../core/define-graph\";\nimport { type TemporalMode } from \"../core/types\";\nimport { KindNotFoundError } from \"../errors\";\nimport { type QueryBuilder } from \"../query/builder\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\nimport { createEdgeCollection, createNodeCollection } from \"./collections\";\nimport { type EdgeRow, type NodeRow } from \"./row-mappers\";\nimport {\n type ConstraintNames,\n type CreateEdgeInput,\n type CreateNodeInput,\n type Edge,\n type GetOrCreateAction,\n type IfExistsMode,\n type Node,\n type NodeCollection,\n type NodeGetOrCreateByConstraintOptions,\n type QueryOptions,\n type TypedEdgeCollection,\n type UpdateNodeInput,\n} from \"./types\";\n\n/**\n * Operation functions passed to collections.\n */\nexport type NodeOperations = Readonly<{\n defaultTemporalMode: TemporalMode;\n rowToNode: (row: NodeRow) => Node;\n executeCreate: (\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Node>;\n executeCreateBatch: (\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<readonly Node[]>;\n executeCreateNoReturnBatch: (\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeUpdate: (\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Node>;\n executeUpsertUpdate: (\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Node>;\n executeDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeHardDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n matchesTemporalMode: (row: NodeRow, options?: QueryOptions) => boolean;\n createQuery?: () => QueryBuilder<GraphDef>;\n executeGetOrCreateByConstraint: (\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n ) => Promise<Readonly<{ node: Node; action: GetOrCreateAction }>>;\n executeBulkGetOrCreateByConstraint: (\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n ) => Promise<Readonly<{ node: Node; action: GetOrCreateAction }>[]>;\n executeFindByConstraint: (\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Node | undefined>;\n executeBulkFindByConstraint: (\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<(Node | undefined)[]>;\n}>;\n\nexport type EdgeOperations = Readonly<{\n defaultTemporalMode: TemporalMode;\n rowToEdge: (row: EdgeRow) => Edge;\n executeCreate: (\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>;\n executeCreateBatch: (\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<readonly Edge[]>;\n executeCreateNoReturnBatch: (\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeUpdate: (\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>;\n executeUpsertUpdate: (\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Edge>;\n executeDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeHardDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n matchesTemporalMode: (row: EdgeRow, options?: QueryOptions) => boolean;\n createQuery?: () => QueryBuilder<GraphDef>;\n executeGetOrCreateByEndpoints: (\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n ) => Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>>;\n executeBulkGetOrCreateByEndpoints: (\n kind: string,\n items: readonly Readonly<{\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n }>[],\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n ) => Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>[]>;\n executeFindByEndpoints: (\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n props?: Record<string, unknown>;\n }>,\n ) => Promise<Edge | undefined>;\n}>;\n\n/**\n * Creates a typed node collections proxy.\n *\n * The proxy dynamically creates NodeCollection instances for each node kind\n * when accessed.\n */\nexport function createNodeCollectionsProxy<G extends GraphDef>(\n graph: G,\n graphId: string,\n registry: KindRegistry,\n backend: GraphBackend | TransactionBackend,\n operations: NodeOperations,\n): {\n [K in keyof G[\"nodes\"] & string]-?: NodeCollection<\n G[\"nodes\"][K][\"type\"],\n ConstraintNames<G[\"nodes\"][K]>\n >;\n} {\n const collectionCache = new Map<string, unknown>();\n\n // The proxy dynamically returns typed collections for each key.\n // Type assertions are necessary because the proxy pattern doesn't preserve\n // the relationship between keys and their specific node types at compile time.\n return new Proxy(\n {} as unknown as {\n [K in keyof G[\"nodes\"] & string]-?: NodeCollection<\n G[\"nodes\"][K][\"type\"],\n ConstraintNames<G[\"nodes\"][K]>\n >;\n },\n {\n get: (_, kind: string) => {\n if (!(kind in graph.nodes)) {\n throw new KindNotFoundError(kind, \"node\");\n }\n\n const cached = collectionCache.get(kind);\n if (cached !== undefined) {\n return cached;\n }\n\n const collection = createNodeCollection({\n graphId,\n kind,\n backend,\n ...operations,\n });\n collectionCache.set(kind, collection);\n return collection;\n },\n },\n );\n}\n\n/**\n * Creates a typed edge collections proxy.\n *\n * The proxy dynamically creates EdgeCollection instances for each edge kind\n * when accessed.\n */\nexport function createEdgeCollectionsProxy<G extends GraphDef>(\n graph: G,\n graphId: string,\n registry: KindRegistry,\n backend: GraphBackend | TransactionBackend,\n operations: EdgeOperations,\n): { [K in keyof G[\"edges\"] & string]-?: TypedEdgeCollection<G[\"edges\"][K]> } {\n const collectionCache = new Map<string, unknown>();\n\n // The proxy dynamically returns typed collections for each key.\n // Type assertions are necessary because the proxy pattern doesn't preserve\n // the relationship between keys and their specific edge types at compile time.\n return new Proxy(\n {} as unknown as {\n [K in keyof G[\"edges\"] & string]-?: TypedEdgeCollection<G[\"edges\"][K]>;\n },\n {\n get: (_, kind: string) => {\n if (!(kind in graph.edges)) {\n throw new KindNotFoundError(kind, \"edge\");\n }\n\n const cached = collectionCache.get(kind);\n if (cached !== undefined) {\n return cached;\n }\n\n const collection = createEdgeCollection({\n graphId,\n kind,\n backend,\n ...operations,\n });\n collectionCache.set(kind, collection);\n return collection;\n },\n },\n );\n}\n","/**\n * Constraint validation module.\n *\n * Provides validation functions for enforcing graph constraints:\n * - Uniqueness constraints on node properties\n * - Cardinality constraints on edges\n * - Endpoint type constraints on edges\n * - Disjointness constraints between node kinds\n */\n\n/**\n * Separator used between field values in composite unique keys.\n * Uses ASCII Record Separator (0x1E) — valid UTF-8 and safe for PostgreSQL\n * TEXT columns (unlike \\0 which PostgreSQL rejects).\n */\nconst UNIQUE_KEY_SEPARATOR = \"\\u001E\";\n\n/** Marker for undefined/null field values in unique keys. */\nconst UNIQUE_KEY_NULL_MARKER = \"\\u001F\"; // ASCII Unit Separator\nimport {\n type Cardinality,\n type Collation,\n type EdgeRegistration,\n type UniqueConstraint,\n type UniquenessScope,\n} from \"../core/types\";\nimport {\n CardinalityError,\n DisjointError,\n EndpointError,\n UniquenessError,\n} from \"../errors\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\n\n// ============================================================\n// Uniqueness Validation\n// ============================================================\n\n/**\n * Computes the unique key for a node's uniqueness constraint.\n *\n * The key is built by concatenating the specified field values,\n * optionally normalized for case-insensitive comparison.\n */\nexport function computeUniqueKey(\n props: Record<string, unknown>,\n fields: readonly string[],\n collation: Collation,\n): string {\n const values = fields.map((field) => {\n const value = props[field];\n if (value === undefined || value === null) {\n return UNIQUE_KEY_NULL_MARKER;\n }\n // Convert to string, handling primitives safely\n const stringValue =\n typeof value === \"string\" ? value\n : typeof value === \"number\" || typeof value === \"boolean\" ?\n value.toString()\n : JSON.stringify(value);\n return collation === \"caseInsensitive\" ?\n stringValue.toLowerCase()\n : stringValue;\n });\n return values.join(UNIQUE_KEY_SEPARATOR);\n}\n\n/**\n * Checks if a uniqueness constraint's where predicate passes.\n */\nexport function checkWherePredicate(\n constraint: UniqueConstraint,\n props: Record<string, unknown>,\n): boolean {\n if (!constraint.where) {\n return true; // No where clause, always applies\n }\n\n // Build predicate context\n const predicateBuilder = buildPredicateContext(props);\n const predicate = constraint.where(predicateBuilder);\n\n // Evaluate predicate\n return evaluatePredicate(predicate, props);\n}\n\ntype UniquePredicate = Readonly<{\n __type: \"unique_predicate\";\n field: string;\n op: \"isNull\" | \"isNotNull\";\n}>;\n\ntype PredicateContext = Readonly<\n Record<\n string,\n Readonly<{\n isNull: () => UniquePredicate;\n isNotNull: () => UniquePredicate;\n }>\n >\n>;\n\n/**\n * Builds a predicate context for where clause evaluation.\n */\nfunction buildPredicateContext(\n props: Record<string, unknown>,\n): PredicateContext {\n const context: Record<\n string,\n { isNull: () => UniquePredicate; isNotNull: () => UniquePredicate }\n > = {};\n\n for (const key of Object.keys(props)) {\n context[key] = {\n isNull: () => ({\n __type: \"unique_predicate\" as const,\n field: key,\n op: \"isNull\" as const,\n }),\n isNotNull: () => ({\n __type: \"unique_predicate\" as const,\n field: key,\n op: \"isNotNull\" as const,\n }),\n };\n }\n\n return context;\n}\n\n/**\n * Evaluates a uniqueness predicate.\n */\nfunction evaluatePredicate(\n predicate: unknown,\n props: Record<string, unknown>,\n): boolean {\n if (\n typeof predicate !== \"object\" ||\n predicate === null ||\n !(\"__type\" in predicate)\n ) {\n return true;\n }\n\n const pred = predicate as {\n __type: string;\n field: string;\n op: \"isNull\" | \"isNotNull\";\n };\n\n if (pred.__type !== \"unique_predicate\") {\n return true;\n }\n\n const value = props[pred.field];\n if (pred.op === \"isNull\") {\n return value === null || value === undefined;\n }\n return value !== null && value !== undefined;\n}\n\n/**\n * Gets all kinds that should be checked for a uniqueness constraint.\n *\n * For \"kindWithSubClasses\" scope, includes the entire subclass hierarchy:\n * - The kind itself\n * - All ancestors (parent classes)\n * - All descendants of those ancestors (sibling classes)\n *\n * For \"kind\" scope, only the specific kind.\n */\nexport function getKindsForUniquenessCheck(\n baseKind: string,\n scope: UniquenessScope,\n registry: KindRegistry,\n): readonly string[] {\n if (scope === \"kind\") {\n return [baseKind];\n }\n\n // Get the entire connected subclass hierarchy by finding the root ancestor\n const root = findRootAncestor(baseKind, registry);\n\n // Return the root and all its descendants (which includes baseKind and siblings)\n return registry.expandSubClasses(root);\n}\n\n/**\n * Finds the topmost ancestor of a kind, or the kind itself if it has no ancestors.\n */\nfunction findRootAncestor(kind: string, registry: KindRegistry): string {\n const ancestors = registry.getAncestors(kind);\n\n if (ancestors.size === 0) {\n return kind;\n }\n\n // Find an ancestor with no ancestors (the root)\n for (const ancestor of ancestors) {\n if (registry.getAncestors(ancestor).size === 0) {\n return ancestor;\n }\n }\n\n // If all ancestors have ancestors, recurse up\n const firstAncestor = [...ancestors][0];\n return firstAncestor ? findRootAncestor(firstAncestor, registry) : kind;\n}\n\n/**\n * Creates a uniqueness error.\n */\nexport function createUniquenessError(\n constraintName: string,\n kind: string,\n existingId: string,\n newId: string,\n fields: readonly string[],\n): UniquenessError {\n return new UniquenessError({\n constraintName,\n kind,\n existingId,\n newId,\n fields: [...fields],\n });\n}\n\n// ============================================================\n// Cardinality Validation\n// ============================================================\n\n/**\n * Checks if adding an edge would violate cardinality constraints.\n *\n * @param edgeKind - The edge kind being added\n * @param fromKind - The source node kind\n * @param fromId - The source node ID\n * @param cardinality - The cardinality constraint\n * @param existingEdgeCount - Number of existing edges of this kind from this source\n * @param hasActiveEdge - Whether there's an active (valid_to IS NULL) edge\n * @returns Error if violation, undefined if valid\n */\nexport function checkCardinality(\n edgeKind: string,\n fromKind: string,\n fromId: string,\n cardinality: Cardinality,\n existingEdgeCount: number,\n hasActiveEdge: boolean,\n): CardinalityError | undefined {\n switch (cardinality) {\n case \"many\": {\n // No constraint\n return undefined;\n }\n case \"one\": {\n // At most one edge of this kind from any source node\n if (existingEdgeCount > 0) {\n return new CardinalityError({\n edgeKind,\n fromKind,\n fromId,\n cardinality: \"one\",\n existingCount: existingEdgeCount,\n });\n }\n return undefined;\n }\n case \"unique\": {\n // unique is checked separately per (source, target) pair\n return undefined;\n }\n case \"oneActive\": {\n // At most one edge with valid_to IS NULL from any source\n if (hasActiveEdge) {\n return new CardinalityError({\n edgeKind,\n fromKind,\n fromId,\n cardinality: \"oneActive\",\n existingCount: 1,\n });\n }\n return undefined;\n }\n }\n}\n\n/**\n * Checks unique edge constraint (at most one edge between any source-target pair).\n */\nexport function checkUniqueEdge(\n edgeKind: string,\n fromKind: string,\n fromId: string,\n _toKind: string,\n _toId: string,\n existingCount: number,\n): CardinalityError | undefined {\n if (existingCount > 0) {\n return new CardinalityError({\n edgeKind,\n fromKind,\n fromId,\n cardinality: \"unique\",\n existingCount,\n });\n }\n return undefined;\n}\n\n// ============================================================\n// Endpoint Validation\n// ============================================================\n\n/**\n * Validates that an edge's endpoints are valid node kinds.\n */\nexport function validateEdgeEndpoints(\n edgeKind: string,\n fromKind: string,\n toKind: string,\n registration: EdgeRegistration,\n registry: KindRegistry,\n): EndpointError | undefined {\n // Check from kinds\n const validFromKinds = registration.from.map((node) => node.kind);\n const fromValid = validFromKinds.some((validKind) =>\n registry.isAssignableTo(fromKind, validKind),\n );\n\n if (!fromValid) {\n return new EndpointError({\n edgeKind,\n endpoint: \"from\",\n actualKind: fromKind,\n expectedKinds: validFromKinds,\n });\n }\n\n // Check to kinds\n const validToKinds = registration.to.map((node) => node.kind);\n const toValid = validToKinds.some((validKind) =>\n registry.isAssignableTo(toKind, validKind),\n );\n\n if (!toValid) {\n return new EndpointError({\n edgeKind,\n endpoint: \"to\",\n actualKind: toKind,\n expectedKinds: validToKinds,\n });\n }\n\n return undefined;\n}\n\n// ============================================================\n// Disjointness Validation\n// ============================================================\n\n/**\n * Checks if creating a node would violate disjointness constraints.\n *\n * @param nodeId - The node ID being created\n * @param nodeKind - The kind of the new node\n * @param existingKinds - Kinds of existing nodes with the same ID\n * @param registry - The kind registry for disjointness checks\n * @returns Error if disjoint violation, undefined if valid\n */\nexport function checkDisjointness(\n nodeId: string,\n nodeKind: string,\n existingKinds: readonly string[],\n registry: KindRegistry,\n): DisjointError | undefined {\n for (const existingKind of existingKinds) {\n if (registry.areDisjoint(nodeKind, existingKind)) {\n return new DisjointError({\n nodeId,\n attemptedKind: nodeKind,\n conflictingKind: existingKind,\n });\n }\n }\n return undefined;\n}\n\n/**\n * Gets all disjoint kinds for a given kind.\n */\nexport function getDisjointKinds(\n kind: string,\n registry: KindRegistry,\n): readonly string[] {\n return registry.getDisjointKinds(kind);\n}\n","/**\n * Constraint Checking for Store Operations\n *\n * Handles checking disjointness and cardinality constraints.\n */\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport {\n checkCardinality,\n checkDisjointness,\n checkUniqueEdge,\n} from \"../constraints\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\n\n/**\n * Context for constraint operations.\n */\nexport type ConstraintContext = Readonly<{\n graphId: string;\n registry: KindRegistry;\n backend: GraphBackend | TransactionBackend;\n}>;\n\n/**\n * Checks disjointness constraints for a node.\n *\n * Ensures that a node with a given ID doesn't exist in any disjoint kinds.\n *\n * @throws ValidationError if disjointness constraint is violated\n */\nexport async function checkDisjointnessConstraint(\n ctx: ConstraintContext,\n kind: string,\n id: string,\n): Promise<void> {\n // Get all kinds that are disjoint with this kind\n const disjointKinds = ctx.registry.getDisjointKinds(kind);\n\n // For each disjoint kind, check if a node with this ID exists\n for (const disjointKind of disjointKinds) {\n const existing = await ctx.backend.getNode(ctx.graphId, disjointKind, id);\n if (existing && !existing.deleted_at) {\n const error = checkDisjointness(id, kind, [disjointKind], ctx.registry);\n if (error) throw error;\n }\n }\n}\n\n/**\n * Checks cardinality constraints for an edge.\n *\n * @throws CardinalityError if cardinality constraint is violated\n */\nexport async function checkCardinalityConstraint(\n ctx: ConstraintContext,\n edgeKind: string,\n cardinality: \"many\" | \"one\" | \"unique\" | \"oneActive\",\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n validTo: string | undefined,\n): Promise<void> {\n switch (cardinality) {\n case \"many\": {\n // No constraint - allow any number of edges\n return;\n }\n\n case \"one\": {\n // At most one edge of this kind from this source\n const count = await ctx.backend.countEdgesFrom({\n graphId: ctx.graphId,\n edgeKind,\n fromKind,\n fromId,\n });\n const error = checkCardinality(\n edgeKind,\n fromKind,\n fromId,\n \"one\",\n count,\n false,\n );\n if (error) throw error;\n return;\n }\n\n case \"unique\": {\n // At most one edge between this specific source-target pair\n const exists = await ctx.backend.edgeExistsBetween({\n graphId: ctx.graphId,\n edgeKind,\n fromKind,\n fromId,\n toKind,\n toId,\n });\n const error = checkUniqueEdge(\n edgeKind,\n fromKind,\n fromId,\n toKind,\n toId,\n exists ? 1 : 0,\n );\n if (error) throw error;\n return;\n }\n\n case \"oneActive\": {\n // At most one active edge (valid_to IS NULL) from this source\n // Only check if the new edge will be active (validTo is not set)\n if (validTo !== undefined) {\n // New edge is already ended, no active constraint to check\n return;\n }\n const count = await ctx.backend.countEdgesFrom({\n graphId: ctx.graphId,\n edgeKind,\n fromKind,\n fromId,\n activeOnly: true,\n });\n const error = checkCardinality(\n edgeKind,\n fromKind,\n fromId,\n \"oneActive\",\n count,\n count > 0,\n );\n if (error) throw error;\n return;\n }\n }\n}\n","/**\n * Row Mappers for Store\n *\n * Transforms database rows into typed Node and Edge objects.\n */\nimport {\n type EdgeRow as BackendEdgeRow,\n type NodeRow as BackendNodeRow,\n} from \"../backend/types\";\nimport { type Edge, type Node } from \"./types\";\n\n/**\n * Raw node row from database (without graph_id).\n * Derived from BackendNodeRow so BackendNodeRow is assignable without casts.\n */\nexport type NodeRow = Omit<BackendNodeRow, \"graph_id\">;\n\n/**\n * Raw edge row from database (without graph_id).\n * Derived from BackendEdgeRow so BackendEdgeRow is assignable without casts.\n */\nexport type EdgeRow = Omit<BackendEdgeRow, \"graph_id\">;\n\n// Reserved keys that cannot be overwritten by user props\nconst RESERVED_NODE_KEYS = new Set([\"id\", \"kind\", \"meta\"]);\n\n/**\n * Converts null to undefined for consistent typing.\n * Database backends return null for missing values, but our types use undefined.\n */\nfunction nullToUndefined<T>(value: T | null | undefined): T | undefined {\n return value === null ? undefined : value;\n}\n\n/**\n * Filters out reserved keys from props to prevent runtime collisions.\n */\nfunction filterReservedKeys(\n props: Record<string, unknown>,\n reservedKeys: Set<string>,\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!reservedKeys.has(key)) {\n filtered[key] = value;\n }\n }\n return filtered;\n}\n\n/**\n * Transforms a database row into a typed Node object.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys (id, kind, meta) in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n */\nexport function rowToNode(row: NodeRow): Node {\n const rawProps = JSON.parse(row.props) as Record<string, unknown>;\n const props = filterReservedKeys(rawProps, RESERVED_NODE_KEYS);\n return {\n kind: row.kind,\n id: row.id as Node[\"id\"],\n meta: {\n version: row.version,\n validFrom: nullToUndefined(row.valid_from),\n validTo: nullToUndefined(row.valid_to),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n deletedAt: nullToUndefined(row.deleted_at),\n },\n ...props,\n } as Node;\n}\n\n// Reserved keys that cannot be overwritten by user props on edges\nconst RESERVED_EDGE_KEYS = new Set([\n \"id\",\n \"kind\",\n \"meta\",\n \"fromKind\",\n \"fromId\",\n \"toKind\",\n \"toId\",\n]);\n\n/**\n * Transforms a database row into a typed Edge object.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n */\nexport function rowToEdge(row: EdgeRow): Edge {\n const rawProps = JSON.parse(row.props) as Record<string, unknown>;\n const props = filterReservedKeys(rawProps, RESERVED_EDGE_KEYS);\n return {\n id: row.id,\n kind: row.kind,\n fromKind: row.from_kind,\n fromId: row.from_id,\n toKind: row.to_kind,\n toId: row.to_id,\n meta: {\n validFrom: nullToUndefined(row.valid_from),\n validTo: nullToUndefined(row.valid_to),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n deletedAt: nullToUndefined(row.deleted_at),\n },\n ...props,\n } as Edge;\n}\n","/**\n * Edge Operations for Store\n *\n * Handles edge CRUD operations: create, update, delete.\n */\nimport {\n type EdgeRow as BackendEdgeRow,\n type GraphBackend,\n type InsertEdgeParams,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { validateEdgeEndpoints } from \"../../constraints\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type Cardinality } from \"../../core/types\";\nimport {\n DatabaseOperationError,\n EdgeNotFoundError,\n EndpointNotFoundError,\n KindNotFoundError,\n ValidationError,\n} from \"../../errors\";\nimport { validateEdgeProps } from \"../../errors/validation\";\nimport { type KindRegistry } from \"../../registry/kind-registry\";\nimport { validateOptionalIsoDate } from \"../../utils/date\";\nimport { generateId } from \"../../utils/id\";\nimport {\n checkCardinalityConstraint,\n type ConstraintContext,\n} from \"../constraints\";\nimport { rowToEdge } from \"../row-mappers\";\nimport {\n type CreateEdgeInput,\n type Edge,\n type GetOrCreateAction,\n type IfExistsMode,\n type OperationHookContext,\n} from \"../types\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Context for edge operations.\n */\nexport type EdgeOperationContext<G extends GraphDef> = Readonly<{\n graph: G;\n graphId: string;\n registry: KindRegistry;\n createOperationContext: (\n operation: \"create\" | \"update\" | \"delete\",\n entity: \"node\" | \"edge\",\n kind: string,\n id: string,\n ) => OperationHookContext;\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => Promise<T>;\n}>;\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\nfunction getEdgeRegistration<G extends GraphDef>(graph: G, kind: string) {\n const registration = graph.edges[kind];\n if (registration === undefined) throw new KindNotFoundError(kind, \"edge\");\n return registration;\n}\n\ntype EdgeCreatePrepared = Readonly<{\n insertParams: InsertEdgeParams;\n cardinality: Cardinality;\n}>;\n\nfunction buildEdgeEndpointCacheKey(\n graphId: string,\n kind: string,\n id: string,\n): string {\n return `${graphId}\\u0000${kind}\\u0000${id}`;\n}\n\nfunction buildEdgeFromCacheKey(\n graphId: string,\n edgeKind: string,\n fromKind: string,\n fromId: string,\n): string {\n return `${graphId}\\u0000${edgeKind}\\u0000${fromKind}\\u0000${fromId}`;\n}\n\nfunction buildEdgeBetweenCacheKey(\n graphId: string,\n edgeKind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n): string {\n return `${graphId}\\u0000${edgeKind}\\u0000${fromKind}\\u0000${fromId}\\u0000${toKind}\\u0000${toId}`;\n}\n\nfunction buildCountEdgesFromCacheKey(\n params: Parameters<GraphBackend[\"countEdgesFrom\"]>[0],\n): string {\n const activeOnly = params.activeOnly === true ? \"1\" : \"0\";\n return `${params.graphId}\\u0000${params.edgeKind}\\u0000${params.fromKind}\\u0000${params.fromId}\\u0000${activeOnly}`;\n}\n\nfunction buildInsertEdgeParams(\n graphId: string,\n id: string,\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n props: Record<string, unknown>,\n validFrom: string | undefined,\n validTo: string | undefined,\n): InsertEdgeParams {\n const insertParams: {\n graphId: string;\n id: string;\n kind: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n graphId,\n id,\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n props,\n };\n if (validFrom !== undefined) insertParams.validFrom = validFrom;\n if (validTo !== undefined) insertParams.validTo = validTo;\n return insertParams;\n}\n\nfunction incrementPendingCount(counts: Map<string, number>, key: string): void {\n const previous = counts.get(key) ?? 0;\n counts.set(key, previous + 1);\n}\n\nfunction createEdgeBatchValidationBackend(\n backend: GraphBackend | TransactionBackend,\n): Readonly<{\n backend: GraphBackend | TransactionBackend;\n registerPendingEdgeForCardinality: (\n insertParams: InsertEdgeParams,\n cardinality: Cardinality,\n ) => void;\n}> {\n const endpointCache = new Map<\n string,\n Awaited<ReturnType<GraphBackend[\"getNode\"]>>\n >();\n const countEdgesFromCache = new Map<string, number>();\n const edgeExistsCache = new Map<string, boolean>();\n const pendingOneCounts = new Map<string, number>();\n const pendingOneActiveCounts = new Map<string, number>();\n const pendingUniquePairs = new Set<string>();\n\n async function getNodeCached(\n graphId: string,\n kind: string,\n id: string,\n ): Promise<Awaited<ReturnType<GraphBackend[\"getNode\"]>>> {\n const cacheKey = buildEdgeEndpointCacheKey(graphId, kind, id);\n if (endpointCache.has(cacheKey)) {\n return endpointCache.get(cacheKey);\n }\n const node = await backend.getNode(graphId, kind, id);\n endpointCache.set(cacheKey, node);\n return node;\n }\n\n async function countEdgesFromCached(\n params: Parameters<GraphBackend[\"countEdgesFrom\"]>[0],\n ): Promise<number> {\n const cacheKey = buildCountEdgesFromCacheKey(params);\n let baseCount = countEdgesFromCache.get(cacheKey);\n if (baseCount === undefined) {\n baseCount = await backend.countEdgesFrom(params);\n countEdgesFromCache.set(cacheKey, baseCount);\n }\n const pendingKey = buildEdgeFromCacheKey(\n params.graphId,\n params.edgeKind,\n params.fromKind,\n params.fromId,\n );\n const pendingCount =\n params.activeOnly === true ?\n (pendingOneActiveCounts.get(pendingKey) ?? 0)\n : (pendingOneCounts.get(pendingKey) ?? 0);\n return baseCount + pendingCount;\n }\n\n async function edgeExistsBetweenCached(\n params: Parameters<GraphBackend[\"edgeExistsBetween\"]>[0],\n ): Promise<boolean> {\n const cacheKey = buildEdgeBetweenCacheKey(\n params.graphId,\n params.edgeKind,\n params.fromKind,\n params.fromId,\n params.toKind,\n params.toId,\n );\n if (pendingUniquePairs.has(cacheKey)) {\n return true;\n }\n if (edgeExistsCache.has(cacheKey)) {\n return edgeExistsCache.get(cacheKey) ?? false;\n }\n const exists = await backend.edgeExistsBetween(params);\n edgeExistsCache.set(cacheKey, exists);\n return exists;\n }\n\n function registerPendingEdgeForCardinality(\n insertParams: InsertEdgeParams,\n cardinality: Cardinality,\n ): void {\n const fromCacheKey = buildEdgeFromCacheKey(\n insertParams.graphId,\n insertParams.kind,\n insertParams.fromKind,\n insertParams.fromId,\n );\n if (cardinality === \"one\") {\n incrementPendingCount(pendingOneCounts, fromCacheKey);\n return;\n }\n if (cardinality === \"oneActive\") {\n if (insertParams.validTo === undefined) {\n incrementPendingCount(pendingOneActiveCounts, fromCacheKey);\n }\n return;\n }\n if (cardinality === \"unique\") {\n const uniqueCacheKey = buildEdgeBetweenCacheKey(\n insertParams.graphId,\n insertParams.kind,\n insertParams.fromKind,\n insertParams.fromId,\n insertParams.toKind,\n insertParams.toId,\n );\n pendingUniquePairs.add(uniqueCacheKey);\n }\n }\n\n // Override specific methods on the backend for validation caching.\n // The cast is necessary because spreading a union type (GraphBackend | TransactionBackend)\n // produces an intersection of their members, which TypeScript can't narrow back to the union.\n const validationBackend = {\n ...backend,\n getNode: getNodeCached,\n countEdgesFrom: countEdgesFromCached,\n edgeExistsBetween: edgeExistsBetweenCached,\n } as GraphBackend | TransactionBackend;\n\n return {\n backend: validationBackend,\n registerPendingEdgeForCardinality,\n };\n}\n\nasync function validateAndPrepareEdgeCreate<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: CreateEdgeInput,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<EdgeCreatePrepared> {\n const kind = input.kind;\n const fromKind = input.fromKind;\n const toKind = input.toKind;\n\n // Validate kind exists and get registration\n const registration = getEdgeRegistration(ctx.graph, kind);\n const edgeKind = registration.type;\n\n // Validate endpoint types\n const endpointError = validateEdgeEndpoints(\n kind,\n fromKind,\n toKind,\n registration,\n ctx.registry,\n );\n if (endpointError) throw endpointError;\n\n // Validate source node exists\n const fromNode = await backend.getNode(ctx.graphId, fromKind, input.fromId);\n if (!fromNode || fromNode.deleted_at) {\n throw new EndpointNotFoundError({\n edgeKind: kind,\n endpoint: \"from\",\n nodeKind: fromKind,\n nodeId: input.fromId,\n });\n }\n\n // Validate target node exists\n const toNode = await backend.getNode(ctx.graphId, toKind, input.toId);\n if (!toNode || toNode.deleted_at) {\n throw new EndpointNotFoundError({\n edgeKind: kind,\n endpoint: \"to\",\n nodeKind: toKind,\n nodeId: input.toId,\n });\n }\n\n // Validate props with full context\n const validatedProps = validateEdgeProps(edgeKind.schema, input.props, {\n kind,\n operation: \"create\",\n });\n\n // Validate temporal fields\n const validFrom = validateOptionalIsoDate(input.validFrom, \"validFrom\");\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Check cardinality constraints\n const cardinality = registration.cardinality ?? \"many\";\n const constraintContext: ConstraintContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await checkCardinalityConstraint(\n constraintContext,\n kind,\n cardinality,\n fromKind,\n input.fromId,\n toKind,\n input.toId,\n validTo,\n );\n\n return {\n cardinality,\n insertParams: buildInsertEdgeParams(\n ctx.graphId,\n id,\n kind,\n fromKind,\n input.fromId,\n toKind,\n input.toId,\n validatedProps,\n validFrom,\n validTo,\n ),\n };\n}\n\n// ============================================================\n// Edge Operations\n// ============================================================\n\n/**\n * Executes an edge create operation.\n */\nasync function executeEdgeCreateInternal<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ returnRow?: boolean }>,\n): Promise<Edge | undefined> {\n const kind = input.kind;\n const id = input.id ?? generateId();\n const opContext = ctx.createOperationContext(\"create\", \"edge\", kind, id);\n const shouldReturnRow = options?.returnRow ?? true;\n\n return ctx.withOperationHooks(opContext, async () => {\n const prepared = await validateAndPrepareEdgeCreate(\n ctx,\n input,\n id,\n backend,\n );\n\n let row: BackendEdgeRow | undefined;\n if (shouldReturnRow) {\n row = await backend.insertEdge(prepared.insertParams);\n } else {\n await (backend.insertEdgeNoReturn?.(prepared.insertParams) ??\n backend.insertEdge(prepared.insertParams));\n }\n\n if (row === undefined) return;\n return rowToEdge(row);\n });\n}\n\n/**\n * Executes an edge create operation and returns the created edge.\n */\nexport async function executeEdgeCreate<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n): Promise<Edge> {\n const result = await executeEdgeCreateInternal(ctx, input, backend, {\n returnRow: true,\n });\n if (!result) {\n throw new DatabaseOperationError(\n \"Edge create failed: expected created edge row\",\n { operation: \"insert\", entity: \"edge\" },\n );\n }\n return result;\n}\n\n/**\n * Executes an edge create operation without returning the created edge payload.\n */\nexport async function executeEdgeCreateNoReturn<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n await executeEdgeCreateInternal(ctx, input, backend, { returnRow: false });\n}\n\n/**\n * Executes batched edge creates without returning inserted edge payloads.\n *\n * Note: `withOperationHooks` is intentionally skipped for batch throughput.\n * Per-item hooks would negate the performance benefit of batching.\n */\nexport async function executeEdgeCreateNoReturnBatch<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n if (inputs.length === 0) {\n return;\n }\n\n const { backend: validationBackend, registerPendingEdgeForCardinality } =\n createEdgeBatchValidationBackend(backend);\n const preparedCreates: EdgeCreatePrepared[] = [];\n\n for (const input of inputs) {\n const id = input.id ?? generateId();\n const prepared = await validateAndPrepareEdgeCreate(\n ctx,\n input,\n id,\n validationBackend,\n );\n preparedCreates.push(prepared);\n registerPendingEdgeForCardinality(\n prepared.insertParams,\n prepared.cardinality,\n );\n }\n\n const batchInsertParams = preparedCreates.map(\n (prepared) => prepared.insertParams,\n );\n if (backend.insertEdgesBatch === undefined) {\n for (const insertParams of batchInsertParams) {\n await (backend.insertEdgeNoReturn?.(insertParams) ??\n backend.insertEdge(insertParams));\n }\n return;\n }\n await backend.insertEdgesBatch(batchInsertParams);\n}\n\n/**\n * Executes batched edge creates and returns the inserted edge payloads.\n *\n * Uses batch validation caching and a single multi-row INSERT with RETURNING\n * when the backend supports it. Falls back to sequential inserts otherwise.\n *\n * Note: `withOperationHooks` is intentionally skipped for batch throughput.\n * Per-item hooks would negate the performance benefit of batching.\n */\nexport async function executeEdgeCreateBatch<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n): Promise<readonly Edge[]> {\n if (inputs.length === 0) {\n return [];\n }\n\n const { backend: validationBackend, registerPendingEdgeForCardinality } =\n createEdgeBatchValidationBackend(backend);\n const preparedCreates: EdgeCreatePrepared[] = [];\n\n for (const input of inputs) {\n const id = input.id ?? generateId();\n const prepared = await validateAndPrepareEdgeCreate(\n ctx,\n input,\n id,\n validationBackend,\n );\n preparedCreates.push(prepared);\n registerPendingEdgeForCardinality(\n prepared.insertParams,\n prepared.cardinality,\n );\n }\n\n const batchInsertParams = preparedCreates.map(\n (prepared) => prepared.insertParams,\n );\n\n let rows: readonly BackendEdgeRow[];\n if (backend.insertEdgesBatchReturning === undefined) {\n const sequentialRows: BackendEdgeRow[] = [];\n for (const insertParams of batchInsertParams) {\n sequentialRows.push(await backend.insertEdge(insertParams));\n }\n rows = sequentialRows;\n } else {\n rows = await backend.insertEdgesBatchReturning(batchInsertParams);\n }\n\n return rows.map((row) => rowToEdge(row));\n}\n\n/**\n * Executes an edge update operation.\n */\nexport async function executeEdgeUpdate<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n): Promise<Edge> {\n const id = input.id;\n\n // Get existing edge first to get the kind for the hook context\n const existing = await backend.getEdge(ctx.graphId, id);\n if (!existing || existing.deleted_at) {\n throw new EdgeNotFoundError(\"unknown\", id);\n }\n\n const opContext = ctx.createOperationContext(\n \"update\",\n \"edge\",\n existing.kind,\n id,\n );\n\n return ctx.withOperationHooks(opContext, async () => {\n // Get registration for schema validation\n const registration = getEdgeRegistration(ctx.graph, existing.kind);\n const edgeKind = registration.type;\n\n // Merge props\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n const mergedProps = { ...existingProps, ...input.props };\n\n // Validate merged props with full context\n const validatedProps = validateEdgeProps(edgeKind.schema, mergedProps, {\n kind: existing.kind,\n operation: \"update\",\n id,\n });\n\n // Validate temporal fields\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Update edge - conditionally include optional fields\n const updateParams: {\n graphId: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n } = {\n graphId: ctx.graphId,\n id,\n props: validatedProps,\n };\n if (validTo !== undefined) updateParams.validTo = validTo;\n\n const row = await backend.updateEdge(updateParams);\n\n return rowToEdge(row);\n });\n}\n\n/**\n * Executes an edge update for upsert — bypasses the soft-delete check\n * and optionally clears `deleted_at`.\n */\nexport async function executeEdgeUpsertUpdate<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n): Promise<Edge> {\n const id = input.id;\n\n const existing = await backend.getEdge(ctx.graphId, id);\n if (!existing) {\n throw new EdgeNotFoundError(\"unknown\", id);\n }\n\n const registration = getEdgeRegistration(ctx.graph, existing.kind);\n const edgeKind = registration.type;\n\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n const mergedProps = { ...existingProps, ...input.props };\n\n const validatedProps = validateEdgeProps(edgeKind.schema, mergedProps, {\n kind: existing.kind,\n operation: \"update\",\n id,\n });\n\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n const updateParams: {\n graphId: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n clearDeleted?: boolean;\n } = {\n graphId: ctx.graphId,\n id,\n props: validatedProps,\n };\n if (validTo !== undefined) updateParams.validTo = validTo;\n if (options?.clearDeleted) updateParams.clearDeleted = true;\n\n const row = await backend.updateEdge(updateParams);\n\n return rowToEdge(row);\n}\n\n/**\n * Executes an edge delete operation.\n */\nexport async function executeEdgeDelete<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n // Get edge first to know the kind for the hook context\n const existing = await backend.getEdge(ctx.graphId, id);\n if (!existing || existing.deleted_at) {\n // Already deleted - nothing to do\n return;\n }\n\n const opContext = ctx.createOperationContext(\n \"delete\",\n \"edge\",\n existing.kind,\n id,\n );\n\n return ctx.withOperationHooks(opContext, async () => {\n await backend.deleteEdge({\n graphId: ctx.graphId,\n id,\n });\n });\n}\n\n/**\n * Executes an edge hard delete operation (permanent removal).\n *\n * Unlike soft delete, this permanently removes the edge from the database.\n */\nexport async function executeEdgeHardDelete<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n // Get edge first to know the kind for the hook context\n const existing = await backend.getEdge(ctx.graphId, id);\n if (!existing) {\n // Doesn't exist - nothing to do\n return;\n }\n\n const opContext = ctx.createOperationContext(\n \"delete\",\n \"edge\",\n existing.kind,\n id,\n );\n\n return ctx.withOperationHooks(opContext, async () => {\n await backend.hardDeleteEdge({\n graphId: ctx.graphId,\n id,\n });\n });\n}\n\n// ============================================================\n// Get-Or-Create Operations\n// ============================================================\n\n// Delimiters for composite match keys\nconst RECORD_SEP = \"\\u001E\";\nconst UNIT_SEP = \"\\u001F\";\nconst UNDEFINED_SENTINEL = \"\\u001D\";\n\n/**\n * Validates that all `matchOn` fields exist in the edge schema shape.\n * Throws a ValidationError for invalid fields.\n */\nfunction validateMatchOnFields(\n schema: { shape?: Record<string, unknown> },\n matchOn: readonly string[],\n edgeKind: string,\n): void {\n if (matchOn.length === 0) return;\n const shape = schema.shape;\n if (shape === undefined) {\n throw new ValidationError(\n `Edge kind \"${edgeKind}\" has no schema shape to validate matchOn fields against`,\n {\n kind: edgeKind,\n operation: \"create\",\n issues: matchOn.map((field) => ({\n path: field,\n message: `Field \"${field}\" does not exist in edge schema`,\n })),\n },\n );\n }\n\n const invalidFields = matchOn.filter((field) => !(field in shape));\n if (invalidFields.length > 0) {\n throw new ValidationError(\n `Invalid matchOn fields for edge kind \"${edgeKind}\": ${invalidFields.join(\", \")}`,\n {\n kind: edgeKind,\n operation: \"create\",\n issues: invalidFields.map((field) => ({\n path: field,\n message: `Field \"${field}\" does not exist in edge schema`,\n })),\n },\n );\n }\n}\n\n/**\n * Serializes a value for composite key construction.\n * Sorts object keys for deterministic ordering of nested values.\n */\nfunction stableStringify(value: unknown): string {\n if (value === undefined) return UNDEFINED_SENTINEL;\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n const sorted = Object.keys(value as Record<string, unknown>).toSorted();\n const entries = sorted.map(\n (key) =>\n `${JSON.stringify(key)}:${stableStringify((value as Record<string, unknown>)[key])}`,\n );\n return `{${entries.join(\",\")}}`;\n}\n\n/**\n * Builds a deterministic composite key for edge matching.\n *\n * Format: `fromKind\\u001EfromId\\u001EtoKind\\u001EtoId[\\u001Efield\\u001Fvalue]*`\n */\nfunction buildEdgeCompositeKey(\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n props: Record<string, unknown>,\n matchOn: readonly string[],\n): string {\n const endpointPart = `${fromKind}${RECORD_SEP}${fromId}${RECORD_SEP}${toKind}${RECORD_SEP}${toId}`;\n if (matchOn.length === 0) return endpointPart;\n\n const sortedFields = [...matchOn].toSorted();\n const propertyParts = sortedFields.map(\n (field) =>\n `${RECORD_SEP}${field}${UNIT_SEP}${stableStringify(props[field])}`,\n );\n return endpointPart + propertyParts.join(\"\");\n}\n\n/**\n * Endpoint-only key for grouping findEdgesByKind queries.\n */\nfunction buildEndpointPairKey(\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n): string {\n return `${fromKind}${RECORD_SEP}${fromId}${RECORD_SEP}${toKind}${RECORD_SEP}${toId}`;\n}\n\ntype EdgeMatch = Readonly<{\n liveRow: BackendEdgeRow | undefined;\n deletedRow: BackendEdgeRow | undefined;\n}>;\n\n/**\n * Finds the best matching edge from candidate rows.\n * Partitions into live vs deleted; prefers live.\n */\nfunction findMatchingEdge(\n rows: readonly BackendEdgeRow[],\n matchOn: readonly string[],\n inputProps: Record<string, unknown>,\n): EdgeMatch {\n let liveRow: BackendEdgeRow | undefined;\n let deletedRow: BackendEdgeRow | undefined;\n\n for (const row of rows) {\n if (matchOn.length > 0) {\n const rowProps = JSON.parse(row.props) as Record<string, unknown>;\n const matches = matchOn.every(\n (field) =>\n stableStringify(rowProps[field]) ===\n stableStringify(inputProps[field]),\n );\n if (!matches) continue;\n }\n\n if (row.deleted_at === undefined) {\n liveRow ??= row;\n } else {\n deletedRow ??= row;\n }\n\n if (liveRow !== undefined) break;\n }\n\n return { liveRow, deletedRow };\n}\n\n/**\n * Executes a single findByEndpoints operation.\n *\n * Looks up a live edge by endpoints and optional matchOn fields.\n * Returns the edge if found, or undefined. Soft-deleted edges are excluded.\n */\nexport async function executeEdgeFindByEndpoints<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n props?: Record<string, unknown>;\n }>,\n): Promise<Edge | undefined> {\n const matchOn = options?.matchOn ?? [];\n const props = options?.props ?? {};\n\n const registration = getEdgeRegistration(ctx.graph, kind);\n const edgeKind = registration.type;\n\n if (matchOn.length > 0) {\n validateMatchOnFields(edgeKind.schema, matchOn, kind);\n }\n\n const candidateRows = await backend.findEdgesByKind({\n graphId: ctx.graphId,\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n excludeDeleted: true,\n });\n\n if (candidateRows.length === 0) return undefined;\n\n if (matchOn.length === 0) return rowToEdge(candidateRows[0]!);\n\n const { liveRow } = findMatchingEdge(candidateRows, matchOn, props);\n return liveRow === undefined ? undefined : rowToEdge(liveRow);\n}\n\n/**\n * Executes a single getOrCreateByEndpoints operation.\n */\nexport async function executeEdgeGetOrCreateByEndpoints<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n): Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>> {\n const ifExists = options?.ifExists ?? \"return\";\n const matchOn = options?.matchOn ?? [];\n\n const registration = getEdgeRegistration(ctx.graph, kind);\n const edgeKind = registration.type;\n\n // Validate props\n const validatedProps = validateEdgeProps(edgeKind.schema, props, {\n kind,\n operation: \"create\",\n });\n\n // Validate matchOn fields\n validateMatchOnFields(edgeKind.schema, matchOn, kind);\n\n // Query all edges of this kind between (from, to) including tombstones\n const candidateRows = await backend.findEdgesByKind({\n graphId: ctx.graphId,\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n excludeDeleted: false,\n temporalMode: \"includeTombstones\",\n });\n\n const { liveRow, deletedRow } = findMatchingEdge(\n candidateRows,\n matchOn,\n validatedProps,\n );\n\n // No match → create new edge\n if (liveRow === undefined && deletedRow === undefined) {\n const input: CreateEdgeInput = {\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n props: validatedProps,\n };\n const edge = await executeEdgeCreate(ctx, input, backend);\n return { edge, action: \"created\" };\n }\n\n // Live match found\n if (liveRow !== undefined) {\n if (ifExists === \"return\") {\n return { edge: rowToEdge(liveRow), action: \"found\" };\n }\n // ifExists === \"update\"\n const edge = await executeEdgeUpsertUpdate(\n ctx,\n { id: liveRow.id, props: validatedProps },\n backend,\n );\n return { edge, action: \"updated\" };\n }\n\n // Deleted match only → check cardinality before resurrect\n const cardinality = registration.cardinality ?? \"many\";\n // deletedRow is guaranteed defined here because we checked both undefined above\n const matchedDeletedRow = deletedRow!;\n const effectiveValidTo = matchedDeletedRow.valid_to;\n const constraintContext: ConstraintContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await checkCardinalityConstraint(\n constraintContext,\n kind,\n cardinality,\n fromKind,\n fromId,\n toKind,\n toId,\n effectiveValidTo,\n );\n\n const edge = await executeEdgeUpsertUpdate(\n ctx,\n { id: matchedDeletedRow.id, props: validatedProps },\n backend,\n { clearDeleted: true },\n );\n return { edge, action: \"resurrected\" };\n}\n\n/**\n * Executes a bulk getOrCreateByEndpoints operation.\n */\nexport async function executeEdgeBulkGetOrCreateByEndpoints<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n kind: string,\n items: readonly Readonly<{\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n }>[],\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n): Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>[]> {\n if (items.length === 0) return [];\n\n const ifExists = options?.ifExists ?? \"return\";\n const matchOn = options?.matchOn ?? [];\n\n const registration = getEdgeRegistration(ctx.graph, kind);\n const edgeKind = registration.type;\n const cardinality = registration.cardinality ?? \"many\";\n\n // Validate matchOn fields once\n validateMatchOnFields(edgeKind.schema, matchOn, kind);\n\n // Step 1: Validate all props and compute composite keys\n const validated: {\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n validatedProps: Record<string, unknown>;\n compositeKey: string;\n endpointKey: string;\n }[] = [];\n\n for (const item of items) {\n const validatedProps = validateEdgeProps(edgeKind.schema, item.props, {\n kind,\n operation: \"create\",\n });\n\n const compositeKey = buildEdgeCompositeKey(\n item.fromKind,\n item.fromId,\n item.toKind,\n item.toId,\n validatedProps,\n matchOn,\n );\n const endpointKey = buildEndpointPairKey(\n item.fromKind,\n item.fromId,\n item.toKind,\n item.toId,\n );\n\n validated.push({\n fromKind: item.fromKind,\n fromId: item.fromId,\n toKind: item.toKind,\n toId: item.toId,\n validatedProps,\n compositeKey,\n endpointKey,\n });\n }\n\n // Step 2: Group by unique endpoint pair and query edges\n const uniqueEndpoints = new Map<\n string,\n { fromKind: string; fromId: string; toKind: string; toId: string }\n >();\n for (const entry of validated) {\n if (!uniqueEndpoints.has(entry.endpointKey)) {\n uniqueEndpoints.set(entry.endpointKey, {\n fromKind: entry.fromKind,\n fromId: entry.fromId,\n toKind: entry.toKind,\n toId: entry.toId,\n });\n }\n }\n\n // Fetch all candidate rows, grouped by endpoint pair\n const rowsByEndpoint = new Map<string, readonly BackendEdgeRow[]>();\n for (const [endpointKey, endpoint] of uniqueEndpoints) {\n const rows = await backend.findEdgesByKind({\n graphId: ctx.graphId,\n kind,\n fromKind: endpoint.fromKind,\n fromId: endpoint.fromId,\n toKind: endpoint.toKind,\n toId: endpoint.toId,\n excludeDeleted: false,\n temporalMode: \"includeTombstones\",\n });\n rowsByEndpoint.set(endpointKey, rows);\n }\n\n // Step 3: Partition into toCreate, toFetch, and duplicates\n interface CreateEntry {\n index: number;\n input: CreateEdgeInput;\n }\n interface FetchEntry {\n index: number;\n row: BackendEdgeRow;\n isDeleted: boolean;\n validatedProps: Record<string, unknown>;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n }\n\n const toCreate: CreateEntry[] = [];\n const toFetch: FetchEntry[] = [];\n const duplicateOf: { index: number; sourceIndex: number }[] = [];\n const seenKeys = new Map<string, number>();\n\n for (const [index, entry] of validated.entries()) {\n // Check within-batch duplicate\n const previousIndex = seenKeys.get(entry.compositeKey);\n if (previousIndex !== undefined) {\n duplicateOf.push({ index, sourceIndex: previousIndex });\n continue;\n }\n seenKeys.set(entry.compositeKey, index);\n\n const candidateRows = rowsByEndpoint.get(entry.endpointKey) ?? [];\n const { liveRow, deletedRow } = findMatchingEdge(\n candidateRows,\n matchOn,\n entry.validatedProps,\n );\n\n if (liveRow === undefined && deletedRow === undefined) {\n toCreate.push({\n index,\n input: {\n kind,\n fromKind: entry.fromKind,\n fromId: entry.fromId,\n toKind: entry.toKind,\n toId: entry.toId,\n props: entry.validatedProps,\n },\n });\n } else {\n const bestRow = liveRow ?? deletedRow!;\n toFetch.push({\n index,\n row: bestRow,\n isDeleted: liveRow === undefined,\n validatedProps: entry.validatedProps,\n fromKind: entry.fromKind,\n fromId: entry.fromId,\n toKind: entry.toKind,\n toId: entry.toId,\n });\n }\n }\n\n interface Result {\n readonly edge: Edge;\n readonly action: GetOrCreateAction;\n }\n const results: Result[] = Array.from({ length: items.length });\n\n // Step 4: Execute creates in batch\n if (toCreate.length > 0) {\n const createInputs = toCreate.map((entry) => entry.input);\n const createdEdges = await executeEdgeCreateBatch(\n ctx,\n createInputs,\n backend,\n );\n for (const [batchIndex, entry] of toCreate.entries()) {\n results[entry.index] = {\n edge: createdEdges[batchIndex]!,\n action: \"created\",\n };\n }\n }\n\n // Step 5: Handle existing edges (update/skip/resurrect)\n for (const entry of toFetch) {\n if (entry.isDeleted) {\n // Check cardinality before resurrect\n const effectiveValidTo = entry.row.valid_to;\n const constraintContext: ConstraintContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await checkCardinalityConstraint(\n constraintContext,\n kind,\n cardinality,\n entry.fromKind,\n entry.fromId,\n entry.toKind,\n entry.toId,\n effectiveValidTo,\n );\n\n const edge = await executeEdgeUpsertUpdate(\n ctx,\n { id: entry.row.id, props: entry.validatedProps },\n backend,\n { clearDeleted: true },\n );\n results[entry.index] = { edge, action: \"resurrected\" };\n } else if (ifExists === \"update\") {\n const edge = await executeEdgeUpsertUpdate(\n ctx,\n { id: entry.row.id, props: entry.validatedProps },\n backend,\n );\n results[entry.index] = { edge, action: \"updated\" };\n } else {\n results[entry.index] = { edge: rowToEdge(entry.row), action: \"found\" };\n }\n }\n\n // Step 6: Resolve within-batch duplicates\n for (const { index, sourceIndex } of duplicateOf) {\n const sourceResult = results[sourceIndex]!;\n results[index] = { edge: sourceResult.edge, action: \"found\" };\n }\n\n return results;\n}\n","/**\n * Embedding Sync Utilities\n *\n * Handles automatic synchronization of embedding fields with the embeddings table.\n * When nodes with embedding properties are created, updated, or deleted,\n * these utilities ensure the embeddings table stays in sync.\n */\nimport { type z } from \"zod\";\n\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport { getEmbeddingDimensions, isEmbeddingSchema } from \"../core/embedding\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Information about an embedding field in a node schema.\n */\ntype EmbeddingFieldInfo = Readonly<{\n /** The field path (e.g., \"embedding\" or \"contentEmbedding\") */\n fieldPath: string;\n /** The number of dimensions for this embedding */\n dimensions: number;\n}>;\n\n/**\n * Context for embedding sync operations.\n */\nexport type EmbeddingSyncContext = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n backend: GraphBackend | TransactionBackend;\n}>;\n\n// ============================================================\n// Schema Introspection\n// ============================================================\n\n/**\n * Extracts embedding field information from a Zod schema.\n * Returns all embedding fields found at the top level of an object schema.\n */\nexport function getEmbeddingFields(\n schema: z.ZodType,\n): readonly EmbeddingFieldInfo[] {\n // Check if schema is an object type\n if (schema.type !== \"object\") {\n return [];\n }\n\n const def = schema.def as { shape?: Record<string, z.ZodType> };\n const shape = def.shape;\n if (!shape) {\n return [];\n }\n\n const fields: EmbeddingFieldInfo[] = [];\n\n for (const [fieldPath, fieldSchema] of Object.entries(shape)) {\n // Check if this field is an embedding (possibly wrapped in optional/nullable)\n const dimensions = getEmbeddingDimensionsFromField(fieldSchema);\n if (dimensions !== undefined) {\n fields.push({ fieldPath, dimensions });\n }\n }\n\n return fields;\n}\n\n/**\n * Gets embedding dimensions from a field schema, handling wrappers like optional/nullable.\n */\nfunction getEmbeddingDimensionsFromField(\n schema: z.ZodType,\n): number | undefined {\n // Check the schema directly\n const directDimensions = getEmbeddingDimensions(schema);\n if (directDimensions !== undefined) {\n return directDimensions;\n }\n\n // Check if it's wrapped (optional, nullable, default, etc.)\n const unwrapped = unwrapToEmbedding(schema);\n if (unwrapped) {\n return getEmbeddingDimensions(unwrapped);\n }\n\n return undefined;\n}\n\n/**\n * Unwraps wrapper types to find an embedding schema.\n */\nfunction unwrapToEmbedding(schema: z.ZodType): z.ZodType | undefined {\n const type = schema.type;\n const def = schema.def as { innerType?: z.ZodType };\n\n // Handle common wrapper types\n if (\n (type === \"optional\" ||\n type === \"nullable\" ||\n type === \"default\" ||\n type === \"readonly\") &&\n def.innerType\n ) {\n // Check if inner type is an embedding\n if (isEmbeddingSchema(def.innerType)) {\n return def.innerType;\n }\n // Recursively unwrap\n return unwrapToEmbedding(def.innerType);\n }\n\n return undefined;\n}\n\n// ============================================================\n// Embedding Sync Operations\n// ============================================================\n\n/**\n * Syncs embeddings after a node create or update operation.\n *\n * For each embedding field in the schema:\n * - If the props contain an embedding value, upsert it to the embeddings table\n * - If the props don't contain an embedding value (undefined), delete any existing embedding\n */\nexport async function syncEmbeddings(\n ctx: EmbeddingSyncContext,\n schema: z.ZodType,\n props: Record<string, unknown>,\n): Promise<void> {\n const { backend } = ctx;\n\n // Check if backend supports embedding operations\n if (!backend.upsertEmbedding || !backend.deleteEmbedding) {\n return;\n }\n\n const embeddingFields = getEmbeddingFields(schema);\n if (embeddingFields.length === 0) {\n return;\n }\n\n for (const field of embeddingFields) {\n const value = props[field.fieldPath];\n\n if (isValidEmbeddingValue(value)) {\n // Upsert the embedding\n await backend.upsertEmbedding({\n graphId: ctx.graphId,\n nodeKind: ctx.nodeKind,\n nodeId: ctx.nodeId,\n fieldPath: field.fieldPath,\n embedding: value,\n dimensions: field.dimensions,\n });\n } else if (value === undefined) {\n // Delete any existing embedding for this field\n await backend.deleteEmbedding({\n graphId: ctx.graphId,\n nodeKind: ctx.nodeKind,\n nodeId: ctx.nodeId,\n fieldPath: field.fieldPath,\n });\n }\n // If value is null or invalid, skip (validation should have caught this)\n }\n}\n\n/**\n * Deletes all embeddings for a node.\n */\nexport async function deleteNodeEmbeddings(\n ctx: EmbeddingSyncContext,\n schema: z.ZodType,\n): Promise<void> {\n const { backend } = ctx;\n\n // Check if backend supports embedding operations\n if (!backend.deleteEmbedding) {\n return;\n }\n\n const embeddingFields = getEmbeddingFields(schema);\n if (embeddingFields.length === 0) {\n return;\n }\n\n for (const field of embeddingFields) {\n await backend.deleteEmbedding({\n graphId: ctx.graphId,\n nodeKind: ctx.nodeKind,\n nodeId: ctx.nodeId,\n fieldPath: field.fieldPath,\n });\n }\n}\n\n// ============================================================\n// Validation Helpers\n// ============================================================\n\n/**\n * Checks if a value is a valid embedding (array of numbers).\n */\nfunction isValidEmbeddingValue(value: unknown): value is readonly number[] {\n if (!Array.isArray(value)) {\n return false;\n }\n return value.every((n) => typeof n === \"number\" && Number.isFinite(n));\n}\n","/**\n * Uniqueness Constraint Management\n *\n * Handles checking, inserting, updating, and deleting uniqueness constraint entries.\n */\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport {\n checkWherePredicate,\n computeUniqueKey,\n getKindsForUniquenessCheck,\n} from \"../constraints\";\nimport { type UniqueConstraint } from \"../core/types\";\nimport { UniquenessError } from \"../errors\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\n\n/**\n * Context for uniqueness operations.\n */\nexport type UniquenessContext = Readonly<{\n graphId: string;\n registry: KindRegistry;\n backend: GraphBackend | TransactionBackend;\n}>;\n\n/**\n * Checks uniqueness constraints for a new or existing node.\n *\n * @throws ValidationError if any constraint is violated\n */\nexport async function checkUniquenessConstraints(\n ctx: UniquenessContext,\n kind: string,\n id: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n if (!checkWherePredicate(constraint, props)) {\n continue;\n }\n\n const key = computeUniqueKey(\n props,\n constraint.fields,\n constraint.collation,\n );\n\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n for (const kindToCheck of kindsToCheck) {\n const existing = await ctx.backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key,\n });\n\n if (existing && existing.node_id !== id) {\n throw new UniquenessError({\n constraintName: constraint.name,\n kind: kindToCheck,\n existingId: existing.node_id,\n newId: id,\n fields: constraint.fields,\n });\n }\n }\n }\n}\n\n/**\n * Inserts uniqueness entries for a newly created node.\n */\nexport async function insertUniquenessEntries(\n ctx: UniquenessContext,\n kind: string,\n id: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n if (!checkWherePredicate(constraint, props)) {\n continue;\n }\n\n const key = computeUniqueKey(\n props,\n constraint.fields,\n constraint.collation,\n );\n\n await ctx.backend.insertUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key,\n nodeId: id,\n concreteKind: kind,\n });\n }\n}\n\n/**\n * Deletes uniqueness entries for a node being deleted.\n */\nexport async function deleteUniquenessEntries(\n ctx: UniquenessContext,\n kind: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n if (!checkWherePredicate(constraint, props)) {\n continue;\n }\n\n const key = computeUniqueKey(\n props,\n constraint.fields,\n constraint.collation,\n );\n\n await ctx.backend.deleteUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key,\n });\n }\n}\n\n/**\n * Updates uniqueness entries when a node's props change.\n * Handles cases where:\n * - Constraint now applies (wasn't before)\n * - Constraint no longer applies (was before)\n * - Key value changed\n *\n * @throws ValidationError if updated value violates a constraint\n */\nexport async function updateUniquenessEntries(\n ctx: UniquenessContext,\n kind: string,\n id: string,\n oldProps: Record<string, unknown>,\n newProps: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n const oldApplies = checkWherePredicate(constraint, oldProps);\n const newApplies = checkWherePredicate(constraint, newProps);\n\n const oldKey =\n oldApplies ?\n computeUniqueKey(oldProps, constraint.fields, constraint.collation)\n : undefined;\n const newKey =\n newApplies ?\n computeUniqueKey(newProps, constraint.fields, constraint.collation)\n : undefined;\n\n // No change - constraint didn't apply and still doesn't\n if (!oldApplies && !newApplies) {\n continue;\n }\n\n // Keys are the same and constraint still applies - nothing to do\n if (oldApplies && newApplies && oldKey === newKey) {\n continue;\n }\n\n // Delete old entry if constraint used to apply\n if (oldApplies && oldKey !== undefined) {\n await ctx.backend.deleteUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key: oldKey,\n });\n }\n\n // Check and insert new entry if constraint now applies\n if (newApplies && newKey !== undefined) {\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n // Check for conflicts with other nodes\n for (const kindToCheck of kindsToCheck) {\n const existing = await ctx.backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key: newKey,\n });\n\n if (existing && existing.node_id !== id) {\n throw new UniquenessError({\n constraintName: constraint.name,\n kind: kindToCheck,\n existingId: existing.node_id,\n newId: id,\n fields: constraint.fields,\n });\n }\n }\n\n // Insert new uniqueness entry\n await ctx.backend.insertUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key: newKey,\n nodeId: id,\n concreteKind: kind,\n });\n }\n }\n}\n","/**\n * Node Operations for Store\n *\n * Handles node CRUD operations: create, update, delete.\n */\nimport {\n type GraphBackend,\n type InsertNodeParams,\n type NodeRow as BackendNodeRow,\n type TransactionBackend,\n type UniqueRow,\n} from \"../../backend/types\";\nimport {\n checkWherePredicate,\n computeUniqueKey,\n getKindsForUniquenessCheck,\n} from \"../../constraints\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type NodeType, type UniqueConstraint } from \"../../core/types\";\nimport {\n DatabaseOperationError,\n KindNotFoundError,\n NodeConstraintNotFoundError,\n NodeNotFoundError,\n RestrictedDeleteError,\n ValidationError,\n} from \"../../errors\";\nimport { validateNodeProps } from \"../../errors/validation\";\nimport { type KindRegistry } from \"../../registry/kind-registry\";\nimport { validateOptionalIsoDate } from \"../../utils/date\";\nimport { generateId } from \"../../utils/id\";\nimport {\n checkDisjointnessConstraint,\n type ConstraintContext,\n} from \"../constraints\";\nimport {\n deleteNodeEmbeddings,\n type EmbeddingSyncContext,\n syncEmbeddings,\n} from \"../embedding-sync\";\nimport { rowToNode } from \"../row-mappers\";\nimport {\n type CreateNodeInput,\n type GetOrCreateAction,\n type Node,\n type NodeGetOrCreateByConstraintOptions,\n type OperationHookContext,\n type UpdateNodeInput,\n} from \"../types\";\nimport {\n checkUniquenessConstraints,\n deleteUniquenessEntries,\n insertUniquenessEntries,\n type UniquenessContext,\n updateUniquenessEntries,\n} from \"../uniqueness\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Context for node operations.\n */\nexport type NodeOperationContext<G extends GraphDef> = Readonly<{\n graph: G;\n graphId: string;\n registry: KindRegistry;\n createOperationContext: (\n operation: \"create\" | \"update\" | \"delete\",\n entity: \"node\" | \"edge\",\n kind: string,\n id: string,\n ) => OperationHookContext;\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => Promise<T>;\n}>;\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\nfunction getNodeRegistration<G extends GraphDef>(graph: G, kind: string) {\n const registration = graph.nodes[kind];\n if (registration === undefined) throw new KindNotFoundError(kind, \"node\");\n return registration;\n}\n\ntype NodeCreatePrepared = Readonly<{\n kind: string;\n id: string;\n nodeKind: NodeType;\n validatedProps: Record<string, unknown>;\n uniqueConstraints: readonly UniqueConstraint[];\n insertParams: InsertNodeParams;\n}>;\n\nfunction buildNodeCacheKey(graphId: string, kind: string, id: string): string {\n return `${graphId}\\u0000${kind}\\u0000${id}`;\n}\n\nfunction buildUniqueCacheKey(\n graphId: string,\n nodeKind: string,\n constraintName: string,\n key: string,\n): string {\n return `${graphId}\\u0000${nodeKind}\\u0000${constraintName}\\u0000${key}`;\n}\n\nfunction createNodeAlreadyExistsError(\n kind: string,\n id: string,\n): ValidationError {\n return new ValidationError(\n `Node already exists: ${kind}/${id}`,\n {\n entityType: \"node\",\n kind,\n operation: \"create\",\n id,\n issues: [{ path: \"id\", message: \"A node with this ID already exists\" }],\n },\n { suggestion: `Use a different ID or update the existing node.` },\n );\n}\n\nfunction buildInsertNodeParams(\n graphId: string,\n kind: string,\n id: string,\n props: Record<string, unknown>,\n validFrom: string | undefined,\n validTo: string | undefined,\n): InsertNodeParams {\n const insertParams: {\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n graphId,\n kind,\n id,\n props,\n };\n if (validFrom !== undefined) insertParams.validFrom = validFrom;\n if (validTo !== undefined) insertParams.validTo = validTo;\n return insertParams;\n}\n\nfunction createPendingUniqueRow(\n graphId: string,\n nodeKind: string,\n constraintName: string,\n key: string,\n nodeId: string,\n): UniqueRow {\n return {\n graph_id: graphId,\n node_kind: nodeKind,\n constraint_name: constraintName,\n key,\n node_id: nodeId,\n concrete_kind: nodeKind,\n deleted_at: undefined,\n };\n}\n\nfunction createNodeBatchValidationBackend(\n graphId: string,\n registry: KindRegistry,\n backend: GraphBackend | TransactionBackend,\n): Readonly<{\n backend: GraphBackend | TransactionBackend;\n registerPendingNode: (params: InsertNodeParams) => void;\n registerPendingUniqueEntries: (\n kind: string,\n id: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n ) => void;\n}> {\n const nodeCache = new Map<\n string,\n Awaited<ReturnType<GraphBackend[\"getNode\"]>>\n >();\n const pendingNodes = new Map<\n string,\n NonNullable<Awaited<ReturnType<GraphBackend[\"getNode\"]>>>\n >();\n const uniqueCache = new Map<\n string,\n Awaited<ReturnType<GraphBackend[\"checkUnique\"]>>\n >();\n const pendingUniqueOwners = new Map<string, string>();\n\n async function getNodeCached(\n lookupGraphId: string,\n kind: string,\n id: string,\n ): Promise<Awaited<ReturnType<GraphBackend[\"getNode\"]>>> {\n const cacheKey = buildNodeCacheKey(lookupGraphId, kind, id);\n const pendingNode = pendingNodes.get(cacheKey);\n if (pendingNode !== undefined) {\n return pendingNode;\n }\n if (nodeCache.has(cacheKey)) {\n return nodeCache.get(cacheKey);\n }\n const existing = await backend.getNode(lookupGraphId, kind, id);\n nodeCache.set(cacheKey, existing);\n return existing;\n }\n\n async function checkUniqueCached(\n params: Parameters<GraphBackend[\"checkUnique\"]>[0],\n ): Promise<Awaited<ReturnType<GraphBackend[\"checkUnique\"]>>> {\n const cacheKey = buildUniqueCacheKey(\n params.graphId,\n params.nodeKind,\n params.constraintName,\n params.key,\n );\n const pendingOwner = pendingUniqueOwners.get(cacheKey);\n if (pendingOwner !== undefined) {\n return createPendingUniqueRow(\n params.graphId,\n params.nodeKind,\n params.constraintName,\n params.key,\n pendingOwner,\n );\n }\n if (uniqueCache.has(cacheKey)) {\n return uniqueCache.get(cacheKey);\n }\n const existing = await backend.checkUnique(params);\n uniqueCache.set(cacheKey, existing);\n return existing;\n }\n\n function registerPendingNode(params: InsertNodeParams): void {\n const cacheKey = buildNodeCacheKey(params.graphId, params.kind, params.id);\n const pendingNode: NonNullable<\n Awaited<ReturnType<GraphBackend[\"getNode\"]>>\n > = {\n graph_id: params.graphId,\n kind: params.kind,\n id: params.id,\n props: JSON.stringify(params.props),\n version: 1,\n valid_from: params.validFrom,\n valid_to: params.validTo,\n created_at: \"\",\n updated_at: \"\",\n deleted_at: undefined,\n };\n pendingNodes.set(cacheKey, pendingNode);\n }\n\n function registerPendingUniqueEntries(\n kind: string,\n id: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n ): void {\n for (const constraint of constraints) {\n if (!checkWherePredicate(constraint, props)) {\n continue;\n }\n const key = computeUniqueKey(\n props,\n constraint.fields,\n constraint.collation,\n );\n const concreteEntryKey = buildUniqueCacheKey(\n graphId,\n kind,\n constraint.name,\n key,\n );\n pendingUniqueOwners.set(concreteEntryKey, id);\n\n if (constraint.scope !== \"kind\") {\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n registry,\n );\n for (const kindToCheck of kindsToCheck) {\n const inheritedEntryKey = buildUniqueCacheKey(\n graphId,\n kindToCheck,\n constraint.name,\n key,\n );\n pendingUniqueOwners.set(inheritedEntryKey, id);\n }\n }\n }\n }\n\n // Override specific methods on the backend for validation caching.\n // The cast is necessary because spreading a union type (GraphBackend | TransactionBackend)\n // produces an intersection of their members, which TypeScript can't narrow back to the union.\n const validationBackend = {\n ...backend,\n getNode: getNodeCached,\n checkUnique: checkUniqueCached,\n } as GraphBackend | TransactionBackend;\n\n return {\n backend: validationBackend,\n registerPendingNode,\n registerPendingUniqueEntries,\n };\n}\n\nasync function validateAndPrepareNodeCreate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: CreateNodeInput,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<NodeCreatePrepared> {\n const kind = input.kind;\n\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Validate props with full context\n const nodeKind = registration.type;\n const validatedProps = validateNodeProps(nodeKind.schema, input.props, {\n kind,\n operation: \"create\",\n });\n\n // Validate temporal fields\n const validFrom = validateOptionalIsoDate(input.validFrom, \"validFrom\");\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Check if node with this kind:id already exists\n const existingNode = await backend.getNode(ctx.graphId, kind, id);\n if (existingNode && !existingNode.deleted_at) {\n throw createNodeAlreadyExistsError(kind, id);\n }\n\n // Check disjointness constraints (for multi-kind nodes with same ID)\n const constraintContext: ConstraintContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await checkDisjointnessConstraint(constraintContext, kind, id);\n\n // Check uniqueness constraints\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n const uniqueConstraints = registration.unique ?? [];\n await checkUniquenessConstraints(\n uniquenessContext,\n kind,\n id,\n validatedProps,\n uniqueConstraints,\n );\n\n return {\n kind,\n id,\n nodeKind,\n validatedProps,\n uniqueConstraints,\n insertParams: buildInsertNodeParams(\n ctx.graphId,\n kind,\n id,\n validatedProps,\n validFrom,\n validTo,\n ),\n };\n}\n\nasync function finalizeNodeCreate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n prepared: NodeCreatePrepared,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await insertUniquenessEntries(\n uniquenessContext,\n prepared.kind,\n prepared.id,\n prepared.validatedProps,\n prepared.uniqueConstraints,\n );\n\n const embeddingSyncContext: EmbeddingSyncContext = {\n graphId: ctx.graphId,\n nodeKind: prepared.kind,\n nodeId: prepared.id,\n backend,\n };\n await syncEmbeddings(\n embeddingSyncContext,\n prepared.nodeKind.schema,\n prepared.validatedProps,\n );\n}\n\n// ============================================================\n// Node Operations\n// ============================================================\n\n/**\n * Executes a node create operation.\n */\nasync function executeNodeCreateInternal<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ returnRow?: boolean }>,\n): Promise<Node | undefined> {\n const kind = input.kind;\n const id = input.id ?? generateId();\n const opContext = ctx.createOperationContext(\"create\", \"node\", kind, id);\n const shouldReturnRow = options?.returnRow ?? true;\n\n return ctx.withOperationHooks(opContext, async () => {\n const prepared = await validateAndPrepareNodeCreate(\n ctx,\n input,\n id,\n backend,\n );\n\n let row: BackendNodeRow | undefined;\n if (shouldReturnRow) {\n row = await backend.insertNode(prepared.insertParams);\n } else {\n await (backend.insertNodeNoReturn?.(prepared.insertParams) ??\n backend.insertNode(prepared.insertParams));\n }\n\n await finalizeNodeCreate(ctx, prepared, backend);\n\n if (row === undefined) return;\n return rowToNode(row);\n });\n}\n\n/**\n * Executes a node create operation and returns the created node.\n */\nexport async function executeNodeCreate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n): Promise<Node> {\n const result = await executeNodeCreateInternal(ctx, input, backend, {\n returnRow: true,\n });\n if (!result) {\n throw new DatabaseOperationError(\n \"Node create failed: expected created node row\",\n { operation: \"insert\", entity: \"node\" },\n );\n }\n return result;\n}\n\n/**\n * Executes a node create operation without returning the created node payload.\n */\nexport async function executeNodeCreateNoReturn<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n await executeNodeCreateInternal(ctx, input, backend, { returnRow: false });\n}\n\n/**\n * Executes batched node creates without returning inserted node payloads.\n *\n * Note: `withOperationHooks` is intentionally skipped for batch throughput.\n * Per-item hooks would negate the performance benefit of batching.\n */\nexport async function executeNodeCreateNoReturnBatch<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n if (inputs.length === 0) {\n return;\n }\n\n const {\n backend: validationBackend,\n registerPendingNode,\n registerPendingUniqueEntries,\n } = createNodeBatchValidationBackend(ctx.graphId, ctx.registry, backend);\n const preparedCreates: NodeCreatePrepared[] = [];\n\n for (const input of inputs) {\n const id = input.id ?? generateId();\n const prepared = await validateAndPrepareNodeCreate(\n ctx,\n input,\n id,\n validationBackend,\n );\n preparedCreates.push(prepared);\n registerPendingNode(prepared.insertParams);\n registerPendingUniqueEntries(\n prepared.kind,\n prepared.id,\n prepared.validatedProps,\n prepared.uniqueConstraints,\n );\n }\n\n const batchInsertParams = preparedCreates.map(\n (prepared) => prepared.insertParams,\n );\n if (backend.insertNodesBatch === undefined) {\n for (const insertParams of batchInsertParams) {\n await (backend.insertNodeNoReturn?.(insertParams) ??\n backend.insertNode(insertParams));\n }\n } else {\n await backend.insertNodesBatch(batchInsertParams);\n }\n\n for (const prepared of preparedCreates) {\n await finalizeNodeCreate(ctx, prepared, backend);\n }\n}\n\n/**\n * Executes batched node creates and returns the inserted node payloads.\n *\n * Uses batch validation caching and a single multi-row INSERT with RETURNING\n * when the backend supports it. Falls back to sequential inserts otherwise.\n *\n * Note: `withOperationHooks` is intentionally skipped for batch throughput.\n * Per-item hooks would negate the performance benefit of batching.\n */\nexport async function executeNodeCreateBatch<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n): Promise<readonly Node[]> {\n if (inputs.length === 0) {\n return [];\n }\n\n const {\n backend: validationBackend,\n registerPendingNode,\n registerPendingUniqueEntries,\n } = createNodeBatchValidationBackend(ctx.graphId, ctx.registry, backend);\n const preparedCreates: NodeCreatePrepared[] = [];\n\n for (const input of inputs) {\n const id = input.id ?? generateId();\n const prepared = await validateAndPrepareNodeCreate(\n ctx,\n input,\n id,\n validationBackend,\n );\n preparedCreates.push(prepared);\n registerPendingNode(prepared.insertParams);\n registerPendingUniqueEntries(\n prepared.kind,\n prepared.id,\n prepared.validatedProps,\n prepared.uniqueConstraints,\n );\n }\n\n const batchInsertParams = preparedCreates.map(\n (prepared) => prepared.insertParams,\n );\n\n let rows: readonly BackendNodeRow[];\n if (backend.insertNodesBatchReturning === undefined) {\n const sequentialRows: BackendNodeRow[] = [];\n for (const insertParams of batchInsertParams) {\n sequentialRows.push(await backend.insertNode(insertParams));\n }\n rows = sequentialRows;\n } else {\n rows = await backend.insertNodesBatchReturning(batchInsertParams);\n }\n\n for (const prepared of preparedCreates) {\n await finalizeNodeCreate(ctx, prepared, backend);\n }\n\n return rows.map((row) => rowToNode(row));\n}\n\n/**\n * Executes a node update operation.\n */\nexport async function executeNodeUpdate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n): Promise<Node> {\n const kind = input.kind;\n const id = input.id;\n const opContext = ctx.createOperationContext(\"update\", \"node\", kind, id);\n\n return ctx.withOperationHooks(opContext, async () => {\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Get existing node\n const existing = await backend.getNode(ctx.graphId, kind, id);\n // If clearDeleted is set, allow updating deleted nodes (used by upsert)\n if (!existing || (existing.deleted_at && !options?.clearDeleted)) {\n throw new NodeNotFoundError(kind, id);\n }\n\n // Merge props\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n const mergedProps = { ...existingProps, ...input.props };\n\n // Validate merged props with full context\n const nodeKind = registration.type;\n const validatedProps = validateNodeProps(nodeKind.schema, mergedProps, {\n kind,\n operation: \"update\",\n id,\n });\n\n // Validate temporal fields\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Handle uniqueness constraint changes\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await updateUniquenessEntries(\n uniquenessContext,\n kind,\n id,\n existingProps,\n validatedProps,\n registration.unique ?? [],\n );\n\n // Update node - conditionally include optional fields\n const updateParams: {\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n incrementVersion?: boolean;\n clearDeleted?: boolean;\n } = {\n graphId: ctx.graphId,\n kind,\n id,\n props: validatedProps,\n incrementVersion: true,\n };\n if (validTo !== undefined) updateParams.validTo = validTo;\n if (options?.clearDeleted) updateParams.clearDeleted = true;\n\n const row = await backend.updateNode(updateParams);\n\n // Sync embeddings with updated props\n const embeddingSyncContext: EmbeddingSyncContext = {\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n backend,\n };\n await syncEmbeddings(embeddingSyncContext, nodeKind.schema, validatedProps);\n\n return rowToNode(row);\n });\n}\n\n/**\n * Executes a node update for upsert — bypasses operation hooks\n * and allows updating soft-deleted nodes when clearDeleted is set.\n */\nexport async function executeNodeUpsertUpdate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n): Promise<Node> {\n const kind = input.kind;\n const id = input.id;\n\n const registration = getNodeRegistration(ctx.graph, kind);\n\n const existing = await backend.getNode(ctx.graphId, kind, id);\n if (!existing || (existing.deleted_at && !options?.clearDeleted)) {\n throw new NodeNotFoundError(kind, id);\n }\n\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n const mergedProps = { ...existingProps, ...input.props };\n\n const nodeKind = registration.type;\n const validatedProps = validateNodeProps(nodeKind.schema, mergedProps, {\n kind,\n operation: \"update\",\n id,\n });\n\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await updateUniquenessEntries(\n uniquenessContext,\n kind,\n id,\n existingProps,\n validatedProps,\n registration.unique ?? [],\n );\n\n const updateParams: {\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n incrementVersion?: boolean;\n clearDeleted?: boolean;\n } = {\n graphId: ctx.graphId,\n kind,\n id,\n props: validatedProps,\n incrementVersion: true,\n };\n if (validTo !== undefined) updateParams.validTo = validTo;\n if (options?.clearDeleted) updateParams.clearDeleted = true;\n\n const row = await backend.updateNode(updateParams);\n\n const embeddingSyncContext: EmbeddingSyncContext = {\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n backend,\n };\n await syncEmbeddings(embeddingSyncContext, nodeKind.schema, validatedProps);\n\n return rowToNode(row);\n}\n\n/**\n * Executes a node delete operation.\n */\nexport async function executeNodeDelete<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n const opContext = ctx.createOperationContext(\"delete\", \"node\", kind, id);\n\n return ctx.withOperationHooks(opContext, async () => {\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Fetch node props BEFORE soft-delete so we can compute unique keys\n const existing = await backend.getNode(ctx.graphId, kind, id);\n if (!existing || existing.deleted_at) {\n // Node already deleted or doesn't exist - nothing to do\n return;\n }\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n\n // Check delete behavior\n const deleteBehavior = registration.onDelete ?? \"restrict\";\n const connectedEdges = await backend.findEdgesConnectedTo({\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n });\n\n if (connectedEdges.length > 0) {\n switch (deleteBehavior) {\n case \"restrict\": {\n // Block deletion if edges exist\n const edgeKinds = [\n ...new Set(connectedEdges.map((edge) => edge.kind)),\n ];\n throw new RestrictedDeleteError({\n nodeKind: kind,\n nodeId: id,\n edgeCount: connectedEdges.length,\n edgeKinds,\n });\n }\n\n case \"cascade\":\n case \"disconnect\": {\n // Both behaviors delete connected edges. \"cascade\" signals intent to\n // remove dependent data; \"disconnect\" signals intent to sever the\n // relationship. The effect is identical because edges cannot exist\n // without both endpoints.\n for (const edge of connectedEdges) {\n await backend.deleteEdge({\n graphId: ctx.graphId,\n id: edge.id,\n });\n }\n break;\n }\n }\n }\n\n await backend.deleteNode({\n graphId: ctx.graphId,\n kind,\n id,\n });\n\n // Delete uniqueness entries\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await deleteUniquenessEntries(\n uniquenessContext,\n kind,\n existingProps,\n registration.unique ?? [],\n );\n\n // Delete embeddings\n const nodeKind = registration.type;\n const embeddingSyncContext: EmbeddingSyncContext = {\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n backend,\n };\n await deleteNodeEmbeddings(embeddingSyncContext, nodeKind.schema);\n });\n}\n\n/**\n * Executes a node hard delete operation (permanent removal).\n *\n * Unlike soft delete, this permanently removes the node and all\n * associated data (uniqueness entries, embeddings) from the database.\n */\nexport async function executeNodeHardDelete<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n const opContext = ctx.createOperationContext(\"delete\", \"node\", kind, id);\n\n return ctx.withOperationHooks(opContext, async () => {\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Check if node exists (we don't care about deleted_at for hard delete)\n const existing = await backend.getNode(ctx.graphId, kind, id);\n if (!existing) {\n // Node doesn't exist - nothing to do\n return;\n }\n\n // Check delete behavior for connected edges\n const deleteBehavior = registration.onDelete ?? \"restrict\";\n const connectedEdges = await backend.findEdgesConnectedTo({\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n });\n\n if (connectedEdges.length > 0) {\n switch (deleteBehavior) {\n case \"restrict\": {\n // Block deletion if edges exist\n const edgeKinds = [\n ...new Set(connectedEdges.map((edge) => edge.kind)),\n ];\n throw new RestrictedDeleteError({\n nodeKind: kind,\n nodeId: id,\n edgeCount: connectedEdges.length,\n edgeKinds,\n });\n }\n\n case \"cascade\":\n case \"disconnect\": {\n // Both behaviors hard-delete connected edges. See soft-delete\n // counterpart for rationale.\n for (const edge of connectedEdges) {\n await backend.hardDeleteEdge({\n graphId: ctx.graphId,\n id: edge.id,\n });\n }\n break;\n }\n }\n }\n\n // Hard delete the node (backend handles uniqueness entries and embeddings).\n // The cascade (uniques, embeddings, edges, node) is not individually atomic,\n // so wrap in a transaction when the backend supports it.\n const hardDelete = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<void> => {\n await target.hardDeleteNode({\n graphId: ctx.graphId,\n kind,\n id,\n });\n };\n\n await (\"transaction\" in backend && backend.capabilities.transactions ?\n backend.transaction(async (tx) => hardDelete(tx))\n : hardDelete(backend));\n });\n}\n\n// ============================================================\n// Get-Or-Create Operations\n// ============================================================\n\nfunction resolveConstraint<G extends GraphDef>(\n graph: G,\n kind: string,\n constraintName: string,\n): UniqueConstraint {\n const registration = getNodeRegistration(graph, kind);\n const constraints = registration.unique ?? [];\n const constraint = constraints.find((c) => c.name === constraintName);\n if (constraint === undefined) {\n throw new NodeConstraintNotFoundError(constraintName, kind);\n }\n return constraint;\n}\n\n/**\n * Executes a single getOrCreateByConstraint operation.\n *\n * Looks up an existing node by uniqueness constraint key.\n * If found, returns it (with optional update). If not found, creates a new one.\n * Soft-deleted matches are always resurrected.\n */\nexport async function executeNodeGetOrCreateByConstraint<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n): Promise<Readonly<{ node: Node; action: GetOrCreateAction }>> {\n const ifExists = options?.ifExists ?? \"return\";\n\n const registration = getNodeRegistration(ctx.graph, kind);\n const nodeKind = registration.type;\n const validatedProps = validateNodeProps(nodeKind.schema, props, {\n kind,\n operation: \"create\",\n });\n\n const constraint = resolveConstraint(ctx.graph, kind, constraintName);\n\n if (!checkWherePredicate(constraint, validatedProps)) {\n // Constraint where predicate doesn't apply — always create\n const input: CreateNodeInput = { kind, props: validatedProps };\n const node = await executeNodeCreate(ctx, input, backend);\n return { node, action: \"created\" };\n }\n\n const key = computeUniqueKey(\n validatedProps,\n constraint.fields,\n constraint.collation,\n );\n\n // Check uniques table across all applicable kinds\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n let existingUniqueRow:\n | { node_id: string; concrete_kind: string; deleted_at: string | undefined }\n | undefined;\n for (const kindToCheck of kindsToCheck) {\n const row = await backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key,\n includeDeleted: true,\n });\n if (row !== undefined) {\n existingUniqueRow = row;\n break;\n }\n }\n\n if (existingUniqueRow === undefined) {\n // No match — create new node\n const input: CreateNodeInput = { kind, props: validatedProps };\n const node = await executeNodeCreate(ctx, input, backend);\n return { node, action: \"created\" };\n }\n\n // Match found — fetch using concrete_kind (may differ from requested kind\n // when scope is \"kindWithSubClasses\" and the match is on a sibling/parent kind)\n const existingRow = await backend.getNode(\n ctx.graphId,\n existingUniqueRow.concrete_kind,\n existingUniqueRow.node_id,\n );\n\n if (existingRow === undefined) {\n // Unique entry exists but node doesn't — create fresh\n const input: CreateNodeInput = { kind, props: validatedProps };\n const node = await executeNodeCreate(ctx, input, backend);\n return { node, action: \"created\" };\n }\n\n const isSoftDeleted = existingRow.deleted_at !== undefined;\n\n if (isSoftDeleted || ifExists === \"update\") {\n const concreteKind = existingUniqueRow.concrete_kind;\n const node = await executeNodeUpsertUpdate(\n ctx,\n {\n kind: concreteKind,\n id: existingRow.id as UpdateNodeInput[\"id\"],\n props: validatedProps,\n },\n backend,\n { clearDeleted: isSoftDeleted },\n );\n return { node, action: isSoftDeleted ? \"resurrected\" : \"updated\" };\n }\n\n // ifExists === \"return\" and node is live — return as-is\n return { node: rowToNode(existingRow), action: \"found\" };\n}\n\n/**\n * Executes a single findByConstraint operation.\n *\n * Looks up an existing node by uniqueness constraint key.\n * Returns the node if found (live only), or undefined if not found.\n * Soft-deleted nodes are excluded.\n */\nexport async function executeNodeFindByConstraint<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n): Promise<Node | undefined> {\n const registration = getNodeRegistration(ctx.graph, kind);\n const nodeKind = registration.type;\n const validatedProps = validateNodeProps(nodeKind.schema, props, {\n kind,\n operation: \"create\",\n });\n\n const constraint = resolveConstraint(ctx.graph, kind, constraintName);\n\n if (!checkWherePredicate(constraint, validatedProps)) return undefined;\n\n const key = computeUniqueKey(\n validatedProps,\n constraint.fields,\n constraint.collation,\n );\n\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n let existingUniqueRow:\n | { node_id: string; concrete_kind: string; deleted_at: string | undefined }\n | undefined;\n for (const kindToCheck of kindsToCheck) {\n const row = await backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key,\n includeDeleted: false,\n });\n if (row !== undefined) {\n existingUniqueRow = row;\n break;\n }\n }\n\n if (existingUniqueRow === undefined) return undefined;\n\n const existingRow = await backend.getNode(\n ctx.graphId,\n existingUniqueRow.concrete_kind,\n existingUniqueRow.node_id,\n );\n\n if (existingRow === undefined || existingRow.deleted_at !== undefined)\n return undefined;\n\n return rowToNode(existingRow);\n}\n\n/**\n * Executes a bulk findByConstraint operation.\n *\n * Batch-checks existing keys and returns matched live nodes in input order.\n * Returns undefined for entries that don't match.\n */\nexport async function executeNodeBulkFindByConstraint<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n): Promise<(Node | undefined)[]> {\n if (items.length === 0) return [];\n\n const registration = getNodeRegistration(ctx.graph, kind);\n const nodeKind = registration.type;\n const constraint = resolveConstraint(ctx.graph, kind, constraintName);\n\n // Step 1: Validate all props and compute keys\n const validated: {\n validatedProps: Record<string, unknown>;\n key: string | undefined;\n }[] = [];\n\n for (const item of items) {\n const validatedProps = validateNodeProps(nodeKind.schema, item.props, {\n kind,\n operation: \"create\",\n });\n const applies = checkWherePredicate(constraint, validatedProps);\n const key =\n applies ?\n computeUniqueKey(\n validatedProps,\n constraint.fields,\n constraint.collation,\n )\n : undefined;\n validated.push({ validatedProps, key });\n }\n\n // Step 2: Batch-check existing keys (live only)\n const uniqueKeys = [\n ...new Set(\n validated.map((v) => v.key).filter((k): k is string => k !== undefined),\n ),\n ];\n\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n const existingByKey = new Map<\n string,\n { node_id: string; concrete_kind: string }\n >();\n\n if (uniqueKeys.length > 0) {\n for (const kindToCheck of kindsToCheck) {\n if (backend.checkUniqueBatch === undefined) {\n for (const key of uniqueKeys) {\n if (existingByKey.has(key)) continue;\n const row = await backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key,\n includeDeleted: false,\n });\n if (row !== undefined) {\n existingByKey.set(row.key, row);\n }\n }\n } else {\n const rows = await backend.checkUniqueBatch({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n keys: uniqueKeys,\n includeDeleted: false,\n });\n for (const row of rows) {\n if (!existingByKey.has(row.key)) {\n existingByKey.set(row.key, row);\n }\n }\n }\n }\n }\n\n // Step 3: Fetch matched nodes and assemble results\n const results: (Node | undefined)[] = Array.from({ length: items.length });\n const seenKeys = new Map<string, number>();\n\n for (const [index, { key }] of validated.entries()) {\n if (key === undefined) {\n results[index] = undefined;\n continue;\n }\n\n const previousIndex = seenKeys.get(key);\n if (previousIndex !== undefined) {\n results[index] = results[previousIndex];\n continue;\n }\n seenKeys.set(key, index);\n\n const existing = existingByKey.get(key);\n if (existing === undefined) {\n results[index] = undefined;\n continue;\n }\n\n const existingRow = await backend.getNode(\n ctx.graphId,\n existing.concrete_kind,\n existing.node_id,\n );\n\n if (existingRow === undefined || existingRow.deleted_at !== undefined) {\n results[index] = undefined;\n continue;\n }\n\n results[index] = rowToNode(existingRow);\n }\n\n return results;\n}\n\n/**\n * Executes a bulk getOrCreateByConstraint operation.\n *\n * Batch-checks existing keys, partitions into creates and fetches,\n * and assembles results in input order.\n */\nexport async function executeNodeBulkGetOrCreateByConstraint<\n G extends GraphDef,\n>(\n ctx: NodeOperationContext<G>,\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n): Promise<Readonly<{ node: Node; action: GetOrCreateAction }>[]> {\n if (items.length === 0) return [];\n\n const ifExists = options?.ifExists ?? \"return\";\n const registration = getNodeRegistration(ctx.graph, kind);\n const nodeKind = registration.type;\n const constraint = resolveConstraint(ctx.graph, kind, constraintName);\n\n // Step 1: Validate all props and compute keys\n const validated: {\n validatedProps: Record<string, unknown>;\n key: string | undefined;\n }[] = [];\n\n for (const item of items) {\n const validatedProps = validateNodeProps(nodeKind.schema, item.props, {\n kind,\n operation: \"create\",\n });\n const applies = checkWherePredicate(constraint, validatedProps);\n const key =\n applies ?\n computeUniqueKey(\n validatedProps,\n constraint.fields,\n constraint.collation,\n )\n : undefined;\n validated.push({ validatedProps, key });\n }\n\n // Step 2: Batch-check existing keys\n const uniqueKeys = [\n ...new Set(\n validated.map((v) => v.key).filter((k): k is string => k !== undefined),\n ),\n ];\n\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n // Map from key -> UniqueRow for matches found\n const existingByKey = new Map<\n string,\n { node_id: string; concrete_kind: string; deleted_at: string | undefined }\n >();\n\n if (uniqueKeys.length > 0) {\n for (const kindToCheck of kindsToCheck) {\n if (backend.checkUniqueBatch === undefined) {\n // Fallback to sequential checkUnique\n for (const key of uniqueKeys) {\n if (existingByKey.has(key)) continue;\n const row = await backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key,\n includeDeleted: true,\n });\n if (row !== undefined) {\n existingByKey.set(row.key, row);\n }\n }\n } else {\n const rows = await backend.checkUniqueBatch({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n keys: uniqueKeys,\n includeDeleted: true,\n });\n for (const row of rows) {\n if (!existingByKey.has(row.key)) {\n existingByKey.set(row.key, row);\n }\n }\n }\n }\n }\n\n // Step 3: Partition into toCreate, toFetch, and duplicates\n const toCreate: { index: number; input: CreateNodeInput }[] = [];\n const toFetch: {\n index: number;\n nodeId: string;\n concreteKind: string;\n validatedProps: Record<string, unknown>;\n isSoftDeleted: boolean;\n }[] = [];\n // Indices that duplicate another entry (within-batch or same existing key).\n // These reuse the result from the first occurrence rather than re-fetching.\n const duplicateOf: { index: number; sourceIndex: number }[] = [];\n\n // Track keys we've already seen in this batch to handle duplicates within the input\n const seenKeys = new Map<string, number>(); // key -> first index\n\n for (const [index, { validatedProps, key }] of validated.entries()) {\n if (key === undefined) {\n // Constraint doesn't apply — always create\n toCreate.push({\n index,\n input: { kind, props: validatedProps },\n });\n continue;\n }\n\n // Check if we've already handled this key in a previous input item\n const previousIndex = seenKeys.get(key);\n if (previousIndex !== undefined) {\n // Duplicate within the batch — reuse the first item's result\n duplicateOf.push({ index, sourceIndex: previousIndex });\n continue;\n }\n\n seenKeys.set(key, index);\n\n const existing = existingByKey.get(key);\n if (existing === undefined) {\n toCreate.push({\n index,\n input: { kind, props: validatedProps },\n });\n } else {\n toFetch.push({\n index,\n nodeId: existing.node_id,\n concreteKind: existing.concrete_kind,\n validatedProps,\n isSoftDeleted: existing.deleted_at !== undefined,\n });\n }\n }\n\n type Result = Readonly<{ node: Node; action: GetOrCreateAction }>;\n\n // Step 4: Execute creates\n const results: Result[] = Array.from({ length: items.length });\n\n if (toCreate.length > 0) {\n const createInputs = toCreate.map((entry) => entry.input);\n const createdNodes = await executeNodeCreateBatch(\n ctx,\n createInputs,\n backend,\n );\n for (const [batchIndex, entry] of toCreate.entries()) {\n results[entry.index] = {\n node: createdNodes[batchIndex]!,\n action: \"created\",\n };\n }\n }\n\n // Step 5: Handle existing nodes (fetch/update/resurrect)\n for (const entry of toFetch) {\n const { index, concreteKind, validatedProps, isSoftDeleted, nodeId } =\n entry;\n\n const existingRow = await backend.getNode(\n ctx.graphId,\n concreteKind,\n nodeId,\n );\n\n if (existingRow === undefined) {\n const input: CreateNodeInput = { kind, props: validatedProps };\n const node = await executeNodeCreate(ctx, input, backend);\n results[index] = { node, action: \"created\" };\n continue;\n }\n\n if (isSoftDeleted || ifExists === \"update\") {\n const node = await executeNodeUpsertUpdate(\n ctx,\n {\n kind: concreteKind,\n id: existingRow.id as UpdateNodeInput[\"id\"],\n props: validatedProps,\n },\n backend,\n { clearDeleted: isSoftDeleted },\n );\n results[index] = {\n node,\n action: isSoftDeleted ? \"resurrected\" : \"updated\",\n };\n } else {\n results[index] = { node: rowToNode(existingRow), action: \"found\" };\n }\n }\n\n // Step 6: Resolve within-batch duplicates by copying the first occurrence's result\n for (const { index, sourceIndex } of duplicateOf) {\n const sourceResult = results[sourceIndex]!;\n results[index] = { node: sourceResult.node, action: \"found\" };\n }\n\n return results;\n}\n","/**\n * Main Store implementation for TypeGraph.\n *\n * The Store is the primary interface for interacting with a TypeGraph.\n * It coordinates:\n * - Node and edge CRUD operations\n * - Constraint validation\n * - Schema management\n * - Transaction handling\n */\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport { type GraphDef } from \"../core/define-graph\";\nimport type { TraversalExpansion } from \"../query/ast\";\nimport { createQueryBuilder, type QueryBuilder } from \"../query/builder\";\nimport { createSqlSchema } from \"../query/compiler/schema\";\nimport { buildKindRegistry, type KindRegistry } from \"../registry\";\nimport { nowIso } from \"../utils/date\";\nimport { generateId } from \"../utils/id\";\nimport {\n createEdgeCollectionsProxy,\n createNodeCollectionsProxy,\n type EdgeOperations,\n type NodeOperations,\n} from \"./collection-factory\";\nimport {\n type EdgeOperationContext,\n executeEdgeBulkGetOrCreateByEndpoints,\n executeEdgeCreate,\n executeEdgeCreateBatch,\n executeEdgeCreateNoReturnBatch,\n executeEdgeDelete,\n executeEdgeFindByEndpoints,\n executeEdgeGetOrCreateByEndpoints,\n executeEdgeHardDelete,\n executeEdgeUpdate,\n executeEdgeUpsertUpdate,\n executeNodeBulkFindByConstraint,\n executeNodeBulkGetOrCreateByConstraint,\n executeNodeCreate,\n executeNodeCreateBatch,\n executeNodeCreateNoReturnBatch,\n executeNodeDelete,\n executeNodeFindByConstraint,\n executeNodeGetOrCreateByConstraint,\n executeNodeHardDelete,\n executeNodeUpdate,\n executeNodeUpsertUpdate,\n type NodeOperationContext,\n} from \"./operations\";\nimport { rowToEdge, rowToNode } from \"./row-mappers\";\nimport {\n type ConstraintNames,\n type HookContext,\n type NodeCollection,\n type OperationHookContext,\n type QueryOptions,\n type StoreHooks,\n type StoreOptions,\n type TransactionContext,\n type TypedEdgeCollection,\n} from \"./types\";\n\n// ============================================================\n// Store Class\n// ============================================================\n\n/**\n * The Store provides typed access to a TypeGraph database.\n *\n * @example\n * ```typescript\n * const store = createStore(myGraph, backend);\n *\n * // Create nodes using collection API\n * const person = await store.nodes.Person.create({\n * name: \"Alice\",\n * email: \"alice@example.com\",\n * });\n *\n * const company = await store.nodes.Company.create({\n * name: \"Acme\",\n * industry: \"Technology\",\n * });\n *\n * // Create edges\n * await store.edges.worksAt.create(\n * { kind: \"Person\", id: person.id },\n * { kind: \"Company\", id: company.id },\n * { role: \"Engineer\" }\n * );\n *\n * // Query with the fluent API\n * const results = await store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(\"Alice\"))\n * .select((ctx) => ctx.p)\n * .execute();\n * ```\n */\nexport class Store<G extends GraphDef> {\n readonly #graph: G;\n readonly #backend: GraphBackend;\n readonly #registry: KindRegistry;\n readonly #hooks: StoreHooks;\n readonly #schema: StoreOptions[\"schema\"];\n readonly #defaultTraversalExpansion: TraversalExpansion;\n #nodeCollections:\n | {\n [K in keyof G[\"nodes\"] & string]-?: NodeCollection<\n G[\"nodes\"][K][\"type\"],\n ConstraintNames<G[\"nodes\"][K]>\n >;\n }\n | undefined;\n #edgeCollections:\n | {\n [K in keyof G[\"edges\"] & string]-?: TypedEdgeCollection<G[\"edges\"][K]>;\n }\n | undefined;\n\n constructor(graph: G, backend: GraphBackend, options?: StoreOptions) {\n this.#graph = graph;\n this.#backend = backend;\n this.#registry = buildKindRegistry(graph);\n this.#hooks = options?.hooks ?? {};\n this.#schema =\n options?.schema ??\n (backend.tableNames ? createSqlSchema(backend.tableNames) : undefined);\n this.#defaultTraversalExpansion =\n options?.queryDefaults?.traversalExpansion ?? \"inverse\";\n }\n\n // === Accessors ===\n\n /** The graph definition */\n get graph(): G {\n return this.#graph;\n }\n\n /** The graph ID */\n get graphId(): string {\n return this.#graph.id;\n }\n\n /** The kind registry for ontology lookups */\n get registry(): KindRegistry {\n return this.#registry;\n }\n\n /** The database backend */\n get backend(): GraphBackend {\n return this.#backend;\n }\n\n // === Collections ===\n\n /**\n * Node collections for ergonomic CRUD operations.\n *\n * @example\n * ```typescript\n * // Create a node\n * const person = await store.nodes.Person.create({ name: \"Alice\" });\n *\n * // Get by ID\n * const fetched = await store.nodes.Person.getById(person.id);\n *\n * // Find all\n * const people = await store.nodes.Person.find({ limit: 10 });\n * ```\n */\n get nodes(): {\n [K in keyof G[\"nodes\"] & string]-?: NodeCollection<\n G[\"nodes\"][K][\"type\"],\n ConstraintNames<G[\"nodes\"][K]>\n >;\n } {\n if (this.#nodeCollections === undefined) {\n this.#nodeCollections = createNodeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n this.#backend,\n this.#nodeOperations,\n );\n }\n\n return this.#nodeCollections;\n }\n\n /**\n * Edge collections for ergonomic CRUD operations.\n *\n * @example\n * ```typescript\n * // Create an edge\n * const edge = await store.edges.worksAt.create(\n * { kind: \"Person\", id: person.id },\n * { kind: \"Company\", id: company.id },\n * { role: \"Engineer\" }\n * );\n *\n * // Find edges from a node\n * const edges = await store.edges.worksAt.findFrom({ kind: \"Person\", id: person.id });\n * ```\n */\n get edges(): {\n [K in keyof G[\"edges\"] & string]-?: TypedEdgeCollection<G[\"edges\"][K]>;\n } {\n if (this.#edgeCollections === undefined) {\n this.#edgeCollections = createEdgeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n this.#backend,\n this.#edgeOperations,\n );\n }\n\n return this.#edgeCollections;\n }\n\n /**\n * Node operations bound to this store instance.\n */\n get #nodeOperations(): NodeOperations {\n const ctx = this.#createNodeOperationContext();\n return {\n defaultTemporalMode: this.#graph.defaults.temporalMode,\n rowToNode: (row) => rowToNode(row),\n executeCreate: (input, backend) => executeNodeCreate(ctx, input, backend),\n executeCreateBatch: (inputs, backend) =>\n executeNodeCreateBatch(ctx, inputs, backend),\n executeCreateNoReturnBatch: (inputs, backend) =>\n executeNodeCreateNoReturnBatch(ctx, inputs, backend),\n executeUpdate: (input, backend, options) =>\n executeNodeUpdate(ctx, { ...input, id: input.id }, backend, options),\n executeUpsertUpdate: (input, backend, options) =>\n executeNodeUpsertUpdate(\n ctx,\n { ...input, id: input.id },\n backend,\n options,\n ),\n executeDelete: (kind, id, backend) =>\n executeNodeDelete(ctx, kind, id, backend),\n executeHardDelete: (kind, id, backend) =>\n executeNodeHardDelete(ctx, kind, id, backend),\n matchesTemporalMode: (row, options) =>\n this.#matchesTemporalMode(row, options),\n createQuery: () => this.query(),\n executeGetOrCreateByConstraint: (\n kind,\n constraintName,\n props,\n backend,\n options,\n ) =>\n executeNodeGetOrCreateByConstraint(\n ctx,\n kind,\n constraintName,\n props,\n backend,\n options,\n ),\n executeBulkGetOrCreateByConstraint: (\n kind,\n constraintName,\n items,\n backend,\n options,\n ) =>\n executeNodeBulkGetOrCreateByConstraint(\n ctx,\n kind,\n constraintName,\n items,\n backend,\n options,\n ),\n executeFindByConstraint: (kind, constraintName, props, backend) =>\n executeNodeFindByConstraint(ctx, kind, constraintName, props, backend),\n executeBulkFindByConstraint: (kind, constraintName, items, backend) =>\n executeNodeBulkFindByConstraint(\n ctx,\n kind,\n constraintName,\n items,\n backend,\n ),\n };\n }\n\n /**\n * Edge operations bound to this store instance.\n */\n get #edgeOperations(): EdgeOperations {\n const ctx = this.#createEdgeOperationContext();\n return {\n defaultTemporalMode: this.#graph.defaults.temporalMode,\n rowToEdge: (row) => rowToEdge(row),\n executeCreate: (input, backend) => executeEdgeCreate(ctx, input, backend),\n executeCreateBatch: (inputs, backend) =>\n executeEdgeCreateBatch(ctx, inputs, backend),\n executeCreateNoReturnBatch: (inputs, backend) =>\n executeEdgeCreateNoReturnBatch(ctx, inputs, backend),\n executeUpdate: (input, backend) => executeEdgeUpdate(ctx, input, backend),\n executeUpsertUpdate: (input, backend, options) =>\n executeEdgeUpsertUpdate(ctx, input, backend, options),\n executeDelete: (id, backend) => executeEdgeDelete(ctx, id, backend),\n executeHardDelete: (id, backend) =>\n executeEdgeHardDelete(ctx, id, backend),\n matchesTemporalMode: (row, options) =>\n this.#matchesTemporalMode(row, options),\n createQuery: () => this.query(),\n executeGetOrCreateByEndpoints: (\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n props,\n backend,\n options,\n ) =>\n executeEdgeGetOrCreateByEndpoints(\n ctx,\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n props,\n backend,\n options,\n ),\n executeBulkGetOrCreateByEndpoints: (kind, items, backend, options) =>\n executeEdgeBulkGetOrCreateByEndpoints(\n ctx,\n kind,\n items,\n backend,\n options,\n ),\n executeFindByEndpoints: (\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n backend,\n options,\n ) =>\n executeEdgeFindByEndpoints(\n ctx,\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n backend,\n options,\n ),\n };\n }\n\n // === Query Builder ===\n\n /**\n * Creates a query builder for this store.\n *\n * @example\n * ```typescript\n * const results = await store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(\"Alice\"))\n * .select((ctx) => ctx.p)\n * .execute();\n * ```\n */\n query(): QueryBuilder<G> {\n return this.#createQueryForBackend(this.#backend);\n }\n\n // === Transactions ===\n\n /**\n * Executes a function within a transaction.\n *\n * The transaction context provides the same collection API as the Store:\n * - `tx.nodes.Person.create(...)` - Create a node\n * - `tx.edges.worksAt.create(...)` - Create an edge\n *\n * @example\n * ```typescript\n * await store.transaction(async (tx) => {\n * const person = await tx.nodes.Person.create({ name: \"Alice\" });\n * const company = await tx.nodes.Company.create({ name: \"Acme\" });\n * await tx.edges.worksAt.create(\n * { kind: \"Person\", id: person.id },\n * { kind: \"Company\", id: company.id },\n * { role: \"Engineer\" }\n * );\n * });\n * ```\n */\n async transaction<T>(\n fn: (tx: TransactionContext<G>) => Promise<T>,\n ): Promise<T> {\n return this.#backend.transaction(async (txBackend) => {\n const txNodeOperations: NodeOperations = {\n ...this.#nodeOperations,\n createQuery: () => this.#createQueryForBackend(txBackend),\n };\n const txEdgeOperations: EdgeOperations = {\n ...this.#edgeOperations,\n createQuery: () => this.#createQueryForBackend(txBackend),\n };\n\n // Create collections using transaction backend\n const nodes = createNodeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n txBackend,\n txNodeOperations,\n );\n\n const edges = createEdgeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n txBackend,\n txEdgeOperations,\n );\n\n return fn({ nodes, edges });\n });\n }\n\n // === Graph Lifecycle ===\n\n /**\n * Hard-deletes all data for this graph from the database.\n *\n * Removes all nodes, edges, uniqueness entries, embeddings, and schema versions\n * for this graph's ID. No hooks, no per-row logic. Wrapped in a transaction\n * when the backend supports it.\n *\n * The store is usable after clearing — new data can be created immediately.\n */\n async clear(): Promise<void> {\n const doClear = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<void> => {\n await target.clearGraph(this.graphId);\n };\n\n await (this.#backend.capabilities.transactions ?\n this.#backend.transaction(async (tx) => doClear(tx))\n : doClear(this.#backend));\n\n // Reset lazy-initialized collection caches\n this.#nodeCollections = undefined;\n this.#edgeCollections = undefined;\n }\n\n // === Lifecycle ===\n\n /**\n * Closes the store and releases underlying resources.\n *\n * Note: When using the Drizzle adapter, this method does not close the database\n * connection itself, as Drizzle delegates connection management to the user.\n * You should close the underlying database connection (e.g., better-sqlite3 or pg pool)\n * using their respective APIs.\n */\n async close(): Promise<void> {\n await this.#backend.close();\n }\n\n // === Internal: Operation Contexts ===\n\n #createNodeOperationContext(): NodeOperationContext<G> {\n return {\n graph: this.#graph,\n graphId: this.graphId,\n registry: this.#registry,\n createOperationContext: (operation, entity, kind, id) =>\n this.#createOperationContext(operation, entity, kind, id),\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => this.#withOperationHooks(ctx, fn),\n };\n }\n\n #createEdgeOperationContext(): EdgeOperationContext<G> {\n return {\n graph: this.#graph,\n graphId: this.graphId,\n registry: this.#registry,\n createOperationContext: (operation, entity, kind, id) =>\n this.#createOperationContext(operation, entity, kind, id),\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => this.#withOperationHooks(ctx, fn),\n };\n }\n\n // === Internal: Hook Helpers ===\n\n #createHookContext(): HookContext {\n return {\n operationId: generateId(),\n graphId: this.graphId,\n startedAt: new Date(),\n };\n }\n\n #createOperationContext(\n operation: \"create\" | \"update\" | \"delete\",\n entity: \"node\" | \"edge\",\n kind: string,\n id: string,\n ): OperationHookContext {\n return {\n ...this.#createHookContext(),\n operation,\n entity,\n kind,\n id,\n };\n }\n\n async #withOperationHooks<T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ): Promise<T> {\n this.#hooks.onOperationStart?.(ctx);\n const startTime = Date.now();\n try {\n const result = await fn();\n this.#hooks.onOperationEnd?.(ctx, {\n durationMs: Date.now() - startTime,\n });\n return result;\n } catch (error) {\n this.#hooks.onError?.(\n ctx,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n }\n\n // === Internal: Temporal Filtering ===\n\n #matchesTemporalMode(\n row: {\n deleted_at: string | undefined;\n valid_from: string | undefined;\n valid_to: string | undefined;\n },\n options?: QueryOptions,\n ): boolean {\n const mode = options?.temporalMode ?? this.#graph.defaults.temporalMode;\n const asOf = options?.asOf ?? nowIso();\n\n switch (mode) {\n case \"current\":\n case \"asOf\": {\n if (row.deleted_at) return false;\n if (row.valid_from && asOf < row.valid_from) return false;\n if (row.valid_to && asOf >= row.valid_to) return false;\n return true;\n }\n case \"includeEnded\": {\n return !row.deleted_at;\n }\n case \"includeTombstones\": {\n return true;\n }\n }\n }\n\n #createQueryForBackend(\n backend: GraphBackend | TransactionBackend,\n ): QueryBuilder<G> {\n return createQueryBuilder<G>(this.graphId, this.#registry, {\n // TransactionBackend omits transaction/close, but query execution only needs\n // the read-path/query capabilities shared with GraphBackend.\n backend: backend as GraphBackend,\n dialect: backend.dialect,\n defaultTraversalExpansion: this.#defaultTraversalExpansion,\n ...(this.#schema !== undefined && { schema: this.#schema }),\n });\n }\n}\n\n// ============================================================\n// Factory Function\n// ============================================================\n\n/**\n * Creates a new Store instance.\n *\n * @param graph - The graph definition\n * @param backend - The database backend\n * @param options - Optional store configuration including observability hooks\n * @returns A new Store instance\n *\n * @example\n * ```typescript\n * // Basic usage\n * const store = createStore(graph, backend);\n *\n * // With observability hooks\n * const store = createStore(graph, backend, {\n * hooks: {\n * onOperationStart: (ctx) => {\n * console.log(`Starting ${ctx.operation} on ${ctx.entity}:${ctx.kind}`);\n * },\n * onOperationEnd: (ctx, result) => {\n * console.log(`Completed in ${result.durationMs}ms`);\n * },\n * onError: (ctx, error) => {\n * console.error(`Operation ${ctx.operationId} failed:`, error);\n * },\n * },\n * });\n * ```\n */\nexport function createStore<G extends GraphDef>(\n graph: G,\n backend: GraphBackend,\n options?: StoreOptions,\n): Store<G> {\n return new Store(graph, backend, options);\n}\n\n// ============================================================\n// Async Factory with Schema Management\n// ============================================================\n\n// Re-export schema manager types\nexport type {\n SchemaManagerOptions,\n SchemaValidationResult,\n} from \"../schema/manager\";\n\nimport {\n ensureSchema as ensureSchemaImpl,\n type SchemaManagerOptions,\n type SchemaValidationResult,\n} from \"../schema/manager\";\n\n/**\n * Creates a store and ensures the schema is initialized/migrated.\n *\n * This is the recommended way to create a store in production.\n * It automatically:\n * - Initializes the schema on first run (version 1)\n * - Auto-migrates safe changes (additive changes)\n * - Throws MigrationError for breaking changes\n *\n * @param graph - The graph definition\n * @param backend - The database backend\n * @param options - Store and schema options\n * @returns A tuple of [store, validationResult]\n *\n * @example\n * ```typescript\n * const [store, result] = await createStoreWithSchema(graph, backend);\n *\n * if (result.status === \"initialized\") {\n * console.log(\"Schema initialized at version\", result.version);\n * } else if (result.status === \"migrated\") {\n * console.log(`Migrated from v${result.fromVersion} to v${result.toVersion}`);\n * } else if (result.status === \"pending\") {\n * console.log(`Safe changes pending at version ${result.version}`);\n * }\n * ```\n */\nexport async function createStoreWithSchema<G extends GraphDef>(\n graph: G,\n backend: GraphBackend,\n options?: StoreOptions & SchemaManagerOptions,\n): Promise<[Store<G>, SchemaValidationResult]> {\n const store = createStore(graph, backend, options);\n const result = await ensureSchemaImpl(backend, graph, options);\n return [store, result];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/node.ts","../src/core/edge.ts","../src/core/meta-edge.ts","../src/core/external-ref.ts","../src/ontology/core-meta-edges.ts","../src/query/compiler/passes/recursive.ts","../src/query/compiler/passes/runner.ts","../src/query/compiler/temporal.ts","../src/query/compiler/passes/temporal.ts","../src/query/subquery-utils.ts","../src/query/predicates.ts","../src/query/compiler/predicates.ts","../src/query/compiler/passes/vector.ts","../src/query/compiler/plan/lowering.ts","../src/query/compiler/emitter/plan-inspector.ts","../src/query/compiler/emitter/recursive.ts","../src/query/compiler/emitter/set-operations.ts","../src/query/compiler/emitter/standard.ts","../src/query/compiler/predicate-utils.ts","../src/query/compiler/typed-json-extract.ts","../src/query/compiler/utils.ts","../src/query/compiler/emitter/standard-builders.ts","../src/query/compiler/recursive.ts","../src/query/compiler/schema.ts","../src/query/compiler/set-operations.ts","../src/query/compiler/standard-pass-pipeline.ts","../src/query/compiler/index.ts","../src/query/cursor.ts","../src/utils/id.ts","../src/utils/path.ts","../src/query/execution/result-mapper.ts","../src/query/execution/pagination.ts","../src/query/ast.ts","../src/query/execution/field-tracker.ts","../src/query/execution/value-decoder.ts","../src/query/execution/selective-result-mapper.ts","../src/query/builder/validation.ts","../src/query/builder/ast-builder.ts","../src/query/builder/prepared-query.ts","../src/query/builder/executable-query.ts","../src/query/builder/executable-aggregate-query.ts","../src/query/builder/traversal-builder.ts","../src/query/builder/query-builder.ts","../src/query/builder/unionable-query.ts","../src/query/builder/aggregates.ts","../src/query/builder/fragment.ts","../src/query/builder/index.ts","../src/query/builder.ts","../src/registry/builders.ts","../src/store/collections/edge-collection.ts","../src/store/collections/node-collection.ts","../src/store/collection-factory.ts","../src/constraints/index.ts","../src/store/constraints.ts","../src/store/row-mappers.ts","../src/store/operations/edge-operations.ts","../src/store/embedding-sync.ts","../src/store/uniqueness.ts","../src/store/operations/node-operations.ts","../src/store/store.ts"],"names":["validateSchemaKeys","z","field","expr","qualifier","sql","normalizeValueType","literal","pattern","left","opSql","arrayField","predicate","hasVariableLengthTraversal","compileKindFilter","quoteIdentifier","compileQuery","collectRequiredColumnsByAlias","compileSetOperation","having","jsonPointer","RESERVED_NODE_KEYS","RESERVED_EDGE_KEYS","nullToUndefined","value","rawRows","NOT_COMPUTED","max","min","rowToEdge","executeEdgeCreate","executeEdgeCreateNoReturnBatch","executeEdgeCreateBatch","executeEdgeUpdate","executeEdgeUpsertUpdate","executeEdgeDelete","executeEdgeHardDelete","results","rowToNode","executeNodeCreate","executeNodeCreateNoReturnBatch","executeNodeCreateBatch","executeNodeUpdate","executeNodeUpsertUpdate","executeNodeDelete","executeNodeHardDelete","mode","count","exists","edge"],"mappings":"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","file":"index.js","sourcesContent":["import { type z } from \"zod\";\n\nimport { ConfigurationError } from \"../errors/index\";\nimport { NODE_TYPE_BRAND, type NodeType } from \"./types\";\n\n// ============================================================\n// Reserved Keys\n// ============================================================\n\n/**\n * Property names that are reserved for system use and cannot appear in node schemas.\n * These are used for flattened node instances where props are spread at the top level.\n */\nconst RESERVED_NODE_KEYS = new Set([\"id\", \"kind\", \"meta\"]);\n\n// ============================================================\n// Node Factory Options\n// ============================================================\n\n/**\n * Options for defining a node type.\n */\nexport type DefineNodeOptions<S extends z.ZodObject<z.ZodRawShape>> = Readonly<{\n /** Zod schema for node properties */\n schema: S;\n /** Optional description for documentation */\n description?: string;\n}>;\n\n// ============================================================\n// Node Factory\n// ============================================================\n\n/**\n * Validates that a schema does not contain reserved property names.\n */\nfunction validateSchemaKeys(\n schema: z.ZodObject<z.ZodRawShape>,\n name: string,\n): void {\n const shape = schema.shape;\n const conflicts = Object.keys(shape).filter((key) =>\n RESERVED_NODE_KEYS.has(key),\n );\n if (conflicts.length > 0) {\n throw new ConfigurationError(\n `Node \"${name}\" schema contains reserved property names: ${conflicts.join(\", \")}`,\n { nodeType: name, conflicts, reservedKeys: [...RESERVED_NODE_KEYS] },\n {\n suggestion: `Rename the conflicting properties. Reserved names (id, kind, meta) are added automatically to all nodes.`,\n },\n );\n }\n}\n\n/**\n * Creates a node type definition.\n *\n * @example\n * ```typescript\n * const Person = defineNode(\"Person\", {\n * schema: z.object({\n * fullName: z.string().min(1),\n * email: z.string().email().optional(),\n * }),\n * description: \"A person in the system\",\n * });\n * ```\n */\nexport function defineNode<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n>(name: K, options: DefineNodeOptions<S>): NodeType<K, S> {\n validateSchemaKeys(options.schema, name);\n\n return Object.freeze({\n [NODE_TYPE_BRAND]: true as const,\n kind: name,\n schema: options.schema,\n description: options.description,\n }) as NodeType<K, S>;\n}\n","import { z } from \"zod\";\n\nimport { ConfigurationError } from \"../errors/index\";\nimport { EDGE_TYPE_BRAND, type EdgeType, type NodeType } from \"./types\";\n\n// ============================================================\n// Reserved Keys\n// ============================================================\n\n/**\n * Property names that are reserved for system use and cannot appear in edge schemas.\n * These are used for flattened edge instances where props are spread at the top level.\n */\nconst RESERVED_EDGE_KEYS = new Set([\n \"id\",\n \"kind\",\n \"meta\",\n \"fromKind\",\n \"fromId\",\n \"toKind\",\n \"toId\",\n]);\n\n// ============================================================\n// Edge Factory Options\n// ============================================================\n\n/**\n * Options for defining an edge type.\n */\nexport type DefineEdgeOptions<\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[] | undefined = undefined,\n To extends readonly NodeType[] | undefined = undefined,\n> = Readonly<{\n /** Zod schema for edge properties (defaults to empty object) */\n schema?: S;\n /** Optional description for documentation */\n description?: string;\n /** Node types that can be the source of this edge (domain constraint) */\n from?: From;\n /** Node types that can be the target of this edge (range constraint) */\n to?: To;\n}>;\n\n// ============================================================\n// Empty Schema\n// ============================================================\n\nconst EMPTY_SCHEMA = z.object({});\ntype EmptySchema = typeof EMPTY_SCHEMA;\n\n// ============================================================\n// Edge Factory\n// ============================================================\n\n/**\n * Validates that a schema does not contain reserved property names.\n */\nfunction validateSchemaKeys(\n schema: z.ZodObject<z.ZodRawShape>,\n name: string,\n): void {\n const shape = schema.shape;\n const conflicts = Object.keys(shape).filter((key) =>\n RESERVED_EDGE_KEYS.has(key),\n );\n if (conflicts.length > 0) {\n throw new ConfigurationError(\n `Edge \"${name}\" schema contains reserved property names: ${conflicts.join(\", \")}`,\n { edgeType: name, conflicts, reservedKeys: [...RESERVED_EDGE_KEYS] },\n {\n suggestion: `Rename the conflicting properties. Reserved names are added automatically to all edges.`,\n },\n );\n }\n}\n\n/**\n * Creates an edge type definition.\n *\n * @example\n * ```typescript\n * // Edge with no properties\n * const hasEpisode = defineEdge(\"hasEpisode\");\n *\n * // Edge with properties\n * const employedAt = defineEdge(\"employedAt\", {\n * schema: z.object({\n * isPrimary: z.boolean().default(true),\n * startedAt: z.date(),\n * }),\n * description: \"Employment relationship\",\n * });\n *\n * // Edge with domain/range constraints (can be used directly in defineGraph)\n * const worksAt = defineEdge(\"worksAt\", {\n * schema: z.object({ role: z.string() }),\n * from: [Person],\n * to: [Company],\n * });\n * ```\n */\n// Overload: no options - returns edge without domain/range\nexport function defineEdge<K extends string>(name: K): EdgeType<K, EmptySchema>;\n\n// Overload: options with both from and to - returns edge with domain/range\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[],\n To extends readonly NodeType[],\n>(\n name: K,\n options: DefineEdgeOptions<S, From, To> & { from: From; to: To },\n): EdgeType<K, S, From, To>;\n\n// Overload: options without from/to - returns edge without domain/range\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n>(name: K, options: DefineEdgeOptions<S>): EdgeType<K, S>;\n\n// Implementation\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[] | undefined,\n To extends readonly NodeType[] | undefined,\n>(\n name: K,\n options?: DefineEdgeOptions<S, From, To>,\n): EdgeType<K, S, From, To> | EdgeType<K, EmptySchema> {\n const schema = options?.schema ?? EMPTY_SCHEMA;\n validateSchemaKeys(schema, name);\n\n return Object.freeze({\n [EDGE_TYPE_BRAND]: true as const,\n kind: name,\n schema,\n description: options?.description,\n from: options?.from,\n to: options?.to,\n }) as EdgeType<K, S, From, To> | EdgeType<K, EmptySchema>;\n}\n","import {\n type InferenceType,\n META_EDGE_BRAND,\n type MetaEdge,\n type MetaEdgeProperties,\n} from \"../ontology/types\";\n\n// ============================================================\n// Meta-Edge Factory Options\n// ============================================================\n\n/**\n * Options for creating a meta-edge.\n */\nexport type MetaEdgeOptions = Readonly<{\n /** Whether the relationship is transitive (A→B, B→C implies A→C) */\n transitive?: boolean;\n /** Whether the relationship is symmetric (A→B implies B→A) */\n symmetric?: boolean;\n /** Whether the relationship is reflexive (A→A is always true) */\n reflexive?: boolean;\n /** Name of the inverse meta-edge */\n inverse?: string;\n /** How this meta-edge affects queries and validation */\n inference?: InferenceType;\n /** Optional description */\n description?: string;\n}>;\n\n// ============================================================\n// Meta-Edge Factory\n// ============================================================\n\n/**\n * Creates a custom meta-edge definition.\n *\n * @example\n * ```typescript\n * // Custom meta-edge for regulatory relationships\n * const regulatedBy = metaEdge(\"regulatedBy\", {\n * description: \"Type X is regulated by authority type Y\",\n * transitive: false,\n * symmetric: false,\n * });\n * ```\n */\nexport function metaEdge<K extends string>(\n name: K,\n options: MetaEdgeOptions = {},\n): MetaEdge<K> {\n const properties: MetaEdgeProperties = {\n transitive: options.transitive ?? false,\n symmetric: options.symmetric ?? false,\n reflexive: options.reflexive ?? false,\n inverse: options.inverse,\n inference: options.inference ?? \"none\",\n description: options.description,\n };\n\n return Object.freeze({\n [META_EDGE_BRAND]: true as const,\n name,\n properties,\n }) as MetaEdge<K>;\n}\n","/**\n * External reference type for hybrid overlay patterns.\n *\n * Creates a Zod-compatible schema for referencing entities in external\n * data sources (e.g., existing application tables) from TypeGraph nodes.\n */\nimport { z } from \"zod\";\n\n// ============================================================\n// External Reference Metadata Symbol\n// ============================================================\n\n/**\n * Symbol key for storing external table name on the schema.\n * This allows the schema introspector to detect external reference types\n * and extract source information.\n */\nexport const EXTERNAL_REF_TABLE_KEY = \"_externalRefTable\" as const;\n\n// ============================================================\n// External Reference Value Type\n// ============================================================\n\n/**\n * The shape of an external reference value.\n * Contains the source table identifier and the ID of the referenced record.\n */\nexport type ExternalRefValue<T extends string = string> = Readonly<{\n table: T;\n id: string;\n}>;\n\n// ============================================================\n// External Reference Schema Type\n// ============================================================\n\n/**\n * A Zod schema for external references with attached table metadata.\n */\nexport type ExternalRefSchema<T extends string = string> = z.ZodType<\n ExternalRefValue<T>\n> &\n Readonly<{\n [EXTERNAL_REF_TABLE_KEY]: T;\n }>;\n\n// ============================================================\n// External Reference Factory\n// ============================================================\n\n/**\n * Creates a Zod schema for referencing external data sources.\n *\n * Use this when building a hybrid overlay where TypeGraph stores\n * graph relationships and metadata while your existing tables\n * remain the source of truth for entity data.\n *\n * @param table - The identifier for the external table/source (e.g., \"users\", \"documents\")\n * @returns A Zod schema that validates external reference objects\n *\n * @example\n * ```typescript\n * import { defineNode, externalRef, embedding } from \"@nicia-ai/typegraph\";\n *\n * // Reference documents from your existing application database\n * const Document = defineNode(\"Document\", {\n * schema: z.object({\n * source: externalRef(\"documents\"),\n * embedding: embedding(1536).optional(),\n * extractedTopics: z.array(z.string()).optional(),\n * }),\n * });\n *\n * // Create a node referencing an external document\n * await store.nodes.Document.create({\n * source: { table: \"documents\", id: \"doc_abc123\" },\n * embedding: await generateEmbedding(docContent),\n * });\n *\n * // Query and hydrate with external data\n * const results = await store\n * .query()\n * .from(\"Document\", \"d\")\n * .whereNode(\"d\", (d) => d.embedding.similarTo(query, 10))\n * .select((ctx) => ctx.d.source)\n * .execute();\n *\n * // Fetch full data from your app database\n * const externalIds = results.map((r) => r.id);\n * const fullDocs = await appDb.query.documents.findMany({\n * where: inArray(documents.id, externalIds),\n * });\n * ```\n */\nexport function externalRef<T extends string>(table: T): ExternalRefSchema<T> {\n if (typeof table !== \"string\" || table.length === 0) {\n throw new Error(\n `External reference table must be a non-empty string, got: ${typeof table === \"string\" ? `\"${table}\"` : typeof table}`,\n );\n }\n\n const schema = z.object({\n table: z.literal(table),\n id: z.string().min(1, \"External reference ID must be non-empty\"),\n });\n\n // Attach table metadata for introspection\n return Object.assign(schema, {\n [EXTERNAL_REF_TABLE_KEY]: table,\n }) as unknown as ExternalRefSchema<T>;\n}\n\n// ============================================================\n// Type Guards\n// ============================================================\n\n/**\n * Checks if a value is an external reference schema.\n */\nexport function isExternalRefSchema(\n value: unknown,\n): value is ExternalRefSchema {\n return (\n typeof value === \"object\" &&\n value !== null &&\n EXTERNAL_REF_TABLE_KEY in value &&\n typeof (value as Record<string, unknown>)[EXTERNAL_REF_TABLE_KEY] ===\n \"string\"\n );\n}\n\n/**\n * Gets the table name from an external reference schema.\n * Returns undefined if the schema is not an external reference schema.\n */\nexport function getExternalRefTable(schema: z.ZodType): string | undefined {\n if (isExternalRefSchema(schema)) {\n return schema[EXTERNAL_REF_TABLE_KEY];\n }\n return undefined;\n}\n\n// ============================================================\n// Helper for creating reference values\n// ============================================================\n\n/**\n * Helper function to create a typed external reference value.\n * Useful when you want to avoid repeating the table name.\n *\n * @example\n * ```typescript\n * const docRef = createExternalRef(\"documents\");\n *\n * await store.nodes.Document.create({\n * source: docRef(\"doc_123\"),\n * embedding: [...],\n * });\n * ```\n */\nexport function createExternalRef<T extends string>(\n table: T,\n): (id: string) => ExternalRefValue<T> {\n return (id: string) => ({ table, id });\n}\n","import { type EdgeType, type NodeType } from \"../core/types\";\nimport {\n META_EDGE_BROADER,\n META_EDGE_DIFFERENT_FROM,\n META_EDGE_DISJOINT_WITH,\n META_EDGE_EQUIVALENT_TO,\n META_EDGE_HAS_PART,\n META_EDGE_IMPLIES,\n META_EDGE_INVERSE_OF,\n META_EDGE_NARROWER,\n META_EDGE_PART_OF,\n META_EDGE_RELATED_TO,\n META_EDGE_SAME_AS,\n META_EDGE_SUB_CLASS_OF,\n} from \"./constants\";\nimport { META_EDGE_BRAND, type MetaEdge, type OntologyRelation } from \"./types\";\n\n// ============================================================\n// Helper to Create Meta-Edge\n// ============================================================\n\nfunction createMetaEdge<K extends string>(\n name: K,\n properties: {\n transitive?: boolean;\n symmetric?: boolean;\n reflexive?: boolean;\n inverse?: string;\n inference:\n | \"subsumption\"\n | \"hierarchy\"\n | \"substitution\"\n | \"constraint\"\n | \"composition\"\n | \"association\"\n | \"none\";\n description: string;\n },\n): MetaEdge<K> {\n return Object.freeze({\n [META_EDGE_BRAND]: true as const,\n name,\n properties: {\n transitive: properties.transitive ?? false,\n symmetric: properties.symmetric ?? false,\n reflexive: properties.reflexive ?? false,\n inverse: properties.inverse,\n inference: properties.inference,\n description: properties.description,\n },\n }) as MetaEdge<K>;\n}\n\n// ============================================================\n// Subsumption & Classification\n// ============================================================\n\n/**\n * Type inheritance relationship.\n * A subClassOf B means instances of A are also instances of B.\n */\nconst subClassOfMetaEdge = createMetaEdge(META_EDGE_SUB_CLASS_OF, {\n transitive: true,\n inference: \"subsumption\",\n description: \"Type inheritance (Podcast subClassOf Media)\",\n});\n\n/**\n * Creates a subClassOf ontology relation.\n */\nexport function subClassOf(\n child: NodeType,\n parent: NodeType,\n): OntologyRelation {\n return {\n metaEdge: subClassOfMetaEdge,\n from: child,\n to: parent,\n };\n}\n\n// ============================================================\n// Hierarchical (SKOS-inspired)\n// ============================================================\n\n/**\n * Broader concept relationship.\n * A broader B means A is a more specific concept than B.\n */\nconst broaderMetaEdge = createMetaEdge(META_EDGE_BROADER, {\n transitive: true,\n inverse: META_EDGE_NARROWER,\n inference: \"hierarchy\",\n description: \"Broader concept (ML broader AI)\",\n});\n\n/**\n * Creates a broader ontology relation.\n */\nexport function broader(\n narrowerConcept: NodeType,\n broaderConcept: NodeType,\n): OntologyRelation {\n return {\n metaEdge: broaderMetaEdge,\n from: narrowerConcept,\n to: broaderConcept,\n };\n}\n\n/**\n * Narrower concept relationship.\n * A narrower B means A is a more general concept than B.\n */\nconst narrowerMetaEdge = createMetaEdge(META_EDGE_NARROWER, {\n transitive: true,\n inverse: META_EDGE_BROADER,\n inference: \"hierarchy\",\n description: \"Narrower concept (AI narrower ML)\",\n});\n\n/**\n * Creates a narrower ontology relation.\n */\nexport function narrower(\n broaderConcept: NodeType,\n narrowerConcept: NodeType,\n): OntologyRelation {\n return {\n metaEdge: narrowerMetaEdge,\n from: broaderConcept,\n to: narrowerConcept,\n };\n}\n\n/**\n * Related concept relationship.\n * Non-hierarchical association between concepts.\n */\nconst relatedToMetaEdge = createMetaEdge(META_EDGE_RELATED_TO, {\n symmetric: true,\n inference: \"association\",\n description: \"Non-hierarchical association\",\n});\n\n/**\n * Creates a relatedTo ontology relation.\n */\nexport function relatedTo(\n conceptA: NodeType,\n conceptB: NodeType,\n): OntologyRelation {\n return {\n metaEdge: relatedToMetaEdge,\n from: conceptA,\n to: conceptB,\n };\n}\n\n// ============================================================\n// Equivalence & Identity (OWL-inspired)\n// ============================================================\n\n/**\n * Type equivalence relationship.\n * A equivalentTo B means they represent the same class.\n */\nconst equivalentToMetaEdge = createMetaEdge(META_EDGE_EQUIVALENT_TO, {\n symmetric: true,\n transitive: true,\n inference: \"substitution\",\n description: \"Same class, different representation\",\n});\n\n/**\n * Creates an equivalentTo ontology relation.\n * Can be used with external IRIs for cross-system mapping.\n */\nexport function equivalentTo(\n kindA: NodeType,\n kindBOrIri: NodeType | string,\n): OntologyRelation {\n return {\n metaEdge: equivalentToMetaEdge,\n from: kindA,\n to: kindBOrIri,\n };\n}\n\n/**\n * Instance identity relationship.\n * A sameAs B means they refer to the same individual.\n */\nconst sameAsMetaEdge = createMetaEdge(META_EDGE_SAME_AS, {\n symmetric: true,\n transitive: true,\n inference: \"substitution\",\n description: \"Same individual (for deduplication)\",\n});\n\n/**\n * Creates a sameAs ontology relation.\n */\nexport function sameAs(\n kindA: NodeType,\n kindBOrIri: NodeType | string,\n): OntologyRelation {\n return {\n metaEdge: sameAsMetaEdge,\n from: kindA,\n to: kindBOrIri,\n };\n}\n\n/**\n * Explicit non-identity relationship.\n * A differentFrom B means they are definitely different individuals.\n */\nconst differentFromMetaEdge = createMetaEdge(META_EDGE_DIFFERENT_FROM, {\n symmetric: true,\n inference: \"constraint\",\n description: \"Explicitly different individuals\",\n});\n\n/**\n * Creates a differentFrom ontology relation.\n */\nexport function differentFrom(\n kindA: NodeType,\n kindB: NodeType,\n): OntologyRelation {\n return {\n metaEdge: differentFromMetaEdge,\n from: kindA,\n to: kindB,\n };\n}\n\n/**\n * Disjoint types relationship.\n * A disjointWith B means nothing can be both an A and a B.\n */\nconst disjointWithMetaEdge = createMetaEdge(META_EDGE_DISJOINT_WITH, {\n symmetric: true,\n inference: \"constraint\",\n description: \"Mutually exclusive types\",\n});\n\n/**\n * Creates a disjointWith ontology relation.\n */\nexport function disjointWith(\n kindA: NodeType,\n kindB: NodeType,\n): OntologyRelation {\n return {\n metaEdge: disjointWithMetaEdge,\n from: kindA,\n to: kindB,\n };\n}\n\n// ============================================================\n// Mereological (Part-Whole)\n// ============================================================\n\n/**\n * Part-of relationship.\n * A partOf B means A is a component of B.\n */\nconst partOfMetaEdge = createMetaEdge(META_EDGE_PART_OF, {\n transitive: true,\n inverse: META_EDGE_HAS_PART,\n inference: \"composition\",\n description: \"X is part of Y\",\n});\n\n/**\n * Creates a partOf ontology relation.\n */\nexport function partOf(part: NodeType, whole: NodeType): OntologyRelation {\n return {\n metaEdge: partOfMetaEdge,\n from: part,\n to: whole,\n };\n}\n\n/**\n * Has-part relationship.\n * A hasPart B means A contains B as a component.\n */\nconst hasPartMetaEdge = createMetaEdge(META_EDGE_HAS_PART, {\n transitive: true,\n inverse: META_EDGE_PART_OF,\n inference: \"composition\",\n description: \"Y has part X\",\n});\n\n/**\n * Creates a hasPart ontology relation.\n */\nexport function hasPart(whole: NodeType, part: NodeType): OntologyRelation {\n return {\n metaEdge: hasPartMetaEdge,\n from: whole,\n to: part,\n };\n}\n\n// ============================================================\n// Property Relationships\n// ============================================================\n\n/**\n * Inverse edge relationship.\n * Edge A inverseOf edge B means traversing A is equivalent to traversing B backwards.\n */\nconst inverseOfMetaEdge = createMetaEdge(META_EDGE_INVERSE_OF, {\n symmetric: true,\n inference: \"none\",\n description: \"Edge A is inverse of edge B\",\n});\n\n/**\n * Implication relationship.\n * Edge A implies edge B means if A exists, B should also exist.\n */\nconst impliesMetaEdge = createMetaEdge(META_EDGE_IMPLIES, {\n transitive: true,\n inference: \"none\",\n description: \"Edge A implies edge B exists\",\n});\n\n/**\n * Creates an inverseOf ontology relation.\n * Edge A inverseOf edge B means traversing A is equivalent to traversing B backwards.\n */\nexport function inverseOf(edgeA: EdgeType, edgeB: EdgeType): OntologyRelation {\n return {\n metaEdge: inverseOfMetaEdge,\n from: edgeA,\n to: edgeB,\n };\n}\n\n/**\n * Creates an implies ontology relation.\n * Edge A implies edge B means if A exists between two nodes, B should also exist.\n */\nexport function implies(edgeA: EdgeType, edgeB: EdgeType): OntologyRelation {\n return {\n metaEdge: impliesMetaEdge,\n from: edgeA,\n to: edgeB,\n };\n}\n\n// ============================================================\n// Core Ontology Export\n// ============================================================\n\n/**\n * The core ontology module containing all built-in meta-edges\n * and their relation factory functions.\n */\nexport const core = {\n // Meta-edges\n subClassOfMetaEdge,\n broaderMetaEdge,\n narrowerMetaEdge,\n relatedToMetaEdge,\n equivalentToMetaEdge,\n sameAsMetaEdge,\n differentFromMetaEdge,\n disjointWithMetaEdge,\n partOfMetaEdge,\n hasPartMetaEdge,\n inverseOfMetaEdge,\n impliesMetaEdge,\n\n // Relation factories\n subClassOf,\n broader,\n narrower,\n relatedTo,\n equivalentTo,\n sameAs,\n differentFrom,\n disjointWith,\n partOf,\n hasPart,\n inverseOf,\n implies,\n} as const;\n","import {\n CompilerInvariantError,\n UnsupportedPredicateError,\n} from \"../../../errors\";\nimport type { QueryAst, Traversal, VariableLengthSpec } from \"../../ast\";\n\n/**\n * Traversal with required variable-length spec.\n */\nexport type VariableLengthTraversal = Traversal & {\n variableLength: VariableLengthSpec;\n};\n\n/**\n * Selects and validates the variable-length traversal target for recursive compilation.\n *\n * Invariants:\n * - Query must contain exactly one variable-length traversal.\n * - Recursive mode currently supports only a single traversal in the query.\n */\nexport function runRecursiveTraversalSelectionPass(\n ast: QueryAst,\n): VariableLengthTraversal {\n const variableLengthTraversal = ast.traversals.find(\n (traversal): traversal is VariableLengthTraversal =>\n traversal.variableLength !== undefined,\n );\n\n if (variableLengthTraversal === undefined) {\n throw new CompilerInvariantError(\"No variable-length traversal found\");\n }\n\n if (ast.traversals.length > 1) {\n throw new UnsupportedPredicateError(\n \"Variable-length traversals with multiple traversals are not yet supported. \" +\n \"Please use a single variable-length traversal.\",\n );\n }\n\n return variableLengthTraversal;\n}\n","export type CompilerPass<TState, TPassName extends string, TOutput> = Readonly<{\n name: TPassName;\n execute: (state: TState) => TOutput;\n update: (state: TState, output: TOutput) => TState;\n}>;\n\nexport type CompilerPassResult<TState> = Readonly<{\n state: TState;\n}>;\n\nexport function runCompilerPass<TState, TPassName extends string, TOutput>(\n state: TState,\n pass: CompilerPass<TState, TPassName, TOutput>,\n): CompilerPassResult<TState> {\n const output = pass.execute(state);\n return {\n state: pass.update(state, output),\n };\n}\n","/**\n * Temporal Filter Compilation\n *\n * Generates SQL clauses for temporal filtering based on valid_from/valid_to\n * and deleted_at timestamps. Consolidates the previously duplicated temporal\n * filter functions into a single, parameterized implementation.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { type TemporalMode } from \"../../core/types\";\n\n/**\n * Temporal filter options.\n */\nexport type TemporalFilterOptions = Readonly<{\n /** The temporal mode to apply */\n mode: TemporalMode;\n /** Timestamp for asOf queries (required when mode is \"asOf\") */\n asOf?: string | undefined;\n /** Optional table alias prefix for column references */\n tableAlias?: string | undefined;\n /** Optional execution-time current timestamp SQL expression */\n currentTimestamp?: SQL | undefined;\n}>;\n\n/**\n * Compiles a temporal filter to SQL.\n *\n * This is the unified temporal filter function that handles all temporal modes\n * and optional table alias prefixes. It replaces the previous three separate\n * functions (compileTemporalFilter, compileEdgeTemporalFilter, compileNodeTemporalFilter).\n *\n * @param options - Temporal filter configuration\n * @returns SQL clause for the temporal filter\n *\n * @example\n * ```typescript\n * // Without table alias (for CTEs)\n * compileTemporalFilter({ mode: \"current\" })\n * // → deleted_at IS NULL AND (valid_from IS NULL OR ...) AND ...\n *\n * // With table alias (for JOINs)\n * compileTemporalFilter({ mode: \"current\", tableAlias: \"e\" })\n * // → e.deleted_at IS NULL AND (e.valid_from IS NULL OR ...) AND ...\n *\n * // AsOf mode\n * compileTemporalFilter({ mode: \"asOf\", asOf: \"2024-01-01T00:00:00Z\" })\n * // → deleted_at IS NULL AND (valid_from IS NULL OR valid_from <= '2024-01-01...') AND ...\n * ```\n */\nexport function compileTemporalFilter(options: TemporalFilterOptions): SQL {\n const { mode, asOf, tableAlias, currentTimestamp } = options;\n\n // Build column references with optional prefix\n const prefix = tableAlias ? sql.raw(`${tableAlias}.`) : sql.raw(\"\");\n const deletedAt = sql`${prefix}deleted_at`;\n const validFrom = sql`${prefix}valid_from`;\n const validTo = sql`${prefix}valid_to`;\n\n switch (mode) {\n case \"current\": {\n const now = currentTimestamp ?? sql`CURRENT_TIMESTAMP`;\n return sql`${deletedAt} IS NULL AND (${validFrom} IS NULL OR ${validFrom} <= ${now}) AND (${validTo} IS NULL OR ${validTo} > ${now})`;\n }\n\n case \"asOf\": {\n // asOf is guaranteed to be defined - validated in QueryBuilder.temporal()\n const timestamp = asOf!;\n return sql`${deletedAt} IS NULL AND (${validFrom} IS NULL OR ${validFrom} <= ${timestamp}) AND (${validTo} IS NULL OR ${validTo} > ${timestamp})`;\n }\n\n case \"includeEnded\": {\n // Include records that have ended but not been deleted\n return sql`${deletedAt} IS NULL`;\n }\n\n case \"includeTombstones\": {\n // Include everything, no filter\n return sql.raw(\"1=1\");\n }\n }\n}\n\n/**\n * Extracts temporal options from a query AST.\n *\n * @param ast - Query AST with temporalMode\n * @param tableAlias - Optional table alias for column references\n * @returns TemporalFilterOptions for use with compileTemporalFilter\n */\nexport function extractTemporalOptions(\n ast: { temporalMode: { mode: TemporalMode; asOf?: string } },\n tableAlias?: string,\n): TemporalFilterOptions {\n return {\n mode: ast.temporalMode.mode,\n asOf: ast.temporalMode.asOf,\n tableAlias,\n };\n}\n","import { type SQL } from \"drizzle-orm\";\n\nimport type { QueryAst } from \"../../ast\";\nimport { compileTemporalFilter, extractTemporalOptions } from \"../temporal\";\n\nexport type TemporalFilterPass = Readonly<{\n forAlias: (tableAlias?: string) => SQL;\n}>;\n\n/**\n * Creates a temporal filter pass bound to a query AST and timestamp source.\n *\n * Invariant:\n * - All temporal clauses for a query use the same timestamp expression.\n */\nexport function createTemporalFilterPass(\n ast: QueryAst,\n currentTimestamp: SQL,\n): TemporalFilterPass {\n return {\n forAlias(tableAlias?: string): SQL {\n return compileTemporalFilter({\n ...extractTemporalOptions(ast, tableAlias),\n currentTimestamp,\n });\n },\n };\n}\n","/**\n * Shared utilities for subquery projection shape and type handling.\n */\nimport { type AggregateExpr, type QueryAst, type ValueType } from \"./ast\";\n\n/**\n * Normalizes a value type by treating \"unknown\" as undefined.\n */\nfunction normalizeValueType(valueType?: ValueType): ValueType | undefined {\n if (valueType === undefined || valueType === \"unknown\") {\n return undefined;\n }\n return valueType;\n}\n\n/**\n * Returns true when the type cannot be compared with IN/NOT IN.\n */\nexport function isUnsupportedInSubqueryValueType(\n valueType?: ValueType,\n): boolean {\n const normalized = normalizeValueType(valueType);\n return (\n normalized === \"array\" ||\n normalized === \"object\" ||\n normalized === \"embedding\"\n );\n}\n\n/**\n * Returns true when two value types are compatible for IN/NOT IN.\n *\n * Unknown types are treated as compatible (deferred to runtime) to preserve\n * flexibility for untyped fields.\n */\nexport function isInSubqueryTypeCompatible(\n left?: ValueType,\n right?: ValueType,\n): boolean {\n const normalizedLeft = normalizeValueType(left);\n const normalizedRight = normalizeValueType(right);\n\n if (normalizedLeft === undefined || normalizedRight === undefined) {\n return true;\n }\n\n return normalizedLeft === normalizedRight;\n}\n\n/**\n * Resolves the value type produced by an aggregate projection.\n */\nfunction getAggregateValueType(\n aggregate: AggregateExpr,\n): ValueType | undefined {\n switch (aggregate.function) {\n case \"count\":\n case \"countDistinct\":\n case \"sum\":\n case \"avg\": {\n return \"number\";\n }\n case \"min\":\n case \"max\": {\n return normalizeValueType(aggregate.field.valueType);\n }\n }\n}\n\n/**\n * Returns effective projected column value types for a subquery.\n *\n * If selective fields are present, they represent the effective projection.\n * Otherwise, falls back to the explicit projection fields.\n */\nfunction getProjectedValueTypes(\n subquery: QueryAst,\n): readonly (ValueType | undefined)[] {\n if (subquery.selectiveFields && subquery.selectiveFields.length > 0) {\n return subquery.selectiveFields.map((field) =>\n normalizeValueType(field.valueType),\n );\n }\n\n return subquery.projection.fields.map((field) => {\n if (field.source.__type === \"aggregate\") {\n return getAggregateValueType(field.source);\n }\n return normalizeValueType(field.source.valueType);\n });\n}\n\n/**\n * Returns the effective number of columns projected by a subquery.\n */\nexport function getSubqueryColumnCount(subquery: QueryAst): number {\n return getProjectedValueTypes(subquery).length;\n}\n\n/**\n * Returns the value type when a subquery projects exactly one column.\n */\nexport function getSingleSubqueryColumnValueType(\n subquery: QueryAst,\n): ValueType | undefined {\n const valueTypes = getProjectedValueTypes(subquery);\n if (valueTypes.length !== 1) {\n return undefined;\n }\n return valueTypes[0];\n}\n","/**\n * Predicate builders for TypeGraph queries.\n *\n * Provides a fluent API for building type-safe predicates.\n */\nimport { UnsupportedPredicateError } from \"../errors\";\nimport {\n type ArrayOp,\n type ArrayPredicate,\n type BetweenPredicate,\n type ComparisonOp,\n type ComparisonPredicate,\n type ExistsSubquery,\n type FieldRef,\n type InSubquery,\n type LiteralValue,\n type NullPredicate,\n type ObjectOp,\n type ObjectPredicate,\n type ParameterRef,\n type PredicateExpression,\n type QueryAst,\n type StringOp,\n type StringPredicate,\n type ValueType,\n type VectorMetricType,\n type VectorSimilarityPredicate,\n} from \"./ast\";\nimport { resolveFieldTypeInfoAtJsonPointer } from \"./field-type-info\";\nimport {\n joinJsonPointers,\n type JsonPointer,\n jsonPointer,\n type JsonPointerInput,\n type JsonPointerSegment,\n normalizeJsonPointer,\n type ResolveJsonPointer,\n type ResolveJsonPointerSegments,\n} from \"./json-pointer\";\nimport { type FieldTypeInfo } from \"./schema-introspector\";\nimport {\n getSingleSubqueryColumnValueType,\n getSubqueryColumnCount,\n isInSubqueryTypeCompatible,\n isUnsupportedInSubqueryValueType,\n} from \"./subquery-utils\";\n\n// ============================================================\n// Predicate Builder\n// ============================================================\n\n/**\n * A chainable predicate that can be combined with AND/OR.\n */\nexport type Predicate = Readonly<{\n __expr: PredicateExpression;\n and: (other: Predicate) => Predicate;\n or: (other: Predicate) => Predicate;\n not: () => Predicate;\n}>;\n\n/**\n * Creates a predicate wrapper with chainable methods.\n */\nfunction predicate(expr: PredicateExpression): Predicate {\n return {\n __expr: expr,\n and: (other: Predicate): Predicate =>\n predicate({\n __type: \"and\",\n predicates: [expr, other.__expr],\n }),\n or: (other: Predicate): Predicate =>\n predicate({\n __type: \"or\",\n predicates: [expr, other.__expr],\n }),\n not: (): Predicate =>\n predicate({\n __type: \"not\",\n predicate: expr,\n }),\n };\n}\n\n// ============================================================\n// Parameter References\n// ============================================================\n\n/**\n * Creates a named parameter reference for prepared queries.\n *\n * Use with `query.prepare()` to create reusable parameterized queries.\n * Only supported in scalar comparison positions (eq, neq, gt, etc.),\n * string operations, and between bounds. Not supported in `in()`/`notIn()`.\n *\n * @example\n * ```typescript\n * const prepared = store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(param(\"name\")))\n * .select((ctx) => ctx.p)\n * .prepare();\n *\n * const results = await prepared.execute({ name: \"Alice\" });\n * ```\n */\n// eslint-disable-next-line unicorn/prevent-abbreviations -- concise public API\nexport function param(name: string): ParameterRef {\n return { __type: \"parameter\", name };\n}\n\n/**\n * Type guard for ParameterRef values.\n */\nexport function isParameterRef(value: unknown): value is ParameterRef {\n if (typeof value !== \"object\" || value === null) return false;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime guard for untyped input\n return (value as ParameterRef).__type === \"parameter\";\n}\n\n// ============================================================\n// Field Builder\n// ============================================================\n\n/**\n * A typed field builder for creating predicates.\n */\ntype FieldBuilder<T> =\n [T] extends [string] ? StringFieldBuilder\n : [T] extends [number] ? NumberFieldBuilder\n : [T] extends [boolean] ? BooleanFieldBuilder\n : [T] extends [Date] ? DateFieldBuilder\n : [T] extends [readonly (infer U)[]] ? ArrayFieldBuilder<U>\n : [T] extends [Record<string, unknown>] ? ObjectFieldBuilder<T>\n : BaseFieldBuilder;\n\n/**\n * Base field operations available on all types.\n */\ntype BaseFieldBuilder = Readonly<{\n eq: (value: unknown) => Predicate;\n neq: (value: unknown) => Predicate;\n isNull: () => Predicate;\n isNotNull: () => Predicate;\n in: (values: readonly unknown[]) => Predicate;\n notIn: (values: readonly unknown[]) => Predicate;\n}>;\n\n/**\n * String-specific field operations.\n */\ntype StringFieldBuilder = BaseFieldBuilder &\n Readonly<{\n contains: (pattern: string | ParameterRef) => Predicate;\n startsWith: (pattern: string | ParameterRef) => Predicate;\n endsWith: (pattern: string | ParameterRef) => Predicate;\n like: (pattern: string | ParameterRef) => Predicate;\n ilike: (pattern: string | ParameterRef) => Predicate;\n }>;\n\n/**\n * Number-specific field operations.\n */\ntype NumberFieldBuilder = BaseFieldBuilder &\n Readonly<{\n gt: (value: number | ParameterRef) => Predicate;\n gte: (value: number | ParameterRef) => Predicate;\n lt: (value: number | ParameterRef) => Predicate;\n lte: (value: number | ParameterRef) => Predicate;\n between: (\n lower: number | ParameterRef,\n upper: number | ParameterRef,\n ) => Predicate;\n }>;\n\n/**\n * Boolean-specific field operations.\n */\ntype BooleanFieldBuilder = BaseFieldBuilder;\n\n/**\n * Date-specific field operations.\n */\ntype DateFieldBuilder = BaseFieldBuilder &\n Readonly<{\n gt: (value: Date | string | ParameterRef) => Predicate;\n gte: (value: Date | string | ParameterRef) => Predicate;\n lt: (value: Date | string | ParameterRef) => Predicate;\n lte: (value: Date | string | ParameterRef) => Predicate;\n between: (\n lower: Date | string | ParameterRef,\n upper: Date | string | ParameterRef,\n ) => Predicate;\n }>;\n\ntype ScalarValue = string | number | boolean | Date;\n\ntype ArrayPredicateOps<T> =\n [T] extends [ScalarValue] ?\n Readonly<{\n /** Check if array contains a specific value */\n contains: (value: T) => Predicate;\n /** Check if array contains all specified values */\n containsAll: (values: readonly T[]) => Predicate;\n /** Check if array contains any of the specified values (overlaps) */\n containsAny: (values: readonly T[]) => Predicate;\n }>\n : Readonly<Record<string, never>>;\n\n/**\n * Array-specific field operations.\n */\ntype ArrayFieldBuilder<T = unknown> = BaseFieldBuilder &\n Readonly<{\n /** Check if array is empty */\n isEmpty: () => Predicate;\n /** Check if array is not empty */\n isNotEmpty: () => Predicate;\n /** Check if array length equals a value */\n lengthEq: (length: number) => Predicate;\n /** Check if array length is greater than a value */\n lengthGt: (length: number) => Predicate;\n /** Check if array length is greater than or equal to a value */\n lengthGte: (length: number) => Predicate;\n /** Check if array length is less than a value */\n lengthLt: (length: number) => Predicate;\n /** Check if array length is less than or equal to a value */\n lengthLte: (length: number) => Predicate;\n }> &\n ArrayPredicateOps<T>;\n\n/**\n * Object/JSON-specific field operations.\n */\ntype ResolvedPointerInput<T, Pointer> =\n Pointer extends string ? ResolveJsonPointer<T, Pointer>\n : Pointer extends readonly JsonPointerSegment[] ?\n ResolveJsonPointerSegments<T, Pointer>\n : unknown;\n\n/**\n * Resolves the type of a nested key access on an object type.\n * Returns ObjectFieldBuilder for nested objects, FieldBuilder for scalars.\n */\ntype NestedFieldBuilder<T, K extends keyof T> =\n NonNullable<T[K]> extends Record<string, unknown> ?\n ObjectFieldBuilder<NonNullable<T[K]>>\n : FieldBuilder<T[K]>;\n\ntype ObjectFieldBuilder<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = BaseFieldBuilder &\n Readonly<{\n /** Access a nested field by key for fluent chaining */\n get: <K extends keyof T & string>(key: K) => NestedFieldBuilder<T, K>;\n /** Check if object has a specific key at root level */\n hasKey: (key: string) => Predicate;\n /** Check if object has a nested path (JSON Pointer) */\n hasPath: <P extends JsonPointerInput<T>>(pointer: P) => Predicate;\n /** Check if value at path equals a value */\n pathEquals: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => Predicate;\n /** Check if value at path (array) contains a value */\n pathContains: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => Predicate;\n /** Check if value at path is null */\n pathIsNull: <P extends JsonPointerInput<T>>(pointer: P) => Predicate;\n /** Check if value at path is not null */\n pathIsNotNull: <P extends JsonPointerInput<T>>(pointer: P) => Predicate;\n /** Access a nested field to get a typed field builder */\n field: <P extends JsonPointerInput<T>>(\n pointer: P,\n ) => FieldBuilder<ResolvedPointerInput<T, P>>;\n }>;\n\n/**\n * Options for the similarTo method.\n */\nexport type SimilarToOptions = Readonly<{\n /** Similarity metric to use. Default: \"cosine\" */\n metric?: VectorMetricType;\n /**\n * Minimum similarity score to include results.\n * For cosine: 0-1 where 1 is identical.\n * For L2: maximum distance to include.\n * For inner_product: minimum inner product value.\n */\n minScore?: number;\n}>;\n\n/**\n * Embedding-specific field operations for vector similarity search.\n */\ntype EmbeddingFieldBuilder = BaseFieldBuilder &\n Readonly<{\n /**\n * Find nodes with similar embeddings.\n * Returns results ordered by similarity (most similar first).\n *\n * @param queryEmbedding - The embedding vector to compare against\n * @param k - Maximum number of results to return (top-k)\n * @param options - Optional configuration (metric, minScore)\n *\n * @example\n * ```typescript\n * store.query()\n * .from(\"Document\", \"d\")\n * .whereNode(\"d\", (d) =>\n * d.embedding.similarTo(queryVector, 10, { metric: \"cosine\" })\n * )\n * .select((ctx) => ({ doc: ctx.d }))\n * .execute()\n * ```\n */\n similarTo: (\n queryEmbedding: readonly number[],\n k: number,\n options?: SimilarToOptions,\n ) => Predicate;\n }>;\n\n// ============================================================\n// Field Builder Factory\n// ============================================================\n\n/**\n * Creates a field reference.\n */\ntype FieldRefOptions = Readonly<{\n jsonPointer?: JsonPointer | undefined;\n valueType?: ValueType | undefined;\n elementType?: ValueType | undefined;\n}>;\n\nexport function fieldRef(\n alias: string,\n path: readonly string[],\n options?: FieldRefOptions,\n): FieldRef {\n return {\n __type: \"field_ref\",\n alias,\n path,\n ...(options?.jsonPointer !== undefined && {\n jsonPointer: options.jsonPointer,\n }),\n ...(options?.valueType !== undefined && { valueType: options.valueType }),\n ...(options?.elementType !== undefined && {\n elementType: options.elementType,\n }),\n };\n}\n\nfunction coerceLiteralValue(value: unknown): string | number | boolean | Date {\n if (value instanceof Date) {\n return value;\n }\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n throw new Error(`Unsupported literal value type: ${typeof value}`);\n}\n\nfunction inferLiteralValueType(value: string | number | boolean): ValueType {\n if (typeof value === \"string\") {\n return \"string\";\n }\n if (typeof value === \"number\") {\n return \"number\";\n }\n return \"boolean\";\n}\n\n/**\n * Creates a literal value.\n */\nfunction literal(value: string | number | boolean | Date): LiteralValue {\n if (value instanceof Date) {\n return { __type: \"literal\", value: value.toISOString(), valueType: \"date\" };\n }\n const valueType = inferLiteralValueType(value);\n return {\n __type: \"literal\",\n value,\n valueType,\n };\n}\n\n/**\n * Creates a comparison predicate.\n */\nfunction comparison(\n op: ComparisonOp,\n field: FieldRef,\n value: unknown,\n): Predicate {\n if (isParameterRef(value)) {\n const expr: ComparisonPredicate = {\n __type: \"comparison\",\n op,\n left: field,\n right: value,\n };\n return predicate(expr);\n }\n const coercedValue = coerceLiteralValue(value);\n const expr: ComparisonPredicate = {\n __type: \"comparison\",\n op,\n left: field,\n right: literal(coercedValue),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an IN comparison predicate.\n */\nfunction inComparison(\n op: \"in\" | \"notIn\",\n field: FieldRef,\n values: readonly unknown[],\n): Predicate {\n const literals = values.map((value) => literal(coerceLiteralValue(value)));\n const expr: ComparisonPredicate = {\n __type: \"comparison\",\n op,\n left: field,\n right: literals,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a string operation predicate.\n */\nfunction stringOp(\n op: StringOp,\n field: FieldRef,\n pattern: string | ParameterRef,\n): Predicate {\n if (isParameterRef(pattern)) {\n const expr: StringPredicate = {\n __type: \"string_op\",\n op,\n field,\n pattern,\n };\n return predicate(expr);\n }\n const expr: StringPredicate = {\n __type: \"string_op\",\n op,\n field,\n pattern,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a null check predicate.\n */\nfunction nullCheck(op: \"isNull\" | \"isNotNull\", field: FieldRef): Predicate {\n const expr: NullPredicate = {\n __type: \"null_check\",\n op,\n field,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a between predicate.\n */\nfunction between(\n field: FieldRef,\n lower: string | number | boolean | Date | ParameterRef,\n upper: string | number | boolean | Date | ParameterRef,\n): Predicate {\n const expr: BetweenPredicate = {\n __type: \"between\",\n field,\n lower: isParameterRef(lower) ? lower : literal(lower),\n upper: isParameterRef(upper) ? upper : literal(upper),\n };\n return predicate(expr);\n}\n\n/**\n * Creates a base field builder with common operations.\n */\nfunction baseFieldBuilder(field: FieldRef): BaseFieldBuilder {\n return {\n eq: (value) => comparison(\"eq\", field, value),\n neq: (value) => comparison(\"neq\", field, value),\n isNull: () => nullCheck(\"isNull\", field),\n isNotNull: () => nullCheck(\"isNotNull\", field),\n in: (values) => inComparison(\"in\", field, values),\n notIn: (values) => inComparison(\"notIn\", field, values),\n };\n}\n\n/**\n * Creates a string field builder.\n */\nexport function stringField(field: FieldRef): StringFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n contains: (pattern) => stringOp(\"contains\", field, pattern),\n startsWith: (pattern) => stringOp(\"startsWith\", field, pattern),\n endsWith: (pattern) => stringOp(\"endsWith\", field, pattern),\n like: (pattern) => stringOp(\"like\", field, pattern),\n ilike: (pattern) => stringOp(\"ilike\", field, pattern),\n };\n}\n\n/**\n * Creates a number field builder.\n */\nexport function numberField(field: FieldRef): NumberFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n gt: (value) => comparison(\"gt\", field, value),\n gte: (value) => comparison(\"gte\", field, value),\n lt: (value) => comparison(\"lt\", field, value),\n lte: (value) => comparison(\"lte\", field, value),\n between: (lower, upper) => between(field, lower, upper),\n };\n}\n\n/**\n * Creates a date field builder.\n */\nexport function dateField(field: FieldRef): DateFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n gt: (value) => comparison(\"gt\", field, value),\n gte: (value) => comparison(\"gte\", field, value),\n lt: (value) => comparison(\"lt\", field, value),\n lte: (value) => comparison(\"lte\", field, value),\n between: (lower, upper) => between(field, lower, upper),\n };\n}\n\n/**\n * Creates a base field builder (for booleans, enums, and unknown types).\n * Only provides the fundamental operations: eq, neq, isNull, isNotNull, in, notIn.\n */\nexport function baseField(field: FieldRef): BaseFieldBuilder {\n return baseFieldBuilder(field);\n}\n\n/**\n * Creates an array operation predicate.\n */\nfunction arrayOp(\n op: ArrayOp,\n field: FieldRef,\n values?: readonly unknown[],\n length?: number,\n): Predicate {\n const expr: ArrayPredicate = {\n __type: \"array_op\",\n op,\n field,\n ...(values !== undefined && {\n values: values.map((value) => literal(coerceLiteralValue(value))),\n }),\n ...(length !== undefined && { length }),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an array field builder.\n */\nexport function arrayField<T = unknown>(field: FieldRef): ArrayFieldBuilder<T> {\n // The type assertion is needed because ArrayFieldBuilder conditionally includes\n // contains/containsAll/containsAny based on whether T extends ScalarValue.\n // At runtime we always provide them - they just won't type-check if T isn't scalar.\n return {\n ...baseFieldBuilder(field),\n contains: (value: T) => arrayOp(\"contains\", field, [value]),\n containsAll: (values: readonly T[]) =>\n arrayOp(\"containsAll\", field, values),\n containsAny: (values: readonly T[]) =>\n arrayOp(\"containsAny\", field, values),\n isEmpty: () => arrayOp(\"isEmpty\", field),\n isNotEmpty: () => arrayOp(\"isNotEmpty\", field),\n lengthEq: (length: number) => arrayOp(\"lengthEq\", field, undefined, length),\n lengthGt: (length: number) => arrayOp(\"lengthGt\", field, undefined, length),\n lengthGte: (length: number) =>\n arrayOp(\"lengthGte\", field, undefined, length),\n lengthLt: (length: number) => arrayOp(\"lengthLt\", field, undefined, length),\n lengthLte: (length: number) =>\n arrayOp(\"lengthLte\", field, undefined, length),\n } as unknown as ArrayFieldBuilder<T>;\n}\n\n/**\n * Creates a vector similarity predicate.\n */\nfunction vectorSimilarity(\n field: FieldRef,\n queryEmbedding: readonly number[],\n limit: number,\n options?: SimilarToOptions,\n): Predicate {\n const expr: VectorSimilarityPredicate = {\n __type: \"vector_similarity\",\n field,\n queryEmbedding,\n metric: options?.metric ?? \"cosine\",\n limit,\n ...(options?.minScore !== undefined && { minScore: options.minScore }),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an embedding field builder for vector similarity search.\n */\nexport function embeddingField(field: FieldRef): EmbeddingFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n similarTo: (queryEmbedding, k, options) =>\n vectorSimilarity(field, queryEmbedding, k, options),\n };\n}\n\nfunction buildFieldBuilderForTypeInfo(\n field: FieldRef,\n typeInfo: FieldTypeInfo | undefined,\n): BaseFieldBuilder {\n if (!typeInfo) {\n return baseField(field);\n }\n\n switch (typeInfo.valueType) {\n case \"string\": {\n return stringField(field);\n }\n case \"number\": {\n return numberField(field);\n }\n case \"boolean\": {\n return baseField(field);\n }\n case \"date\": {\n return dateField(field);\n }\n case \"array\": {\n return arrayField(field);\n }\n case \"object\": {\n return objectField(field, { typeInfo });\n }\n case \"embedding\": {\n return embeddingField(field);\n }\n case \"unknown\": {\n return baseField(field);\n }\n }\n}\n\nfunction resolvePointerTypeInfo(\n typeInfo: FieldTypeInfo | undefined,\n pointer: JsonPointer,\n): FieldTypeInfo | undefined {\n return resolveFieldTypeInfoAtJsonPointer(typeInfo, pointer);\n}\n\n/**\n * Creates an object operation predicate.\n */\ntype ObjectPredicateOptions = Readonly<{\n valueType?: ValueType;\n elementType?: ValueType;\n}>;\n\nfunction objectOp(\n op: ObjectOp,\n field: FieldRef,\n pointer: JsonPointer,\n value?: unknown,\n options?: ObjectPredicateOptions,\n): Predicate {\n const expr: ObjectPredicate = {\n __type: \"object_op\",\n op,\n field,\n pointer,\n ...(value !== undefined && {\n value: literal(coerceLiteralValue(value)),\n }),\n ...(options?.valueType !== undefined && { valueType: options.valueType }),\n ...(options?.elementType !== undefined && {\n elementType: options.elementType,\n }),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an object/JSON field builder.\n */\ntype ObjectFieldOptions = Readonly<{\n typeInfo?: FieldTypeInfo;\n}>;\n\nexport function objectField<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(field: FieldRef, options?: ObjectFieldOptions): ObjectFieldBuilder<T> {\n const basePointer = field.jsonPointer;\n\n return {\n ...baseFieldBuilder(field),\n get: <K extends keyof T & string>(key: K) => {\n const pointer = jsonPointer([key]);\n const nestedPointer = joinJsonPointers(basePointer, pointer);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, pointer);\n const nestedRef = fieldRef(field.alias, field.path, {\n jsonPointer: nestedPointer,\n ...(resolved?.valueType !== undefined && {\n valueType: resolved.valueType,\n }),\n ...(resolved?.elementType !== undefined && {\n elementType: resolved.elementType,\n }),\n });\n return buildFieldBuilderForTypeInfo(nestedRef, resolved) as ReturnType<\n ObjectFieldBuilder<T>[\"get\"]\n >;\n },\n hasKey: (key) => {\n const pointer = jsonPointer([key]);\n resolvePointerTypeInfo(options?.typeInfo, pointer);\n return objectOp(\"hasKey\", field, pointer);\n },\n hasPath: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n resolvePointerTypeInfo(options?.typeInfo, normalized);\n return objectOp(\"hasPath\", field, normalized);\n },\n pathEquals: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n if (\n resolved &&\n (resolved.valueType === \"array\" || resolved.valueType === \"object\")\n ) {\n throw new Error(\"pathEquals is only supported for scalar JSON values\");\n }\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.valueType === undefined ?\n undefined\n : { valueType: resolved.valueType };\n return objectOp(\"pathEquals\", field, normalized, value, predicateOptions);\n },\n pathContains: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n if (resolved && resolved.valueType !== \"array\") {\n throw new Error(\"pathContains is only supported for JSON array values\");\n }\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.elementType === undefined ?\n undefined\n : { elementType: resolved.elementType };\n return objectOp(\n \"pathContains\",\n field,\n normalized,\n value,\n predicateOptions,\n );\n },\n pathIsNull: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.valueType === undefined ?\n undefined\n : { valueType: resolved.valueType };\n return objectOp(\n \"pathIsNull\",\n field,\n normalized,\n undefined,\n predicateOptions,\n );\n },\n pathIsNotNull: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.valueType === undefined ?\n undefined\n : { valueType: resolved.valueType };\n return objectOp(\n \"pathIsNotNull\",\n field,\n normalized,\n undefined,\n predicateOptions,\n );\n },\n field: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const nestedPointer = joinJsonPointers(basePointer, normalized);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n const nestedRef = fieldRef(field.alias, field.path, {\n jsonPointer: nestedPointer,\n ...(resolved?.valueType !== undefined && {\n valueType: resolved.valueType,\n }),\n ...(resolved?.elementType !== undefined && {\n elementType: resolved.elementType,\n }),\n });\n return buildFieldBuilderForTypeInfo(nestedRef, resolved) as FieldBuilder<\n ResolvedPointerInput<T, P>\n >;\n },\n };\n}\n\n// ============================================================\n// Subquery Predicates\n// ============================================================\n\n/**\n * Creates an EXISTS subquery predicate.\n * Returns true if the subquery returns at least one row.\n *\n * @param subquery - The subquery AST to check for existence\n *\n * @example\n * ```typescript\n * // Find persons who have at least one order\n * query\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", () =>\n * exists(\n * query.from(\"Order\", \"o\")\n * .whereNode(\"o\", (o) => o.customerId.eq(field(\"p.id\")))\n * .select((ctx) => ({ id: ctx.o.id }))\n * .toAst()\n * )\n * )\n * ```\n */\nexport function exists(subquery: QueryAst): Predicate {\n const expr: ExistsSubquery = {\n __type: \"exists\",\n subquery,\n negated: false,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a NOT EXISTS subquery predicate.\n * Returns true if the subquery returns no rows.\n *\n * @param subquery - The subquery AST to check for non-existence\n */\nexport function notExists(subquery: QueryAst): Predicate {\n const expr: ExistsSubquery = {\n __type: \"exists\",\n subquery,\n negated: true,\n };\n return predicate(expr);\n}\n\n/**\n * Creates an IN subquery predicate.\n * Returns true if the field value is in the subquery results.\n *\n * @param field - The field to check\n * @param subquery - The subquery AST that returns a single column\n *\n * @example\n * ```typescript\n * // Find persons whose ID is in the VIP list\n * query\n * .from(\"Person\", \"p\")\n * .where(() =>\n * inSubquery(\n * fieldRef(\"p\", [\"id\"]),\n * query.from(\"VIPMember\", \"v\")\n * .aggregate({\n * id: fieldRef(\"v\", [\"props\", \"personId\"], { valueType: \"string\" }),\n * })\n * .toAst()\n * )\n * )\n * ```\n */\nexport function inSubquery(field: FieldRef, subquery: QueryAst): Predicate {\n assertSingleColumnSubquery(subquery);\n assertCompatibleSubqueryValueTypes(field, subquery);\n const expr: InSubquery = {\n __type: \"in_subquery\",\n field,\n subquery,\n negated: false,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a NOT IN subquery predicate.\n * Returns true if the field value is not in the subquery results.\n *\n * @param field - The field to check\n * @param subquery - The subquery AST that returns a single column\n */\nexport function notInSubquery(field: FieldRef, subquery: QueryAst): Predicate {\n assertSingleColumnSubquery(subquery);\n assertCompatibleSubqueryValueTypes(field, subquery);\n const expr: InSubquery = {\n __type: \"in_subquery\",\n field,\n subquery,\n negated: true,\n };\n return predicate(expr);\n}\n\n/**\n * Ensures IN/NOT IN subqueries project exactly one column.\n */\nfunction assertSingleColumnSubquery(subquery: QueryAst): void {\n const columnCount = getSubqueryColumnCount(subquery);\n if (columnCount === 1) return;\n\n throw new UnsupportedPredicateError(\n `IN/NOT IN subquery must project exactly 1 column, but got ${columnCount}`,\n { subqueryColumnCount: columnCount },\n {\n suggestion:\n \"Use aggregate() with exactly one projected field for scalar IN/NOT IN subqueries.\",\n },\n );\n}\n\n/**\n * Ensures IN/NOT IN subquery and field value types are compatible when known.\n */\nfunction assertCompatibleSubqueryValueTypes(\n field: FieldRef,\n subquery: QueryAst,\n): void {\n const fieldValueType = field.valueType;\n const subqueryValueType = getSingleSubqueryColumnValueType(subquery);\n const resolvedValueType = fieldValueType ?? subqueryValueType;\n\n if (isUnsupportedInSubqueryValueType(resolvedValueType)) {\n throw new UnsupportedPredicateError(\n `IN/NOT IN subquery does not support ${String(resolvedValueType)} values`,\n { valueType: resolvedValueType },\n {\n suggestion:\n \"Use scalar fields (string/number/boolean/date) in IN/NOT IN predicates.\",\n },\n );\n }\n\n if (isInSubqueryTypeCompatible(fieldValueType, subqueryValueType)) {\n return;\n }\n\n throw new UnsupportedPredicateError(\n `IN/NOT IN type mismatch: field type \"${String(fieldValueType)}\" does not match subquery column type \"${String(subqueryValueType)}\"`,\n {\n fieldValueType,\n subqueryValueType,\n },\n );\n}\n","/**\n * Predicate Expression Compilation\n *\n * Compiles predicate AST nodes to SQL using dialect adapters.\n * Handles comparisons, string operations, null checks, array/object predicates,\n * and subqueries.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { UnsupportedPredicateError } from \"../../errors\";\nimport {\n type ArrayPredicate,\n type ExistsSubquery,\n type FieldRef,\n type InSubquery,\n type LiteralValue,\n type ObjectPredicate,\n type ParameterRef,\n type PredicateExpression,\n type QueryAst,\n type ValueType,\n type VectorSimilarityPredicate,\n} from \"../ast\";\nimport { type DialectAdapter } from \"../dialect\";\nimport {\n joinJsonPointers,\n type JsonPointer,\n jsonPointer,\n} from \"../json-pointer\";\nimport { isParameterRef } from \"../predicates\";\nimport {\n getSingleSubqueryColumnValueType,\n getSubqueryColumnCount,\n isInSubqueryTypeCompatible,\n isUnsupportedInSubqueryValueType,\n} from \"../subquery-utils\";\nimport { type SqlSchema } from \"./schema\";\n\nconst COMPARISON_OP_SQL: Record<string, string> = {\n eq: \"=\",\n neq: \"!=\",\n gt: \">\",\n gte: \">=\",\n lt: \"<\",\n lte: \"<=\",\n};\n\n// ============================================================\n// Field Reference Compilation\n// ============================================================\n\n/**\n * Compiles a field reference to a base column name.\n *\n * @param field - The field reference to compile\n * @param cteAlias - Optional CTE alias for main query context (e.g., \"cte_p\")\n * @param cteColumnPrefix - Optional prefix for CTE WHERE context:\n * - undefined: Use aliased column names (e.g., \"p_props\")\n * - \"\": Use raw column names (e.g., \"props\") for start CTE\n * - \"n\": Use table-qualified names (e.g., \"n.props\") for traversal CTE\n */\nexport function compileFieldColumn(\n field: FieldRef,\n cteAlias?: string,\n cteColumnPrefix?: string,\n): SQL {\n // When cteColumnPrefix is defined (including empty string), use raw column names\n // This is for CTE WHERE clauses which operate on raw table columns\n if (cteColumnPrefix !== undefined) {\n const qualifier = cteColumnPrefix === \"\" ? \"\" : `${cteColumnPrefix}.`;\n\n if (field.path.length === 1 && field.path[0] === \"id\") {\n return sql.raw(`${qualifier}id`);\n }\n if (field.path.length === 1 && field.path[0] === \"kind\") {\n return sql.raw(`${qualifier}kind`);\n }\n if (field.path.length > 0 && field.path[0] === \"props\") {\n return sql.raw(`${qualifier}props`);\n }\n\n return sql.raw(`${qualifier}${field.path.join(\"_\")}`);\n }\n\n // Default behavior: use aliased column names (e.g., \"p_props\")\n const prefix = field.alias;\n const qualifier = cteAlias ? `${cteAlias}.` : \"\";\n\n if (field.path.length === 1 && field.path[0] === \"id\") {\n return sql.raw(`${qualifier}${prefix}_id`);\n }\n if (field.path.length === 1 && field.path[0] === \"kind\") {\n return sql.raw(`${qualifier}${prefix}_kind`);\n }\n if (field.path.length > 0 && field.path[0] === \"props\") {\n return sql.raw(`${qualifier}${prefix}_props`);\n }\n\n return sql.raw(`${qualifier}${prefix}_${field.path.join(\"_\")}`);\n}\n\n/**\n * Gets the JSON pointer for a field reference.\n */\nfunction getFieldPointer(field: FieldRef): JsonPointer | undefined {\n if (field.jsonPointer !== undefined) {\n return field.jsonPointer;\n }\n\n if (field.path.length > 1 && field.path[0] === \"props\") {\n return jsonPointer(field.path.slice(1));\n }\n\n return undefined;\n}\n\n/**\n * Checks if a field reference points to a JSON props column.\n */\nfunction isJsonField(field: FieldRef): boolean {\n return field.path.length > 0 && field.path[0] === \"props\";\n}\n\n/**\n * Normalizes a value type, treating \"unknown\" as undefined.\n */\nfunction normalizeValueType(\n valueType: ValueType | undefined,\n): ValueType | undefined {\n if (!valueType || valueType === \"unknown\") {\n return undefined;\n }\n return valueType;\n}\n\n/**\n * Compiles a field reference to SQL with appropriate type extraction.\n */\nexport function compileFieldValue(\n field: FieldRef,\n dialect: DialectAdapter,\n valueType?: ValueType,\n cteAlias?: string,\n pointerOverride?: JsonPointer,\n cteColumnPrefix?: string,\n): SQL {\n const resolved = normalizeValueType(valueType);\n const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);\n\n if (!isJsonField(field)) {\n return column;\n }\n\n const pointer = pointerOverride ?? getFieldPointer(field);\n if (!pointer || pointer === \"\") {\n return column;\n }\n\n switch (resolved) {\n case \"number\": {\n return dialect.jsonExtractNumber(column, pointer);\n }\n case \"boolean\": {\n return dialect.jsonExtractBoolean(column, pointer);\n }\n case \"date\": {\n return dialect.jsonExtractDate(column, pointer);\n }\n case \"array\":\n case \"object\":\n case \"embedding\": {\n // Embeddings are stored in a separate table, but if we need to\n // extract from JSON, treat like a regular JSON value\n return dialect.jsonExtract(column, pointer);\n }\n case \"string\":\n case \"unknown\":\n case undefined: {\n return dialect.jsonExtractText(column, pointer);\n }\n }\n}\n\n/**\n * Compiles a field reference for text comparison.\n */\nfunction compileFieldTextValue(\n field: FieldRef,\n dialect: DialectAdapter,\n cteAlias?: string,\n pointerOverride?: JsonPointer,\n cteColumnPrefix?: string,\n): SQL {\n const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);\n if (!isJsonField(field)) {\n return column;\n }\n\n const pointer = pointerOverride ?? getFieldPointer(field);\n if (!pointer || pointer === \"\") {\n return column;\n }\n\n return dialect.jsonExtractText(column, pointer);\n}\n\n/**\n * Compiles a field reference for JSON value extraction.\n */\nfunction compileFieldJsonValue(\n field: FieldRef,\n dialect: DialectAdapter,\n cteAlias?: string,\n pointerOverride?: JsonPointer,\n cteColumnPrefix?: string,\n): SQL {\n const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);\n if (!isJsonField(field)) {\n return column;\n }\n\n const pointer = pointerOverride ?? getFieldPointer(field);\n if (!pointer || pointer === \"\") {\n return column;\n }\n\n return dialect.jsonExtract(column, pointer);\n}\n\n// ============================================================\n// Value Type Resolution\n// ============================================================\n\n/**\n * Resolves literal value types from an array of literals.\n */\nfunction resolveLiteralValueTypes(\n literals: readonly LiteralValue[],\n): ValueType | undefined {\n const resolved = new Set<ValueType>();\n\n for (const literal of literals) {\n const valueType = normalizeValueType(literal.valueType);\n if (valueType) {\n resolved.add(valueType);\n }\n }\n\n if (resolved.size > 1) {\n throw new UnsupportedPredicateError(\n \"Mixed literal value types are not supported in predicates\",\n { valueTypes: [...resolved] },\n );\n }\n\n return resolved.values().next().value;\n}\n\n/**\n * Resolves the value type for a comparison predicate.\n */\nfunction resolveComparisonValueType(\n field: FieldRef,\n right: LiteralValue | readonly LiteralValue[] | ParameterRef,\n): ValueType | undefined {\n if (isParameterRef(right)) {\n return (\n normalizeValueType(right.valueType) ?? normalizeValueType(field.valueType)\n );\n }\n const literals = Array.isArray(right) ? right : [right];\n const literalType = resolveLiteralValueTypes(literals);\n const fieldType = normalizeValueType(field.valueType);\n\n // Date fields compared with string literals should use date type\n if (fieldType === \"date\" && literalType === \"string\") {\n return fieldType;\n }\n\n if (literalType) {\n return literalType;\n }\n\n return fieldType;\n}\n\n/**\n * Resolves value type with preference for explicit type.\n */\nfunction resolvePredicateValueType(\n preferred: ValueType | undefined,\n literal: LiteralValue | undefined,\n): ValueType | undefined {\n const normalizedPreferred = normalizeValueType(preferred);\n if (normalizedPreferred) {\n return normalizedPreferred;\n }\n\n return literal ? normalizeValueType(literal.valueType) : undefined;\n}\n\n// ============================================================\n// Value Conversion\n// ============================================================\n\n/**\n * Converts a literal value for SQL binding.\n * Delegates to dialect adapter for proper type conversion (e.g., boolean → 0/1 for SQLite).\n */\nfunction convertValueForSql(value: unknown, dialect: DialectAdapter): unknown {\n return dialect.bindValue(value);\n}\n\n// ============================================================\n// String Pattern Compilation\n// ============================================================\n\n/**\n * Compiles a string pattern for LIKE operations.\n */\nfunction compileStringPattern(op: string, pattern: string): string {\n const escaped = pattern\n .replaceAll(\"%\", String.raw`\\%`)\n .replaceAll(\"_\", String.raw`\\_`);\n\n switch (op) {\n case \"contains\": {\n return `%${escaped}%`;\n }\n case \"startsWith\": {\n return `${escaped}%`;\n }\n case \"endsWith\": {\n return `%${escaped}`;\n }\n case \"like\":\n case \"ilike\": {\n return pattern;\n }\n default: {\n return escaped;\n }\n }\n}\n\n/**\n * Escapes wildcard characters in a SQL pattern parameter.\n */\nfunction escapeLikePatternParameter(parameter: SQL): SQL {\n return sql`REPLACE(REPLACE(REPLACE(${parameter}, '\\\\', '\\\\\\\\'), '%', '\\\\%'), '_', '\\\\_')`;\n}\n\n/**\n * Builds a SQL pattern expression for parameterized string operations.\n */\nfunction compileParameterizedStringPattern(op: string, parameter: SQL): SQL {\n switch (op) {\n case \"contains\": {\n const escaped = escapeLikePatternParameter(parameter);\n return sql`'%' || ${escaped} || '%'`;\n }\n case \"startsWith\": {\n const escaped = escapeLikePatternParameter(parameter);\n return sql`${escaped} || '%'`;\n }\n case \"endsWith\": {\n const escaped = escapeLikePatternParameter(parameter);\n return sql`'%' || ${escaped}`;\n }\n case \"like\":\n case \"ilike\": {\n return parameter;\n }\n default: {\n return escapeLikePatternParameter(parameter);\n }\n }\n}\n\n// ============================================================\n// Predicate Compilation\n// ============================================================\n\n/**\n * Compiler context passed to recursive compilation functions.\n *\n * When compiling predicates inside CTE WHERE clauses, `cteColumnPrefix` specifies\n * how to reference columns:\n * - undefined: Use aliased column names (e.g., \"p_props\") - for main query context\n * - \"\": Use raw column names (e.g., \"props\") - for start CTE WHERE clause\n * - \"n\": Use table-qualified names (e.g., \"n.props\") - for traversal CTE WHERE clause\n */\nexport type PredicateCompilerContext = Readonly<{\n dialect: DialectAdapter;\n schema: SqlSchema;\n compileQuery: (ast: QueryAst, graphId: string) => SQL;\n cteColumnPrefix?: string;\n}>;\n\n/**\n * Compiles a predicate expression to SQL.\n */\nexport function compilePredicateExpression(\n expr: PredicateExpression,\n ctx: PredicateCompilerContext,\n): SQL {\n const { dialect } = ctx;\n\n const cteColumnPrefix = ctx.cteColumnPrefix;\n\n switch (expr.__type) {\n case \"comparison\": {\n return compileComparisonPredicate(expr, dialect, cteColumnPrefix);\n }\n\n case \"string_op\": {\n const field = compileFieldTextValue(\n expr.field,\n dialect,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n\n if (isParameterRef(expr.pattern)) {\n const placeholder = sql`${sql.placeholder(expr.pattern.name)}`;\n const pattern = compileParameterizedStringPattern(expr.op, placeholder);\n if (\n expr.op === \"ilike\" ||\n expr.op === \"contains\" ||\n expr.op === \"startsWith\" ||\n expr.op === \"endsWith\"\n ) {\n return dialect.ilike(field, pattern);\n }\n return sql`${field} LIKE ${pattern}`;\n }\n\n const pattern = compileStringPattern(expr.op, expr.pattern);\n // Use case-insensitive matching for contains, startsWith, endsWith, and ilike\n // This ensures consistent behavior across PostgreSQL (case-sensitive LIKE)\n // and SQLite (case-insensitive LIKE for ASCII)\n if (\n expr.op === \"ilike\" ||\n expr.op === \"contains\" ||\n expr.op === \"startsWith\" ||\n expr.op === \"endsWith\"\n ) {\n return dialect.ilike(field, pattern);\n }\n // Use case-sensitive LIKE only for explicit 'like' operator\n return sql`${field} LIKE ${pattern}`;\n }\n\n case \"null_check\": {\n const field = compileFieldTextValue(\n expr.field,\n dialect,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n return expr.op === \"isNull\" ?\n sql`${field} IS NULL`\n : sql`${field} IS NOT NULL`;\n }\n\n case \"between\": {\n const lowerIsParam = isParameterRef(expr.lower);\n const upperIsParam = isParameterRef(expr.upper);\n\n // Resolve value type from non-param bounds\n const boundsForType: LiteralValue[] = [];\n if (!lowerIsParam) boundsForType.push(expr.lower);\n if (!upperIsParam) boundsForType.push(expr.upper);\n\n const valueType =\n boundsForType.length > 0 ?\n resolveComparisonValueType(expr.field, boundsForType)\n : normalizeValueType(expr.field.valueType);\n\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Between comparisons are not supported for JSON arrays or objects\",\n );\n }\n const field = compileFieldValue(\n expr.field,\n dialect,\n valueType,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n const lower =\n lowerIsParam ?\n sql.placeholder(expr.lower.name)\n : convertValueForSql(expr.lower.value, dialect);\n const upper =\n upperIsParam ?\n sql.placeholder(expr.upper.name)\n : convertValueForSql(expr.upper.value, dialect);\n return sql`${field} BETWEEN ${lower} AND ${upper}`;\n }\n\n case \"and\": {\n const parts = expr.predicates.map((p) =>\n compilePredicateExpression(p, ctx),\n );\n return sql`(${sql.join(parts, sql` AND `)})`;\n }\n\n case \"or\": {\n const parts = expr.predicates.map((p) =>\n compilePredicateExpression(p, ctx),\n );\n return sql`(${sql.join(parts, sql` OR `)})`;\n }\n\n case \"not\": {\n const inner = compilePredicateExpression(expr.predicate, ctx);\n return sql`NOT (${inner})`;\n }\n\n case \"array_op\": {\n return compileArrayPredicate(expr, dialect, cteColumnPrefix);\n }\n\n case \"object_op\": {\n return compileObjectPredicate(expr, dialect, cteColumnPrefix);\n }\n\n case \"aggregate_comparison\": {\n return compileAggregatePredicate(expr, dialect);\n }\n\n case \"exists\": {\n return compileExistsSubquery(expr, ctx);\n }\n\n case \"in_subquery\": {\n return compileInSubquery(expr, ctx);\n }\n\n case \"vector_similarity\": {\n return compileVectorSimilarityPredicate(expr, ctx);\n }\n }\n}\n\n/**\n * Compiles a comparison predicate.\n */\nfunction compileComparisonPredicate(\n expr: {\n __type: \"comparison\";\n op: string;\n left: FieldRef;\n right: LiteralValue | readonly LiteralValue[] | ParameterRef;\n },\n dialect: DialectAdapter,\n cteColumnPrefix?: string,\n): SQL {\n // Handle ParameterRef on the right side\n if (isParameterRef(expr.right)) {\n const parameterValueType =\n normalizeValueType(expr.right.valueType) ??\n normalizeValueType(expr.left.valueType);\n const left = compileFieldValue(\n expr.left,\n dialect,\n parameterValueType,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n const opSql = COMPARISON_OP_SQL[expr.op];\n if (!opSql) {\n throw new UnsupportedPredicateError(\n `Comparison operation \"${expr.op}\" is not supported for parameterized predicates`,\n );\n }\n return sql`${left} ${sql.raw(opSql)} ${sql.placeholder(expr.right.name)}`;\n }\n\n const valueType = resolveComparisonValueType(expr.left, expr.right);\n\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n `Comparison operation \"${expr.op}\" is not supported for ${valueType} values`,\n );\n }\n\n const left = compileFieldValue(\n expr.left,\n dialect,\n valueType,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n\n if (expr.op === \"in\" || expr.op === \"notIn\") {\n const values: readonly LiteralValue[] =\n Array.isArray(expr.right) ? expr.right : [expr.right as LiteralValue];\n if (values.length === 0) {\n return expr.op === \"in\" ? sql.raw(\"1=0\") : sql.raw(\"1=1\");\n }\n const placeholders = values.map(\n (v) => sql`${convertValueForSql(v.value, dialect)}`,\n );\n const op = expr.op === \"in\" ? sql.raw(\"IN\") : sql.raw(\"NOT IN\");\n return sql`${left} ${op} (${sql.join(placeholders, sql`, `)})`;\n }\n\n // For single-value comparisons, extract the literal value\n const right = expr.right;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- Type narrowing with Array.isArray\n const rightValue: LiteralValue = Array.isArray(right) ? right[0]! : right;\n\n const convertedRight = convertValueForSql(rightValue.value, dialect);\n const opSql = COMPARISON_OP_SQL[expr.op];\n if (!opSql) {\n throw new UnsupportedPredicateError(\n `Comparison operation \"${expr.op}\" is not supported`,\n );\n }\n return sql`${left} ${sql.raw(opSql)} ${convertedRight}`;\n}\n\n/**\n * Compiles an array predicate.\n */\nfunction compileArrayPredicate(\n expr: ArrayPredicate,\n dialect: DialectAdapter,\n cteColumnPrefix?: string,\n): SQL {\n const field = compileFieldJsonValue(\n expr.field,\n dialect,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n const values =\n expr.values?.map((v) => convertValueForSql(v.value, dialect)) ?? [];\n\n switch (expr.op) {\n case \"isEmpty\": {\n return sql`(${field} IS NULL OR ${dialect.jsonArrayLength(field)} = 0)`;\n }\n case \"isNotEmpty\": {\n return sql`(${field} IS NOT NULL AND ${dialect.jsonArrayLength(field)} > 0)`;\n }\n case \"lengthEq\": {\n return sql`${dialect.jsonArrayLength(field)} = ${expr.length}`;\n }\n case \"lengthGt\": {\n return sql`${dialect.jsonArrayLength(field)} > ${expr.length}`;\n }\n case \"lengthGte\": {\n return sql`${dialect.jsonArrayLength(field)} >= ${expr.length}`;\n }\n case \"lengthLt\": {\n return sql`${dialect.jsonArrayLength(field)} < ${expr.length}`;\n }\n case \"lengthLte\": {\n return sql`${dialect.jsonArrayLength(field)} <= ${expr.length}`;\n }\n case \"contains\": {\n const value = values[0];\n if (value === undefined) {\n return sql.raw(\"1=0\");\n }\n return dialect.jsonArrayContains(field, value);\n }\n case \"containsAll\": {\n return dialect.jsonArrayContainsAll(field, values);\n }\n case \"containsAny\": {\n return dialect.jsonArrayContainsAny(field, values);\n }\n }\n}\n\n/**\n * Compiles an object/JSON predicate.\n */\nfunction compileObjectPredicate(\n expr: ObjectPredicate,\n dialect: DialectAdapter,\n cteColumnPrefix?: string,\n): SQL {\n const basePointer = getFieldPointer(expr.field);\n const pointer = joinJsonPointers(basePointer, expr.pointer);\n const column = compileFieldColumn(expr.field, undefined, cteColumnPrefix);\n\n switch (expr.op) {\n case \"hasKey\":\n case \"hasPath\": {\n return dialect.jsonHasPath(column, pointer);\n }\n\n case \"pathEquals\": {\n if (!expr.value) {\n throw new UnsupportedPredicateError(\n \"pathEquals requires a comparison value\",\n );\n }\n const valueType = resolvePredicateValueType(expr.valueType, expr.value);\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"pathEquals is not supported for JSON arrays or objects\",\n );\n }\n const left = compileFieldValue(\n expr.field,\n dialect,\n valueType,\n undefined,\n pointer,\n cteColumnPrefix,\n );\n return sql`${left} = ${convertValueForSql(expr.value.value, dialect)}`;\n }\n\n case \"pathContains\": {\n if (!expr.value) {\n throw new UnsupportedPredicateError(\n \"pathContains requires a comparison value\",\n );\n }\n const arrayField = compileFieldJsonValue(\n expr.field,\n dialect,\n undefined,\n pointer,\n cteColumnPrefix,\n );\n return dialect.jsonArrayContains(\n arrayField,\n convertValueForSql(expr.value.value, dialect),\n );\n }\n\n case \"pathIsNull\": {\n return dialect.jsonPathIsNull(column, pointer);\n }\n\n case \"pathIsNotNull\": {\n return dialect.jsonPathIsNotNull(column, pointer);\n }\n }\n}\n\n/**\n * AggregateExpr structure from AST.\n */\ntype AggregateExprInput = Readonly<{\n __type: \"aggregate\";\n function: string;\n field: FieldRef;\n}>;\n\n/**\n * Compiles an aggregate comparison predicate.\n */\nfunction compileAggregatePredicate(\n expr: {\n __type: \"aggregate_comparison\";\n op: string;\n aggregate: AggregateExprInput;\n value: LiteralValue;\n },\n dialect: DialectAdapter,\n): SQL {\n const aggregate = compileAggregateExpr(expr.aggregate, dialect);\n\n const op = COMPARISON_OP_SQL[expr.op];\n if (!op) {\n throw new UnsupportedPredicateError(\n `Comparison operation \"${expr.op}\" is not supported for aggregate predicates`,\n );\n }\n\n const convertedValue = convertValueForSql(expr.value.value, dialect);\n return sql`${aggregate} ${sql.raw(op)} ${convertedValue}`;\n}\n\n/**\n * Compiles an aggregate expression.\n */\nfunction compileAggregateExpr(\n expr: AggregateExprInput,\n dialect: DialectAdapter,\n): SQL {\n const cteAlias = `cte_${expr.field.alias}`;\n const field = compileFieldValue(\n expr.field,\n dialect,\n expr.field.valueType,\n cteAlias,\n );\n\n switch (expr.function) {\n case \"count\": {\n return sql`COUNT(${field})`;\n }\n case \"countDistinct\": {\n return sql`COUNT(DISTINCT ${field})`;\n }\n case \"sum\": {\n return sql`SUM(${field})`;\n }\n case \"avg\": {\n return sql`AVG(${field})`;\n }\n case \"min\": {\n return sql`MIN(${field})`;\n }\n case \"max\": {\n return sql`MAX(${field})`;\n }\n default: {\n throw new UnsupportedPredicateError(\n `Unknown aggregate function: ${expr.function}`,\n );\n }\n }\n}\n\n/**\n * Compiles an EXISTS subquery predicate.\n */\nfunction compileExistsSubquery(\n expr: ExistsSubquery,\n ctx: PredicateCompilerContext,\n): SQL {\n if (expr.subquery.graphId === undefined) {\n throw new UnsupportedPredicateError(\"EXISTS subquery must have a graphId\");\n }\n const subSql = ctx.compileQuery(expr.subquery, expr.subquery.graphId);\n return expr.negated ? sql`NOT EXISTS (${subSql})` : sql`EXISTS (${subSql})`;\n}\n\n/**\n * Compiles an IN subquery predicate.\n */\nfunction compileInSubquery(\n expr: InSubquery,\n ctx: PredicateCompilerContext,\n): SQL {\n const subqueryColumnCount = getSubqueryColumnCount(expr.subquery);\n if (subqueryColumnCount !== 1) {\n throw new UnsupportedPredicateError(\n `IN/NOT IN subquery must project exactly 1 column, but got ${subqueryColumnCount}`,\n { subqueryColumnCount },\n );\n }\n\n const fieldValueType = normalizeValueType(expr.field.valueType);\n const subqueryValueType = getSingleSubqueryColumnValueType(expr.subquery);\n const resolvedValueType = fieldValueType ?? subqueryValueType;\n\n if (isUnsupportedInSubqueryValueType(resolvedValueType)) {\n throw new UnsupportedPredicateError(\n `IN/NOT IN subquery does not support ${String(resolvedValueType)} values`,\n { valueType: resolvedValueType },\n );\n }\n\n if (!isInSubqueryTypeCompatible(fieldValueType, subqueryValueType)) {\n throw new UnsupportedPredicateError(\n `IN/NOT IN type mismatch: field type \"${String(fieldValueType)}\" does not match subquery column type \"${String(subqueryValueType)}\"`,\n {\n fieldValueType,\n subqueryValueType,\n },\n );\n }\n\n const valueType = fieldValueType ?? subqueryValueType;\n if (expr.subquery.graphId === undefined) {\n throw new UnsupportedPredicateError(\n \"IN/NOT IN subquery must have a graphId\",\n );\n }\n const fieldSql = compileFieldValue(\n expr.field,\n ctx.dialect,\n valueType,\n undefined,\n undefined,\n ctx.cteColumnPrefix,\n );\n const subSql = ctx.compileQuery(expr.subquery, expr.subquery.graphId);\n return expr.negated ?\n sql`${fieldSql} NOT IN (${subSql})`\n : sql`${fieldSql} IN (${subSql})`;\n}\n\n/**\n * Compiles a vector similarity predicate.\n *\n * Vector similarity predicates require special handling at the query compilation\n * level to handle:\n * - JOIN to embeddings table\n * - ORDER BY distance ASC\n * - LIMIT k\n *\n * This function handles the minScore filter if present. The main query compiler\n * must detect vector_similarity predicates and set up the appropriate JOINs\n * and ordering.\n */\nfunction compileVectorSimilarityPredicate(\n _expr: VectorSimilarityPredicate,\n _ctx: PredicateCompilerContext,\n): SQL {\n // No-op: vector similarity is handled structurally (JOINs, ORDER BY, LIMIT)\n // by the main query compiler, not as a WHERE predicate. Returns 1=1 so it\n // composes safely with AND.\n return sql.raw(\"1=1\");\n}\n\n// ============================================================\n// Vector Similarity Helpers\n// ============================================================\n\n/**\n * Extracts all vector similarity predicates from a query's predicates.\n * Used by the main query compiler to set up JOINs, ORDER BY, and LIMIT.\n *\n * Vector predicates must appear at top level or under AND groups only.\n * Nesting under OR/NOT is rejected because vector search rewrites query\n * structure rather than behaving like a pure boolean predicate.\n */\nexport function extractVectorSimilarityPredicates(\n predicates: readonly { expression: PredicateExpression }[],\n): VectorSimilarityPredicate[] {\n const results: VectorSimilarityPredicate[] = [];\n\n function visit(expr: PredicateExpression, inDisallowedBranch: boolean): void {\n switch (expr.__type) {\n case \"vector_similarity\": {\n if (inDisallowedBranch) {\n throw new UnsupportedPredicateError(\n \"Vector similarity predicates cannot be nested under OR or NOT. \" +\n \"Use top-level AND combinations instead.\",\n );\n }\n results.push(expr);\n break;\n }\n case \"and\": {\n for (const p of expr.predicates) {\n visit(p, inDisallowedBranch);\n }\n break;\n }\n case \"or\": {\n for (const p of expr.predicates) {\n visit(p, true);\n }\n break;\n }\n case \"not\": {\n visit(expr.predicate, true);\n break;\n }\n case \"comparison\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"exists\":\n case \"in_subquery\": {\n // These predicate types don't contain nested vector_similarity\n break;\n }\n }\n }\n\n for (const pred of predicates) {\n visit(pred.expression, false);\n }\n\n return results;\n}\n\n// ============================================================\n// Exports for aggregate compilation\n// ============================================================\n\nexport { compileAggregateExpr };\n","import { UnsupportedPredicateError } from \"../../../errors\";\nimport type { QueryAst, VectorSimilarityPredicate } from \"../../ast\";\nimport type { DialectAdapter } from \"../../dialect\";\nimport { extractVectorSimilarityPredicates } from \"../predicates\";\n\nexport type VectorPredicatePassResult = Readonly<{\n vectorPredicate: VectorSimilarityPredicate | undefined;\n}>;\n\n/**\n * Validates vector predicate placement and cardinality.\n *\n * Invariants:\n * - Vector predicates must not appear under OR/NOT branches.\n * - At most one vector predicate is allowed per query.\n */\nexport function runVectorPredicatePass(\n ast: QueryAst,\n dialect: DialectAdapter,\n): VectorPredicatePassResult {\n const vectorPredicates = extractVectorSimilarityPredicates(ast.predicates);\n if (vectorPredicates.length > 1) {\n throw new UnsupportedPredicateError(\n \"Multiple vector similarity predicates in a single query are not supported\",\n );\n }\n\n const vectorPredicate = vectorPredicates[0];\n if (vectorPredicate === undefined) {\n return { vectorPredicate: undefined };\n }\n\n const vectorStrategy = dialect.capabilities.vectorPredicateStrategy;\n if (vectorStrategy === \"unsupported\" || !dialect.supportsVectors) {\n throw new UnsupportedPredicateError(\n `Vector similarity predicates are not supported for dialect \"${dialect.name}\"`,\n );\n }\n\n if (!dialect.capabilities.vectorMetrics.includes(vectorPredicate.metric)) {\n throw new UnsupportedPredicateError(\n `Vector metric \"${vectorPredicate.metric}\" is not supported for dialect \"${dialect.name}\"`,\n );\n }\n\n if (!Number.isFinite(vectorPredicate.limit) || vectorPredicate.limit <= 0) {\n throw new UnsupportedPredicateError(\n `Vector predicate limit must be a positive finite number, got ${String(vectorPredicate.limit)}`,\n );\n }\n\n const { minScore } = vectorPredicate;\n if (minScore !== undefined) {\n if (!Number.isFinite(minScore)) {\n throw new UnsupportedPredicateError(\n `Vector minScore must be a finite number, got ${String(minScore)}`,\n );\n }\n if (\n vectorPredicate.metric === \"cosine\" &&\n (minScore < -1 || minScore > 1)\n ) {\n throw new UnsupportedPredicateError(\n `Cosine minScore must be between -1 and 1, got ${String(minScore)}`,\n );\n }\n }\n\n return { vectorPredicate };\n}\n\n/**\n * Resolves the query LIMIT in the presence of vector similarity.\n *\n * If a vector predicate is present and AST limit is omitted, use the\n * predicate's built-in limit to bound nearest-neighbor search.\n */\nexport function resolveVectorAwareLimit(\n astLimit?: number,\n vectorPredicate?: VectorSimilarityPredicate,\n): number | undefined {\n if (vectorPredicate === undefined) {\n return astLimit;\n }\n if (astLimit === undefined) {\n return vectorPredicate.limit;\n }\n return Math.min(astLimit, vectorPredicate.limit);\n}\n","import { CompilerInvariantError } from \"../../../errors\";\nimport type {\n AggregateExpr,\n ComposableQuery,\n NodePredicate,\n QueryAst,\n SetOperation,\n VectorSimilarityPredicate,\n} from \"../../ast\";\nimport { getDialect, type SqlDialect } from \"../../dialect\";\nimport {\n resolveVectorAwareLimit,\n runRecursiveTraversalSelectionPass,\n runVectorPredicatePass,\n type VariableLengthTraversal,\n} from \"../passes\";\nimport type {\n AggregatePlanNode,\n LimitOffsetPlanNode,\n LogicalPlan,\n LogicalPlanNode,\n ProjectPlanNode,\n} from \"./types\";\n\nexport type LowerStandardQueryToLogicalPlanInput = Readonly<{\n ast: QueryAst;\n collapsedTraversalCteAlias?: string;\n dialect: SqlDialect;\n effectiveLimit?: number;\n graphId: string;\n vectorPredicate?: VectorSimilarityPredicate;\n}>;\n\nexport type LowerRecursiveQueryToLogicalPlanInput = Readonly<{\n ast: QueryAst;\n dialect: SqlDialect;\n graphId: string;\n traversal?: VariableLengthTraversal;\n}>;\n\nexport type LowerSetOperationToLogicalPlanInput = Readonly<{\n dialect: SqlDialect;\n graphId: string;\n op: SetOperation;\n}>;\n\n/**\n * Creates a sequential plan node ID generator scoped to a single compilation invocation.\n * IDs are NOT stable across compilations — different compilations of the same query\n * may produce different IDs depending on pass execution order.\n */\nfunction createPlanNodeIdFactory(): () => string {\n let current = 0;\n return function nextPlanNodeId(): string {\n current += 1;\n return `plan_${current.toString(36)}`;\n };\n}\n\nfunction extractAggregateExpressions(ast: QueryAst): readonly AggregateExpr[] {\n const aggregates: AggregateExpr[] = [];\n\n for (const field of ast.projection.fields) {\n if (\"__type\" in field.source && field.source.__type === \"aggregate\") {\n aggregates.push(field.source);\n }\n }\n\n return aggregates;\n}\n\nfunction getAliasPredicates(\n ast: QueryAst,\n alias: string,\n predicateTargetType: \"edge\" | \"node\",\n): readonly NodePredicate[] {\n return ast.predicates.filter((predicate) => {\n const targetType = predicate.targetType ?? \"node\";\n return (\n predicate.targetAlias === alias && targetType === predicateTargetType\n );\n });\n}\n\nfunction wrapWithAliasFilterNode(\n currentNode: LogicalPlanNode,\n ast: QueryAst,\n alias: string,\n predicateTargetType: \"edge\" | \"node\",\n nextPlanNodeId: () => string,\n): LogicalPlanNode {\n const aliasPredicates = getAliasPredicates(ast, alias, predicateTargetType);\n if (aliasPredicates.length === 0) {\n return currentNode;\n }\n\n return {\n alias,\n id: nextPlanNodeId(),\n input: currentNode,\n op: \"filter\",\n predicateTargetType,\n predicates: aliasPredicates.map((predicate) => predicate.expression),\n };\n}\n\nfunction appendAggregateSortLimitAndProjectNodes(\n currentNode: LogicalPlanNode,\n ast: QueryAst,\n nextPlanNodeId: () => string,\n limit: number | undefined,\n collapsedTraversalCteAlias?: string,\n): LogicalPlanNode {\n let node = currentNode;\n\n const aggregateExpressions = extractAggregateExpressions(ast);\n if (\n aggregateExpressions.length > 0 ||\n ast.groupBy !== undefined ||\n ast.having !== undefined\n ) {\n const aggregateNode: AggregatePlanNode = {\n aggregates: aggregateExpressions,\n groupBy: ast.groupBy?.fields ?? [],\n id: nextPlanNodeId(),\n input: node,\n op: \"aggregate\",\n };\n node =\n ast.having === undefined ?\n aggregateNode\n : { ...aggregateNode, having: ast.having };\n }\n\n if (ast.orderBy !== undefined && ast.orderBy.length > 0) {\n node = {\n id: nextPlanNodeId(),\n input: node,\n op: \"sort\",\n orderBy: ast.orderBy,\n };\n }\n\n if (limit !== undefined || ast.offset !== undefined) {\n const limitOffsetNodeBase: Omit<LimitOffsetPlanNode, \"limit\" | \"offset\"> = {\n id: nextPlanNodeId(),\n input: node,\n op: \"limit_offset\",\n };\n const hasLimit = limit !== undefined;\n const hasOffset = ast.offset !== undefined;\n\n if (hasLimit && hasOffset) {\n node = {\n ...limitOffsetNodeBase,\n limit,\n offset: ast.offset,\n };\n } else if (hasLimit) {\n node = { ...limitOffsetNodeBase, limit };\n } else if (hasOffset) {\n node = { ...limitOffsetNodeBase, offset: ast.offset };\n } else {\n throw new CompilerInvariantError(\n \"limit_offset node requires limit or offset to be present\",\n );\n }\n }\n\n const projectNodeBase: Omit<ProjectPlanNode, \"collapsedTraversalAlias\"> = {\n fields: ast.projection.fields,\n id: nextPlanNodeId(),\n input: node,\n op: \"project\",\n };\n return collapsedTraversalCteAlias === undefined ? projectNodeBase : (\n {\n ...projectNodeBase,\n collapsedTraversalAlias: collapsedTraversalCteAlias,\n }\n );\n}\n\ntype LowerStandardQueryToLogicalPlanNodeInput =\n LowerStandardQueryToLogicalPlanInput &\n Readonly<{\n nextPlanNodeId: () => string;\n }>;\n\nfunction lowerStandardQueryToLogicalPlanNode(\n input: LowerStandardQueryToLogicalPlanNodeInput,\n): LogicalPlanNode {\n const { ast, nextPlanNodeId } = input;\n\n let currentNode: LogicalPlanNode = {\n alias: ast.start.alias,\n graphId: input.graphId,\n id: nextPlanNodeId(),\n kinds: ast.start.kinds,\n op: \"scan\",\n source: \"nodes\",\n };\n\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n ast.start.alias,\n \"node\",\n nextPlanNodeId,\n );\n\n for (const traversal of ast.traversals) {\n currentNode = {\n direction: traversal.direction,\n edgeAlias: traversal.edgeAlias,\n edgeKinds: traversal.edgeKinds,\n id: nextPlanNodeId(),\n input: currentNode,\n inverseEdgeKinds: traversal.inverseEdgeKinds ?? [],\n joinFromAlias: traversal.joinFromAlias,\n joinType: traversal.optional ? \"left\" : \"inner\",\n nodeAlias: traversal.nodeAlias,\n nodeKinds: traversal.nodeKinds,\n op: \"join\",\n };\n\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n traversal.edgeAlias,\n \"edge\",\n nextPlanNodeId,\n );\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n traversal.nodeAlias,\n \"node\",\n nextPlanNodeId,\n );\n }\n\n if (input.vectorPredicate !== undefined) {\n currentNode = {\n id: nextPlanNodeId(),\n input: currentNode,\n op: \"vector_knn\",\n predicate: input.vectorPredicate,\n };\n }\n\n return appendAggregateSortLimitAndProjectNodes(\n currentNode,\n ast,\n nextPlanNodeId,\n input.effectiveLimit,\n input.collapsedTraversalCteAlias,\n );\n}\n\ntype LowerRecursiveQueryToLogicalPlanNodeInput =\n LowerRecursiveQueryToLogicalPlanInput &\n Readonly<{\n nextPlanNodeId: () => string;\n }>;\n\nfunction lowerRecursiveQueryToLogicalPlanNode(\n input: LowerRecursiveQueryToLogicalPlanNodeInput,\n): LogicalPlanNode {\n const { ast, nextPlanNodeId } = input;\n const traversal =\n input.traversal ?? runRecursiveTraversalSelectionPass(input.ast);\n\n let currentNode: LogicalPlanNode = {\n alias: ast.start.alias,\n graphId: input.graphId,\n id: nextPlanNodeId(),\n kinds: ast.start.kinds,\n op: \"scan\",\n source: \"nodes\",\n };\n\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n ast.start.alias,\n \"node\",\n nextPlanNodeId,\n );\n\n currentNode = {\n edgeAlias: traversal.edgeAlias,\n edgeKinds: traversal.edgeKinds,\n id: nextPlanNodeId(),\n input: currentNode,\n inverseEdgeKinds: traversal.inverseEdgeKinds ?? [],\n nodeAlias: traversal.nodeAlias,\n nodeKinds: traversal.nodeKinds,\n op: \"recursive_expand\",\n traversal: traversal.variableLength,\n };\n\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n traversal.edgeAlias,\n \"edge\",\n nextPlanNodeId,\n );\n currentNode = wrapWithAliasFilterNode(\n currentNode,\n ast,\n traversal.nodeAlias,\n \"node\",\n nextPlanNodeId,\n );\n\n return appendAggregateSortLimitAndProjectNodes(\n currentNode,\n ast,\n nextPlanNodeId,\n ast.limit,\n );\n}\n\nfunction lowerComposableQueryToLogicalPlanNode(\n query: ComposableQuery,\n dialect: SqlDialect,\n graphId: string,\n nextPlanNodeId: () => string,\n): LogicalPlanNode {\n if (\"__type\" in query) {\n return lowerSetOperationToLogicalPlanNode(\n query,\n graphId,\n dialect,\n nextPlanNodeId,\n );\n }\n\n const hasVariableLengthTraversal = query.traversals.some(\n (traversal) => traversal.variableLength !== undefined,\n );\n if (hasVariableLengthTraversal) {\n return lowerRecursiveQueryToLogicalPlanNode({\n ast: query,\n dialect,\n graphId,\n nextPlanNodeId,\n });\n }\n\n const vectorPredicate = runVectorPredicatePass(\n query,\n getDialect(dialect),\n ).vectorPredicate;\n const effectiveLimit = resolveVectorAwareLimit(query.limit, vectorPredicate);\n const loweringInput = {\n ast: query,\n dialect,\n graphId,\n nextPlanNodeId,\n ...(effectiveLimit === undefined ? {} : { effectiveLimit }),\n ...(vectorPredicate === undefined ? {} : { vectorPredicate }),\n };\n return lowerStandardQueryToLogicalPlanNode(loweringInput);\n}\n\nfunction lowerSetOperationToLogicalPlanNode(\n op: SetOperation,\n graphId: string,\n dialect: SqlDialect,\n nextPlanNodeId: () => string,\n): LogicalPlanNode {\n let currentNode: LogicalPlanNode = {\n id: nextPlanNodeId(),\n left: lowerComposableQueryToLogicalPlanNode(\n op.left,\n dialect,\n graphId,\n nextPlanNodeId,\n ),\n op: \"set_op\",\n operator: op.operator,\n right: lowerComposableQueryToLogicalPlanNode(\n op.right,\n dialect,\n graphId,\n nextPlanNodeId,\n ),\n };\n\n if (op.orderBy !== undefined && op.orderBy.length > 0) {\n currentNode = {\n id: nextPlanNodeId(),\n input: currentNode,\n op: \"sort\",\n orderBy: op.orderBy,\n };\n }\n\n if (op.limit !== undefined || op.offset !== undefined) {\n const limitOffsetBase = {\n id: nextPlanNodeId(),\n input: currentNode,\n op: \"limit_offset\" as const,\n };\n if (op.limit !== undefined && op.offset !== undefined) {\n currentNode = { ...limitOffsetBase, limit: op.limit, offset: op.offset };\n } else if (op.limit === undefined) {\n currentNode = { ...limitOffsetBase, offset: op.offset! };\n } else {\n currentNode = { ...limitOffsetBase, limit: op.limit };\n }\n }\n\n return currentNode;\n}\n\nexport function lowerStandardQueryToLogicalPlan(\n input: LowerStandardQueryToLogicalPlanInput,\n): LogicalPlan {\n const nextPlanNodeId = createPlanNodeIdFactory();\n return {\n metadata: {\n dialect: input.dialect,\n graphId: input.graphId,\n },\n root: lowerStandardQueryToLogicalPlanNode({\n ...input,\n nextPlanNodeId,\n }),\n };\n}\n\nexport function lowerRecursiveQueryToLogicalPlan(\n input: LowerRecursiveQueryToLogicalPlanInput,\n): LogicalPlan {\n const nextPlanNodeId = createPlanNodeIdFactory();\n return {\n metadata: {\n dialect: input.dialect,\n graphId: input.graphId,\n },\n root: lowerRecursiveQueryToLogicalPlanNode({\n ...input,\n nextPlanNodeId,\n }),\n };\n}\n\nexport function lowerSetOperationToLogicalPlan(\n input: LowerSetOperationToLogicalPlanInput,\n): LogicalPlan {\n const nextPlanNodeId = createPlanNodeIdFactory();\n return {\n metadata: {\n dialect: input.dialect,\n graphId: input.graphId,\n },\n root: lowerSetOperationToLogicalPlanNode(\n input.op,\n input.graphId,\n input.dialect,\n nextPlanNodeId,\n ),\n };\n}\n","import { CompilerInvariantError } from \"../../../errors\";\nimport {\n type LimitOffsetPlanNode,\n type LogicalPlan,\n type LogicalPlanNode,\n type ProjectPlanNode,\n type SortPlanNode,\n} from \"../plan\";\n\nexport type ProjectPlanShape = Readonly<{\n hasAggregate: boolean;\n hasLimitOffset: boolean;\n hasRecursiveExpand: boolean;\n hasSetOperation: boolean;\n hasSort: boolean;\n hasVectorKnn: boolean;\n limitOffsetNode: LimitOffsetPlanNode | undefined;\n rootProjectNode: ProjectPlanNode;\n sortNode: SortPlanNode | undefined;\n}>;\n\nexport type SetOperationPlanShape = Readonly<{\n hasLimitOffset: boolean;\n hasSetOperation: boolean;\n hasSort: boolean;\n limitOffsetNode: LimitOffsetPlanNode | undefined;\n sortNode: SortPlanNode | undefined;\n}>;\n\nfunction collectPlanOperations(node: LogicalPlanNode, ops: Set<string>): void {\n ops.add(node.op);\n\n switch (node.op) {\n case \"aggregate\":\n case \"filter\":\n case \"join\":\n case \"limit_offset\":\n case \"project\":\n case \"recursive_expand\":\n case \"sort\":\n case \"vector_knn\": {\n collectPlanOperations(node.input, ops);\n return;\n }\n case \"set_op\": {\n collectPlanOperations(node.left, ops);\n collectPlanOperations(node.right, ops);\n return;\n }\n case \"scan\": {\n return;\n }\n }\n}\n\nfunction findUnaryNodeInProjectChain<TNode extends LogicalPlanNode>(\n rootNode: ProjectPlanNode,\n op: TNode[\"op\"],\n): TNode | undefined {\n let currentNode: LogicalPlanNode = rootNode.input;\n\n for (;;) {\n if (currentNode.op === op) {\n return currentNode as TNode;\n }\n\n switch (currentNode.op) {\n case \"aggregate\":\n case \"filter\":\n case \"join\":\n case \"limit_offset\":\n case \"recursive_expand\":\n case \"sort\":\n case \"vector_knn\": {\n currentNode = currentNode.input;\n continue;\n }\n case \"project\":\n case \"scan\":\n case \"set_op\": {\n return undefined;\n }\n }\n }\n}\n\nfunction inspectProjectPlan(logicalPlan: LogicalPlan): ProjectPlanShape {\n if (logicalPlan.root.op !== \"project\") {\n throw new CompilerInvariantError(\n `SQL emitter expected logical plan root to be \"project\", got \"${logicalPlan.root.op}\"`,\n { component: \"plan-inspector\" },\n );\n }\n\n const operations = new Set<string>();\n collectPlanOperations(logicalPlan.root, operations);\n\n const limitOffsetNode = findUnaryNodeInProjectChain<LimitOffsetPlanNode>(\n logicalPlan.root,\n \"limit_offset\",\n );\n const sortNode = findUnaryNodeInProjectChain<SortPlanNode>(\n logicalPlan.root,\n \"sort\",\n );\n\n return {\n hasAggregate: operations.has(\"aggregate\"),\n hasLimitOffset: operations.has(\"limit_offset\"),\n hasRecursiveExpand: operations.has(\"recursive_expand\"),\n hasSetOperation: operations.has(\"set_op\"),\n hasSort: operations.has(\"sort\"),\n hasVectorKnn: operations.has(\"vector_knn\"),\n limitOffsetNode,\n rootProjectNode: logicalPlan.root,\n sortNode,\n };\n}\n\nexport function inspectStandardProjectPlan(\n logicalPlan: LogicalPlan,\n): ProjectPlanShape {\n const shape = inspectProjectPlan(logicalPlan);\n if (shape.hasSetOperation) {\n throw new CompilerInvariantError(\n 'Standard SQL emitter does not support plans containing \"set_op\" nodes',\n { component: \"plan-inspector\" },\n );\n }\n if (shape.hasRecursiveExpand) {\n throw new CompilerInvariantError(\n 'Standard SQL emitter does not support plans containing \"recursive_expand\" nodes',\n { component: \"plan-inspector\" },\n );\n }\n return shape;\n}\n\nexport function inspectRecursiveProjectPlan(\n logicalPlan: LogicalPlan,\n): ProjectPlanShape {\n const shape = inspectProjectPlan(logicalPlan);\n if (!shape.hasRecursiveExpand) {\n throw new CompilerInvariantError(\n 'Recursive SQL emitter expected logical plan to contain a \"recursive_expand\" node',\n { component: \"plan-inspector\" },\n );\n }\n if (shape.hasSetOperation) {\n throw new CompilerInvariantError(\n 'Recursive SQL emitter does not support plans containing \"set_op\" nodes',\n { component: \"plan-inspector\" },\n );\n }\n return shape;\n}\n\nfunction findTopLevelLimitOffsetNode(\n rootNode: LogicalPlanNode,\n): LimitOffsetPlanNode | undefined {\n let currentNode: LogicalPlanNode = rootNode;\n\n for (;;) {\n if (currentNode.op === \"limit_offset\") {\n return currentNode;\n }\n\n switch (currentNode.op) {\n case \"aggregate\":\n case \"filter\":\n case \"join\":\n case \"project\":\n case \"recursive_expand\":\n case \"sort\":\n case \"vector_knn\": {\n currentNode = currentNode.input;\n continue;\n }\n case \"scan\":\n case \"set_op\": {\n return undefined;\n }\n }\n }\n}\n\nfunction findTopLevelSortNode(\n rootNode: LogicalPlanNode,\n): SortPlanNode | undefined {\n let currentNode: LogicalPlanNode = rootNode;\n\n for (;;) {\n if (currentNode.op === \"sort\") {\n return currentNode;\n }\n\n switch (currentNode.op) {\n case \"aggregate\":\n case \"filter\":\n case \"join\":\n case \"limit_offset\":\n case \"project\":\n case \"recursive_expand\":\n case \"vector_knn\": {\n currentNode = currentNode.input;\n continue;\n }\n case \"scan\":\n case \"set_op\": {\n return undefined;\n }\n }\n }\n}\n\nexport function inspectSetOperationPlan(\n logicalPlan: LogicalPlan,\n): SetOperationPlanShape {\n const operations = new Set<string>();\n collectPlanOperations(logicalPlan.root, operations);\n\n if (!operations.has(\"set_op\")) {\n throw new CompilerInvariantError(\n 'Set-operation SQL emitter expected logical plan to contain a \"set_op\" node',\n { component: \"plan-inspector\" },\n );\n }\n\n const limitOffsetNode = findTopLevelLimitOffsetNode(logicalPlan.root);\n const sortNode = findTopLevelSortNode(logicalPlan.root);\n\n return {\n hasLimitOffset: limitOffsetNode !== undefined,\n hasSetOperation: true,\n hasSort: sortNode !== undefined,\n limitOffsetNode,\n sortNode,\n };\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { CompilerInvariantError } from \"../../../errors\";\nimport { type LogicalPlan } from \"../plan\";\nimport { inspectRecursiveProjectPlan } from \"./plan-inspector\";\n\nexport type RecursiveQueryEmitterInput = Readonly<{\n depthFilter: SQL;\n limitOffset?: SQL;\n logicalPlan: LogicalPlan;\n orderBy?: SQL;\n projection: SQL;\n recursiveCte: SQL;\n}>;\n\nfunction assertRecursiveEmitterClauseAlignment(\n logicalPlan: LogicalPlan,\n input: RecursiveQueryEmitterInput,\n): void {\n const planShape = inspectRecursiveProjectPlan(logicalPlan);\n if (planShape.hasSort && input.orderBy === undefined) {\n throw new CompilerInvariantError(\n \"Recursive SQL emitter expected ORDER BY clause for plan containing a sort node\",\n { component: \"recursive-emitter\" },\n );\n }\n if (!planShape.hasSort && input.orderBy !== undefined) {\n throw new CompilerInvariantError(\n \"Recursive SQL emitter received ORDER BY clause for a plan without sort nodes\",\n { component: \"recursive-emitter\" },\n );\n }\n if (planShape.hasLimitOffset && input.limitOffset === undefined) {\n throw new CompilerInvariantError(\n \"Recursive SQL emitter expected LIMIT/OFFSET clause for plan containing a limit_offset node\",\n { component: \"recursive-emitter\" },\n );\n }\n if (!planShape.hasLimitOffset && input.limitOffset !== undefined) {\n throw new CompilerInvariantError(\n \"Recursive SQL emitter received LIMIT/OFFSET clause for a plan without limit_offset nodes\",\n { component: \"recursive-emitter\" },\n );\n }\n}\n\nexport function emitRecursiveQuerySql(input: RecursiveQueryEmitterInput): SQL {\n assertRecursiveEmitterClauseAlignment(input.logicalPlan, input);\n\n const parts: SQL[] = [\n sql`WITH RECURSIVE`,\n input.recursiveCte,\n sql`SELECT ${input.projection}`,\n sql`FROM recursive_cte`,\n input.depthFilter,\n ];\n\n if (input.orderBy !== undefined) {\n parts.push(input.orderBy);\n }\n if (input.limitOffset !== undefined) {\n parts.push(input.limitOffset);\n }\n\n return sql.join(parts, sql` `);\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { CompilerInvariantError } from \"../../../errors\";\nimport { type LogicalPlan } from \"../plan\";\nimport { inspectSetOperationPlan } from \"./plan-inspector\";\n\nexport type SetOperationQueryEmitterInput = Readonly<{\n baseQuery: SQL;\n ctes?: readonly SQL[];\n logicalPlan: LogicalPlan;\n suffixClauses?: readonly SQL[];\n}>;\n\nfunction assertSetOperationEmitterClauseAlignment(\n logicalPlan: LogicalPlan,\n suffixClauses: readonly SQL[] | undefined,\n): void {\n const shape = inspectSetOperationPlan(logicalPlan);\n const hasSuffixClauses =\n suffixClauses !== undefined && suffixClauses.length > 0;\n\n if (!shape.hasSort && !shape.hasLimitOffset && hasSuffixClauses) {\n throw new CompilerInvariantError(\n \"Set-operation SQL emitter received suffix clauses for a plan without top-level sort or limit_offset nodes\",\n { component: \"set-operation-emitter\" },\n );\n }\n\n if (!hasSuffixClauses) {\n if (shape.hasSort || shape.hasLimitOffset) {\n throw new CompilerInvariantError(\n \"Set-operation SQL emitter expected suffix clauses for plan containing top-level sort or limit_offset nodes\",\n { component: \"set-operation-emitter\" },\n );\n }\n return;\n }\n\n const limitOffsetClauseCount =\n shape.limitOffsetNode === undefined ?\n 0\n : (shape.limitOffsetNode.limit === undefined ? 0 : 1) +\n (shape.limitOffsetNode.offset === undefined ? 0 : 1);\n const expectedClauseCount =\n (shape.sortNode === undefined ? 0 : 1) + limitOffsetClauseCount;\n\n if (suffixClauses.length !== expectedClauseCount) {\n throw new CompilerInvariantError(\n `Set-operation SQL emitter expected ${String(expectedClauseCount)} top-level suffix clause(s) from logical plan, got ${String(suffixClauses.length)}`,\n { component: \"set-operation-emitter\" },\n );\n }\n}\n\nexport function emitSetOperationQuerySql(\n input: SetOperationQueryEmitterInput,\n): SQL {\n assertSetOperationEmitterClauseAlignment(\n input.logicalPlan,\n input.suffixClauses,\n );\n\n const parts: SQL[] = [];\n if (input.ctes !== undefined && input.ctes.length > 0) {\n parts.push(sql`WITH ${sql.join([...input.ctes], sql`, `)}`);\n }\n\n parts.push(input.baseQuery);\n\n if (input.suffixClauses !== undefined && input.suffixClauses.length > 0) {\n parts.push(...input.suffixClauses);\n }\n\n return sql.join(parts, sql` `);\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { CompilerInvariantError } from \"../../../errors\";\nimport { type LogicalPlan } from \"../plan\";\nimport { inspectStandardProjectPlan } from \"./plan-inspector\";\n\nexport type StandardQueryEmitterInput = Readonly<{\n ctes: readonly SQL[];\n fromClause: SQL;\n groupBy?: SQL;\n having?: SQL;\n limitOffset?: SQL;\n logicalPlan: LogicalPlan;\n orderBy?: SQL;\n projection: SQL;\n}>;\n\nfunction assertStandardEmitterClauseAlignment(\n logicalPlan: LogicalPlan,\n input: StandardQueryEmitterInput,\n): void {\n const planShape = inspectStandardProjectPlan(logicalPlan);\n if (input.groupBy !== undefined && !planShape.hasAggregate) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter received GROUP BY clause for a plan without aggregate nodes\",\n { component: \"standard-emitter\" },\n );\n }\n if (input.having !== undefined && !planShape.hasAggregate) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter received HAVING clause for a plan without aggregate nodes\",\n { component: \"standard-emitter\" },\n );\n }\n const expectsOrderBy = planShape.hasSort || planShape.hasVectorKnn;\n if (expectsOrderBy && input.orderBy === undefined) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter expected ORDER BY clause for plan containing a sort or vector_knn node\",\n { component: \"standard-emitter\" },\n );\n }\n if (!expectsOrderBy && input.orderBy !== undefined) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter received ORDER BY clause for a plan without sort or vector_knn nodes\",\n { component: \"standard-emitter\" },\n );\n }\n if (planShape.hasLimitOffset && input.limitOffset === undefined) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter expected LIMIT/OFFSET clause for plan containing a limit_offset node\",\n { component: \"standard-emitter\" },\n );\n }\n if (!planShape.hasLimitOffset && input.limitOffset !== undefined) {\n throw new CompilerInvariantError(\n \"Standard SQL emitter received LIMIT/OFFSET clause for a plan without limit_offset nodes\",\n { component: \"standard-emitter\" },\n );\n }\n}\n\nexport function emitStandardQuerySql(input: StandardQueryEmitterInput): SQL {\n assertStandardEmitterClauseAlignment(input.logicalPlan, input);\n\n const parts: SQL[] = [];\n if (input.ctes.length > 0) {\n parts.push(sql`WITH ${sql.join([...input.ctes], sql`, `)}`);\n }\n\n parts.push(sql`SELECT ${input.projection}`, input.fromClause);\n\n if (input.groupBy !== undefined) {\n parts.push(input.groupBy);\n }\n if (input.having !== undefined) {\n parts.push(input.having);\n }\n if (input.orderBy !== undefined) {\n parts.push(input.orderBy);\n }\n if (input.limitOffset !== undefined) {\n parts.push(input.limitOffset);\n }\n\n return sql.join(parts, sql` `);\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { CompilerInvariantError } from \"../../errors\";\nimport { type NodePredicate, type QueryAst } from \"../ast\";\nimport {\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"./predicates\";\n\nconst EMPTY_PREDICATES: readonly NodePredicate[] = [];\n\nexport type PredicateIndex = Readonly<{\n byAliasAndType: ReadonlyMap<string, readonly NodePredicate[]>;\n}>;\n\nfunction buildPredicateIndexKey(\n alias: string,\n targetType: \"node\" | \"edge\",\n): string {\n return `${alias}\\u0000${targetType}`;\n}\n\nfunction resolvePredicateTargetType(predicate: NodePredicate): \"node\" | \"edge\" {\n return predicate.targetType === \"edge\" ? \"edge\" : \"node\";\n}\n\nexport function buildPredicateIndex(ast: QueryAst): PredicateIndex {\n const byAliasAndType = new Map<string, NodePredicate[]>();\n for (const predicate of ast.predicates) {\n const key = buildPredicateIndexKey(\n predicate.targetAlias,\n resolvePredicateTargetType(predicate),\n );\n const existing = byAliasAndType.get(key);\n if (existing === undefined) {\n byAliasAndType.set(key, [predicate]);\n } else {\n existing.push(predicate);\n }\n }\n return { byAliasAndType };\n}\n\nexport function getPredicatesForAlias(\n predicateIndex: PredicateIndex,\n alias: string,\n targetType: \"node\" | \"edge\",\n): readonly NodePredicate[] {\n return (\n predicateIndex.byAliasAndType.get(\n buildPredicateIndexKey(alias, targetType),\n ) ?? EMPTY_PREDICATES\n );\n}\n\nexport function compilePredicateClauses(\n predicates: readonly NodePredicate[],\n predicateContext: PredicateCompilerContext,\n): SQL[] {\n return predicates.map((predicate) =>\n compilePredicateExpression(predicate.expression, predicateContext),\n );\n}\n\nexport function compileKindFilter(column: SQL, kinds: readonly string[]): SQL {\n if (kinds.length === 0) {\n return sql`1 = 0`;\n }\n if (kinds.length === 1) {\n return sql`${column} = ${kinds[0]}`;\n }\n return sql`${column} IN (${sql.join(\n kinds.map((kind) => sql`${kind}`),\n sql`, `,\n )})`;\n}\n\nexport function getNodeKindsForAlias(\n ast: QueryAst,\n alias: string,\n): readonly string[] {\n if (alias === ast.start.alias) {\n return ast.start.kinds;\n }\n\n for (const traversal of ast.traversals) {\n if (traversal.nodeAlias === alias) {\n return traversal.nodeKinds;\n }\n }\n\n throw new CompilerInvariantError(`Unknown traversal source alias: ${alias}`);\n}\n","import { type SQL } from \"drizzle-orm\";\n\nimport { type DialectAdapter } from \"../dialect\";\nimport { type JsonPointer } from \"../json-pointer\";\n\ntype JsonExtractFallback = \"json\" | \"text\";\n\ntype TypedJsonExtractInput = Readonly<{\n column: SQL;\n dialect: DialectAdapter;\n fallback?: JsonExtractFallback;\n pointer: JsonPointer;\n valueType: string | undefined;\n}>;\n\nexport function compileTypedJsonExtract(input: TypedJsonExtractInput): SQL {\n const { column, dialect, pointer, valueType } = input;\n const fallback = input.fallback ?? \"json\";\n\n switch (valueType) {\n case \"string\": {\n return dialect.jsonExtractText(column, pointer);\n }\n case \"number\": {\n return dialect.jsonExtractNumber(column, pointer);\n }\n case \"boolean\": {\n return dialect.jsonExtractBoolean(column, pointer);\n }\n case \"date\": {\n return dialect.jsonExtractDate(column, pointer);\n }\n case \"array\":\n case \"object\":\n case \"embedding\":\n case \"unknown\":\n case undefined: {\n return fallback === \"text\" ?\n dialect.jsonExtractText(column, pointer)\n : dialect.jsonExtract(column, pointer);\n }\n default: {\n return fallback === \"text\" ?\n dialect.jsonExtractText(column, pointer)\n : dialect.jsonExtract(column, pointer);\n }\n }\n}\n","/**\n * Shared Compiler Utilities\n *\n * Functions and constants shared between the standard and recursive compilers.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { type AggregateExpr, type FieldRef, type SelectiveField } from \"../ast\";\n\n// ============================================================\n// Constants\n// ============================================================\n\nexport const NODE_COLUMNS = [\n \"id\",\n \"kind\",\n \"props\",\n \"version\",\n \"valid_from\",\n \"valid_to\",\n \"created_at\",\n \"updated_at\",\n \"deleted_at\",\n] as const;\n\nexport const EDGE_COLUMNS = [\n \"id\",\n \"kind\",\n \"from_id\",\n \"to_id\",\n \"props\",\n \"valid_from\",\n \"valid_to\",\n \"created_at\",\n \"updated_at\",\n \"deleted_at\",\n] as const;\n\nexport type RequiredColumnsByAlias = ReadonlyMap<string, ReadonlySet<string>>;\nexport const EMPTY_REQUIRED_COLUMNS = new Set<string>();\n\n// ============================================================\n// SQL Helpers\n// ============================================================\n\nexport function quoteIdentifier(identifier: string): SQL {\n return sql.raw(`\"${identifier.replaceAll('\"', '\"\"')}\"`);\n}\n\n// ============================================================\n// Column Projection\n// ============================================================\n\n/**\n * Determines whether a column should be included in the projection.\n *\n * @param requiredColumns - Set of columns required by the query, or undefined to include all.\n * @param column - The column name to check.\n * @param alwaysRequiredColumns - Optional set of columns that are always projected\n * (e.g. join keys in recursive CTEs). Pass only from recursive compiler callers.\n */\nexport function shouldProjectColumn(\n requiredColumns: ReadonlySet<string> | undefined,\n column: string,\n alwaysRequiredColumns?: ReadonlySet<string>,\n): boolean {\n if (alwaysRequiredColumns?.has(column)) return true;\n if (requiredColumns === undefined) return true;\n return requiredColumns.has(column);\n}\n\n// ============================================================\n// Required Column Tracking\n// ============================================================\n\nexport function addRequiredColumn(\n requiredColumnsByAlias: Map<string, Set<string>>,\n alias: string,\n column: string,\n): void {\n const existing = requiredColumnsByAlias.get(alias);\n if (existing) {\n existing.add(column);\n return;\n }\n requiredColumnsByAlias.set(alias, new Set([column]));\n}\n\nexport function markFieldRefAsRequired(\n requiredColumnsByAlias: Map<string, Set<string>>,\n field: FieldRef,\n): void {\n const column = field.path[0];\n if (column === undefined) return;\n addRequiredColumn(requiredColumnsByAlias, field.alias, column);\n}\n\nexport function mapSelectiveSystemFieldToColumn(field: string): string {\n if (field === \"fromId\") return \"from_id\";\n if (field === \"toId\") return \"to_id\";\n if (field.startsWith(\"meta.\")) {\n return field\n .slice(5)\n .replaceAll(/([A-Z])/g, \"_$1\")\n .toLowerCase();\n }\n return field;\n}\n\nexport function markSelectiveFieldAsRequired(\n requiredColumnsByAlias: Map<string, Set<string>>,\n field: SelectiveField,\n): void {\n if (field.isSystemField) {\n addRequiredColumn(\n requiredColumnsByAlias,\n field.alias,\n mapSelectiveSystemFieldToColumn(field.field),\n );\n return;\n }\n addRequiredColumn(requiredColumnsByAlias, field.alias, \"props\");\n}\n\n// ============================================================\n// AST Type Guards\n// ============================================================\n\nexport function isIdFieldRef(field: FieldRef): boolean {\n return (\n field.path.length === 1 &&\n field.path[0] === \"id\" &&\n field.jsonPointer === undefined\n );\n}\n\nexport function isAggregateExpr(\n source: FieldRef | AggregateExpr,\n): source is AggregateExpr {\n return \"__type\" in source && source.__type === \"aggregate\";\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { UnsupportedPredicateError } from \"../../../errors\";\nimport {\n type AggregateExpr,\n type FieldRef,\n type QueryAst,\n type SelectiveField,\n type VectorSimilarityPredicate,\n} from \"../../ast\";\nimport { type DialectAdapter } from \"../../dialect\";\nimport { jsonPointer } from \"../../json-pointer\";\nimport { type TemporalFilterPass } from \"../passes\";\nimport {\n compileKindFilter,\n compilePredicateClauses,\n getNodeKindsForAlias,\n getPredicatesForAlias,\n type PredicateIndex,\n} from \"../predicate-utils\";\nimport {\n compileFieldValue,\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"../predicates\";\nimport { compileTypedJsonExtract } from \"../typed-json-extract\";\nimport {\n EDGE_COLUMNS,\n EMPTY_REQUIRED_COLUMNS,\n isAggregateExpr,\n mapSelectiveSystemFieldToColumn,\n NODE_COLUMNS,\n quoteIdentifier,\n type RequiredColumnsByAlias,\n shouldProjectColumn,\n} from \"../utils\";\n\nexport type StandardEmitterPredicateIndex = PredicateIndex;\n\nfunction compileColumnReference(\n tableAlias: string | undefined,\n column: string,\n): SQL {\n if (tableAlias === undefined) {\n return sql.raw(column);\n }\n return sql`${sql.raw(tableAlias)}.${sql.raw(column)}`;\n}\n\nfunction compileNodeSelectColumns(\n tableAlias: string | undefined,\n alias: string,\n requiredColumns: ReadonlySet<string> | undefined,\n): SQL[] {\n return NODE_COLUMNS.filter(\n (column) =>\n column === \"id\" ||\n column === \"kind\" ||\n shouldProjectColumn(requiredColumns, column),\n ).map(\n (column) =>\n sql`${compileColumnReference(tableAlias, column)} AS ${sql.raw(`${alias}_${column}`)}`,\n );\n}\n\nfunction compileEdgeSelectColumns(\n tableAlias: string | undefined,\n alias: string,\n requiredColumns: ReadonlySet<string> | undefined,\n): SQL[] {\n return EDGE_COLUMNS.filter((column) =>\n shouldProjectColumn(requiredColumns, column),\n ).map(\n (column) =>\n sql`${compileColumnReference(tableAlias, column)} AS ${sql.raw(`${alias}_${column}`)}`,\n );\n}\n\ntype BuildStandardStartCteInput = Readonly<{\n ast: QueryAst;\n ctx: PredicateCompilerContext;\n graphId: string;\n predicateIndex: StandardEmitterPredicateIndex;\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined;\n temporalFilterPass: TemporalFilterPass;\n}>;\n\nexport function buildStandardStartCte(input: BuildStandardStartCteInput): SQL {\n const { ast, ctx, graphId, predicateIndex, requiredColumnsByAlias } = input;\n const alias = ast.start.alias;\n const kinds = ast.start.kinds;\n\n const kindFilter = compileKindFilter(sql.raw(\"kind\"), kinds);\n const temporalFilter = input.temporalFilterPass.forAlias();\n const cteContext: PredicateCompilerContext = { ...ctx, cteColumnPrefix: \"\" };\n const predicateClauses = compilePredicateClauses(\n getPredicatesForAlias(predicateIndex, alias, \"node\"),\n cteContext,\n );\n\n const whereClauses = [\n sql`graph_id = ${graphId}`,\n kindFilter,\n temporalFilter,\n ...predicateClauses,\n ];\n\n const effectiveRequiredColumns =\n requiredColumnsByAlias ?\n (requiredColumnsByAlias.get(alias) ?? EMPTY_REQUIRED_COLUMNS)\n : undefined;\n\n return sql`\n cte_${sql.raw(alias)} AS (\n SELECT ${sql.join(\n compileNodeSelectColumns(undefined, alias, effectiveRequiredColumns),\n sql`, `,\n )}\n FROM ${ctx.schema.nodesTable}\n WHERE ${sql.join(whereClauses, sql` AND `)}\n )\n `;\n}\n\ntype BuildStandardTraversalCteInput = Readonly<{\n ast: QueryAst;\n carryForwardPreviousColumns: boolean;\n ctx: PredicateCompilerContext;\n graphId: string;\n materializeCte: boolean;\n predicateIndex: StandardEmitterPredicateIndex;\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined;\n temporalFilterPass: TemporalFilterPass;\n traversalIndex: number;\n traversalLimit: number | undefined;\n}>;\n\nexport function buildStandardTraversalCte(\n input: BuildStandardTraversalCteInput,\n): SQL {\n const {\n ast,\n carryForwardPreviousColumns,\n ctx,\n graphId,\n materializeCte,\n predicateIndex,\n requiredColumnsByAlias,\n temporalFilterPass,\n traversalIndex,\n traversalLimit,\n } = input;\n const traversal = ast.traversals[traversalIndex]!;\n const traversalLimitValue =\n traversalIndex === ast.traversals.length - 1 ? traversalLimit : undefined;\n\n const previousNodeKinds = getNodeKindsForAlias(ast, traversal.joinFromAlias);\n const directEdgeKinds = [...new Set(traversal.edgeKinds)];\n const inverseEdgeKinds =\n traversal.inverseEdgeKinds === undefined ?\n []\n : [...new Set(traversal.inverseEdgeKinds)];\n\n const nodeKinds = traversal.nodeKinds;\n const nodeKindFilter = compileKindFilter(sql.raw(\"n.kind\"), nodeKinds);\n\n const edgeTemporalFilter = temporalFilterPass.forAlias(\"e\");\n const nodeTemporalFilter = temporalFilterPass.forAlias(\"n\");\n\n const nodeCteContext: PredicateCompilerContext = {\n ...ctx,\n cteColumnPrefix: \"n\",\n };\n const nodePredicateClauses = compilePredicateClauses(\n getPredicatesForAlias(predicateIndex, traversal.nodeAlias, \"node\"),\n nodeCteContext,\n );\n\n const edgeCteContext: PredicateCompilerContext = {\n ...ctx,\n cteColumnPrefix: \"e\",\n };\n const edgePredicateClauses = compilePredicateClauses(\n getPredicatesForAlias(predicateIndex, traversal.edgeAlias, \"edge\"),\n edgeCteContext,\n );\n\n const baseWhereClauses = [\n sql`e.graph_id = ${graphId}`,\n nodeKindFilter,\n edgeTemporalFilter,\n nodeTemporalFilter,\n ...nodePredicateClauses,\n ...edgePredicateClauses,\n ];\n\n const previousAlias = traversal.joinFromAlias;\n const edgeAlias = traversal.edgeAlias;\n const nodeAlias = traversal.nodeAlias;\n const requiredNodeColumns =\n requiredColumnsByAlias ?\n (requiredColumnsByAlias.get(nodeAlias) ?? EMPTY_REQUIRED_COLUMNS)\n : undefined;\n const requiredEdgeColumns =\n requiredColumnsByAlias ?\n (requiredColumnsByAlias.get(edgeAlias) ?? EMPTY_REQUIRED_COLUMNS)\n : undefined;\n const previousRowColumns =\n carryForwardPreviousColumns ?\n [sql`cte_${sql.raw(previousAlias)}.*`]\n : [\n sql`cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_id AS ${sql.raw(previousAlias)}_id`,\n sql`cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_kind AS ${sql.raw(previousAlias)}_kind`,\n ];\n const selectColumns = [\n ...previousRowColumns,\n ...compileEdgeSelectColumns(\"e\", edgeAlias, requiredEdgeColumns),\n ...compileNodeSelectColumns(\"n\", nodeAlias, requiredNodeColumns),\n ];\n const cteMaterialization = materializeCte ? sql`MATERIALIZED ` : sql``;\n\n function compileTraversalBranch(\n branch: Readonly<{\n duplicateGuard?: SQL | undefined;\n edgeKinds: readonly string[];\n joinField: \"from_id\" | \"to_id\";\n joinKindField: \"from_kind\" | \"to_kind\";\n targetField: \"from_id\" | \"to_id\";\n targetKindField: \"from_kind\" | \"to_kind\";\n }>,\n ): SQL {\n const whereClauses = [\n ...baseWhereClauses,\n compileKindFilter(sql.raw(\"e.kind\"), branch.edgeKinds),\n compileKindFilter(\n sql.raw(`e.${branch.joinKindField}`),\n previousNodeKinds,\n ),\n compileKindFilter(sql.raw(`e.${branch.targetKindField}`), nodeKinds),\n ];\n\n if (branch.duplicateGuard !== undefined) {\n whereClauses.push(branch.duplicateGuard);\n }\n\n return sql`\n SELECT ${sql.join(selectColumns, sql`, `)}\n FROM cte_${sql.raw(previousAlias)}\n JOIN ${ctx.schema.edgesTable} e ON cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_id = e.${sql.raw(branch.joinField)}\n AND cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_kind = e.${sql.raw(branch.joinKindField)}\n JOIN ${ctx.schema.nodesTable} n ON n.graph_id = e.graph_id\n AND n.id = e.${sql.raw(branch.targetField)}\n AND n.kind = e.${sql.raw(branch.targetKindField)}\n WHERE ${sql.join(whereClauses, sql` AND `)}\n `;\n }\n\n const directJoinField = traversal.direction === \"out\" ? \"from_id\" : \"to_id\";\n const directTargetField = traversal.direction === \"out\" ? \"to_id\" : \"from_id\";\n const directJoinKindField =\n traversal.direction === \"out\" ? \"from_kind\" : \"to_kind\";\n const directTargetKindField =\n traversal.direction === \"out\" ? \"to_kind\" : \"from_kind\";\n\n const directBranch = compileTraversalBranch({\n edgeKinds: directEdgeKinds,\n joinField: directJoinField,\n joinKindField: directJoinKindField,\n targetField: directTargetField,\n targetKindField: directTargetKindField,\n });\n\n if (inverseEdgeKinds.length === 0) {\n if (traversalLimitValue !== undefined) {\n return sql`\n cte_${sql.raw(nodeAlias)} AS ${cteMaterialization}(\n SELECT * FROM (\n ${directBranch}\n ) AS traversal_rows\n LIMIT ${traversalLimitValue}\n )\n `;\n }\n\n return sql`\n cte_${sql.raw(nodeAlias)} AS ${cteMaterialization}(\n ${directBranch}\n )\n `;\n }\n\n const inverseJoinField = traversal.direction === \"out\" ? \"to_id\" : \"from_id\";\n const inverseTargetField =\n traversal.direction === \"out\" ? \"from_id\" : \"to_id\";\n const inverseJoinKindField =\n traversal.direction === \"out\" ? \"to_kind\" : \"from_kind\";\n const inverseTargetKindField =\n traversal.direction === \"out\" ? \"from_kind\" : \"to_kind\";\n\n const overlappingKinds = inverseEdgeKinds.filter((kind) =>\n directEdgeKinds.includes(kind),\n );\n\n const duplicateGuard =\n overlappingKinds.length > 0 ?\n sql`NOT (e.from_id = e.to_id AND ${compileKindFilter(\n sql.raw(\"e.kind\"),\n overlappingKinds,\n )})`\n : undefined;\n\n const inverseBranch = compileTraversalBranch({\n duplicateGuard,\n edgeKinds: inverseEdgeKinds,\n joinField: inverseJoinField,\n joinKindField: inverseJoinKindField,\n targetField: inverseTargetField,\n targetKindField: inverseTargetKindField,\n });\n\n if (traversalLimitValue !== undefined) {\n return sql`\n cte_${sql.raw(nodeAlias)} AS ${cteMaterialization}(\n SELECT * FROM (\n ${directBranch}\n UNION ALL\n ${inverseBranch}\n ) AS traversal_rows\n LIMIT ${traversalLimitValue}\n )\n `;\n }\n\n return sql`\n cte_${sql.raw(nodeAlias)} AS ${cteMaterialization}(\n ${directBranch}\n UNION ALL\n ${inverseBranch}\n )\n `;\n}\n\nfunction compileAggregateExprFromSource(\n expr: AggregateExpr,\n dialect: DialectAdapter,\n): SQL {\n const { field } = expr;\n const fn = expr.function;\n\n switch (fn) {\n case \"count\":\n case \"countDistinct\":\n case \"sum\":\n case \"avg\":\n case \"min\":\n case \"max\": {\n const cteAlias = `cte_${field.alias}`;\n const column = compileFieldValue(\n field,\n dialect,\n field.valueType,\n cteAlias,\n );\n if (fn === \"countDistinct\") {\n return sql`COUNT(DISTINCT ${column})`;\n }\n return sql`${sql.raw(fn.toUpperCase())}(${column})`;\n }\n default: {\n throw new UnsupportedPredicateError(\n `Unknown aggregate function: ${String(fn)}`,\n );\n }\n }\n}\n\nfunction compileProjectedSource(\n field: {\n cteAlias?: string;\n source: FieldRef | AggregateExpr;\n },\n dialect: DialectAdapter,\n): SQL {\n if (isAggregateExpr(field.source)) {\n return compileAggregateExprFromSource(field.source, dialect);\n }\n const cteAlias = field.cteAlias ?? `cte_${field.source.alias}`;\n return compileFieldValue(\n field.source,\n dialect,\n field.source.valueType,\n cteAlias,\n );\n}\n\ntype BuildStandardProjectionInput = Readonly<{\n ast: QueryAst;\n collapsedTraversalCteAlias?: string;\n dialect: DialectAdapter;\n}>;\n\nexport function buildStandardProjection(\n input: BuildStandardProjectionInput,\n): SQL {\n const { ast, collapsedTraversalCteAlias, dialect } = input;\n if (ast.selectiveFields && ast.selectiveFields.length > 0) {\n return compileSelectiveProjection(\n ast.selectiveFields,\n dialect,\n ast,\n collapsedTraversalCteAlias,\n );\n }\n\n const fields = ast.projection.fields;\n if (fields.length === 0) {\n return sql.raw(\"*\");\n }\n\n const projectedFields = fields.map((field) => {\n const source = compileProjectedSource(field, dialect);\n return sql`${source} AS ${quoteIdentifier(field.outputName)}`;\n });\n return sql.join(projectedFields, sql`, `);\n}\n\nfunction compileSelectiveProjection(\n fields: readonly SelectiveField[],\n dialect: DialectAdapter,\n ast: QueryAst,\n collapsedTraversalCteAlias?: string,\n): SQL {\n const aliasToCte = new Map<string, string>([\n [ast.start.alias, `cte_${ast.start.alias}`],\n ]);\n\n for (const traversal of ast.traversals) {\n aliasToCte.set(traversal.nodeAlias, `cte_${traversal.nodeAlias}`);\n aliasToCte.set(traversal.edgeAlias, `cte_${traversal.nodeAlias}`);\n }\n\n const columns = fields.map((field) => {\n const cteAlias =\n collapsedTraversalCteAlias ??\n aliasToCte.get(field.alias) ??\n `cte_${field.alias}`;\n\n if (field.isSystemField) {\n const dbColumn = mapSelectiveSystemFieldToColumn(field.field);\n\n return sql`${sql.raw(cteAlias)}.${sql.raw(`${field.alias}_${dbColumn}`)} AS ${quoteIdentifier(field.outputName)}`;\n }\n\n const propsColumn = `${field.alias}_props`;\n const column = sql`${sql.raw(cteAlias)}.${sql.raw(propsColumn)}`;\n const pointer = jsonPointer([field.field]);\n const extracted = compileTypedJsonExtract({\n column,\n dialect,\n pointer,\n valueType: field.valueType,\n });\n return sql`${extracted} AS ${quoteIdentifier(field.outputName)}`;\n });\n\n return sql.join(columns, sql`, `);\n}\n\ntype BuildStandardFromClauseInput = Readonly<{\n ast: QueryAst;\n collapsedTraversalCteAlias?: string;\n vectorPredicate?: VectorSimilarityPredicate;\n}>;\n\nexport function buildStandardFromClause(\n input: BuildStandardFromClauseInput,\n): SQL {\n const { ast, collapsedTraversalCteAlias, vectorPredicate } = input;\n if (collapsedTraversalCteAlias !== undefined) {\n return sql`FROM ${sql.raw(collapsedTraversalCteAlias)}`;\n }\n\n const startAlias = ast.start.alias;\n const fromClause = sql`FROM cte_${sql.raw(startAlias)}`;\n\n const joins: SQL[] = [];\n for (const traversal of ast.traversals) {\n const cteAlias = `cte_${traversal.nodeAlias}`;\n const previousAlias = traversal.joinFromAlias;\n const joinType = traversal.optional ? \"LEFT JOIN\" : \"INNER JOIN\";\n joins.push(\n sql`${sql.raw(joinType)} ${sql.raw(cteAlias)} ON ${sql.raw(cteAlias)}.${sql.raw(previousAlias)}_id = cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_id AND ${sql.raw(cteAlias)}.${sql.raw(previousAlias)}_kind = cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_kind`,\n );\n }\n\n if (vectorPredicate) {\n const nodeAlias = vectorPredicate.field.alias;\n joins.push(\n sql`INNER JOIN cte_embeddings ON cte_embeddings.node_id = cte_${sql.raw(nodeAlias)}.${sql.raw(nodeAlias)}_id`,\n );\n }\n\n return joins.length === 0 ?\n fromClause\n : sql`${fromClause} ${sql.join(joins, sql` `)}`;\n}\n\ntype BuildStandardOrderByInput = Readonly<{\n ast: QueryAst;\n collapsedTraversalCteAlias?: string;\n dialect: DialectAdapter;\n}>;\n\nexport function buildStandardOrderBy(\n input: BuildStandardOrderByInput,\n): SQL | undefined {\n const { ast, collapsedTraversalCteAlias, dialect } = input;\n if (!ast.orderBy || ast.orderBy.length === 0) {\n return undefined;\n }\n\n const parts: SQL[] = [];\n for (const orderSpec of ast.orderBy) {\n const valueType = orderSpec.field.valueType;\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Ordering by JSON arrays or objects is not supported\",\n );\n }\n const cteAlias =\n collapsedTraversalCteAlias ?? `cte_${orderSpec.field.alias}`;\n const field = compileFieldValue(\n orderSpec.field,\n dialect,\n valueType,\n cteAlias,\n );\n const direction = sql.raw(orderSpec.direction.toUpperCase());\n const nulls =\n orderSpec.nulls ?? (orderSpec.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDirection = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n parts.push(\n sql`(${field} IS NULL) ${nullsDirection}`,\n sql`${field} ${direction}`,\n );\n }\n\n return sql`ORDER BY ${sql.join(parts, sql`, `)}`;\n}\n\nfunction fieldRefKey(field: FieldRef): string {\n const pointer = field.jsonPointer ?? \"\";\n return `${field.alias}:${field.path.join(\".\")}:${pointer}`;\n}\n\ntype BuildStandardGroupByInput = Readonly<{\n ast: QueryAst;\n dialect: DialectAdapter;\n}>;\n\nexport function buildStandardGroupBy(\n input: BuildStandardGroupByInput,\n): SQL | undefined {\n const { ast, dialect } = input;\n if (!ast.groupBy || ast.groupBy.fields.length === 0) {\n return undefined;\n }\n\n const seenKeys = new Set<string>();\n const allFields: FieldRef[] = [];\n\n for (const projectedField of ast.projection.fields) {\n if (projectedField.source.__type === \"field_ref\") {\n const key = fieldRefKey(projectedField.source);\n if (!seenKeys.has(key)) {\n seenKeys.add(key);\n allFields.push(projectedField.source);\n }\n }\n }\n\n for (const field of ast.groupBy.fields) {\n const key = fieldRefKey(field);\n if (!seenKeys.has(key)) {\n seenKeys.add(key);\n allFields.push(field);\n }\n }\n\n if (allFields.length === 0) {\n return undefined;\n }\n\n const parts = allFields.map((field) =>\n compileFieldValue(field, dialect, field.valueType, `cte_${field.alias}`),\n );\n\n return sql`GROUP BY ${sql.join(parts, sql`, `)}`;\n}\n\ntype BuildStandardHavingInput = Readonly<{\n ast: QueryAst;\n ctx: PredicateCompilerContext;\n}>;\n\nexport function buildStandardHaving(\n input: BuildStandardHavingInput,\n): SQL | undefined {\n const { ast, ctx } = input;\n if (!ast.having) {\n return undefined;\n }\n\n const condition = compilePredicateExpression(ast.having, ctx);\n return sql`HAVING ${condition}`;\n}\n\ntype BuildStandardEmbeddingsCteInput = Readonly<{\n ctx: PredicateCompilerContext;\n graphId: string;\n vectorPredicate: VectorSimilarityPredicate;\n}>;\n\nexport function buildStandardEmbeddingsCte(\n input: BuildStandardEmbeddingsCteInput,\n): SQL {\n const { ctx, graphId, vectorPredicate } = input;\n const { dialect } = ctx;\n const { field, metric, minScore, queryEmbedding } = vectorPredicate;\n\n const fieldPath =\n field.jsonPointer ? (field.jsonPointer as string)\n : field.path.length > 1 && field.path[0] === \"props\" ?\n `/${field.path.slice(1).join(\"/\")}`\n : `/${field.path.join(\"/\")}`;\n\n const distanceExpr = dialect.vectorDistance(\n sql.raw(\"embedding\"),\n queryEmbedding,\n metric,\n );\n\n const conditions: SQL[] = [\n sql`graph_id = ${graphId}`,\n sql`field_path = ${fieldPath}`,\n ];\n\n if (minScore !== undefined) {\n // minScore validation (finiteness, cosine range) is handled by the vector\n // predicate pass in passes/vector.ts — no redundant check here.\n conditions.push(\n compileVectorMinScoreCondition(distanceExpr, metric, minScore),\n );\n }\n\n const scoreExpr = compileVectorScoreExpression(distanceExpr, metric);\n\n return sql`\n cte_embeddings AS (\n SELECT\n node_id,\n ${distanceExpr} AS distance,\n ${scoreExpr} AS score\n FROM ${ctx.schema.embeddingsTable}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${distanceExpr} ASC\n )\n `;\n}\n\nfunction compileVectorScoreExpression(\n distanceExpr: SQL,\n metric: VectorSimilarityPredicate[\"metric\"],\n): SQL {\n switch (metric) {\n case \"cosine\": {\n return sql`(1.0 - ${distanceExpr})`;\n }\n case \"l2\":\n case \"inner_product\": {\n return distanceExpr;\n }\n }\n}\n\nfunction compileVectorMinScoreCondition(\n distanceExpr: SQL,\n metric: VectorSimilarityPredicate[\"metric\"],\n minScore: number,\n): SQL {\n switch (metric) {\n case \"cosine\": {\n const threshold = 1 - minScore;\n return sql`${distanceExpr} <= ${threshold}`;\n }\n case \"l2\": {\n return sql`${distanceExpr} <= ${minScore}`;\n }\n case \"inner_product\": {\n const negativeThreshold = -minScore;\n return sql`${distanceExpr} <= ${negativeThreshold}`;\n }\n }\n}\n\ntype BuildStandardVectorOrderByInput = Readonly<{\n ast: QueryAst;\n dialect: DialectAdapter;\n}>;\n\nexport function buildStandardVectorOrderBy(\n input: BuildStandardVectorOrderByInput,\n): SQL {\n const { ast, dialect } = input;\n\n const distanceOrder = sql`cte_embeddings.distance ASC`;\n const additionalOrders: SQL[] = [];\n\n if (ast.orderBy && ast.orderBy.length > 0) {\n for (const orderSpec of ast.orderBy) {\n const valueType = orderSpec.field.valueType;\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Ordering by JSON arrays or objects is not supported\",\n );\n }\n const cteAlias = `cte_${orderSpec.field.alias}`;\n const field = compileFieldValue(\n orderSpec.field,\n dialect,\n valueType,\n cteAlias,\n );\n const direction = sql.raw(orderSpec.direction.toUpperCase());\n const nulls =\n orderSpec.nulls ?? (orderSpec.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDirection = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n additionalOrders.push(\n sql`(${field} IS NULL) ${nullsDirection}`,\n sql`${field} ${direction}`,\n );\n }\n }\n\n const allOrders = [distanceOrder, ...additionalOrders];\n return sql`ORDER BY ${sql.join(allOrders, sql`, `)}`;\n}\n\ntype BuildLimitOffsetClauseInput = Readonly<{\n limit: number | undefined;\n offset: number | undefined;\n}>;\n\nexport function buildLimitOffsetClause(\n input: BuildLimitOffsetClauseInput,\n): SQL | undefined {\n const { limit, offset } = input;\n const parts: SQL[] = [];\n\n if (limit !== undefined) {\n parts.push(sql`LIMIT ${limit}`);\n }\n if (offset !== undefined) {\n parts.push(sql`OFFSET ${offset}`);\n }\n\n return parts.length > 0 ? sql.join(parts, sql` `) : undefined;\n}\n","/**\n * Recursive CTE Compilation\n *\n * Compiles variable-length path traversals using WITH RECURSIVE.\n * Handles cycle detection and depth limiting using dialect-specific operations.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport {\n CompilerInvariantError,\n UnsupportedPredicateError,\n} from \"../../errors\";\nimport { type QueryAst, type SelectiveField } from \"../ast\";\nimport {\n type DialectAdapter,\n type DialectRecursiveQueryStrategy,\n} from \"../dialect\";\nimport { jsonPointer } from \"../json-pointer\";\nimport { emitRecursiveQuerySql } from \"./emitter\";\nimport {\n createTemporalFilterPass,\n runCompilerPass,\n runRecursiveTraversalSelectionPass,\n type TemporalFilterPass,\n type VariableLengthTraversal,\n} from \"./passes\";\nimport { type LogicalPlan, lowerRecursiveQueryToLogicalPlan } from \"./plan\";\nimport { compileKindFilter as sharedCompileKindFilter } from \"./predicate-utils\";\nimport {\n compileFieldValue,\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"./predicates\";\nimport { compileTypedJsonExtract } from \"./typed-json-extract\";\nimport {\n addRequiredColumn,\n EMPTY_REQUIRED_COLUMNS,\n mapSelectiveSystemFieldToColumn,\n markFieldRefAsRequired,\n markSelectiveFieldAsRequired,\n NODE_COLUMNS,\n quoteIdentifier,\n type RequiredColumnsByAlias,\n shouldProjectColumn,\n} from \"./utils\";\n\n// ============================================================\n// Constants\n// ============================================================\n\n/**\n * Maximum depth for recursive CTE queries when maxDepth is unlimited (-1).\n *\n * This default limit prevents runaway recursion for unbounded traversals while\n * still supporting typical neighborhood/path use-cases.\n */\nexport const MAX_RECURSIVE_DEPTH = 100;\n\n/**\n * Maximum depth for explicit maxDepth traversals.\n *\n * Explicit traversal bounds are opt-in and safe to allow at a higher ceiling\n * for stress testing and long-path workloads.\n */\nexport const MAX_EXPLICIT_RECURSIVE_DEPTH = 1000;\n\nconst NO_ALWAYS_REQUIRED_COLUMNS = new Set<string>();\n\ntype RecursiveQueryPassState = Readonly<{\n ast: QueryAst;\n ctx: PredicateCompilerContext;\n graphId: string;\n logicalPlan: LogicalPlan | undefined;\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined;\n temporalFilterPass: TemporalFilterPass | undefined;\n traversal: VariableLengthTraversal | undefined;\n}>;\n\nfunction runRecursiveQueryPassPipeline(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): RecursiveQueryPassState {\n let state: RecursiveQueryPassState = {\n ast,\n ctx,\n graphId,\n logicalPlan: undefined,\n requiredColumnsByAlias: undefined,\n temporalFilterPass: undefined,\n traversal: undefined,\n };\n\n const recursiveTraversalPass = runCompilerPass(state, {\n name: \"recursive_traversal\",\n execute(currentState): VariableLengthTraversal {\n return runRecursiveTraversalSelectionPass(currentState.ast);\n },\n update(currentState, traversal): RecursiveQueryPassState {\n return {\n ...currentState,\n traversal,\n };\n },\n });\n state = recursiveTraversalPass.state;\n\n const temporalPass = runCompilerPass(state, {\n name: \"temporal_filters\",\n execute(currentState): TemporalFilterPass {\n return createTemporalFilterPass(\n currentState.ast,\n currentState.ctx.dialect.currentTimestamp(),\n );\n },\n update(currentState, temporalFilterPass): RecursiveQueryPassState {\n return {\n ...currentState,\n temporalFilterPass,\n };\n },\n });\n state = temporalPass.state;\n\n const columnPruningPass = runCompilerPass(state, {\n name: \"column_pruning\",\n execute(currentState): RequiredColumnsByAlias | undefined {\n const traversal = currentState.traversal;\n if (traversal === undefined) {\n throw new CompilerInvariantError(\n \"Recursive traversal pass did not select traversal\",\n );\n }\n return collectRequiredColumnsByAlias(currentState.ast, traversal);\n },\n update(currentState, requiredColumnsByAlias): RecursiveQueryPassState {\n return {\n ...currentState,\n requiredColumnsByAlias,\n };\n },\n });\n state = columnPruningPass.state;\n\n const logicalPlanPass = runCompilerPass(state, {\n name: \"logical_plan\",\n execute(currentState): LogicalPlan {\n const loweringInput = {\n ast: currentState.ast,\n dialect: currentState.ctx.dialect.name,\n graphId: currentState.graphId,\n ...(currentState.traversal === undefined ?\n {}\n : { traversal: currentState.traversal }),\n };\n return lowerRecursiveQueryToLogicalPlan(loweringInput);\n },\n update(currentState, logicalPlan): RecursiveQueryPassState {\n return {\n ...currentState,\n logicalPlan,\n };\n },\n });\n state = logicalPlanPass.state;\n\n return state;\n}\n\n// ============================================================\n// Main Compiler\n// ============================================================\n\n/**\n * Compiles a variable-length query using recursive CTEs.\n *\n * @param ast - The query AST\n * @param graphId - The graph ID\n * @param ctx - Predicate compiler context\n * @returns SQL for the recursive query\n */\nexport function compileVariableLengthQuery(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const strategy = ctx.dialect.capabilities.recursiveQueryStrategy;\n const handler = RECURSIVE_QUERY_STRATEGY_HANDLERS[strategy];\n return handler(ast, graphId, ctx);\n}\n\ntype RecursiveQueryStrategyHandler = (\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n) => SQL;\n\nconst RECURSIVE_QUERY_STRATEGY_HANDLERS: Record<\n DialectRecursiveQueryStrategy,\n RecursiveQueryStrategyHandler\n> = {\n recursive_cte: compileVariableLengthQueryWithRecursiveCteStrategy,\n};\n\nfunction compileVariableLengthQueryWithRecursiveCteStrategy(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const passState = runRecursiveQueryPassPipeline(ast, graphId, ctx);\n\n const { dialect } = ctx;\n const {\n logicalPlan,\n requiredColumnsByAlias,\n temporalFilterPass,\n traversal: vlTraversal,\n } = passState;\n\n if (temporalFilterPass === undefined) {\n throw new CompilerInvariantError(\n \"Temporal filter pass did not initialize temporal state\",\n );\n }\n if (logicalPlan === undefined) {\n throw new CompilerInvariantError(\n \"Logical plan pass did not initialize plan state\",\n );\n }\n if (vlTraversal === undefined) {\n throw new CompilerInvariantError(\n \"Recursive traversal pass did not select traversal\",\n );\n }\n\n // Build the recursive CTE\n const recursiveCte = compileRecursiveCte(\n ast,\n vlTraversal,\n graphId,\n ctx,\n requiredColumnsByAlias,\n temporalFilterPass,\n );\n\n // Build projection\n const projection = compileRecursiveProjection(ast, vlTraversal, dialect);\n\n // Build final SELECT\n const minDepth = vlTraversal.variableLength.minDepth;\n const depthFilter =\n minDepth > 0 ? sql`WHERE depth >= ${minDepth}` : sql.raw(\"\");\n\n // Order by and limit/offset\n const orderBy = compileRecursiveOrderBy(ast, dialect);\n const limitOffset = compileLimitOffset(ast);\n\n return emitRecursiveQuerySql({\n depthFilter,\n ...(limitOffset === undefined ? {} : { limitOffset }),\n logicalPlan,\n ...(orderBy === undefined ? {} : { orderBy }),\n projection,\n recursiveCte,\n });\n}\n\n/**\n * Checks if a query contains variable-length traversals.\n */\nexport function hasVariableLengthTraversal(ast: QueryAst): boolean {\n return ast.traversals.some((t) => t.variableLength !== undefined);\n}\n\n// ============================================================\n// Recursive CTE Generation\n// ============================================================\n\n/**\n * Compiles the recursive CTE for variable-length traversal.\n */\nfunction compileRecursiveCte(\n ast: QueryAst,\n traversal: VariableLengthTraversal,\n graphId: string,\n ctx: PredicateCompilerContext,\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined,\n temporalFilterPass: TemporalFilterPass,\n): SQL {\n const { dialect } = ctx;\n const startAlias = ast.start.alias;\n const startKinds = ast.start.kinds;\n const nodeAlias = traversal.nodeAlias;\n const directEdgeKinds = [...new Set(traversal.edgeKinds)];\n const inverseEdgeKinds =\n traversal.inverseEdgeKinds === undefined ?\n []\n : [...new Set(traversal.inverseEdgeKinds)];\n const forceWorktableOuterJoinOrder =\n dialect.capabilities.forceRecursiveWorktableOuterJoinOrder;\n const nodeKinds = traversal.nodeKinds;\n const previousNodeKinds = [...new Set([...startKinds, ...nodeKinds])];\n const direction = traversal.direction;\n const vl = traversal.variableLength;\n const shouldEnforceCycleCheck = vl.cyclePolicy !== \"allow\";\n const shouldTrackPath = shouldEnforceCycleCheck || vl.pathAlias !== undefined;\n const recursiveJoinRequiredColumns = new Set<string>([\"id\"]);\n if (previousNodeKinds.length > 1) {\n recursiveJoinRequiredColumns.add(\"kind\");\n }\n const requiredStartColumns =\n requiredColumnsByAlias ?\n (requiredColumnsByAlias.get(startAlias) ?? EMPTY_REQUIRED_COLUMNS)\n : undefined;\n const requiredNodeColumns =\n requiredColumnsByAlias ?\n (requiredColumnsByAlias.get(nodeAlias) ?? EMPTY_REQUIRED_COLUMNS)\n : undefined;\n const startColumnsFromBase = compileNodeSelectColumnsFromTable(\n \"n0\",\n startAlias,\n requiredStartColumns,\n NO_ALWAYS_REQUIRED_COLUMNS,\n );\n const startColumnsFromRecursive = compileNodeSelectColumnsFromRecursiveRow(\n startAlias,\n requiredStartColumns,\n NO_ALWAYS_REQUIRED_COLUMNS,\n );\n const nodeColumnsFromBase = compileNodeSelectColumnsFromTable(\n \"n0\",\n nodeAlias,\n requiredNodeColumns,\n recursiveJoinRequiredColumns,\n );\n const nodeColumnsFromRecursive = compileNodeSelectColumnsFromTable(\n \"n\",\n nodeAlias,\n requiredNodeColumns,\n recursiveJoinRequiredColumns,\n );\n\n const startKindFilter = compileKindFilter(startKinds, \"n0.kind\");\n const nodeKindFilter = compileKindFilter(nodeKinds, \"n.kind\");\n\n const startTemporalFilter = temporalFilterPass.forAlias(\"n0\");\n const edgeTemporalFilter = temporalFilterPass.forAlias(\"e\");\n const nodeTemporalFilter = temporalFilterPass.forAlias(\"n\");\n\n // Start predicates (with cteColumnPrefix \"\" for raw n0 columns)\n const startContext = { ...ctx, cteColumnPrefix: \"\" };\n const startPredicates = compileNodePredicates(ast, startAlias, startContext);\n\n // Edge predicates (with cteColumnPrefix \"e\" for e.props)\n const edgeContext = { ...ctx, cteColumnPrefix: \"e\" };\n const edgePredicates = compileEdgePredicates(\n ast,\n traversal.edgeAlias,\n edgeContext,\n );\n\n // Target node predicates (with cteColumnPrefix \"n\" for n.props)\n const targetContext = { ...ctx, cteColumnPrefix: \"n\" };\n const targetNodePredicates = compileNodePredicates(\n ast,\n nodeAlias,\n targetContext,\n );\n\n // Max depth condition:\n // - unlimited traversals are capped at MAX_RECURSIVE_DEPTH\n // - explicit maxDepth traversals must not exceed MAX_EXPLICIT_RECURSIVE_DEPTH\n if (vl.maxDepth > MAX_EXPLICIT_RECURSIVE_DEPTH) {\n throw new UnsupportedPredicateError(\n `Recursive traversal maxHops(${vl.maxDepth}) exceeds maximum explicit depth of ${MAX_EXPLICIT_RECURSIVE_DEPTH}`,\n );\n }\n const effectiveMaxDepth = vl.maxDepth > 0 ? vl.maxDepth : MAX_RECURSIVE_DEPTH;\n const maxDepthCondition = sql`r.depth < ${effectiveMaxDepth}`;\n\n const cycleCheck =\n shouldEnforceCycleCheck ?\n dialect.cycleCheck(sql.raw(\"n.id\"), sql.raw(\"r.path\"))\n : undefined;\n const initialPath =\n shouldTrackPath ? dialect.initializePath(sql.raw(\"n0.id\")) : undefined;\n const pathExtension =\n shouldTrackPath ?\n dialect.extendPath(sql.raw(\"r.path\"), sql.raw(\"n.id\"))\n : undefined;\n\n // Base case WHERE clauses\n const baseWhereClauses = [\n sql`n0.graph_id = ${graphId}`,\n startKindFilter,\n startTemporalFilter,\n ...startPredicates,\n ];\n\n const recursiveBaseWhereClauses: SQL[] = [\n sql`e.graph_id = ${graphId}`,\n nodeKindFilter,\n edgeTemporalFilter,\n nodeTemporalFilter,\n maxDepthCondition,\n ];\n if (cycleCheck !== undefined) {\n recursiveBaseWhereClauses.push(cycleCheck);\n }\n recursiveBaseWhereClauses.push(...edgePredicates, ...targetNodePredicates);\n\n function compileRecursiveBranch(\n branch: Readonly<{\n joinField: \"from_id\" | \"to_id\";\n targetField: \"from_id\" | \"to_id\";\n joinKindField: \"from_kind\" | \"to_kind\";\n targetKindField: \"from_kind\" | \"to_kind\";\n edgeKinds: readonly string[];\n duplicateGuard?: SQL | undefined;\n }>,\n ): SQL {\n const recursiveFilterClauses = [\n ...recursiveBaseWhereClauses,\n compileKindFilter(branch.edgeKinds, \"e.kind\"),\n compileKindFilter(previousNodeKinds, `e.${branch.joinKindField}`),\n compileKindFilter(nodeKinds, `e.${branch.targetKindField}`),\n ];\n\n if (branch.duplicateGuard !== undefined) {\n recursiveFilterClauses.push(branch.duplicateGuard);\n }\n\n const recursiveSelectColumns = [\n ...startColumnsFromRecursive,\n ...nodeColumnsFromRecursive,\n sql`r.depth + 1 AS depth`,\n ];\n if (pathExtension !== undefined) {\n recursiveSelectColumns.push(sql`${pathExtension} AS path`);\n }\n const recursiveJoinClauses: SQL[] = [\n sql`e.${sql.raw(branch.joinField)} = r.${sql.raw(nodeAlias)}_id`,\n ];\n if (previousNodeKinds.length > 1) {\n recursiveJoinClauses.push(\n sql`e.${sql.raw(branch.joinKindField)} = r.${sql.raw(nodeAlias)}_kind`,\n );\n }\n\n if (forceWorktableOuterJoinOrder) {\n const recursiveWhereClauses = [\n ...recursiveJoinClauses,\n ...recursiveFilterClauses,\n ];\n\n return sql`\n SELECT ${sql.join(recursiveSelectColumns, sql`, `)}\n FROM recursive_cte r\n CROSS JOIN ${ctx.schema.edgesTable} e\n JOIN ${ctx.schema.nodesTable} n ON n.graph_id = e.graph_id\n AND n.id = e.${sql.raw(branch.targetField)}\n AND n.kind = e.${sql.raw(branch.targetKindField)}\n WHERE ${sql.join(recursiveWhereClauses, sql` AND `)}\n `;\n }\n\n return sql`\n SELECT ${sql.join(recursiveSelectColumns, sql`, `)}\n FROM recursive_cte r\n JOIN ${ctx.schema.edgesTable} e ON ${sql.join(recursiveJoinClauses, sql` AND `)}\n JOIN ${ctx.schema.nodesTable} n ON n.graph_id = e.graph_id\n AND n.id = e.${sql.raw(branch.targetField)}\n AND n.kind = e.${sql.raw(branch.targetKindField)}\n WHERE ${sql.join(recursiveFilterClauses, sql` AND `)}\n `;\n }\n\n const directJoinField = direction === \"out\" ? \"from_id\" : \"to_id\";\n const directTargetField = direction === \"out\" ? \"to_id\" : \"from_id\";\n const directJoinKindField = direction === \"out\" ? \"from_kind\" : \"to_kind\";\n const directTargetKindField = direction === \"out\" ? \"to_kind\" : \"from_kind\";\n\n const directBranch = compileRecursiveBranch({\n joinField: directJoinField,\n targetField: directTargetField,\n joinKindField: directJoinKindField,\n targetKindField: directTargetKindField,\n edgeKinds: directEdgeKinds,\n });\n\n function compileInverseRecursiveBranch(): SQL {\n const inverseJoinField = direction === \"out\" ? \"to_id\" : \"from_id\";\n const inverseTargetField = direction === \"out\" ? \"from_id\" : \"to_id\";\n const inverseJoinKindField = direction === \"out\" ? \"to_kind\" : \"from_kind\";\n const inverseTargetKindField =\n direction === \"out\" ? \"from_kind\" : \"to_kind\";\n const overlappingKinds = inverseEdgeKinds.filter((kind) =>\n directEdgeKinds.includes(kind),\n );\n\n const duplicateGuard =\n overlappingKinds.length > 0 ?\n sql`NOT (e.from_id = e.to_id AND ${compileKindFilter(overlappingKinds, \"e.kind\")})`\n : undefined;\n\n const inverseBranch = compileRecursiveBranch({\n joinField: inverseJoinField,\n targetField: inverseTargetField,\n joinKindField: inverseJoinKindField,\n targetKindField: inverseTargetKindField,\n edgeKinds: inverseEdgeKinds,\n duplicateGuard,\n });\n\n return sql`\n ${directBranch}\n UNION ALL\n ${inverseBranch}\n `;\n }\n\n const recursiveBranchSql =\n inverseEdgeKinds.length === 0 ?\n directBranch\n : compileInverseRecursiveBranch();\n const baseSelectColumns = [\n ...startColumnsFromBase,\n ...nodeColumnsFromBase,\n sql`0 AS depth`,\n ];\n if (initialPath !== undefined) {\n baseSelectColumns.push(sql`${initialPath} AS path`);\n }\n\n return sql`\n recursive_cte AS (\n -- Base case: starting nodes\n SELECT ${sql.join(baseSelectColumns, sql`, `)}\n FROM ${ctx.schema.nodesTable} n0\n WHERE ${sql.join(baseWhereClauses, sql` AND `)}\n\n UNION ALL\n\n -- Recursive case: follow edges\n ${recursiveBranchSql}\n )\n `;\n}\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\n/**\n * Compiles a kind filter for IN clause.\n * Delegates to the shared compileKindFilter from predicate-utils\n * with a raw SQL column expression.\n */\nfunction compileKindFilter(kinds: readonly string[], columnExpr: string): SQL {\n return sharedCompileKindFilter(sql.raw(columnExpr), kinds);\n}\n\n/**\n * Compiles node predicates for a specific alias.\n * Filters by alias and excludes edge predicates (targetType !== \"edge\").\n */\nfunction compileNodePredicates(\n ast: QueryAst,\n alias: string,\n ctx: PredicateCompilerContext,\n): SQL[] {\n return ast.predicates\n .filter((p) => p.targetAlias === alias && p.targetType !== \"edge\")\n .map((p) => compilePredicateExpression(p.expression, ctx));\n}\n\n/**\n * Compiles edge predicates for a specific edge alias.\n * Filters by alias and only includes edge predicates (targetType === \"edge\").\n */\nfunction compileEdgePredicates(\n ast: QueryAst,\n edgeAlias: string,\n ctx: PredicateCompilerContext,\n): SQL[] {\n return ast.predicates\n .filter((p) => p.targetAlias === edgeAlias && p.targetType === \"edge\")\n .map((p) => compilePredicateExpression(p.expression, ctx));\n}\n\nfunction collectRequiredColumnsByAlias(\n ast: QueryAst,\n traversal: VariableLengthTraversal,\n): RequiredColumnsByAlias | undefined {\n const selectiveFields = ast.selectiveFields;\n if (selectiveFields === undefined || selectiveFields.length === 0) {\n return undefined;\n }\n\n const requiredColumnsByAlias = new Map<string, Set<string>>();\n const previousNodeKinds = [\n ...new Set([...ast.start.kinds, ...traversal.nodeKinds]),\n ];\n\n // Recursive expansion always needs node alias id for joins/cycle checks.\n addRequiredColumn(requiredColumnsByAlias, traversal.nodeAlias, \"id\");\n if (previousNodeKinds.length > 1) {\n addRequiredColumn(requiredColumnsByAlias, traversal.nodeAlias, \"kind\");\n }\n\n for (const field of selectiveFields) {\n markSelectiveFieldAsRequired(requiredColumnsByAlias, field);\n }\n\n if (ast.orderBy) {\n for (const orderSpec of ast.orderBy) {\n markFieldRefAsRequired(requiredColumnsByAlias, orderSpec.field);\n }\n }\n\n return requiredColumnsByAlias;\n}\n\nfunction compileNodeSelectColumnsFromTable(\n tableAlias: string,\n alias: string,\n requiredColumns: ReadonlySet<string> | undefined,\n alwaysRequiredColumns: ReadonlySet<string>,\n): SQL[] {\n return NODE_COLUMNS.filter((column) =>\n shouldProjectColumn(requiredColumns, column, alwaysRequiredColumns),\n ).map(\n (column) =>\n sql`${sql.raw(tableAlias)}.${sql.raw(column)} AS ${sql.raw(`${alias}_${column}`)}`,\n );\n}\n\nfunction compileNodeSelectColumnsFromRecursiveRow(\n alias: string,\n requiredColumns: ReadonlySet<string> | undefined,\n alwaysRequiredColumns: ReadonlySet<string>,\n): SQL[] {\n return NODE_COLUMNS.filter((column) =>\n shouldProjectColumn(requiredColumns, column, alwaysRequiredColumns),\n ).map((column) => {\n const projected = `${alias}_${column}`;\n return sql`r.${sql.raw(projected)} AS ${sql.raw(projected)}`;\n });\n}\n\n/**\n * Compiles projection for recursive query results.\n */\nfunction compileRecursiveProjection(\n ast: QueryAst,\n traversal: VariableLengthTraversal,\n dialect: DialectAdapter,\n): SQL {\n if (ast.selectiveFields && ast.selectiveFields.length > 0) {\n return compileRecursiveSelectiveProjection(\n ast.selectiveFields,\n ast,\n traversal,\n dialect,\n );\n }\n\n const startAlias = ast.start.alias;\n const nodeAlias = traversal.nodeAlias;\n const vl = traversal.variableLength;\n\n const fields: SQL[] = [\n // Start alias fields with metadata\n sql`${sql.raw(startAlias)}_id`,\n sql`${sql.raw(startAlias)}_kind`,\n sql`${sql.raw(startAlias)}_props`,\n sql`${sql.raw(startAlias)}_version`,\n sql`${sql.raw(startAlias)}_valid_from`,\n sql`${sql.raw(startAlias)}_valid_to`,\n sql`${sql.raw(startAlias)}_created_at`,\n sql`${sql.raw(startAlias)}_updated_at`,\n sql`${sql.raw(startAlias)}_deleted_at`,\n // Node alias fields with metadata\n sql`${sql.raw(nodeAlias)}_id`,\n sql`${sql.raw(nodeAlias)}_kind`,\n sql`${sql.raw(nodeAlias)}_props`,\n sql`${sql.raw(nodeAlias)}_version`,\n sql`${sql.raw(nodeAlias)}_valid_from`,\n sql`${sql.raw(nodeAlias)}_valid_to`,\n sql`${sql.raw(nodeAlias)}_created_at`,\n sql`${sql.raw(nodeAlias)}_updated_at`,\n sql`${sql.raw(nodeAlias)}_deleted_at`,\n ];\n\n if (vl.depthAlias !== undefined) {\n fields.push(sql`depth AS ${quoteIdentifier(vl.depthAlias)}`);\n }\n\n if (vl.pathAlias !== undefined) {\n fields.push(sql`path AS ${quoteIdentifier(vl.pathAlias)}`);\n }\n\n return sql.join(fields, sql`, `);\n}\n\nfunction compileRecursiveSelectiveProjection(\n fields: readonly SelectiveField[],\n ast: QueryAst,\n traversal: VariableLengthTraversal,\n dialect: DialectAdapter,\n): SQL {\n const allowedAliases = new Set([ast.start.alias, traversal.nodeAlias]);\n\n const columns: SQL[] = fields.map((field) => {\n if (!allowedAliases.has(field.alias)) {\n throw new UnsupportedPredicateError(\n `Selective projection for recursive traversals does not support alias \"${field.alias}\"`,\n );\n }\n\n if (field.isSystemField) {\n const dbColumn = mapSelectiveSystemFieldToColumn(field.field);\n return sql`${sql.raw(`${field.alias}_${dbColumn}`)} AS ${quoteIdentifier(field.outputName)}`;\n }\n\n const column = sql.raw(`${field.alias}_props`);\n const extracted = compileTypedJsonExtract({\n column,\n dialect,\n pointer: jsonPointer([field.field]),\n valueType: field.valueType,\n });\n return sql`${extracted} AS ${quoteIdentifier(field.outputName)}`;\n });\n\n // Include recursive depth/path columns when present\n const vl = traversal.variableLength;\n if (vl.depthAlias !== undefined) {\n columns.push(sql`depth AS ${quoteIdentifier(vl.depthAlias)}`);\n }\n if (vl.pathAlias !== undefined) {\n columns.push(sql`path AS ${quoteIdentifier(vl.pathAlias)}`);\n }\n\n return sql.join(columns, sql`, `);\n}\n\n/**\n * Compiles ORDER BY for recursive query.\n */\nfunction compileRecursiveOrderBy(\n ast: QueryAst,\n dialect: DialectAdapter,\n): SQL | undefined {\n if (!ast.orderBy || ast.orderBy.length === 0) {\n return undefined;\n }\n\n const parts: SQL[] = [];\n\n for (const orderSpec of ast.orderBy) {\n const valueType = orderSpec.field.valueType;\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Ordering by JSON arrays or objects is not supported\",\n );\n }\n const field = compileFieldValue(orderSpec.field, dialect, valueType);\n const direction = sql.raw(orderSpec.direction.toUpperCase());\n const nulls =\n orderSpec.nulls ?? (orderSpec.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDirection = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n\n parts.push(\n sql`(${field} IS NULL) ${nullsDirection}`,\n sql`${field} ${direction}`,\n );\n }\n\n return sql`ORDER BY ${sql.join(parts, sql`, `)}`;\n}\n\n/**\n * Compiles LIMIT and OFFSET clauses.\n */\nfunction compileLimitOffset(ast: QueryAst): SQL | undefined {\n const parts: SQL[] = [];\n\n if (ast.limit !== undefined) {\n parts.push(sql`LIMIT ${ast.limit}`);\n }\n if (ast.offset !== undefined) {\n parts.push(sql`OFFSET ${ast.offset}`);\n }\n\n return parts.length > 0 ? sql.join(parts, sql` `) : undefined;\n}\n","/**\n * SQL Schema Configuration for Query Compilation\n *\n * Provides table and column identifiers that the query compiler uses.\n * This allows the compiler to work with custom table names instead of\n * hard-coded defaults.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { ConfigurationError } from \"../../errors\";\n\n/**\n * Table names for TypeGraph SQL schema.\n */\nexport type SqlTableNames = Readonly<{\n /** Nodes table name (default: \"typegraph_nodes\") */\n nodes: string;\n /** Edges table name (default: \"typegraph_edges\") */\n edges: string;\n /** Node embeddings table name (default: \"typegraph_node_embeddings\") */\n embeddings: string;\n}>;\n\n/**\n * SQL schema configuration for query compilation.\n * Contains table identifiers and utility methods for generating SQL references.\n */\nexport type SqlSchema = Readonly<{\n /** Table names */\n tables: SqlTableNames;\n /** Get a SQL reference to the nodes table */\n nodesTable: SQL;\n /** Get a SQL reference to the edges table */\n edgesTable: SQL;\n /** Get a SQL reference to the embeddings table */\n embeddingsTable: SQL;\n}>;\n\n/**\n * Default table names matching the standard TypeGraph schema.\n */\nconst DEFAULT_TABLE_NAMES: SqlTableNames = {\n nodes: \"typegraph_nodes\",\n edges: \"typegraph_edges\",\n embeddings: \"typegraph_node_embeddings\",\n};\n\n/**\n * Maximum identifier length.\n * PostgreSQL uses NAMEDATALEN (64) - 1 = 63 as the max identifier length.\n * SQLite has no practical limit but we use PostgreSQL's for cross-database safety.\n */\nconst MAX_IDENTIFIER_LENGTH = 63;\n\n/**\n * Regex for valid SQL identifiers.\n * Must start with a letter or underscore.\n * Can contain letters, digits, underscores, and dollar signs.\n * Dollar signs are a PostgreSQL extension but commonly supported.\n */\nconst VALID_IDENTIFIER_PATTERN = /^[a-z_][a-z0-9_$]*$/i;\n\n/**\n * Validates that a table name is a valid SQL identifier.\n *\n * @throws Error if the table name is invalid\n */\nfunction validateTableName(name: string, label: string): void {\n if (!name || name.length === 0) {\n throw new ConfigurationError(`${label} table name cannot be empty`);\n }\n if (name.length > MAX_IDENTIFIER_LENGTH) {\n throw new ConfigurationError(\n `${label} table name exceeds maximum length of ${MAX_IDENTIFIER_LENGTH} characters`,\n );\n }\n if (!VALID_IDENTIFIER_PATTERN.test(name)) {\n throw new ConfigurationError(\n `${label} table name \"${name}\" is not a valid SQL identifier. ` +\n `Table names must start with a letter or underscore and contain only letters, digits, underscores, or dollar signs.`,\n );\n }\n}\n\n/**\n * Quotes a SQL identifier using ANSI SQL standard double quotes.\n * Escapes any embedded double quotes by doubling them.\n *\n * This works for both SQLite and PostgreSQL.\n */\nfunction quoteIdentifier(name: string): string {\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n}\n\n/**\n * Creates a SqlSchema configuration from table names.\n *\n * Table names are validated to ensure they are valid SQL identifiers.\n * This prevents SQL injection and ensures compatibility across databases.\n *\n * @param names - Optional custom table names (defaults to standard names)\n * @returns SqlSchema configuration for query compilation\n * @throws Error if any table name is invalid\n *\n * @example\n * ```typescript\n * // Use default table names\n * const schema = createSqlSchema();\n *\n * // Use custom table names\n * const schema = createSqlSchema({\n * nodes: \"myapp_nodes\",\n * edges: \"myapp_edges\",\n * embeddings: \"myapp_embeddings\",\n * });\n * ```\n */\nexport function createSqlSchema(names: Partial<SqlTableNames> = {}): SqlSchema {\n const tables: SqlTableNames = { ...DEFAULT_TABLE_NAMES, ...names };\n\n // Validate all table names\n validateTableName(tables.nodes, \"nodes\");\n validateTableName(tables.edges, \"edges\");\n validateTableName(tables.embeddings, \"embeddings\");\n\n return {\n tables,\n nodesTable: sql.raw(quoteIdentifier(tables.nodes)),\n edgesTable: sql.raw(quoteIdentifier(tables.edges)),\n embeddingsTable: sql.raw(quoteIdentifier(tables.embeddings)),\n };\n}\n\n/**\n * Default SqlSchema using standard TypeGraph table names.\n */\nexport const DEFAULT_SQL_SCHEMA: SqlSchema = createSqlSchema();\n","/**\n * Set Operation Compilation\n *\n * Compiles UNION, INTERSECT, and EXCEPT operations to SQL.\n *\n * For SQLite, special handling is required because:\n * - CTEs (WITH clauses) cannot be wrapped in parentheses\n * - Compound SELECT statements can only have a single WITH clause at the start\n *\n * This module handles these requirements by:\n * - For simple queries (no traversals): Compiling without CTEs, using direct table queries\n * - For complex queries: Merging all CTEs into a single WITH clause with unique prefixes\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport {\n CompilerInvariantError,\n UnsupportedPredicateError,\n} from \"../../errors\";\nimport type { SetOperationType } from \"../ast\";\nimport {\n type ComposableQuery,\n type FieldRef,\n type ProjectedField,\n type Projection,\n type QueryAst,\n type SetOperation,\n} from \"../ast\";\nimport {\n type DialectAdapter,\n type DialectSetOperationStrategy,\n} from \"../dialect\";\nimport { type JsonPointer, jsonPointer } from \"../json-pointer\";\nimport { emitSetOperationQuerySql } from \"./emitter\";\nimport { createTemporalFilterPass, runCompilerPass } from \"./passes\";\nimport { type LogicalPlan, lowerSetOperationToLogicalPlan } from \"./plan\";\nimport {\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"./predicates\";\nimport { type SqlSchema } from \"./schema\";\nimport { compileTypedJsonExtract } from \"./typed-json-extract\";\n\n/**\n * Type for the query compiler function.\n */\nexport type QueryCompilerFunction = (ast: QueryAst, graphId: string) => SQL;\n\ntype SetOperationStrategyHandler = (\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n logicalPlan: LogicalPlan,\n schema: SqlSchema,\n compileQuery: QueryCompilerFunction,\n) => SQL;\n\n/**\n * Operator mapping for set operations.\n */\nconst OPERATOR_MAP: Record<SetOperationType, string> = {\n union: \"UNION\",\n unionAll: \"UNION ALL\",\n intersect: \"INTERSECT\",\n except: \"EXCEPT\",\n};\n\nfunction compileSetOperationWithStandardParenthesizedStrategy(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n logicalPlan: LogicalPlan,\n _schema: SqlSchema,\n compileQuery: QueryCompilerFunction,\n): SQL {\n return compileSetOperationStandard(\n op,\n graphId,\n dialect,\n logicalPlan,\n compileQuery,\n );\n}\n\nfunction compileSetOperationWithSqliteCompoundStrategy(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n logicalPlan: LogicalPlan,\n schema: SqlSchema,\n _compileQuery: QueryCompilerFunction,\n): SQL {\n return compileSetOperationForSqlite(\n op,\n graphId,\n dialect,\n logicalPlan,\n schema,\n );\n}\n\nconst SET_OPERATION_STRATEGY_HANDLERS: Record<\n DialectSetOperationStrategy,\n SetOperationStrategyHandler\n> = {\n standard_parenthesized: compileSetOperationWithStandardParenthesizedStrategy,\n sqlite_compound: compileSetOperationWithSqliteCompoundStrategy,\n};\n\ntype SetOperationPassState = Readonly<{\n dialect: DialectAdapter;\n graphId: string;\n logicalPlan: LogicalPlan | undefined;\n op: SetOperation;\n}>;\n\nfunction runSetOperationPassPipeline(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n): SetOperationPassState {\n let state: SetOperationPassState = {\n dialect,\n graphId,\n logicalPlan: undefined,\n op,\n };\n\n const logicalPlanPass = runCompilerPass(state, {\n name: \"logical_plan\",\n execute(currentState): LogicalPlan {\n return lowerSetOperationToLogicalPlan({\n dialect: currentState.dialect.name,\n graphId: currentState.graphId,\n op: currentState.op,\n });\n },\n update(currentState, logicalPlan): SetOperationPassState {\n return {\n ...currentState,\n logicalPlan,\n };\n },\n });\n state = logicalPlanPass.state;\n\n return state;\n}\n\n// ============================================================\n// Main Entry Point\n// ============================================================\n\n/**\n * Compiles a set operation to SQL.\n *\n * For SQLite, uses a special compilation strategy that avoids wrapping\n * CTEs in parentheses. For other databases, uses the standard approach.\n *\n * @param op - The set operation AST\n * @param graphId - The graph ID\n * @param dialect - The dialect adapter\n * @param schema - SQL schema configuration for table names\n * @param compileQuery - Function to compile regular queries\n * @returns SQL for the set operation\n */\nexport function compileSetOperation(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n schema: SqlSchema,\n compileQuery: QueryCompilerFunction,\n): SQL {\n const passState = runSetOperationPassPipeline(op, graphId, dialect);\n const { logicalPlan } = passState;\n if (logicalPlan === undefined) {\n throw new CompilerInvariantError(\n \"Logical plan pass did not initialize plan state\",\n );\n }\n\n const strategy = dialect.capabilities.setOperationStrategy;\n const handler = SET_OPERATION_STRATEGY_HANDLERS[strategy];\n return handler(op, graphId, dialect, logicalPlan, schema, compileQuery);\n}\n\n// ============================================================\n// Standard (PostgreSQL) Compilation\n// ============================================================\n\n/**\n * Standard set operation compilation for databases that support CTEs in parentheses.\n */\nfunction compileSetOperationStandard(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n logicalPlan: LogicalPlan,\n compileQuery: QueryCompilerFunction,\n): SQL {\n const coreSql = compileSetOperationCoreStandard(\n op,\n graphId,\n dialect,\n compileQuery,\n );\n\n const suffixClauses = buildSetOperationSuffixClauses(op, dialect);\n return emitSetOperationQuerySql({\n baseQuery: coreSql,\n logicalPlan,\n ...(suffixClauses.length === 0 ? {} : { suffixClauses }),\n });\n}\n\n/**\n * Compiles the core set operation with parentheses (standard approach).\n */\nfunction compileSetOperationCoreStandard(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n compileQuery: QueryCompilerFunction,\n): SQL {\n const left = compileComposableQueryStandard(\n op.left,\n graphId,\n dialect,\n compileQuery,\n );\n const right = compileComposableQueryStandard(\n op.right,\n graphId,\n dialect,\n compileQuery,\n );\n\n const opSql = sql.raw(OPERATOR_MAP[op.operator]);\n\n return sql`(${left}) ${opSql} (${right})`;\n}\n\n/**\n * Compiles a composable query for standard databases.\n */\nfunction compileComposableQueryStandard(\n query: ComposableQuery,\n graphId: string,\n dialect: DialectAdapter,\n compileQuery: QueryCompilerFunction,\n): SQL {\n if (\"__type\" in query) {\n return compileSetOperationCoreStandard(\n query,\n graphId,\n dialect,\n compileQuery,\n );\n }\n return compileQuery(query, graphId);\n}\n\n// ============================================================\n// SQLite Compilation\n// ============================================================\n\ntype SqliteSetOperationLeaf = Readonly<{\n ast: QueryAst;\n prefix: string;\n}>;\n\ntype SqliteSetOperationValidationPassResult = Readonly<{\n leaves: readonly SqliteSetOperationLeaf[];\n}>;\n\n/**\n * Validates and prepares SQLite set-operation leaves.\n *\n * Invariants:\n * - All leaves are flattened with stable prefixes.\n * - Every leaf passes SQLite compound-query compatibility checks.\n */\nfunction runSqliteSetOperationValidationPass(\n op: SetOperation,\n): SqliteSetOperationValidationPassResult {\n const leaves: SqliteSetOperationLeaf[] = [];\n collectLeafQueries(op, leaves, \"q\");\n\n for (const leaf of leaves) {\n validateSqliteSetOpLeaf(leaf.ast);\n }\n\n return { leaves };\n}\n\n/**\n * SQLite-specific set operation compilation.\n *\n * SQLite compound SELECT statements cannot have parentheses around\n * queries that include CTEs. This function compiles set operations\n * by merging all CTEs into a single WITH clause at the top.\n *\n * @throws Error if any leaf query contains traversals (not yet supported)\n */\nfunction compileSetOperationForSqlite(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n logicalPlan: LogicalPlan,\n schema: SqlSchema,\n): SQL {\n const { leaves } = runSqliteSetOperationValidationPass(op);\n\n // Build all CTEs with unique prefixes\n const allCtes: SQL[] = [];\n const ctx: PredicateCompilerContext = {\n dialect,\n schema,\n compileQuery: () => {\n throw new CompilerInvariantError(\n \"compileQuery is not available in set-operation CTE compilation\",\n );\n },\n };\n\n for (const leaf of leaves) {\n const cte = compilePrefixedStartCte(leaf.ast, leaf.prefix, graphId, ctx);\n allCtes.push(cte);\n }\n\n // Build SELECT statements for each leaf\n const selectStatements: SQL[] = [];\n for (const leaf of leaves) {\n const select = compilePrefixedSelect(leaf.ast, leaf.prefix, dialect);\n selectStatements.push(select);\n }\n\n // Build compound SELECT from the set operation structure\n const compoundSelect = buildCompoundSelect(op, leaves, selectStatements);\n\n const suffixClauses = buildSetOperationSuffixClauses(op, dialect);\n return emitSetOperationQuerySql({\n baseQuery: compoundSelect,\n ...(allCtes.length === 0 ? {} : { ctes: allCtes }),\n logicalPlan,\n ...(suffixClauses.length === 0 ? {} : { suffixClauses }),\n });\n}\n\n/**\n * Validates that a leaf query is compatible with SQLite set operations.\n * SQLite's compound SELECT has significant limitations compared to PostgreSQL.\n *\n * @throws Error if the query uses unsupported features\n */\nfunction validateSqliteSetOpLeaf(ast: QueryAst): void {\n const unsupported: string[] = [];\n\n // Traversals require multiple CTEs which SQLite can't handle in compound statements\n if (ast.traversals.length > 0) {\n unsupported.push(\"traversals\");\n }\n\n // Subqueries (EXISTS/IN) would need CTEs or nested queries\n if (hasSubqueryPredicates(ast)) {\n unsupported.push(\"EXISTS/IN subqueries\");\n }\n\n // Vector similarity requires the embeddings table join\n if (hasVectorSimilarityPredicates(ast)) {\n unsupported.push(\"vector similarity predicates\");\n }\n\n // GROUP BY/HAVING would need to be applied to the individual leaf, not the compound result\n if (ast.groupBy !== undefined) {\n unsupported.push(\"GROUP BY\");\n }\n if (ast.having !== undefined) {\n unsupported.push(\"HAVING\");\n }\n\n // Per-leaf ORDER BY/LIMIT/OFFSET would silently be ignored in compound statements\n // (only the outer ORDER BY/LIMIT/OFFSET apply)\n if (ast.orderBy !== undefined && ast.orderBy.length > 0) {\n unsupported.push(\n \"per-query ORDER BY (use set operation's orderBy instead)\",\n );\n }\n if (ast.limit !== undefined) {\n unsupported.push(\"per-query LIMIT (use set operation's limit instead)\");\n }\n if (ast.offset !== undefined) {\n unsupported.push(\"per-query OFFSET (use set operation's offset instead)\");\n }\n\n if (unsupported.length > 0) {\n throw new UnsupportedPredicateError(\n `SQLite set operations (UNION/INTERSECT/EXCEPT) do not support: ${unsupported.join(\", \")}. ` +\n \"Use PostgreSQL for complex set operations, or refactor to separate queries.\",\n );\n }\n}\n\n/**\n * Checks if a query AST has vector similarity predicates.\n */\nfunction hasVectorSimilarityPredicates(ast: QueryAst): boolean {\n return ast.predicates.some((predicate) =>\n hasVectorSimilarityInExpression(predicate.expression),\n );\n}\n\n/**\n * Recursively checks if a predicate expression contains vector similarity.\n */\nfunction hasVectorSimilarityInExpression(\n expr: QueryAst[\"predicates\"][0][\"expression\"],\n): boolean {\n if (\"__type\" in expr) {\n switch (expr.__type) {\n case \"and\":\n case \"or\": {\n return expr.predicates.some((p) => hasVectorSimilarityInExpression(p));\n }\n case \"not\": {\n return hasVectorSimilarityInExpression(expr.predicate);\n }\n case \"vector_similarity\": {\n return true;\n }\n case \"exists\":\n case \"in_subquery\":\n case \"comparison\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\": {\n return false;\n }\n }\n }\n return false;\n}\n\n/**\n * Checks if a query AST has predicates with subqueries (EXISTS/IN with subquery).\n */\nfunction hasSubqueryPredicates(ast: QueryAst): boolean {\n return ast.predicates.some((predicate) =>\n hasSubqueryInExpression(predicate.expression),\n );\n}\n\n/**\n * Recursively checks if a predicate expression contains subqueries.\n */\nfunction hasSubqueryInExpression(\n expr: QueryAst[\"predicates\"][0][\"expression\"],\n): boolean {\n if (\"__type\" in expr) {\n switch (expr.__type) {\n case \"and\":\n case \"or\": {\n return expr.predicates.some((p) => hasSubqueryInExpression(p));\n }\n case \"not\": {\n return hasSubqueryInExpression(expr.predicate);\n }\n case \"exists\": {\n return true; // EXISTS always has a subquery\n }\n case \"in_subquery\": {\n return true; // IN with subquery\n }\n // These expression types don't contain subqueries\n case \"comparison\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"vector_similarity\": {\n return false;\n }\n }\n }\n return false;\n}\n\n/**\n * Recursively collects all leaf QueryAst nodes from a set operation tree.\n * Assigns unique prefixes to each leaf (q0, q1, q2, etc.).\n */\nfunction collectLeafQueries(\n query: ComposableQuery,\n leaves: SqliteSetOperationLeaf[],\n basePrefix: string,\n): void {\n if (\"__type\" in query) {\n // This is a SetOperation, recurse\n collectLeafQueries(query.left, leaves, basePrefix);\n collectLeafQueries(query.right, leaves, basePrefix);\n } else {\n // This is a QueryAst leaf\n const index = leaves.length;\n leaves.push({ ast: query, prefix: `${basePrefix}${index}` });\n }\n}\n\n/**\n * Compiles a CTE for the start node selection with a unique prefix.\n */\nfunction compilePrefixedStartCte(\n ast: QueryAst,\n prefix: string,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const temporalFilterPass = createTemporalFilterPass(\n ast,\n ctx.dialect.currentTimestamp(),\n );\n const alias = ast.start.alias;\n const kinds = ast.start.kinds;\n\n // Kind filter\n const kindFilter =\n kinds.length === 1 ?\n sql`kind = ${kinds[0]}`\n : sql`kind IN (${sql.join(\n kinds.map((k) => sql`${k}`),\n sql`, `,\n )})`;\n\n // Temporal filter\n const temporalFilter = temporalFilterPass.forAlias();\n\n // Node predicates for this alias\n const cteContext: PredicateCompilerContext = { ...ctx, cteColumnPrefix: \"\" };\n const predicateClauses = ast.predicates\n .filter((p) => p.targetAlias === alias)\n .map((p) => compilePredicateExpression(p.expression, cteContext));\n\n // Combine all WHERE clauses\n const whereClauses = [\n sql`graph_id = ${graphId}`,\n kindFilter,\n temporalFilter,\n ...predicateClauses,\n ];\n\n // Use prefixed CTE name: cte_q0_c, cte_q1_c, etc.\n const cteName = `cte_${prefix}_${alias}`;\n\n return sql`\n ${sql.raw(cteName)} AS (\n SELECT\n id AS ${sql.raw(alias)}_id,\n kind AS ${sql.raw(alias)}_kind,\n props AS ${sql.raw(alias)}_props,\n version AS ${sql.raw(alias)}_version,\n valid_from AS ${sql.raw(alias)}_valid_from,\n valid_to AS ${sql.raw(alias)}_valid_to,\n created_at AS ${sql.raw(alias)}_created_at,\n updated_at AS ${sql.raw(alias)}_updated_at,\n deleted_at AS ${sql.raw(alias)}_deleted_at\n FROM ${ctx.schema.nodesTable}\n WHERE ${sql.join(whereClauses, sql` AND `)}\n )\n `;\n}\n\n/**\n * Compiles the SELECT statement for a leaf query using the prefixed CTE.\n */\nfunction compilePrefixedSelect(\n ast: QueryAst,\n prefix: string,\n dialect: DialectAdapter,\n): SQL {\n const alias = ast.start.alias;\n const cteName = `cte_${prefix}_${alias}`;\n const fields = ast.projection.fields;\n\n // Build projection\n const projection =\n fields.length === 0 ?\n sql.raw(\"*\")\n : sql.join(\n fields.map((f) => {\n const source = compileFieldValueForSetOp(\n f.source,\n prefix,\n alias,\n dialect,\n );\n return sql`${source} AS ${sql.raw(dialect.quoteIdentifier(f.outputName))}`;\n }),\n sql`, `,\n );\n\n return sql`SELECT ${projection} FROM ${sql.raw(cteName)}`;\n}\n\n/**\n * Compiles a field value reference for set operation queries.\n */\nfunction compileFieldValueForSetOp(\n source: QueryAst[\"projection\"][\"fields\"][0][\"source\"],\n prefix: string,\n alias: string,\n dialect: DialectAdapter,\n): SQL {\n if (\"__type\" in source && source.__type === \"aggregate\") {\n // Aggregate expressions\n const { field, function: fn } = source;\n\n switch (fn) {\n case \"count\":\n case \"countDistinct\":\n case \"sum\":\n case \"avg\":\n case \"min\":\n case \"max\": {\n const column = compileFieldColumnForSetOp(field, prefix, dialect);\n if (fn === \"countDistinct\") {\n return sql`COUNT(DISTINCT ${column})`;\n }\n return sql`${sql.raw(fn.toUpperCase())}(${column})`;\n }\n default: {\n throw new CompilerInvariantError(\n `Unknown aggregate function: ${String(fn)}`,\n );\n }\n }\n }\n\n // Field reference\n return compileFieldColumnForSetOp(source, prefix, dialect);\n}\n\n/**\n * Compiles a field column reference for set operation queries.\n */\nfunction compileFieldColumnForSetOp(\n field: {\n alias: string;\n path: readonly string[];\n jsonPointer?: JsonPointer | undefined;\n valueType?: string | undefined;\n },\n prefix: string,\n dialect: DialectAdapter,\n): SQL {\n const cteName = `cte_${prefix}_${field.alias}`;\n const alias = field.alias;\n\n // Handle direct column references\n if (field.path.length === 1) {\n const columnName = field.path[0];\n // Map path names to column names\n const columnMap: Record<string, string> = {\n id: \"_id\",\n kind: \"_kind\",\n props: \"_props\",\n version: \"_version\",\n valid_from: \"_valid_from\",\n valid_to: \"_valid_to\",\n created_at: \"_created_at\",\n updated_at: \"_updated_at\",\n deleted_at: \"_deleted_at\",\n };\n const suffix = columnMap[columnName!];\n if (suffix) {\n return sql.raw(`${cteName}.${alias}${suffix}`);\n }\n }\n\n // JSON field (path starts with \"props\" and has a json pointer)\n const column = sql.raw(`${cteName}.${alias}_props`);\n const pointer = field.jsonPointer;\n\n if (!pointer) {\n return column;\n }\n\n return compileTypedJsonExtract({\n column,\n dialect,\n fallback: \"text\",\n pointer,\n valueType: field.valueType,\n });\n}\n\n/**\n * Builds the compound SELECT statement from the set operation structure.\n */\nfunction buildCompoundSelect(\n op: SetOperation,\n leaves: readonly SqliteSetOperationLeaf[],\n selectStatements: readonly SQL[],\n): SQL {\n // Build a map from prefix to select statement\n const prefixToSelect = new Map<string, SQL>();\n for (const [index, leaf] of leaves.entries()) {\n prefixToSelect.set(leaf.prefix, selectStatements[index]!);\n }\n\n // Recursively build compound select\n return buildCompoundSelectRecursive(op, leaves, prefixToSelect);\n}\n\n/**\n * Recursively builds compound SELECT with proper operator placement.\n */\nfunction buildCompoundSelectRecursive(\n query: ComposableQuery,\n leaves: readonly SqliteSetOperationLeaf[],\n prefixToSelect: Map<string, SQL>,\n): SQL {\n if (!(\"__type\" in query)) {\n // This is a leaf QueryAst - find its prefix and return the SELECT\n const leaf = leaves.find((l) => l.ast === query);\n if (!leaf) {\n throw new CompilerInvariantError(\"Leaf query not found in leaves array\");\n }\n return prefixToSelect.get(leaf.prefix)!;\n }\n\n // This is a SetOperation\n const left = buildCompoundSelectRecursive(query.left, leaves, prefixToSelect);\n const right = buildCompoundSelectRecursive(\n query.right,\n leaves,\n prefixToSelect,\n );\n const opSql = sql.raw(OPERATOR_MAP[query.operator]);\n\n return sql`${left} ${opSql} ${right}`;\n}\n\n// ============================================================\n// Shared Utilities\n// ============================================================\n\n/**\n * Gets the leftmost leaf's projection from a set operation.\n * The leftmost leaf defines the output column names for the compound query.\n */\nfunction getLeftmostProjection(op: SetOperation): Projection {\n let current: ComposableQuery = op.left;\n while (\"__type\" in current) {\n // current is a SetOperation, traverse left\n current = current.left;\n }\n // current is now a QueryAst (the leftmost leaf)\n return current.projection;\n}\n\n/**\n * Normalizes a FieldRef to a canonical key for comparison.\n *\n * Handles equivalent representations:\n * - path: [\"props\", \"name\"] (no jsonPointer) → \"alias:props:/name\"\n * - path: [\"props\"], jsonPointer: \"/name\" → \"alias:props:/name\"\n *\n * This matches the normalization logic in compileFieldValue/getFieldPointer.\n */\nfunction normalizeFieldRefKey(field: FieldRef): string {\n // Derive JSON pointer from path if not explicitly set (same logic as predicates.ts getFieldPointer)\n let pointer: JsonPointer | undefined = field.jsonPointer;\n if (\n pointer === undefined &&\n field.path.length > 1 &&\n field.path[0] === \"props\"\n ) {\n pointer = jsonPointer(field.path.slice(1));\n }\n\n // Normalize base path: for JSON fields, always use [\"props\"]\n const basePath =\n field.path.length > 0 && field.path[0] === \"props\" ?\n \"props\"\n : field.path.join(\".\");\n\n return `${field.alias}:${basePath}:${pointer ?? \"\"}`;\n}\n\n/**\n * Matches a FieldRef from ORDER BY to a ProjectedField in the projection.\n * Returns the matching ProjectedField or undefined if no match.\n *\n * Uses normalized keys to handle equivalent field representations.\n */\nfunction matchFieldToProjection(\n field: FieldRef,\n projection: Projection,\n): ProjectedField | undefined {\n const targetKey = normalizeFieldRefKey(field);\n\n for (const projected of projection.fields) {\n const source = projected.source;\n\n // Only match against FieldRef sources (not aggregates)\n if (!(\"__type\" in source) || source.__type !== \"field_ref\") continue;\n\n // Compare normalized keys\n if (normalizeFieldRefKey(source) === targetKey) {\n return projected;\n }\n }\n return undefined;\n}\n\n/**\n * Builds ORDER BY, LIMIT, OFFSET clauses for set operations.\n *\n * For set operations, ORDER BY must reference output column names from\n * the compound result, not internal CTE columns. This function:\n * 1. Maps each ORDER BY field to its output name from the leftmost projection\n * 2. Uses IS NULL emulation for consistent NULLS FIRST/LAST across dialects\n * 3. Throws a descriptive error if an ORDER BY field isn't in the projection\n */\nfunction buildSetOperationSuffixClauses(\n op: SetOperation,\n dialect: DialectAdapter,\n): SQL[] {\n const clauses: SQL[] = [];\n\n // Handle ORDER BY if present\n if (op.orderBy && op.orderBy.length > 0) {\n const projection = getLeftmostProjection(op);\n\n // Check for SELECT * (empty projection) - can't order by named columns\n if (projection.fields.length === 0) {\n throw new UnsupportedPredicateError(\n \"Set operation ORDER BY requires explicit field projection. \" +\n \"SELECT * does not provide stable output column names for ordering. \" +\n \"Use .select() to specify which fields to project.\",\n );\n }\n\n const orderParts: SQL[] = [];\n\n for (const o of op.orderBy) {\n const projected = matchFieldToProjection(o.field, projection);\n\n if (!projected) {\n // Build a descriptive error message\n const fieldDesc =\n o.field.jsonPointer ?\n `${o.field.alias}.props${o.field.jsonPointer}`\n : `${o.field.alias}.${o.field.path.join(\".\")}`;\n const availableFields = projection.fields\n .map((f) => f.outputName)\n .join(\", \");\n throw new UnsupportedPredicateError(\n `Set operation ORDER BY field \"${fieldDesc}\" is not in the projection. ` +\n `ORDER BY for UNION/INTERSECT/EXCEPT must reference projected columns. ` +\n `Available columns: ${availableFields}`,\n );\n }\n\n // Use output column name with proper quoting\n const columnRef = sql.raw(dialect.quoteIdentifier(projected.outputName));\n const dir = sql.raw(o.direction.toUpperCase());\n\n // Handle nulls with IS NULL emulation for cross-dialect consistency\n // Default: ASC → NULLS LAST, DESC → NULLS FIRST\n const nulls = o.nulls ?? (o.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDir = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n\n // Emulate NULLS FIRST/LAST: (col IS NULL) ASC/DESC, col DIR\n orderParts.push(\n sql`(${columnRef} IS NULL) ${nullsDir}`,\n sql`${columnRef} ${dir}`,\n );\n }\n\n clauses.push(sql`ORDER BY ${sql.join(orderParts, sql`, `)}`);\n }\n\n // Handle LIMIT\n if (op.limit !== undefined) {\n clauses.push(sql`LIMIT ${op.limit}`);\n }\n\n // Handle OFFSET\n if (op.offset !== undefined) {\n clauses.push(sql`OFFSET ${op.offset}`);\n }\n\n return clauses;\n}\n","import type {\n PredicateExpression,\n QueryAst,\n VectorSimilarityPredicate,\n} from \"../ast\";\nimport { type DialectAdapter } from \"../dialect\";\nimport {\n createTemporalFilterPass,\n resolveVectorAwareLimit,\n runCompilerPass,\n runVectorPredicatePass,\n type TemporalFilterPass,\n} from \"./passes\";\nimport { type LogicalPlan, lowerStandardQueryToLogicalPlan } from \"./plan\";\nimport {\n buildPredicateIndex,\n getPredicatesForAlias,\n type PredicateIndex,\n} from \"./predicate-utils\";\nimport { type PredicateCompilerContext } from \"./predicates\";\nimport {\n addRequiredColumn,\n isIdFieldRef,\n markFieldRefAsRequired,\n markSelectiveFieldAsRequired,\n type RequiredColumnsByAlias,\n} from \"./utils\";\n\n/**\n * Heuristics for pushing LIMIT into traversal CTEs to cap intermediate row counts.\n * - 8x multiplier accounts for edge fan-out (each node may connect to multiple edges).\n * - 10K cap prevents runaway memory allocation for large intermediate result sets.\n */\nconst TRAVERSAL_LIMIT_PUSHDOWN_MULTIPLIER = 8;\nconst TRAVERSAL_LIMIT_PUSHDOWN_MAX = 10_000;\n\nfunction isColumnPruningEnabled(ast: QueryAst): boolean {\n if (ast.selectiveFields && ast.selectiveFields.length > 0) {\n return true;\n }\n if (ast.groupBy || ast.having) {\n return true;\n }\n return ast.projection.fields.some(\n (field) => field.source.__type === \"aggregate\",\n );\n}\n\nfunction markPredicateFieldsAsRequired(\n requiredColumnsByAlias: Map<string, Set<string>>,\n expression: PredicateExpression,\n): void {\n switch (expression.__type) {\n case \"comparison\": {\n markFieldRefAsRequired(requiredColumnsByAlias, expression.left);\n return;\n }\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\": {\n markFieldRefAsRequired(requiredColumnsByAlias, expression.field);\n return;\n }\n case \"and\":\n case \"or\": {\n for (const predicate of expression.predicates) {\n markPredicateFieldsAsRequired(requiredColumnsByAlias, predicate);\n }\n return;\n }\n case \"not\": {\n markPredicateFieldsAsRequired(\n requiredColumnsByAlias,\n expression.predicate,\n );\n return;\n }\n case \"aggregate_comparison\": {\n markFieldRefAsRequired(\n requiredColumnsByAlias,\n expression.aggregate.field,\n );\n return;\n }\n case \"in_subquery\": {\n markFieldRefAsRequired(requiredColumnsByAlias, expression.field);\n return;\n }\n case \"vector_similarity\": {\n markFieldRefAsRequired(requiredColumnsByAlias, expression.field);\n return;\n }\n case \"exists\": {\n return;\n }\n }\n}\n\nfunction collectRequiredColumnsByAlias(ast: QueryAst): RequiredColumnsByAlias {\n const requiredColumnsByAlias = new Map<string, Set<string>>();\n\n addRequiredColumn(requiredColumnsByAlias, ast.start.alias, \"id\");\n for (const traversal of ast.traversals) {\n addRequiredColumn(requiredColumnsByAlias, traversal.nodeAlias, \"id\");\n }\n\n if (ast.selectiveFields && ast.selectiveFields.length > 0) {\n for (const field of ast.selectiveFields) {\n markSelectiveFieldAsRequired(requiredColumnsByAlias, field);\n }\n } else {\n for (const projectedField of ast.projection.fields) {\n const source = projectedField.source;\n if (source.__type === \"field_ref\") {\n markFieldRefAsRequired(requiredColumnsByAlias, source);\n } else {\n addRequiredColumn(requiredColumnsByAlias, source.field.alias, \"id\");\n markFieldRefAsRequired(requiredColumnsByAlias, source.field);\n }\n }\n }\n\n if (ast.groupBy) {\n for (const field of ast.groupBy.fields) {\n markFieldRefAsRequired(requiredColumnsByAlias, field);\n }\n }\n\n if (ast.orderBy) {\n for (const orderSpec of ast.orderBy) {\n markFieldRefAsRequired(requiredColumnsByAlias, orderSpec.field);\n }\n }\n\n if (ast.having) {\n markPredicateFieldsAsRequired(requiredColumnsByAlias, ast.having);\n }\n\n for (const predicate of ast.predicates) {\n markPredicateFieldsAsRequired(requiredColumnsByAlias, predicate.expression);\n }\n\n return requiredColumnsByAlias;\n}\n\nfunction hasIdEqualityPredicate(\n expression: PredicateExpression,\n alias: string,\n): boolean {\n switch (expression.__type) {\n case \"comparison\": {\n return (\n expression.op === \"eq\" &&\n expression.left.alias === alias &&\n isIdFieldRef(expression.left)\n );\n }\n case \"and\": {\n return expression.predicates.some((predicate) =>\n hasIdEqualityPredicate(predicate, alias),\n );\n }\n case \"or\":\n case \"not\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"exists\":\n case \"in_subquery\":\n case \"vector_similarity\": {\n return false;\n }\n }\n}\n\nfunction isStartAliasBoundToSingleId(\n ast: QueryAst,\n predicateIndex: PredicateIndex,\n): boolean {\n return getPredicatesForAlias(predicateIndex, ast.start.alias, \"node\").some(\n (predicate) =>\n hasIdEqualityPredicate(predicate.expression, ast.start.alias),\n );\n}\n\nfunction resolveTraversalCteLimit(\n ast: QueryAst,\n predicateIndex: PredicateIndex,\n): number | undefined {\n if (ast.limit === undefined) {\n return undefined;\n }\n\n if (ast.offset !== undefined) {\n return undefined;\n }\n\n if (ast.limit <= 0) {\n return 0;\n }\n\n if (ast.groupBy || ast.having) {\n return undefined;\n }\n\n if (ast.orderBy && ast.orderBy.length > 0) {\n return undefined;\n }\n\n if (ast.traversals.length < 2) {\n return undefined;\n }\n\n if (ast.traversals.some((traversal) => traversal.optional)) {\n return undefined;\n }\n\n if (!isStartAliasBoundToSingleId(ast, predicateIndex)) {\n return undefined;\n }\n\n const pushdownLimit = Math.min(\n ast.limit * TRAVERSAL_LIMIT_PUSHDOWN_MULTIPLIER,\n TRAVERSAL_LIMIT_PUSHDOWN_MAX,\n );\n\n return Math.max(ast.limit, pushdownLimit);\n}\n\nfunction canCollapseSelectiveTraversalRowset(\n ast: QueryAst,\n vectorPredicate: VectorSimilarityPredicate | undefined,\n): boolean {\n if (vectorPredicate !== undefined) {\n return false;\n }\n\n if (ast.traversals.length === 0) {\n return false;\n }\n\n if (ast.traversals.some((traversal) => traversal.optional)) {\n return false;\n }\n\n let expectedJoinFromAlias = ast.start.alias;\n for (const traversal of ast.traversals) {\n if (traversal.joinFromAlias !== expectedJoinFromAlias) {\n return false;\n }\n expectedJoinFromAlias = traversal.nodeAlias;\n }\n\n if (!ast.selectiveFields || ast.selectiveFields.length === 0) {\n return false;\n }\n\n if (ast.groupBy || ast.having) {\n return false;\n }\n\n if (\n ast.projection.fields.some((field) => field.source.__type === \"aggregate\")\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function shouldMaterializeTraversalCte(\n dialect: DialectAdapter,\n traversalCount: number,\n traversalIndex: number,\n): boolean {\n if (!dialect.capabilities.materializeIntermediateTraversalCtes) {\n return false;\n }\n\n if (traversalCount <= 1) {\n return false;\n }\n\n return traversalIndex < traversalCount - 1;\n}\n\ntype StandardQueryPassState = Readonly<{\n ast: QueryAst;\n collapsedTraversalCteAlias: string | undefined;\n ctx: PredicateCompilerContext;\n effectiveLimit: number | undefined;\n logicalPlan: LogicalPlan | undefined;\n predicateIndex: PredicateIndex;\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined;\n shouldCollapseSelectiveTraversalRowset: boolean;\n temporalFilterPass: TemporalFilterPass | undefined;\n traversalCteLimit: number | undefined;\n vectorPredicate: VectorSimilarityPredicate | undefined;\n}>;\n\nexport function runStandardQueryPassPipeline(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): StandardQueryPassState {\n let state: StandardQueryPassState = {\n ast,\n collapsedTraversalCteAlias: undefined,\n ctx,\n effectiveLimit: undefined,\n logicalPlan: undefined,\n predicateIndex: buildPredicateIndex(ast),\n requiredColumnsByAlias: undefined,\n shouldCollapseSelectiveTraversalRowset: false,\n temporalFilterPass: undefined,\n traversalCteLimit: undefined,\n vectorPredicate: undefined,\n };\n\n const vectorPass = runCompilerPass(state, {\n name: \"vector_predicate\",\n execute(currentState): VectorSimilarityPredicate | undefined {\n return runVectorPredicatePass(currentState.ast, currentState.ctx.dialect)\n .vectorPredicate;\n },\n update(currentState, vectorPredicate): StandardQueryPassState {\n return {\n ...currentState,\n vectorPredicate,\n };\n },\n });\n state = vectorPass.state;\n\n const temporalPass = runCompilerPass(state, {\n name: \"temporal_filters\",\n execute(currentState): TemporalFilterPass {\n return createTemporalFilterPass(\n currentState.ast,\n currentState.ctx.dialect.currentTimestamp(),\n );\n },\n update(currentState, temporalFilterPass): StandardQueryPassState {\n return {\n ...currentState,\n temporalFilterPass,\n };\n },\n });\n state = temporalPass.state;\n\n const columnPruningPass = runCompilerPass(state, {\n name: \"column_pruning\",\n execute(currentState): RequiredColumnsByAlias | undefined {\n return isColumnPruningEnabled(currentState.ast) ?\n collectRequiredColumnsByAlias(currentState.ast)\n : undefined;\n },\n update(currentState, requiredColumnsByAlias): StandardQueryPassState {\n return {\n ...currentState,\n requiredColumnsByAlias,\n };\n },\n });\n state = columnPruningPass.state;\n\n const selectiveTraversalRowsetPass = runCompilerPass(state, {\n name: \"selective_traversal_rowset\",\n execute(currentState): Readonly<{\n collapsedTraversalCteAlias: string | undefined;\n shouldCollapseSelectiveTraversalRowset: boolean;\n }> {\n const shouldCollapseSelectiveTraversalRowset =\n canCollapseSelectiveTraversalRowset(\n currentState.ast,\n currentState.vectorPredicate,\n );\n const lastTraversal = currentState.ast.traversals.at(-1);\n const collapsedTraversalCteAlias =\n shouldCollapseSelectiveTraversalRowset && lastTraversal !== undefined ?\n `cte_${lastTraversal.nodeAlias}`\n : undefined;\n\n return {\n collapsedTraversalCteAlias,\n shouldCollapseSelectiveTraversalRowset,\n };\n },\n update(\n currentState,\n { collapsedTraversalCteAlias, shouldCollapseSelectiveTraversalRowset },\n ): StandardQueryPassState {\n return {\n ...currentState,\n collapsedTraversalCteAlias,\n shouldCollapseSelectiveTraversalRowset,\n };\n },\n });\n state = selectiveTraversalRowsetPass.state;\n\n const traversalLimitPass = runCompilerPass(state, {\n name: \"traversal_limit\",\n execute(currentState): number | undefined {\n return resolveTraversalCteLimit(\n currentState.ast,\n currentState.predicateIndex,\n );\n },\n update(currentState, traversalCteLimit): StandardQueryPassState {\n return {\n ...currentState,\n traversalCteLimit,\n };\n },\n });\n state = traversalLimitPass.state;\n\n // Compute effectiveLimit once — used by both logical plan lowering and SQL LIMIT/OFFSET.\n state = {\n ...state,\n effectiveLimit: resolveVectorAwareLimit(\n state.ast.limit,\n state.vectorPredicate,\n ),\n };\n\n const logicalPlanPass = runCompilerPass(state, {\n name: \"logical_plan\",\n execute(currentState): LogicalPlan {\n const loweringInput = {\n ast: currentState.ast,\n dialect: currentState.ctx.dialect.name,\n graphId,\n };\n\n return lowerStandardQueryToLogicalPlan({\n ...loweringInput,\n ...(currentState.collapsedTraversalCteAlias === undefined ?\n {}\n : {\n collapsedTraversalCteAlias: currentState.collapsedTraversalCteAlias,\n }),\n ...(currentState.effectiveLimit === undefined ?\n {}\n : { effectiveLimit: currentState.effectiveLimit }),\n ...(currentState.vectorPredicate === undefined ?\n {}\n : { vectorPredicate: currentState.vectorPredicate }),\n });\n },\n update(currentState, logicalPlan): StandardQueryPassState {\n return {\n ...currentState,\n logicalPlan,\n };\n },\n });\n state = logicalPlanPass.state;\n\n return state;\n}\n","/**\n * Query Compiler Module\n *\n * Main entry point for compiling query ASTs to SQL.\n * Re-exports individual compiler modules and provides the main compile functions.\n */\n\n// Re-export sub-modules\nexport {\n type LogicalPlan,\n type LogicalPlanNode,\n lowerRecursiveQueryToLogicalPlan,\n lowerSetOperationToLogicalPlan,\n lowerStandardQueryToLogicalPlan,\n} from \"./plan\";\nexport {\n compileAggregateExpr,\n compileFieldColumn,\n compileFieldValue,\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"./predicates\";\nexport {\n compileVariableLengthQuery,\n hasVariableLengthTraversal,\n MAX_EXPLICIT_RECURSIVE_DEPTH,\n MAX_RECURSIVE_DEPTH,\n} from \"./recursive\";\nexport {\n createSqlSchema,\n DEFAULT_SQL_SCHEMA,\n type SqlSchema,\n type SqlTableNames,\n} from \"./schema\";\nexport {\n compileTemporalFilter,\n extractTemporalOptions,\n type TemporalFilterOptions,\n} from \"./temporal\";\n\n// Re-export dialect types\nexport { type DialectAdapter, getDialect, type SqlDialect } from \"../dialect\";\n\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { CompilerInvariantError } from \"../../errors\";\nimport { type QueryAst, type SetOperation } from \"../ast\";\nimport {\n type DialectStandardQueryStrategy,\n getDialect,\n type SqlDialect,\n} from \"../dialect\";\nimport { emitStandardQuerySql } from \"./emitter\";\nimport {\n buildLimitOffsetClause,\n buildStandardEmbeddingsCte,\n buildStandardFromClause,\n buildStandardGroupBy,\n buildStandardHaving,\n buildStandardOrderBy,\n buildStandardProjection,\n buildStandardStartCte,\n buildStandardTraversalCte,\n buildStandardVectorOrderBy,\n} from \"./emitter\";\nimport { type TemporalFilterPass } from \"./passes\";\nimport { type LogicalPlan } from \"./plan\";\nimport {\n compileKindFilter,\n compilePredicateClauses,\n getNodeKindsForAlias,\n getPredicatesForAlias,\n type PredicateIndex,\n} from \"./predicate-utils\";\nimport { compileFieldValue, type PredicateCompilerContext } from \"./predicates\";\nimport {\n compileVariableLengthQuery,\n hasVariableLengthTraversal,\n} from \"./recursive\";\nimport { DEFAULT_SQL_SCHEMA, type SqlSchema } from \"./schema\";\nimport { compileSetOperation as compileSetOp } from \"./set-operations\";\nimport {\n runStandardQueryPassPipeline,\n shouldMaterializeTraversalCte,\n} from \"./standard-pass-pipeline\";\nimport {\n isAggregateExpr,\n isIdFieldRef,\n quoteIdentifier,\n type RequiredColumnsByAlias,\n} from \"./utils\";\n\n// ============================================================\n// Main Query Compiler\n// ============================================================\n\n/**\n * Options for query compilation.\n */\nexport type CompileQueryOptions = Readonly<{\n /** SQL dialect (\"sqlite\" or \"postgres\"). Defaults to \"sqlite\". */\n dialect?: SqlDialect | undefined;\n /** SQL schema configuration for table names. Defaults to standard names. */\n schema?: SqlSchema | undefined;\n}>;\n\n/**\n * Compiles a query AST to SQL.\n *\n * This is the main entry point for query compilation. It dispatches to\n * the appropriate compiler based on the query type (standard, recursive,\n * or set operation).\n *\n * @param ast - The query AST to compile\n * @param graphId - The graph ID for filtering\n * @param options - Compilation options (dialect, schema)\n * @returns Drizzle SQL object ready for execution\n *\n * @example\n * ```typescript\n * const ast = query.toAst();\n * const sql = compileQuery(ast, \"my_graph\", { dialect: \"postgres\" });\n * const results = await db.execute(sql);\n * ```\n *\n * @example\n * ```typescript\n * // With custom table names\n * const schema = createSqlSchema({ nodes: \"myapp_nodes\", edges: \"myapp_edges\" });\n * const sql = compileQuery(ast, \"my_graph\", { dialect: \"postgres\", schema });\n * ```\n */\nexport function compileQuery(\n ast: QueryAst,\n graphId: string,\n options: CompileQueryOptions | SqlDialect = \"sqlite\",\n): SQL {\n // Support legacy signature: compileQuery(ast, graphId, dialect)\n const options_: CompileQueryOptions =\n typeof options === \"string\" ? { dialect: options } : options;\n const dialect = options_.dialect ?? \"sqlite\";\n const schema = options_.schema ?? DEFAULT_SQL_SCHEMA;\n\n const adapter = getDialect(dialect);\n const ctx: PredicateCompilerContext = {\n dialect: adapter,\n schema,\n compileQuery: (subAst, subGraphId) =>\n compileQuery(subAst, subGraphId, { dialect, schema }),\n };\n\n // Check for variable-length traversals\n if (hasVariableLengthTraversal(ast)) {\n const lowered = tryLowerSingleHopRecursiveTraversal(ast);\n if (lowered !== undefined) {\n return compileStandardQuery(lowered, graphId, ctx);\n }\n return compileVariableLengthQuery(ast, graphId, ctx);\n }\n\n // Standard query compilation\n return compileStandardQuery(ast, graphId, ctx);\n}\n\nfunction tryLowerSingleHopRecursiveTraversal(\n ast: QueryAst,\n): QueryAst | undefined {\n if (ast.traversals.length !== 1) {\n return undefined;\n }\n\n const traversal = ast.traversals[0]!;\n const variableLength = traversal.variableLength;\n if (!variableLength) {\n return undefined;\n }\n\n if (variableLength.minDepth !== 1 || variableLength.maxDepth !== 1) {\n return undefined;\n }\n if (\n variableLength.pathAlias !== undefined ||\n variableLength.depthAlias !== undefined\n ) {\n return undefined;\n }\n\n const { variableLength: _vl, ...nonRecursiveTraversal } = traversal;\n\n return {\n ...ast,\n traversals: [nonRecursiveTraversal],\n };\n}\n\n/**\n * Compiles a set operation (UNION/INTERSECT/EXCEPT) to SQL.\n *\n * @param op - The set operation AST\n * @param graphId - The graph ID for filtering\n * @param options - Compilation options (dialect, schema)\n * @returns Drizzle SQL object\n */\nexport function compileSetOperation(\n op: SetOperation,\n graphId: string,\n options: CompileQueryOptions | SqlDialect = \"sqlite\",\n): SQL {\n // Support legacy signature: compileSetOperation(op, graphId, dialect)\n const options_: CompileQueryOptions =\n typeof options === \"string\" ? { dialect: options } : options;\n const dialect = options_.dialect ?? \"sqlite\";\n const schema = options_.schema ?? DEFAULT_SQL_SCHEMA;\n\n const adapter = getDialect(dialect);\n return compileSetOp(op, graphId, adapter, schema, (ast, gid) =>\n compileQuery(ast, gid, { dialect, schema }),\n );\n}\n\n// ============================================================\n// Standard Query Compilation\n// ============================================================\n\ntype CountAggregateFastPathPlan = Readonly<{\n traversal: QueryAst[\"traversals\"][number];\n requiresCount: boolean;\n requiresCountDistinct: boolean;\n}>;\n\nfunction resolveCountAggregateFastPath(\n ast: QueryAst,\n): CountAggregateFastPathPlan | undefined {\n if (ast.traversals.length !== 1) {\n return undefined;\n }\n\n if (ast.groupBy?.fields.length !== 1) {\n return undefined;\n }\n\n if (ast.having !== undefined) {\n return undefined;\n }\n\n if (\n ast.orderBy?.some((orderSpec) => orderSpec.field.alias !== ast.start.alias)\n ) {\n return undefined;\n }\n\n const traversal = ast.traversals[0]!;\n if ((traversal.inverseEdgeKinds?.length ?? 0) > 0) {\n return undefined;\n }\n\n const groupField = ast.groupBy.fields[0]!;\n if (groupField.alias !== ast.start.alias || !isIdFieldRef(groupField)) {\n return undefined;\n }\n\n let requiresCount = false;\n let requiresCountDistinct = false;\n\n for (const projectedField of ast.projection.fields) {\n const source = projectedField.source;\n\n if (!isAggregateExpr(source)) {\n if (source.alias !== ast.start.alias) {\n return undefined;\n }\n continue;\n }\n\n if (\n source.field.alias !== traversal.nodeAlias ||\n !isIdFieldRef(source.field)\n ) {\n return undefined;\n }\n\n if (source.function === \"count\") {\n requiresCount = true;\n continue;\n }\n\n if (source.function === \"countDistinct\") {\n requiresCountDistinct = true;\n continue;\n }\n\n return undefined;\n }\n\n if (!requiresCount && !requiresCountDistinct) {\n return undefined;\n }\n\n return {\n traversal,\n requiresCount,\n requiresCountDistinct,\n };\n}\n\nfunction compileCountAggregateFastPath(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n logicalPlan: LogicalPlan,\n requiredColumnsByAlias: RequiredColumnsByAlias | undefined,\n predicateIndex: PredicateIndex,\n temporalFilterPass: TemporalFilterPass,\n): SQL | undefined {\n const plan = resolveCountAggregateFastPath(ast);\n if (!plan) {\n return undefined;\n }\n\n const { traversal, requiresCount, requiresCountDistinct } = plan;\n const { dialect } = ctx;\n const startAlias = ast.start.alias;\n const previousAlias = traversal.joinFromAlias;\n const previousAliasIdColumn = `${previousAlias}_id`;\n const previousAliasKindColumn = `${previousAlias}_kind`;\n const countCteAlias = `cte_${traversal.nodeAlias}_counts`;\n const countColumn = `${traversal.nodeAlias}_count`;\n const countDistinctColumn = `${traversal.nodeAlias}_count_distinct`;\n\n const previousNodeKinds = getNodeKindsForAlias(ast, traversal.joinFromAlias);\n const edgeKinds = [...new Set(traversal.edgeKinds)];\n const nodeKinds = traversal.nodeKinds;\n\n const edgeTemporalFilter = temporalFilterPass.forAlias(\"e\");\n const nodeTemporalFilter = temporalFilterPass.forAlias(\"n\");\n\n const nodePredicateContext: PredicateCompilerContext = {\n ...ctx,\n cteColumnPrefix: \"n\",\n };\n const nodePredicateClauses = compilePredicateClauses(\n getPredicatesForAlias(predicateIndex, traversal.nodeAlias, \"node\"),\n nodePredicateContext,\n );\n\n const edgePredicateContext: PredicateCompilerContext = {\n ...ctx,\n cteColumnPrefix: \"e\",\n };\n const edgePredicateClauses = compilePredicateClauses(\n getPredicatesForAlias(predicateIndex, traversal.edgeAlias, \"edge\"),\n edgePredicateContext,\n );\n\n const joinField = traversal.direction === \"out\" ? \"from_id\" : \"to_id\";\n const targetField = traversal.direction === \"out\" ? \"to_id\" : \"from_id\";\n const joinKindField = traversal.direction === \"out\" ? \"from_kind\" : \"to_kind\";\n const targetKindField =\n traversal.direction === \"out\" ? \"to_kind\" : \"from_kind\";\n\n const whereClauses = [\n sql`e.graph_id = ${graphId}`,\n compileKindFilter(sql.raw(\"e.kind\"), edgeKinds),\n compileKindFilter(sql.raw(`e.${joinKindField}`), previousNodeKinds),\n compileKindFilter(sql.raw(`e.${targetKindField}`), nodeKinds),\n compileKindFilter(sql.raw(\"n.kind\"), nodeKinds),\n edgeTemporalFilter,\n nodeTemporalFilter,\n ...nodePredicateClauses,\n ...edgePredicateClauses,\n ];\n\n const aggregateColumns: SQL[] = [];\n if (requiresCount) {\n aggregateColumns.push(sql`COUNT(n.id) AS ${sql.raw(countColumn)}`);\n }\n if (requiresCountDistinct) {\n aggregateColumns.push(\n sql`COUNT(DISTINCT n.id) AS ${sql.raw(countDistinctColumn)}`,\n );\n }\n\n const startCte = buildStandardStartCte({\n ast,\n ctx,\n graphId,\n predicateIndex,\n requiredColumnsByAlias,\n temporalFilterPass,\n });\n const countCte = sql`\n ${sql.raw(countCteAlias)} AS (\n SELECT\n cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasIdColumn)} AS ${sql.raw(previousAliasIdColumn)},\n cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)} AS ${sql.raw(previousAliasKindColumn)},\n ${sql.join(aggregateColumns, sql`, `)}\n FROM cte_${sql.raw(previousAlias)}\n JOIN ${ctx.schema.edgesTable} e ON cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasIdColumn)} = e.${sql.raw(joinField)}\n AND cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)} = e.${sql.raw(joinKindField)}\n JOIN ${ctx.schema.nodesTable} n ON n.graph_id = e.graph_id\n AND n.id = e.${sql.raw(targetField)}\n AND n.kind = e.${sql.raw(targetKindField)}\n WHERE ${sql.join(whereClauses, sql` AND `)}\n GROUP BY\n cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasIdColumn)},\n cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)}\n )\n `;\n\n const projection = sql.join(\n ast.projection.fields.map((projectedField) => {\n const source = projectedField.source;\n\n if (!isAggregateExpr(source)) {\n const value = compileFieldValue(\n source,\n dialect,\n source.valueType,\n `cte_${source.alias}`,\n );\n return sql`${value} AS ${quoteIdentifier(projectedField.outputName)}`;\n }\n\n const projectedCountColumn =\n source.function === \"countDistinct\" ? countDistinctColumn : countColumn;\n const countValue = sql`${sql.raw(countCteAlias)}.${sql.raw(projectedCountColumn)}`;\n const aggregateValue =\n traversal.optional ? sql`COALESCE(${countValue}, 0)` : countValue;\n\n return sql`${aggregateValue} AS ${quoteIdentifier(projectedField.outputName)}`;\n }),\n sql`, `,\n );\n\n const joinType = traversal.optional ? \"LEFT JOIN\" : \"INNER JOIN\";\n const fromClause = sql`\n FROM cte_${sql.raw(startAlias)}\n ${sql.raw(joinType)} ${sql.raw(countCteAlias)}\n ON ${sql.raw(countCteAlias)}.${sql.raw(previousAliasIdColumn)} = cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasIdColumn)}\n AND ${sql.raw(countCteAlias)}.${sql.raw(previousAliasKindColumn)} = cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)}\n `;\n\n const orderBy = buildStandardOrderBy({ ast, dialect });\n const limitOffset = buildLimitOffsetClause({\n limit: ast.limit,\n offset: ast.offset,\n });\n\n return emitStandardQuerySql({\n ctes: [startCte, countCte],\n fromClause,\n ...(orderBy === undefined ? {} : { orderBy }),\n ...(limitOffset === undefined ? {} : { limitOffset }),\n logicalPlan,\n projection,\n });\n}\n\n/**\n * Compiles a standard (non-recursive) query to SQL using CTEs.\n */\ntype StandardQueryStrategyHandler = (\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n) => SQL;\n\nconst STANDARD_QUERY_STRATEGY_HANDLERS: Record<\n DialectStandardQueryStrategy,\n StandardQueryStrategyHandler\n> = {\n cte_project: compileStandardQueryWithCteStrategy,\n};\n\nfunction compileStandardQuery(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const strategy = ctx.dialect.capabilities.standardQueryStrategy;\n const handler = STANDARD_QUERY_STRATEGY_HANDLERS[strategy];\n return handler(ast, graphId, ctx);\n}\n\nfunction compileStandardQueryWithCteStrategy(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const { dialect } = ctx;\n const {\n collapsedTraversalCteAlias,\n effectiveLimit,\n logicalPlan,\n predicateIndex,\n requiredColumnsByAlias,\n shouldCollapseSelectiveTraversalRowset,\n temporalFilterPass,\n traversalCteLimit,\n vectorPredicate,\n } = runStandardQueryPassPipeline(ast, graphId, ctx);\n\n if (temporalFilterPass === undefined) {\n throw new CompilerInvariantError(\n \"Temporal filter pass did not initialize temporal state\",\n { phase: \"standard-pass-pipeline\" },\n );\n }\n if (logicalPlan === undefined) {\n throw new CompilerInvariantError(\n \"Logical plan pass did not initialize plan state\",\n { phase: \"standard-pass-pipeline\" },\n );\n }\n\n if (!vectorPredicate) {\n const fastPathSql = compileCountAggregateFastPath(\n ast,\n graphId,\n ctx,\n logicalPlan,\n requiredColumnsByAlias,\n predicateIndex,\n temporalFilterPass,\n );\n if (fastPathSql) {\n return fastPathSql;\n }\n }\n\n // Build CTEs\n const ctes: SQL[] = [\n buildStandardStartCte({\n ast,\n ctx,\n graphId,\n predicateIndex,\n requiredColumnsByAlias,\n temporalFilterPass,\n }),\n ];\n\n // Traversal CTEs\n for (let index = 0; index < ast.traversals.length; index++) {\n const materializeTraversalCte = shouldMaterializeTraversalCte(\n dialect,\n ast.traversals.length,\n index,\n );\n ctes.push(\n buildStandardTraversalCte({\n ast,\n carryForwardPreviousColumns: shouldCollapseSelectiveTraversalRowset,\n ctx,\n graphId,\n materializeCte: materializeTraversalCte,\n predicateIndex,\n requiredColumnsByAlias,\n temporalFilterPass,\n traversalIndex: index,\n traversalLimit: traversalCteLimit,\n }),\n );\n }\n\n // Add embeddings CTE if vector similarity is used\n if (vectorPredicate) {\n ctes.push(buildStandardEmbeddingsCte({ ctx, graphId, vectorPredicate }));\n }\n\n // Build main SELECT\n const projection = buildStandardProjection({\n ast,\n ...(collapsedTraversalCteAlias === undefined ?\n {}\n : { collapsedTraversalCteAlias }),\n dialect,\n });\n const fromClause = buildStandardFromClause({\n ast,\n ...(collapsedTraversalCteAlias === undefined ?\n {}\n : { collapsedTraversalCteAlias }),\n ...(vectorPredicate === undefined ? {} : { vectorPredicate }),\n });\n const groupBy = buildStandardGroupBy({ ast, dialect });\n const having = buildStandardHaving({ ast, ctx });\n\n // Order by distance if vector similarity, otherwise use AST order\n const orderBy =\n vectorPredicate ?\n buildStandardVectorOrderBy({ ast, dialect })\n : buildStandardOrderBy({\n ast,\n ...(collapsedTraversalCteAlias === undefined ?\n {}\n : { collapsedTraversalCteAlias }),\n dialect,\n });\n\n const limitOffset = buildLimitOffsetClause({\n limit: effectiveLimit,\n offset: ast.offset,\n });\n\n return emitStandardQuerySql({\n ctes,\n fromClause,\n ...(groupBy === undefined ? {} : { groupBy }),\n ...(having === undefined ? {} : { having }),\n ...(orderBy === undefined ? {} : { orderBy }),\n ...(limitOffset === undefined ? {} : { limitOffset }),\n logicalPlan,\n projection,\n });\n}\n","/**\n * Cursor encoding/decoding for keyset pagination.\n *\n * Cursors are opaque URL-safe base64-encoded JSON containing:\n * - Column values at cursor position\n * - Direction indicator\n * - Version for forward compatibility\n */\n\nimport { ValidationError } from \"../errors\";\nimport { type OrderSpec } from \"./ast\";\nimport { parseJsonPointer } from \"./json-pointer\";\n\n// ============================================================\n// Types\n// ============================================================\n\nconst CURSOR_VERSION = 1;\n\n/**\n * Internal cursor data structure.\n */\nexport type CursorData = Readonly<{\n /** Version for forward compatibility */\n v: number;\n /** Direction: 'f' = forward, 'b' = backward */\n d: \"f\" | \"b\";\n /** ORDER BY column values at cursor position */\n vals: readonly unknown[];\n /** Column identifiers for validation */\n cols: readonly string[];\n}>;\n\n// ============================================================\n// Encoding / Decoding\n// ============================================================\n\n/**\n * Encodes cursor data to a URL-safe base64 string.\n */\nexport function encodeCursor(data: CursorData): string {\n const json = JSON.stringify(data);\n // Use URL-safe base64: replace + with -, / with _, remove padding\n return btoa(json)\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/, \"\");\n}\n\n/**\n * Decodes a cursor string to cursor data.\n *\n * @throws ValidationError if cursor is invalid or incompatible\n */\nexport function decodeCursor(cursor: string): CursorData {\n try {\n // Restore standard base64\n let base64 = cursor.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n // Add padding if needed\n while (base64.length % 4) {\n base64 += \"=\";\n }\n const json = atob(base64);\n const raw = JSON.parse(json) as Record<string, unknown>;\n\n if (typeof raw.v !== \"number\" || raw.v > CURSOR_VERSION) {\n throw new ValidationError(\n `Unsupported cursor version: ${String(raw.v)}. Maximum supported: ${CURSOR_VERSION}`,\n {\n issues: [\n {\n path: \"cursor\",\n message: `Cursor version ${String(raw.v)} is not supported`,\n },\n ],\n },\n {\n suggestion: `This cursor was created with a newer version. Re-fetch the data to get a compatible cursor.`,\n },\n );\n }\n\n if (raw.d !== \"f\" && raw.d !== \"b\") {\n throw new ValidationError(`Invalid cursor direction: ${String(raw.d)}`, {\n issues: [\n {\n path: \"cursor\",\n message: `Direction must be \"f\" (forward) or \"b\" (backward)`,\n },\n ],\n });\n }\n\n if (!Array.isArray(raw.vals) || !Array.isArray(raw.cols)) {\n throw new ValidationError(\"Invalid cursor structure\", {\n issues: [\n {\n path: \"cursor\",\n message: \"Cursor must contain vals and cols arrays\",\n },\n ],\n });\n }\n\n if (raw.vals.length !== raw.cols.length) {\n throw new ValidationError(\"Cursor column count mismatch\", {\n issues: [\n {\n path: \"cursor\",\n message: `vals (${raw.vals.length}) and cols (${raw.cols.length}) must have same length`,\n },\n ],\n });\n }\n\n return {\n v: raw.v,\n d: raw.d,\n vals: raw.vals as readonly unknown[],\n cols: raw.cols as readonly string[],\n };\n } catch (error) {\n if (error instanceof ValidationError) {\n throw error;\n }\n throw new ValidationError(\n \"Invalid cursor format\",\n {\n issues: [{ path: \"cursor\", message: \"Failed to decode cursor\" }],\n },\n { cause: error },\n );\n }\n}\n\n// ============================================================\n// Cursor Building\n// ============================================================\n\n/**\n * Builds a column identifier from an order spec.\n *\n * Format: \"alias.fieldName\" for property fields, \"alias.path[0]...\" for system fields.\n * Handles two field ref formats:\n * 1. New format: path=[\"props\"], jsonPointer=\"/name\"\n * 2. Legacy format: path=[\"props\", \"name\"]\n *\n * In both cases, outputs flattened format \"p.name\" to match the flattened API.\n */\nexport function buildColumnId(spec: OrderSpec): string {\n const { alias, path, jsonPointer } = spec.field;\n\n // New format: path=[\"props\"] with jsonPointer=\"/fieldName\"\n // jsonPointer is a branded string like \"/name\" or \"/nested/field\"\n if (path.length === 1 && path[0] === \"props\" && jsonPointer) {\n const parts = (jsonPointer as string).split(\"/\").filter(Boolean);\n return `${alias}.${parts.join(\".\")}`;\n }\n\n // Legacy format: path=[\"props\", \"fieldName\", ...] without jsonPointer\n if (path.length >= 2 && path[0] === \"props\") {\n return `${alias}.${path.slice(1).join(\".\")}`;\n }\n\n // System fields (id, kind) or other paths\n return `${alias}.${path.join(\".\")}`;\n}\n\n/**\n * Extracts the value for a cursor column from a result row.\n *\n * The row can be in two formats:\n * 1. Raw database row with flat column names\n * 2. Mapped result with alias-keyed nested data\n *\n * For mapped results, we navigate through the path and then jsonPointer.\n */\nexport function extractCursorValue(\n row: Record<string, unknown>,\n spec: OrderSpec,\n): unknown {\n const { alias, path, jsonPointer } = spec.field;\n\n // Try alias-keyed format first (mapped results)\n let current: unknown = row[alias];\n if (current !== undefined) {\n // Follow path first (e.g., [\"props\"])\n for (const segment of path) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n\n const record = current as Record<string, unknown>;\n if (segment === \"props\" && !Object.hasOwn(record, segment)) {\n continue;\n }\n\n current = record[segment];\n }\n\n // Then follow jsonPointer if present (e.g., \"/name\")\n if (jsonPointer) {\n const segments = parseJsonPointer(jsonPointer);\n for (const segment of segments) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n }\n\n return current;\n }\n\n // Fallback: try direct path lookup for raw rows\n current = row;\n for (const segment of path) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\n/**\n * Builds a cursor from a result row and order specifications.\n *\n * @param row - The result row (mapped with alias-keyed data)\n * @param orderSpecs - The ORDER BY specifications\n * @param direction - Pagination direction\n * @returns Encoded cursor string\n */\nexport function buildCursorFromRow(\n row: Record<string, unknown>,\n orderSpecs: readonly OrderSpec[],\n direction: \"f\" | \"b\",\n): string {\n const vals = orderSpecs.map((spec) => extractCursorValue(row, spec));\n const cols = orderSpecs.map((spec) => buildColumnId(spec));\n\n return encodeCursor({\n v: CURSOR_VERSION,\n d: direction,\n vals,\n cols,\n });\n}\n\n/**\n * Validates that cursor columns match the query's ORDER BY columns.\n *\n * @throws ValidationError if columns don't match\n */\nexport function validateCursorColumns(\n cursorData: CursorData,\n orderSpecs: readonly OrderSpec[],\n): void {\n const expectedCols = orderSpecs.map((spec) => buildColumnId(spec));\n\n if (cursorData.cols.length !== expectedCols.length) {\n throw new ValidationError(\n `Cursor has ${cursorData.cols.length} columns but query has ${expectedCols.length} ORDER BY columns`,\n {\n issues: [\n {\n path: \"cursor\",\n message: `Column count mismatch: cursor has ${cursorData.cols.length}, query has ${expectedCols.length}`,\n },\n ],\n },\n {\n suggestion: `The cursor was created with a different ORDER BY. Re-fetch with consistent ordering.`,\n },\n );\n }\n\n for (const [index, expectedCol] of expectedCols.entries()) {\n if (cursorData.cols[index] !== expectedCol) {\n throw new ValidationError(\n `Cursor column mismatch at position ${index}: expected \"${expectedCol}\", got \"${cursorData.cols[index]}\"`,\n {\n issues: [\n {\n path: \"cursor\",\n message: `Column ${index}: expected \"${expectedCol}\", got \"${cursorData.cols[index]}\"`,\n },\n ],\n },\n {\n suggestion: `The cursor was created with a different ORDER BY. Re-fetch with consistent ordering.`,\n },\n );\n }\n }\n}\n","import { nanoid } from \"nanoid\";\n\n/**\n * ID generation utilities.\n *\n * Default implementation uses nanoid.\n * Benefits:\n * - URL-safe\n * - Compact (21 characters by default)\n * - Secure random generation\n */\n\n/**\n * Generates a new unique ID.\n */\nexport function generateId(): string {\n return nanoid();\n}\n\n/**\n * ID generator function type.\n */\nexport type IdGenerator = () => string;\n\n/**\n * Default ID generator configuration.\n */\nexport type IdConfig = Readonly<{\n /** Generator for node IDs */\n nodeIdGenerator: IdGenerator;\n /** Generator for edge IDs */\n edgeIdGenerator: IdGenerator;\n}>;\n","/**\n * Path utilities for variable-length traversal results.\n *\n * SQLite doesn't support native arrays, so paths are stored as pipe-delimited\n * strings: \"|id1|id2|id3|\". PostgreSQL returns native arrays.\n */\n\n/**\n * Parses a SQLite path string into an array of node IDs.\n *\n * @param path - Pipe-delimited path string like \"|id1|id2|id3|\"\n * @returns Array of node IDs like [\"id1\", \"id2\", \"id3\"]\n *\n * @example\n * parseSqlitePath(\"|abc|def|ghi|\") // [\"abc\", \"def\", \"ghi\"]\n * parseSqlitePath(\"|single|\") // [\"single\"]\n * parseSqlitePath(\"||\") // []\n */\nexport function parseSqlitePath(path: string): readonly string[] {\n if (!path || path === \"||\") return [];\n\n // Remove leading and trailing pipes, then split\n const trimmed = path.slice(1, -1);\n if (trimmed === \"\") return [];\n\n return trimmed.split(\"|\");\n}\n\n/**\n * Type guard to check if a value is a SQLite path string.\n * SQLite paths start and end with \"|\".\n */\nexport function isSqlitePath(value: unknown): value is string {\n return (\n typeof value === \"string\" && value.startsWith(\"|\") && value.endsWith(\"|\")\n );\n}\n\n/**\n * Normalizes a path value to an array.\n * - If already an array (PostgreSQL native), returns as-is\n * - If a SQLite path string (|id1|id2|), parses it\n * - If a PostgreSQL text array ({id1,id2}), parses it\n * - Otherwise returns empty array\n */\nexport function normalizePath(value: unknown): readonly string[] {\n if (Array.isArray(value)) {\n return value as string[];\n }\n if (isSqlitePath(value)) {\n return parseSqlitePath(value);\n }\n if (isPostgresTextArray(value)) {\n return parsePostgresTextArray(value);\n }\n return [];\n}\n\n/**\n * Type guard for PostgreSQL text array format: {id1,id2,id3}\n */\nfunction isPostgresTextArray(value: unknown): value is string {\n return (\n typeof value === \"string\" && value.startsWith(\"{\") && value.endsWith(\"}\")\n );\n}\n\n/**\n * Parses a PostgreSQL text array string into an array of strings.\n * Input format: {id1,id2,id3} or {} for empty.\n */\nfunction parsePostgresTextArray(value: string): readonly string[] {\n const inner = value.slice(1, -1);\n if (inner === \"\") return [];\n return inner.split(\",\");\n}\n","/**\n * Result mapping utilities for query execution.\n *\n * Transforms raw database rows into typed SelectContext and result objects.\n */\nimport { type NodeType } from \"../../core/types\";\nimport { normalizePath } from \"../../utils\";\nimport { type Traversal } from \"../ast\";\nimport type {\n AliasMap,\n EdgeAliasMap,\n QueryBuilderState,\n RecursiveAliasMap,\n SelectableEdge,\n SelectableNode,\n SelectContext,\n} from \"../builder/types\";\nimport { type SqlDialect } from \"../compiler/index\";\n\n/**\n * Transforms SQLite path columns from pipe-delimited strings to arrays.\n * PostgreSQL returns native arrays, so no transformation needed.\n */\nexport function transformPathColumns(\n rows: readonly Record<string, unknown>[],\n state: QueryBuilderState,\n _dialect: SqlDialect,\n): readonly Record<string, unknown>[] {\n // Find path columns from variable-length traversals\n const pathAliases: string[] = [];\n for (const t of state.traversals) {\n if (t.variableLength?.pathAlias !== undefined) {\n pathAliases.push(t.variableLength.pathAlias);\n }\n }\n\n if (pathAliases.length === 0) return rows;\n\n const result: Record<string, unknown>[] = [];\n let changed = false;\n for (const row of rows) {\n let transformed: Record<string, unknown> | undefined;\n for (const alias of pathAliases) {\n const value = row[alias];\n if (value !== undefined && !Array.isArray(value)) {\n transformed ??= { ...row };\n transformed[alias] = normalizePath(value);\n }\n }\n if (transformed === undefined) {\n result.push(row);\n } else {\n changed = true;\n result.push(transformed);\n }\n }\n // Preserve reference identity when no rows were transformed\n return changed ? result : rows;\n}\n\n// Reserved keys that cannot be overwritten by user props\nconst RESERVED_NODE_KEYS = new Set([\"id\", \"kind\", \"meta\"]);\nconst RESERVED_EDGE_KEYS = new Set([\"id\", \"kind\", \"fromId\", \"toId\", \"meta\"]);\n\n/**\n * Converts null to undefined for consistent typing.\n * Database backends return null for missing values, but our types use undefined.\n */\nfunction nullToUndefined<T>(value: T | null | undefined): T | undefined {\n return value === null ? undefined : value;\n}\n\n/**\n * Assigns props to a target object, excluding reserved keys to prevent runtime\n * collisions with system fields (id, kind, meta, etc).\n */\nfunction assignPropsExcludingReserved(\n target: Record<string, unknown>,\n props: Record<string, unknown>,\n reservedKeys: Set<string>,\n): void {\n for (const [key, value] of Object.entries(props)) {\n if (!reservedKeys.has(key)) {\n target[key] = value;\n }\n }\n}\n\n/**\n * Builds a SelectableNode from row data for a given alias.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys (id, kind, meta) in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n */\nexport function buildSelectableNode(\n row: Record<string, unknown>,\n alias: string,\n): SelectableNode<NodeType> {\n const id = row[`${alias}_id`] as string;\n const kind = row[`${alias}_kind`] as string;\n const propsRaw: unknown = row[`${alias}_props`];\n const rawProps: Record<string, unknown> =\n typeof propsRaw === \"string\" ?\n (JSON.parse(propsRaw) as Record<string, unknown>)\n : ((propsRaw as Record<string, unknown> | undefined) ?? {});\n\n // Metadata columns - these are now always projected in CTEs\n // Normalize null → undefined for optional fields\n const version = row[`${alias}_version`] as number;\n const validFrom = nullToUndefined(\n row[`${alias}_valid_from`] as string | null,\n );\n const validTo = nullToUndefined(row[`${alias}_valid_to`] as string | null);\n const createdAt = row[`${alias}_created_at`] as string;\n const updatedAt = row[`${alias}_updated_at`] as string;\n const deletedAt = nullToUndefined(\n row[`${alias}_deleted_at`] as string | null,\n );\n\n const result: Record<string, unknown> = {\n id,\n kind,\n meta: {\n version,\n validFrom,\n validTo,\n createdAt,\n updatedAt,\n deletedAt,\n },\n };\n\n assignPropsExcludingReserved(result, rawProps, RESERVED_NODE_KEYS);\n return result as SelectableNode<NodeType>;\n}\n\n/**\n * Builds a SelectableNode from row data, returning undefined when the node\n * doesn't exist (for optional traversals with LEFT JOIN).\n */\nfunction buildSelectableNodeOrUndefined(\n row: Record<string, unknown>,\n alias: string,\n): SelectableNode<NodeType> | undefined {\n const id = row[`${alias}_id`] as string | null | undefined;\n if (id === null || id === undefined) {\n return undefined;\n }\n return buildSelectableNode(row, alias);\n}\n\n/**\n * Builds a SelectableEdge from row data for a given edge alias.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys (id, kind, fromId, toId, meta) in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n * Returns undefined if the edge doesn't exist (for optional traversals with LEFT JOIN).\n */\nfunction buildSelectableEdge(\n row: Record<string, unknown>,\n alias: string,\n): SelectableEdge | undefined {\n const id = row[`${alias}_id`] as string | null | undefined;\n\n // For optional traversals, edge may be null (LEFT JOIN)\n if (id === null || id === undefined) {\n return undefined;\n }\n\n const kind = row[`${alias}_kind`] as string;\n const fromId = row[`${alias}_from_id`] as string;\n const toId = row[`${alias}_to_id`] as string;\n\n const propsRaw: unknown = row[`${alias}_props`];\n const rawProps: Record<string, unknown> =\n typeof propsRaw === \"string\" ?\n (JSON.parse(propsRaw) as Record<string, unknown>)\n : ((propsRaw as Record<string, unknown> | undefined) ?? {});\n\n // Metadata columns - these are always projected in traversal CTEs\n // Normalize null → undefined for optional fields\n const validFrom = nullToUndefined(\n row[`${alias}_valid_from`] as string | null,\n );\n const validTo = nullToUndefined(row[`${alias}_valid_to`] as string | null);\n const createdAt = row[`${alias}_created_at`] as string;\n const updatedAt = row[`${alias}_updated_at`] as string;\n const deletedAt = nullToUndefined(\n row[`${alias}_deleted_at`] as string | null,\n );\n\n const result: Record<string, unknown> = {\n id,\n kind,\n fromId,\n toId,\n meta: {\n validFrom,\n validTo,\n createdAt,\n updatedAt,\n deletedAt,\n },\n };\n\n assignPropsExcludingReserved(result, rawProps, RESERVED_EDGE_KEYS);\n return result as SelectableEdge;\n}\n\n/**\n * Builds a SelectContext from a raw database row.\n * Includes node aliases, edge aliases, and recursive metadata (depth/path).\n */\nexport function buildSelectContext<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty when no recursive aliases\n RecursiveAliases extends RecursiveAliasMap = {},\n>(\n row: Record<string, unknown>,\n startAlias: string,\n traversals: readonly Traversal[],\n): SelectContext<Aliases, EdgeAliases, RecursiveAliases> {\n // Build the start node as initial context entry\n const context: Record<\n string,\n | SelectableNode<NodeType>\n | SelectableEdge\n | number\n | readonly string[]\n | undefined\n > = {\n [startAlias]: buildSelectableNode(row, startAlias),\n };\n\n // Build traversal nodes and edges\n for (const traversal of traversals) {\n const nodeAlias = traversal.nodeAlias;\n const edgeAlias = traversal.edgeAlias;\n\n // Add node\n context[nodeAlias] =\n traversal.optional ?\n buildSelectableNodeOrUndefined(row, nodeAlias)\n : buildSelectableNode(row, nodeAlias);\n\n // Add edge (may be undefined for optional traversals)\n context[edgeAlias] = buildSelectableEdge(row, edgeAlias);\n\n // Add recursive depth/path values\n const vl = traversal.variableLength;\n if (vl !== undefined) {\n if (vl.depthAlias !== undefined) {\n context[vl.depthAlias] = row[vl.depthAlias] as number;\n }\n if (vl.pathAlias !== undefined) {\n context[vl.pathAlias] = row[vl.pathAlias] as readonly string[];\n }\n }\n }\n\n return context as SelectContext<Aliases, EdgeAliases, RecursiveAliases>;\n}\n\n/**\n * Maps raw database rows to typed results using a select function.\n */\nexport function mapResults<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n R,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty when no recursive aliases\n RA extends RecursiveAliasMap = {},\n>(\n rows: readonly Record<string, unknown>[],\n startAlias: string,\n traversals: readonly Traversal[],\n selectFunction: (context: SelectContext<Aliases, EdgeAliases, RA>) => R,\n): readonly R[] {\n return rows.map((row) => {\n const context = buildSelectContext<Aliases, EdgeAliases, RA>(\n row,\n startAlias,\n traversals,\n );\n return selectFunction(context);\n });\n}\n","/**\n * Cursor-based pagination utilities.\n *\n * Provides pagination logic for ExecutableQuery including cursor predicate\n * building and result page construction.\n */\nimport {\n type FieldRef,\n type NodePredicate,\n type OrderSpec,\n type PredicateExpression,\n} from \"../ast\";\nimport type {\n AliasMap,\n EdgeAliasMap,\n PaginatedResult,\n PaginateOptions,\n SelectContext,\n StreamOptions,\n} from \"../builder/types\";\nimport {\n buildCursorFromRow,\n type CursorData,\n decodeCursor,\n validateCursorColumns,\n} from \"../cursor\";\n\n/**\n * Parses pagination options into internal format.\n */\nexport function parsePaginateOptions(options: PaginateOptions): {\n isBackward: boolean;\n limit: number;\n cursor: string | undefined;\n cursorData: CursorData | undefined;\n orderBy: readonly OrderSpec[];\n} {\n const isBackward = options.last !== undefined || options.before !== undefined;\n const limit = options.first ?? options.last ?? 20;\n const cursor = options.after ?? options.before;\n\n let cursorData: CursorData | undefined;\n if (cursor) {\n cursorData = decodeCursor(cursor);\n }\n\n return { isBackward, limit, cursor, cursorData, orderBy: [] };\n}\n\n/**\n * Validates cursor data against ORDER BY columns.\n */\nexport function validateCursor(\n cursorData: CursorData | undefined,\n orderBy: readonly OrderSpec[],\n): void {\n if (cursorData) {\n validateCursorColumns(cursorData, orderBy);\n }\n}\n\n/**\n * Adjusts ORDER BY for backward pagination (reverses directions).\n */\nexport function adjustOrderByForDirection(\n orderBy: readonly OrderSpec[],\n direction: \"forward\" | \"backward\",\n): readonly OrderSpec[] {\n if (direction === \"forward\") {\n return orderBy;\n }\n return orderBy.map((spec) => ({\n ...spec,\n direction: spec.direction === \"asc\" ? (\"desc\" as const) : (\"asc\" as const),\n }));\n}\n\n/**\n * Builds a cursor predicate for keyset pagination.\n * Generates (col1 > val1) OR (col1 = val1 AND col2 > val2) OR ... pattern.\n */\nexport function buildCursorPredicate(\n cursorData: CursorData,\n orderBy: readonly OrderSpec[],\n direction: \"forward\" | \"backward\",\n targetAlias: string,\n): NodePredicate {\n const values = cursorData.vals;\n\n // Build OR of progressively longer AND conditions\n const orConditions: PredicateExpression[] = [];\n\n for (let index = 0; index < orderBy.length; index++) {\n const andConditions: PredicateExpression[] = [];\n\n // All preceding columns must be equal\n for (let index_ = 0; index_ < index; index_++) {\n const spec = orderBy[index_]!;\n const value = values[index_];\n andConditions.push(buildEqualityPredicate(spec.field, value));\n }\n\n // Current column uses comparison\n const currentSpec = orderBy[index]!;\n const currentValue = values[index];\n const isAsc = currentSpec.direction === \"asc\";\n const isForward = direction === \"forward\";\n // ASC + forward = gt | ASC + backward = lt\n // DESC + forward = lt | DESC + backward = gt\n const op = isAsc === isForward ? \"gt\" : \"lt\";\n\n andConditions.push(\n buildComparisonPredicate(currentSpec.field, op, currentValue),\n );\n\n // Combine with AND\n if (andConditions.length === 1) {\n orConditions.push(andConditions[0]!);\n } else {\n orConditions.push({ __type: \"and\", predicates: andConditions });\n }\n }\n\n // Combine with OR\n const expression: PredicateExpression =\n orConditions.length === 1 ?\n orConditions[0]!\n : { __type: \"or\", predicates: orConditions };\n\n return {\n targetAlias,\n expression,\n };\n}\n\n/**\n * Builds an equality predicate for cursor pagination.\n */\nfunction buildEqualityPredicate(\n field: FieldRef,\n value: unknown,\n): PredicateExpression {\n if (value === null || value === undefined) {\n return { __type: \"null_check\", op: \"isNull\", field };\n }\n return {\n __type: \"comparison\",\n op: \"eq\",\n left: field,\n right: { __type: \"literal\", value: value as string | number | boolean },\n };\n}\n\n/**\n * Builds a comparison predicate for cursor pagination.\n */\nfunction buildComparisonPredicate(\n field: FieldRef,\n op: \"gt\" | \"lt\",\n value: unknown,\n): PredicateExpression {\n if (value === null || value === undefined) {\n // For null, the comparison depends on NULLS FIRST/LAST behavior\n // For simplicity, treat as IS NOT NULL for forward, fail for backward\n return { __type: \"null_check\", op: \"isNotNull\", field };\n }\n return {\n __type: \"comparison\",\n op,\n left: field,\n right: { __type: \"literal\", value: value as string | number | boolean },\n };\n}\n\n/**\n * Builds cursor string from a context row.\n */\nexport function buildCursorFromContext<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n>(\n context: SelectContext<Aliases, EdgeAliases>,\n orderBy: readonly OrderSpec[],\n direction: \"f\" | \"b\",\n): string {\n return buildCursorFromRow(\n context as unknown as Record<string, unknown>,\n orderBy,\n direction,\n );\n}\n\n/**\n * Constructs a PaginatedResult from query results.\n */\nexport function buildPaginatedResult<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n R,\n>(\n data: readonly R[],\n orderedRows: readonly Record<string, unknown>[],\n orderBy: readonly OrderSpec[],\n limit: number,\n hasMore: boolean,\n isBackward: boolean,\n cursor: string | undefined,\n buildContext: (\n row: Record<string, unknown>,\n ) => SelectContext<Aliases, EdgeAliases>,\n): PaginatedResult<R> {\n let nextCursor: string | undefined;\n let previousCursor: string | undefined;\n\n if (orderedRows.length > 0) {\n const firstRow = orderedRows[0]!;\n const lastRow = orderedRows.at(-1)!;\n\n // Build cursors using mapped result context\n const firstContext = buildContext(firstRow);\n const lastContext = buildContext(lastRow);\n\n // Extract values for ORDER BY columns from the context\n previousCursor = buildCursorFromContext(firstContext, orderBy, \"b\");\n nextCursor = buildCursorFromContext(lastContext, orderBy, \"f\");\n }\n\n return {\n data,\n nextCursor: hasMore || isBackward ? nextCursor : undefined,\n prevCursor:\n cursor !== undefined || (isBackward && hasMore) ?\n previousCursor\n : undefined,\n hasNextPage: isBackward ? cursor !== undefined : hasMore,\n hasPrevPage: isBackward ? hasMore : cursor !== undefined,\n };\n}\n\n/**\n * Creates an async iterable that streams results using cursor pagination.\n */\nexport async function* createStreamIterable<R>(\n batchSize: number,\n paginate: (options: PaginateOptions) => Promise<PaginatedResult<R>>,\n): AsyncGenerator<R> {\n let cursor: string | undefined;\n let hasMore = true;\n\n while (hasMore) {\n const options: PaginateOptions =\n cursor ? { first: batchSize, after: cursor } : { first: batchSize };\n const page = await paginate(options);\n\n for (const item of page.data) {\n yield item;\n }\n\n cursor = page.nextCursor;\n hasMore = page.hasNextPage;\n }\n}\n\n/**\n * Gets default stream options.\n */\nexport function getStreamBatchSize(options?: StreamOptions): number {\n return options?.batchSize ?? 1000;\n}\n","/**\n * Query AST types.\n *\n * Defines the abstract syntax tree for TypeGraph queries.\n * This portable representation can be compiled to SQL (today)\n * or other query languages (Cypher, SPARQL) in the future.\n */\nimport { type TemporalMode } from \"../core/types\";\nimport { type JsonPointer } from \"./json-pointer\";\n\n// ============================================================\n// Predicate Expressions\n// ============================================================\n\n/**\n * A field reference in a predicate.\n */\nexport type FieldRef = Readonly<{\n __type: \"field_ref\";\n alias: string;\n path: readonly string[]; // [\"props\", \"name\"] or [\"id\"]\n jsonPointer?: JsonPointer | undefined; // JSON Pointer into props\n valueType?: ValueType | undefined;\n elementType?: ValueType | undefined;\n}>;\n\n/**\n * A literal value in a predicate.\n */\nexport type LiteralValue = Readonly<{\n __type: \"literal\";\n value: string | number | boolean;\n valueType?: ValueType | undefined;\n}>;\n\n/**\n * A parameter reference for prepared queries.\n *\n * Used in place of a literal value to create parameterized queries\n * that can be executed multiple times with different bindings.\n */\nexport type ParameterRef = Readonly<{\n __type: \"parameter\";\n name: string;\n valueType?: ValueType | undefined;\n}>;\n\n/**\n * Supported value types for predicates.\n */\nexport type ValueType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"array\"\n | \"object\"\n | \"embedding\"\n | \"unknown\";\n\n/**\n * Comparison operators.\n */\nexport type ComparisonOp =\n | \"eq\"\n | \"neq\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\"\n | \"in\"\n | \"notIn\";\n\n/**\n * String operators.\n */\nexport type StringOp =\n | \"contains\"\n | \"startsWith\"\n | \"endsWith\"\n | \"like\"\n | \"ilike\";\n\n/**\n * A comparison predicate.\n */\nexport type ComparisonPredicate = Readonly<{\n __type: \"comparison\";\n op: ComparisonOp;\n left: FieldRef;\n right: LiteralValue | LiteralValue[] | ParameterRef;\n}>;\n\n/**\n * A string predicate.\n */\nexport type StringPredicate = Readonly<{\n __type: \"string_op\";\n op: StringOp;\n field: FieldRef;\n pattern: string | ParameterRef;\n}>;\n\n/**\n * A null check predicate.\n */\nexport type NullPredicate = Readonly<{\n __type: \"null_check\";\n op: \"isNull\" | \"isNotNull\";\n field: FieldRef;\n}>;\n\n/**\n * A between predicate.\n */\nexport type BetweenPredicate = Readonly<{\n __type: \"between\";\n field: FieldRef;\n lower: LiteralValue | ParameterRef;\n upper: LiteralValue | ParameterRef;\n}>;\n\n// ============================================================\n// Array Predicates\n// ============================================================\n\n/**\n * Array operators.\n */\nexport type ArrayOp =\n | \"contains\" // Array contains a single value\n | \"containsAll\" // Array contains all specified values\n | \"containsAny\" // Array contains any of the specified values (overlaps)\n | \"isEmpty\" // Array is empty\n | \"isNotEmpty\" // Array is not empty\n | \"lengthEq\" // Array length equals\n | \"lengthGt\" // Array length greater than\n | \"lengthGte\" // Array length greater than or equal\n | \"lengthLt\" // Array length less than\n | \"lengthLte\"; // Array length less than or equal\n\n/**\n * An array predicate.\n */\nexport type ArrayPredicate = Readonly<{\n __type: \"array_op\";\n op: ArrayOp;\n field: FieldRef;\n values?: readonly LiteralValue[]; // For contains/containsAll/containsAny\n length?: number; // For length comparisons\n}>;\n\n// ============================================================\n// Object/JSON Predicates\n// ============================================================\n\n/**\n * Object operators.\n */\nexport type ObjectOp =\n | \"hasKey\" // Object has a specific key at root level\n | \"hasPath\" // Object has a nested path\n | \"pathEquals\" // Value at path equals\n | \"pathContains\" // Value at path contains (for nested arrays)\n | \"pathIsNull\" // Value at path is null\n | \"pathIsNotNull\"; // Value at path is not null\n\n/**\n * An object/JSON predicate.\n */\nexport type ObjectPredicate = Readonly<{\n __type: \"object_op\";\n op: ObjectOp;\n field: FieldRef;\n pointer: JsonPointer; // Relative JSON Pointer\n value?: LiteralValue; // For pathEquals, pathContains\n valueType?: ValueType;\n elementType?: ValueType;\n}>;\n\n/**\n * Logical AND predicate.\n */\ntype AndPredicate = Readonly<{\n __type: \"and\";\n predicates: readonly PredicateExpression[];\n}>;\n\n/**\n * Logical OR predicate.\n */\ntype OrPredicate = Readonly<{\n __type: \"or\";\n predicates: readonly PredicateExpression[];\n}>;\n\n/**\n * Logical NOT predicate.\n */\ntype NotPredicate = Readonly<{\n __type: \"not\";\n predicate: PredicateExpression;\n}>;\n\n/**\n * An aggregate comparison predicate (for HAVING clauses).\n */\nexport type AggregateComparisonPredicate = Readonly<{\n __type: \"aggregate_comparison\";\n op: ComparisonOp;\n aggregate: AggregateExpr;\n value: LiteralValue;\n}>;\n\n// ============================================================\n// Subquery Predicates\n// ============================================================\n\n/**\n * An EXISTS subquery predicate.\n * Tests whether the subquery returns any rows.\n */\nexport type ExistsSubquery = Readonly<{\n __type: \"exists\";\n subquery: QueryAst;\n negated: boolean; // for NOT EXISTS\n}>;\n\n/**\n * An IN subquery predicate.\n * Tests whether a field value is in the subquery results.\n */\nexport type InSubquery = Readonly<{\n __type: \"in_subquery\";\n field: FieldRef;\n subquery: QueryAst;\n negated: boolean; // for NOT IN\n}>;\n\n// ============================================================\n// Vector Predicates\n// ============================================================\n\n/**\n * Vector similarity metric types.\n */\nexport type VectorMetricType = \"cosine\" | \"l2\" | \"inner_product\";\n\n/**\n * A vector similarity predicate.\n * Finds nodes with embeddings similar to the query embedding.\n *\n * This predicate affects query execution by:\n * - Joining with the embeddings table\n * - Adding ORDER BY distance (ascending)\n * - Applying LIMIT (top k results)\n * - Optionally filtering by minimum score\n */\nexport type VectorSimilarityPredicate = Readonly<{\n __type: \"vector_similarity\";\n /** The embedding field reference */\n field: FieldRef;\n /** The query embedding to compare against */\n queryEmbedding: readonly number[];\n /** Similarity metric to use */\n metric: VectorMetricType;\n /** Maximum number of results to return */\n limit: number;\n /** Optional minimum similarity score (0-1 for cosine) */\n minScore?: number;\n}>;\n\n/**\n * All predicate expression types.\n */\nexport type PredicateExpression =\n | ComparisonPredicate\n | StringPredicate\n | NullPredicate\n | BetweenPredicate\n | ArrayPredicate\n | ObjectPredicate\n | AndPredicate\n | OrPredicate\n | NotPredicate\n | AggregateComparisonPredicate\n | ExistsSubquery\n | InSubquery\n | VectorSimilarityPredicate;\n\n// ============================================================\n// Query Start\n// ============================================================\n\n/**\n * The starting point of a query (the FROM clause).\n */\nexport type QueryStart = Readonly<{\n alias: string;\n kinds: readonly string[]; // Expanded via ontology if includeSubClasses\n includeSubClasses: boolean;\n}>;\n\n// ============================================================\n// Traversals\n// ============================================================\n\n/**\n * Direction of edge traversal.\n */\nexport type TraversalDirection = \"out\" | \"in\";\n\n/**\n * Traversal ontology expansion behavior.\n *\n * - `\"none\"` — follow only the exact edge kind specified\n * - `\"implying\"` — also follow edge kinds that imply the specified kind (subClassOf)\n * - `\"inverse\"` — also follow the ontological inverse edge kind (inverseOf)\n * - `\"all\"` — follow both implying and inverse expansions\n */\nexport type TraversalExpansion = \"none\" | \"implying\" | \"inverse\" | \"all\";\n\n/**\n * Cycle handling policy for recursive traversals.\n */\nexport type RecursiveCyclePolicy = \"prevent\" | \"allow\";\n\n/**\n * Variable-length traversal specification for recursive graph traversals.\n */\nexport type VariableLengthSpec = Readonly<{\n /** Minimum number of hops before including results (default: 1) */\n minDepth: number;\n /** Maximum number of hops (-1 = unlimited, default: -1) */\n maxDepth: number;\n /**\n * Cycle handling mode.\n *\n * - \"prevent\": Track visited nodes per path and reject revisits\n * - \"allow\": Skip cycle checks (faster, may revisit nodes)\n */\n cyclePolicy: RecursiveCyclePolicy;\n /** Optional column alias for projected traversal path array */\n pathAlias?: string;\n /** Optional column alias for projected traversal depth */\n depthAlias?: string;\n}>;\n\n/**\n * A traversal step in the query.\n */\nexport type Traversal = Readonly<{\n edgeAlias: string;\n edgeKinds: readonly string[]; // Expanded via ontology based on traversal expand mode\n /**\n * Edge kinds traversed in the opposite direction.\n *\n * Populated when query options request inverse/symmetric expansion.\n */\n inverseEdgeKinds?: readonly string[];\n direction: TraversalDirection;\n nodeAlias: string;\n nodeKinds: readonly string[];\n joinFromAlias: string;\n joinEdgeField: \"from_id\" | \"to_id\";\n /** If true, use LEFT JOIN instead of INNER JOIN (optional match) */\n optional: boolean;\n /** Variable-length traversal configuration (for recursive CTEs) */\n variableLength?: VariableLengthSpec;\n}>;\n\n/**\n * Returns the full set of edge kind names for a traversal, merging\n * forward and inverse kinds with deduplication.\n */\nexport function mergeEdgeKinds(traversal: Traversal): readonly string[] {\n const inverse = traversal.inverseEdgeKinds;\n if (inverse === undefined || inverse.length === 0) return traversal.edgeKinds;\n\n return [\n ...traversal.edgeKinds,\n ...inverse.filter((kind) => !traversal.edgeKinds.includes(kind)),\n ];\n}\n\n// ============================================================\n// Aggregations\n// ============================================================\n\n/**\n * Supported aggregate functions.\n */\nexport type AggregateFunction =\n | \"count\"\n | \"countDistinct\"\n | \"sum\"\n | \"avg\"\n | \"min\"\n | \"max\";\n\n/**\n * An aggregate expression.\n */\nexport type AggregateExpr = Readonly<{\n __type: \"aggregate\";\n function: AggregateFunction;\n field: FieldRef;\n}>;\n\n/**\n * A GROUP BY specification.\n */\nexport type GroupBySpec = Readonly<{\n fields: readonly FieldRef[];\n}>;\n\n// ============================================================\n// Projections\n// ============================================================\n\n/**\n * A projected field in the SELECT clause.\n * Can be either a direct field reference or an aggregate expression.\n */\nexport type ProjectedField = Readonly<{\n outputName: string;\n source: FieldRef | AggregateExpr;\n /** Override the CTE alias for this field (used for edge fields in node CTEs) */\n cteAlias?: string;\n}>;\n\n/**\n * The projection (SELECT) clause.\n */\nexport type Projection = Readonly<{\n fields: readonly ProjectedField[];\n}>;\n\n/**\n * A selectively projected field for optimized queries.\n *\n * Used when the select callback only accesses specific fields,\n * allowing the compiler to generate optimized SQL that fetches\n * only those fields instead of the full props blob.\n */\nexport type SelectiveField = Readonly<{\n /** The alias (node or edge) this field belongs to */\n alias: string;\n /** The field name (e.g., \"email\", \"name\", \"id\") */\n field: string;\n /** The output column name in the result (e.g., \"p_email\") */\n outputName: string;\n /** True if this is a system field (id, kind, etc.), false for props */\n isSystemField: boolean;\n /**\n * Optional value type for props fields.\n *\n * When present, the compiler can use type-aware JSON extraction\n * (e.g. numeric/date casts) to better match predicate compilation\n * and enable expression index coverage.\n */\n valueType?: ValueType | undefined;\n}>;\n\n// ============================================================\n// Ordering\n// ============================================================\n\n/**\n * Null ordering preference.\n */\nexport type NullOrdering = \"first\" | \"last\";\n\n/**\n * Sort direction.\n */\nexport type SortDirection = \"asc\" | \"desc\";\n\n/**\n * An ordering specification.\n */\nexport type OrderSpec = Readonly<{\n field: FieldRef;\n direction: SortDirection;\n nulls?: NullOrdering;\n}>;\n\n// ============================================================\n// Node Predicate\n// ============================================================\n\n/**\n * A predicate applied to a specific node or edge alias.\n */\nexport type NodePredicate = Readonly<{\n targetAlias: string;\n /** Whether this predicate targets a node or edge. Defaults to \"node\". */\n targetType?: \"node\" | \"edge\";\n expression: PredicateExpression;\n}>;\n\n// ============================================================\n// Temporal Options\n// ============================================================\n\n/**\n * Temporal query options.\n */\nexport type TemporalOptions = Readonly<{\n mode: TemporalMode;\n asOf?: string;\n}>;\n\n// ============================================================\n// Query AST\n// ============================================================\n\n/**\n * The complete query AST.\n */\nexport type QueryAst = Readonly<{\n /** The graph ID this query is for (used for subqueries) */\n graphId?: string;\n start: QueryStart;\n traversals: readonly Traversal[];\n predicates: readonly NodePredicate[];\n projection: Projection;\n temporalMode: TemporalOptions;\n orderBy?: readonly OrderSpec[];\n limit?: number;\n offset?: number;\n /** GROUP BY specification for aggregate queries */\n groupBy?: GroupBySpec;\n /** HAVING clause - predicates applied after GROUP BY */\n having?: PredicateExpression;\n /**\n * Selective fields for optimized queries.\n * When present, the compiler generates SQL that only fetches these specific\n * fields instead of the full props blob, enabling covered index usage.\n */\n selectiveFields?: readonly SelectiveField[];\n}>;\n\n// ============================================================\n// Set Operations\n// ============================================================\n\n/**\n * Set operation types for combining queries.\n */\nexport type SetOperationType = \"union\" | \"unionAll\" | \"intersect\" | \"except\";\n\n/**\n * A set operation combining two queries.\n */\nexport type SetOperation = Readonly<{\n __type: \"set_operation\";\n operator: SetOperationType;\n left: ComposableQuery;\n right: ComposableQuery;\n orderBy?: readonly OrderSpec[];\n limit?: number;\n offset?: number;\n}>;\n\n/**\n * A composable query - either a base query or a set operation.\n */\nexport type ComposableQuery = QueryAst | SetOperation;\n","/**\n * Field Tracking for Smart Select Optimization.\n *\n * Provides infrastructure for tracking which fields are accessed during\n * a select callback, enabling the query compiler to selectively project\n * only those fields instead of fetching the full props blob.\n */\n\nimport { EDGE_META_KEYS, NODE_META_KEYS } from \"../../system-fields\";\nimport { mergeEdgeKinds, type SelectiveField, type ValueType } from \"../ast\";\nimport { type QueryBuilderState } from \"../builder/types\";\nimport {\n type FieldTypeInfo,\n type SchemaIntrospector,\n} from \"../schema-introspector\";\n\n// ============================================================\n// Types\n// ============================================================\n\ntype TrackingValueMode = \"falsy\" | \"truthy\" | \"max\";\n\ntype AccessedField = Readonly<{\n alias: string;\n field: string;\n isSystemField: boolean;\n}>;\n\nexport type TrackingContextOptions = Readonly<{\n schemaIntrospector: SchemaIntrospector;\n mode: TrackingValueMode;\n /**\n * When \"absent\", optional traversal aliases are set to undefined to\n * encourage exploring fallback branches (e.g., `ctx.friend ? ... : ...`).\n */\n optionalTraversalAliases: \"present\" | \"absent\";\n}>;\n\n// ============================================================\n// Constants\n// ============================================================\n\nconst OBJECT_PROTOTYPE_PROPERTIES = new Set<string>([\n \"__proto__\",\n \"constructor\",\n \"hasOwnProperty\",\n \"isPrototypeOf\",\n \"propertyIsEnumerable\",\n \"toLocaleString\",\n \"toString\",\n \"valueOf\",\n]);\n\n// ============================================================\n// FieldAccessTracker\n// ============================================================\n\nexport class FieldAccessTracker {\n readonly #fields = new Map<string, AccessedField>();\n\n record(alias: string, field: string, isSystemField: boolean): void {\n const key = `${alias}\\u0000${field}`;\n this.#fields.set(key, { alias, field, isSystemField });\n }\n\n getAccessedFields(): readonly AccessedField[] {\n return [...this.#fields.values()];\n }\n}\n\n// ============================================================\n// Tracking Context Creation\n// ============================================================\n\nexport function createTrackingContext(\n state: QueryBuilderState,\n tracker: FieldAccessTracker,\n options: TrackingContextOptions,\n): Record<string, unknown> {\n const context: Record<string, unknown> = {\n [state.startAlias]: createNodeTrackingProxy(\n state.startAlias,\n state.startKinds,\n tracker,\n options,\n ),\n };\n\n for (const traversal of state.traversals) {\n const edgeKindNames = mergeEdgeKinds(traversal);\n\n const optionalAbsent =\n options.optionalTraversalAliases === \"absent\" && traversal.optional;\n\n context[traversal.nodeAlias] =\n optionalAbsent ? undefined : (\n createNodeTrackingProxy(\n traversal.nodeAlias,\n traversal.nodeKinds,\n tracker,\n options,\n )\n );\n\n context[traversal.edgeAlias] =\n optionalAbsent ? undefined : (\n createEdgeTrackingProxy(\n traversal.edgeAlias,\n edgeKindNames,\n tracker,\n options,\n )\n );\n\n // Provide placeholder values for recursive depth/path so the\n // select callback can access them without crashing during tracking.\n const vl = traversal.variableLength;\n if (vl !== undefined) {\n if (vl.depthAlias !== undefined) {\n context[vl.depthAlias] = options.mode === \"falsy\" ? 0 : 1;\n }\n if (vl.pathAlias !== undefined) {\n context[vl.pathAlias] = options.mode === \"falsy\" ? [] : [\"placeholder\"];\n }\n }\n }\n\n return context;\n}\n\nfunction createNodeTrackingProxy(\n alias: string,\n kindNames: readonly string[],\n tracker: FieldAccessTracker,\n options: TrackingContextOptions,\n): unknown {\n return new Proxy(\n {},\n {\n get: (_, property: string | symbol) => {\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n if (OBJECT_PROTOTYPE_PROPERTIES.has(property)) {\n if (property === \"constructor\") return Object;\n if (property === \"__proto__\") return Object.prototype;\n return Reflect.get(Object.prototype, property) as unknown;\n }\n\n if (property === \"id\" || property === \"kind\") {\n tracker.record(alias, property, true);\n return getPlaceholderForSystemField(property, options.mode);\n }\n\n if (property === \"meta\") {\n for (const key of NODE_META_KEYS) {\n tracker.record(alias, `meta.${key}`, true);\n }\n return buildNodeMetaPlaceholder(options.mode);\n }\n\n tracker.record(alias, property, false);\n const typeInfo = options.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n property,\n );\n return getPlaceholderForTypeInfo(typeInfo, options.mode);\n },\n },\n );\n}\n\nfunction createEdgeTrackingProxy(\n alias: string,\n edgeKindNames: readonly string[],\n tracker: FieldAccessTracker,\n options: TrackingContextOptions,\n): unknown {\n return new Proxy(\n {},\n {\n get: (_, property: string | symbol) => {\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n if (OBJECT_PROTOTYPE_PROPERTIES.has(property)) {\n if (property === \"constructor\") return Object;\n if (property === \"__proto__\") return Object.prototype;\n return Reflect.get(Object.prototype, property) as unknown;\n }\n\n if (\n property === \"id\" ||\n property === \"kind\" ||\n property === \"fromId\" ||\n property === \"toId\"\n ) {\n tracker.record(alias, property, true);\n return getPlaceholderForSystemField(property, options.mode);\n }\n\n if (property === \"meta\") {\n for (const key of EDGE_META_KEYS) {\n tracker.record(alias, `meta.${key}`, true);\n }\n return buildEdgeMetaPlaceholder(options.mode);\n }\n\n tracker.record(alias, property, false);\n const typeInfo = options.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n edgeKindNames,\n property,\n );\n return getPlaceholderForTypeInfo(typeInfo, options.mode);\n },\n },\n );\n}\n\n// ============================================================\n// Selective Field Construction\n// ============================================================\n\ntype BuildSelectiveFieldsOptions = Readonly<{\n state: QueryBuilderState;\n schemaIntrospector: SchemaIntrospector;\n}>;\n\nexport function buildSelectiveFields(\n accessedFields: readonly AccessedField[],\n options?: BuildSelectiveFieldsOptions,\n): readonly SelectiveField[] {\n const aliasInfo = options ? buildAliasKindMap(options.state) : undefined;\n\n return accessedFields\n .map((access) => {\n const base: SelectiveField = {\n alias: access.alias,\n field: access.field,\n outputName: `${access.alias}_${access.field}`,\n isSystemField: access.isSystemField,\n };\n\n if (!options || access.isSystemField) {\n return base;\n }\n\n const info = aliasInfo?.get(access.alias);\n if (!info) {\n return base;\n }\n\n const typeInfo =\n info.kind === \"node\" ?\n options.schemaIntrospector.getSharedFieldTypeInfo(\n info.kindNames,\n access.field,\n )\n : options.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n info.kindNames,\n access.field,\n );\n\n return {\n ...base,\n valueType: typeInfo?.valueType,\n };\n })\n .toSorted((a, b) => {\n const aliasCompare = a.alias.localeCompare(b.alias);\n if (aliasCompare !== 0) return aliasCompare;\n return a.field.localeCompare(b.field);\n });\n}\n\ntype AliasKind = \"node\" | \"edge\";\n\ntype AliasKindInfo = Readonly<{\n kind: AliasKind;\n kindNames: readonly string[];\n}>;\n\nfunction buildAliasKindMap(\n state: QueryBuilderState,\n): ReadonlyMap<string, AliasKindInfo> {\n const map = new Map<string, AliasKindInfo>([\n [\n state.startAlias,\n {\n kind: \"node\",\n kindNames: state.startKinds,\n },\n ],\n ]);\n\n for (const traversal of state.traversals) {\n const edgeKindNames = mergeEdgeKinds(traversal);\n\n map.set(traversal.nodeAlias, {\n kind: \"node\",\n kindNames: traversal.nodeKinds,\n });\n map.set(traversal.edgeAlias, {\n kind: \"edge\",\n kindNames: edgeKindNames,\n });\n }\n\n return map;\n}\n\n// ============================================================\n// Placeholder Values\n// ============================================================\n\nfunction getPlaceholderForSystemField(\n field: string,\n mode: TrackingValueMode,\n): unknown {\n if (\n field === \"id\" ||\n field === \"kind\" ||\n field === \"fromId\" ||\n field === \"toId\"\n ) {\n return mode === \"falsy\" ? \"\" : \"x\";\n }\n return undefined;\n}\n\nfunction buildNodeMetaPlaceholder(mode: TrackingValueMode): Readonly<{\n version: number;\n validFrom: string | undefined;\n validTo: string | undefined;\n createdAt: string;\n updatedAt: string;\n deletedAt: string | undefined;\n}> {\n const empty = mode === \"falsy\";\n return {\n version: empty ? 0 : 1,\n validFrom: empty ? undefined : \"2020-01-01T00:00:00.000Z\",\n validTo: undefined,\n createdAt: \"2020-01-01T00:00:00.000Z\",\n updatedAt: \"2020-01-01T00:00:00.000Z\",\n deletedAt: undefined,\n };\n}\n\nfunction buildEdgeMetaPlaceholder(mode: TrackingValueMode): Readonly<{\n validFrom: string | undefined;\n validTo: string | undefined;\n createdAt: string;\n updatedAt: string;\n deletedAt: string | undefined;\n}> {\n const empty = mode === \"falsy\";\n return {\n validFrom: empty ? undefined : \"2020-01-01T00:00:00.000Z\",\n validTo: undefined,\n createdAt: \"2020-01-01T00:00:00.000Z\",\n updatedAt: \"2020-01-01T00:00:00.000Z\",\n deletedAt: undefined,\n };\n}\n\nfunction getPlaceholderForTypeInfo(\n typeInfo: FieldTypeInfo | undefined,\n mode: TrackingValueMode,\n): unknown {\n if (!typeInfo) {\n return undefined;\n }\n\n return getPlaceholderForValueType(typeInfo.valueType, mode);\n}\n\nfunction getPlaceholderForValueType(\n valueType: ValueType,\n mode: TrackingValueMode,\n): unknown {\n switch (valueType) {\n case \"string\":\n case \"date\": {\n if (mode === \"falsy\") return \"\";\n if (mode === \"max\") return \"active\";\n return \"x\";\n }\n case \"number\": {\n if (mode === \"falsy\") return 0;\n if (mode === \"max\") return 100;\n return 1;\n }\n case \"boolean\": {\n return mode !== \"falsy\";\n }\n case \"array\":\n case \"embedding\": {\n return [];\n }\n case \"object\": {\n return {};\n }\n case \"unknown\": {\n return undefined;\n }\n }\n}\n","/**\n * Value decoding utilities for query execution.\n *\n * Selective projection queries return values extracted directly from JSON\n * columns. Some dialects return booleans/numbers as different JS types, and\n * arrays/objects may be returned as JSON text. This module normalizes those\n * values based on schema type information.\n */\n\nimport { type ValueType } from \"../ast\";\nimport { type FieldTypeInfo } from \"../schema-introspector\";\n\nexport function nullToUndefined(value: unknown): unknown {\n return value === null ? undefined : value;\n}\n\nexport function decodeSelectedValue(\n value: unknown,\n typeInfo: FieldTypeInfo | undefined,\n): unknown {\n const normalized = nullToUndefined(value);\n if (normalized === undefined) return undefined;\n\n if (typeInfo === undefined) {\n return normalized;\n }\n\n return decodeByValueType(normalized, typeInfo.valueType);\n}\n\nfunction decodeByValueType(value: unknown, valueType: ValueType): unknown {\n switch (valueType) {\n case \"boolean\": {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n if (value === \"0\") return false;\n if (value === \"1\") return true;\n if (value.toLowerCase() === \"true\") return true;\n if (value.toLowerCase() === \"false\") return false;\n }\n return Boolean(value);\n }\n case \"number\": {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const parsed = Number(value);\n return Number.isNaN(parsed) ? value : parsed;\n }\n return value;\n }\n case \"array\":\n case \"object\":\n case \"embedding\": {\n if (typeof value !== \"string\") return value;\n const trimmed = value.trim();\n const looksJson = trimmed.startsWith(\"[\") || trimmed.startsWith(\"{\");\n if (!looksJson) return value;\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n return value;\n }\n }\n case \"string\":\n case \"date\":\n case \"unknown\": {\n return value;\n }\n default: {\n const _exhaustive: never = valueType;\n void _exhaustive;\n return value;\n }\n }\n}\n","/**\n * Selective Result Mapping for Smart Select Optimization.\n *\n * Converts rows returned from a selective projection query into the\n * SelectContext expected by the select callback, while guarding against\n * missing fields and unsupported \"return whole node/edge\" selections.\n */\n\nimport { normalizePath } from \"../../utils\";\nimport { mergeEdgeKinds, type SelectiveField, type Traversal } from \"../ast\";\nimport type {\n AliasMap,\n EdgeAliasMap,\n QueryBuilderState,\n SelectContext,\n} from \"../builder/types\";\nimport {\n type FieldTypeInfo,\n type SchemaIntrospector,\n} from \"../schema-introspector\";\nimport { decodeSelectedValue, nullToUndefined } from \"./value-decoder\";\n\n// ============================================================\n// Errors\n// ============================================================\n\nexport class MissingSelectiveFieldError extends Error {\n readonly alias: string;\n readonly field: string;\n\n constructor(alias: string, field: string) {\n super(`Smart select missing field: ${alias}.${field}`);\n this.alias = alias;\n this.field = field;\n }\n}\n\n// ============================================================\n// Internal Types\n// ============================================================\n\ntype AliasKind = \"node\" | \"edge\";\n\ntype SystemFieldPlan = Readonly<{\n field: string;\n outputName: string;\n}>;\n\ntype MetaFieldPlan = Readonly<{\n metaKey: string;\n outputName: string;\n}>;\n\ntype PropsFieldPlan = Readonly<{\n field: string;\n outputName: string;\n typeInfo: FieldTypeInfo | undefined;\n}>;\n\ntype AliasPlan = Readonly<{\n alias: string;\n kind: AliasKind;\n optional: boolean;\n systemFields: readonly SystemFieldPlan[];\n metaFields: readonly MetaFieldPlan[];\n propsFields: readonly PropsFieldPlan[];\n idOutputName: string | undefined;\n metaOutputNames: ReadonlySet<string>;\n propsOutputNames: ReadonlySet<string>;\n systemOutputNames: ReadonlySet<string>;\n}>;\n\n// ============================================================\n// Marker for \"whole alias object\" detection\n// ============================================================\n\nconst SELECTABLE_ALIAS_MARKER = Symbol(\"selectable_alias_marker\");\n\ntype SelectableAliasMarker = Readonly<{\n alias: string;\n kind: AliasKind;\n}>;\n\nfunction isSelectableAliasObject(\n value: unknown,\n): value is SelectableAliasMarker {\n return (\n typeof value === \"object\" &&\n value !== null &&\n SELECTABLE_ALIAS_MARKER in value\n );\n}\n\nfunction containsSelectableAliasObject(value: unknown): boolean {\n const visited = new WeakSet<object>();\n\n function walk(current: unknown): boolean {\n if (isSelectableAliasObject(current)) return true;\n\n if (Array.isArray(current)) {\n for (const item of current) {\n if (walk(item)) return true;\n }\n return false;\n }\n\n if (typeof current !== \"object\" || current === null) {\n return false;\n }\n\n if (visited.has(current)) return false;\n visited.add(current);\n\n for (const value of Object.values(current)) {\n if (walk(value)) return true;\n }\n return false;\n }\n\n return walk(value);\n}\n\n// ============================================================\n// Public API\n// ============================================================\n\nexport function mapSelectiveResults<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n R,\n>(\n rows: readonly Record<string, unknown>[],\n state: QueryBuilderState,\n selectiveFields: readonly SelectiveField[],\n schemaIntrospector: SchemaIntrospector,\n selectFunction: (context: SelectContext<Aliases, EdgeAliases>) => R,\n): readonly R[] {\n const plans = buildAliasPlans(state, selectiveFields, schemaIntrospector);\n\n return rows.map((row) => {\n const context = buildSelectiveContext<Aliases, EdgeAliases>(\n row,\n plans,\n state.traversals,\n );\n const result = selectFunction(context);\n\n // Returning whole alias objects is not supported by selective projection.\n // If it happens, fall back to the full fetch path.\n if (containsSelectableAliasObject(result)) {\n throw new MissingSelectiveFieldError(\n state.startAlias,\n \"whole node/edge selection\",\n );\n }\n\n return result;\n });\n}\n\n// ============================================================\n// Plan Construction\n// ============================================================\n\nfunction buildAliasPlans(\n state: QueryBuilderState,\n selectiveFields: readonly SelectiveField[],\n schemaIntrospector: SchemaIntrospector,\n): readonly AliasPlan[] {\n const aliasInfo = new Map<\n string,\n Readonly<{\n kind: AliasKind;\n optional: boolean;\n kindNames: readonly string[];\n }>\n >([\n [\n state.startAlias,\n {\n kind: \"node\",\n optional: false,\n kindNames: state.startKinds,\n },\n ],\n ]);\n\n for (const traversal of state.traversals) {\n const edgeKindNames = mergeEdgeKinds(traversal);\n\n aliasInfo.set(traversal.nodeAlias, {\n kind: \"node\",\n optional: traversal.optional,\n kindNames: traversal.nodeKinds,\n });\n aliasInfo.set(traversal.edgeAlias, {\n kind: \"edge\",\n optional: traversal.optional,\n kindNames: edgeKindNames,\n });\n }\n\n const fieldsByAlias = new Map<string, SelectiveField[]>();\n for (const field of selectiveFields) {\n const existing = fieldsByAlias.get(field.alias) ?? [];\n existing.push(field);\n fieldsByAlias.set(field.alias, existing);\n }\n\n const plans: AliasPlan[] = [];\n\n for (const [alias, info] of aliasInfo.entries()) {\n const fields = fieldsByAlias.get(alias) ?? [];\n\n const systemFields: SystemFieldPlan[] = [];\n const metaFields: MetaFieldPlan[] = [];\n const propsFields: PropsFieldPlan[] = [];\n\n for (const field of fields) {\n if (field.isSystemField) {\n if (field.field.startsWith(\"meta.\")) {\n metaFields.push({\n metaKey: field.field.slice(5),\n outputName: field.outputName,\n });\n } else {\n systemFields.push({\n field: field.field,\n outputName: field.outputName,\n });\n }\n } else {\n const typeInfo =\n info.kind === \"node\" ?\n schemaIntrospector.getSharedFieldTypeInfo(\n info.kindNames,\n field.field,\n )\n : schemaIntrospector.getSharedEdgeFieldTypeInfo(\n info.kindNames,\n field.field,\n );\n\n propsFields.push({\n field: field.field,\n outputName: field.outputName,\n typeInfo,\n });\n }\n }\n\n const idOutputName =\n systemFields.find((f) => f.field === \"id\")?.outputName ?? undefined;\n\n plans.push({\n alias,\n kind: info.kind,\n optional: info.optional,\n systemFields,\n metaFields,\n propsFields,\n idOutputName,\n metaOutputNames: new Set(metaFields.map((f) => f.outputName)),\n propsOutputNames: new Set(propsFields.map((f) => f.outputName)),\n systemOutputNames: new Set(systemFields.map((f) => f.outputName)),\n });\n }\n\n // Keep plan iteration stable.\n return plans.toSorted((a, b) => a.alias.localeCompare(b.alias));\n}\n\n// ============================================================\n// Context Building\n// ============================================================\n\nfunction buildSelectiveContext<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n>(\n row: Record<string, unknown>,\n plans: readonly AliasPlan[],\n traversals: readonly Traversal[],\n): SelectContext<Aliases, EdgeAliases> {\n const context: Record<string, unknown> = {};\n\n for (const plan of plans) {\n const value =\n plan.optional && plan.idOutputName !== undefined ?\n buildOptionalAliasValue(row, plan)\n : buildRequiredAliasValue(row, plan);\n context[plan.alias] = value;\n }\n\n // Extract recursive depth/path values from the row\n for (const traversal of traversals) {\n const vl = traversal.variableLength;\n if (vl !== undefined) {\n if (vl.depthAlias !== undefined) {\n context[vl.depthAlias] = row[vl.depthAlias];\n }\n if (vl.pathAlias !== undefined) {\n context[vl.pathAlias] = normalizePath(row[vl.pathAlias]);\n }\n }\n }\n\n return context as SelectContext<Aliases, EdgeAliases>;\n}\n\nfunction buildOptionalAliasValue(\n row: Record<string, unknown>,\n plan: AliasPlan,\n): unknown {\n const idValue = row[plan.idOutputName!];\n\n if (idValue === null || idValue === undefined) {\n return undefined;\n }\n return buildRequiredAliasValue(row, plan);\n}\n\nfunction buildRequiredAliasValue(\n row: Record<string, unknown>,\n plan: AliasPlan,\n): unknown {\n const base: Record<string, unknown> = {\n [SELECTABLE_ALIAS_MARKER]: {\n alias: plan.alias,\n kind: plan.kind,\n } satisfies SelectableAliasMarker,\n };\n\n for (const field of plan.systemFields) {\n base[field.field] = nullToUndefined(row[field.outputName]);\n }\n\n if (plan.metaFields.length > 0) {\n const meta: Record<string, unknown> = {};\n for (const field of plan.metaFields) {\n meta[field.metaKey] = nullToUndefined(row[field.outputName]);\n }\n base.meta = createGuardedProxy(meta, `${plan.alias}.meta`);\n }\n\n for (const field of plan.propsFields) {\n const decoded = decodeSelectedValue(row[field.outputName], field.typeInfo);\n base[field.field] = decoded;\n }\n\n return createGuardedProxy(base, plan.alias);\n}\n\nfunction createGuardedProxy(\n target: Record<string, unknown>,\n debugPath: string,\n): unknown {\n return new Proxy(target, {\n get: (object, property: string | symbol, receiver) => {\n if (typeof property === \"symbol\") {\n return Reflect.get(object, property, receiver) as unknown;\n }\n\n if (property === \"then\" || property === \"toJSON\") {\n return;\n }\n\n if (property in object) {\n return Reflect.get(object, property, receiver);\n }\n\n if (property in Object.prototype) {\n return Reflect.get(Object.prototype, property, receiver) as unknown;\n }\n\n throw new MissingSelectiveFieldError(debugPath, property);\n },\n });\n}\n","/**\n * SQL Identifier Validation\n *\n * Validates aliases and identifiers to prevent SQL injection.\n */\nimport { ValidationError } from \"../../errors\";\nimport { type PredicateExpression } from \"../ast\";\n\n/**\n * Pattern for valid SQL identifiers (aliases).\n * Must start with a letter or underscore, followed by letters, digits, or underscores.\n * Maximum length of 63 characters (PostgreSQL limit).\n */\nconst SQL_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;\n\n/**\n * Reserved SQL keywords that cannot be used as aliases.\n */\nconst SQL_RESERVED_KEYWORDS = new Set([\n \"select\",\n \"from\",\n \"where\",\n \"and\",\n \"or\",\n \"not\",\n \"in\",\n \"is\",\n \"null\",\n \"true\",\n \"false\",\n \"as\",\n \"on\",\n \"join\",\n \"left\",\n \"right\",\n \"inner\",\n \"outer\",\n \"cross\",\n \"full\",\n \"group\",\n \"by\",\n \"having\",\n \"order\",\n \"asc\",\n \"desc\",\n \"limit\",\n \"offset\",\n \"union\",\n \"intersect\",\n \"except\",\n \"all\",\n \"distinct\",\n \"case\",\n \"when\",\n \"then\",\n \"else\",\n \"end\",\n \"exists\",\n \"between\",\n \"like\",\n \"ilike\",\n \"insert\",\n \"update\",\n \"delete\",\n \"create\",\n \"drop\",\n \"alter\",\n \"table\",\n \"index\",\n \"view\",\n \"with\",\n \"recursive\",\n]);\n\n/**\n * Validates that an alias is a safe SQL identifier.\n *\n * @param alias - The alias to validate\n * @throws ValidationError if the alias is not a valid SQL identifier\n */\nexport function validateSqlIdentifier(alias: string): void {\n if (!SQL_IDENTIFIER_PATTERN.test(alias)) {\n throw new ValidationError(\n `Invalid alias \"${alias}\": must start with a letter or underscore, ` +\n `contain only letters, digits, and underscores, and be at most 63 characters`,\n {\n issues: [\n {\n path: \"alias\",\n message: `\"${alias}\" is not a valid SQL identifier`,\n },\n ],\n },\n {\n suggestion: `Use a simple identifier like \"p\", \"e\", \"node1\", or \"my_alias\".`,\n },\n );\n }\n\n if (alias.toLowerCase().startsWith(\"cte_\")) {\n throw new ValidationError(\n `Invalid alias \"${alias}\": aliases starting with \"cte_\" are reserved for internal use`,\n {\n issues: [\n {\n path: \"alias\",\n message: `\"${alias}\" conflicts with internal CTE naming`,\n },\n ],\n },\n {\n suggestion: `Choose an alias that does not start with \"cte_\".`,\n },\n );\n }\n\n if (SQL_RESERVED_KEYWORDS.has(alias.toLowerCase())) {\n throw new ValidationError(\n `Invalid alias \"${alias}\": \"${alias}\" is a reserved SQL keyword`,\n {\n issues: [\n { path: \"alias\", message: `\"${alias}\" is a reserved SQL keyword` },\n ],\n },\n {\n suggestion: `Choose a different alias. Reserved words like SELECT, FROM, WHERE cannot be used.`,\n },\n );\n }\n}\n\nfunction throwInvalidVectorPredicatePlacement(path: string): never {\n throw new ValidationError(\n \"Vector similarity predicates cannot be nested under OR or NOT. \" +\n \"Use top-level AND combinations instead.\",\n {\n issues: [\n {\n path,\n message:\n \"Vector similarity predicates are only supported at top-level \" +\n \"or inside AND groups.\",\n },\n ],\n },\n {\n suggestion:\n \"Rewrite the predicate to keep vector similarity at top-level \" +\n \"or combine with additional filters using AND.\",\n },\n );\n}\n\nfunction validateVectorPredicateExpression(\n expression: PredicateExpression,\n inDisallowedBranch: boolean,\n path: string,\n): void {\n switch (expression.__type) {\n case \"vector_similarity\": {\n if (inDisallowedBranch) {\n throwInvalidVectorPredicatePlacement(path);\n }\n return;\n }\n case \"and\": {\n for (const [\n predicateIndex,\n predicate,\n ] of expression.predicates.entries()) {\n validateVectorPredicateExpression(\n predicate,\n inDisallowedBranch,\n `${path}.predicates[${predicateIndex}]`,\n );\n }\n return;\n }\n case \"or\": {\n for (const [\n predicateIndex,\n predicate,\n ] of expression.predicates.entries()) {\n validateVectorPredicateExpression(\n predicate,\n true,\n `${path}.predicates[${predicateIndex}]`,\n );\n }\n return;\n }\n case \"not\": {\n validateVectorPredicateExpression(\n expression.predicate,\n true,\n `${path}.predicate`,\n );\n return;\n }\n case \"comparison\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"exists\":\n case \"in_subquery\": {\n return;\n }\n }\n}\n\nexport function validateVectorPredicatePlacement(\n predicates: readonly { expression: PredicateExpression }[],\n): void {\n for (const [predicateIndex, predicate] of predicates.entries()) {\n validateVectorPredicateExpression(\n predicate.expression,\n false,\n `predicates[${predicateIndex}].expression`,\n );\n }\n}\n","/**\n * AST Builder utilities for query construction.\n *\n * Provides shared functions for building QueryAst objects from builder state.\n */\nimport { type QueryAst } from \"../ast\";\nimport type { QueryBuilderConfig, QueryBuilderState } from \"./types\";\nimport { validateVectorPredicatePlacement } from \"./validation\";\n\n/**\n * Builds a QueryAst from builder config and state.\n *\n * This is shared by ExecutableQuery and ExecutableAggregateQuery to avoid\n * duplicating the AST construction logic.\n */\nexport function buildQueryAst(\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n): QueryAst {\n validateVectorPredicatePlacement(state.predicates);\n\n const temporalMode: { mode: typeof state.temporalMode; asOf?: string } = {\n mode: state.temporalMode,\n };\n if (state.asOf !== undefined) {\n temporalMode.asOf = state.asOf;\n }\n\n return {\n graphId: config.graphId,\n start: {\n alias: state.startAlias,\n kinds: state.startKinds,\n includeSubClasses: state.includeSubClasses,\n },\n traversals: state.traversals,\n predicates: state.predicates,\n projection: {\n fields: state.projection,\n },\n temporalMode,\n ...(state.orderBy.length > 0 && { orderBy: state.orderBy }),\n ...(state.limit !== undefined && { limit: state.limit }),\n ...(state.offset !== undefined && { offset: state.offset }),\n ...(state.groupBy !== undefined && { groupBy: state.groupBy }),\n ...(state.having !== undefined && { having: state.having }),\n };\n}\n","/**\n * PreparedQuery — a pre-compiled, parameterized query.\n *\n * Created via `ExecutableQuery.prepare()`. Compiles the query AST to SQL once\n * at prepare time, then executes with different parameter bindings on each call.\n *\n * Fast path: when `backend.executeRaw` is available, executes pre-compiled SQL\n * text directly with substituted parameter values.\n *\n * Fallback: substitutes parameter refs in the AST, recompiles to SQL, and\n * executes via the standard `backend.execute` path.\n */\nimport { Placeholder } from \"drizzle-orm\";\n\nimport { type GraphBackend } from \"../../backend/types\";\nimport { ConfigurationError, UnsupportedPredicateError } from \"../../errors\";\nimport {\n type BetweenPredicate,\n type ComparisonPredicate,\n type ComposableQuery,\n type LiteralValue,\n type PredicateExpression,\n type QueryAst,\n type SelectiveField,\n type StringPredicate,\n} from \"../ast\";\nimport { compileQuery, type CompileQueryOptions } from \"../compiler/index\";\nimport { getDialect } from \"../dialect\";\nimport { type SqlDialect } from \"../dialect/types\";\nimport {\n mapResults,\n mapSelectiveResults,\n MissingSelectiveFieldError,\n transformPathColumns,\n} from \"../execution\";\nimport { isParameterRef } from \"../predicates\";\nimport { type SchemaIntrospector } from \"../schema-introspector\";\nimport {\n type AliasMap,\n type EdgeAliasMap,\n type QueryBuilderState,\n type SelectContext,\n} from \"./types\";\n\n// ============================================================\n// Parameter Substitution\n// ============================================================\n\nfunction toLiteral(value: unknown): LiteralValue {\n if (value === null) {\n throw new ConfigurationError(\n \"Parameter value must not be null (use undefined-based patterns instead)\",\n { parameterName: \"value\", valueType: \"null\" },\n );\n }\n if (value instanceof Date) {\n return { __type: \"literal\", value: value.toISOString(), valueType: \"date\" };\n }\n if (typeof value === \"string\") {\n return { __type: \"literal\", value, valueType: \"string\" };\n }\n if (typeof value === \"number\") {\n return { __type: \"literal\", value, valueType: \"number\" };\n }\n if (typeof value === \"boolean\") {\n return { __type: \"literal\", value, valueType: \"boolean\" };\n }\n throw new ConfigurationError(\n `Unsupported parameter value type: ${typeof value}`,\n { parameterName: \"value\", actualType: typeof value },\n );\n}\n\n/**\n * Walks a predicate expression tree and replaces ParameterRef nodes\n * with LiteralValue nodes using the provided bindings.\n */\nfunction substitutePredicateExpression(\n expr: PredicateExpression,\n bindings: Readonly<Record<string, unknown>>,\n): PredicateExpression {\n switch (expr.__type) {\n case \"comparison\": {\n if (isParameterRef(expr.right)) {\n const value = bindings[expr.right.name];\n if (value === undefined) {\n throw new ConfigurationError(\n `Missing binding for parameter \"${expr.right.name}\"`,\n { parameterName: expr.right.name },\n );\n }\n return {\n ...expr,\n right: toLiteral(value),\n } satisfies ComparisonPredicate;\n }\n return expr;\n }\n\n case \"string_op\": {\n if (isParameterRef(expr.pattern)) {\n const value = bindings[expr.pattern.name];\n if (value === undefined) {\n throw new ConfigurationError(\n `Missing binding for parameter \"${expr.pattern.name}\"`,\n { parameterName: expr.pattern.name },\n );\n }\n if (typeof value !== \"string\") {\n throw new ConfigurationError(\n `Parameter \"${expr.pattern.name}\" must be a string for string operations`,\n { parameterName: expr.pattern.name, actualType: typeof value },\n );\n }\n return {\n ...expr,\n pattern: value,\n } satisfies StringPredicate;\n }\n return expr;\n }\n\n case \"between\": {\n const lowerIsParam = isParameterRef(expr.lower);\n const upperIsParam = isParameterRef(expr.upper);\n if (!lowerIsParam && !upperIsParam) return expr;\n\n const lower =\n lowerIsParam ?\n toLiteral(resolveBinding(bindings, expr.lower.name))\n : expr.lower;\n const upper =\n upperIsParam ?\n toLiteral(resolveBinding(bindings, expr.upper.name))\n : expr.upper;\n return { ...expr, lower, upper } satisfies BetweenPredicate;\n }\n\n case \"and\": {\n return {\n ...expr,\n predicates: expr.predicates.map((p) =>\n substitutePredicateExpression(p, bindings),\n ),\n };\n }\n\n case \"or\": {\n return {\n ...expr,\n predicates: expr.predicates.map((p) =>\n substitutePredicateExpression(p, bindings),\n ),\n };\n }\n\n case \"not\": {\n return {\n ...expr,\n predicate: substitutePredicateExpression(expr.predicate, bindings),\n };\n }\n\n // These predicate types don't contain ParameterRef nodes\n case \"null_check\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"vector_similarity\": {\n return expr;\n }\n\n case \"exists\": {\n return {\n ...expr,\n subquery: substituteParameters(expr.subquery, bindings),\n };\n }\n\n case \"in_subquery\": {\n return {\n ...expr,\n subquery: substituteParameters(expr.subquery, bindings),\n };\n }\n }\n}\n\nfunction resolveBinding(\n bindings: Readonly<Record<string, unknown>>,\n name: string,\n): unknown {\n const value = bindings[name];\n if (value === undefined) {\n throw new ConfigurationError(`Missing binding for parameter \"${name}\"`, {\n parameterName: name,\n });\n }\n return value;\n}\n\n/**\n * Substitutes all ParameterRef nodes in a QueryAst with concrete values.\n */\nfunction substituteParameters(\n ast: QueryAst,\n bindings: Readonly<Record<string, unknown>>,\n): QueryAst {\n return {\n ...ast,\n predicates: ast.predicates.map((pred) => ({\n ...pred,\n expression: substitutePredicateExpression(pred.expression, bindings),\n })),\n ...(ast.having !== undefined && {\n having: substitutePredicateExpression(ast.having, bindings),\n }),\n };\n}\n\n// ============================================================\n// Placeholder Substitution for executeRaw Fast Path\n// ============================================================\n\n/**\n * Fills placeholder values in a parameter array.\n *\n * Drizzle's `sql.placeholder()` produces `Placeholder` objects in the params\n * array. This function replaces them with the actual bound values.\n */\nfunction fillPlaceholders(\n params: readonly unknown[],\n bindings: Readonly<Record<string, unknown>>,\n dialect: SqlDialect,\n): unknown[] {\n const adapter = getDialect(dialect);\n return params.map((parameter) => {\n if (parameter instanceof Placeholder) {\n const name = parameter.name as string;\n const value = bindings[name];\n if (value === undefined) {\n throw new ConfigurationError(\n `Missing binding for parameter \"${name}\"`,\n { parameterName: name },\n );\n }\n if (value instanceof Date) return value.toISOString();\n return adapter.bindValue(value);\n }\n return parameter;\n });\n}\n\n// ============================================================\n// PreparedQuery\n// ============================================================\n\ntype PreparedQueryConfig<R> = Readonly<{\n ast: QueryAst;\n unoptimizedAst: QueryAst;\n sqlText: string | undefined;\n sqlParams: readonly unknown[] | undefined;\n unoptimizedSqlText: string | undefined;\n unoptimizedSqlParams: readonly unknown[] | undefined;\n backend: GraphBackend;\n dialect: SqlDialect;\n graphId: string;\n compileOptions: CompileQueryOptions;\n state: QueryBuilderState;\n selectiveFields: readonly SelectiveField[] | undefined;\n selectFn: (context: SelectContext<AliasMap, EdgeAliasMap>) => R;\n schemaIntrospector: SchemaIntrospector;\n}>;\n\n/**\n * A pre-compiled, parameterized query.\n *\n * @example\n * ```typescript\n * const prepared = store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(param(\"name\")))\n * .select((ctx) => ctx.p)\n * .prepare();\n *\n * // Execute with different bindings\n * const alice = await prepared.execute({ name: \"Alice\" });\n * const bob = await prepared.execute({ name: \"Bob\" });\n * ```\n */\nexport class PreparedQuery<R> {\n readonly #ast: QueryAst;\n readonly #unoptimizedAst: QueryAst;\n readonly #sqlText: string | undefined;\n readonly #sqlParams: readonly unknown[] | undefined;\n readonly #unoptimizedSqlText: string | undefined;\n readonly #unoptimizedSqlParams: readonly unknown[] | undefined;\n readonly #backend: GraphBackend;\n readonly #dialect: SqlDialect;\n readonly #graphId: string;\n readonly #compileOptions: CompileQueryOptions;\n readonly #state: QueryBuilderState;\n readonly #selectiveFields: readonly SelectiveField[] | undefined;\n readonly #selectFn: (context: SelectContext<AliasMap, EdgeAliasMap>) => R;\n readonly #schemaIntrospector: SchemaIntrospector;\n readonly #parameterMetadata: ParameterMetadata;\n\n constructor(config: PreparedQueryConfig<R>) {\n this.#ast = config.ast;\n this.#unoptimizedAst = config.unoptimizedAst;\n this.#sqlText = config.sqlText;\n this.#sqlParams = config.sqlParams;\n this.#unoptimizedSqlText = config.unoptimizedSqlText;\n this.#unoptimizedSqlParams = config.unoptimizedSqlParams;\n this.#backend = config.backend;\n this.#dialect = config.dialect;\n this.#graphId = config.graphId;\n this.#compileOptions = config.compileOptions;\n this.#state = config.state;\n this.#selectiveFields = config.selectiveFields;\n this.#selectFn = config.selectFn;\n this.#schemaIntrospector = config.schemaIntrospector;\n this.#parameterMetadata = collectParameterMetadata(this.#ast);\n }\n\n /** The set of parameter names required by this prepared query. */\n get parameterNames(): ReadonlySet<string> {\n return this.#parameterMetadata.names;\n }\n\n /**\n * Executes the prepared query with the given parameter bindings.\n *\n * @param bindings - A record mapping parameter names to their values\n * @returns The query results\n */\n async execute(\n bindings: Readonly<Record<string, unknown>> = {},\n ): Promise<readonly R[]> {\n validateBindings(bindings, this.#parameterMetadata);\n\n if (this.#selectiveFields !== undefined) {\n try {\n const rows = await this.#executeSelectiveRows(bindings);\n return mapSelectiveResults<AliasMap, EdgeAliasMap, R>(\n rows,\n this.#state,\n this.#selectiveFields,\n this.#schemaIntrospector,\n this.#selectFn,\n );\n } catch (error) {\n if (\n error instanceof MissingSelectiveFieldError ||\n error instanceof UnsupportedPredicateError\n ) {\n // Fall back per-call without permanently disabling the optimized path,\n // since different bindings may succeed on the optimized path.\n // Note: this fallback is observable via query profiler hooks (onQueryStart\n // fires twice — once for the optimized attempt, once for the fallback).\n return this.#executeUnoptimized(bindings);\n }\n throw error;\n }\n }\n\n return this.#executeUnoptimized(bindings);\n }\n\n async #executeSelectiveRows(\n bindings: Readonly<Record<string, unknown>>,\n ): Promise<readonly Record<string, unknown>[]> {\n if (\n this.#sqlText !== undefined &&\n this.#sqlParams !== undefined &&\n this.#backend.executeRaw !== undefined\n ) {\n const filledParams = fillPlaceholders(\n this.#sqlParams,\n bindings,\n this.#dialect,\n );\n const rawRows = await this.#backend.executeRaw<Record<string, unknown>>(\n this.#sqlText,\n filledParams,\n );\n return transformPathColumns(rawRows, this.#state, this.#dialect);\n }\n\n const concreteAst = substituteParameters(this.#ast, bindings);\n const compiled = compileQuery(\n concreteAst,\n this.#graphId,\n this.#compileOptions,\n );\n const rawRows =\n await this.#backend.execute<Record<string, unknown>>(compiled);\n return transformPathColumns(rawRows, this.#state, this.#dialect);\n }\n\n async #executeUnoptimized(\n bindings: Readonly<Record<string, unknown>>,\n ): Promise<readonly R[]> {\n const rows = await this.#executeUnoptimizedRows(bindings);\n return mapResults<AliasMap, EdgeAliasMap, R>(\n rows,\n this.#state.startAlias,\n this.#state.traversals,\n this.#selectFn,\n );\n }\n\n async #executeUnoptimizedRows(\n bindings: Readonly<Record<string, unknown>>,\n ): Promise<readonly Record<string, unknown>[]> {\n if (\n this.#unoptimizedSqlText !== undefined &&\n this.#unoptimizedSqlParams !== undefined &&\n this.#backend.executeRaw !== undefined\n ) {\n const filledParams = fillPlaceholders(\n this.#unoptimizedSqlParams,\n bindings,\n this.#dialect,\n );\n const rawRows = await this.#backend.executeRaw<Record<string, unknown>>(\n this.#unoptimizedSqlText,\n filledParams,\n );\n return transformPathColumns(rawRows, this.#state, this.#dialect);\n }\n\n const concreteAst = substituteParameters(this.#unoptimizedAst, bindings);\n const compiled = compileQuery(\n concreteAst,\n this.#graphId,\n this.#compileOptions,\n );\n const rawRows =\n await this.#backend.execute<Record<string, unknown>>(compiled);\n return transformPathColumns(rawRows, this.#state, this.#dialect);\n }\n}\n\ntype ParameterMetadata = Readonly<{\n names: ReadonlySet<string>;\n /** Parameters used in string_op predicates (must receive string values). */\n stringOpParameters: ReadonlySet<string>;\n}>;\n\nfunction collectParameterMetadata(ast: QueryAst): ParameterMetadata {\n const names = new Set<string>();\n const stringOpParameters = new Set<string>();\n\n collectParameterMetadataFromAst(ast, names, stringOpParameters);\n\n return { names, stringOpParameters };\n}\n\nexport function hasParameterReferences(ast: QueryAst): boolean {\n return collectParameterMetadata(ast).names.size > 0;\n}\n\nexport function composableQueryHasParameterReferences(\n query: ComposableQuery,\n): boolean {\n if (\"__type\" in query) {\n return (\n composableQueryHasParameterReferences(query.left) ||\n composableQueryHasParameterReferences(query.right)\n );\n }\n return hasParameterReferences(query);\n}\n\nfunction collectParameterMetadataFromAst(\n ast: QueryAst,\n names: Set<string>,\n stringOpParameters: Set<string>,\n): void {\n for (const predicate of ast.predicates) {\n collectParameterMetadataFromExpression(\n predicate.expression,\n names,\n stringOpParameters,\n );\n }\n if (ast.having !== undefined) {\n collectParameterMetadataFromExpression(\n ast.having,\n names,\n stringOpParameters,\n );\n }\n}\n\nfunction collectParameterMetadataFromExpression(\n expression: PredicateExpression,\n names: Set<string>,\n stringOpParameters: Set<string>,\n): void {\n switch (expression.__type) {\n case \"comparison\": {\n if (isParameterRef(expression.right)) {\n names.add(expression.right.name);\n }\n return;\n }\n case \"string_op\": {\n if (isParameterRef(expression.pattern)) {\n names.add(expression.pattern.name);\n stringOpParameters.add(expression.pattern.name);\n }\n return;\n }\n case \"between\": {\n if (isParameterRef(expression.lower)) {\n names.add(expression.lower.name);\n }\n if (isParameterRef(expression.upper)) {\n names.add(expression.upper.name);\n }\n return;\n }\n case \"and\":\n case \"or\": {\n for (const predicate of expression.predicates) {\n collectParameterMetadataFromExpression(\n predicate,\n names,\n stringOpParameters,\n );\n }\n return;\n }\n case \"not\": {\n collectParameterMetadataFromExpression(\n expression.predicate,\n names,\n stringOpParameters,\n );\n return;\n }\n case \"null_check\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"vector_similarity\": {\n return;\n }\n case \"exists\": {\n collectParameterMetadataFromAst(\n expression.subquery,\n names,\n stringOpParameters,\n );\n return;\n }\n case \"in_subquery\": {\n collectParameterMetadataFromAst(\n expression.subquery,\n names,\n stringOpParameters,\n );\n return;\n }\n }\n}\n\nfunction validateBindings(\n bindings: Readonly<Record<string, unknown>>,\n metadata: ParameterMetadata,\n): void {\n const { names: expectedNames, stringOpParameters } = metadata;\n\n const missing: string[] = [];\n for (const name of expectedNames) {\n if (bindings[name] === undefined) {\n missing.push(name);\n }\n }\n\n if (missing.length > 0) {\n throw new ConfigurationError(\n `Missing bindings for parameter${missing.length === 1 ? \"\" : \"s\"}: ${missing.map((name) => `\"${name}\"`).join(\", \")}`,\n { missingParameters: missing },\n );\n }\n\n const unexpected = Object.keys(bindings).filter(\n (name) => !expectedNames.has(name),\n );\n if (unexpected.length > 0) {\n throw new ConfigurationError(\n `Unexpected bindings provided: ${unexpected.map((name) => `\"${name}\"`).join(\", \")}`,\n { unexpectedParameters: unexpected },\n );\n }\n\n // Validate value types upfront so both the fast path (executeRaw) and the\n // fallback path (AST substitution) reject the same invalid inputs.\n for (const name of expectedNames) {\n const value = bindings[name];\n validateBindingValue(name, value, stringOpParameters.has(name));\n }\n}\n\nfunction validateBindingValue(\n name: string,\n value: unknown,\n isStringOp: boolean,\n): void {\n if (value === null) {\n throw new ConfigurationError(\n \"Parameter value must not be null (use undefined-based patterns instead)\",\n { parameterName: name, valueType: \"null\" },\n );\n }\n if (isStringOp) {\n if (typeof value !== \"string\") {\n throw new ConfigurationError(\n `Parameter \"${name}\" must be a string for string operations`,\n { parameterName: name, actualType: typeof value },\n );\n }\n return;\n }\n if (\n value instanceof Date ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return;\n }\n throw new ConfigurationError(\n `Unsupported parameter value type: ${typeof value}`,\n { parameterName: name, actualType: typeof value },\n );\n}\n","/**\n * ExecutableQuery - A query that can be executed, paginated, or streamed.\n */\nimport { type SQL } from \"drizzle-orm\";\n\nimport { type GraphBackend } from \"../../backend/types\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { UnsupportedPredicateError, ValidationError } from \"../../errors\";\nimport {\n type OrderSpec,\n type QueryAst,\n type SelectiveField,\n type SortDirection,\n} from \"../ast\";\nimport { compileQuery, type CompileQueryOptions } from \"../compiler/index\";\nimport {\n buildCursorFromRow,\n type CursorData,\n decodeCursor,\n validateCursorColumns,\n} from \"../cursor\";\nimport {\n buildCursorPredicate,\n buildPaginatedResult,\n buildSelectContext,\n buildSelectiveFields,\n createStreamIterable,\n createTrackingContext,\n decodeSelectedValue,\n FieldAccessTracker,\n getStreamBatchSize,\n mapResults,\n mapSelectiveResults,\n MissingSelectiveFieldError,\n transformPathColumns,\n} from \"../execution\";\nimport { jsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport { fieldRef } from \"../predicates\";\nimport { buildQueryAst } from \"./ast-builder\";\nimport { hasParameterReferences, PreparedQuery } from \"./prepared-query\";\nimport {\n type AliasMap,\n type EdgeAliasMap,\n type PaginatedResult,\n type PaginateOptions,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type RecursiveAliasMap,\n type SelectContext,\n type StreamOptions,\n} from \"./types\";\nimport { type UnionableQuery } from \"./unionable-query\";\n\nconst NOT_COMPUTED = Symbol(\"NOT_COMPUTED\");\n\n// Forward declaration for UnionableQuery to avoid circular imports\ntype UnionableQueryConstructor = new (\n config: QueryBuilderConfig,\n state: {\n left: QueryAst;\n operator: \"union\" | \"unionAll\" | \"intersect\" | \"except\";\n right: QueryAst;\n // Additional state for result transformation\n startAlias: string;\n traversals: QueryBuilderState[\"traversals\"];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any select function type for set operations\n selectFn: (context: SelectContext<any, any>) => unknown;\n },\n) => unknown;\n\nlet UnionableQueryClass: UnionableQueryConstructor;\n\n/**\n * Sets the UnionableQuery class reference.\n * Called during module initialization to break circular dependency.\n */\nexport function setUnionableQueryClass(cls: UnionableQueryConstructor): void {\n UnionableQueryClass = cls;\n}\n\n/**\n * A query that can be executed.\n */\nexport class ExecutableQuery<\n G extends GraphDef,\n Aliases extends AliasMap,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty edge alias map\n EdgeAliases extends EdgeAliasMap = {},\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty when no recursive aliases\n RecursiveAliases extends RecursiveAliasMap = {},\n R = unknown,\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n readonly #selectFn: (\n context: SelectContext<Aliases, EdgeAliases, RecursiveAliases>,\n ) => R;\n #cachedCompiled: SQL | typeof NOT_COMPUTED = NOT_COMPUTED;\n #cachedOptimizedCompiled: SQL | typeof NOT_COMPUTED = NOT_COMPUTED;\n #cachedSelectiveFieldsForExecute:\n | readonly SelectiveField[]\n | typeof NOT_COMPUTED\n | undefined = NOT_COMPUTED;\n #cachedSelectiveFieldsForPagination:\n | readonly SelectiveField[]\n | typeof NOT_COMPUTED\n | undefined = NOT_COMPUTED;\n\n constructor(\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n selectFunction: (\n context: SelectContext<Aliases, EdgeAliases, RecursiveAliases>,\n ) => R,\n ) {\n this.#config = config;\n this.#state = state;\n this.#selectFn = selectFunction;\n }\n\n /**\n * Builds the query AST.\n */\n toAst(): QueryAst {\n return buildQueryAst(this.#config, this.#state);\n }\n\n /**\n * Orders results.\n */\n orderBy<A extends keyof Aliases & string>(\n alias: A,\n field: string,\n direction: SortDirection = \"asc\",\n ): ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, R> {\n const kindNames =\n alias === this.#state.startAlias ?\n this.#state.startKinds\n : this.#state.traversals.find(\n (traversal) => traversal.nodeAlias === alias,\n )?.nodeKinds;\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(kindNames, field)\n : undefined;\n\n const orderSpec: OrderSpec = {\n field: fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([field]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n }),\n direction,\n };\n\n const newState: QueryBuilderState = {\n ...this.#state,\n orderBy: [...this.#state.orderBy, orderSpec],\n };\n\n return new ExecutableQuery(this.#config, newState, this.#selectFn);\n }\n\n /**\n * Limits the number of results.\n */\n limit(\n n: number,\n ): ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, R> {\n return new ExecutableQuery(\n this.#config,\n { ...this.#state, limit: n },\n this.#selectFn,\n );\n }\n\n /**\n * Offsets the results.\n */\n offset(\n n: number,\n ): ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, R> {\n return new ExecutableQuery(\n this.#config,\n { ...this.#state, offset: n },\n this.#selectFn,\n );\n }\n\n /**\n * Applies a query fragment to transform this executable query.\n *\n * Useful for applying post-select transformations like ordering,\n * limits, and offsets from reusable fragments.\n *\n * @example\n * ```typescript\n * const paginated = (q) => q.orderBy(\"u\", \"createdAt\", \"desc\").limit(10);\n *\n * const results = await query()\n * .from(\"User\", \"u\")\n * .select((ctx) => ctx.u)\n * .pipe(paginated)\n * .execute();\n * ```\n *\n * @param fragment - A function that transforms the executable query\n * @returns The transformed executable query\n */\n pipe<NewR = R>(\n fragment: (\n query: ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, R>,\n ) => ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, NewR>,\n ): ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, NewR> {\n return fragment(this);\n }\n\n /**\n * Combines this query with another using UNION (removes duplicates).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n union(other: ExecutableQuery<G, any, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"union\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Combines this query with another using UNION ALL (keeps duplicates).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n unionAll(other: ExecutableQuery<G, any, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"unionAll\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Combines this query with another using INTERSECT.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n intersect(other: ExecutableQuery<G, any, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"intersect\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Combines this query with another using EXCEPT.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n except(other: ExecutableQuery<G, any, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"except\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Compiles the query and returns the SQL text and parameters.\n *\n * Requires a backend to be configured (the backend determines the SQL dialect).\n * Use this for debugging, logging, or running the query with a custom executor.\n */\n toSQL(): Readonly<{ sql: string; params: readonly unknown[] }> {\n if (!this.#config.backend?.compileSql) {\n throw new Error(\n \"Cannot convert to SQL: no backend configured or backend does not support compileSql. \" +\n \"Use store.query() to get a backend-aware query builder.\",\n );\n }\n return this.#config.backend.compileSql(this.compile());\n }\n\n /**\n * Compiles the query to a Drizzle SQL object.\n *\n * Returns a Drizzle SQL object that can be executed directly\n * with db.all(), db.get(), etc.\n */\n compile(): SQL {\n if (this.#cachedCompiled !== NOT_COMPUTED) return this.#cachedCompiled;\n const ast = this.toAst();\n const compiled = compileQuery(\n ast,\n this.#config.graphId,\n this.#compileOptions(),\n );\n this.#cachedCompiled = compiled;\n return compiled;\n }\n\n /**\n * Creates a prepared (pre-compiled) query that can be executed\n * multiple times with different parameter bindings.\n *\n * Use `param(\"name\")` in predicates to create parameterized slots,\n * then pass values via `prepared.execute({ name: \"value\" })`.\n *\n * @example\n * ```typescript\n * import { param } from \"@nicia-ai/typegraph\";\n *\n * const prepared = store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(param(\"name\")))\n * .select((ctx) => ctx.p)\n * .prepare();\n *\n * const alice = await prepared.execute({ name: \"Alice\" });\n * const bob = await prepared.execute({ name: \"Bob\" });\n * ```\n *\n * @throws Error if no backend is configured\n */\n prepare(): PreparedQuery<R> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot prepare query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n // Build AST once\n const baseAst = buildQueryAst(this.#config, this.#state);\n\n // Attempt selective field optimization\n const selectiveFields = this.#getSelectiveFieldsForExecute();\n const ast =\n selectiveFields === undefined ? baseAst : { ...baseAst, selectiveFields };\n const unoptimizedAst = baseAst;\n\n // Compile once\n const compileOptions = this.#compileOptions();\n const compiled = compileQuery(ast, this.#config.graphId, compileOptions);\n\n // Pre-compile to SQL text if the backend supports it\n let sqlText: string | undefined;\n let sqlParams: readonly unknown[] | undefined;\n let unoptimizedSqlText: string | undefined;\n let unoptimizedSqlParams: readonly unknown[] | undefined;\n if (this.#config.backend.compileSql !== undefined) {\n const result = this.#config.backend.compileSql(compiled);\n sqlText = result.sql;\n sqlParams = result.params;\n\n const unoptimizedCompiled = compileQuery(\n unoptimizedAst,\n this.#config.graphId,\n compileOptions,\n );\n const unoptimizedResult =\n this.#config.backend.compileSql(unoptimizedCompiled);\n unoptimizedSqlText = unoptimizedResult.sql;\n unoptimizedSqlParams = unoptimizedResult.params;\n }\n\n return new PreparedQuery({\n ast,\n unoptimizedAst,\n sqlText,\n sqlParams,\n unoptimizedSqlText,\n unoptimizedSqlParams,\n backend: this.#config.backend,\n dialect: this.#config.dialect ?? \"sqlite\",\n graphId: this.#config.graphId,\n compileOptions: compileOptions,\n state: this.#state,\n selectiveFields,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure needed for PreparedQuery which uses AliasMap\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => R,\n schemaIntrospector: this.#config.schemaIntrospector,\n });\n }\n\n /**\n * Builds compile options from the config.\n */\n #compileOptions(): CompileQueryOptions {\n return {\n dialect: this.#config.dialect ?? \"sqlite\",\n schema: this.#config.schema,\n };\n }\n\n #requireBackend(): GraphBackend {\n const { backend } = this.#config;\n if (backend === undefined) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Provide a backend when creating the QueryBuilder.\",\n );\n }\n return backend;\n }\n\n /**\n * Executes the query and returns typed results.\n *\n * Uses smart optimization to detect when only specific fields are accessed\n * in the select callback. If the callback only accesses simple field\n * references (no method calls or computations), generates optimized SQL\n * that only extracts those fields instead of the full props blob.\n *\n * @throws Error if no backend is configured\n */\n async execute(): Promise<readonly R[]> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n // Guard: reject queries with param() refs — must use .prepare().execute({...})\n if (hasParameterReferences(this.toAst())) {\n throw new Error(\n \"Query contains param() references. Use .prepare().execute({...}) instead of .execute().\",\n );\n }\n\n // Phase 1: Try optimized execution\n const optimizedResult = await this.#tryOptimizedExecution();\n if (optimizedResult !== undefined) {\n return optimizedResult;\n }\n\n // Phase 2: Fall back to full fetch (existing behavior)\n const compiled = this.compile();\n const rawRows =\n await this.#config.backend.execute<Record<string, unknown>>(compiled);\n\n // Transform path columns for SQLite (converts \"|id1|id2|\" to [\"id1\", \"id2\"])\n const dialect = this.#config.dialect ?? \"sqlite\";\n const rows = transformPathColumns(rawRows, this.#state, dialect);\n\n // Cast: runtime context includes recursive aliases; type erasure in mapResults is safe\n return mapResults<Aliases, EdgeAliases, R, RecursiveAliases>(\n rows,\n this.#state.startAlias,\n this.#state.traversals,\n this.#selectFn,\n );\n }\n\n /**\n * Attempts optimized execution by tracking which fields the select callback accesses.\n *\n * Returns undefined if optimization is not possible (callback uses method calls,\n * computations, or returns whole nodes).\n */\n async #tryOptimizedExecution(): Promise<readonly R[] | undefined> {\n const selectiveFields = this.#getSelectiveFieldsForExecute();\n if (selectiveFields === undefined) {\n return undefined;\n }\n\n // Build and compile optimized query (cached per instance)\n let compiled: SQL;\n if (this.#cachedOptimizedCompiled === NOT_COMPUTED) {\n const baseAst = buildQueryAst(this.#config, this.#state);\n const selectiveAst = {\n ...baseAst,\n selectiveFields,\n };\n compiled = compileQuery(\n selectiveAst,\n this.#config.graphId,\n this.#compileOptions(),\n );\n this.#cachedOptimizedCompiled = compiled;\n } else {\n compiled = this.#cachedOptimizedCompiled;\n }\n\n const rawSelectiveRows =\n await this.#requireBackend().execute<Record<string, unknown>>(compiled);\n const dialect = this.#config.dialect ?? \"sqlite\";\n const rows = transformPathColumns(rawSelectiveRows, this.#state, dialect);\n\n try {\n // RecursiveAliases are populated at runtime but erased in mapSelectiveResults' signature\n return mapSelectiveResults<Aliases, EdgeAliases, R>(\n rows,\n this.#state,\n selectiveFields,\n this.#config.schemaIntrospector,\n this.#selectFn as (context: SelectContext<Aliases, EdgeAliases>) => R,\n );\n } catch (error) {\n if (error instanceof MissingSelectiveFieldError) {\n this.#cachedSelectiveFieldsForExecute = undefined;\n this.#cachedOptimizedCompiled = NOT_COMPUTED;\n return undefined;\n }\n if (error instanceof UnsupportedPredicateError) {\n this.#cachedSelectiveFieldsForExecute = undefined;\n this.#cachedOptimizedCompiled = NOT_COMPUTED;\n return undefined;\n }\n throw error;\n }\n }\n\n #trackSelectFunctionAccesses(tracker: FieldAccessTracker): void {\n const hasOptionalTraversal = this.#state.traversals.some(\n (traversal) => traversal.optional,\n );\n\n const trackingRuns =\n hasOptionalTraversal ?\n ([\n {\n mode: \"truthy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n {\n mode: \"falsy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n {\n mode: \"falsy\" as const,\n optionalTraversalAliases: \"absent\" as const,\n },\n ] as const)\n : ([\n {\n mode: \"truthy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n {\n mode: \"falsy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n ] as const);\n\n for (const run of trackingRuns) {\n const trackingContext = createTrackingContext(this.#state, tracker, {\n schemaIntrospector: this.#config.schemaIntrospector,\n mode: run.mode,\n optionalTraversalAliases: run.optionalTraversalAliases,\n });\n\n try {\n // Execute the select callback against a lightweight tracking context.\n // We intentionally ignore the return value: we only need accessed fields.\n void this.#selectFn(\n trackingContext as SelectContext<\n Aliases,\n EdgeAliases,\n RecursiveAliases\n >,\n );\n } catch {\n // Best-effort tracking: any runtime errors in the callback (e.g. calling\n // a method on an undefined optional field) should simply disable or\n // reduce optimization, never change correctness.\n }\n }\n }\n\n #getSelectiveFieldsForExecute(): readonly SelectiveField[] | undefined {\n if (this.#cachedSelectiveFieldsForExecute === undefined) {\n return undefined;\n }\n\n if (this.#cachedSelectiveFieldsForExecute !== NOT_COMPUTED) {\n return this.#cachedSelectiveFieldsForExecute;\n }\n\n const tracker = new FieldAccessTracker();\n this.#trackSelectFunctionAccesses(tracker);\n\n const accessed = tracker.getAccessedFields();\n if (accessed.length === 0) {\n this.#cachedSelectiveFieldsForExecute = undefined;\n return undefined;\n }\n\n const selectiveFields = this.#ensureOptionalTraversalIdsSelected(\n buildSelectiveFields(accessed, {\n state: this.#state,\n schemaIntrospector: this.#config.schemaIntrospector,\n }),\n );\n this.#cachedSelectiveFieldsForExecute = selectiveFields;\n return selectiveFields;\n }\n\n #getSelectiveFieldsForPagination(): readonly SelectiveField[] | undefined {\n if (this.#cachedSelectiveFieldsForPagination === undefined) {\n return undefined;\n }\n\n if (this.#cachedSelectiveFieldsForPagination !== NOT_COMPUTED) {\n return this.#cachedSelectiveFieldsForPagination;\n }\n\n const tracker = new FieldAccessTracker();\n this.#trackSelectFunctionAccesses(tracker);\n if (!this.#recordOrderByFieldsForPagination(tracker)) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n\n const selectiveFields = this.#ensureOptionalTraversalIdsSelected(\n buildSelectiveFields(tracker.getAccessedFields(), {\n state: this.#state,\n schemaIntrospector: this.#config.schemaIntrospector,\n }),\n );\n this.#cachedSelectiveFieldsForPagination = selectiveFields;\n return selectiveFields;\n }\n\n #ensureOptionalTraversalIdsSelected(\n selectiveFields: readonly SelectiveField[],\n ): readonly SelectiveField[] {\n const result = [...selectiveFields];\n const keys = new Set(\n result.map(\n (field) =>\n `${field.alias}\\u0000${field.field}\\u0000${String(field.isSystemField)}`,\n ),\n );\n\n function add(alias: string): void {\n const key = `${alias}\\u0000id\\u0000true`;\n if (keys.has(key)) return;\n keys.add(key);\n result.push({\n alias,\n field: \"id\",\n outputName: `${alias}_id`,\n isSystemField: true,\n });\n }\n\n for (const traversal of this.#state.traversals) {\n if (!traversal.optional) continue;\n add(traversal.nodeAlias);\n add(traversal.edgeAlias);\n }\n\n return result.toSorted((a, b) => {\n const aliasCompare = a.alias.localeCompare(b.alias);\n if (aliasCompare !== 0) return aliasCompare;\n return a.field.localeCompare(b.field);\n });\n }\n\n async #tryOptimizedPaginate(\n cursorData: CursorData | undefined,\n direction: \"forward\" | \"backward\",\n pageLimit: number,\n fetchLimit: number,\n cursor: string | undefined,\n isBackward: boolean,\n ): Promise<PaginatedResult<R> | undefined> {\n const selectiveFields = this.#getSelectiveFieldsForPagination();\n if (selectiveFields === undefined) {\n return undefined;\n }\n\n let rows: readonly Record<string, unknown>[];\n try {\n rows = await this.#executeWithCursor(cursorData, direction, fetchLimit, {\n selectiveFields,\n });\n } catch (error) {\n if (error instanceof UnsupportedPredicateError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n throw error;\n }\n\n const hasMore = rows.length > pageLimit;\n const resultRows = hasMore ? rows.slice(0, pageLimit) : rows;\n const paginationDialect = this.#config.dialect ?? \"sqlite\";\n const orderedRows = transformPathColumns(\n isBackward ? resultRows.toReversed() : resultRows,\n this.#state,\n paginationDialect,\n );\n\n let data: readonly R[];\n try {\n // RecursiveAliases are populated at runtime but erased in mapSelectiveResults' signature\n data = mapSelectiveResults<Aliases, EdgeAliases, R>(\n orderedRows,\n this.#state,\n selectiveFields,\n this.#config.schemaIntrospector,\n this.#selectFn as (context: SelectContext<Aliases, EdgeAliases>) => R,\n );\n } catch (error) {\n if (error instanceof MissingSelectiveFieldError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n if (error instanceof UnsupportedPredicateError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n throw error;\n }\n\n let nextCursor: string | undefined;\n let previousCursor: string | undefined;\n\n if (orderedRows.length > 0) {\n try {\n previousCursor = this.#buildCursorFromSelectiveRow(\n orderedRows[0]!,\n selectiveFields,\n \"b\",\n );\n nextCursor = this.#buildCursorFromSelectiveRow(\n orderedRows.at(-1)!,\n selectiveFields,\n \"f\",\n );\n } catch (error) {\n if (error instanceof MissingSelectiveFieldError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n if (error instanceof UnsupportedPredicateError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n throw error;\n }\n }\n\n return {\n data,\n nextCursor: hasMore || isBackward ? nextCursor : undefined,\n prevCursor:\n cursor !== undefined || (isBackward && hasMore) ?\n previousCursor\n : undefined,\n hasNextPage: isBackward ? cursor !== undefined : hasMore,\n hasPrevPage: isBackward ? hasMore : cursor !== undefined,\n };\n }\n\n #recordOrderByFieldsForPagination(tracker: FieldAccessTracker): boolean {\n for (const spec of this.#state.orderBy) {\n const field = spec.field;\n if (field.path.length !== 1 || field.path[0] !== \"props\") {\n return false;\n }\n\n if (field.jsonPointer === undefined) {\n return false;\n }\n\n const segments = parseJsonPointer(field.jsonPointer);\n if (segments.length !== 1) {\n return false;\n }\n\n tracker.record(field.alias, segments[0]!, false);\n }\n\n return true;\n }\n\n #buildCursorFromSelectiveRow(\n row: Record<string, unknown>,\n selectiveFields: readonly SelectiveField[],\n direction: \"f\" | \"b\",\n ): string {\n const contextRow = this.#buildCursorContextFromSelectiveRow(\n row,\n selectiveFields,\n );\n return buildCursorFromRow(contextRow, this.#state.orderBy, direction);\n }\n\n #buildCursorContextFromSelectiveRow(\n row: Record<string, unknown>,\n selectiveFields: readonly SelectiveField[],\n ): Record<string, unknown> {\n const outputNameByAliasField = new Map<string, string>();\n for (const field of selectiveFields) {\n outputNameByAliasField.set(\n `${field.alias}\\u0000${field.field}`,\n field.outputName,\n );\n }\n\n const optionalNodeAliases = new Set<string>();\n for (const traversal of this.#state.traversals) {\n if (traversal.optional) {\n optionalNodeAliases.add(traversal.nodeAlias);\n }\n }\n\n const cursorContext: Record<string, unknown> = {};\n\n for (const spec of this.#state.orderBy) {\n const alias = spec.field.alias;\n const jsonPointer = spec.field.jsonPointer;\n if (jsonPointer === undefined) {\n throw new MissingSelectiveFieldError(alias, \"orderBy\");\n }\n\n const segments = parseJsonPointer(jsonPointer);\n if (segments.length === 0) {\n throw new MissingSelectiveFieldError(alias, \"orderBy\");\n }\n\n const topField = segments[0]!;\n const outputName = outputNameByAliasField.get(\n `${alias}\\u0000${topField}`,\n );\n if (outputName === undefined) {\n throw new MissingSelectiveFieldError(alias, topField);\n }\n\n if (optionalNodeAliases.has(alias)) {\n const idOutputName = outputNameByAliasField.get(`${alias}\\u0000id`);\n if (idOutputName === undefined) {\n throw new MissingSelectiveFieldError(alias, \"id\");\n }\n const idValue = row[idOutputName];\n if (idValue === null || idValue === undefined) {\n continue;\n }\n }\n\n let aliasObject: Record<string, unknown>;\n const existing = cursorContext[alias];\n if (typeof existing === \"object\" && existing !== null) {\n aliasObject = existing as Record<string, unknown>;\n } else {\n aliasObject = {};\n cursorContext[alias] = aliasObject;\n }\n\n const kindNames = this.#getNodeKindNamesForAlias(alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n topField,\n )\n : undefined;\n\n const decoded = decodeSelectedValue(row[outputName], typeInfo);\n\n if (segments.length === 1) {\n aliasObject[topField] = decoded;\n continue;\n }\n\n let current = aliasObject;\n for (let index = 0; index < segments.length - 1; index++) {\n const segment = segments[index]!;\n const existing_ = current[segment];\n if (typeof existing_ === \"object\" && existing_ !== null) {\n current = existing_ as Record<string, unknown>;\n } else {\n const created: Record<string, unknown> = {};\n current[segment] = created;\n current = created;\n }\n }\n current[segments.at(-1)!] = decoded;\n }\n\n return cursorContext;\n }\n\n #getNodeKindNamesForAlias(alias: string): readonly string[] | undefined {\n if (alias === this.#state.startAlias) {\n return this.#state.startKinds;\n }\n return this.#state.traversals.find((t) => t.nodeAlias === alias)?.nodeKinds;\n }\n\n /**\n * Executes a paginated query using cursor-based keyset pagination.\n *\n * Cursor pagination is efficient for large datasets as it avoids OFFSET.\n * Requires ORDER BY to be specified for deterministic results.\n *\n * @param options - Pagination options (first/after for forward, last/before for backward)\n * @throws ValidationError if ORDER BY is not specified\n * @throws ValidationError if cursor columns don't match query ORDER BY columns\n */\n async paginate(options: PaginateOptions): Promise<PaginatedResult<R>> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n // Validate ORDER BY is present\n if (this.#state.orderBy.length === 0) {\n throw new ValidationError(\n \"Cursor pagination requires ORDER BY. Add .orderBy() before .paginate()\",\n {\n issues: [\n {\n path: \"orderBy\",\n message: \"ORDER BY is required for cursor pagination\",\n },\n ],\n },\n {\n suggestion: `Add .orderBy(alias, field) before .paginate() to specify sort order.`,\n },\n );\n }\n\n // Determine pagination direction and parameters\n const isBackward =\n options.last !== undefined || options.before !== undefined;\n const limit = options.first ?? options.last ?? 20;\n const cursor = options.after ?? options.before;\n\n // Decode and validate cursor if provided\n let cursorData: CursorData | undefined;\n if (cursor) {\n cursorData = decodeCursor(cursor);\n validateCursorColumns(cursorData, this.#state.orderBy);\n }\n\n // Fetch limit + 1 to detect if there are more pages\n const fetchLimit = limit + 1;\n\n const direction = isBackward ? \"backward\" : \"forward\";\n const optimized = await this.#tryOptimizedPaginate(\n cursorData,\n direction,\n limit,\n fetchLimit,\n cursor,\n isBackward,\n );\n if (optimized !== undefined) {\n return optimized;\n }\n\n // Build and execute query with cursor condition\n const rows = await this.#executeWithCursor(\n cursorData,\n direction,\n fetchLimit,\n );\n\n // Detect if there are more items\n const hasMore = rows.length > limit;\n const resultRows = hasMore ? rows.slice(0, limit) : rows;\n\n // For backward pagination, reverse the results to maintain natural order\n const orderedRows = isBackward ? resultRows.toReversed() : resultRows;\n\n // Map to typed results\n const data = mapResults<Aliases, EdgeAliases, R, RecursiveAliases>(\n orderedRows,\n this.#state.startAlias,\n this.#state.traversals,\n this.#selectFn,\n );\n\n // Build paginated result with cursors\n return buildPaginatedResult(\n data,\n orderedRows,\n this.#state.orderBy,\n limit,\n hasMore,\n isBackward,\n cursor,\n (row) =>\n buildSelectContext<Aliases, EdgeAliases, RecursiveAliases>(\n row,\n this.#state.startAlias,\n this.#state.traversals,\n ),\n );\n }\n\n /**\n * Returns an async iterator that streams results in batches.\n *\n * Uses cursor pagination internally for efficient memory usage.\n * Requires ORDER BY to be specified for deterministic results.\n *\n * @param options - Stream options (batchSize defaults to 1000)\n * @throws ValidationError if ORDER BY is not specified\n */\n stream(options?: StreamOptions): AsyncIterable<R> {\n // Validate ORDER BY is present\n if (this.#state.orderBy.length === 0) {\n throw new ValidationError(\n \"Streaming requires ORDER BY. Add .orderBy() before .stream()\",\n {\n issues: [\n { path: \"orderBy\", message: \"ORDER BY is required for streaming\" },\n ],\n },\n {\n suggestion: `Add .orderBy(alias, field) before .stream() to specify sort order.`,\n },\n );\n }\n\n const batchSize = getStreamBatchSize(options);\n return createStreamIterable(batchSize, (paginateOptions) =>\n this.paginate(paginateOptions),\n );\n }\n\n /**\n * Executes a query with cursor conditions applied.\n */\n async #executeWithCursor(\n cursorData: CursorData | undefined,\n direction: \"forward\" | \"backward\",\n limit: number,\n options?: Readonly<{ selectiveFields?: readonly SelectiveField[] }>,\n ): Promise<readonly Record<string, unknown>[]> {\n const ast = this.toAst();\n\n // Adjust ORDER BY for backward pagination (reverse all directions)\n let orderBy = this.#state.orderBy;\n if (direction === \"backward\") {\n orderBy = orderBy.map((spec) => ({\n ...spec,\n direction:\n spec.direction === \"asc\" ? (\"desc\" as const) : (\"asc\" as const),\n }));\n }\n\n // Build cursor predicates if we have cursor data\n let predicates = [...this.#state.predicates];\n if (cursorData) {\n const cursorPredicate = buildCursorPredicate(\n cursorData,\n this.#state.orderBy,\n direction,\n this.#state.startAlias,\n );\n predicates = [...predicates, cursorPredicate];\n }\n\n // Apply modified ORDER BY, predicates, and limit to AST (discard offset)\n const { offset: _discarded, ...astWithoutOffset } = ast;\n const modifiedAst = {\n ...astWithoutOffset,\n predicates,\n orderBy,\n limit,\n ...(options?.selectiveFields !== undefined && {\n selectiveFields: options.selectiveFields,\n }),\n };\n\n // Compile and execute\n const compiled = compileQuery(\n modifiedAst,\n this.#config.graphId,\n this.#compileOptions(),\n );\n const rawRows =\n await this.#requireBackend().execute<Record<string, unknown>>(compiled);\n const dialect = this.#config.dialect ?? \"sqlite\";\n return transformPathColumns(rawRows, this.#state, dialect);\n }\n}\n","/**\n * ExecutableAggregateQuery - A query with aggregate functions that can be executed.\n */\nimport { type SQL } from \"drizzle-orm\";\n\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type AggregateExpr, type FieldRef, type QueryAst } from \"../ast\";\nimport { compileQuery, type CompileQueryOptions } from \"../compiler/index\";\nimport { buildQueryAst } from \"./ast-builder\";\nimport {\n type AliasMap,\n type QueryBuilderConfig,\n type QueryBuilderState,\n} from \"./types\";\n\nconst NOT_COMPUTED = Symbol(\"NOT_COMPUTED\");\n\n/**\n * Result type for aggregate queries.\n * Maps field refs to their value types and aggregates to numbers.\n */\nexport type AggregateResult<\n R extends Record<string, FieldRef | AggregateExpr>,\n> = {\n [K in keyof R]: R[K] extends AggregateExpr ? number\n : R[K] extends FieldRef ? unknown\n : never;\n};\n\n/**\n * An aggregate query that can be executed.\n */\nexport class ExecutableAggregateQuery<\n G extends GraphDef,\n Aliases extends AliasMap,\n R extends Record<string, FieldRef | AggregateExpr>,\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n readonly #fields: R;\n #cachedCompiled: SQL | typeof NOT_COMPUTED = NOT_COMPUTED;\n\n constructor(config: QueryBuilderConfig, state: QueryBuilderState, fields: R) {\n this.#config = config;\n this.#state = state;\n this.#fields = fields;\n }\n\n /**\n * Builds the query AST.\n */\n toAst(): QueryAst {\n return buildQueryAst(this.#config, this.#state);\n }\n\n /**\n * Limits the number of results.\n */\n limit(n: number): ExecutableAggregateQuery<G, Aliases, R> {\n return new ExecutableAggregateQuery(\n this.#config,\n { ...this.#state, limit: n },\n this.#fields,\n );\n }\n\n /**\n * Offsets the results.\n */\n offset(n: number): ExecutableAggregateQuery<G, Aliases, R> {\n return new ExecutableAggregateQuery(\n this.#config,\n { ...this.#state, offset: n },\n this.#fields,\n );\n }\n\n /**\n * Compiles the query and returns the SQL text and parameters.\n *\n * Requires a backend to be configured (the backend determines the SQL dialect).\n * Use this for debugging, logging, or running the query with a custom executor.\n */\n toSQL(): Readonly<{ sql: string; params: readonly unknown[] }> {\n if (!this.#config.backend?.compileSql) {\n throw new Error(\n \"Cannot convert to SQL: no backend configured or backend does not support compileSql. \" +\n \"Use store.query() to get a backend-aware query builder.\",\n );\n }\n return this.#config.backend.compileSql(this.compile());\n }\n\n /**\n * Compiles the query to a Drizzle SQL object.\n */\n compile(): SQL {\n if (this.#cachedCompiled !== NOT_COMPUTED) {\n return this.#cachedCompiled;\n }\n const ast = this.toAst();\n const compiled = compileQuery(\n ast,\n this.#config.graphId,\n this.#compileOptions(),\n );\n this.#cachedCompiled = compiled;\n return compiled;\n }\n\n /**\n * Builds compile options from the config.\n */\n #compileOptions(): CompileQueryOptions {\n return {\n dialect: this.#config.dialect ?? \"sqlite\",\n schema: this.#config.schema,\n };\n }\n\n /**\n * Executes the query and returns typed results.\n *\n * @throws Error if no backend is configured\n */\n async execute(): Promise<readonly AggregateResult<R>[]> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n const compiled = this.compile();\n const rows =\n await this.#config.backend.execute<Record<string, unknown>>(compiled);\n\n return this.#mapResults(rows);\n }\n\n /**\n * Maps raw database rows to typed results.\n * Handles database-specific value conversions:\n * - PostgreSQL returns bigint/numeric as strings → convert to numbers\n * - SQLite returns JSON booleans as 0/1 numbers → convert to booleans\n * - PostgreSQL returns JSON booleans as \"true\"/\"false\" strings → convert to booleans\n */\n #mapResults(\n rows: readonly Record<string, unknown>[],\n ): readonly AggregateResult<R>[] {\n return rows.map((row) => {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(this.#fields)) {\n const field = this.#fields[key];\n if (!field) continue;\n const value = row[key];\n\n if (field.__type === \"aggregate\") {\n // PostgreSQL returns aggregate bigint/numeric as strings.\n result[key] = typeof value === \"string\" ? Number(value) : value;\n continue;\n }\n\n result[key] = normalizeFieldValue(field, value);\n }\n return result as AggregateResult<R>;\n });\n }\n}\n\n/**\n * Converts database-specific boolean encodings to JS booleans.\n *\n * - SQLite json_extract() returns 0/1 for JSON booleans\n * - PostgreSQL #>> returns \"true\"/\"false\" for JSON booleans\n */\nfunction normalizeBooleanValue(value: unknown): unknown {\n if (value === null) return undefined;\n if (value === true || value === false) return value;\n if (value === 1) return true;\n if (value === 0) return false;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value === \"1\") return true;\n if (value === \"0\") return false;\n return value;\n}\n\nfunction normalizeFieldValue(field: FieldRef, value: unknown): unknown {\n if (field.valueType === \"boolean\") {\n return normalizeBooleanValue(value);\n }\n\n return value === null ? undefined : value;\n}\n","/**\n * TraversalBuilder - Intermediate builder for edge traversals.\n */\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type AnyEdgeType, type NodeType } from \"../../core/types\";\nimport {\n type NodePredicate,\n type RecursiveCyclePolicy,\n type Traversal,\n type TraversalDirection,\n} from \"../ast\";\nimport { MAX_EXPLICIT_RECURSIVE_DEPTH } from \"../compiler\";\nimport { jsonPointer } from \"../json-pointer\";\nimport {\n arrayField,\n baseField,\n dateField,\n fieldRef,\n numberField,\n objectField,\n type Predicate,\n stringField,\n} from \"../predicates\";\n// Type-only import to get the QueryBuilder type without runtime circular dependency\nimport { type QueryBuilder } from \"./query-builder\";\nimport {\n type AliasMap,\n type BaseFieldAccessor,\n type BuildRecursiveAliases,\n type EdgeAccessor,\n type EdgeAlias,\n type EdgeAliasMap,\n type NodeAlias,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type RecursiveAliasMap,\n type RecursiveTraversalOptions,\n type UniqueAlias,\n type ValidEdgeTargets,\n} from \"./types\";\nimport { validateSqlIdentifier } from \"./validation\";\n\n// Forward declaration - actual import would cause circular dependency\ntype QueryBuilderConstructor = new (\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n) => unknown;\n\n// This will be set by the main builder module to avoid circular imports\nlet QueryBuilderClass: QueryBuilderConstructor;\n\n/**\n * Sets the QueryBuilder class reference for use by TraversalBuilder.\n * Called during module initialization to break circular dependency.\n */\nexport function setQueryBuilderClass(cls: QueryBuilderConstructor): void {\n QueryBuilderClass = cls;\n}\n\n/**\n * State for variable-length traversal configuration.\n */\ninterface VariableLengthState {\n enabled: boolean;\n minDepth: number;\n maxDepth: number;\n cyclePolicy: RecursiveCyclePolicy;\n pathEnabled: boolean;\n pathAlias?: string;\n depthEnabled: boolean;\n depthAlias?: string;\n}\n\n/**\n * Default variable-length state (disabled).\n */\nconst DEFAULT_VARIABLE_LENGTH_STATE: VariableLengthState = {\n enabled: false,\n minDepth: 1,\n maxDepth: -1,\n cyclePolicy: \"prevent\",\n pathEnabled: false,\n depthEnabled: false,\n};\n\nfunction validateMaxHops(max: number): void {\n if (!Number.isFinite(max) || !Number.isInteger(max)) {\n throw new TypeError(\"maxHops must be a finite integer\");\n }\n if (max < 1) {\n throw new Error(\"maxHops must be >= 1\");\n }\n if (max > MAX_EXPLICIT_RECURSIVE_DEPTH) {\n throw new Error(\n `maxHops must be <= ${MAX_EXPLICIT_RECURSIVE_DEPTH}. ` +\n `Use a smaller bound to prevent runaway recursive queries.`,\n );\n }\n}\n\nfunction validateMinHops(min: number): void {\n if (!Number.isFinite(min) || !Number.isInteger(min)) {\n throw new TypeError(\"minHops must be a finite integer\");\n }\n if (min < 0) {\n throw new Error(\"minHops must be >= 0\");\n }\n}\n\nfunction resolveAliasOption(\n option: boolean | string | undefined,\n): string | undefined {\n if (option === undefined || option === false) {\n return;\n }\n\n if (option === true) {\n return;\n }\n\n return option;\n}\n\n/**\n * Intermediate builder for traversal operations.\n *\n * Type parameters track the edge kind and direction to constrain\n * which node kinds are valid targets in the `to()` method.\n */\nexport class TraversalBuilder<\n G extends GraphDef,\n Aliases extends AliasMap,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty edge alias map\n EdgeAliases extends EdgeAliasMap = {},\n EK extends keyof G[\"edges\"] & string = keyof G[\"edges\"] & string,\n EA extends string = string,\n Dir extends TraversalDirection = \"out\",\n Optional extends boolean = false,\n DC extends boolean | string = false,\n PC extends boolean | string = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty when no recursive aliases accumulated\n RecAliases extends RecursiveAliasMap = {},\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n readonly #edgeKinds: readonly string[];\n readonly #inverseEdgeKinds: readonly string[];\n readonly #edgeAlias: EA;\n readonly #direction: Dir;\n readonly #fromAlias: string;\n readonly #optional: Optional;\n readonly #variableLength: VariableLengthState;\n readonly #pendingEdgePredicates: readonly NodePredicate[];\n\n constructor(\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n edgeKinds: readonly string[],\n edgeAlias: EA,\n direction: Dir,\n fromAlias: string,\n inverseEdgeKinds: readonly string[] = [],\n optional: Optional = false as Optional,\n variableLength: VariableLengthState = DEFAULT_VARIABLE_LENGTH_STATE,\n pendingEdgePredicates: readonly NodePredicate[] = [],\n ) {\n this.#config = config;\n this.#state = state;\n this.#edgeKinds = edgeKinds;\n this.#inverseEdgeKinds = inverseEdgeKinds;\n this.#edgeAlias = edgeAlias;\n this.#direction = direction;\n this.#fromAlias = fromAlias;\n this.#optional = optional;\n this.#variableLength = variableLength;\n this.#pendingEdgePredicates = pendingEdgePredicates;\n }\n\n /**\n * Enables variable-length (recursive) traversal.\n * By default, traverses unlimited depth with cycle prevention.\n */\n recursive<const O extends RecursiveTraversalOptions = Record<string, never>>(\n options?: O,\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n Dir,\n Optional,\n O extends { depth: infer D extends boolean | string } ? D : DC,\n O extends { path: infer P extends boolean | string } ? P : PC,\n RecAliases\n > {\n const minDepth = options?.minHops ?? this.#variableLength.minDepth;\n const maxDepth = options?.maxHops ?? this.#variableLength.maxDepth;\n validateMinHops(minDepth);\n if (options?.maxHops !== undefined) {\n validateMaxHops(maxDepth);\n }\n if (maxDepth > 0 && minDepth > maxDepth) {\n throw new Error(\"minHops must be <= maxHops\");\n }\n\n const pathAlias = resolveAliasOption(options?.path);\n const depthAlias = resolveAliasOption(options?.depth);\n if (pathAlias !== undefined) validateSqlIdentifier(pathAlias);\n if (depthAlias !== undefined) validateSqlIdentifier(depthAlias);\n const cyclePolicy =\n options?.cyclePolicy ?? this.#variableLength.cyclePolicy;\n\n return new TraversalBuilder(\n this.#config,\n this.#state,\n this.#edgeKinds,\n this.#edgeAlias,\n this.#direction,\n this.#fromAlias,\n this.#inverseEdgeKinds,\n this.#optional,\n {\n ...this.#variableLength,\n enabled: true,\n minDepth,\n maxDepth,\n cyclePolicy,\n ...(options?.path !== undefined && {\n pathEnabled: options.path !== false,\n ...(pathAlias !== undefined && { pathAlias }),\n }),\n ...(options?.depth !== undefined && {\n depthEnabled: options.depth !== false,\n ...(depthAlias !== undefined && { depthAlias }),\n }),\n },\n this.#pendingEdgePredicates,\n );\n }\n\n /**\n * Adds a WHERE clause for the edge being traversed.\n *\n * @param alias - The edge alias to filter on (must be the current edge alias)\n * @param predicateFunction - A function that builds predicates using the edge accessor\n */\n whereEdge(\n alias: EA,\n predicateFunction: (\n edge: EdgeAccessor<G[\"edges\"][EK][\"type\"]>,\n ) => Predicate,\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n Dir,\n Optional,\n DC,\n PC,\n RecAliases\n > {\n const accessor = this.#createEdgeAccessor(alias);\n const predicate = predicateFunction(\n accessor as EdgeAccessor<G[\"edges\"][EK][\"type\"]>,\n );\n\n const newPredicate: NodePredicate = {\n targetAlias: alias,\n targetType: \"edge\",\n expression: predicate.__expr,\n };\n\n return new TraversalBuilder(\n this.#config,\n this.#state,\n this.#edgeKinds,\n this.#edgeAlias,\n this.#direction,\n this.#fromAlias,\n this.#inverseEdgeKinds,\n this.#optional,\n this.#variableLength,\n [...this.#pendingEdgePredicates, newPredicate],\n );\n }\n\n /**\n * Creates a type-safe accessor for edge properties.\n */\n #createEdgeAccessor(alias: string): EdgeAccessor<AnyEdgeType> {\n const allEdgeKinds = [\n ...this.#edgeKinds,\n ...this.#inverseEdgeKinds.filter(\n (kind) => !this.#edgeKinds.includes(kind),\n ),\n ];\n\n // Pre-compute system field accessors\n const idAccessor = stringField(\n fieldRef(alias, [\"id\"], { valueType: \"string\" }),\n );\n const kindAccessor = stringField(\n fieldRef(alias, [\"kind\"], { valueType: \"string\" }),\n );\n const fromIdAccessor = stringField(\n fieldRef(alias, [\"from_id\"], { valueType: \"string\" }),\n );\n const toIdAccessor = stringField(\n fieldRef(alias, [\"to_id\"], { valueType: \"string\" }),\n );\n\n // Build field accessor for a schema property\n const buildFieldAccessor = (propertyName: string): BaseFieldAccessor => {\n const typeInfo =\n this.#config.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n allEdgeKinds,\n propertyName,\n );\n\n const valueType = typeInfo?.valueType;\n const elementType = typeInfo?.elementType;\n\n const ref = fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([propertyName]),\n valueType,\n elementType,\n });\n\n switch (valueType) {\n case \"string\": {\n return stringField(ref);\n }\n case \"number\": {\n return numberField(ref);\n }\n case \"boolean\": {\n return baseField(ref);\n }\n case \"date\": {\n return dateField(ref);\n }\n case \"array\": {\n return arrayField(ref);\n }\n case \"object\": {\n return objectField(ref);\n }\n case \"embedding\":\n case \"unknown\":\n case undefined: {\n // Embedding, unknown, or unresolved type - return base field\n return baseField(ref);\n }\n }\n };\n\n // Use a Proxy to provide flattened property access\n return new Proxy({} as EdgeAccessor<AnyEdgeType>, {\n get: (_, property: string | symbol) => {\n // Handle symbols and special properties to avoid infinite loops\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n // System fields\n if (property === \"id\") return idAccessor;\n if (property === \"kind\") return kindAccessor;\n if (property === \"fromId\") return fromIdAccessor;\n if (property === \"toId\") return toIdAccessor;\n\n // Schema properties\n return buildFieldAccessor(property);\n },\n });\n }\n\n /**\n * Specifies the target node kind.\n *\n * The kind must be a valid target for this edge based on the traversal direction:\n * - \"out\" direction: kind must be in the edge's \"to\" array\n * - \"in\" direction: kind must be in the edge's \"from\" array\n *\n * @param kind - The target node kind\n * @param alias - A unique alias for this node (compile-time error if duplicate)\n */\n to<K extends ValidEdgeTargets<G, EK, Dir>, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: false },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<G[\"nodes\"][K][\"type\"], Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>,\n RecAliases & BuildRecursiveAliases<DC, PC, A>\n >;\n\n to<K extends ValidEdgeTargets<G, EK, Dir>, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options: { includeSubClasses: true },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<NodeType, Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>,\n RecAliases & BuildRecursiveAliases<DC, PC, A>\n >;\n\n to<K extends ValidEdgeTargets<G, EK, Dir>, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: boolean },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<NodeType, Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>,\n RecAliases & BuildRecursiveAliases<DC, PC, A>\n > {\n // Validate node alias to prevent SQL injection\n validateSqlIdentifier(alias);\n\n const includeSubClasses = options?.includeSubClasses ?? false;\n const kinds =\n includeSubClasses ? this.#config.registry.expandSubClasses(kind) : [kind];\n\n // Build base traversal\n const traversalBase: Traversal = {\n edgeAlias: this.#edgeAlias,\n edgeKinds: this.#edgeKinds,\n direction: this.#direction,\n nodeAlias: alias,\n nodeKinds: kinds,\n joinFromAlias: this.#fromAlias,\n joinEdgeField: this.#direction === \"out\" ? \"from_id\" : \"to_id\",\n optional: this.#optional,\n };\n\n const baseTraversal: Traversal =\n this.#inverseEdgeKinds.length > 0 ?\n { ...traversalBase, inverseEdgeKinds: this.#inverseEdgeKinds }\n : traversalBase;\n\n // Add variable-length spec if enabled\n const traversal: Traversal =\n this.#variableLength.enabled ?\n {\n ...baseTraversal,\n variableLength: {\n minDepth: this.#variableLength.minDepth,\n maxDepth: this.#variableLength.maxDepth,\n cyclePolicy: this.#variableLength.cyclePolicy,\n ...(this.#variableLength.pathEnabled && {\n pathAlias: this.#variableLength.pathAlias ?? `${alias}_path`,\n }),\n ...(this.#variableLength.depthEnabled && {\n depthAlias: this.#variableLength.depthAlias ?? `${alias}_depth`,\n }),\n },\n }\n : baseTraversal;\n\n const newState: QueryBuilderState = {\n ...this.#state,\n traversals: [...this.#state.traversals, traversal],\n predicates: [...this.#state.predicates, ...this.#pendingEdgePredicates],\n currentAlias: alias, // Update current alias to this traversal's target\n };\n\n // Cast is safe because the overloads provide compile-time type safety\n // The runtime QueryBuilderClass is the correct implementation\n return new QueryBuilderClass(this.#config, newState) as QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<NodeType, Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>,\n RecAliases & BuildRecursiveAliases<DC, PC, A>\n >;\n }\n}\n","/**\n * QueryBuilder - The fluent query builder.\n */\nimport { type GraphDef } from \"../../core/define-graph\";\nimport {\n type EdgeType,\n type NodeType,\n type TemporalMode,\n} from \"../../core/types\";\nimport { ValidationError } from \"../../errors\";\nimport {\n type AggregateExpr,\n type FieldRef,\n type GroupBySpec,\n mergeEdgeKinds,\n type OrderSpec,\n type PredicateExpression,\n type ProjectedField,\n type SortDirection,\n type TraversalDirection,\n type TraversalExpansion,\n} from \"../ast\";\nimport { jsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport {\n arrayField,\n baseField,\n dateField,\n embeddingField,\n fieldRef,\n numberField,\n objectField,\n type Predicate,\n stringField,\n} from \"../predicates\";\nimport { type FieldTypeInfo } from \"../schema-introspector\";\nimport { ExecutableAggregateQuery } from \"./executable-aggregate-query\";\nimport { ExecutableQuery } from \"./executable-query\";\nimport { TraversalBuilder } from \"./traversal-builder\";\nimport {\n type AliasMap,\n type BaseFieldAccessor,\n type EdgeAccessor,\n type EdgeAliasMap,\n type NodeAccessor,\n type NodeAlias,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type RecursiveAliasMap,\n type SelectContext,\n type UniqueAlias,\n} from \"./types\";\nimport { validateSqlIdentifier } from \"./validation\";\n\n/**\n * Builds projected fields for a node alias (including all metadata columns).\n */\nfunction buildNodeFields(alias: string): ProjectedField[] {\n return [\n {\n outputName: `${alias}_id`,\n source: fieldRef(alias, [\"id\"]),\n },\n {\n outputName: `${alias}_kind`,\n source: fieldRef(alias, [\"kind\"]),\n },\n {\n outputName: `${alias}_props`,\n source: fieldRef(alias, [\"props\"]),\n },\n {\n outputName: `${alias}_version`,\n source: fieldRef(alias, [\"version\"]),\n },\n {\n outputName: `${alias}_valid_from`,\n source: fieldRef(alias, [\"valid_from\"]),\n },\n {\n outputName: `${alias}_valid_to`,\n source: fieldRef(alias, [\"valid_to\"]),\n },\n {\n outputName: `${alias}_created_at`,\n source: fieldRef(alias, [\"created_at\"]),\n },\n {\n outputName: `${alias}_updated_at`,\n source: fieldRef(alias, [\"updated_at\"]),\n },\n {\n outputName: `${alias}_deleted_at`,\n source: fieldRef(alias, [\"deleted_at\"]),\n },\n ];\n}\n\n/**\n * Builds projected fields for an edge alias (including all metadata columns).\n *\n * Edge columns are stored in the traversal's node CTE (e.g., cte_c contains e_id, e_kind, etc.).\n * The nodeCteAlias parameter specifies which CTE contains these columns.\n */\nfunction buildEdgeFields(\n edgeAlias: string,\n nodeCteAlias: string,\n): ProjectedField[] {\n const cteAlias = `cte_${nodeCteAlias}`;\n return [\n {\n outputName: `${edgeAlias}_id`,\n source: fieldRef(edgeAlias, [\"id\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_kind`,\n source: fieldRef(edgeAlias, [\"kind\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_from_id`,\n source: fieldRef(edgeAlias, [\"from_id\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_to_id`,\n source: fieldRef(edgeAlias, [\"to_id\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_props`,\n source: fieldRef(edgeAlias, [\"props\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_valid_from`,\n source: fieldRef(edgeAlias, [\"valid_from\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_valid_to`,\n source: fieldRef(edgeAlias, [\"valid_to\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_created_at`,\n source: fieldRef(edgeAlias, [\"created_at\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_updated_at`,\n source: fieldRef(edgeAlias, [\"updated_at\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_deleted_at`,\n source: fieldRef(edgeAlias, [\"deleted_at\"]),\n cteAlias,\n },\n ];\n}\n\n/**\n * The fluent query builder.\n *\n * Type parameters accumulate as methods are chained:\n * - G: The graph definition\n * - Aliases: Map of alias names to their node kinds\n * - EdgeAliases: Map of alias names to their edge kinds (accumulated during traversals)\n */\nexport class QueryBuilder<\n G extends GraphDef,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty alias map\n Aliases extends AliasMap = {},\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty edge alias map\n EdgeAliases extends EdgeAliasMap = {},\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty when no recursive aliases\n RecursiveAliases extends RecursiveAliasMap = {},\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n\n constructor(config: QueryBuilderConfig, state: QueryBuilderState) {\n this.#config = config;\n this.#state = state;\n }\n\n /**\n * Starts a query from a node kind.\n *\n * @param kind - The node kind to start from\n * @param alias - A unique alias for this node (compile-time error if duplicate)\n */\n from<K extends keyof G[\"nodes\"] & string, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: false },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<G[\"nodes\"][K][\"type\"]>>,\n EdgeAliases,\n RecursiveAliases\n >;\n\n from<K extends keyof G[\"nodes\"] & string, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options: { includeSubClasses: true },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias>,\n EdgeAliases,\n RecursiveAliases\n >;\n\n from<K extends keyof G[\"nodes\"] & string, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: boolean },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias>,\n EdgeAliases,\n RecursiveAliases\n > {\n // Validate alias to prevent SQL injection\n validateSqlIdentifier(alias);\n\n const includeSubClasses = options?.includeSubClasses ?? false;\n\n // Expand kinds if including subclasses\n const kinds =\n includeSubClasses ? this.#config.registry.expandSubClasses(kind) : [kind];\n\n const newState: QueryBuilderState = {\n ...this.#state,\n startAlias: alias,\n currentAlias: alias,\n startKinds: kinds,\n includeSubClasses,\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Adds a WHERE clause for a node.\n */\n whereNode<A extends keyof Aliases & string>(\n alias: A,\n predicateFunction: (n: NodeAccessor<Aliases[A][\"type\"]>) => Predicate,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n const accessor = this.#createNodeAccessor(alias);\n const predicate = predicateFunction(\n accessor as NodeAccessor<Aliases[A][\"type\"]>,\n );\n\n const newState: QueryBuilderState = {\n ...this.#state,\n predicates: [\n ...this.#state.predicates,\n {\n targetAlias: alias,\n expression: predicate.__expr,\n },\n ],\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Adds a WHERE clause for an edge.\n *\n * @param alias - The edge alias to filter on\n * @param predicateFunction - A function that builds predicates using the edge accessor\n */\n whereEdge<EA extends keyof EdgeAliases & string>(\n alias: EA,\n predicateFunction: (\n edge: EdgeAccessor<EdgeAliases[EA][\"type\"]>,\n ) => Predicate,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n const accessor = this.#createEdgeAccessor(alias);\n const predicate = predicateFunction(\n accessor as EdgeAccessor<EdgeAliases[EA][\"type\"]>,\n );\n\n const newState: QueryBuilderState = {\n ...this.#state,\n predicates: [\n ...this.#state.predicates,\n {\n targetAlias: alias,\n targetType: \"edge\",\n expression: predicate.__expr,\n },\n ],\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Traverses an edge to another node (outgoing direction).\n *\n * By default, traverses from the current node (last traversal target, or start node).\n * Use the `from` option to traverse from a different alias (fan-out pattern).\n *\n * @param options.expand - Ontology expansion mode for implying/inverse edges\n * @param options.from - Alias to traverse from (defaults to current/last traversal target)\n */\n traverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: \"out\";\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n \"out\",\n false,\n false,\n false,\n RecursiveAliases\n >;\n\n /**\n * Traverses an edge to another node (incoming direction).\n *\n * By default, traverses from the current node (last traversal target, or start node).\n * Use the `from` option to traverse from a different alias (fan-out pattern).\n *\n * @param options.direction - Set to \"in\" for incoming edge traversal\n * @param options.expand - Ontology expansion mode for implying/inverse edges\n * @param options.from - Alias to traverse from (defaults to current/last traversal target)\n */\n traverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options: {\n direction: \"in\";\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n \"in\",\n false,\n false,\n false,\n RecursiveAliases\n >;\n\n traverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: TraversalDirection;\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n TraversalDirection,\n false,\n false,\n false,\n RecursiveAliases\n > {\n // Validate edge alias to prevent SQL injection\n validateSqlIdentifier(edgeAlias);\n\n const direction = options?.direction ?? \"out\";\n const expansion = options?.expand ?? this.#config.defaultTraversalExpansion;\n const includeImplyingEdges =\n expansion === \"implying\" || expansion === \"all\";\n const includeInverseEdges = expansion === \"inverse\" || expansion === \"all\";\n // Use explicit `from` if provided, otherwise chain from currentAlias\n const fromAlias = options?.from ?? this.#state.currentAlias;\n\n // Expand edge kinds if including implying edges\n const edgeKinds = this.#expandTraversalEdgeKinds(\n edgeKind,\n includeImplyingEdges,\n );\n const inverseEdgeKinds =\n includeInverseEdges ?\n this.#expandInverseTraversalEdgeKinds(edgeKinds, includeImplyingEdges)\n : [];\n\n return new TraversalBuilder(\n this.#config,\n this.#state,\n edgeKinds,\n edgeAlias,\n direction,\n fromAlias,\n inverseEdgeKinds,\n false,\n );\n }\n\n /**\n * Optionally traverses an edge to another node (LEFT JOIN semantics).\n * If no matching edge/node exists, the result will include null values.\n *\n * By default, traverses from the current node (last traversal target, or start node).\n * Use the `from` option to traverse from a different alias (fan-out pattern).\n *\n * @param options.direction - Direction of traversal: \"out\" (default) or \"in\"\n * @param options.expand - Ontology expansion mode for implying/inverse edges\n * @param options.from - Alias to traverse from (defaults to current/last traversal target)\n */\n optionalTraverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: \"out\";\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n \"out\",\n true,\n false,\n false,\n RecursiveAliases\n >;\n\n optionalTraverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options: {\n direction: \"in\";\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n \"in\",\n true,\n false,\n false,\n RecursiveAliases\n >;\n\n optionalTraverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: TraversalDirection;\n expand?: TraversalExpansion;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n TraversalDirection,\n true,\n false,\n false,\n RecursiveAliases\n > {\n // Validate edge alias to prevent SQL injection\n validateSqlIdentifier(edgeAlias);\n\n const direction = options?.direction ?? \"out\";\n const expansion = options?.expand ?? this.#config.defaultTraversalExpansion;\n const includeImplyingEdges =\n expansion === \"implying\" || expansion === \"all\";\n const includeInverseEdges = expansion === \"inverse\" || expansion === \"all\";\n // Use explicit `from` if provided, otherwise chain from currentAlias\n const fromAlias = options?.from ?? this.#state.currentAlias;\n\n // Expand edge kinds if including implying edges\n const edgeKinds = this.#expandTraversalEdgeKinds(\n edgeKind,\n includeImplyingEdges,\n );\n const inverseEdgeKinds =\n includeInverseEdges ?\n this.#expandInverseTraversalEdgeKinds(edgeKinds, includeImplyingEdges)\n : [];\n\n return new TraversalBuilder(\n this.#config,\n this.#state,\n edgeKinds,\n edgeAlias,\n direction,\n fromAlias,\n inverseEdgeKinds,\n true,\n );\n }\n\n /**\n * Selects fields to return.\n */\n select<R>(\n selectFunction: (\n context: SelectContext<Aliases, EdgeAliases, RecursiveAliases>,\n ) => R,\n ): ExecutableQuery<G, Aliases, EdgeAliases, RecursiveAliases, R> {\n // For now, project all fields from all aliases\n // A more sophisticated implementation would parse the selectFn\n\n // Start node fields (including metadata)\n const startFields = buildNodeFields(this.#state.startAlias);\n\n // Traversal node and edge fields (including metadata)\n // Edge fields are in the node's CTE, so we pass the node alias for CTE reference\n const traversalFields = this.#state.traversals.flatMap((traversal) => [\n ...buildEdgeFields(traversal.edgeAlias, traversal.nodeAlias),\n ...buildNodeFields(traversal.nodeAlias),\n ]);\n\n const projection = [...startFields, ...traversalFields];\n\n const newState: QueryBuilderState = {\n ...this.#state,\n projection,\n };\n\n return new ExecutableQuery(this.#config, newState, selectFunction);\n }\n\n /**\n * Selects fields including aggregates.\n * Use with groupBy() for aggregate queries.\n *\n * @param fields - Object mapping output names to field refs or aggregate expressions\n */\n aggregate<R extends Record<string, FieldRef | AggregateExpr>>(\n fields: R,\n ): ExecutableAggregateQuery<G, Aliases, R> {\n const resolvedFields = Object.fromEntries(\n Object.entries(fields).map(([outputName, source]) => {\n if (source.__type !== \"field_ref\") {\n return [outputName, source];\n }\n\n if (\n source.valueType !== undefined ||\n source.path.length !== 1 ||\n source.path[0] !== \"props\" ||\n source.jsonPointer === undefined\n ) {\n return [outputName, source];\n }\n\n const segments = parseJsonPointer(source.jsonPointer);\n if (segments.length !== 1) {\n return [outputName, source];\n }\n\n const propertyName = segments[0];\n if (propertyName === undefined) {\n return [outputName, source];\n }\n\n const kindNames = this.#getKindNamesForAlias(source.alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n propertyName,\n )\n : undefined;\n\n if (!typeInfo) {\n return [outputName, source];\n }\n\n return [\n outputName,\n {\n ...source,\n valueType: typeInfo.valueType,\n elementType: typeInfo.elementType,\n } satisfies FieldRef,\n ];\n }),\n ) as R;\n\n const projection: ProjectedField[] = Object.entries(resolvedFields).map(\n ([outputName, source]) => ({\n outputName,\n source,\n }),\n );\n\n const newState: QueryBuilderState = {\n ...this.#state,\n projection,\n };\n\n return new ExecutableAggregateQuery(this.#config, newState, resolvedFields);\n }\n\n /**\n * Orders results.\n */\n orderBy<A extends keyof Aliases & string>(\n alias: A,\n field: string,\n direction: SortDirection = \"asc\",\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n const kindNames = this.#getKindNamesForAlias(alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(kindNames, field)\n : undefined;\n\n const orderSpec: OrderSpec = {\n field: fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([field]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n }),\n direction,\n };\n\n const newState: QueryBuilderState = {\n ...this.#state,\n orderBy: [...this.#state.orderBy, orderSpec],\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Limits the number of results.\n */\n limit(n: number): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n return new QueryBuilder(this.#config, {\n ...this.#state,\n limit: n,\n });\n }\n\n /**\n * Offsets the results.\n */\n offset(n: number): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n return new QueryBuilder(this.#config, {\n ...this.#state,\n offset: n,\n });\n }\n\n /**\n * Sets temporal mode.\n *\n * @param mode - The temporal mode to use\n * @param asOf - Required timestamp for \"asOf\" mode (ISO 8601 string)\n * @throws ValidationError if mode is \"asOf\" but no timestamp is provided\n */\n temporal(\n mode: TemporalMode,\n asOf?: string,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n if (mode === \"asOf\" && asOf === undefined) {\n throw new ValidationError(\n 'Temporal mode \"asOf\" requires a timestamp',\n {\n issues: [\n { path: \"asOf\", message: \"Timestamp is required for asOf mode\" },\n ],\n },\n {\n suggestion: `Use .temporal(\"asOf\", \"2024-01-15T10:00:00.000Z\") or .temporal(\"current\") for current time.`,\n },\n );\n }\n return new QueryBuilder(this.#config, {\n ...this.#state,\n temporalMode: mode,\n asOf,\n });\n }\n\n /**\n * Groups results by the specified field.\n * Use with aggregate functions like COUNT, SUM, AVG in select().\n *\n * @param alias - The node alias to group by\n * @param field - The field name to group by\n */\n groupBy<A extends keyof Aliases & string>(\n alias: A,\n field: string,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n const kindNames = this.#getKindNamesForAlias(alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(kindNames, field)\n : undefined;\n\n const fieldRefValue: FieldRef = {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n };\n\n const existingFields = this.#state.groupBy?.fields ?? [];\n const newGroupBy: GroupBySpec = {\n fields: [...existingFields, fieldRefValue],\n };\n\n return new QueryBuilder(this.#config, {\n ...this.#state,\n groupBy: newGroupBy,\n });\n }\n\n /**\n * Groups results by the node ID.\n * Use when you want to group by a complete node rather than a specific field.\n *\n * @param alias - The node alias to group by (uses the node's ID)\n */\n groupByNode<A extends keyof Aliases & string>(\n alias: A,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n const fieldRefValue: FieldRef = {\n __type: \"field_ref\",\n alias,\n path: [\"id\"],\n valueType: \"string\",\n };\n\n const existingFields = this.#state.groupBy?.fields ?? [];\n const newGroupBy: GroupBySpec = {\n fields: [...existingFields, fieldRefValue],\n };\n\n return new QueryBuilder(this.#config, {\n ...this.#state,\n groupBy: newGroupBy,\n });\n }\n\n /**\n * Filters grouped results using aggregate conditions (HAVING clause).\n * Use after groupBy() to filter based on aggregate values.\n *\n * @param predicate - A predicate expression to filter groups\n */\n having(\n predicate: PredicateExpression,\n ): QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases> {\n return new QueryBuilder(this.#config, {\n ...this.#state,\n having: predicate,\n });\n }\n\n /**\n * Applies a query fragment to transform this builder.\n *\n * Fragments are reusable query transformations that can add predicates,\n * traversals, ordering, and other query operations. Use this for\n * composing complex queries from simpler, reusable parts.\n *\n * @example\n * ```typescript\n * // Define a reusable fragment\n * const activeUsers = createFragment<MyGraph>()((q) =>\n * q.whereNode(\"u\", ({ status }) => status.eq(\"active\"))\n * );\n *\n * // Apply the fragment\n * const results = await query()\n * .from(\"User\", \"u\")\n * .pipe(activeUsers)\n * .select((ctx) => ctx.u)\n * .execute();\n * ```\n *\n * @param fragment - A function that transforms the builder\n * @returns The transformed builder\n */\n pipe<\n OutAliases extends AliasMap,\n OutEdgeAliases extends EdgeAliasMap = EdgeAliases,\n OutRecAliases extends RecursiveAliasMap = RecursiveAliases,\n >(\n fragment: (\n builder: QueryBuilder<G, Aliases, EdgeAliases, RecursiveAliases>,\n ) => QueryBuilder<G, OutAliases, OutEdgeAliases, OutRecAliases>,\n ): QueryBuilder<G, OutAliases, OutEdgeAliases, OutRecAliases> {\n return fragment(this);\n }\n\n /**\n * Gets all kind names for an alias.\n */\n #getKindNamesForAlias(alias: string): readonly string[] | undefined {\n if (alias === this.#state.startAlias) {\n return this.#state.startKinds;\n }\n for (const traversal of this.#state.traversals) {\n if (traversal.nodeAlias === alias) {\n return traversal.nodeKinds;\n }\n }\n return undefined;\n }\n\n /**\n * Determines the appropriate field builder based on Zod schema type.\n */\n #getFieldBuilderForProperty(\n kindNames: readonly string[] | undefined,\n property: string,\n alias: string,\n ): BaseFieldAccessor {\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n property,\n )\n : undefined;\n\n const ref = fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([property]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n });\n\n return this.#buildFieldBuilderForTypeInfo(ref, typeInfo);\n }\n\n #buildFieldBuilderForTypeInfo(\n ref: ReturnType<typeof fieldRef>,\n typeInfo: FieldTypeInfo | undefined,\n ): BaseFieldAccessor {\n if (!typeInfo) {\n return baseField(ref);\n }\n\n switch (typeInfo.valueType) {\n case \"string\": {\n return stringField(ref);\n }\n case \"number\": {\n return numberField(ref);\n }\n case \"boolean\": {\n return baseField(ref);\n }\n case \"date\": {\n return dateField(ref);\n }\n case \"array\": {\n return arrayField(ref);\n }\n case \"object\": {\n return objectField(ref, { typeInfo });\n }\n case \"embedding\": {\n return embeddingField(ref);\n }\n case \"unknown\": {\n return baseField(ref);\n }\n }\n }\n\n #createNodeAccessor(alias: string): NodeAccessor<NodeType> {\n const kindNames = this.#getKindNamesForAlias(alias);\n const idAccessor = stringField(\n fieldRef(alias, [\"id\"], { valueType: \"string\" }),\n );\n const kindAccessor = stringField(\n fieldRef(alias, [\"kind\"], { valueType: \"string\" }),\n );\n\n // Use a Proxy to provide flattened property access\n return new Proxy({} as NodeAccessor<NodeType>, {\n get: (_, property: string | symbol) => {\n // Handle symbols and special properties to avoid infinite loops\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n // System fields\n if (property === \"id\") return idAccessor;\n if (property === \"kind\") return kindAccessor;\n\n // Schema properties\n return this.#getFieldBuilderForProperty(kindNames, property, alias);\n },\n });\n }\n\n #expandTraversalEdgeKinds(\n edgeKind: keyof G[\"edges\"] & string,\n includeImplyingEdges: boolean,\n ): readonly string[] {\n return includeImplyingEdges ?\n this.#config.registry.expandImplyingEdges(edgeKind)\n : [edgeKind];\n }\n\n #expandInverseTraversalEdgeKinds(\n edgeKinds: readonly string[],\n includeImplyingEdges: boolean,\n ): readonly string[] {\n const inverseKinds = new Set<string>();\n\n for (const kind of edgeKinds) {\n const inverseKind = this.#config.registry.getInverseEdge(kind);\n if (inverseKind === undefined) {\n continue;\n }\n\n inverseKinds.add(inverseKind);\n\n if (!includeImplyingEdges) {\n continue;\n }\n\n for (const implyingKind of this.#config.registry.expandImplyingEdges(\n inverseKind,\n )) {\n inverseKinds.add(implyingKind);\n }\n }\n\n return [...inverseKinds];\n }\n\n /**\n * Gets edge kind names for an edge alias.\n */\n #getEdgeKindNamesForAlias(alias: string): readonly string[] | undefined {\n for (const traversal of this.#state.traversals) {\n if (traversal.edgeAlias === alias) {\n return mergeEdgeKinds(traversal);\n }\n }\n return undefined;\n }\n\n /**\n * Determines the appropriate field builder for an edge property based on Zod schema type.\n */\n #getFieldBuilderForEdgeProperty(\n edgeKindNames: readonly string[] | undefined,\n property: string,\n alias: string,\n ): BaseFieldAccessor {\n const typeInfo =\n edgeKindNames ?\n this.#config.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n edgeKindNames,\n property,\n )\n : undefined;\n\n const ref = fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([property]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n });\n\n return this.#buildFieldBuilderForTypeInfo(ref, typeInfo);\n }\n\n #createEdgeAccessor(alias: string): EdgeAccessor<EdgeType> {\n const edgeKindNames = this.#getEdgeKindNamesForAlias(alias);\n const idAccessor = stringField(\n fieldRef(alias, [\"id\"], { valueType: \"string\" }),\n );\n const kindAccessor = stringField(\n fieldRef(alias, [\"kind\"], { valueType: \"string\" }),\n );\n const fromIdAccessor = stringField(\n fieldRef(alias, [\"from_id\"], { valueType: \"string\" }),\n );\n const toIdAccessor = stringField(\n fieldRef(alias, [\"to_id\"], { valueType: \"string\" }),\n );\n\n // Use a Proxy to provide flattened property access\n return new Proxy({} as EdgeAccessor<EdgeType>, {\n get: (_, property: string | symbol) => {\n // Handle symbols and special properties to avoid infinite loops\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n // System fields\n if (property === \"id\") return idAccessor;\n if (property === \"kind\") return kindAccessor;\n if (property === \"fromId\") return fromIdAccessor;\n if (property === \"toId\") return toIdAccessor;\n\n // Schema properties\n return this.#getFieldBuilderForEdgeProperty(\n edgeKindNames,\n property,\n alias,\n );\n },\n });\n }\n}\n","/**\n * UnionableQuery - A query formed by combining multiple queries with set operations.\n */\nimport { type SQL } from \"drizzle-orm\";\n\nimport { type GraphDef } from \"../../core/define-graph\";\nimport {\n type ComposableQuery,\n type QueryAst,\n type SetOperation,\n type SetOperationType,\n type Traversal,\n} from \"../ast\";\nimport {\n type CompileQueryOptions,\n compileSetOperation,\n} from \"../compiler/index\";\nimport { mapResults } from \"../execution\";\nimport { composableQueryHasParameterReferences } from \"./prepared-query\";\nimport {\n type AliasMap,\n type EdgeAliasMap,\n type QueryBuilderConfig,\n type SelectContext,\n} from \"./types\";\n\nconst NOT_COMPUTED = Symbol(\"NOT_COMPUTED\");\n\n// Forward declaration for ExecutableQuery to avoid circular imports\n// G and R are used for type compatibility with ExecutableQuery but not accessed in the interface body\ninterface ExecutableQueryLike<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Used for type compatibility\n G extends GraphDef,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Used for type compatibility\n R,\n> {\n toAst(): QueryAst;\n}\n\n/**\n * Internal state for unionable query.\n */\ntype UnionableQueryState = Readonly<{\n left: ComposableQuery;\n operator: SetOperationType;\n right: ComposableQuery;\n limit?: number;\n offset?: number;\n // For result transformation\n startAlias?: string;\n traversals?: readonly Traversal[];\n selectFn?: (context: SelectContext<AliasMap, EdgeAliasMap>) => unknown;\n}>;\n\n/**\n * A query formed by combining multiple queries with set operations.\n * Supports chaining: q1.union(q2).intersect(q3)\n */\nexport class UnionableQuery<G extends GraphDef, R> {\n readonly #config: QueryBuilderConfig;\n readonly #state: UnionableQueryState;\n #cachedCompiled: SQL | typeof NOT_COMPUTED = NOT_COMPUTED;\n\n constructor(config: QueryBuilderConfig, state: UnionableQueryState) {\n this.#config = config;\n this.#state = state;\n }\n\n /**\n * Combines with another query using UNION.\n */\n union(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"union\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Combines with another query using UNION ALL.\n */\n unionAll(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"unionAll\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Combines with another query using INTERSECT.\n */\n intersect(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"intersect\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Combines with another query using EXCEPT.\n */\n except(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"except\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Limits the number of results from the combined query.\n */\n limit(n: number): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, { ...this.#state, limit: n });\n }\n\n /**\n * Offsets the results from the combined query.\n */\n offset(n: number): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, { ...this.#state, offset: n });\n }\n\n /**\n * Builds the set operation AST.\n */\n toAst(): SetOperation {\n return {\n __type: \"set_operation\",\n operator: this.#state.operator,\n left: this.#state.left,\n right: this.#state.right,\n ...(this.#state.limit !== undefined && { limit: this.#state.limit }),\n ...(this.#state.offset !== undefined && { offset: this.#state.offset }),\n };\n }\n\n /**\n * Compiles the query and returns the SQL text and parameters.\n *\n * Requires a backend to be configured (the backend determines the SQL dialect).\n * Use this for debugging, logging, or running the query with a custom executor.\n */\n toSQL(): Readonly<{ sql: string; params: readonly unknown[] }> {\n if (!this.#config.backend?.compileSql) {\n throw new Error(\n \"Cannot convert to SQL: no backend configured or backend does not support compileSql. \" +\n \"Use store.query() to get a backend-aware query builder.\",\n );\n }\n return this.#config.backend.compileSql(this.compile());\n }\n\n /**\n * Compiles the set operation to SQL.\n */\n compile(): SQL {\n if (this.#cachedCompiled !== NOT_COMPUTED) {\n return this.#cachedCompiled;\n }\n\n const compiled = compileSetOperation(\n this.toAst(),\n this.#config.graphId,\n this.#compileOptions(),\n );\n this.#cachedCompiled = compiled;\n return compiled;\n }\n\n /**\n * Builds compile options from the config.\n */\n #compileOptions(): CompileQueryOptions {\n return {\n dialect: this.#config.dialect ?? \"sqlite\",\n schema: this.#config.schema,\n };\n }\n\n /**\n * Executes the combined query.\n */\n async execute(): Promise<readonly R[]> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n if (composableQueryHasParameterReferences(this.toAst())) {\n throw new Error(\n \"Query contains param() references. Use .prepare().execute({...}) instead of .execute().\",\n );\n }\n\n const compiled = this.compile();\n const rows =\n await this.#config.backend.execute<Record<string, unknown>>(compiled);\n\n // Apply select function transformation if available\n if (this.#state.selectFn && this.#state.startAlias) {\n return mapResults(\n rows,\n this.#state.startAlias,\n this.#state.traversals ?? [],\n this.#state.selectFn,\n ) as readonly R[];\n }\n\n return rows as readonly R[];\n }\n}\n","/**\n * Aggregate and HAVING Helper Functions\n *\n * Provides factory functions for creating aggregate expressions (COUNT, SUM, etc.)\n * and HAVING clause predicates for use in GROUP BY queries.\n */\nimport {\n type AggregateComparisonPredicate,\n type AggregateExpr,\n type ComparisonOp,\n type FieldRef,\n} from \"../ast\";\nimport { jsonPointer } from \"../json-pointer\";\n\n// ============================================================\n// Aggregate Helpers\n// ============================================================\n\n/**\n * Creates a COUNT aggregate expression.\n *\n * @param alias - The node alias to count\n * @param field - Optional field to count (defaults to counting nodes by ID)\n *\n * @example\n * ```typescript\n * // COUNT all persons\n * count(\"p\")\n *\n * // COUNT persons with email field\n * count(\"p\", \"email\")\n * ```\n */\nexport function count(alias: string, field?: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"count\",\n field: {\n __type: \"field_ref\",\n alias,\n path: field ? [\"props\"] : [\"id\"],\n jsonPointer: field ? jsonPointer([field]) : undefined,\n valueType: field ? undefined : \"string\",\n },\n };\n}\n\n/**\n * Creates a COUNT DISTINCT aggregate expression.\n *\n * @param alias - The node alias to count\n * @param field - Optional field to count distinct values of\n */\nexport function countDistinct(alias: string, field?: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"countDistinct\",\n field: {\n __type: \"field_ref\",\n alias,\n path: field ? [\"props\"] : [\"id\"],\n jsonPointer: field ? jsonPointer([field]) : undefined,\n valueType: field ? undefined : \"string\",\n },\n };\n}\n\n/**\n * Creates a SUM aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The numeric field to sum\n */\nexport function sum(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"sum\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates an AVG aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The numeric field to average\n */\nexport function avg(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"avg\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates a MIN aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The field to find minimum of\n */\nexport function min(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"min\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates a MAX aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The field to find maximum of\n */\nexport function max(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"max\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates a field reference for use in aggregate.\n *\n * @param alias - The node alias\n * @param path - Path to the field. Use \"id\" for node ID, \"kind\" for node kind,\n * or the property name directly (e.g., \"title\", \"year\").\n *\n * @example\n * ```typescript\n * field(\"p\", \"id\") // Node ID\n * field(\"p\", \"kind\") // Node kind\n * field(\"p\", \"title\") // Property field\n * field(\"p\", \"nested\", \"field\") // Nested property\n * ```\n */\nexport function field(alias: string, ...path: string[]): FieldRef {\n if (path.length === 0 || path[0] === \"id\") {\n return {\n __type: \"field_ref\",\n alias,\n path: [\"id\"],\n valueType: \"string\",\n };\n }\n if (path[0] === \"kind\") {\n return {\n __type: \"field_ref\",\n alias,\n path: [\"kind\"],\n valueType: \"string\",\n };\n }\n if (path[0] === \"props\") {\n throw new Error(\n `field(): Do not include \"props\" in the path. Use field(\"${alias}\", ${path\n .slice(1)\n .map((p) => `\"${p}\"`)\n .join(\", \")}) instead.`,\n );\n }\n return {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer(path),\n };\n}\n\n// ============================================================\n// HAVING Helpers\n// ============================================================\n\n/**\n * Creates a HAVING predicate that compares an aggregate to a value.\n *\n * @param aggregate - The aggregate expression (count, sum, avg, etc.)\n * @param op - The comparison operator\n * @param value - The value to compare against\n *\n * @example\n * ```typescript\n * // HAVING COUNT(*) > 10\n * having(count(\"p\"), \"gt\", 10)\n *\n * // HAVING AVG(salary) >= 50000\n * having(avg(\"p\", \"salary\"), \"gte\", 50000)\n * ```\n */\nexport function having(\n aggregate: AggregateExpr,\n op: ComparisonOp,\n value: number | string | boolean,\n): AggregateComparisonPredicate {\n return {\n __type: \"aggregate_comparison\",\n op,\n aggregate,\n value: {\n __type: \"literal\",\n value,\n valueType: typeof value === \"number\" ? \"number\" : \"string\",\n },\n };\n}\n\n/**\n * Creates a HAVING predicate: aggregate > value\n */\nexport function havingGt(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"gt\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate >= value\n */\nexport function havingGte(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"gte\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate < value\n */\nexport function havingLt(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"lt\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate <= value\n */\nexport function havingLte(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"lte\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate = value\n */\nexport function havingEq(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"eq\", value);\n}\n","/**\n * Query Fragment Composition\n *\n * Provides types and utilities for creating reusable query fragments\n * that can be composed together using the pipe() method.\n *\n * @example\n * ```typescript\n * // Define a reusable fragment\n * const activeUsers = createFragment<MyGraph>()((q) =>\n * q.whereNode(\"u\", ({ status }) => status.eq(\"active\"))\n * );\n *\n * // Use in queries\n * const results = await query()\n * .from(\"User\", \"u\")\n * .pipe(activeUsers)\n * .select((ctx) => ctx.u)\n * .execute();\n * ```\n */\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type QueryBuilder } from \"./query-builder\";\nimport { type TraversalBuilder } from \"./traversal-builder\";\nimport { type AliasMap, type EdgeAliasMap } from \"./types\";\n\n// ============================================================\n// Fragment Types\n// ============================================================\n\n/**\n * A query fragment that transforms a QueryBuilder.\n *\n * Fragments are functions that take a builder and return a modified builder.\n * They can add predicates, traversals, ordering, and other query operations.\n *\n * @typeParam G - The graph definition\n * @typeParam InAliases - Input alias map (what the fragment requires)\n * @typeParam OutAliases - Output alias map (what the fragment produces)\n * @typeParam InEdgeAliases - Input edge alias map\n * @typeParam OutEdgeAliases - Output edge alias map\n */\nexport type QueryFragment<\n G extends GraphDef,\n InAliases extends AliasMap = AliasMap,\n OutAliases extends AliasMap = InAliases,\n InEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n OutEdgeAliases extends EdgeAliasMap = InEdgeAliases,\n> = (\n builder: QueryBuilder<G, InAliases, InEdgeAliases>,\n) => QueryBuilder<G, OutAliases, OutEdgeAliases>;\n\n/**\n * A flexible query fragment that works with any compatible builder.\n *\n * Use this when you want a fragment that only requires certain aliases\n * to exist, but doesn't care about other aliases that may be present.\n */\nexport type FlexibleQueryFragment<\n G extends GraphDef,\n RequiredAliases extends AliasMap = AliasMap,\n AddedAliases extends AliasMap = AliasMap,\n RequiredEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n AddedEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n> = <Aliases extends RequiredAliases, EdgeAliases extends RequiredEdgeAliases>(\n builder: QueryBuilder<G, Aliases, EdgeAliases>,\n) => QueryBuilder<G, Aliases & AddedAliases, EdgeAliases & AddedEdgeAliases>;\n\n/**\n * A traversal fragment that transforms a TraversalBuilder.\n *\n * Use this for reusable traversal patterns including edge filtering,\n * recursive traversals, and path collection.\n */\nexport type TraversalFragment<\n G extends GraphDef,\n EK extends keyof G[\"edges\"] & string,\n EA extends string,\n InAliases extends AliasMap = AliasMap,\n InEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n> = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Direction type is context-dependent\n builder: TraversalBuilder<G, InAliases, InEdgeAliases, EK, EA, any>,\n) => unknown;\n\n// ============================================================\n// Fragment Factory\n// ============================================================\n\n/**\n * Creates a typed query fragment factory for a specific graph.\n *\n * This is the recommended way to create reusable fragments with full type safety.\n * The factory returns a function that creates fragments bound to your graph type.\n *\n * @example\n * ```typescript\n * // Create a factory for your graph\n * const fragment = createFragment<MyGraph>();\n *\n * // Define a simple filter fragment\n * const activeOnly = fragment((q) =>\n * q.whereNode(\"u\", ({ isActive }) => isActive.eq(true))\n * );\n *\n * // Define a traversal fragment\n * const withManager = fragment((q) =>\n * q.traverse(\"reportsTo\", \"r\").to(\"User\", \"manager\")\n * );\n *\n * // Compose fragments\n * query()\n * .from(\"User\", \"u\")\n * .pipe(activeOnly)\n * .pipe(withManager)\n * .select((ctx) => ({ user: ctx.u, manager: ctx.manager }))\n * ```\n */\n/**\n * Identity function used by createFragment to return the fragment unchanged.\n * Defined at module scope to satisfy consistent-function-scoping lint rule.\n */\nfunction fragmentIdentity<\n G extends GraphDef,\n InAliases extends AliasMap,\n OutAliases extends AliasMap,\n InEdgeAliases extends EdgeAliasMap,\n OutEdgeAliases extends EdgeAliasMap,\n>(\n fn: (\n builder: QueryBuilder<G, InAliases, InEdgeAliases>,\n ) => QueryBuilder<G, OutAliases, OutEdgeAliases>,\n): QueryFragment<G, InAliases, OutAliases, InEdgeAliases, OutEdgeAliases> {\n return fn;\n}\n\nexport function createFragment<G extends GraphDef>(): <\n InAliases extends AliasMap,\n OutAliases extends AliasMap,\n InEdgeAliases extends EdgeAliasMap,\n OutEdgeAliases extends EdgeAliasMap,\n>(\n fn: (\n builder: QueryBuilder<G, InAliases, InEdgeAliases>,\n ) => QueryBuilder<G, OutAliases, OutEdgeAliases>,\n) => QueryFragment<G, InAliases, OutAliases, InEdgeAliases, OutEdgeAliases> {\n return fragmentIdentity;\n}\n\n/**\n * Combines multiple fragments into a single fragment.\n *\n * Fragments are applied in order from left to right.\n *\n * @example\n * ```typescript\n * const combinedFragment = composeFragments(\n * activeOnly,\n * withManager,\n * recentlyUpdated\n * );\n *\n * query()\n * .from(\"User\", \"u\")\n * .pipe(combinedFragment)\n * .select(...)\n * ```\n */\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n>(f1: QueryFragment<G, A1, A2, E1, E2>): QueryFragment<G, A1, A2, E1, E2>;\n\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n A3 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n E3 extends EdgeAliasMap,\n>(\n f1: QueryFragment<G, A1, A2, E1, E2>,\n f2: QueryFragment<G, A2, A3, E2, E3>,\n): QueryFragment<G, A1, A3, E1, E3>;\n\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n A3 extends AliasMap,\n A4 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n E3 extends EdgeAliasMap,\n E4 extends EdgeAliasMap,\n>(\n f1: QueryFragment<G, A1, A2, E1, E2>,\n f2: QueryFragment<G, A2, A3, E2, E3>,\n f3: QueryFragment<G, A3, A4, E3, E4>,\n): QueryFragment<G, A1, A4, E1, E4>;\n\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n A3 extends AliasMap,\n A4 extends AliasMap,\n A5 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n E3 extends EdgeAliasMap,\n E4 extends EdgeAliasMap,\n E5 extends EdgeAliasMap,\n>(\n f1: QueryFragment<G, A1, A2, E1, E2>,\n f2: QueryFragment<G, A2, A3, E2, E3>,\n f3: QueryFragment<G, A3, A4, E3, E4>,\n f4: QueryFragment<G, A4, A5, E4, E5>,\n): QueryFragment<G, A1, A5, E1, E5>;\n\nexport function composeFragments<G extends GraphDef>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Variadic composition requires any\n ...fragments: QueryFragment<G, any, any, any, any>[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Return type depends on input types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => {\n let result = builder;\n for (const fragment of fragments) {\n result = fragment(result);\n }\n return result;\n };\n}\n\n// ============================================================\n// Common Fragment Patterns\n// ============================================================\n\n/**\n * Creates a fragment that adds ordering.\n *\n * @example\n * ```typescript\n * const byCreatedAt = orderByFragment<MyGraph, \"u\">(\"u\", \"createdAt\", \"desc\");\n * ```\n */\nexport function orderByFragment<G extends GraphDef, A extends string>(\n alias: A,\n field: string,\n direction: \"asc\" | \"desc\" = \"asc\",\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Flexible alias types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => builder.orderBy(alias, field, direction);\n}\n\n/**\n * Creates a fragment that adds a limit.\n *\n * @example\n * ```typescript\n * const first10 = limitFragment<MyGraph>(10);\n * ```\n */\nexport function limitFragment<G extends GraphDef>(\n n: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Flexible alias types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => builder.limit(n);\n}\n\n/**\n * Creates a fragment that adds an offset.\n *\n * @example\n * ```typescript\n * const skip10 = offsetFragment<MyGraph>(10);\n * ```\n */\nexport function offsetFragment<G extends GraphDef>(\n n: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Flexible alias types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => builder.offset(n);\n}\n","/**\n * Query Builder Module\n *\n * Re-exports from the builder submodules for clean imports.\n * Also wires up circular dependencies between classes.\n */\n\n// Import classes for circular dependency wiring\nimport { setUnionableQueryClass } from \"./executable-query\";\nimport { QueryBuilder } from \"./query-builder\";\nimport { setQueryBuilderClass } from \"./traversal-builder\";\nimport { UnionableQuery } from \"./unionable-query\";\n\n// Wire up circular dependencies.\n// Type assertions are needed because the circular dependency resolution\n// requires passing classes that TypeScript can't verify at module init time.\nsetQueryBuilderClass(\n QueryBuilder as unknown as Parameters<typeof setQueryBuilderClass>[0],\n);\nsetUnionableQueryClass(\n UnionableQuery as unknown as Parameters<typeof setUnionableQueryClass>[0],\n);\n\n// Classes\nexport {\n type AggregateResult,\n ExecutableAggregateQuery,\n} from \"./executable-aggregate-query\";\nexport { ExecutableQuery } from \"./executable-query\";\nexport { PreparedQuery } from \"./prepared-query\";\nexport { QueryBuilder } from \"./query-builder\";\nexport { TraversalBuilder } from \"./traversal-builder\";\nexport { UnionableQuery } from \"./unionable-query\";\n\n// Aggregate helpers\nexport {\n avg,\n count,\n countDistinct,\n field,\n having,\n havingEq,\n havingGt,\n havingGte,\n havingLt,\n havingLte,\n max,\n min,\n sum,\n} from \"./aggregates\";\n\n// Fragment composition\nexport {\n composeFragments,\n createFragment,\n type FlexibleQueryFragment,\n limitFragment,\n offsetFragment,\n orderByFragment,\n type QueryFragment,\n type TraversalFragment,\n} from \"./fragment\";\n\n// AST building utilities\nexport { buildQueryAst } from \"./ast-builder\";\n\n// Types\nexport {\n type AliasMap,\n type ArrayFieldAccessor,\n type BaseFieldAccessor,\n type BooleanFieldAccessor,\n type CreateQueryBuilderOptions,\n type DateFieldAccessor,\n type EdgeAccessor,\n type EmbeddingFieldAccessor,\n type FieldAccessor,\n type NodeAccessor,\n type NodeAlias,\n type NumberFieldAccessor,\n type ObjectFieldAccessor,\n type PaginatedResult,\n type PaginateOptions,\n type PropsAccessor,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type RecursiveAlias,\n type RecursiveAliasMap,\n type RecursiveAliasValue,\n type RecursiveTraversalOptions,\n type SelectableEdge,\n type SelectableNode,\n type SelectContext,\n type StreamOptions,\n type StringFieldAccessor,\n type TraversalExpansion,\n type UniqueAlias,\n type ValidEdgeTargets,\n} from \"./types\";\n\n// Validation utilities\nexport { validateSqlIdentifier } from \"./validation\";\n","/**\n * Fluent query builder for TypeGraph.\n *\n * Provides a type-safe, chainable API for building queries.\n * Each method returns a new builder instance with expanded type information.\n *\n * This module re-exports from the builder submodules and provides the\n * createQueryBuilder factory function.\n */\nimport { type GraphDef } from \"../core/define-graph\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\nimport {\n type CreateQueryBuilderOptions,\n QueryBuilder,\n type QueryBuilderConfig,\n type QueryBuilderState,\n} from \"./builder/index\";\nimport { createSchemaIntrospector } from \"./schema-introspector\";\n\n// Re-export all classes\nexport {\n ExecutableAggregateQuery,\n ExecutableQuery,\n QueryBuilder,\n} from \"./builder/index\";\n\n// Re-export aggregate helpers\nexport {\n avg,\n count,\n countDistinct,\n field,\n having,\n havingEq,\n havingGt,\n havingGte,\n havingLt,\n havingLte,\n max,\n min,\n sum,\n} from \"./builder/index\";\n\n// Re-export types\nexport type {\n AggregateResult,\n AliasMap,\n EdgeAccessor,\n FieldAccessor,\n NodeAccessor,\n NodeAlias,\n PaginatedResult,\n PaginateOptions,\n PropsAccessor,\n RecursiveTraversalOptions,\n SelectableEdge,\n SelectableNode,\n SelectContext,\n StreamOptions,\n TraversalExpansion,\n} from \"./builder/index\";\n\n// ============================================================\n// Factory Function\n// ============================================================\n\n/**\n * Creates a new query builder for a graph.\n *\n * @param graphId - The graph identifier\n * @param registry - The kind registry for ontology lookups\n * @param options - Optional backend and dialect configuration\n * @returns A new QueryBuilder instance\n *\n * @example\n * ```typescript\n * // Without execution capability (compile only)\n * const builder = createQueryBuilder<MyGraph>(\"my_graph\", registry);\n *\n * // With execution capability\n * const builder = createQueryBuilder<MyGraph>(\"my_graph\", registry, {\n * backend: myBackend,\n * dialect: \"sqlite\",\n * });\n * ```\n */\nexport function createQueryBuilder<G extends GraphDef>(\n graphId: string,\n registry: KindRegistry,\n options?: CreateQueryBuilderOptions,\n): QueryBuilder<G> {\n const schemaIntrospector = createSchemaIntrospector(\n registry.nodeKinds,\n registry.edgeKinds,\n );\n\n // Build config, only including optional properties if defined\n const config: QueryBuilderConfig = {\n graphId,\n registry,\n schemaIntrospector,\n defaultTraversalExpansion: options?.defaultTraversalExpansion ?? \"inverse\",\n ...(options?.backend !== undefined && { backend: options.backend }),\n ...(options?.dialect !== undefined && { dialect: options.dialect }),\n ...(options?.schema !== undefined && { schema: options.schema }),\n };\n\n const initialState: QueryBuilderState = {\n startAlias: \"\",\n currentAlias: \"\",\n startKinds: [],\n includeSubClasses: false,\n traversals: [],\n predicates: [],\n projection: [],\n orderBy: [],\n limit: undefined,\n offset: undefined,\n temporalMode: \"current\",\n asOf: undefined,\n groupBy: undefined,\n having: undefined,\n };\n\n return new QueryBuilder(config, initialState);\n}\n","/**\n * Builder functions for creating KindRegistry from GraphDef.\n */\nimport {\n getEdgeKinds,\n getNodeKinds,\n type GraphDef,\n} from \"../core/define-graph\";\nimport {\n type AnyEdgeType,\n type EdgeRegistration,\n type NodeRegistration,\n type NodeType,\n} from \"../core/types\";\nimport {\n computeClosuresFromOntology,\n createEmptyClosures,\n KindRegistry,\n} from \"./kind-registry\";\n\n// ============================================================\n// Build Registry from GraphDef\n// ============================================================\n\n/**\n * Builds a KindRegistry from a GraphDef.\n *\n * This precomputes all transitive closures for efficient runtime queries.\n *\n * @example\n * ```typescript\n * const graph = defineGraph({\n * id: \"my_graph\",\n * nodes: { Person: { type: Person }, Company: { type: Company } },\n * edges: { worksAt: { type: worksAt, from: [Person], to: [Company] } },\n * ontology: [subClassOf(Company, Organization)],\n * });\n *\n * const registry = buildKindRegistry(graph);\n * registry.isSubClassOf(\"Company\", \"Organization\"); // true\n * ```\n */\nexport function buildKindRegistry<G extends GraphDef>(graph: G): KindRegistry {\n // Extract node types\n const nodeTypes = extractNodeTypes(graph);\n\n // Extract edge types\n const edgeTypes = extractEdgeTypes(graph);\n\n // Compute closures from ontology\n const closures =\n graph.ontology.length > 0 ?\n computeClosuresFromOntology(graph.ontology)\n : createEmptyClosures();\n\n return new KindRegistry(nodeTypes, edgeTypes, closures);\n}\n\n// ============================================================\n// Node Kind Extraction\n// ============================================================\n\n/**\n * Extracts all node types from a GraphDef into a Map.\n */\nfunction extractNodeTypes<G extends GraphDef>(\n graph: G,\n): ReadonlyMap<string, NodeType> {\n const result = new Map<string, NodeType>();\n\n for (const typeName of getNodeKinds(graph)) {\n const registration = graph.nodes[typeName] as NodeRegistration;\n result.set(typeName, registration.type);\n }\n\n return result;\n}\n\n// ============================================================\n// Edge Type Extraction\n// ============================================================\n\n/**\n * Extracts all edge types from a GraphDef into a Map.\n */\nfunction extractEdgeTypes<G extends GraphDef>(\n graph: G,\n): ReadonlyMap<string, AnyEdgeType> {\n const result = new Map<string, AnyEdgeType>();\n\n for (const typeName of getEdgeKinds(graph)) {\n const registration = graph.edges[typeName] as EdgeRegistration;\n result.set(typeName, registration.type);\n }\n\n return result;\n}\n","/**\n * EdgeCollection implementation.\n *\n * Provides an ergonomic API for CRUD operations on a specific edge type.\n */\nimport { type z } from \"zod\";\n\nimport {\n type GraphBackend,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type AnyEdgeType, type TemporalMode } from \"../../core/types\";\nimport { UnsupportedPredicateError } from \"../../errors\";\nimport { type QueryBuilder } from \"../../query/builder\";\nimport { nowIso } from \"../../utils/date\";\nimport { type EdgeRow } from \"../row-mappers\";\nimport {\n type CreateEdgeInput,\n type Edge,\n type EdgeCollection,\n type EdgeFindByEndpointsOptions,\n type EdgeGetOrCreateByEndpointsOptions,\n type EdgeGetOrCreateByEndpointsResult,\n type GetOrCreateAction,\n type IfExistsMode,\n type NodeRef,\n type QueryOptions,\n} from \"../types\";\n\n/**\n * Narrows unparameterized Edge to Edge<E>.\n * Safe: props are validated by Zod at creation/update boundaries.\n */\nfunction narrowEdge<E extends AnyEdgeType>(edge: Edge): Edge<E> {\n return edge as Edge<E>;\n}\n\n/**\n * Narrows a readonly Edge array to Edge<E>[].\n */\nfunction narrowEdges<E extends AnyEdgeType>(edges: readonly Edge[]): Edge<E>[] {\n return edges as Edge<E>[];\n}\n\n/**\n * Config for creating an EdgeCollection.\n */\nexport type EdgeCollectionConfig = Readonly<{\n graphId: string;\n kind: string;\n backend: GraphBackend | TransactionBackend;\n defaultTemporalMode: TemporalMode;\n rowToEdge: (row: EdgeRow) => Edge;\n executeCreate: (\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>;\n executeCreateNoReturnBatch: (\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeCreateBatch: (\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<readonly Edge[]>;\n executeUpdate: (\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>;\n executeUpsertUpdate: (\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Edge>;\n executeDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeHardDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n matchesTemporalMode: (row: EdgeRow, options?: QueryOptions) => boolean;\n createQuery?: () => QueryBuilder<GraphDef>;\n executeGetOrCreateByEndpoints: (\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n ) => Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>>;\n executeBulkGetOrCreateByEndpoints: (\n kind: string,\n items: readonly Readonly<{\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n }>[],\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n ) => Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>[]>;\n executeFindByEndpoints: (\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n props?: Record<string, unknown>;\n }>,\n ) => Promise<Edge | undefined>;\n}>;\n\nfunction mapBulkEdgeInputs(\n kind: string,\n items: readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props?: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n): CreateEdgeInput[] {\n return items.map((item) => {\n const input: {\n kind: string;\n id?: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind,\n fromKind: item.from.kind,\n fromId: item.from.id,\n toKind: item.to.kind,\n toId: item.to.id,\n props: item.props ?? {},\n };\n if (item.id !== undefined) input.id = item.id;\n if (item.validFrom !== undefined) input.validFrom = item.validFrom;\n if (item.validTo !== undefined) input.validTo = item.validTo;\n return input;\n });\n}\n\n/**\n * Creates an EdgeCollection for a specific edge type.\n */\nexport function createEdgeCollection<\n G extends GraphDef,\n K extends keyof G[\"edges\"] & string,\n>(config: EdgeCollectionConfig): EdgeCollection<G[\"edges\"][K][\"type\"]> {\n type E = G[\"edges\"][K][\"type\"];\n\n const {\n graphId,\n kind,\n backend,\n defaultTemporalMode,\n rowToEdge,\n executeCreate: executeEdgeCreate,\n executeCreateNoReturnBatch: executeEdgeCreateNoReturnBatch,\n executeCreateBatch: executeEdgeCreateBatch,\n executeUpdate: executeEdgeUpdate,\n executeUpsertUpdate: executeEdgeUpsertUpdate,\n executeDelete: executeEdgeDelete,\n executeHardDelete: executeEdgeHardDelete,\n matchesTemporalMode,\n } = config;\n\n return {\n async create(\n from: NodeRef,\n to: NodeRef,\n props?: z.input<E[\"schema\"]>,\n options?: Readonly<{ id?: string; validFrom?: string; validTo?: string }>,\n ): Promise<Edge<E>> {\n const input: {\n kind: string;\n id?: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n fromKind: from.kind,\n fromId: from.id,\n toKind: to.kind,\n toId: to.id,\n props: (props ?? {}) as Record<string, unknown>,\n };\n if (options?.id !== undefined) input.id = options.id;\n if (options?.validFrom !== undefined) input.validFrom = options.validFrom;\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeEdgeCreate(input, backend);\n return narrowEdge<E>(result);\n },\n\n async getById(\n id: string,\n options?: QueryOptions,\n ): Promise<Edge<E> | undefined> {\n const row = await backend.getEdge(graphId, id);\n if (!row) return undefined;\n if (row.kind !== kind) return undefined; // Edge is a different type\n if (!matchesTemporalMode(row, options)) return undefined;\n return narrowEdge<E>(rowToEdge(row));\n },\n\n async getByIds(\n ids: readonly string[],\n options?: QueryOptions,\n ): Promise<readonly (Edge<E> | undefined)[]> {\n if (ids.length === 0) return [];\n\n if (backend.getEdges !== undefined) {\n const rows = await backend.getEdges(graphId, ids);\n const rowMap = new Map<string, (typeof rows)[number]>();\n for (const row of rows) {\n rowMap.set(row.id, row);\n }\n return ids.map((id) => {\n const row = rowMap.get(id);\n if (!row) return;\n if (row.kind !== kind) return;\n if (!matchesTemporalMode(row, options)) return;\n return narrowEdge<E>(rowToEdge(row));\n });\n }\n\n return Promise.all(\n ids.map(async (id) => {\n const row = await backend.getEdge(graphId, id);\n if (!row) return;\n if (row.kind !== kind) return;\n if (!matchesTemporalMode(row, options)) return;\n return narrowEdge<E>(rowToEdge(row));\n }),\n );\n },\n\n async update(\n id: string,\n props: Partial<z.input<E[\"schema\"]>>,\n options?: Readonly<{ validTo?: string }>,\n ): Promise<Edge<E>> {\n const input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n id,\n props: props as Partial<Record<string, unknown>>,\n };\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeEdgeUpdate(input, backend);\n return narrowEdge<E>(result);\n },\n\n async findFrom(from: NodeRef): Promise<Edge<E>[]> {\n const rows = await backend.findEdgesByKind({\n graphId,\n kind,\n fromKind: from.kind,\n fromId: from.id,\n excludeDeleted: true,\n });\n return rows.map((row) => narrowEdge<E>(rowToEdge(row)));\n },\n\n async findTo(to: NodeRef): Promise<Edge<E>[]> {\n const rows = await backend.findEdgesByKind({\n graphId,\n kind,\n toKind: to.kind,\n toId: to.id,\n excludeDeleted: true,\n });\n return rows.map((row) => narrowEdge<E>(rowToEdge(row)));\n },\n\n async delete(id: string): Promise<void> {\n await executeEdgeDelete(id, backend);\n },\n\n async hardDelete(id: string): Promise<void> {\n await executeEdgeHardDelete(id, backend);\n },\n\n async find(\n options?: Readonly<{\n from?: NodeRef;\n to?: NodeRef;\n limit?: number;\n offset?: number;\n temporalMode?: TemporalMode;\n asOf?: string;\n }>,\n ): Promise<Edge<E>[]> {\n const untypedOptions = options as\n | Readonly<{ where?: unknown }>\n | undefined;\n if (untypedOptions?.where !== undefined) {\n throw new UnsupportedPredicateError(\n `store.edges.${kind}.find({ where }) is not supported. ` +\n `Use store.query().traverse(...).whereEdge(...) for edge property filters.`,\n { kind, operation: \"find\" },\n );\n }\n\n const mode = options?.temporalMode ?? defaultTemporalMode;\n const params: {\n graphId: string;\n kind: string;\n fromKind?: string;\n fromId?: string;\n toKind?: string;\n toId?: string;\n limit?: number;\n offset?: number;\n excludeDeleted: boolean;\n temporalMode: TemporalMode;\n asOf?: string;\n } = {\n graphId,\n kind,\n excludeDeleted: mode !== \"includeTombstones\",\n temporalMode: mode,\n };\n if (mode === \"current\" || mode === \"asOf\") {\n params.asOf = options?.asOf ?? nowIso();\n }\n if (options?.from?.kind !== undefined)\n params.fromKind = options.from.kind;\n if (options?.from?.id !== undefined) params.fromId = options.from.id;\n if (options?.to?.kind !== undefined) params.toKind = options.to.kind;\n if (options?.to?.id !== undefined) params.toId = options.to.id;\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.offset !== undefined) params.offset = options.offset;\n\n const rows = await backend.findEdgesByKind(params);\n return rows.map((row) => narrowEdge<E>(rowToEdge(row)));\n },\n\n async count(\n options?: Readonly<{\n from?: NodeRef;\n to?: NodeRef;\n temporalMode?: TemporalMode;\n asOf?: string;\n }>,\n ): Promise<number> {\n const mode = options?.temporalMode ?? defaultTemporalMode;\n const params: {\n graphId: string;\n kind: string;\n fromKind?: string;\n fromId?: string;\n toKind?: string;\n toId?: string;\n excludeDeleted: boolean;\n temporalMode: TemporalMode;\n asOf?: string;\n } = {\n graphId,\n kind,\n excludeDeleted: mode !== \"includeTombstones\",\n temporalMode: mode,\n };\n if (mode === \"current\" || mode === \"asOf\") {\n params.asOf = options?.asOf ?? nowIso();\n }\n if (options?.from?.kind !== undefined)\n params.fromKind = options.from.kind;\n if (options?.from?.id !== undefined) params.fromId = options.from.id;\n if (options?.to?.kind !== undefined) params.toKind = options.to.kind;\n if (options?.to?.id !== undefined) params.toId = options.to.id;\n\n return backend.countEdgesByKind(params);\n },\n\n async bulkCreate(\n items: readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props?: z.input<E[\"schema\"]>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<Edge<E>[]> {\n const batchInputs = mapBulkEdgeInputs(\n kind,\n items as readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props?: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n );\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n const results = await backend.transaction(async (txBackend) =>\n executeEdgeCreateBatch(batchInputs, txBackend),\n );\n return narrowEdges<E>(results);\n }\n const results = await executeEdgeCreateBatch(batchInputs, backend);\n return narrowEdges<E>(results);\n },\n\n async bulkUpsertById(\n items: readonly Readonly<{\n id: string;\n from: NodeRef;\n to: NodeRef;\n props?: z.input<E[\"schema\"]>;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<Edge<E>[]> {\n if (items.length === 0) return [];\n\n const upsertAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<Edge<E>[]> => {\n const ids = items.map((item) => item.id);\n const existingMap = new Map<\n string,\n { deleted_at: string | undefined }\n >();\n\n if (target.getEdges === undefined) {\n const rows = await Promise.all(\n ids.map((id) => target.getEdge(graphId, id)),\n );\n for (const row of rows) {\n if (row !== undefined) existingMap.set(row.id, row);\n }\n } else {\n const rows = await target.getEdges(graphId, ids);\n for (const row of rows) {\n existingMap.set(row.id, row);\n }\n }\n\n // Bucket items into creates and updates\n const toCreate: { index: number; input: CreateEdgeInput }[] = [];\n const toUpdate: {\n index: number;\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n };\n clearDeleted: boolean;\n }[] = [];\n\n let itemIndex = 0;\n for (const item of items) {\n const existing = existingMap.get(item.id);\n\n if (existing) {\n const input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n id: item.id,\n props: item.props as Record<string, unknown>,\n };\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n toUpdate.push({\n index: itemIndex,\n input,\n clearDeleted: existing.deleted_at !== undefined,\n });\n } else {\n const input: {\n kind: string;\n id?: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind,\n id: item.id,\n fromKind: item.from.kind,\n fromId: item.from.id,\n toKind: item.to.kind,\n toId: item.to.id,\n props: item.props as Record<string, unknown>,\n };\n if (item.validFrom !== undefined) input.validFrom = item.validFrom;\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n toCreate.push({ index: itemIndex, input });\n }\n itemIndex++;\n }\n\n // Hookless batch create\n const results: Edge<E>[] = Array.from({ length: items.length });\n\n if (toCreate.length > 0) {\n const createInputs = toCreate.map((entry) => entry.input);\n const created = await executeEdgeCreateBatch(createInputs, target);\n for (const [index, entry] of toCreate.entries()) {\n results[entry.index] = narrowEdge<E>(created[index]!);\n }\n }\n\n // Hookless individual updates (executeEdgeUpsertUpdate is already hookless)\n for (const entry of toUpdate) {\n const result = await executeEdgeUpsertUpdate(entry.input, target, {\n clearDeleted: entry.clearDeleted,\n });\n results[entry.index] = narrowEdge<E>(result);\n }\n\n return results;\n };\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n return backend.transaction(async (txBackend) => upsertAll(txBackend));\n }\n return upsertAll(backend);\n },\n\n async bulkInsert(\n items: readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props?: z.input<E[\"schema\"]>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<void> {\n const batchInputs = mapBulkEdgeInputs(\n kind,\n items as readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props?: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n );\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n await backend.transaction(async (txBackend) => {\n await executeEdgeCreateNoReturnBatch(batchInputs, txBackend);\n });\n return;\n }\n\n await executeEdgeCreateNoReturnBatch(batchInputs, backend);\n },\n\n async bulkDelete(ids: readonly string[]): Promise<void> {\n if (ids.length === 0) return;\n const deleteAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<void> => {\n for (const id of ids) {\n await executeEdgeDelete(id, target);\n }\n };\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n await backend.transaction(async (txBackend) => deleteAll(txBackend));\n return;\n }\n await deleteAll(backend);\n },\n\n async findByEndpoints(\n from: NodeRef,\n to: NodeRef,\n options?: EdgeFindByEndpointsOptions<E>,\n ): Promise<Edge<E> | undefined> {\n const findOptions: {\n matchOn?: readonly string[];\n props?: Record<string, unknown>;\n } = {};\n if (options?.matchOn !== undefined)\n findOptions.matchOn = options.matchOn as readonly string[];\n if (options?.props !== undefined)\n findOptions.props = options.props as Record<string, unknown>;\n\n const result = await config.executeFindByEndpoints(\n kind,\n from.kind,\n from.id,\n to.kind,\n to.id,\n backend,\n findOptions,\n );\n return result === undefined ? undefined : narrowEdge<E>(result);\n },\n\n async getOrCreateByEndpoints(\n from: NodeRef,\n to: NodeRef,\n props: z.input<E[\"schema\"]>,\n options?: EdgeGetOrCreateByEndpointsOptions<E>,\n ): Promise<EdgeGetOrCreateByEndpointsResult<E>> {\n const getOrCreateOptions: {\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n } = {};\n if (options?.matchOn !== undefined)\n getOrCreateOptions.matchOn = options.matchOn as readonly string[];\n if (options?.ifExists !== undefined)\n getOrCreateOptions.ifExists = options.ifExists;\n\n const result = await config.executeGetOrCreateByEndpoints(\n kind,\n from.kind,\n from.id,\n to.kind,\n to.id,\n props as Record<string, unknown>,\n backend,\n getOrCreateOptions,\n );\n return { edge: narrowEdge<E>(result.edge), action: result.action };\n },\n\n async bulkGetOrCreateByEndpoints(\n items: readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props: z.input<E[\"schema\"]>;\n }>[],\n options?: EdgeGetOrCreateByEndpointsOptions<E>,\n ): Promise<EdgeGetOrCreateByEndpointsResult<E>[]> {\n if (items.length === 0) return [];\n\n const mappedItems = items.map((item) => ({\n fromKind: item.from.kind,\n fromId: item.from.id,\n toKind: item.to.kind,\n toId: item.to.id,\n props: item.props as Record<string, unknown>,\n }));\n\n const getOrCreateOptions: {\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n } = {};\n if (options?.matchOn !== undefined)\n getOrCreateOptions.matchOn = options.matchOn as readonly string[];\n if (options?.ifExists !== undefined)\n getOrCreateOptions.ifExists = options.ifExists;\n\n const getOrCreateAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<EdgeGetOrCreateByEndpointsResult<E>[]> => {\n const results = await config.executeBulkGetOrCreateByEndpoints(\n kind,\n mappedItems,\n target,\n getOrCreateOptions,\n );\n return results.map((result) => ({\n edge: narrowEdge<E>(result.edge),\n action: result.action,\n }));\n };\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n return backend.transaction(async (txBackend) =>\n getOrCreateAll(txBackend),\n );\n }\n return getOrCreateAll(backend);\n },\n };\n}\n","/**\n * NodeCollection implementation.\n *\n * Provides an ergonomic API for CRUD operations on a specific node type.\n */\nimport { type z } from \"zod\";\n\nimport {\n type GraphBackend,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type NodeId, type TemporalMode } from \"../../core/types\";\nimport { type NodeType } from \"../../core/types\";\nimport { ConfigurationError } from \"../../errors\";\nimport { type QueryBuilder } from \"../../query/builder\";\nimport { nowIso } from \"../../utils/date\";\nimport { type NodeRow } from \"../row-mappers\";\nimport {\n type CreateNodeInput,\n type GetOrCreateAction,\n type Node,\n type NodeCollection,\n type NodeGetOrCreateByConstraintOptions,\n type NodeGetOrCreateByConstraintResult,\n type QueryOptions,\n type UpdateNodeInput,\n} from \"../types\";\n\n/**\n * Narrows unparameterized Node to Node<N>.\n * Safe: props are validated by Zod at creation/update boundaries.\n */\nfunction narrowNode<N extends NodeType>(node: Node): Node<N> {\n return node as Node<N>;\n}\n\n/**\n * Narrows a readonly Node array to Node<N>[].\n */\nfunction narrowNodes<N extends NodeType>(nodes: readonly Node[]): Node<N>[] {\n return nodes as Node<N>[];\n}\n\n/**\n * Config for creating a NodeCollection.\n */\nexport type NodeCollectionConfig = Readonly<{\n graphId: string;\n kind: string;\n backend: GraphBackend | TransactionBackend;\n defaultTemporalMode: TemporalMode;\n rowToNode: (row: NodeRow) => Node;\n executeCreate: (\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Node>;\n executeCreateNoReturnBatch: (\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeCreateBatch: (\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<readonly Node[]>;\n executeUpdate: (\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Node>;\n executeUpsertUpdate: (\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Node>;\n executeDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeHardDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n matchesTemporalMode: (row: NodeRow, options?: QueryOptions) => boolean;\n createQuery?: () => QueryBuilder<GraphDef>;\n executeGetOrCreateByConstraint: (\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n ) => Promise<Readonly<{ node: Node; action: GetOrCreateAction }>>;\n executeBulkGetOrCreateByConstraint: (\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n ) => Promise<Readonly<{ node: Node; action: GetOrCreateAction }>[]>;\n executeFindByConstraint: (\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Node | undefined>;\n executeBulkFindByConstraint: (\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<(Node | undefined)[]>;\n}>;\n\nfunction mapBulkNodeInputs(\n kind: string,\n items: readonly Readonly<{\n props: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n): CreateNodeInput[] {\n return items.map((item) => {\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind,\n props: item.props,\n };\n if (item.id !== undefined) input.id = item.id;\n if (item.validFrom !== undefined) input.validFrom = item.validFrom;\n if (item.validTo !== undefined) input.validTo = item.validTo;\n return input;\n });\n}\n\n/**\n * Creates a NodeCollection for a specific node type.\n */\nexport function createNodeCollection<\n G extends GraphDef,\n K extends keyof G[\"nodes\"] & string,\n>(config: NodeCollectionConfig): NodeCollection<G[\"nodes\"][K][\"type\"]> {\n type N = G[\"nodes\"][K][\"type\"];\n\n const {\n graphId,\n kind,\n backend,\n defaultTemporalMode,\n rowToNode,\n executeCreate: executeNodeCreate,\n executeCreateNoReturnBatch: executeNodeCreateNoReturnBatch,\n executeCreateBatch: executeNodeCreateBatch,\n executeUpdate: executeNodeUpdate,\n executeUpsertUpdate: executeNodeUpsertUpdate,\n executeDelete: executeNodeDelete,\n executeHardDelete: executeNodeHardDelete,\n matchesTemporalMode,\n createQuery,\n executeGetOrCreateByConstraint,\n executeBulkGetOrCreateByConstraint,\n executeFindByConstraint,\n executeBulkFindByConstraint,\n } = config;\n\n return {\n async create(\n props: z.input<N[\"schema\"]>,\n options?: Readonly<{ id?: string; validFrom?: string; validTo?: string }>,\n ): Promise<Node<N>> {\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n props: props as Record<string, unknown>,\n };\n if (options?.id !== undefined) input.id = options.id;\n if (options?.validFrom !== undefined) input.validFrom = options.validFrom;\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeNodeCreate(input, backend);\n return narrowNode<N>(result);\n },\n\n async getById(\n id: NodeId<N>,\n options?: QueryOptions,\n ): Promise<Node<N> | undefined> {\n const row = await backend.getNode(graphId, kind, id);\n if (!row) return undefined;\n if (!matchesTemporalMode(row, options)) return undefined;\n return narrowNode<N>(rowToNode(row));\n },\n\n async getByIds(\n ids: readonly NodeId<N>[],\n options?: QueryOptions,\n ): Promise<readonly (Node<N> | undefined)[]> {\n if (ids.length === 0) return [];\n\n if (backend.getNodes !== undefined) {\n const rows = await backend.getNodes(\n graphId,\n kind,\n ids as readonly string[],\n );\n const rowMap = new Map<string, (typeof rows)[number]>();\n for (const row of rows) {\n rowMap.set(row.id, row);\n }\n return ids.map((id) => {\n const row = rowMap.get(id as string);\n if (!row) return;\n if (!matchesTemporalMode(row, options)) return;\n return narrowNode<N>(rowToNode(row));\n });\n }\n\n return Promise.all(\n ids.map(async (id) => {\n const row = await backend.getNode(graphId, kind, id as string);\n if (!row) return;\n if (!matchesTemporalMode(row, options)) return;\n return narrowNode<N>(rowToNode(row));\n }),\n );\n },\n\n async update(\n id: NodeId<N>,\n props: Partial<z.input<N[\"schema\"]>>,\n options?: Readonly<{ validTo?: string }>,\n ): Promise<Node<N>> {\n const input: {\n kind: string;\n id: NodeId<N>;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n kind: kind,\n id,\n props: props as Partial<Record<string, unknown>>,\n };\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeNodeUpdate(input, backend);\n return narrowNode<N>(result);\n },\n\n async delete(id: NodeId<N>): Promise<void> {\n await executeNodeDelete(kind, id as string, backend);\n },\n\n async hardDelete(id: NodeId<N>): Promise<void> {\n await executeNodeHardDelete(kind, id as string, backend);\n },\n\n async find(\n options?: Readonly<{\n where?: (accessor: never) => unknown;\n limit?: number;\n offset?: number;\n temporalMode?: TemporalMode;\n asOf?: string;\n }>,\n ): Promise<Node<N>[]> {\n if (options?.where !== undefined && createQuery === undefined) {\n throw new ConfigurationError(\n `store.nodes.${kind}.find({ where }) requires a query-capable store`,\n { kind, operation: \"find\" },\n );\n }\n if (options?.where !== undefined && createQuery !== undefined) {\n const mode = options.temporalMode ?? defaultTemporalMode;\n let query = createQuery()\n .from(kind, \"_n\")\n .temporal(\n mode,\n mode === \"asOf\" ? (options.asOf ?? nowIso()) : undefined,\n )\n .whereNode(\"_n\", options.where as never)\n .select((ctx: Record<string, unknown>) => ctx._n);\n if (options.limit !== undefined) query = query.limit(options.limit);\n if (options.offset !== undefined) query = query.offset(options.offset);\n const results = await query.execute();\n return results as Node<N>[];\n }\n\n const mode = options?.temporalMode ?? defaultTemporalMode;\n const params: {\n graphId: string;\n kind: string;\n limit?: number;\n offset?: number;\n excludeDeleted: boolean;\n temporalMode: TemporalMode;\n asOf?: string;\n } = {\n graphId,\n kind,\n excludeDeleted: mode !== \"includeTombstones\",\n temporalMode: mode,\n };\n if (mode === \"current\" || mode === \"asOf\") {\n params.asOf = options?.asOf ?? nowIso();\n }\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.offset !== undefined) params.offset = options.offset;\n\n const rows = await backend.findNodesByKind(params);\n return rows.map((row) => narrowNode<N>(rowToNode(row)));\n },\n\n async count(options?: QueryOptions): Promise<number> {\n const mode = options?.temporalMode ?? defaultTemporalMode;\n const params: {\n graphId: string;\n kind: string;\n excludeDeleted: boolean;\n temporalMode: TemporalMode;\n asOf?: string;\n } = {\n graphId,\n kind,\n excludeDeleted: mode !== \"includeTombstones\",\n temporalMode: mode,\n };\n if (mode === \"current\" || mode === \"asOf\") {\n params.asOf = options?.asOf ?? nowIso();\n }\n return backend.countNodesByKind(params);\n },\n\n async upsertById(\n id: string,\n props: z.input<N[\"schema\"]>,\n options?: Readonly<{ validFrom?: string; validTo?: string }>,\n ): Promise<Node<N>> {\n // Check if node exists (including soft-deleted nodes)\n const existing = await backend.getNode(graphId, kind, id);\n\n if (existing) {\n // Update existing node (this also un-deletes soft-deleted nodes)\n const input: {\n kind: string;\n id: NodeId<N>;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n kind: kind,\n id: id as NodeId<N>,\n props: props as Record<string, unknown>,\n };\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n // If the node is soft-deleted, clear the deletion\n const clearDeleted = existing.deleted_at !== undefined;\n const result = await executeNodeUpdate(input, backend, {\n clearDeleted,\n });\n return narrowNode<N>(result);\n } else {\n // Create new node\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n id,\n props: props as Record<string, unknown>,\n };\n if (options?.validFrom !== undefined)\n input.validFrom = options.validFrom;\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeNodeCreate(input, backend);\n return narrowNode<N>(result);\n }\n },\n\n async bulkCreate(\n items: readonly Readonly<{\n props: z.input<N[\"schema\"]>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<Node<N>[]> {\n const batchInputs = mapBulkNodeInputs(\n kind,\n items as readonly Readonly<{\n props: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n );\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n const results = await backend.transaction(async (txBackend) =>\n executeNodeCreateBatch(batchInputs, txBackend),\n );\n return narrowNodes<N>(results);\n }\n const results = await executeNodeCreateBatch(batchInputs, backend);\n return narrowNodes<N>(results);\n },\n\n async bulkUpsertById(\n items: readonly Readonly<{\n id: string;\n props: z.input<N[\"schema\"]>;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<Node<N>[]> {\n if (items.length === 0) return [];\n\n const upsertAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<Node<N>[]> => {\n const ids = items.map((item) => item.id);\n const existingMap = new Map<\n string,\n {\n deleted_at: string | undefined;\n }\n >();\n\n if (target.getNodes === undefined) {\n const rows = await Promise.all(\n ids.map((id) => target.getNode(graphId, kind, id)),\n );\n for (const row of rows) {\n if (row !== undefined) existingMap.set(row.id, row);\n }\n } else {\n const rows = await target.getNodes(\n graphId,\n kind,\n ids as readonly string[],\n );\n for (const row of rows) {\n existingMap.set(row.id, row);\n }\n }\n\n // Bucket items into creates and updates\n const toCreate: { index: number; input: CreateNodeInput }[] = [];\n const toUpdate: {\n index: number;\n input: UpdateNodeInput;\n clearDeleted: boolean;\n }[] = [];\n\n let itemIndex = 0;\n for (const item of items) {\n const existing = existingMap.get(item.id);\n\n if (existing) {\n const input: {\n kind: string;\n id: NodeId<N>;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n kind,\n id: item.id as NodeId<N>,\n props: item.props as Record<string, unknown>,\n };\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n toUpdate.push({\n index: itemIndex,\n input,\n clearDeleted: existing.deleted_at !== undefined,\n });\n } else {\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind,\n id: item.id,\n props: item.props as Record<string, unknown>,\n };\n if (item.validFrom !== undefined) input.validFrom = item.validFrom;\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n toCreate.push({ index: itemIndex, input });\n }\n itemIndex++;\n }\n\n // Hookless batch create\n const results: Node<N>[] = Array.from({ length: items.length });\n\n if (toCreate.length > 0) {\n const createInputs = toCreate.map((entry) => entry.input);\n const created = await executeNodeCreateBatch(createInputs, target);\n for (const [index, entry] of toCreate.entries()) {\n results[entry.index] = narrowNode<N>(created[index]!);\n }\n }\n\n // Hookless individual updates\n for (const entry of toUpdate) {\n const result = await executeNodeUpsertUpdate(entry.input, target, {\n clearDeleted: entry.clearDeleted,\n });\n results[entry.index] = narrowNode<N>(result);\n }\n\n return results;\n };\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n return backend.transaction(async (txBackend) => upsertAll(txBackend));\n }\n return upsertAll(backend);\n },\n\n async bulkInsert(\n items: readonly Readonly<{\n props: z.input<N[\"schema\"]>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<void> {\n const batchInputs = mapBulkNodeInputs(\n kind,\n items as readonly Readonly<{\n props: Record<string, unknown>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n );\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n await backend.transaction(async (txBackend) => {\n await executeNodeCreateNoReturnBatch(batchInputs, txBackend);\n });\n return;\n }\n\n await executeNodeCreateNoReturnBatch(batchInputs, backend);\n },\n\n async bulkDelete(ids: readonly NodeId<N>[]): Promise<void> {\n if (ids.length === 0) return;\n const deleteAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<void> => {\n for (const id of ids) {\n await executeNodeDelete(kind, id as string, target);\n }\n };\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n await backend.transaction(async (txBackend) => deleteAll(txBackend));\n return;\n }\n await deleteAll(backend);\n },\n\n async findByConstraint(\n constraintName: string,\n props: z.input<N[\"schema\"]>,\n ): Promise<Node<N> | undefined> {\n const result = await executeFindByConstraint(\n kind,\n constraintName,\n props as Record<string, unknown>,\n backend,\n );\n return result === undefined ? undefined : narrowNode<N>(result);\n },\n\n async bulkFindByConstraint(\n constraintName: string,\n items: readonly Readonly<{\n props: z.input<N[\"schema\"]>;\n }>[],\n ): Promise<(Node<N> | undefined)[]> {\n if (items.length === 0) return [];\n\n const mappedItems = items.map((item) => ({\n props: item.props as Record<string, unknown>,\n }));\n\n const results = await executeBulkFindByConstraint(\n kind,\n constraintName,\n mappedItems,\n backend,\n );\n return results.map((result) =>\n result === undefined ? undefined : narrowNode<N>(result),\n );\n },\n\n async getOrCreateByConstraint(\n constraintName: string,\n props: z.input<N[\"schema\"]>,\n options?: NodeGetOrCreateByConstraintOptions,\n ): Promise<NodeGetOrCreateByConstraintResult<N>> {\n const execute = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<NodeGetOrCreateByConstraintResult<N>> => {\n const result = await executeGetOrCreateByConstraint(\n kind,\n constraintName,\n props as Record<string, unknown>,\n target,\n options,\n );\n return result as NodeGetOrCreateByConstraintResult<N>;\n };\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n return backend.transaction(async (txBackend) => execute(txBackend));\n }\n return execute(backend);\n },\n\n async bulkGetOrCreateByConstraint(\n constraintName: string,\n items: readonly Readonly<{\n props: z.input<N[\"schema\"]>;\n }>[],\n options?: NodeGetOrCreateByConstraintOptions,\n ): Promise<NodeGetOrCreateByConstraintResult<N>[]> {\n if (items.length === 0) return [];\n\n const mappedItems = items.map((item) => ({\n props: item.props as Record<string, unknown>,\n }));\n\n const getOrCreateAll = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<NodeGetOrCreateByConstraintResult<N>[]> => {\n const results = await executeBulkGetOrCreateByConstraint(\n kind,\n constraintName,\n mappedItems,\n target,\n options,\n );\n return results as NodeGetOrCreateByConstraintResult<N>[];\n };\n\n if (backend.capabilities.transactions && \"transaction\" in backend) {\n return backend.transaction(async (txBackend) =>\n getOrCreateAll(txBackend),\n );\n }\n return getOrCreateAll(backend);\n },\n };\n}\n","/**\n * Collection Factory for Store\n *\n * Creates typed node and edge collection proxies for both\n * Store and TransactionContext to reduce code duplication.\n */\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport { type GraphDef } from \"../core/define-graph\";\nimport { type TemporalMode } from \"../core/types\";\nimport { KindNotFoundError } from \"../errors\";\nimport { type QueryBuilder } from \"../query/builder\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\nimport { createEdgeCollection, createNodeCollection } from \"./collections\";\nimport { type EdgeRow, type NodeRow } from \"./row-mappers\";\nimport {\n type ConstraintNames,\n type CreateEdgeInput,\n type CreateNodeInput,\n type Edge,\n type GetOrCreateAction,\n type IfExistsMode,\n type Node,\n type NodeCollection,\n type NodeGetOrCreateByConstraintOptions,\n type QueryOptions,\n type TypedEdgeCollection,\n type UpdateNodeInput,\n} from \"./types\";\n\n/**\n * Operation functions passed to collections.\n */\nexport type NodeOperations = Readonly<{\n defaultTemporalMode: TemporalMode;\n rowToNode: (row: NodeRow) => Node;\n executeCreate: (\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Node>;\n executeCreateBatch: (\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<readonly Node[]>;\n executeCreateNoReturnBatch: (\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeUpdate: (\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Node>;\n executeUpsertUpdate: (\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Node>;\n executeDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeHardDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n matchesTemporalMode: (row: NodeRow, options?: QueryOptions) => boolean;\n createQuery?: () => QueryBuilder<GraphDef>;\n executeGetOrCreateByConstraint: (\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n ) => Promise<Readonly<{ node: Node; action: GetOrCreateAction }>>;\n executeBulkGetOrCreateByConstraint: (\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n ) => Promise<Readonly<{ node: Node; action: GetOrCreateAction }>[]>;\n executeFindByConstraint: (\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Node | undefined>;\n executeBulkFindByConstraint: (\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<(Node | undefined)[]>;\n}>;\n\nexport type EdgeOperations = Readonly<{\n defaultTemporalMode: TemporalMode;\n rowToEdge: (row: EdgeRow) => Edge;\n executeCreate: (\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>;\n executeCreateBatch: (\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<readonly Edge[]>;\n executeCreateNoReturnBatch: (\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeUpdate: (\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>;\n executeUpsertUpdate: (\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Edge>;\n executeDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeHardDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n matchesTemporalMode: (row: EdgeRow, options?: QueryOptions) => boolean;\n createQuery?: () => QueryBuilder<GraphDef>;\n executeGetOrCreateByEndpoints: (\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n ) => Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>>;\n executeBulkGetOrCreateByEndpoints: (\n kind: string,\n items: readonly Readonly<{\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n }>[],\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n ) => Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>[]>;\n executeFindByEndpoints: (\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n props?: Record<string, unknown>;\n }>,\n ) => Promise<Edge | undefined>;\n}>;\n\n/**\n * Creates a typed node collections proxy.\n *\n * The proxy dynamically creates NodeCollection instances for each node kind\n * when accessed.\n */\nexport function createNodeCollectionsProxy<G extends GraphDef>(\n graph: G,\n graphId: string,\n registry: KindRegistry,\n backend: GraphBackend | TransactionBackend,\n operations: NodeOperations,\n): {\n [K in keyof G[\"nodes\"] & string]-?: NodeCollection<\n G[\"nodes\"][K][\"type\"],\n ConstraintNames<G[\"nodes\"][K]>\n >;\n} {\n const collectionCache = new Map<string, unknown>();\n\n // The proxy dynamically returns typed collections for each key.\n // Type assertions are necessary because the proxy pattern doesn't preserve\n // the relationship between keys and their specific node types at compile time.\n return new Proxy(\n {} as unknown as {\n [K in keyof G[\"nodes\"] & string]-?: NodeCollection<\n G[\"nodes\"][K][\"type\"],\n ConstraintNames<G[\"nodes\"][K]>\n >;\n },\n {\n get: (_, kind: string) => {\n if (!(kind in graph.nodes)) {\n throw new KindNotFoundError(kind, \"node\");\n }\n\n const cached = collectionCache.get(kind);\n if (cached !== undefined) {\n return cached;\n }\n\n const collection = createNodeCollection({\n graphId,\n kind,\n backend,\n ...operations,\n });\n collectionCache.set(kind, collection);\n return collection;\n },\n },\n );\n}\n\n/**\n * Creates a typed edge collections proxy.\n *\n * The proxy dynamically creates EdgeCollection instances for each edge kind\n * when accessed.\n */\nexport function createEdgeCollectionsProxy<G extends GraphDef>(\n graph: G,\n graphId: string,\n registry: KindRegistry,\n backend: GraphBackend | TransactionBackend,\n operations: EdgeOperations,\n): { [K in keyof G[\"edges\"] & string]-?: TypedEdgeCollection<G[\"edges\"][K]> } {\n const collectionCache = new Map<string, unknown>();\n\n // The proxy dynamically returns typed collections for each key.\n // Type assertions are necessary because the proxy pattern doesn't preserve\n // the relationship between keys and their specific edge types at compile time.\n return new Proxy(\n {} as unknown as {\n [K in keyof G[\"edges\"] & string]-?: TypedEdgeCollection<G[\"edges\"][K]>;\n },\n {\n get: (_, kind: string) => {\n if (!(kind in graph.edges)) {\n throw new KindNotFoundError(kind, \"edge\");\n }\n\n const cached = collectionCache.get(kind);\n if (cached !== undefined) {\n return cached;\n }\n\n const collection = createEdgeCollection({\n graphId,\n kind,\n backend,\n ...operations,\n });\n collectionCache.set(kind, collection);\n return collection;\n },\n },\n );\n}\n","/**\n * Constraint validation module.\n *\n * Provides validation functions for enforcing graph constraints:\n * - Uniqueness constraints on node properties\n * - Cardinality constraints on edges\n * - Endpoint type constraints on edges\n * - Disjointness constraints between node kinds\n */\n\n/**\n * Separator used between field values in composite unique keys.\n * Uses ASCII Record Separator (0x1E) — valid UTF-8 and safe for PostgreSQL\n * TEXT columns (unlike \\0 which PostgreSQL rejects).\n */\nconst UNIQUE_KEY_SEPARATOR = \"\\u001E\";\n\n/** Marker for undefined/null field values in unique keys. */\nconst UNIQUE_KEY_NULL_MARKER = \"\\u001F\"; // ASCII Unit Separator\nimport {\n type Cardinality,\n type Collation,\n type EdgeRegistration,\n type UniqueConstraint,\n type UniquenessScope,\n} from \"../core/types\";\nimport {\n CardinalityError,\n DisjointError,\n EndpointError,\n UniquenessError,\n} from \"../errors\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\n\n// ============================================================\n// Uniqueness Validation\n// ============================================================\n\n/**\n * Computes the unique key for a node's uniqueness constraint.\n *\n * The key is built by concatenating the specified field values,\n * optionally normalized for case-insensitive comparison.\n */\nexport function computeUniqueKey(\n props: Record<string, unknown>,\n fields: readonly string[],\n collation: Collation,\n): string {\n const values = fields.map((field) => {\n const value = props[field];\n if (value === undefined || value === null) {\n return UNIQUE_KEY_NULL_MARKER;\n }\n // Convert to string, handling primitives safely\n const stringValue =\n typeof value === \"string\" ? value\n : typeof value === \"number\" || typeof value === \"boolean\" ?\n value.toString()\n : JSON.stringify(value);\n return collation === \"caseInsensitive\" ?\n stringValue.toLowerCase()\n : stringValue;\n });\n return values.join(UNIQUE_KEY_SEPARATOR);\n}\n\n/**\n * Checks if a uniqueness constraint's where predicate passes.\n */\nexport function checkWherePredicate(\n constraint: UniqueConstraint,\n props: Record<string, unknown>,\n): boolean {\n if (!constraint.where) {\n return true; // No where clause, always applies\n }\n\n // Build predicate context\n const predicateBuilder = buildPredicateContext(props);\n const predicate = constraint.where(predicateBuilder);\n\n // Evaluate predicate\n return evaluatePredicate(predicate, props);\n}\n\ntype UniquePredicate = Readonly<{\n __type: \"unique_predicate\";\n field: string;\n op: \"isNull\" | \"isNotNull\";\n}>;\n\ntype PredicateContext = Readonly<\n Record<\n string,\n Readonly<{\n isNull: () => UniquePredicate;\n isNotNull: () => UniquePredicate;\n }>\n >\n>;\n\n/**\n * Builds a predicate context for where clause evaluation.\n */\nfunction buildPredicateContext(\n props: Record<string, unknown>,\n): PredicateContext {\n const context: Record<\n string,\n { isNull: () => UniquePredicate; isNotNull: () => UniquePredicate }\n > = {};\n\n for (const key of Object.keys(props)) {\n context[key] = {\n isNull: () => ({\n __type: \"unique_predicate\" as const,\n field: key,\n op: \"isNull\" as const,\n }),\n isNotNull: () => ({\n __type: \"unique_predicate\" as const,\n field: key,\n op: \"isNotNull\" as const,\n }),\n };\n }\n\n return context;\n}\n\n/**\n * Evaluates a uniqueness predicate.\n */\nfunction evaluatePredicate(\n predicate: unknown,\n props: Record<string, unknown>,\n): boolean {\n if (\n typeof predicate !== \"object\" ||\n predicate === null ||\n !(\"__type\" in predicate)\n ) {\n return true;\n }\n\n const pred = predicate as {\n __type: string;\n field: string;\n op: \"isNull\" | \"isNotNull\";\n };\n\n if (pred.__type !== \"unique_predicate\") {\n return true;\n }\n\n const value = props[pred.field];\n if (pred.op === \"isNull\") {\n return value === null || value === undefined;\n }\n return value !== null && value !== undefined;\n}\n\n/**\n * Gets all kinds that should be checked for a uniqueness constraint.\n *\n * For \"kindWithSubClasses\" scope, includes the entire subclass hierarchy:\n * - The kind itself\n * - All ancestors (parent classes)\n * - All descendants of those ancestors (sibling classes)\n *\n * For \"kind\" scope, only the specific kind.\n */\nexport function getKindsForUniquenessCheck(\n baseKind: string,\n scope: UniquenessScope,\n registry: KindRegistry,\n): readonly string[] {\n if (scope === \"kind\") {\n return [baseKind];\n }\n\n // Get the entire connected subclass hierarchy by finding the root ancestor\n const root = findRootAncestor(baseKind, registry);\n\n // Return the root and all its descendants (which includes baseKind and siblings)\n return registry.expandSubClasses(root);\n}\n\n/**\n * Finds the topmost ancestor of a kind, or the kind itself if it has no ancestors.\n */\nfunction findRootAncestor(kind: string, registry: KindRegistry): string {\n const ancestors = registry.getAncestors(kind);\n\n if (ancestors.size === 0) {\n return kind;\n }\n\n // Find an ancestor with no ancestors (the root)\n for (const ancestor of ancestors) {\n if (registry.getAncestors(ancestor).size === 0) {\n return ancestor;\n }\n }\n\n // If all ancestors have ancestors, recurse up\n const firstAncestor = [...ancestors][0];\n return firstAncestor ? findRootAncestor(firstAncestor, registry) : kind;\n}\n\n/**\n * Creates a uniqueness error.\n */\nexport function createUniquenessError(\n constraintName: string,\n kind: string,\n existingId: string,\n newId: string,\n fields: readonly string[],\n): UniquenessError {\n return new UniquenessError({\n constraintName,\n kind,\n existingId,\n newId,\n fields: [...fields],\n });\n}\n\n// ============================================================\n// Cardinality Validation\n// ============================================================\n\n/**\n * Checks if adding an edge would violate cardinality constraints.\n *\n * @param edgeKind - The edge kind being added\n * @param fromKind - The source node kind\n * @param fromId - The source node ID\n * @param cardinality - The cardinality constraint\n * @param existingEdgeCount - Number of existing edges of this kind from this source\n * @param hasActiveEdge - Whether there's an active (valid_to IS NULL) edge\n * @returns Error if violation, undefined if valid\n */\nexport function checkCardinality(\n edgeKind: string,\n fromKind: string,\n fromId: string,\n cardinality: Cardinality,\n existingEdgeCount: number,\n hasActiveEdge: boolean,\n): CardinalityError | undefined {\n switch (cardinality) {\n case \"many\": {\n // No constraint\n return undefined;\n }\n case \"one\": {\n // At most one edge of this kind from any source node\n if (existingEdgeCount > 0) {\n return new CardinalityError({\n edgeKind,\n fromKind,\n fromId,\n cardinality: \"one\",\n existingCount: existingEdgeCount,\n });\n }\n return undefined;\n }\n case \"unique\": {\n // unique is checked separately per (source, target) pair\n return undefined;\n }\n case \"oneActive\": {\n // At most one edge with valid_to IS NULL from any source\n if (hasActiveEdge) {\n return new CardinalityError({\n edgeKind,\n fromKind,\n fromId,\n cardinality: \"oneActive\",\n existingCount: 1,\n });\n }\n return undefined;\n }\n }\n}\n\n/**\n * Checks unique edge constraint (at most one edge between any source-target pair).\n */\nexport function checkUniqueEdge(\n edgeKind: string,\n fromKind: string,\n fromId: string,\n _toKind: string,\n _toId: string,\n existingCount: number,\n): CardinalityError | undefined {\n if (existingCount > 0) {\n return new CardinalityError({\n edgeKind,\n fromKind,\n fromId,\n cardinality: \"unique\",\n existingCount,\n });\n }\n return undefined;\n}\n\n// ============================================================\n// Endpoint Validation\n// ============================================================\n\n/**\n * Validates that an edge's endpoints are valid node kinds.\n */\nexport function validateEdgeEndpoints(\n edgeKind: string,\n fromKind: string,\n toKind: string,\n registration: EdgeRegistration,\n registry: KindRegistry,\n): EndpointError | undefined {\n // Check from kinds\n const validFromKinds = registration.from.map((node) => node.kind);\n const fromValid = validFromKinds.some((validKind) =>\n registry.isAssignableTo(fromKind, validKind),\n );\n\n if (!fromValid) {\n return new EndpointError({\n edgeKind,\n endpoint: \"from\",\n actualKind: fromKind,\n expectedKinds: validFromKinds,\n });\n }\n\n // Check to kinds\n const validToKinds = registration.to.map((node) => node.kind);\n const toValid = validToKinds.some((validKind) =>\n registry.isAssignableTo(toKind, validKind),\n );\n\n if (!toValid) {\n return new EndpointError({\n edgeKind,\n endpoint: \"to\",\n actualKind: toKind,\n expectedKinds: validToKinds,\n });\n }\n\n return undefined;\n}\n\n// ============================================================\n// Disjointness Validation\n// ============================================================\n\n/**\n * Checks if creating a node would violate disjointness constraints.\n *\n * @param nodeId - The node ID being created\n * @param nodeKind - The kind of the new node\n * @param existingKinds - Kinds of existing nodes with the same ID\n * @param registry - The kind registry for disjointness checks\n * @returns Error if disjoint violation, undefined if valid\n */\nexport function checkDisjointness(\n nodeId: string,\n nodeKind: string,\n existingKinds: readonly string[],\n registry: KindRegistry,\n): DisjointError | undefined {\n for (const existingKind of existingKinds) {\n if (registry.areDisjoint(nodeKind, existingKind)) {\n return new DisjointError({\n nodeId,\n attemptedKind: nodeKind,\n conflictingKind: existingKind,\n });\n }\n }\n return undefined;\n}\n\n/**\n * Gets all disjoint kinds for a given kind.\n */\nexport function getDisjointKinds(\n kind: string,\n registry: KindRegistry,\n): readonly string[] {\n return registry.getDisjointKinds(kind);\n}\n","/**\n * Constraint Checking for Store Operations\n *\n * Handles checking disjointness and cardinality constraints.\n */\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport {\n checkCardinality,\n checkDisjointness,\n checkUniqueEdge,\n} from \"../constraints\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\n\n/**\n * Context for constraint operations.\n */\nexport type ConstraintContext = Readonly<{\n graphId: string;\n registry: KindRegistry;\n backend: GraphBackend | TransactionBackend;\n}>;\n\n/**\n * Checks disjointness constraints for a node.\n *\n * Ensures that a node with a given ID doesn't exist in any disjoint kinds.\n *\n * @throws ValidationError if disjointness constraint is violated\n */\nexport async function checkDisjointnessConstraint(\n ctx: ConstraintContext,\n kind: string,\n id: string,\n): Promise<void> {\n // Get all kinds that are disjoint with this kind\n const disjointKinds = ctx.registry.getDisjointKinds(kind);\n\n // For each disjoint kind, check if a node with this ID exists\n for (const disjointKind of disjointKinds) {\n const existing = await ctx.backend.getNode(ctx.graphId, disjointKind, id);\n if (existing && !existing.deleted_at) {\n const error = checkDisjointness(id, kind, [disjointKind], ctx.registry);\n if (error) throw error;\n }\n }\n}\n\n/**\n * Checks cardinality constraints for an edge.\n *\n * @throws CardinalityError if cardinality constraint is violated\n */\nexport async function checkCardinalityConstraint(\n ctx: ConstraintContext,\n edgeKind: string,\n cardinality: \"many\" | \"one\" | \"unique\" | \"oneActive\",\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n validTo: string | undefined,\n): Promise<void> {\n switch (cardinality) {\n case \"many\": {\n // No constraint - allow any number of edges\n return;\n }\n\n case \"one\": {\n // At most one edge of this kind from this source\n const count = await ctx.backend.countEdgesFrom({\n graphId: ctx.graphId,\n edgeKind,\n fromKind,\n fromId,\n });\n const error = checkCardinality(\n edgeKind,\n fromKind,\n fromId,\n \"one\",\n count,\n false,\n );\n if (error) throw error;\n return;\n }\n\n case \"unique\": {\n // At most one edge between this specific source-target pair\n const exists = await ctx.backend.edgeExistsBetween({\n graphId: ctx.graphId,\n edgeKind,\n fromKind,\n fromId,\n toKind,\n toId,\n });\n const error = checkUniqueEdge(\n edgeKind,\n fromKind,\n fromId,\n toKind,\n toId,\n exists ? 1 : 0,\n );\n if (error) throw error;\n return;\n }\n\n case \"oneActive\": {\n // At most one active edge (valid_to IS NULL) from this source\n // Only check if the new edge will be active (validTo is not set)\n if (validTo !== undefined) {\n // New edge is already ended, no active constraint to check\n return;\n }\n const count = await ctx.backend.countEdgesFrom({\n graphId: ctx.graphId,\n edgeKind,\n fromKind,\n fromId,\n activeOnly: true,\n });\n const error = checkCardinality(\n edgeKind,\n fromKind,\n fromId,\n \"oneActive\",\n count,\n count > 0,\n );\n if (error) throw error;\n return;\n }\n }\n}\n","/**\n * Row Mappers for Store\n *\n * Transforms database rows into typed Node and Edge objects.\n */\nimport {\n type EdgeRow as BackendEdgeRow,\n type NodeRow as BackendNodeRow,\n} from \"../backend/types\";\nimport { type Edge, type Node } from \"./types\";\n\n/**\n * Raw node row from database (without graph_id).\n * Derived from BackendNodeRow so BackendNodeRow is assignable without casts.\n */\nexport type NodeRow = Omit<BackendNodeRow, \"graph_id\">;\n\n/**\n * Raw edge row from database (without graph_id).\n * Derived from BackendEdgeRow so BackendEdgeRow is assignable without casts.\n */\nexport type EdgeRow = Omit<BackendEdgeRow, \"graph_id\">;\n\n// Reserved keys that cannot be overwritten by user props\nconst RESERVED_NODE_KEYS = new Set([\"id\", \"kind\", \"meta\"]);\n\n/**\n * Converts null to undefined for consistent typing.\n * Database backends return null for missing values, but our types use undefined.\n */\nfunction nullToUndefined<T>(value: T | null | undefined): T | undefined {\n return value === null ? undefined : value;\n}\n\n/**\n * Filters out reserved keys from props to prevent runtime collisions.\n */\nfunction filterReservedKeys(\n props: Record<string, unknown>,\n reservedKeys: Set<string>,\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!reservedKeys.has(key)) {\n filtered[key] = value;\n }\n }\n return filtered;\n}\n\n/**\n * Transforms a database row into a typed Node object.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys (id, kind, meta) in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n */\nexport function rowToNode(row: NodeRow): Node {\n const rawProps = JSON.parse(row.props) as Record<string, unknown>;\n const props = filterReservedKeys(rawProps, RESERVED_NODE_KEYS);\n return {\n kind: row.kind,\n id: row.id as Node[\"id\"],\n meta: {\n version: row.version,\n validFrom: nullToUndefined(row.valid_from),\n validTo: nullToUndefined(row.valid_to),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n deletedAt: nullToUndefined(row.deleted_at),\n },\n ...props,\n } as Node;\n}\n\n// Reserved keys that cannot be overwritten by user props on edges\nconst RESERVED_EDGE_KEYS = new Set([\n \"id\",\n \"kind\",\n \"meta\",\n \"fromKind\",\n \"fromId\",\n \"toKind\",\n \"toId\",\n]);\n\n/**\n * Transforms a database row into a typed Edge object.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n */\nexport function rowToEdge(row: EdgeRow): Edge {\n const rawProps = JSON.parse(row.props) as Record<string, unknown>;\n const props = filterReservedKeys(rawProps, RESERVED_EDGE_KEYS);\n return {\n id: row.id,\n kind: row.kind,\n fromKind: row.from_kind,\n fromId: row.from_id,\n toKind: row.to_kind,\n toId: row.to_id,\n meta: {\n validFrom: nullToUndefined(row.valid_from),\n validTo: nullToUndefined(row.valid_to),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n deletedAt: nullToUndefined(row.deleted_at),\n },\n ...props,\n } as Edge;\n}\n","/**\n * Edge Operations for Store\n *\n * Handles edge CRUD operations: create, update, delete.\n */\nimport {\n type EdgeRow as BackendEdgeRow,\n type GraphBackend,\n type InsertEdgeParams,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { validateEdgeEndpoints } from \"../../constraints\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type Cardinality } from \"../../core/types\";\nimport {\n DatabaseOperationError,\n EdgeNotFoundError,\n EndpointNotFoundError,\n KindNotFoundError,\n ValidationError,\n} from \"../../errors\";\nimport { validateEdgeProps } from \"../../errors/validation\";\nimport { type KindRegistry } from \"../../registry/kind-registry\";\nimport { validateOptionalIsoDate } from \"../../utils/date\";\nimport { generateId } from \"../../utils/id\";\nimport {\n checkCardinalityConstraint,\n type ConstraintContext,\n} from \"../constraints\";\nimport { rowToEdge } from \"../row-mappers\";\nimport {\n type CreateEdgeInput,\n type Edge,\n type GetOrCreateAction,\n type IfExistsMode,\n type OperationHookContext,\n} from \"../types\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Context for edge operations.\n */\nexport type EdgeOperationContext<G extends GraphDef> = Readonly<{\n graph: G;\n graphId: string;\n registry: KindRegistry;\n createOperationContext: (\n operation: \"create\" | \"update\" | \"delete\",\n entity: \"node\" | \"edge\",\n kind: string,\n id: string,\n ) => OperationHookContext;\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => Promise<T>;\n}>;\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\nfunction getEdgeRegistration<G extends GraphDef>(graph: G, kind: string) {\n const registration = graph.edges[kind];\n if (registration === undefined) throw new KindNotFoundError(kind, \"edge\");\n return registration;\n}\n\ntype EdgeCreatePrepared = Readonly<{\n insertParams: InsertEdgeParams;\n cardinality: Cardinality;\n}>;\n\nfunction buildEdgeEndpointCacheKey(\n graphId: string,\n kind: string,\n id: string,\n): string {\n return `${graphId}\\u0000${kind}\\u0000${id}`;\n}\n\nfunction buildEdgeFromCacheKey(\n graphId: string,\n edgeKind: string,\n fromKind: string,\n fromId: string,\n): string {\n return `${graphId}\\u0000${edgeKind}\\u0000${fromKind}\\u0000${fromId}`;\n}\n\nfunction buildEdgeBetweenCacheKey(\n graphId: string,\n edgeKind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n): string {\n return `${graphId}\\u0000${edgeKind}\\u0000${fromKind}\\u0000${fromId}\\u0000${toKind}\\u0000${toId}`;\n}\n\nfunction buildCountEdgesFromCacheKey(\n params: Parameters<GraphBackend[\"countEdgesFrom\"]>[0],\n): string {\n const activeOnly = params.activeOnly === true ? \"1\" : \"0\";\n return `${params.graphId}\\u0000${params.edgeKind}\\u0000${params.fromKind}\\u0000${params.fromId}\\u0000${activeOnly}`;\n}\n\nfunction buildInsertEdgeParams(\n graphId: string,\n id: string,\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n props: Record<string, unknown>,\n validFrom: string | undefined,\n validTo: string | undefined,\n): InsertEdgeParams {\n const insertParams: {\n graphId: string;\n id: string;\n kind: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n graphId,\n id,\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n props,\n };\n if (validFrom !== undefined) insertParams.validFrom = validFrom;\n if (validTo !== undefined) insertParams.validTo = validTo;\n return insertParams;\n}\n\nfunction incrementPendingCount(counts: Map<string, number>, key: string): void {\n const previous = counts.get(key) ?? 0;\n counts.set(key, previous + 1);\n}\n\nfunction createEdgeBatchValidationBackend(\n backend: GraphBackend | TransactionBackend,\n): Readonly<{\n backend: GraphBackend | TransactionBackend;\n registerPendingEdgeForCardinality: (\n insertParams: InsertEdgeParams,\n cardinality: Cardinality,\n ) => void;\n}> {\n const endpointCache = new Map<\n string,\n Awaited<ReturnType<GraphBackend[\"getNode\"]>>\n >();\n const countEdgesFromCache = new Map<string, number>();\n const edgeExistsCache = new Map<string, boolean>();\n const pendingOneCounts = new Map<string, number>();\n const pendingOneActiveCounts = new Map<string, number>();\n const pendingUniquePairs = new Set<string>();\n\n async function getNodeCached(\n graphId: string,\n kind: string,\n id: string,\n ): Promise<Awaited<ReturnType<GraphBackend[\"getNode\"]>>> {\n const cacheKey = buildEdgeEndpointCacheKey(graphId, kind, id);\n if (endpointCache.has(cacheKey)) {\n return endpointCache.get(cacheKey);\n }\n const node = await backend.getNode(graphId, kind, id);\n endpointCache.set(cacheKey, node);\n return node;\n }\n\n async function countEdgesFromCached(\n params: Parameters<GraphBackend[\"countEdgesFrom\"]>[0],\n ): Promise<number> {\n const cacheKey = buildCountEdgesFromCacheKey(params);\n let baseCount = countEdgesFromCache.get(cacheKey);\n if (baseCount === undefined) {\n baseCount = await backend.countEdgesFrom(params);\n countEdgesFromCache.set(cacheKey, baseCount);\n }\n const pendingKey = buildEdgeFromCacheKey(\n params.graphId,\n params.edgeKind,\n params.fromKind,\n params.fromId,\n );\n const pendingCount =\n params.activeOnly === true ?\n (pendingOneActiveCounts.get(pendingKey) ?? 0)\n : (pendingOneCounts.get(pendingKey) ?? 0);\n return baseCount + pendingCount;\n }\n\n async function edgeExistsBetweenCached(\n params: Parameters<GraphBackend[\"edgeExistsBetween\"]>[0],\n ): Promise<boolean> {\n const cacheKey = buildEdgeBetweenCacheKey(\n params.graphId,\n params.edgeKind,\n params.fromKind,\n params.fromId,\n params.toKind,\n params.toId,\n );\n if (pendingUniquePairs.has(cacheKey)) {\n return true;\n }\n if (edgeExistsCache.has(cacheKey)) {\n return edgeExistsCache.get(cacheKey) ?? false;\n }\n const exists = await backend.edgeExistsBetween(params);\n edgeExistsCache.set(cacheKey, exists);\n return exists;\n }\n\n function registerPendingEdgeForCardinality(\n insertParams: InsertEdgeParams,\n cardinality: Cardinality,\n ): void {\n const fromCacheKey = buildEdgeFromCacheKey(\n insertParams.graphId,\n insertParams.kind,\n insertParams.fromKind,\n insertParams.fromId,\n );\n if (cardinality === \"one\") {\n incrementPendingCount(pendingOneCounts, fromCacheKey);\n return;\n }\n if (cardinality === \"oneActive\") {\n if (insertParams.validTo === undefined) {\n incrementPendingCount(pendingOneActiveCounts, fromCacheKey);\n }\n return;\n }\n if (cardinality === \"unique\") {\n const uniqueCacheKey = buildEdgeBetweenCacheKey(\n insertParams.graphId,\n insertParams.kind,\n insertParams.fromKind,\n insertParams.fromId,\n insertParams.toKind,\n insertParams.toId,\n );\n pendingUniquePairs.add(uniqueCacheKey);\n }\n }\n\n // Override specific methods on the backend for validation caching.\n // The cast is necessary because spreading a union type (GraphBackend | TransactionBackend)\n // produces an intersection of their members, which TypeScript can't narrow back to the union.\n const validationBackend = {\n ...backend,\n getNode: getNodeCached,\n countEdgesFrom: countEdgesFromCached,\n edgeExistsBetween: edgeExistsBetweenCached,\n } as GraphBackend | TransactionBackend;\n\n return {\n backend: validationBackend,\n registerPendingEdgeForCardinality,\n };\n}\n\nasync function validateAndPrepareEdgeCreate<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: CreateEdgeInput,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<EdgeCreatePrepared> {\n const kind = input.kind;\n const fromKind = input.fromKind;\n const toKind = input.toKind;\n\n // Validate kind exists and get registration\n const registration = getEdgeRegistration(ctx.graph, kind);\n const edgeKind = registration.type;\n\n // Validate endpoint types\n const endpointError = validateEdgeEndpoints(\n kind,\n fromKind,\n toKind,\n registration,\n ctx.registry,\n );\n if (endpointError) throw endpointError;\n\n // Validate source node exists\n const fromNode = await backend.getNode(ctx.graphId, fromKind, input.fromId);\n if (!fromNode || fromNode.deleted_at) {\n throw new EndpointNotFoundError({\n edgeKind: kind,\n endpoint: \"from\",\n nodeKind: fromKind,\n nodeId: input.fromId,\n });\n }\n\n // Validate target node exists\n const toNode = await backend.getNode(ctx.graphId, toKind, input.toId);\n if (!toNode || toNode.deleted_at) {\n throw new EndpointNotFoundError({\n edgeKind: kind,\n endpoint: \"to\",\n nodeKind: toKind,\n nodeId: input.toId,\n });\n }\n\n // Validate props with full context\n const validatedProps = validateEdgeProps(edgeKind.schema, input.props, {\n kind,\n operation: \"create\",\n });\n\n // Validate temporal fields\n const validFrom = validateOptionalIsoDate(input.validFrom, \"validFrom\");\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Check cardinality constraints\n const cardinality = registration.cardinality ?? \"many\";\n const constraintContext: ConstraintContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await checkCardinalityConstraint(\n constraintContext,\n kind,\n cardinality,\n fromKind,\n input.fromId,\n toKind,\n input.toId,\n validTo,\n );\n\n return {\n cardinality,\n insertParams: buildInsertEdgeParams(\n ctx.graphId,\n id,\n kind,\n fromKind,\n input.fromId,\n toKind,\n input.toId,\n validatedProps,\n validFrom,\n validTo,\n ),\n };\n}\n\n// ============================================================\n// Edge Operations\n// ============================================================\n\n/**\n * Executes an edge create operation.\n */\nasync function executeEdgeCreateInternal<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ returnRow?: boolean }>,\n): Promise<Edge | undefined> {\n const kind = input.kind;\n const id = input.id ?? generateId();\n const opContext = ctx.createOperationContext(\"create\", \"edge\", kind, id);\n const shouldReturnRow = options?.returnRow ?? true;\n\n return ctx.withOperationHooks(opContext, async () => {\n const prepared = await validateAndPrepareEdgeCreate(\n ctx,\n input,\n id,\n backend,\n );\n\n let row: BackendEdgeRow | undefined;\n if (shouldReturnRow) {\n row = await backend.insertEdge(prepared.insertParams);\n } else {\n await (backend.insertEdgeNoReturn?.(prepared.insertParams) ??\n backend.insertEdge(prepared.insertParams));\n }\n\n if (row === undefined) return;\n return rowToEdge(row);\n });\n}\n\n/**\n * Executes an edge create operation and returns the created edge.\n */\nexport async function executeEdgeCreate<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n): Promise<Edge> {\n const result = await executeEdgeCreateInternal(ctx, input, backend, {\n returnRow: true,\n });\n if (!result) {\n throw new DatabaseOperationError(\n \"Edge create failed: expected created edge row\",\n { operation: \"insert\", entity: \"edge\" },\n );\n }\n return result;\n}\n\n/**\n * Executes an edge create operation without returning the created edge payload.\n */\nexport async function executeEdgeCreateNoReturn<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n await executeEdgeCreateInternal(ctx, input, backend, { returnRow: false });\n}\n\n/**\n * Executes batched edge creates without returning inserted edge payloads.\n *\n * Note: `withOperationHooks` is intentionally skipped for batch throughput.\n * Per-item hooks would negate the performance benefit of batching.\n */\nexport async function executeEdgeCreateNoReturnBatch<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n if (inputs.length === 0) {\n return;\n }\n\n const { backend: validationBackend, registerPendingEdgeForCardinality } =\n createEdgeBatchValidationBackend(backend);\n const preparedCreates: EdgeCreatePrepared[] = [];\n\n for (const input of inputs) {\n const id = input.id ?? generateId();\n const prepared = await validateAndPrepareEdgeCreate(\n ctx,\n input,\n id,\n validationBackend,\n );\n preparedCreates.push(prepared);\n registerPendingEdgeForCardinality(\n prepared.insertParams,\n prepared.cardinality,\n );\n }\n\n const batchInsertParams = preparedCreates.map(\n (prepared) => prepared.insertParams,\n );\n if (backend.insertEdgesBatch === undefined) {\n for (const insertParams of batchInsertParams) {\n await (backend.insertEdgeNoReturn?.(insertParams) ??\n backend.insertEdge(insertParams));\n }\n return;\n }\n await backend.insertEdgesBatch(batchInsertParams);\n}\n\n/**\n * Executes batched edge creates and returns the inserted edge payloads.\n *\n * Uses batch validation caching and a single multi-row INSERT with RETURNING\n * when the backend supports it. Falls back to sequential inserts otherwise.\n *\n * Note: `withOperationHooks` is intentionally skipped for batch throughput.\n * Per-item hooks would negate the performance benefit of batching.\n */\nexport async function executeEdgeCreateBatch<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n inputs: readonly CreateEdgeInput[],\n backend: GraphBackend | TransactionBackend,\n): Promise<readonly Edge[]> {\n if (inputs.length === 0) {\n return [];\n }\n\n const { backend: validationBackend, registerPendingEdgeForCardinality } =\n createEdgeBatchValidationBackend(backend);\n const preparedCreates: EdgeCreatePrepared[] = [];\n\n for (const input of inputs) {\n const id = input.id ?? generateId();\n const prepared = await validateAndPrepareEdgeCreate(\n ctx,\n input,\n id,\n validationBackend,\n );\n preparedCreates.push(prepared);\n registerPendingEdgeForCardinality(\n prepared.insertParams,\n prepared.cardinality,\n );\n }\n\n const batchInsertParams = preparedCreates.map(\n (prepared) => prepared.insertParams,\n );\n\n let rows: readonly BackendEdgeRow[];\n if (backend.insertEdgesBatchReturning === undefined) {\n const sequentialRows: BackendEdgeRow[] = [];\n for (const insertParams of batchInsertParams) {\n sequentialRows.push(await backend.insertEdge(insertParams));\n }\n rows = sequentialRows;\n } else {\n rows = await backend.insertEdgesBatchReturning(batchInsertParams);\n }\n\n return rows.map((row) => rowToEdge(row));\n}\n\n/**\n * Executes an edge update operation.\n */\nexport async function executeEdgeUpdate<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n): Promise<Edge> {\n const id = input.id;\n\n // Get existing edge first to get the kind for the hook context\n const existing = await backend.getEdge(ctx.graphId, id);\n if (!existing || existing.deleted_at) {\n throw new EdgeNotFoundError(\"unknown\", id);\n }\n\n const opContext = ctx.createOperationContext(\n \"update\",\n \"edge\",\n existing.kind,\n id,\n );\n\n return ctx.withOperationHooks(opContext, async () => {\n // Get registration for schema validation\n const registration = getEdgeRegistration(ctx.graph, existing.kind);\n const edgeKind = registration.type;\n\n // Merge props\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n const mergedProps = { ...existingProps, ...input.props };\n\n // Validate merged props with full context\n const validatedProps = validateEdgeProps(edgeKind.schema, mergedProps, {\n kind: existing.kind,\n operation: \"update\",\n id,\n });\n\n // Validate temporal fields\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Update edge - conditionally include optional fields\n const updateParams: {\n graphId: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n } = {\n graphId: ctx.graphId,\n id,\n props: validatedProps,\n };\n if (validTo !== undefined) updateParams.validTo = validTo;\n\n const row = await backend.updateEdge(updateParams);\n\n return rowToEdge(row);\n });\n}\n\n/**\n * Executes an edge update for upsert — bypasses the soft-delete check\n * and optionally clears `deleted_at`.\n */\nexport async function executeEdgeUpsertUpdate<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n): Promise<Edge> {\n const id = input.id;\n\n const existing = await backend.getEdge(ctx.graphId, id);\n if (!existing) {\n throw new EdgeNotFoundError(\"unknown\", id);\n }\n\n const registration = getEdgeRegistration(ctx.graph, existing.kind);\n const edgeKind = registration.type;\n\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n const mergedProps = { ...existingProps, ...input.props };\n\n const validatedProps = validateEdgeProps(edgeKind.schema, mergedProps, {\n kind: existing.kind,\n operation: \"update\",\n id,\n });\n\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n const updateParams: {\n graphId: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n clearDeleted?: boolean;\n } = {\n graphId: ctx.graphId,\n id,\n props: validatedProps,\n };\n if (validTo !== undefined) updateParams.validTo = validTo;\n if (options?.clearDeleted) updateParams.clearDeleted = true;\n\n const row = await backend.updateEdge(updateParams);\n\n return rowToEdge(row);\n}\n\n/**\n * Executes an edge delete operation.\n */\nexport async function executeEdgeDelete<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n // Get edge first to know the kind for the hook context\n const existing = await backend.getEdge(ctx.graphId, id);\n if (!existing || existing.deleted_at) {\n // Already deleted - nothing to do\n return;\n }\n\n const opContext = ctx.createOperationContext(\n \"delete\",\n \"edge\",\n existing.kind,\n id,\n );\n\n return ctx.withOperationHooks(opContext, async () => {\n await backend.deleteEdge({\n graphId: ctx.graphId,\n id,\n });\n });\n}\n\n/**\n * Executes an edge hard delete operation (permanent removal).\n *\n * Unlike soft delete, this permanently removes the edge from the database.\n */\nexport async function executeEdgeHardDelete<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n // Get edge first to know the kind for the hook context\n const existing = await backend.getEdge(ctx.graphId, id);\n if (!existing) {\n // Doesn't exist - nothing to do\n return;\n }\n\n const opContext = ctx.createOperationContext(\n \"delete\",\n \"edge\",\n existing.kind,\n id,\n );\n\n return ctx.withOperationHooks(opContext, async () => {\n await backend.hardDeleteEdge({\n graphId: ctx.graphId,\n id,\n });\n });\n}\n\n// ============================================================\n// Get-Or-Create Operations\n// ============================================================\n\n// Delimiters for composite match keys\nconst RECORD_SEP = \"\\u001E\";\nconst UNIT_SEP = \"\\u001F\";\nconst UNDEFINED_SENTINEL = \"\\u001D\";\n\n/**\n * Validates that all `matchOn` fields exist in the edge schema shape.\n * Throws a ValidationError for invalid fields.\n */\nfunction validateMatchOnFields(\n schema: { shape?: Record<string, unknown> },\n matchOn: readonly string[],\n edgeKind: string,\n): void {\n if (matchOn.length === 0) return;\n const shape = schema.shape;\n if (shape === undefined) {\n throw new ValidationError(\n `Edge kind \"${edgeKind}\" has no schema shape to validate matchOn fields against`,\n {\n kind: edgeKind,\n operation: \"create\",\n issues: matchOn.map((field) => ({\n path: field,\n message: `Field \"${field}\" does not exist in edge schema`,\n })),\n },\n );\n }\n\n const invalidFields = matchOn.filter((field) => !(field in shape));\n if (invalidFields.length > 0) {\n throw new ValidationError(\n `Invalid matchOn fields for edge kind \"${edgeKind}\": ${invalidFields.join(\", \")}`,\n {\n kind: edgeKind,\n operation: \"create\",\n issues: invalidFields.map((field) => ({\n path: field,\n message: `Field \"${field}\" does not exist in edge schema`,\n })),\n },\n );\n }\n}\n\n/**\n * Serializes a value for composite key construction.\n * Sorts object keys for deterministic ordering of nested values.\n */\nfunction stableStringify(value: unknown): string {\n if (value === undefined) return UNDEFINED_SENTINEL;\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n const sorted = Object.keys(value as Record<string, unknown>).toSorted();\n const entries = sorted.map(\n (key) =>\n `${JSON.stringify(key)}:${stableStringify((value as Record<string, unknown>)[key])}`,\n );\n return `{${entries.join(\",\")}}`;\n}\n\n/**\n * Builds a deterministic composite key for edge matching.\n *\n * Format: `fromKind\\u001EfromId\\u001EtoKind\\u001EtoId[\\u001Efield\\u001Fvalue]*`\n */\nfunction buildEdgeCompositeKey(\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n props: Record<string, unknown>,\n matchOn: readonly string[],\n): string {\n const endpointPart = `${fromKind}${RECORD_SEP}${fromId}${RECORD_SEP}${toKind}${RECORD_SEP}${toId}`;\n if (matchOn.length === 0) return endpointPart;\n\n const sortedFields = [...matchOn].toSorted();\n const propertyParts = sortedFields.map(\n (field) =>\n `${RECORD_SEP}${field}${UNIT_SEP}${stableStringify(props[field])}`,\n );\n return endpointPart + propertyParts.join(\"\");\n}\n\n/**\n * Endpoint-only key for grouping findEdgesByKind queries.\n */\nfunction buildEndpointPairKey(\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n): string {\n return `${fromKind}${RECORD_SEP}${fromId}${RECORD_SEP}${toKind}${RECORD_SEP}${toId}`;\n}\n\ntype EdgeMatch = Readonly<{\n liveRow: BackendEdgeRow | undefined;\n deletedRow: BackendEdgeRow | undefined;\n}>;\n\n/**\n * Finds the best matching edge from candidate rows.\n * Partitions into live vs deleted; prefers live.\n */\nfunction findMatchingEdge(\n rows: readonly BackendEdgeRow[],\n matchOn: readonly string[],\n inputProps: Record<string, unknown>,\n): EdgeMatch {\n let liveRow: BackendEdgeRow | undefined;\n let deletedRow: BackendEdgeRow | undefined;\n\n for (const row of rows) {\n if (matchOn.length > 0) {\n const rowProps = JSON.parse(row.props) as Record<string, unknown>;\n const matches = matchOn.every(\n (field) =>\n stableStringify(rowProps[field]) ===\n stableStringify(inputProps[field]),\n );\n if (!matches) continue;\n }\n\n if (row.deleted_at === undefined) {\n liveRow ??= row;\n } else {\n deletedRow ??= row;\n }\n\n if (liveRow !== undefined) break;\n }\n\n return { liveRow, deletedRow };\n}\n\n/**\n * Executes a single findByEndpoints operation.\n *\n * Looks up a live edge by endpoints and optional matchOn fields.\n * Returns the edge if found, or undefined. Soft-deleted edges are excluded.\n */\nexport async function executeEdgeFindByEndpoints<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n props?: Record<string, unknown>;\n }>,\n): Promise<Edge | undefined> {\n const matchOn = options?.matchOn ?? [];\n const props = options?.props ?? {};\n\n const registration = getEdgeRegistration(ctx.graph, kind);\n const edgeKind = registration.type;\n\n if (matchOn.length > 0) {\n validateMatchOnFields(edgeKind.schema, matchOn, kind);\n }\n\n const candidateRows = await backend.findEdgesByKind({\n graphId: ctx.graphId,\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n excludeDeleted: true,\n });\n\n if (candidateRows.length === 0) return undefined;\n\n if (matchOn.length === 0) return rowToEdge(candidateRows[0]!);\n\n const { liveRow } = findMatchingEdge(candidateRows, matchOn, props);\n return liveRow === undefined ? undefined : rowToEdge(liveRow);\n}\n\n/**\n * Executes a single getOrCreateByEndpoints operation.\n */\nexport async function executeEdgeGetOrCreateByEndpoints<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n kind: string,\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n): Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>> {\n const ifExists = options?.ifExists ?? \"return\";\n const matchOn = options?.matchOn ?? [];\n\n const registration = getEdgeRegistration(ctx.graph, kind);\n const edgeKind = registration.type;\n\n // Validate props\n const validatedProps = validateEdgeProps(edgeKind.schema, props, {\n kind,\n operation: \"create\",\n });\n\n // Validate matchOn fields\n validateMatchOnFields(edgeKind.schema, matchOn, kind);\n\n // Query all edges of this kind between (from, to) including tombstones\n const candidateRows = await backend.findEdgesByKind({\n graphId: ctx.graphId,\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n excludeDeleted: false,\n temporalMode: \"includeTombstones\",\n });\n\n const { liveRow, deletedRow } = findMatchingEdge(\n candidateRows,\n matchOn,\n validatedProps,\n );\n\n // No match → create new edge\n if (liveRow === undefined && deletedRow === undefined) {\n const input: CreateEdgeInput = {\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n props: validatedProps,\n };\n const edge = await executeEdgeCreate(ctx, input, backend);\n return { edge, action: \"created\" };\n }\n\n // Live match found\n if (liveRow !== undefined) {\n if (ifExists === \"return\") {\n return { edge: rowToEdge(liveRow), action: \"found\" };\n }\n // ifExists === \"update\"\n const edge = await executeEdgeUpsertUpdate(\n ctx,\n { id: liveRow.id, props: validatedProps },\n backend,\n );\n return { edge, action: \"updated\" };\n }\n\n // Deleted match only → check cardinality before resurrect\n const cardinality = registration.cardinality ?? \"many\";\n // deletedRow is guaranteed defined here because we checked both undefined above\n const matchedDeletedRow = deletedRow!;\n const effectiveValidTo = matchedDeletedRow.valid_to;\n const constraintContext: ConstraintContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await checkCardinalityConstraint(\n constraintContext,\n kind,\n cardinality,\n fromKind,\n fromId,\n toKind,\n toId,\n effectiveValidTo,\n );\n\n const edge = await executeEdgeUpsertUpdate(\n ctx,\n { id: matchedDeletedRow.id, props: validatedProps },\n backend,\n { clearDeleted: true },\n );\n return { edge, action: \"resurrected\" };\n}\n\n/**\n * Executes a bulk getOrCreateByEndpoints operation.\n */\nexport async function executeEdgeBulkGetOrCreateByEndpoints<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n kind: string,\n items: readonly Readonly<{\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n }>[],\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{\n matchOn?: readonly string[];\n ifExists?: IfExistsMode;\n }>,\n): Promise<Readonly<{ edge: Edge; action: GetOrCreateAction }>[]> {\n if (items.length === 0) return [];\n\n const ifExists = options?.ifExists ?? \"return\";\n const matchOn = options?.matchOn ?? [];\n\n const registration = getEdgeRegistration(ctx.graph, kind);\n const edgeKind = registration.type;\n const cardinality = registration.cardinality ?? \"many\";\n\n // Validate matchOn fields once\n validateMatchOnFields(edgeKind.schema, matchOn, kind);\n\n // Step 1: Validate all props and compute composite keys\n const validated: {\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n validatedProps: Record<string, unknown>;\n compositeKey: string;\n endpointKey: string;\n }[] = [];\n\n for (const item of items) {\n const validatedProps = validateEdgeProps(edgeKind.schema, item.props, {\n kind,\n operation: \"create\",\n });\n\n const compositeKey = buildEdgeCompositeKey(\n item.fromKind,\n item.fromId,\n item.toKind,\n item.toId,\n validatedProps,\n matchOn,\n );\n const endpointKey = buildEndpointPairKey(\n item.fromKind,\n item.fromId,\n item.toKind,\n item.toId,\n );\n\n validated.push({\n fromKind: item.fromKind,\n fromId: item.fromId,\n toKind: item.toKind,\n toId: item.toId,\n validatedProps,\n compositeKey,\n endpointKey,\n });\n }\n\n // Step 2: Group by unique endpoint pair and query edges\n const uniqueEndpoints = new Map<\n string,\n { fromKind: string; fromId: string; toKind: string; toId: string }\n >();\n for (const entry of validated) {\n if (!uniqueEndpoints.has(entry.endpointKey)) {\n uniqueEndpoints.set(entry.endpointKey, {\n fromKind: entry.fromKind,\n fromId: entry.fromId,\n toKind: entry.toKind,\n toId: entry.toId,\n });\n }\n }\n\n // Fetch all candidate rows, grouped by endpoint pair\n const rowsByEndpoint = new Map<string, readonly BackendEdgeRow[]>();\n for (const [endpointKey, endpoint] of uniqueEndpoints) {\n const rows = await backend.findEdgesByKind({\n graphId: ctx.graphId,\n kind,\n fromKind: endpoint.fromKind,\n fromId: endpoint.fromId,\n toKind: endpoint.toKind,\n toId: endpoint.toId,\n excludeDeleted: false,\n temporalMode: \"includeTombstones\",\n });\n rowsByEndpoint.set(endpointKey, rows);\n }\n\n // Step 3: Partition into toCreate, toFetch, and duplicates\n interface CreateEntry {\n index: number;\n input: CreateEdgeInput;\n }\n interface FetchEntry {\n index: number;\n row: BackendEdgeRow;\n isDeleted: boolean;\n validatedProps: Record<string, unknown>;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n }\n\n const toCreate: CreateEntry[] = [];\n const toFetch: FetchEntry[] = [];\n const duplicateOf: { index: number; sourceIndex: number }[] = [];\n const seenKeys = new Map<string, number>();\n\n for (const [index, entry] of validated.entries()) {\n // Check within-batch duplicate\n const previousIndex = seenKeys.get(entry.compositeKey);\n if (previousIndex !== undefined) {\n duplicateOf.push({ index, sourceIndex: previousIndex });\n continue;\n }\n seenKeys.set(entry.compositeKey, index);\n\n const candidateRows = rowsByEndpoint.get(entry.endpointKey) ?? [];\n const { liveRow, deletedRow } = findMatchingEdge(\n candidateRows,\n matchOn,\n entry.validatedProps,\n );\n\n if (liveRow === undefined && deletedRow === undefined) {\n toCreate.push({\n index,\n input: {\n kind,\n fromKind: entry.fromKind,\n fromId: entry.fromId,\n toKind: entry.toKind,\n toId: entry.toId,\n props: entry.validatedProps,\n },\n });\n } else {\n const bestRow = liveRow ?? deletedRow!;\n toFetch.push({\n index,\n row: bestRow,\n isDeleted: liveRow === undefined,\n validatedProps: entry.validatedProps,\n fromKind: entry.fromKind,\n fromId: entry.fromId,\n toKind: entry.toKind,\n toId: entry.toId,\n });\n }\n }\n\n interface Result {\n readonly edge: Edge;\n readonly action: GetOrCreateAction;\n }\n const results: Result[] = Array.from({ length: items.length });\n\n // Step 4: Execute creates in batch\n if (toCreate.length > 0) {\n const createInputs = toCreate.map((entry) => entry.input);\n const createdEdges = await executeEdgeCreateBatch(\n ctx,\n createInputs,\n backend,\n );\n for (const [batchIndex, entry] of toCreate.entries()) {\n results[entry.index] = {\n edge: createdEdges[batchIndex]!,\n action: \"created\",\n };\n }\n }\n\n // Step 5: Handle existing edges (update/skip/resurrect)\n for (const entry of toFetch) {\n if (entry.isDeleted) {\n // Check cardinality before resurrect\n const effectiveValidTo = entry.row.valid_to;\n const constraintContext: ConstraintContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await checkCardinalityConstraint(\n constraintContext,\n kind,\n cardinality,\n entry.fromKind,\n entry.fromId,\n entry.toKind,\n entry.toId,\n effectiveValidTo,\n );\n\n const edge = await executeEdgeUpsertUpdate(\n ctx,\n { id: entry.row.id, props: entry.validatedProps },\n backend,\n { clearDeleted: true },\n );\n results[entry.index] = { edge, action: \"resurrected\" };\n } else if (ifExists === \"update\") {\n const edge = await executeEdgeUpsertUpdate(\n ctx,\n { id: entry.row.id, props: entry.validatedProps },\n backend,\n );\n results[entry.index] = { edge, action: \"updated\" };\n } else {\n results[entry.index] = { edge: rowToEdge(entry.row), action: \"found\" };\n }\n }\n\n // Step 6: Resolve within-batch duplicates\n for (const { index, sourceIndex } of duplicateOf) {\n const sourceResult = results[sourceIndex]!;\n results[index] = { edge: sourceResult.edge, action: \"found\" };\n }\n\n return results;\n}\n","/**\n * Embedding Sync Utilities\n *\n * Handles automatic synchronization of embedding fields with the embeddings table.\n * When nodes with embedding properties are created, updated, or deleted,\n * these utilities ensure the embeddings table stays in sync.\n */\nimport { type z } from \"zod\";\n\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport { getEmbeddingDimensions, isEmbeddingSchema } from \"../core/embedding\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Information about an embedding field in a node schema.\n */\ntype EmbeddingFieldInfo = Readonly<{\n /** The field path (e.g., \"embedding\" or \"contentEmbedding\") */\n fieldPath: string;\n /** The number of dimensions for this embedding */\n dimensions: number;\n}>;\n\n/**\n * Context for embedding sync operations.\n */\nexport type EmbeddingSyncContext = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n backend: GraphBackend | TransactionBackend;\n}>;\n\n// ============================================================\n// Schema Introspection\n// ============================================================\n\n/**\n * Extracts embedding field information from a Zod schema.\n * Returns all embedding fields found at the top level of an object schema.\n */\nexport function getEmbeddingFields(\n schema: z.ZodType,\n): readonly EmbeddingFieldInfo[] {\n // Check if schema is an object type\n if (schema.type !== \"object\") {\n return [];\n }\n\n const def = schema.def as { shape?: Record<string, z.ZodType> };\n const shape = def.shape;\n if (!shape) {\n return [];\n }\n\n const fields: EmbeddingFieldInfo[] = [];\n\n for (const [fieldPath, fieldSchema] of Object.entries(shape)) {\n // Check if this field is an embedding (possibly wrapped in optional/nullable)\n const dimensions = getEmbeddingDimensionsFromField(fieldSchema);\n if (dimensions !== undefined) {\n fields.push({ fieldPath, dimensions });\n }\n }\n\n return fields;\n}\n\n/**\n * Gets embedding dimensions from a field schema, handling wrappers like optional/nullable.\n */\nfunction getEmbeddingDimensionsFromField(\n schema: z.ZodType,\n): number | undefined {\n // Check the schema directly\n const directDimensions = getEmbeddingDimensions(schema);\n if (directDimensions !== undefined) {\n return directDimensions;\n }\n\n // Check if it's wrapped (optional, nullable, default, etc.)\n const unwrapped = unwrapToEmbedding(schema);\n if (unwrapped) {\n return getEmbeddingDimensions(unwrapped);\n }\n\n return undefined;\n}\n\n/**\n * Unwraps wrapper types to find an embedding schema.\n */\nfunction unwrapToEmbedding(schema: z.ZodType): z.ZodType | undefined {\n const type = schema.type;\n const def = schema.def as { innerType?: z.ZodType };\n\n // Handle common wrapper types\n if (\n (type === \"optional\" ||\n type === \"nullable\" ||\n type === \"default\" ||\n type === \"readonly\") &&\n def.innerType\n ) {\n // Check if inner type is an embedding\n if (isEmbeddingSchema(def.innerType)) {\n return def.innerType;\n }\n // Recursively unwrap\n return unwrapToEmbedding(def.innerType);\n }\n\n return undefined;\n}\n\n// ============================================================\n// Embedding Sync Operations\n// ============================================================\n\n/**\n * Syncs embeddings after a node create or update operation.\n *\n * For each embedding field in the schema:\n * - If the props contain an embedding value, upsert it to the embeddings table\n * - If the props don't contain an embedding value (undefined), delete any existing embedding\n */\nexport async function syncEmbeddings(\n ctx: EmbeddingSyncContext,\n schema: z.ZodType,\n props: Record<string, unknown>,\n): Promise<void> {\n const { backend } = ctx;\n\n // Check if backend supports embedding operations\n if (!backend.upsertEmbedding || !backend.deleteEmbedding) {\n return;\n }\n\n const embeddingFields = getEmbeddingFields(schema);\n if (embeddingFields.length === 0) {\n return;\n }\n\n for (const field of embeddingFields) {\n const value = props[field.fieldPath];\n\n if (isValidEmbeddingValue(value)) {\n // Upsert the embedding\n await backend.upsertEmbedding({\n graphId: ctx.graphId,\n nodeKind: ctx.nodeKind,\n nodeId: ctx.nodeId,\n fieldPath: field.fieldPath,\n embedding: value,\n dimensions: field.dimensions,\n });\n } else if (value === undefined) {\n // Delete any existing embedding for this field\n await backend.deleteEmbedding({\n graphId: ctx.graphId,\n nodeKind: ctx.nodeKind,\n nodeId: ctx.nodeId,\n fieldPath: field.fieldPath,\n });\n }\n // If value is null or invalid, skip (validation should have caught this)\n }\n}\n\n/**\n * Deletes all embeddings for a node.\n */\nexport async function deleteNodeEmbeddings(\n ctx: EmbeddingSyncContext,\n schema: z.ZodType,\n): Promise<void> {\n const { backend } = ctx;\n\n // Check if backend supports embedding operations\n if (!backend.deleteEmbedding) {\n return;\n }\n\n const embeddingFields = getEmbeddingFields(schema);\n if (embeddingFields.length === 0) {\n return;\n }\n\n for (const field of embeddingFields) {\n await backend.deleteEmbedding({\n graphId: ctx.graphId,\n nodeKind: ctx.nodeKind,\n nodeId: ctx.nodeId,\n fieldPath: field.fieldPath,\n });\n }\n}\n\n// ============================================================\n// Validation Helpers\n// ============================================================\n\n/**\n * Checks if a value is a valid embedding (array of numbers).\n */\nfunction isValidEmbeddingValue(value: unknown): value is readonly number[] {\n if (!Array.isArray(value)) {\n return false;\n }\n return value.every((n) => typeof n === \"number\" && Number.isFinite(n));\n}\n","/**\n * Uniqueness Constraint Management\n *\n * Handles checking, inserting, updating, and deleting uniqueness constraint entries.\n */\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport {\n checkWherePredicate,\n computeUniqueKey,\n getKindsForUniquenessCheck,\n} from \"../constraints\";\nimport { type UniqueConstraint } from \"../core/types\";\nimport { UniquenessError } from \"../errors\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\n\n/**\n * Context for uniqueness operations.\n */\nexport type UniquenessContext = Readonly<{\n graphId: string;\n registry: KindRegistry;\n backend: GraphBackend | TransactionBackend;\n}>;\n\n/**\n * Checks uniqueness constraints for a new or existing node.\n *\n * @throws ValidationError if any constraint is violated\n */\nexport async function checkUniquenessConstraints(\n ctx: UniquenessContext,\n kind: string,\n id: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n if (!checkWherePredicate(constraint, props)) {\n continue;\n }\n\n const key = computeUniqueKey(\n props,\n constraint.fields,\n constraint.collation,\n );\n\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n for (const kindToCheck of kindsToCheck) {\n const existing = await ctx.backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key,\n });\n\n if (existing && existing.node_id !== id) {\n throw new UniquenessError({\n constraintName: constraint.name,\n kind: kindToCheck,\n existingId: existing.node_id,\n newId: id,\n fields: constraint.fields,\n });\n }\n }\n }\n}\n\n/**\n * Inserts uniqueness entries for a newly created node.\n */\nexport async function insertUniquenessEntries(\n ctx: UniquenessContext,\n kind: string,\n id: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n if (!checkWherePredicate(constraint, props)) {\n continue;\n }\n\n const key = computeUniqueKey(\n props,\n constraint.fields,\n constraint.collation,\n );\n\n await ctx.backend.insertUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key,\n nodeId: id,\n concreteKind: kind,\n });\n }\n}\n\n/**\n * Deletes uniqueness entries for a node being deleted.\n */\nexport async function deleteUniquenessEntries(\n ctx: UniquenessContext,\n kind: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n if (!checkWherePredicate(constraint, props)) {\n continue;\n }\n\n const key = computeUniqueKey(\n props,\n constraint.fields,\n constraint.collation,\n );\n\n await ctx.backend.deleteUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key,\n });\n }\n}\n\n/**\n * Updates uniqueness entries when a node's props change.\n * Handles cases where:\n * - Constraint now applies (wasn't before)\n * - Constraint no longer applies (was before)\n * - Key value changed\n *\n * @throws ValidationError if updated value violates a constraint\n */\nexport async function updateUniquenessEntries(\n ctx: UniquenessContext,\n kind: string,\n id: string,\n oldProps: Record<string, unknown>,\n newProps: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n const oldApplies = checkWherePredicate(constraint, oldProps);\n const newApplies = checkWherePredicate(constraint, newProps);\n\n const oldKey =\n oldApplies ?\n computeUniqueKey(oldProps, constraint.fields, constraint.collation)\n : undefined;\n const newKey =\n newApplies ?\n computeUniqueKey(newProps, constraint.fields, constraint.collation)\n : undefined;\n\n // No change - constraint didn't apply and still doesn't\n if (!oldApplies && !newApplies) {\n continue;\n }\n\n // Keys are the same and constraint still applies - nothing to do\n if (oldApplies && newApplies && oldKey === newKey) {\n continue;\n }\n\n // Delete old entry if constraint used to apply\n if (oldApplies && oldKey !== undefined) {\n await ctx.backend.deleteUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key: oldKey,\n });\n }\n\n // Check and insert new entry if constraint now applies\n if (newApplies && newKey !== undefined) {\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n // Check for conflicts with other nodes\n for (const kindToCheck of kindsToCheck) {\n const existing = await ctx.backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key: newKey,\n });\n\n if (existing && existing.node_id !== id) {\n throw new UniquenessError({\n constraintName: constraint.name,\n kind: kindToCheck,\n existingId: existing.node_id,\n newId: id,\n fields: constraint.fields,\n });\n }\n }\n\n // Insert new uniqueness entry\n await ctx.backend.insertUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key: newKey,\n nodeId: id,\n concreteKind: kind,\n });\n }\n }\n}\n","/**\n * Node Operations for Store\n *\n * Handles node CRUD operations: create, update, delete.\n */\nimport {\n type GraphBackend,\n type InsertNodeParams,\n type NodeRow as BackendNodeRow,\n type TransactionBackend,\n type UniqueRow,\n} from \"../../backend/types\";\nimport {\n checkWherePredicate,\n computeUniqueKey,\n getKindsForUniquenessCheck,\n} from \"../../constraints\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type NodeType, type UniqueConstraint } from \"../../core/types\";\nimport {\n DatabaseOperationError,\n KindNotFoundError,\n NodeConstraintNotFoundError,\n NodeNotFoundError,\n RestrictedDeleteError,\n ValidationError,\n} from \"../../errors\";\nimport { validateNodeProps } from \"../../errors/validation\";\nimport { type KindRegistry } from \"../../registry/kind-registry\";\nimport { validateOptionalIsoDate } from \"../../utils/date\";\nimport { generateId } from \"../../utils/id\";\nimport {\n checkDisjointnessConstraint,\n type ConstraintContext,\n} from \"../constraints\";\nimport {\n deleteNodeEmbeddings,\n type EmbeddingSyncContext,\n syncEmbeddings,\n} from \"../embedding-sync\";\nimport { rowToNode } from \"../row-mappers\";\nimport {\n type CreateNodeInput,\n type GetOrCreateAction,\n type Node,\n type NodeGetOrCreateByConstraintOptions,\n type OperationHookContext,\n type UpdateNodeInput,\n} from \"../types\";\nimport {\n checkUniquenessConstraints,\n deleteUniquenessEntries,\n insertUniquenessEntries,\n type UniquenessContext,\n updateUniquenessEntries,\n} from \"../uniqueness\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Context for node operations.\n */\nexport type NodeOperationContext<G extends GraphDef> = Readonly<{\n graph: G;\n graphId: string;\n registry: KindRegistry;\n createOperationContext: (\n operation: \"create\" | \"update\" | \"delete\",\n entity: \"node\" | \"edge\",\n kind: string,\n id: string,\n ) => OperationHookContext;\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => Promise<T>;\n}>;\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\nfunction getNodeRegistration<G extends GraphDef>(graph: G, kind: string) {\n const registration = graph.nodes[kind];\n if (registration === undefined) throw new KindNotFoundError(kind, \"node\");\n return registration;\n}\n\ntype NodeCreatePrepared = Readonly<{\n kind: string;\n id: string;\n nodeKind: NodeType;\n validatedProps: Record<string, unknown>;\n uniqueConstraints: readonly UniqueConstraint[];\n insertParams: InsertNodeParams;\n}>;\n\nfunction buildNodeCacheKey(graphId: string, kind: string, id: string): string {\n return `${graphId}\\u0000${kind}\\u0000${id}`;\n}\n\nfunction buildUniqueCacheKey(\n graphId: string,\n nodeKind: string,\n constraintName: string,\n key: string,\n): string {\n return `${graphId}\\u0000${nodeKind}\\u0000${constraintName}\\u0000${key}`;\n}\n\nfunction createNodeAlreadyExistsError(\n kind: string,\n id: string,\n): ValidationError {\n return new ValidationError(\n `Node already exists: ${kind}/${id}`,\n {\n entityType: \"node\",\n kind,\n operation: \"create\",\n id,\n issues: [{ path: \"id\", message: \"A node with this ID already exists\" }],\n },\n { suggestion: `Use a different ID or update the existing node.` },\n );\n}\n\nfunction buildInsertNodeParams(\n graphId: string,\n kind: string,\n id: string,\n props: Record<string, unknown>,\n validFrom: string | undefined,\n validTo: string | undefined,\n): InsertNodeParams {\n const insertParams: {\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n graphId,\n kind,\n id,\n props,\n };\n if (validFrom !== undefined) insertParams.validFrom = validFrom;\n if (validTo !== undefined) insertParams.validTo = validTo;\n return insertParams;\n}\n\nfunction createPendingUniqueRow(\n graphId: string,\n nodeKind: string,\n constraintName: string,\n key: string,\n nodeId: string,\n): UniqueRow {\n return {\n graph_id: graphId,\n node_kind: nodeKind,\n constraint_name: constraintName,\n key,\n node_id: nodeId,\n concrete_kind: nodeKind,\n deleted_at: undefined,\n };\n}\n\nfunction createNodeBatchValidationBackend(\n graphId: string,\n registry: KindRegistry,\n backend: GraphBackend | TransactionBackend,\n): Readonly<{\n backend: GraphBackend | TransactionBackend;\n registerPendingNode: (params: InsertNodeParams) => void;\n registerPendingUniqueEntries: (\n kind: string,\n id: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n ) => void;\n}> {\n const nodeCache = new Map<\n string,\n Awaited<ReturnType<GraphBackend[\"getNode\"]>>\n >();\n const pendingNodes = new Map<\n string,\n NonNullable<Awaited<ReturnType<GraphBackend[\"getNode\"]>>>\n >();\n const uniqueCache = new Map<\n string,\n Awaited<ReturnType<GraphBackend[\"checkUnique\"]>>\n >();\n const pendingUniqueOwners = new Map<string, string>();\n\n async function getNodeCached(\n lookupGraphId: string,\n kind: string,\n id: string,\n ): Promise<Awaited<ReturnType<GraphBackend[\"getNode\"]>>> {\n const cacheKey = buildNodeCacheKey(lookupGraphId, kind, id);\n const pendingNode = pendingNodes.get(cacheKey);\n if (pendingNode !== undefined) {\n return pendingNode;\n }\n if (nodeCache.has(cacheKey)) {\n return nodeCache.get(cacheKey);\n }\n const existing = await backend.getNode(lookupGraphId, kind, id);\n nodeCache.set(cacheKey, existing);\n return existing;\n }\n\n async function checkUniqueCached(\n params: Parameters<GraphBackend[\"checkUnique\"]>[0],\n ): Promise<Awaited<ReturnType<GraphBackend[\"checkUnique\"]>>> {\n const cacheKey = buildUniqueCacheKey(\n params.graphId,\n params.nodeKind,\n params.constraintName,\n params.key,\n );\n const pendingOwner = pendingUniqueOwners.get(cacheKey);\n if (pendingOwner !== undefined) {\n return createPendingUniqueRow(\n params.graphId,\n params.nodeKind,\n params.constraintName,\n params.key,\n pendingOwner,\n );\n }\n if (uniqueCache.has(cacheKey)) {\n return uniqueCache.get(cacheKey);\n }\n const existing = await backend.checkUnique(params);\n uniqueCache.set(cacheKey, existing);\n return existing;\n }\n\n function registerPendingNode(params: InsertNodeParams): void {\n const cacheKey = buildNodeCacheKey(params.graphId, params.kind, params.id);\n const pendingNode: NonNullable<\n Awaited<ReturnType<GraphBackend[\"getNode\"]>>\n > = {\n graph_id: params.graphId,\n kind: params.kind,\n id: params.id,\n props: JSON.stringify(params.props),\n version: 1,\n valid_from: params.validFrom,\n valid_to: params.validTo,\n created_at: \"\",\n updated_at: \"\",\n deleted_at: undefined,\n };\n pendingNodes.set(cacheKey, pendingNode);\n }\n\n function registerPendingUniqueEntries(\n kind: string,\n id: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n ): void {\n for (const constraint of constraints) {\n if (!checkWherePredicate(constraint, props)) {\n continue;\n }\n const key = computeUniqueKey(\n props,\n constraint.fields,\n constraint.collation,\n );\n const concreteEntryKey = buildUniqueCacheKey(\n graphId,\n kind,\n constraint.name,\n key,\n );\n pendingUniqueOwners.set(concreteEntryKey, id);\n\n if (constraint.scope !== \"kind\") {\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n registry,\n );\n for (const kindToCheck of kindsToCheck) {\n const inheritedEntryKey = buildUniqueCacheKey(\n graphId,\n kindToCheck,\n constraint.name,\n key,\n );\n pendingUniqueOwners.set(inheritedEntryKey, id);\n }\n }\n }\n }\n\n // Override specific methods on the backend for validation caching.\n // The cast is necessary because spreading a union type (GraphBackend | TransactionBackend)\n // produces an intersection of their members, which TypeScript can't narrow back to the union.\n const validationBackend = {\n ...backend,\n getNode: getNodeCached,\n checkUnique: checkUniqueCached,\n } as GraphBackend | TransactionBackend;\n\n return {\n backend: validationBackend,\n registerPendingNode,\n registerPendingUniqueEntries,\n };\n}\n\nasync function validateAndPrepareNodeCreate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: CreateNodeInput,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<NodeCreatePrepared> {\n const kind = input.kind;\n\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Validate props with full context\n const nodeKind = registration.type;\n const validatedProps = validateNodeProps(nodeKind.schema, input.props, {\n kind,\n operation: \"create\",\n });\n\n // Validate temporal fields\n const validFrom = validateOptionalIsoDate(input.validFrom, \"validFrom\");\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Check if node with this kind:id already exists\n const existingNode = await backend.getNode(ctx.graphId, kind, id);\n if (existingNode && !existingNode.deleted_at) {\n throw createNodeAlreadyExistsError(kind, id);\n }\n\n // Check disjointness constraints (for multi-kind nodes with same ID)\n const constraintContext: ConstraintContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await checkDisjointnessConstraint(constraintContext, kind, id);\n\n // Check uniqueness constraints\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n const uniqueConstraints = registration.unique ?? [];\n await checkUniquenessConstraints(\n uniquenessContext,\n kind,\n id,\n validatedProps,\n uniqueConstraints,\n );\n\n return {\n kind,\n id,\n nodeKind,\n validatedProps,\n uniqueConstraints,\n insertParams: buildInsertNodeParams(\n ctx.graphId,\n kind,\n id,\n validatedProps,\n validFrom,\n validTo,\n ),\n };\n}\n\nasync function finalizeNodeCreate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n prepared: NodeCreatePrepared,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await insertUniquenessEntries(\n uniquenessContext,\n prepared.kind,\n prepared.id,\n prepared.validatedProps,\n prepared.uniqueConstraints,\n );\n\n const embeddingSyncContext: EmbeddingSyncContext = {\n graphId: ctx.graphId,\n nodeKind: prepared.kind,\n nodeId: prepared.id,\n backend,\n };\n await syncEmbeddings(\n embeddingSyncContext,\n prepared.nodeKind.schema,\n prepared.validatedProps,\n );\n}\n\n// ============================================================\n// Node Operations\n// ============================================================\n\n/**\n * Executes a node create operation.\n */\nasync function executeNodeCreateInternal<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ returnRow?: boolean }>,\n): Promise<Node | undefined> {\n const kind = input.kind;\n const id = input.id ?? generateId();\n const opContext = ctx.createOperationContext(\"create\", \"node\", kind, id);\n const shouldReturnRow = options?.returnRow ?? true;\n\n return ctx.withOperationHooks(opContext, async () => {\n const prepared = await validateAndPrepareNodeCreate(\n ctx,\n input,\n id,\n backend,\n );\n\n let row: BackendNodeRow | undefined;\n if (shouldReturnRow) {\n row = await backend.insertNode(prepared.insertParams);\n } else {\n await (backend.insertNodeNoReturn?.(prepared.insertParams) ??\n backend.insertNode(prepared.insertParams));\n }\n\n await finalizeNodeCreate(ctx, prepared, backend);\n\n if (row === undefined) return;\n return rowToNode(row);\n });\n}\n\n/**\n * Executes a node create operation and returns the created node.\n */\nexport async function executeNodeCreate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n): Promise<Node> {\n const result = await executeNodeCreateInternal(ctx, input, backend, {\n returnRow: true,\n });\n if (!result) {\n throw new DatabaseOperationError(\n \"Node create failed: expected created node row\",\n { operation: \"insert\", entity: \"node\" },\n );\n }\n return result;\n}\n\n/**\n * Executes a node create operation without returning the created node payload.\n */\nexport async function executeNodeCreateNoReturn<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n await executeNodeCreateInternal(ctx, input, backend, { returnRow: false });\n}\n\n/**\n * Executes batched node creates without returning inserted node payloads.\n *\n * Note: `withOperationHooks` is intentionally skipped for batch throughput.\n * Per-item hooks would negate the performance benefit of batching.\n */\nexport async function executeNodeCreateNoReturnBatch<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n if (inputs.length === 0) {\n return;\n }\n\n const {\n backend: validationBackend,\n registerPendingNode,\n registerPendingUniqueEntries,\n } = createNodeBatchValidationBackend(ctx.graphId, ctx.registry, backend);\n const preparedCreates: NodeCreatePrepared[] = [];\n\n for (const input of inputs) {\n const id = input.id ?? generateId();\n const prepared = await validateAndPrepareNodeCreate(\n ctx,\n input,\n id,\n validationBackend,\n );\n preparedCreates.push(prepared);\n registerPendingNode(prepared.insertParams);\n registerPendingUniqueEntries(\n prepared.kind,\n prepared.id,\n prepared.validatedProps,\n prepared.uniqueConstraints,\n );\n }\n\n const batchInsertParams = preparedCreates.map(\n (prepared) => prepared.insertParams,\n );\n if (backend.insertNodesBatch === undefined) {\n for (const insertParams of batchInsertParams) {\n await (backend.insertNodeNoReturn?.(insertParams) ??\n backend.insertNode(insertParams));\n }\n } else {\n await backend.insertNodesBatch(batchInsertParams);\n }\n\n for (const prepared of preparedCreates) {\n await finalizeNodeCreate(ctx, prepared, backend);\n }\n}\n\n/**\n * Executes batched node creates and returns the inserted node payloads.\n *\n * Uses batch validation caching and a single multi-row INSERT with RETURNING\n * when the backend supports it. Falls back to sequential inserts otherwise.\n *\n * Note: `withOperationHooks` is intentionally skipped for batch throughput.\n * Per-item hooks would negate the performance benefit of batching.\n */\nexport async function executeNodeCreateBatch<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n inputs: readonly CreateNodeInput[],\n backend: GraphBackend | TransactionBackend,\n): Promise<readonly Node[]> {\n if (inputs.length === 0) {\n return [];\n }\n\n const {\n backend: validationBackend,\n registerPendingNode,\n registerPendingUniqueEntries,\n } = createNodeBatchValidationBackend(ctx.graphId, ctx.registry, backend);\n const preparedCreates: NodeCreatePrepared[] = [];\n\n for (const input of inputs) {\n const id = input.id ?? generateId();\n const prepared = await validateAndPrepareNodeCreate(\n ctx,\n input,\n id,\n validationBackend,\n );\n preparedCreates.push(prepared);\n registerPendingNode(prepared.insertParams);\n registerPendingUniqueEntries(\n prepared.kind,\n prepared.id,\n prepared.validatedProps,\n prepared.uniqueConstraints,\n );\n }\n\n const batchInsertParams = preparedCreates.map(\n (prepared) => prepared.insertParams,\n );\n\n let rows: readonly BackendNodeRow[];\n if (backend.insertNodesBatchReturning === undefined) {\n const sequentialRows: BackendNodeRow[] = [];\n for (const insertParams of batchInsertParams) {\n sequentialRows.push(await backend.insertNode(insertParams));\n }\n rows = sequentialRows;\n } else {\n rows = await backend.insertNodesBatchReturning(batchInsertParams);\n }\n\n for (const prepared of preparedCreates) {\n await finalizeNodeCreate(ctx, prepared, backend);\n }\n\n return rows.map((row) => rowToNode(row));\n}\n\n/**\n * Executes a node update operation.\n */\nexport async function executeNodeUpdate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n): Promise<Node> {\n const kind = input.kind;\n const id = input.id;\n const opContext = ctx.createOperationContext(\"update\", \"node\", kind, id);\n\n return ctx.withOperationHooks(opContext, async () => {\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Get existing node\n const existing = await backend.getNode(ctx.graphId, kind, id);\n // If clearDeleted is set, allow updating deleted nodes (used by upsert)\n if (!existing || (existing.deleted_at && !options?.clearDeleted)) {\n throw new NodeNotFoundError(kind, id);\n }\n\n // Merge props\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n const mergedProps = { ...existingProps, ...input.props };\n\n // Validate merged props with full context\n const nodeKind = registration.type;\n const validatedProps = validateNodeProps(nodeKind.schema, mergedProps, {\n kind,\n operation: \"update\",\n id,\n });\n\n // Validate temporal fields\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Handle uniqueness constraint changes\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await updateUniquenessEntries(\n uniquenessContext,\n kind,\n id,\n existingProps,\n validatedProps,\n registration.unique ?? [],\n );\n\n // Update node - conditionally include optional fields\n const updateParams: {\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n incrementVersion?: boolean;\n clearDeleted?: boolean;\n } = {\n graphId: ctx.graphId,\n kind,\n id,\n props: validatedProps,\n incrementVersion: true,\n };\n if (validTo !== undefined) updateParams.validTo = validTo;\n if (options?.clearDeleted) updateParams.clearDeleted = true;\n\n const row = await backend.updateNode(updateParams);\n\n // Sync embeddings with updated props\n const embeddingSyncContext: EmbeddingSyncContext = {\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n backend,\n };\n await syncEmbeddings(embeddingSyncContext, nodeKind.schema, validatedProps);\n\n return rowToNode(row);\n });\n}\n\n/**\n * Executes a node update for upsert — bypasses operation hooks\n * and allows updating soft-deleted nodes when clearDeleted is set.\n */\nexport async function executeNodeUpsertUpdate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n): Promise<Node> {\n const kind = input.kind;\n const id = input.id;\n\n const registration = getNodeRegistration(ctx.graph, kind);\n\n const existing = await backend.getNode(ctx.graphId, kind, id);\n if (!existing || (existing.deleted_at && !options?.clearDeleted)) {\n throw new NodeNotFoundError(kind, id);\n }\n\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n const mergedProps = { ...existingProps, ...input.props };\n\n const nodeKind = registration.type;\n const validatedProps = validateNodeProps(nodeKind.schema, mergedProps, {\n kind,\n operation: \"update\",\n id,\n });\n\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await updateUniquenessEntries(\n uniquenessContext,\n kind,\n id,\n existingProps,\n validatedProps,\n registration.unique ?? [],\n );\n\n const updateParams: {\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n incrementVersion?: boolean;\n clearDeleted?: boolean;\n } = {\n graphId: ctx.graphId,\n kind,\n id,\n props: validatedProps,\n incrementVersion: true,\n };\n if (validTo !== undefined) updateParams.validTo = validTo;\n if (options?.clearDeleted) updateParams.clearDeleted = true;\n\n const row = await backend.updateNode(updateParams);\n\n const embeddingSyncContext: EmbeddingSyncContext = {\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n backend,\n };\n await syncEmbeddings(embeddingSyncContext, nodeKind.schema, validatedProps);\n\n return rowToNode(row);\n}\n\n/**\n * Executes a node delete operation.\n */\nexport async function executeNodeDelete<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n const opContext = ctx.createOperationContext(\"delete\", \"node\", kind, id);\n\n return ctx.withOperationHooks(opContext, async () => {\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Fetch node props BEFORE soft-delete so we can compute unique keys\n const existing = await backend.getNode(ctx.graphId, kind, id);\n if (!existing || existing.deleted_at) {\n // Node already deleted or doesn't exist - nothing to do\n return;\n }\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n\n // Check delete behavior\n const deleteBehavior = registration.onDelete ?? \"restrict\";\n const connectedEdges = await backend.findEdgesConnectedTo({\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n });\n\n if (connectedEdges.length > 0) {\n switch (deleteBehavior) {\n case \"restrict\": {\n // Block deletion if edges exist\n const edgeKinds = [\n ...new Set(connectedEdges.map((edge) => edge.kind)),\n ];\n throw new RestrictedDeleteError({\n nodeKind: kind,\n nodeId: id,\n edgeCount: connectedEdges.length,\n edgeKinds,\n });\n }\n\n case \"cascade\":\n case \"disconnect\": {\n // Both behaviors delete connected edges. \"cascade\" signals intent to\n // remove dependent data; \"disconnect\" signals intent to sever the\n // relationship. The effect is identical because edges cannot exist\n // without both endpoints.\n for (const edge of connectedEdges) {\n await backend.deleteEdge({\n graphId: ctx.graphId,\n id: edge.id,\n });\n }\n break;\n }\n }\n }\n\n await backend.deleteNode({\n graphId: ctx.graphId,\n kind,\n id,\n });\n\n // Delete uniqueness entries\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await deleteUniquenessEntries(\n uniquenessContext,\n kind,\n existingProps,\n registration.unique ?? [],\n );\n\n // Delete embeddings\n const nodeKind = registration.type;\n const embeddingSyncContext: EmbeddingSyncContext = {\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n backend,\n };\n await deleteNodeEmbeddings(embeddingSyncContext, nodeKind.schema);\n });\n}\n\n/**\n * Executes a node hard delete operation (permanent removal).\n *\n * Unlike soft delete, this permanently removes the node and all\n * associated data (uniqueness entries, embeddings) from the database.\n */\nexport async function executeNodeHardDelete<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n const opContext = ctx.createOperationContext(\"delete\", \"node\", kind, id);\n\n return ctx.withOperationHooks(opContext, async () => {\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Check if node exists (we don't care about deleted_at for hard delete)\n const existing = await backend.getNode(ctx.graphId, kind, id);\n if (!existing) {\n // Node doesn't exist - nothing to do\n return;\n }\n\n // Check delete behavior for connected edges\n const deleteBehavior = registration.onDelete ?? \"restrict\";\n const connectedEdges = await backend.findEdgesConnectedTo({\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n });\n\n if (connectedEdges.length > 0) {\n switch (deleteBehavior) {\n case \"restrict\": {\n // Block deletion if edges exist\n const edgeKinds = [\n ...new Set(connectedEdges.map((edge) => edge.kind)),\n ];\n throw new RestrictedDeleteError({\n nodeKind: kind,\n nodeId: id,\n edgeCount: connectedEdges.length,\n edgeKinds,\n });\n }\n\n case \"cascade\":\n case \"disconnect\": {\n // Both behaviors hard-delete connected edges. See soft-delete\n // counterpart for rationale.\n for (const edge of connectedEdges) {\n await backend.hardDeleteEdge({\n graphId: ctx.graphId,\n id: edge.id,\n });\n }\n break;\n }\n }\n }\n\n // Hard delete the node (backend handles uniqueness entries and embeddings).\n // The cascade (uniques, embeddings, edges, node) is not individually atomic,\n // so wrap in a transaction when the backend supports it.\n const hardDelete = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<void> => {\n await target.hardDeleteNode({\n graphId: ctx.graphId,\n kind,\n id,\n });\n };\n\n await (\"transaction\" in backend && backend.capabilities.transactions ?\n backend.transaction(async (tx) => hardDelete(tx))\n : hardDelete(backend));\n });\n}\n\n// ============================================================\n// Get-Or-Create Operations\n// ============================================================\n\nfunction resolveConstraint<G extends GraphDef>(\n graph: G,\n kind: string,\n constraintName: string,\n): UniqueConstraint {\n const registration = getNodeRegistration(graph, kind);\n const constraints = registration.unique ?? [];\n const constraint = constraints.find((c) => c.name === constraintName);\n if (constraint === undefined) {\n throw new NodeConstraintNotFoundError(constraintName, kind);\n }\n return constraint;\n}\n\n/**\n * Executes a single getOrCreateByConstraint operation.\n *\n * Looks up an existing node by uniqueness constraint key.\n * If found, returns it (with optional update). If not found, creates a new one.\n * Soft-deleted matches are always resurrected.\n */\nexport async function executeNodeGetOrCreateByConstraint<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n): Promise<Readonly<{ node: Node; action: GetOrCreateAction }>> {\n const ifExists = options?.ifExists ?? \"return\";\n\n const registration = getNodeRegistration(ctx.graph, kind);\n const nodeKind = registration.type;\n const validatedProps = validateNodeProps(nodeKind.schema, props, {\n kind,\n operation: \"create\",\n });\n\n const constraint = resolveConstraint(ctx.graph, kind, constraintName);\n\n if (!checkWherePredicate(constraint, validatedProps)) {\n // Constraint where predicate doesn't apply — always create\n const input: CreateNodeInput = { kind, props: validatedProps };\n const node = await executeNodeCreate(ctx, input, backend);\n return { node, action: \"created\" };\n }\n\n const key = computeUniqueKey(\n validatedProps,\n constraint.fields,\n constraint.collation,\n );\n\n // Check uniques table across all applicable kinds\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n let existingUniqueRow:\n | { node_id: string; concrete_kind: string; deleted_at: string | undefined }\n | undefined;\n for (const kindToCheck of kindsToCheck) {\n const row = await backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key,\n includeDeleted: true,\n });\n if (row !== undefined) {\n existingUniqueRow = row;\n break;\n }\n }\n\n if (existingUniqueRow === undefined) {\n // No match — create new node\n const input: CreateNodeInput = { kind, props: validatedProps };\n const node = await executeNodeCreate(ctx, input, backend);\n return { node, action: \"created\" };\n }\n\n // Match found — fetch using concrete_kind (may differ from requested kind\n // when scope is \"kindWithSubClasses\" and the match is on a sibling/parent kind)\n const existingRow = await backend.getNode(\n ctx.graphId,\n existingUniqueRow.concrete_kind,\n existingUniqueRow.node_id,\n );\n\n if (existingRow === undefined) {\n // Unique entry exists but node doesn't — create fresh\n const input: CreateNodeInput = { kind, props: validatedProps };\n const node = await executeNodeCreate(ctx, input, backend);\n return { node, action: \"created\" };\n }\n\n const isSoftDeleted = existingRow.deleted_at !== undefined;\n\n if (isSoftDeleted || ifExists === \"update\") {\n const concreteKind = existingUniqueRow.concrete_kind;\n const node = await executeNodeUpsertUpdate(\n ctx,\n {\n kind: concreteKind,\n id: existingRow.id as UpdateNodeInput[\"id\"],\n props: validatedProps,\n },\n backend,\n { clearDeleted: isSoftDeleted },\n );\n return { node, action: isSoftDeleted ? \"resurrected\" : \"updated\" };\n }\n\n // ifExists === \"return\" and node is live — return as-is\n return { node: rowToNode(existingRow), action: \"found\" };\n}\n\n/**\n * Executes a single findByConstraint operation.\n *\n * Looks up an existing node by uniqueness constraint key.\n * Returns the node if found (live only), or undefined if not found.\n * Soft-deleted nodes are excluded.\n */\nexport async function executeNodeFindByConstraint<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n constraintName: string,\n props: Record<string, unknown>,\n backend: GraphBackend | TransactionBackend,\n): Promise<Node | undefined> {\n const registration = getNodeRegistration(ctx.graph, kind);\n const nodeKind = registration.type;\n const validatedProps = validateNodeProps(nodeKind.schema, props, {\n kind,\n operation: \"create\",\n });\n\n const constraint = resolveConstraint(ctx.graph, kind, constraintName);\n\n if (!checkWherePredicate(constraint, validatedProps)) return undefined;\n\n const key = computeUniqueKey(\n validatedProps,\n constraint.fields,\n constraint.collation,\n );\n\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n let existingUniqueRow:\n | { node_id: string; concrete_kind: string; deleted_at: string | undefined }\n | undefined;\n for (const kindToCheck of kindsToCheck) {\n const row = await backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key,\n includeDeleted: false,\n });\n if (row !== undefined) {\n existingUniqueRow = row;\n break;\n }\n }\n\n if (existingUniqueRow === undefined) return undefined;\n\n const existingRow = await backend.getNode(\n ctx.graphId,\n existingUniqueRow.concrete_kind,\n existingUniqueRow.node_id,\n );\n\n if (existingRow === undefined || existingRow.deleted_at !== undefined)\n return undefined;\n\n return rowToNode(existingRow);\n}\n\n/**\n * Executes a bulk findByConstraint operation.\n *\n * Batch-checks existing keys and returns matched live nodes in input order.\n * Returns undefined for entries that don't match.\n */\nexport async function executeNodeBulkFindByConstraint<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n): Promise<(Node | undefined)[]> {\n if (items.length === 0) return [];\n\n const registration = getNodeRegistration(ctx.graph, kind);\n const nodeKind = registration.type;\n const constraint = resolveConstraint(ctx.graph, kind, constraintName);\n\n // Step 1: Validate all props and compute keys\n const validated: {\n validatedProps: Record<string, unknown>;\n key: string | undefined;\n }[] = [];\n\n for (const item of items) {\n const validatedProps = validateNodeProps(nodeKind.schema, item.props, {\n kind,\n operation: \"create\",\n });\n const applies = checkWherePredicate(constraint, validatedProps);\n const key =\n applies ?\n computeUniqueKey(\n validatedProps,\n constraint.fields,\n constraint.collation,\n )\n : undefined;\n validated.push({ validatedProps, key });\n }\n\n // Step 2: Batch-check existing keys (live only)\n const uniqueKeys = [\n ...new Set(\n validated.map((v) => v.key).filter((k): k is string => k !== undefined),\n ),\n ];\n\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n const existingByKey = new Map<\n string,\n { node_id: string; concrete_kind: string }\n >();\n\n if (uniqueKeys.length > 0) {\n for (const kindToCheck of kindsToCheck) {\n if (backend.checkUniqueBatch === undefined) {\n for (const key of uniqueKeys) {\n if (existingByKey.has(key)) continue;\n const row = await backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key,\n includeDeleted: false,\n });\n if (row !== undefined) {\n existingByKey.set(row.key, row);\n }\n }\n } else {\n const rows = await backend.checkUniqueBatch({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n keys: uniqueKeys,\n includeDeleted: false,\n });\n for (const row of rows) {\n if (!existingByKey.has(row.key)) {\n existingByKey.set(row.key, row);\n }\n }\n }\n }\n }\n\n // Step 3: Fetch matched nodes and assemble results\n const results: (Node | undefined)[] = Array.from({ length: items.length });\n const seenKeys = new Map<string, number>();\n\n for (const [index, { key }] of validated.entries()) {\n if (key === undefined) {\n results[index] = undefined;\n continue;\n }\n\n const previousIndex = seenKeys.get(key);\n if (previousIndex !== undefined) {\n results[index] = results[previousIndex];\n continue;\n }\n seenKeys.set(key, index);\n\n const existing = existingByKey.get(key);\n if (existing === undefined) {\n results[index] = undefined;\n continue;\n }\n\n const existingRow = await backend.getNode(\n ctx.graphId,\n existing.concrete_kind,\n existing.node_id,\n );\n\n if (existingRow === undefined || existingRow.deleted_at !== undefined) {\n results[index] = undefined;\n continue;\n }\n\n results[index] = rowToNode(existingRow);\n }\n\n return results;\n}\n\n/**\n * Executes a bulk getOrCreateByConstraint operation.\n *\n * Batch-checks existing keys, partitions into creates and fetches,\n * and assembles results in input order.\n */\nexport async function executeNodeBulkGetOrCreateByConstraint<\n G extends GraphDef,\n>(\n ctx: NodeOperationContext<G>,\n kind: string,\n constraintName: string,\n items: readonly Readonly<{ props: Record<string, unknown> }>[],\n backend: GraphBackend | TransactionBackend,\n options?: NodeGetOrCreateByConstraintOptions,\n): Promise<Readonly<{ node: Node; action: GetOrCreateAction }>[]> {\n if (items.length === 0) return [];\n\n const ifExists = options?.ifExists ?? \"return\";\n const registration = getNodeRegistration(ctx.graph, kind);\n const nodeKind = registration.type;\n const constraint = resolveConstraint(ctx.graph, kind, constraintName);\n\n // Step 1: Validate all props and compute keys\n const validated: {\n validatedProps: Record<string, unknown>;\n key: string | undefined;\n }[] = [];\n\n for (const item of items) {\n const validatedProps = validateNodeProps(nodeKind.schema, item.props, {\n kind,\n operation: \"create\",\n });\n const applies = checkWherePredicate(constraint, validatedProps);\n const key =\n applies ?\n computeUniqueKey(\n validatedProps,\n constraint.fields,\n constraint.collation,\n )\n : undefined;\n validated.push({ validatedProps, key });\n }\n\n // Step 2: Batch-check existing keys\n const uniqueKeys = [\n ...new Set(\n validated.map((v) => v.key).filter((k): k is string => k !== undefined),\n ),\n ];\n\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n // Map from key -> UniqueRow for matches found\n const existingByKey = new Map<\n string,\n { node_id: string; concrete_kind: string; deleted_at: string | undefined }\n >();\n\n if (uniqueKeys.length > 0) {\n for (const kindToCheck of kindsToCheck) {\n if (backend.checkUniqueBatch === undefined) {\n // Fallback to sequential checkUnique\n for (const key of uniqueKeys) {\n if (existingByKey.has(key)) continue;\n const row = await backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key,\n includeDeleted: true,\n });\n if (row !== undefined) {\n existingByKey.set(row.key, row);\n }\n }\n } else {\n const rows = await backend.checkUniqueBatch({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n keys: uniqueKeys,\n includeDeleted: true,\n });\n for (const row of rows) {\n if (!existingByKey.has(row.key)) {\n existingByKey.set(row.key, row);\n }\n }\n }\n }\n }\n\n // Step 3: Partition into toCreate, toFetch, and duplicates\n const toCreate: { index: number; input: CreateNodeInput }[] = [];\n const toFetch: {\n index: number;\n nodeId: string;\n concreteKind: string;\n validatedProps: Record<string, unknown>;\n isSoftDeleted: boolean;\n }[] = [];\n // Indices that duplicate another entry (within-batch or same existing key).\n // These reuse the result from the first occurrence rather than re-fetching.\n const duplicateOf: { index: number; sourceIndex: number }[] = [];\n\n // Track keys we've already seen in this batch to handle duplicates within the input\n const seenKeys = new Map<string, number>(); // key -> first index\n\n for (const [index, { validatedProps, key }] of validated.entries()) {\n if (key === undefined) {\n // Constraint doesn't apply — always create\n toCreate.push({\n index,\n input: { kind, props: validatedProps },\n });\n continue;\n }\n\n // Check if we've already handled this key in a previous input item\n const previousIndex = seenKeys.get(key);\n if (previousIndex !== undefined) {\n // Duplicate within the batch — reuse the first item's result\n duplicateOf.push({ index, sourceIndex: previousIndex });\n continue;\n }\n\n seenKeys.set(key, index);\n\n const existing = existingByKey.get(key);\n if (existing === undefined) {\n toCreate.push({\n index,\n input: { kind, props: validatedProps },\n });\n } else {\n toFetch.push({\n index,\n nodeId: existing.node_id,\n concreteKind: existing.concrete_kind,\n validatedProps,\n isSoftDeleted: existing.deleted_at !== undefined,\n });\n }\n }\n\n type Result = Readonly<{ node: Node; action: GetOrCreateAction }>;\n\n // Step 4: Execute creates\n const results: Result[] = Array.from({ length: items.length });\n\n if (toCreate.length > 0) {\n const createInputs = toCreate.map((entry) => entry.input);\n const createdNodes = await executeNodeCreateBatch(\n ctx,\n createInputs,\n backend,\n );\n for (const [batchIndex, entry] of toCreate.entries()) {\n results[entry.index] = {\n node: createdNodes[batchIndex]!,\n action: \"created\",\n };\n }\n }\n\n // Step 5: Handle existing nodes (fetch/update/resurrect)\n for (const entry of toFetch) {\n const { index, concreteKind, validatedProps, isSoftDeleted, nodeId } =\n entry;\n\n const existingRow = await backend.getNode(\n ctx.graphId,\n concreteKind,\n nodeId,\n );\n\n if (existingRow === undefined) {\n const input: CreateNodeInput = { kind, props: validatedProps };\n const node = await executeNodeCreate(ctx, input, backend);\n results[index] = { node, action: \"created\" };\n continue;\n }\n\n if (isSoftDeleted || ifExists === \"update\") {\n const node = await executeNodeUpsertUpdate(\n ctx,\n {\n kind: concreteKind,\n id: existingRow.id as UpdateNodeInput[\"id\"],\n props: validatedProps,\n },\n backend,\n { clearDeleted: isSoftDeleted },\n );\n results[index] = {\n node,\n action: isSoftDeleted ? \"resurrected\" : \"updated\",\n };\n } else {\n results[index] = { node: rowToNode(existingRow), action: \"found\" };\n }\n }\n\n // Step 6: Resolve within-batch duplicates by copying the first occurrence's result\n for (const { index, sourceIndex } of duplicateOf) {\n const sourceResult = results[sourceIndex]!;\n results[index] = { node: sourceResult.node, action: \"found\" };\n }\n\n return results;\n}\n","/**\n * Main Store implementation for TypeGraph.\n *\n * The Store is the primary interface for interacting with a TypeGraph.\n * It coordinates:\n * - Node and edge CRUD operations\n * - Constraint validation\n * - Schema management\n * - Transaction handling\n */\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport { type GraphDef } from \"../core/define-graph\";\nimport type { TraversalExpansion } from \"../query/ast\";\nimport { createQueryBuilder, type QueryBuilder } from \"../query/builder\";\nimport { createSqlSchema } from \"../query/compiler/schema\";\nimport { buildKindRegistry, type KindRegistry } from \"../registry\";\nimport { nowIso } from \"../utils/date\";\nimport { generateId } from \"../utils/id\";\nimport {\n createEdgeCollectionsProxy,\n createNodeCollectionsProxy,\n type EdgeOperations,\n type NodeOperations,\n} from \"./collection-factory\";\nimport {\n type EdgeOperationContext,\n executeEdgeBulkGetOrCreateByEndpoints,\n executeEdgeCreate,\n executeEdgeCreateBatch,\n executeEdgeCreateNoReturnBatch,\n executeEdgeDelete,\n executeEdgeFindByEndpoints,\n executeEdgeGetOrCreateByEndpoints,\n executeEdgeHardDelete,\n executeEdgeUpdate,\n executeEdgeUpsertUpdate,\n executeNodeBulkFindByConstraint,\n executeNodeBulkGetOrCreateByConstraint,\n executeNodeCreate,\n executeNodeCreateBatch,\n executeNodeCreateNoReturnBatch,\n executeNodeDelete,\n executeNodeFindByConstraint,\n executeNodeGetOrCreateByConstraint,\n executeNodeHardDelete,\n executeNodeUpdate,\n executeNodeUpsertUpdate,\n type NodeOperationContext,\n} from \"./operations\";\nimport { rowToEdge, rowToNode } from \"./row-mappers\";\nimport {\n type ConstraintNames,\n type HookContext,\n type NodeCollection,\n type OperationHookContext,\n type QueryOptions,\n type StoreHooks,\n type StoreOptions,\n type TransactionContext,\n type TypedEdgeCollection,\n} from \"./types\";\n\n// ============================================================\n// Store Class\n// ============================================================\n\n/**\n * The Store provides typed access to a TypeGraph database.\n *\n * @example\n * ```typescript\n * const store = createStore(myGraph, backend);\n *\n * // Create nodes using collection API\n * const person = await store.nodes.Person.create({\n * name: \"Alice\",\n * email: \"alice@example.com\",\n * });\n *\n * const company = await store.nodes.Company.create({\n * name: \"Acme\",\n * industry: \"Technology\",\n * });\n *\n * // Create edges\n * await store.edges.worksAt.create(\n * { kind: \"Person\", id: person.id },\n * { kind: \"Company\", id: company.id },\n * { role: \"Engineer\" }\n * );\n *\n * // Query with the fluent API\n * const results = await store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(\"Alice\"))\n * .select((ctx) => ctx.p)\n * .execute();\n * ```\n */\nexport class Store<G extends GraphDef> {\n readonly #graph: G;\n readonly #backend: GraphBackend;\n readonly #registry: KindRegistry;\n readonly #hooks: StoreHooks;\n readonly #schema: StoreOptions[\"schema\"];\n readonly #defaultTraversalExpansion: TraversalExpansion;\n #nodeCollections:\n | {\n [K in keyof G[\"nodes\"] & string]-?: NodeCollection<\n G[\"nodes\"][K][\"type\"],\n ConstraintNames<G[\"nodes\"][K]>\n >;\n }\n | undefined;\n #edgeCollections:\n | {\n [K in keyof G[\"edges\"] & string]-?: TypedEdgeCollection<G[\"edges\"][K]>;\n }\n | undefined;\n\n constructor(graph: G, backend: GraphBackend, options?: StoreOptions) {\n this.#graph = graph;\n this.#backend = backend;\n this.#registry = buildKindRegistry(graph);\n this.#hooks = options?.hooks ?? {};\n this.#schema =\n options?.schema ??\n (backend.tableNames ? createSqlSchema(backend.tableNames) : undefined);\n this.#defaultTraversalExpansion =\n options?.queryDefaults?.traversalExpansion ?? \"inverse\";\n }\n\n // === Accessors ===\n\n /** The graph definition */\n get graph(): G {\n return this.#graph;\n }\n\n /** The graph ID */\n get graphId(): string {\n return this.#graph.id;\n }\n\n /** The kind registry for ontology lookups */\n get registry(): KindRegistry {\n return this.#registry;\n }\n\n /** The database backend */\n get backend(): GraphBackend {\n return this.#backend;\n }\n\n // === Collections ===\n\n /**\n * Node collections for ergonomic CRUD operations.\n *\n * @example\n * ```typescript\n * // Create a node\n * const person = await store.nodes.Person.create({ name: \"Alice\" });\n *\n * // Get by ID\n * const fetched = await store.nodes.Person.getById(person.id);\n *\n * // Find all\n * const people = await store.nodes.Person.find({ limit: 10 });\n * ```\n */\n get nodes(): {\n [K in keyof G[\"nodes\"] & string]-?: NodeCollection<\n G[\"nodes\"][K][\"type\"],\n ConstraintNames<G[\"nodes\"][K]>\n >;\n } {\n if (this.#nodeCollections === undefined) {\n this.#nodeCollections = createNodeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n this.#backend,\n this.#nodeOperations,\n );\n }\n\n return this.#nodeCollections;\n }\n\n /**\n * Edge collections for ergonomic CRUD operations.\n *\n * @example\n * ```typescript\n * // Create an edge\n * const edge = await store.edges.worksAt.create(\n * { kind: \"Person\", id: person.id },\n * { kind: \"Company\", id: company.id },\n * { role: \"Engineer\" }\n * );\n *\n * // Find edges from a node\n * const edges = await store.edges.worksAt.findFrom({ kind: \"Person\", id: person.id });\n * ```\n */\n get edges(): {\n [K in keyof G[\"edges\"] & string]-?: TypedEdgeCollection<G[\"edges\"][K]>;\n } {\n if (this.#edgeCollections === undefined) {\n this.#edgeCollections = createEdgeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n this.#backend,\n this.#edgeOperations,\n );\n }\n\n return this.#edgeCollections;\n }\n\n /**\n * Node operations bound to this store instance.\n */\n get #nodeOperations(): NodeOperations {\n const ctx = this.#createNodeOperationContext();\n return {\n defaultTemporalMode: this.#graph.defaults.temporalMode,\n rowToNode: (row) => rowToNode(row),\n executeCreate: (input, backend) => executeNodeCreate(ctx, input, backend),\n executeCreateBatch: (inputs, backend) =>\n executeNodeCreateBatch(ctx, inputs, backend),\n executeCreateNoReturnBatch: (inputs, backend) =>\n executeNodeCreateNoReturnBatch(ctx, inputs, backend),\n executeUpdate: (input, backend, options) =>\n executeNodeUpdate(ctx, { ...input, id: input.id }, backend, options),\n executeUpsertUpdate: (input, backend, options) =>\n executeNodeUpsertUpdate(\n ctx,\n { ...input, id: input.id },\n backend,\n options,\n ),\n executeDelete: (kind, id, backend) =>\n executeNodeDelete(ctx, kind, id, backend),\n executeHardDelete: (kind, id, backend) =>\n executeNodeHardDelete(ctx, kind, id, backend),\n matchesTemporalMode: (row, options) =>\n this.#matchesTemporalMode(row, options),\n createQuery: () => this.query(),\n executeGetOrCreateByConstraint: (\n kind,\n constraintName,\n props,\n backend,\n options,\n ) =>\n executeNodeGetOrCreateByConstraint(\n ctx,\n kind,\n constraintName,\n props,\n backend,\n options,\n ),\n executeBulkGetOrCreateByConstraint: (\n kind,\n constraintName,\n items,\n backend,\n options,\n ) =>\n executeNodeBulkGetOrCreateByConstraint(\n ctx,\n kind,\n constraintName,\n items,\n backend,\n options,\n ),\n executeFindByConstraint: (kind, constraintName, props, backend) =>\n executeNodeFindByConstraint(ctx, kind, constraintName, props, backend),\n executeBulkFindByConstraint: (kind, constraintName, items, backend) =>\n executeNodeBulkFindByConstraint(\n ctx,\n kind,\n constraintName,\n items,\n backend,\n ),\n };\n }\n\n /**\n * Edge operations bound to this store instance.\n */\n get #edgeOperations(): EdgeOperations {\n const ctx = this.#createEdgeOperationContext();\n return {\n defaultTemporalMode: this.#graph.defaults.temporalMode,\n rowToEdge: (row) => rowToEdge(row),\n executeCreate: (input, backend) => executeEdgeCreate(ctx, input, backend),\n executeCreateBatch: (inputs, backend) =>\n executeEdgeCreateBatch(ctx, inputs, backend),\n executeCreateNoReturnBatch: (inputs, backend) =>\n executeEdgeCreateNoReturnBatch(ctx, inputs, backend),\n executeUpdate: (input, backend) => executeEdgeUpdate(ctx, input, backend),\n executeUpsertUpdate: (input, backend, options) =>\n executeEdgeUpsertUpdate(ctx, input, backend, options),\n executeDelete: (id, backend) => executeEdgeDelete(ctx, id, backend),\n executeHardDelete: (id, backend) =>\n executeEdgeHardDelete(ctx, id, backend),\n matchesTemporalMode: (row, options) =>\n this.#matchesTemporalMode(row, options),\n createQuery: () => this.query(),\n executeGetOrCreateByEndpoints: (\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n props,\n backend,\n options,\n ) =>\n executeEdgeGetOrCreateByEndpoints(\n ctx,\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n props,\n backend,\n options,\n ),\n executeBulkGetOrCreateByEndpoints: (kind, items, backend, options) =>\n executeEdgeBulkGetOrCreateByEndpoints(\n ctx,\n kind,\n items,\n backend,\n options,\n ),\n executeFindByEndpoints: (\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n backend,\n options,\n ) =>\n executeEdgeFindByEndpoints(\n ctx,\n kind,\n fromKind,\n fromId,\n toKind,\n toId,\n backend,\n options,\n ),\n };\n }\n\n // === Query Builder ===\n\n /**\n * Creates a query builder for this store.\n *\n * @example\n * ```typescript\n * const results = await store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(\"Alice\"))\n * .select((ctx) => ctx.p)\n * .execute();\n * ```\n */\n query(): QueryBuilder<G> {\n return this.#createQueryForBackend(this.#backend);\n }\n\n // === Transactions ===\n\n /**\n * Executes a function within a transaction.\n *\n * The transaction context provides the same collection API as the Store:\n * - `tx.nodes.Person.create(...)` - Create a node\n * - `tx.edges.worksAt.create(...)` - Create an edge\n *\n * @example\n * ```typescript\n * await store.transaction(async (tx) => {\n * const person = await tx.nodes.Person.create({ name: \"Alice\" });\n * const company = await tx.nodes.Company.create({ name: \"Acme\" });\n * await tx.edges.worksAt.create(\n * { kind: \"Person\", id: person.id },\n * { kind: \"Company\", id: company.id },\n * { role: \"Engineer\" }\n * );\n * });\n * ```\n */\n async transaction<T>(\n fn: (tx: TransactionContext<G>) => Promise<T>,\n ): Promise<T> {\n return this.#backend.transaction(async (txBackend) => {\n const txNodeOperations: NodeOperations = {\n ...this.#nodeOperations,\n createQuery: () => this.#createQueryForBackend(txBackend),\n };\n const txEdgeOperations: EdgeOperations = {\n ...this.#edgeOperations,\n createQuery: () => this.#createQueryForBackend(txBackend),\n };\n\n // Create collections using transaction backend\n const nodes = createNodeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n txBackend,\n txNodeOperations,\n );\n\n const edges = createEdgeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n txBackend,\n txEdgeOperations,\n );\n\n return fn({ nodes, edges });\n });\n }\n\n // === Graph Lifecycle ===\n\n /**\n * Hard-deletes all data for this graph from the database.\n *\n * Removes all nodes, edges, uniqueness entries, embeddings, and schema versions\n * for this graph's ID. No hooks, no per-row logic. Wrapped in a transaction\n * when the backend supports it.\n *\n * The store is usable after clearing — new data can be created immediately.\n */\n async clear(): Promise<void> {\n const doClear = async (\n target: GraphBackend | TransactionBackend,\n ): Promise<void> => {\n await target.clearGraph(this.graphId);\n };\n\n await (this.#backend.capabilities.transactions ?\n this.#backend.transaction(async (tx) => doClear(tx))\n : doClear(this.#backend));\n\n // Reset lazy-initialized collection caches\n this.#nodeCollections = undefined;\n this.#edgeCollections = undefined;\n }\n\n // === Lifecycle ===\n\n /**\n * Closes the store and releases underlying resources.\n *\n * Note: When using the Drizzle adapter, this method does not close the database\n * connection itself, as Drizzle delegates connection management to the user.\n * You should close the underlying database connection (e.g., better-sqlite3 or pg pool)\n * using their respective APIs.\n */\n async close(): Promise<void> {\n await this.#backend.close();\n }\n\n // === Internal: Operation Contexts ===\n\n #createNodeOperationContext(): NodeOperationContext<G> {\n return {\n graph: this.#graph,\n graphId: this.graphId,\n registry: this.#registry,\n createOperationContext: (operation, entity, kind, id) =>\n this.#createOperationContext(operation, entity, kind, id),\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => this.#withOperationHooks(ctx, fn),\n };\n }\n\n #createEdgeOperationContext(): EdgeOperationContext<G> {\n return {\n graph: this.#graph,\n graphId: this.graphId,\n registry: this.#registry,\n createOperationContext: (operation, entity, kind, id) =>\n this.#createOperationContext(operation, entity, kind, id),\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => this.#withOperationHooks(ctx, fn),\n };\n }\n\n // === Internal: Hook Helpers ===\n\n #createHookContext(): HookContext {\n return {\n operationId: generateId(),\n graphId: this.graphId,\n startedAt: new Date(),\n };\n }\n\n #createOperationContext(\n operation: \"create\" | \"update\" | \"delete\",\n entity: \"node\" | \"edge\",\n kind: string,\n id: string,\n ): OperationHookContext {\n return {\n ...this.#createHookContext(),\n operation,\n entity,\n kind,\n id,\n };\n }\n\n async #withOperationHooks<T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ): Promise<T> {\n this.#hooks.onOperationStart?.(ctx);\n const startTime = Date.now();\n try {\n const result = await fn();\n this.#hooks.onOperationEnd?.(ctx, {\n durationMs: Date.now() - startTime,\n });\n return result;\n } catch (error) {\n this.#hooks.onError?.(\n ctx,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n }\n\n // === Internal: Temporal Filtering ===\n\n #matchesTemporalMode(\n row: {\n deleted_at: string | undefined;\n valid_from: string | undefined;\n valid_to: string | undefined;\n },\n options?: QueryOptions,\n ): boolean {\n const mode = options?.temporalMode ?? this.#graph.defaults.temporalMode;\n const asOf = options?.asOf ?? nowIso();\n\n switch (mode) {\n case \"current\":\n case \"asOf\": {\n if (row.deleted_at) return false;\n if (row.valid_from && asOf < row.valid_from) return false;\n if (row.valid_to && asOf >= row.valid_to) return false;\n return true;\n }\n case \"includeEnded\": {\n return !row.deleted_at;\n }\n case \"includeTombstones\": {\n return true;\n }\n }\n }\n\n #createQueryForBackend(\n backend: GraphBackend | TransactionBackend,\n ): QueryBuilder<G> {\n return createQueryBuilder<G>(this.graphId, this.#registry, {\n // TransactionBackend omits transaction/close, but query execution only needs\n // the read-path/query capabilities shared with GraphBackend.\n backend: backend as GraphBackend,\n dialect: backend.dialect,\n defaultTraversalExpansion: this.#defaultTraversalExpansion,\n ...(this.#schema !== undefined && { schema: this.#schema }),\n });\n }\n}\n\n// ============================================================\n// Factory Function\n// ============================================================\n\n/**\n * Creates a new Store instance.\n *\n * @param graph - The graph definition\n * @param backend - The database backend\n * @param options - Optional store configuration including observability hooks\n * @returns A new Store instance\n *\n * @example\n * ```typescript\n * // Basic usage\n * const store = createStore(graph, backend);\n *\n * // With observability hooks\n * const store = createStore(graph, backend, {\n * hooks: {\n * onOperationStart: (ctx) => {\n * console.log(`Starting ${ctx.operation} on ${ctx.entity}:${ctx.kind}`);\n * },\n * onOperationEnd: (ctx, result) => {\n * console.log(`Completed in ${result.durationMs}ms`);\n * },\n * onError: (ctx, error) => {\n * console.error(`Operation ${ctx.operationId} failed:`, error);\n * },\n * },\n * });\n * ```\n */\nexport function createStore<G extends GraphDef>(\n graph: G,\n backend: GraphBackend,\n options?: StoreOptions,\n): Store<G> {\n return new Store(graph, backend, options);\n}\n\n// ============================================================\n// Async Factory with Schema Management\n// ============================================================\n\n// Re-export schema manager types\nexport type {\n SchemaManagerOptions,\n SchemaValidationResult,\n} from \"../schema/manager\";\n\nimport {\n ensureSchema as ensureSchemaImpl,\n type SchemaManagerOptions,\n type SchemaValidationResult,\n} from \"../schema/manager\";\n\n/**\n * Creates a store and ensures the schema is initialized/migrated.\n *\n * This is the recommended way to create a store in production.\n * It automatically:\n * - Initializes the schema on first run (version 1)\n * - Auto-migrates safe changes (additive changes)\n * - Throws MigrationError for breaking changes\n *\n * @param graph - The graph definition\n * @param backend - The database backend\n * @param options - Store and schema options\n * @returns A tuple of [store, validationResult]\n *\n * @example\n * ```typescript\n * const [store, result] = await createStoreWithSchema(graph, backend);\n *\n * if (result.status === \"initialized\") {\n * console.log(\"Schema initialized at version\", result.version);\n * } else if (result.status === \"migrated\") {\n * console.log(`Migrated from v${result.fromVersion} to v${result.toVersion}`);\n * } else if (result.status === \"pending\") {\n * console.log(`Safe changes pending at version ${result.version}`);\n * }\n * ```\n */\nexport async function createStoreWithSchema<G extends GraphDef>(\n graph: G,\n backend: GraphBackend,\n options?: StoreOptions & SchemaManagerOptions,\n): Promise<[Store<G>, SchemaValidationResult]> {\n const store = createStore(graph, backend, options);\n const result = await ensureSchemaImpl(backend, graph, options);\n return [store, result];\n}\n"]}
|