@nicia-ai/typegraph 0.1.0
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/LICENSE +21 -0
- package/README.md +47 -0
- package/dist/ast-BVyihVbP.d.cts +564 -0
- package/dist/ast-BVyihVbP.d.ts +564 -0
- package/dist/backend/drizzle/index.cjs +41 -0
- package/dist/backend/drizzle/index.cjs.map +1 -0
- package/dist/backend/drizzle/index.d.cts +12 -0
- package/dist/backend/drizzle/index.d.ts +12 -0
- package/dist/backend/drizzle/index.js +12 -0
- package/dist/backend/drizzle/index.js.map +1 -0
- package/dist/backend/drizzle/postgres.cjs +27 -0
- package/dist/backend/drizzle/postgres.cjs.map +1 -0
- package/dist/backend/drizzle/postgres.d.cts +37 -0
- package/dist/backend/drizzle/postgres.d.ts +37 -0
- package/dist/backend/drizzle/postgres.js +10 -0
- package/dist/backend/drizzle/postgres.js.map +1 -0
- package/dist/backend/drizzle/schema/postgres.cjs +40 -0
- package/dist/backend/drizzle/schema/postgres.cjs.map +1 -0
- package/dist/backend/drizzle/schema/postgres.d.cts +2419 -0
- package/dist/backend/drizzle/schema/postgres.d.ts +2419 -0
- package/dist/backend/drizzle/schema/postgres.js +7 -0
- package/dist/backend/drizzle/schema/postgres.js.map +1 -0
- package/dist/backend/drizzle/schema/sqlite.cjs +40 -0
- package/dist/backend/drizzle/schema/sqlite.cjs.map +1 -0
- package/dist/backend/drizzle/schema/sqlite.d.cts +2647 -0
- package/dist/backend/drizzle/schema/sqlite.d.ts +2647 -0
- package/dist/backend/drizzle/schema/sqlite.js +7 -0
- package/dist/backend/drizzle/schema/sqlite.js.map +1 -0
- package/dist/backend/drizzle/sqlite.cjs +27 -0
- package/dist/backend/drizzle/sqlite.cjs.map +1 -0
- package/dist/backend/drizzle/sqlite.d.cts +36 -0
- package/dist/backend/drizzle/sqlite.d.ts +36 -0
- package/dist/backend/drizzle/sqlite.js +10 -0
- package/dist/backend/drizzle/sqlite.js.map +1 -0
- package/dist/backend/postgres/index.cjs +53 -0
- package/dist/backend/postgres/index.cjs.map +1 -0
- package/dist/backend/postgres/index.d.cts +12 -0
- package/dist/backend/postgres/index.d.ts +12 -0
- package/dist/backend/postgres/index.js +12 -0
- package/dist/backend/postgres/index.js.map +1 -0
- package/dist/backend/sqlite/index.cjs +117 -0
- package/dist/backend/sqlite/index.cjs.map +1 -0
- package/dist/backend/sqlite/index.d.cts +71 -0
- package/dist/backend/sqlite/index.d.ts +71 -0
- package/dist/backend/sqlite/index.js +78 -0
- package/dist/backend/sqlite/index.js.map +1 -0
- package/dist/chunk-2QHQ2C4P.js +146 -0
- package/dist/chunk-2QHQ2C4P.js.map +1 -0
- package/dist/chunk-3A5TKOEJ.js +306 -0
- package/dist/chunk-3A5TKOEJ.js.map +1 -0
- package/dist/chunk-4PIEL2VO.js +162 -0
- package/dist/chunk-4PIEL2VO.js.map +1 -0
- package/dist/chunk-536PH5FT.js +342 -0
- package/dist/chunk-536PH5FT.js.map +1 -0
- package/dist/chunk-DBFCKELK.cjs +156 -0
- package/dist/chunk-DBFCKELK.cjs.map +1 -0
- package/dist/chunk-DDM2FZRJ.cjs +1143 -0
- package/dist/chunk-DDM2FZRJ.cjs.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-F32HCHYA.cjs +680 -0
- package/dist/chunk-F32HCHYA.cjs.map +1 -0
- package/dist/chunk-IIAT36MI.js +353 -0
- package/dist/chunk-IIAT36MI.js.map +1 -0
- package/dist/chunk-JDAET5LO.js +236 -0
- package/dist/chunk-JDAET5LO.js.map +1 -0
- package/dist/chunk-JEQ2X3Z6.cjs +12 -0
- package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
- package/dist/chunk-JKTO7TW3.js +299 -0
- package/dist/chunk-JKTO7TW3.js.map +1 -0
- package/dist/chunk-K7SQ3SWP.js +497 -0
- package/dist/chunk-K7SQ3SWP.js.map +1 -0
- package/dist/chunk-L642L24T.js +142 -0
- package/dist/chunk-L642L24T.js.map +1 -0
- package/dist/chunk-MFVCSNIY.cjs +308 -0
- package/dist/chunk-MFVCSNIY.cjs.map +1 -0
- package/dist/chunk-MNO33ASC.cjs +240 -0
- package/dist/chunk-MNO33ASC.cjs.map +1 -0
- package/dist/chunk-N4AOJ3VF.cjs +154 -0
- package/dist/chunk-N4AOJ3VF.cjs.map +1 -0
- package/dist/chunk-P5CNM325.cjs +508 -0
- package/dist/chunk-P5CNM325.cjs.map +1 -0
- package/dist/chunk-RYT4H46I.js +646 -0
- package/dist/chunk-RYT4H46I.js.map +1 -0
- package/dist/chunk-SV5H3XM5.cjs +321 -0
- package/dist/chunk-SV5H3XM5.cjs.map +1 -0
- package/dist/chunk-TXHKFLWX.cjs +344 -0
- package/dist/chunk-TXHKFLWX.cjs.map +1 -0
- package/dist/chunk-UJAGXJDG.cjs +170 -0
- package/dist/chunk-UJAGXJDG.cjs.map +1 -0
- package/dist/chunk-VXRVGFCI.js +1128 -0
- package/dist/chunk-VXRVGFCI.js.map +1 -0
- package/dist/chunk-YM5AL65Y.cjs +357 -0
- package/dist/chunk-YM5AL65Y.cjs.map +1 -0
- package/dist/index.cjs +8334 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1365 -0
- package/dist/index.d.ts +1365 -0
- package/dist/index.js +8105 -0
- package/dist/index.js.map +1 -0
- package/dist/indexes/index.cjs +67 -0
- package/dist/indexes/index.cjs.map +1 -0
- package/dist/indexes/index.d.cts +62 -0
- package/dist/indexes/index.d.ts +62 -0
- package/dist/indexes/index.js +6 -0
- package/dist/indexes/index.js.map +1 -0
- package/dist/interchange/index.cjs +612 -0
- package/dist/interchange/index.cjs.map +1 -0
- package/dist/interchange/index.d.cts +288 -0
- package/dist/interchange/index.d.ts +288 -0
- package/dist/interchange/index.js +598 -0
- package/dist/interchange/index.js.map +1 -0
- package/dist/profiler/index.cjs +793 -0
- package/dist/profiler/index.cjs.map +1 -0
- package/dist/profiler/index.d.cts +283 -0
- package/dist/profiler/index.d.ts +283 -0
- package/dist/profiler/index.js +785 -0
- package/dist/profiler/index.js.map +1 -0
- package/dist/store-60Lcfi0w.d.ts +2263 -0
- package/dist/store-Bifii8MZ.d.cts +2263 -0
- package/dist/test-helpers-BjyRYJZX.d.ts +22 -0
- package/dist/test-helpers-NoQXhleQ.d.cts +22 -0
- package/dist/types-BRzHlhKC.d.cts +14 -0
- package/dist/types-BRzHlhKC.d.ts +14 -0
- package/dist/types-BrSfFSpW.d.cts +158 -0
- package/dist/types-CX4cLd7M.d.ts +152 -0
- package/dist/types-CjZ7g_7v.d.ts +442 -0
- package/dist/types-DDOSfrih.d.cts +442 -0
- package/dist/types-D_3mEv2y.d.ts +158 -0
- package/dist/types-a5rAxC92.d.cts +152 -0
- package/package.json +201 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/backend/types.ts","../src/backend/drizzle/operations.ts"],"names":["sql","getTableName","getDialect"],"mappings":"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","file":"chunk-F32HCHYA.cjs","sourcesContent":["/**\n * Backend interface types for TypeGraph storage.\n *\n * The backend abstracts database operations, allowing different\n * SQL implementations (SQLite, PostgreSQL) behind a common interface.\n */\nimport { type SQL } from \"drizzle-orm\";\n\n// ============================================================\n// Vector Search Types\n// ============================================================\n\n/**\n * Supported vector similarity metrics.\n */\nexport type VectorMetric = \"cosine\" | \"l2\" | \"inner_product\";\n\n/**\n * Supported vector index types.\n */\nexport type VectorIndexType = \"hnsw\" | \"ivfflat\" | \"none\";\n\n/**\n * Vector search capabilities.\n */\nexport type VectorCapabilities = Readonly<{\n /** Whether the backend supports vector operations */\n supported: boolean;\n /** Supported similarity metrics */\n metrics: readonly VectorMetric[];\n /** Supported index types */\n indexTypes: readonly VectorIndexType[];\n /** Maximum dimensions supported */\n maxDimensions: number;\n}>;\n\n// ============================================================\n// Dialect & Capabilities\n// ============================================================\n\n/**\n * Supported database dialects.\n * Re-exported from query/dialect for consistency across the codebase.\n */\nimport { type SqlDialect } from \"../query/dialect/types\";\n\nexport type Dialect = SqlDialect;\n\n/**\n * Backend capabilities that vary by dialect.\n */\nexport type BackendCapabilities = Readonly<{\n /** Whether the backend supports JSONB type (vs TEXT for JSON) */\n jsonb: boolean;\n /** Whether the backend supports partial indexes */\n partialIndexes: boolean;\n /** Whether the backend supports GIN indexes for JSON */\n ginIndexes: boolean;\n /** Whether the backend supports CTE (WITH) queries */\n cte: boolean;\n /** Whether the backend supports RETURNING clause */\n returning: boolean;\n /** Whether the backend supports atomic transactions (D1 does not) */\n transactions: boolean;\n /** Vector search capabilities (undefined if not configured) */\n vector?: VectorCapabilities | undefined;\n}>;\n\n// ============================================================\n// Row Types (Database Records)\n// ============================================================\n\n/**\n * A row from the typegraph_nodes table.\n */\nexport type NodeRow = Readonly<{\n graph_id: string;\n kind: string;\n id: string;\n props: string; // JSON string\n version: number;\n valid_from: string | undefined;\n valid_to: string | undefined;\n created_at: string;\n updated_at: string;\n deleted_at: string | undefined;\n}>;\n\n/**\n * A row from the typegraph_edges table.\n */\nexport type EdgeRow = Readonly<{\n graph_id: string;\n id: string;\n kind: string;\n from_kind: string;\n from_id: string;\n to_kind: string;\n to_id: string;\n props: string; // JSON string\n valid_from: string | undefined;\n valid_to: string | undefined;\n created_at: string;\n updated_at: string;\n deleted_at: string | undefined;\n}>;\n\n/**\n * A row from the typegraph_node_uniques table.\n */\nexport type UniqueRow = Readonly<{\n graph_id: string;\n node_kind: string;\n constraint_name: string;\n key: string;\n node_id: string;\n concrete_kind: string;\n deleted_at: string | undefined;\n}>;\n\n/**\n * A row from the typegraph_schema_versions table.\n */\nexport type SchemaVersionRow = Readonly<{\n graph_id: string;\n version: number;\n schema_hash: string;\n schema_doc: string; // JSON string\n created_at: string;\n is_active: boolean;\n}>;\n\n/**\n * A row from the typegraph_node_embeddings table.\n */\nexport type EmbeddingRow = Readonly<{\n graph_id: string;\n node_kind: string;\n node_id: string;\n field_path: string;\n embedding: readonly number[];\n dimensions: number;\n created_at: string;\n updated_at: string;\n}>;\n\n// ============================================================\n// Insert Parameters\n// ============================================================\n\n/**\n * Parameters for inserting a node.\n */\nexport type InsertNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n}>;\n\n/**\n * Parameters for updating a node.\n */\nexport type UpdateNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n incrementVersion?: boolean;\n /** If true, clears deleted_at (un-deletes the node). Used by upsert. */\n clearDeleted?: boolean;\n}>;\n\n/**\n * Parameters for deleting a node (soft delete).\n */\nexport type DeleteNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n}>;\n\n/**\n * Parameters for inserting an edge.\n */\nexport type InsertEdgeParams = Readonly<{\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\n/**\n * Parameters for updating an edge.\n */\nexport type UpdateEdgeParams = Readonly<{\n graphId: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n}>;\n\n/**\n * Parameters for deleting an edge (soft delete).\n */\nexport type DeleteEdgeParams = Readonly<{\n graphId: string;\n id: string;\n}>;\n\n/**\n * Parameters for hard deleting a node (permanent removal).\n */\nexport type HardDeleteNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n}>;\n\n/**\n * Parameters for hard deleting an edge (permanent removal).\n */\nexport type HardDeleteEdgeParams = Readonly<{\n graphId: string;\n id: string;\n}>;\n\n// ============================================================\n// Embedding Parameters\n// ============================================================\n\n/**\n * Parameters for inserting or updating an embedding.\n */\nexport type UpsertEmbeddingParams = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n fieldPath: string;\n embedding: readonly number[];\n dimensions: number;\n}>;\n\n/**\n * Parameters for deleting an embedding.\n */\nexport type DeleteEmbeddingParams = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n fieldPath: string;\n}>;\n\n/**\n * Parameters for vector similarity search.\n */\nexport type VectorSearchParams = Readonly<{\n graphId: string;\n nodeKind: string;\n fieldPath: string;\n queryEmbedding: readonly number[];\n metric: VectorMetric;\n limit: number;\n minScore?: number;\n}>;\n\n/**\n * Result from a vector similarity search.\n */\nexport type VectorSearchResult = Readonly<{\n nodeId: string;\n score: number;\n}>;\n\n/**\n * Parameters for creating a vector index.\n */\nexport type CreateVectorIndexParams = Readonly<{\n graphId: string;\n nodeKind: string;\n fieldPath: string;\n dimensions: number;\n metric: VectorMetric;\n indexType: VectorIndexType;\n /** Index-specific parameters */\n indexParams?: Readonly<{\n /** HNSW: max connections per layer */\n m?: number;\n /** HNSW: construction search depth */\n efConstruction?: number;\n /** IVFFlat: number of lists */\n lists?: number;\n }>;\n}>;\n\n/**\n * Parameters for dropping a vector index.\n */\nexport type DropVectorIndexParams = Readonly<{\n graphId: string;\n nodeKind: string;\n fieldPath: string;\n}>;\n\n// ============================================================\n// Query Types\n// ============================================================\n\n/**\n * Transaction options.\n */\nexport type TransactionOptions = Readonly<{\n /** Transaction isolation level (if supported) */\n isolationLevel?:\n | \"read_uncommitted\"\n | \"read_committed\"\n | \"repeatable_read\"\n | \"serializable\";\n}>;\n\n// ============================================================\n// Backend Interface\n// ============================================================\n\n/**\n * Transaction backend - a backend scoped to a transaction.\n */\nexport type TransactionBackend = Omit<GraphBackend, \"transaction\" | \"close\">;\n\n/**\n * The GraphBackend interface abstracts database operations.\n *\n * Implementations should provide:\n * - SQLite backend via better-sqlite3 or libsql\n * - PostgreSQL backend via pg or postgres\n */\nexport type GraphBackend = Readonly<{\n /** The SQL dialect */\n dialect: Dialect;\n /** Backend capabilities */\n capabilities: BackendCapabilities;\n\n // === Node Operations ===\n insertNode: (params: InsertNodeParams) => Promise<NodeRow>;\n updateNode: (params: UpdateNodeParams) => Promise<NodeRow>;\n deleteNode: (params: DeleteNodeParams) => Promise<void>;\n hardDeleteNode: (params: HardDeleteNodeParams) => Promise<void>;\n getNode: (\n graphId: string,\n kind: string,\n id: string,\n ) => Promise<NodeRow | undefined>;\n\n // === Edge Operations ===\n insertEdge: (params: InsertEdgeParams) => Promise<EdgeRow>;\n updateEdge: (params: UpdateEdgeParams) => Promise<EdgeRow>;\n deleteEdge: (params: DeleteEdgeParams) => Promise<void>;\n hardDeleteEdge: (params: HardDeleteEdgeParams) => Promise<void>;\n getEdge: (graphId: string, id: string) => Promise<EdgeRow | undefined>;\n\n // === Edge Cardinality Operations ===\n countEdgesFrom: (params: CountEdgesFromParams) => Promise<number>;\n edgeExistsBetween: (params: EdgeExistsBetweenParams) => Promise<boolean>;\n\n // === Edge Query Operations ===\n findEdgesConnectedTo: (\n params: FindEdgesConnectedToParams,\n ) => Promise<readonly EdgeRow[]>;\n\n // === Collection Query Operations ===\n findNodesByKind: (\n params: FindNodesByKindParams,\n ) => Promise<readonly NodeRow[]>;\n countNodesByKind: (params: CountNodesByKindParams) => Promise<number>;\n findEdgesByKind: (\n params: FindEdgesByKindParams,\n ) => Promise<readonly EdgeRow[]>;\n countEdgesByKind: (params: CountEdgesByKindParams) => Promise<number>;\n\n // === Unique Constraint Operations ===\n insertUnique: (params: InsertUniqueParams) => Promise<void>;\n deleteUnique: (params: DeleteUniqueParams) => Promise<void>;\n checkUnique: (params: CheckUniqueParams) => Promise<UniqueRow | undefined>;\n\n // === Schema Operations ===\n getActiveSchema: (graphId: string) => Promise<SchemaVersionRow | undefined>;\n getSchemaVersion: (\n graphId: string,\n version: number,\n ) => Promise<SchemaVersionRow | undefined>;\n insertSchema: (params: InsertSchemaParams) => Promise<SchemaVersionRow>;\n setActiveSchema: (graphId: string, version: number) => Promise<void>;\n\n // === Embedding Operations (optional - depends on vector capabilities) ===\n upsertEmbedding?: (params: UpsertEmbeddingParams) => Promise<void>;\n deleteEmbedding?: (params: DeleteEmbeddingParams) => Promise<void>;\n getEmbedding?: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n fieldPath: string,\n ) => Promise<EmbeddingRow | undefined>;\n vectorSearch?: (\n params: VectorSearchParams,\n ) => Promise<readonly VectorSearchResult[]>;\n createVectorIndex?: (params: CreateVectorIndexParams) => Promise<void>;\n dropVectorIndex?: (params: DropVectorIndexParams) => Promise<void>;\n\n // === Query Execution ===\n execute: <T>(query: SQL) => Promise<readonly T[]>;\n\n // === Transaction ===\n transaction: <T>(\n fn: (tx: TransactionBackend) => Promise<T>,\n options?: TransactionOptions,\n ) => Promise<T>;\n\n // === Lifecycle ===\n close: () => Promise<void>;\n}>;\n\n// ============================================================\n// Additional Parameter Types\n// ============================================================\n\n/**\n * Parameters for inserting a unique constraint entry.\n */\nexport type InsertUniqueParams = Readonly<{\n graphId: string;\n nodeKind: string;\n constraintName: string;\n key: string;\n nodeId: string;\n concreteKind: string;\n}>;\n\n/**\n * Parameters for deleting a unique constraint entry.\n */\nexport type DeleteUniqueParams = Readonly<{\n graphId: string;\n nodeKind: string;\n constraintName: string;\n key: string;\n}>;\n\n/**\n * Parameters for checking a unique constraint.\n */\nexport type CheckUniqueParams = Readonly<{\n graphId: string;\n nodeKind: string;\n constraintName: string;\n key: string;\n}>;\n\n/**\n * Parameters for inserting a schema version.\n */\nexport type InsertSchemaParams = Readonly<{\n graphId: string;\n version: number;\n schemaHash: string;\n schemaDoc: Record<string, unknown>;\n isActive: boolean;\n}>;\n\n/**\n * Parameters for counting edges from a source node.\n */\nexport type CountEdgesFromParams = Readonly<{\n graphId: string;\n edgeKind: string;\n fromKind: string;\n fromId: string;\n /** If true, only count edges where valid_to IS NULL */\n activeOnly?: boolean;\n}>;\n\n/**\n * Parameters for checking if an edge exists between two nodes.\n */\nexport type EdgeExistsBetweenParams = Readonly<{\n graphId: string;\n edgeKind: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n}>;\n\n/**\n * Parameters for finding edges connected to a node.\n */\nexport type FindEdgesConnectedToParams = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n}>;\n\n/**\n * Parameters for finding nodes by kind.\n */\nexport type FindNodesByKindParams = Readonly<{\n graphId: string;\n kind: string;\n limit?: number;\n offset?: number;\n /** If true, exclude deleted nodes. Default true. */\n excludeDeleted?: boolean;\n}>;\n\n/**\n * Parameters for counting nodes by kind.\n */\nexport type CountNodesByKindParams = Readonly<{\n graphId: string;\n kind: string;\n /** If true, exclude deleted nodes. Default true. */\n excludeDeleted?: boolean;\n}>;\n\n/**\n * Parameters for finding edges by kind.\n */\nexport type FindEdgesByKindParams = Readonly<{\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 /** If true, exclude deleted edges. Default true. */\n excludeDeleted?: boolean;\n}>;\n\n/**\n * Parameters for counting edges by kind.\n */\nexport type CountEdgesByKindParams = Readonly<{\n graphId: string;\n kind: string;\n fromKind?: string;\n fromId?: string;\n toKind?: string;\n toId?: string;\n /** If true, exclude deleted edges. Default true. */\n excludeDeleted?: boolean;\n}>;\n\n// ============================================================\n// Default Capabilities\n// ============================================================\n\n/**\n * Default capabilities for SQLite.\n */\nexport const SQLITE_CAPABILITIES: BackendCapabilities = {\n jsonb: false, // SQLite uses TEXT with json functions\n partialIndexes: true, // SQLite supports WHERE in CREATE INDEX\n ginIndexes: false, // SQLite doesn't have GIN\n cte: true, // SQLite supports WITH\n returning: true, // SQLite 3.35+ supports RETURNING\n transactions: true, // SQLite supports transactions\n};\n\n/**\n * Default capabilities for PostgreSQL.\n */\nexport const POSTGRES_CAPABILITIES: BackendCapabilities = {\n jsonb: true, // PostgreSQL has native JSONB\n partialIndexes: true,\n ginIndexes: true,\n cte: true,\n returning: true,\n transactions: true, // PostgreSQL supports transactions\n};\n\n/**\n * Capabilities for Cloudflare D1.\n * D1 does NOT support atomic transactions - operations are auto-committed.\n */\nexport const D1_CAPABILITIES: BackendCapabilities = {\n jsonb: false, // D1 uses TEXT with json functions\n partialIndexes: true,\n ginIndexes: false,\n cte: true,\n returning: true,\n transactions: false, // D1 does NOT support atomic transactions\n};\n","/**\n * Schema-parameterized query builders for TypeGraph.\n *\n * These functions generate Drizzle SQL objects that can be executed\n * by any Drizzle database instance. Table and column references are\n * passed as parameters, enabling customizable table names.\n */\nimport { getTableName, type SQL, sql } from \"drizzle-orm\";\n\n/**\n * Converts undefined to SQL NULL for use in template literals.\n * Drizzle doesn't handle undefined in sql`` templates correctly.\n */\nfunction sqlNull(value: string | undefined): SQL | string {\n return value ?? sql.raw(\"NULL\");\n}\n\nimport { getDialect } from \"../../query/dialect\";\nimport type {\n CheckUniqueParams,\n CountEdgesByKindParams,\n CountEdgesFromParams,\n CountNodesByKindParams,\n DeleteEdgeParams,\n DeleteEmbeddingParams,\n DeleteNodeParams,\n DeleteUniqueParams,\n Dialect,\n EdgeExistsBetweenParams,\n FindEdgesByKindParams,\n FindEdgesConnectedToParams,\n FindNodesByKindParams,\n HardDeleteEdgeParams,\n HardDeleteNodeParams,\n InsertEdgeParams,\n InsertNodeParams,\n InsertSchemaParams,\n InsertUniqueParams,\n UpdateEdgeParams,\n UpdateNodeParams,\n UpsertEmbeddingParams,\n VectorMetric,\n VectorSearchParams,\n} from \"../types\";\nimport type { PostgresTables } from \"./schema/postgres\";\nimport type { SqliteTables } from \"./schema/sqlite\";\n\n/**\n * Union type for all supported table configurations.\n */\ntype Tables = SqliteTables | PostgresTables;\n\n// ============================================================\n// Node Operations\n// ============================================================\n\n/**\n * Builds an INSERT query for a node.\n * Uses raw column names in the column list (required by SQL syntax).\n */\nexport function buildInsertNode(\n tables: Tables,\n params: InsertNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const propsJson = JSON.stringify(params.props);\n\n // Column list uses raw identifiers (not table-qualified)\n const cols = sql.raw(`\"${nodes.graphId.name}\", \"${nodes.kind.name}\", \"${nodes.id.name}\", \"${nodes.props.name}\", \"${nodes.version.name}\", \"${nodes.validFrom.name}\", \"${nodes.validTo.name}\", \"${nodes.createdAt.name}\", \"${nodes.updatedAt.name}\"`);\n\n return sql`\n INSERT INTO ${nodes} (${cols})\n VALUES (\n ${params.graphId}, ${params.kind}, ${params.id}, ${propsJson},\n 1, ${sqlNull(params.validFrom)}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds a SELECT query to get a node by kind and id.\n * Returns the node regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetNode(\n tables: Tables,\n graphId: string,\n kind: string,\n id: string,\n): SQL {\n const { nodes } = tables;\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${nodes.graphId} = ${graphId}\n AND ${nodes.kind} = ${kind}\n AND ${nodes.id} = ${id}\n `;\n}\n\n/**\n * Builds an UPDATE query for a node.\n * Uses raw column names in SET clause (required by SQL syntax).\n */\nexport function buildUpdateNode(\n tables: Tables,\n params: UpdateNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const propsJson = JSON.stringify(params.props);\n\n // Helper for raw column name\n const col = (c: { name: string }) => sql.raw(`\"${c.name}\"`);\n\n // Build SET clause parts\n const setParts: SQL[] = [\n sql`${col(nodes.props)} = ${propsJson}`,\n sql`${col(nodes.updatedAt)} = ${timestamp}`,\n ];\n\n if (params.incrementVersion) {\n setParts.push(sql`${col(nodes.version)} = ${col(nodes.version)} + 1`);\n }\n\n if (params.validTo !== undefined) {\n setParts.push(sql`${col(nodes.validTo)} = ${params.validTo}`);\n }\n\n if (params.clearDeleted) {\n setParts.push(sql`${col(nodes.deletedAt)} = NULL`);\n }\n\n // Join SET parts with commas\n const setClause = sql.join(setParts, sql`, `);\n\n // Build WHERE clause - skip deleted_at check if clearDeleted is set\n if (params.clearDeleted) {\n return sql`\n UPDATE ${nodes}\n SET ${setClause}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n RETURNING *\n `;\n }\n\n return sql`\n UPDATE ${nodes}\n SET ${setClause}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n AND ${nodes.deletedAt} IS NULL\n RETURNING *\n `;\n}\n\n/**\n * Builds a soft DELETE query for a node (sets deleted_at).\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteNode(\n tables: Tables,\n params: DeleteNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const col = (c: { name: string }) => sql.raw(`\"${c.name}\"`);\n\n return sql`\n UPDATE ${nodes}\n SET ${col(nodes.deletedAt)} = ${timestamp}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n AND ${nodes.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for a node (permanent removal).\n */\nexport function buildHardDeleteNode(\n tables: Tables,\n params: HardDeleteNodeParams,\n): SQL {\n const { nodes } = tables;\n\n return sql`\n DELETE FROM ${nodes}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n `;\n}\n\n// ============================================================\n// Edge Operations\n// ============================================================\n\n/**\n * Builds an INSERT query for an edge.\n * Uses raw column names in the column list (required by SQL syntax).\n */\nexport function buildInsertEdge(\n tables: Tables,\n params: InsertEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const propsJson = JSON.stringify(params.props);\n\n const cols = sql.raw(`\"${edges.graphId.name}\", \"${edges.id.name}\", \"${edges.kind.name}\", \"${edges.fromKind.name}\", \"${edges.fromId.name}\", \"${edges.toKind.name}\", \"${edges.toId.name}\", \"${edges.props.name}\", \"${edges.validFrom.name}\", \"${edges.validTo.name}\", \"${edges.createdAt.name}\", \"${edges.updatedAt.name}\"`);\n\n return sql`\n INSERT INTO ${edges} (${cols})\n VALUES (\n ${params.graphId}, ${params.id}, ${params.kind},\n ${params.fromKind}, ${params.fromId}, ${params.toKind}, ${params.toId},\n ${propsJson}, ${sqlNull(params.validFrom)}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds a SELECT query to get an edge by id.\n * Returns the edge regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetEdge(\n tables: Tables,\n graphId: string,\n id: string,\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${graphId}\n AND ${edges.id} = ${id}\n `;\n}\n\n/**\n * Builds an UPDATE query for an edge.\n * Uses raw column names in SET clause.\n */\nexport function buildUpdateEdge(\n tables: Tables,\n params: UpdateEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const propsJson = JSON.stringify(params.props);\n const col = (c: { name: string }) => sql.raw(`\"${c.name}\"`);\n\n if (params.validTo !== undefined) {\n return sql`\n UPDATE ${edges}\n SET ${col(edges.props)} = ${propsJson},\n ${col(edges.validTo)} = ${params.validTo},\n ${col(edges.updatedAt)} = ${timestamp}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n AND ${edges.deletedAt} IS NULL\n RETURNING *\n `;\n }\n\n return sql`\n UPDATE ${edges}\n SET ${col(edges.props)} = ${propsJson},\n ${col(edges.updatedAt)} = ${timestamp}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n AND ${edges.deletedAt} IS NULL\n RETURNING *\n `;\n}\n\n/**\n * Builds a soft DELETE query for an edge (sets deleted_at).\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteEdge(\n tables: Tables,\n params: DeleteEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const col = (c: { name: string }) => sql.raw(`\"${c.name}\"`);\n\n return sql`\n UPDATE ${edges}\n SET ${col(edges.deletedAt)} = ${timestamp}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n AND ${edges.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for an edge (permanent removal).\n */\nexport function buildHardDeleteEdge(\n tables: Tables,\n params: HardDeleteEdgeParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n DELETE FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n `;\n}\n\n// ============================================================\n// Unique Constraint Operations\n// ============================================================\n\n/**\n * Builds an INSERT query for a uniqueness entry (SQLite).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing entry belongs to the same node (safe update), OR\n * 2. The existing entry is soft-deleted (can be reused)\n *\n * If a different live node holds this key, the conflict handler leaves the\n * row unchanged, and RETURNING will show the conflicting node_id.\n */\nfunction buildInsertUniqueSqlite(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const cols = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`);\n\n // Use raw column names for ON CONFLICT clause (SQLite requires bare names)\n const conflictCols = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`);\n\n // Helper to reference columns without table prefix in UPDATE SET\n const col = (c: { name: string }) => sql.raw(`\"${c.name}\"`);\n\n // Conditional upsert: only update if same node OR deleted\n // The CASE expressions ensure conflicting entries are left unchanged\n return sql`\n INSERT INTO ${uniques} (${cols})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.constraintName},\n ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")}\n )\n ON CONFLICT (${conflictCols})\n DO UPDATE SET\n ${col(uniques.nodeId)} = CASE\n WHEN ${col(uniques.nodeId)} = ${params.nodeId} THEN ${params.nodeId}\n WHEN ${col(uniques.deletedAt)} IS NOT NULL THEN ${params.nodeId}\n ELSE ${col(uniques.nodeId)}\n END,\n ${col(uniques.concreteKind)} = CASE\n WHEN ${col(uniques.nodeId)} = ${params.nodeId} THEN ${params.concreteKind}\n WHEN ${col(uniques.deletedAt)} IS NOT NULL THEN ${params.concreteKind}\n ELSE ${col(uniques.concreteKind)}\n END,\n ${col(uniques.deletedAt)} = CASE\n WHEN ${col(uniques.nodeId)} = ${params.nodeId} THEN NULL\n WHEN ${col(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${col(uniques.deletedAt)}\n END\n RETURNING ${col(uniques.nodeId)} as node_id\n `;\n}\n\n/**\n * Builds an INSERT query for a uniqueness entry (PostgreSQL).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing entry belongs to the same node (safe update), OR\n * 2. The existing entry is soft-deleted (can be reused)\n *\n * If a different live node holds this key, the conflict handler leaves the\n * row unchanged, and RETURNING will show the conflicting node_id.\n */\nfunction buildInsertUniquePostgres(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const cols = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`);\n const conflictCols = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`);\n\n // Helper to reference columns without table prefix in UPDATE SET (for left side of assignment)\n const col = (c: { name: string }) => sql.raw(`\"${c.name}\"`);\n\n // Helper to reference the existing row's column value (table-qualified for PostgreSQL 18+)\n // In ON CONFLICT DO UPDATE, unqualified column references are ambiguous\n const tableName = getTableName(uniques);\n const existingCol = (c: { name: string }) => sql.raw(`\"${tableName}\".\"${c.name}\"`);\n\n // Conditional upsert: only update if same node OR deleted\n // The CASE expressions ensure conflicting entries are left unchanged\n // PostgreSQL 18+ requires table-qualified column references in CASE WHEN\n return sql`\n INSERT INTO ${uniques} (${cols})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.constraintName},\n ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")}\n )\n ON CONFLICT (${conflictCols})\n DO UPDATE SET\n ${col(uniques.nodeId)} = CASE\n WHEN ${existingCol(uniques.nodeId)} = ${params.nodeId} THEN ${params.nodeId}\n WHEN ${existingCol(uniques.deletedAt)} IS NOT NULL THEN ${params.nodeId}\n ELSE ${existingCol(uniques.nodeId)}\n END,\n ${col(uniques.concreteKind)} = CASE\n WHEN ${existingCol(uniques.nodeId)} = ${params.nodeId} THEN ${params.concreteKind}\n WHEN ${existingCol(uniques.deletedAt)} IS NOT NULL THEN ${params.concreteKind}\n ELSE ${existingCol(uniques.concreteKind)}\n END,\n ${col(uniques.deletedAt)} = CASE\n WHEN ${existingCol(uniques.nodeId)} = ${params.nodeId} THEN NULL\n WHEN ${existingCol(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${existingCol(uniques.deletedAt)}\n END\n RETURNING ${col(uniques.nodeId)} as node_id\n `;\n}\n\n/**\n * Builds an INSERT query for a uniqueness entry.\n * Returns the node_id that now holds the key (may differ from input if conflict).\n */\nexport function buildInsertUnique(\n tables: Tables,\n dialect: Dialect,\n params: InsertUniqueParams,\n): SQL {\n if (dialect === \"sqlite\") {\n return buildInsertUniqueSqlite(tables, params);\n }\n return buildInsertUniquePostgres(tables, params);\n}\n\n/**\n * Builds a soft DELETE query for a uniqueness entry.\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteUnique(\n tables: Tables,\n params: DeleteUniqueParams,\n timestamp: string,\n): SQL {\n const { uniques } = tables;\n const col = (c: { name: string }) => sql.raw(`\"${c.name}\"`);\n\n return sql`\n UPDATE ${uniques}\n SET ${col(uniques.deletedAt)} = ${timestamp}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} = ${params.key}\n AND ${uniques.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for all uniqueness entries for a node.\n */\nexport function buildHardDeleteUniquesByNode(\n tables: Tables,\n graphId: string,\n nodeId: string,\n): SQL {\n const { uniques } = tables;\n\n return sql`\n DELETE FROM ${uniques}\n WHERE ${uniques.graphId} = ${graphId}\n AND ${uniques.nodeId} = ${nodeId}\n `;\n}\n\n/**\n * Builds a hard DELETE query for all embeddings for a node.\n */\nexport function buildHardDeleteEmbeddingsByNode(\n tables: Tables,\n graphId: string,\n nodeKind: string,\n nodeId: string,\n): SQL {\n const { embeddings } = tables;\n\n return sql`\n DELETE FROM ${embeddings}\n WHERE ${embeddings.graphId} = ${graphId}\n AND ${embeddings.nodeKind} = ${nodeKind}\n AND ${embeddings.nodeId} = ${nodeId}\n `;\n}\n\n/**\n * Builds a SELECT query to check for uniqueness violations.\n */\nexport function buildCheckUnique(\n tables: Tables,\n params: CheckUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n return sql`\n SELECT * FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} = ${params.key}\n AND ${uniques.deletedAt} IS NULL\n `;\n}\n\n// ============================================================\n// Edge Cardinality Operations\n// ============================================================\n\n/**\n * Builds a query to count edges from a source node.\n */\nexport function buildCountEdgesFrom(\n tables: Tables,\n params: CountEdgesFromParams,\n): SQL {\n const { edges } = tables;\n\n if (params.activeOnly) {\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.deletedAt} IS NULL\n AND ${edges.validTo} IS NULL\n `;\n }\n\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a query to check if an edge exists between two nodes.\n */\nexport function buildEdgeExistsBetween(\n tables: Tables,\n params: EdgeExistsBetweenParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT 1 FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.toKind} = ${params.toKind}\n AND ${edges.toId} = ${params.toId}\n AND ${edges.deletedAt} IS NULL\n LIMIT 1\n `;\n}\n\n/**\n * Builds a query to find all edges connected to a node.\n */\nexport function buildFindEdgesConnectedTo(\n tables: Tables,\n params: FindEdgesConnectedToParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.deletedAt} IS NULL\n AND (\n (${edges.fromKind} = ${params.nodeKind} AND ${edges.fromId} = ${params.nodeId})\n OR\n (${edges.toKind} = ${params.nodeKind} AND ${edges.toId} = ${params.nodeId})\n )\n `;\n}\n\n// ============================================================\n// Collection Query Operations\n// ============================================================\n\n/**\n * Builds a query to find nodes by kind.\n */\nexport function buildFindNodesByKind(\n tables: Tables,\n params: FindNodesByKindParams,\n): SQL {\n const { nodes } = tables;\n const excludeDeleted = params.excludeDeleted ?? true;\n\n // Build base query parts\n const baseCondition = excludeDeleted\n ? sql`${nodes.graphId} = ${params.graphId} AND ${nodes.kind} = ${params.kind} AND ${nodes.deletedAt} IS NULL`\n : sql`${nodes.graphId} = ${params.graphId} AND ${nodes.kind} = ${params.kind}`;\n\n // Handle pagination\n if (params.limit !== undefined && params.offset !== undefined) {\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${baseCondition}\n ORDER BY ${nodes.createdAt} DESC\n LIMIT ${params.limit} OFFSET ${params.offset}\n `;\n }\n\n if (params.limit !== undefined) {\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${baseCondition}\n ORDER BY ${nodes.createdAt} DESC\n LIMIT ${params.limit}\n `;\n }\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${baseCondition}\n ORDER BY ${nodes.createdAt} DESC\n `;\n}\n\n/**\n * Builds a query to count nodes by kind.\n */\nexport function buildCountNodesByKind(\n tables: Tables,\n params: CountNodesByKindParams,\n): SQL {\n const { nodes } = tables;\n const excludeDeleted = params.excludeDeleted ?? true;\n\n if (excludeDeleted) {\n return sql`\n SELECT COUNT(*) as count FROM ${nodes}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.deletedAt} IS NULL\n `;\n }\n\n return sql`\n SELECT COUNT(*) as count FROM ${nodes}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n `;\n}\n\n/**\n * Builds a query to find edges by kind with optional endpoint filters.\n */\nexport function buildFindEdgesByKind(\n tables: Tables,\n params: FindEdgesByKindParams,\n): SQL {\n const { edges } = tables;\n const excludeDeleted = params.excludeDeleted ?? true;\n\n // Build conditions dynamically\n const conditions: SQL[] = [\n sql`${edges.graphId} = ${params.graphId}`,\n sql`${edges.kind} = ${params.kind}`,\n ];\n\n if (excludeDeleted) {\n conditions.push(sql`${edges.deletedAt} IS NULL`);\n }\n\n if (params.fromKind !== undefined) {\n conditions.push(sql`${edges.fromKind} = ${params.fromKind}`);\n }\n\n if (params.fromId !== undefined) {\n conditions.push(sql`${edges.fromId} = ${params.fromId}`);\n }\n\n if (params.toKind !== undefined) {\n conditions.push(sql`${edges.toKind} = ${params.toKind}`);\n }\n\n if (params.toId !== undefined) {\n conditions.push(sql`${edges.toId} = ${params.toId}`);\n }\n\n // Join conditions with AND\n const whereClause = sql.join(conditions, sql` AND `);\n\n // Handle pagination\n if (params.limit !== undefined && params.offset !== undefined) {\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${edges.createdAt} DESC\n LIMIT ${params.limit} OFFSET ${params.offset}\n `;\n }\n\n if (params.limit !== undefined) {\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${edges.createdAt} DESC\n LIMIT ${params.limit}\n `;\n }\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${edges.createdAt} DESC\n `;\n}\n\n/**\n * Builds a query to count edges by kind with optional endpoint filters.\n */\nexport function buildCountEdgesByKind(\n tables: Tables,\n params: CountEdgesByKindParams,\n): SQL {\n const { edges } = tables;\n const excludeDeleted = params.excludeDeleted ?? true;\n\n // Build conditions dynamically\n const conditions: SQL[] = [\n sql`${edges.graphId} = ${params.graphId}`,\n sql`${edges.kind} = ${params.kind}`,\n ];\n\n if (excludeDeleted) {\n conditions.push(sql`${edges.deletedAt} IS NULL`);\n }\n\n if (params.fromKind !== undefined) {\n conditions.push(sql`${edges.fromKind} = ${params.fromKind}`);\n }\n\n if (params.fromId !== undefined) {\n conditions.push(sql`${edges.fromId} = ${params.fromId}`);\n }\n\n if (params.toKind !== undefined) {\n conditions.push(sql`${edges.toKind} = ${params.toKind}`);\n }\n\n if (params.toId !== undefined) {\n conditions.push(sql`${edges.toId} = ${params.toId}`);\n }\n\n // Join conditions with AND\n const whereClause = sql.join(conditions, sql` AND `);\n\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${whereClause}\n `;\n}\n\n// ============================================================\n// Schema Operations\n// ============================================================\n\n/**\n * Builds an INSERT query for a schema version (SQLite).\n * Uses raw column names in the column list (required by SQL syntax).\n * Converts boolean to number for SQLite compatibility.\n */\nfunction buildInsertSchemaSqlite(\n tables: Tables,\n params: InsertSchemaParams,\n timestamp: string,\n): SQL {\n const { schemaVersions } = tables;\n const schemaDocumentJson = JSON.stringify(params.schemaDoc);\n // Use raw SQL for boolean to ensure it's stored as integer, not float\n // (drizzle's ${1} produces '1.0' which breaks Boolean() conversion on read)\n const isActiveValue = params.isActive ? sql.raw(\"1\") : sql.raw(\"0\");\n\n const cols = sql.raw(`\"${schemaVersions.graphId.name}\", \"${schemaVersions.version.name}\", \"${schemaVersions.schemaHash.name}\", \"${schemaVersions.schemaDoc.name}\", \"${schemaVersions.createdAt.name}\", \"${schemaVersions.isActive.name}\"`);\n\n return sql`\n INSERT INTO ${schemaVersions} (${cols})\n VALUES (\n ${params.graphId}, ${params.version},\n ${params.schemaHash}, ${schemaDocumentJson},\n ${timestamp}, ${isActiveValue}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds an INSERT query for a schema version (PostgreSQL).\n * Uses raw column names in the column list (required by SQL syntax).\n * Uses boolean values for PostgreSQL's native boolean type.\n */\nfunction buildInsertSchemaPostgres(\n tables: Tables,\n params: InsertSchemaParams,\n timestamp: string,\n): SQL {\n const { schemaVersions } = tables;\n const schemaDocumentJson = JSON.stringify(params.schemaDoc);\n // PostgreSQL uses native boolean type\n const isActiveValue = params.isActive ? sql.raw(\"true\") : sql.raw(\"false\");\n\n const cols = sql.raw(`\"${schemaVersions.graphId.name}\", \"${schemaVersions.version.name}\", \"${schemaVersions.schemaHash.name}\", \"${schemaVersions.schemaDoc.name}\", \"${schemaVersions.createdAt.name}\", \"${schemaVersions.isActive.name}\"`);\n\n return sql`\n INSERT INTO ${schemaVersions} (${cols})\n VALUES (\n ${params.graphId}, ${params.version},\n ${params.schemaHash}, ${schemaDocumentJson},\n ${timestamp}, ${isActiveValue}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds an INSERT query for a schema version.\n */\nexport function buildInsertSchema(\n tables: Tables,\n params: InsertSchemaParams,\n timestamp: string,\n dialect: Dialect = \"sqlite\",\n): SQL {\n if (dialect === \"postgres\") {\n return buildInsertSchemaPostgres(tables, params, timestamp);\n }\n return buildInsertSchemaSqlite(tables, params, timestamp);\n}\n\n/**\n * Builds a SELECT query to get the active schema for a graph.\n */\nexport function buildGetActiveSchema(\n tables: Tables,\n graphId: string,\n dialect: Dialect = \"sqlite\",\n): SQL {\n const { schemaVersions } = tables;\n const adapter = getDialect(dialect);\n\n return sql`\n SELECT * FROM ${schemaVersions}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.isActive} = ${adapter.booleanLiteral(true)}\n `;\n}\n\n/**\n * Builds a SELECT query to get a specific schema version.\n */\nexport function buildGetSchemaVersion(\n tables: Tables,\n graphId: string,\n version: number,\n): SQL {\n const { schemaVersions } = tables;\n\n return sql`\n SELECT * FROM ${schemaVersions}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.version} = ${version}\n `;\n}\n\n/**\n * Builds UPDATE queries to set the active schema version.\n * Returns two queries: first deactivates all, second activates the specified version.\n * Uses raw column names in SET clause (SQLite doesn't allow table prefix there).\n */\nexport function buildSetActiveSchema(\n tables: Tables,\n graphId: string,\n version: number,\n dialect: Dialect = \"sqlite\",\n): { deactivateAll: SQL; activateVersion: SQL } {\n const { schemaVersions } = tables;\n const adapter = getDialect(dialect);\n // Helper to reference columns without table prefix in SET clause only\n // (SQLite doesn't allow table prefix in SET, but WHERE works fine with drizzle refs)\n const col = (c: { name: string }) => sql.raw(`\"${c.name}\"`);\n\n const deactivateAll = sql`\n UPDATE ${schemaVersions}\n SET ${col(schemaVersions.isActive)} = ${adapter.booleanLiteral(false)}\n WHERE ${schemaVersions.graphId} = ${graphId}\n `;\n\n const activateVersion = sql`\n UPDATE ${schemaVersions}\n SET ${col(schemaVersions.isActive)} = ${adapter.booleanLiteral(true)}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.version} = ${version}\n `;\n\n return { deactivateAll, activateVersion };\n}\n\n// ============================================================\n// Embedding Operations\n// ============================================================\n\n/**\n * Validates that all values in an array are finite numbers.\n * Throws if any value is NaN, Infinity, or not a number.\n */\nfunction assertFiniteNumberArray(array: readonly number[], name: string): void {\n for (const [index, value] of array.entries()) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new TypeError(\n `${name}[${index}] must be a finite number, got: ${value}`,\n );\n }\n }\n}\n\n/**\n * Formats an embedding array as a pgvector literal string.\n * Validates all values are finite numbers first.\n */\nfunction formatEmbeddingLiteral(embedding: readonly number[]): string {\n assertFiniteNumberArray(embedding, \"embedding\");\n return `[${embedding.join(\",\")}]`;\n}\n\n/**\n * Builds an UPSERT query for an embedding (PostgreSQL).\n * Uses ON CONFLICT to update existing embeddings.\n */\nexport function buildUpsertEmbeddingPostgres(\n tables: PostgresTables,\n params: UpsertEmbeddingParams,\n timestamp: string,\n): SQL {\n const { embeddings } = tables;\n\n // Format and validate embedding\n const embeddingLiteral = formatEmbeddingLiteral(params.embedding);\n\n const cols = sql.raw(\n `\"${embeddings.graphId.name}\", \"${embeddings.nodeKind.name}\", \"${embeddings.nodeId.name}\", \"${embeddings.fieldPath.name}\", \"${embeddings.embedding.name}\", \"${embeddings.dimensions.name}\", \"${embeddings.createdAt.name}\", \"${embeddings.updatedAt.name}\"`,\n );\n\n const conflictCols = sql.raw(\n `\"${embeddings.graphId.name}\", \"${embeddings.nodeKind.name}\", \"${embeddings.nodeId.name}\", \"${embeddings.fieldPath.name}\"`,\n );\n\n const col = (c: { name: string }) => sql.raw(`\"${c.name}\"`);\n\n return sql`\n INSERT INTO ${embeddings} (${cols})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.nodeId}, ${params.fieldPath},\n ${embeddingLiteral}::vector, ${params.dimensions}, ${timestamp}, ${timestamp}\n )\n ON CONFLICT (${conflictCols})\n DO UPDATE SET\n ${col(embeddings.embedding)} = ${embeddingLiteral}::vector,\n ${col(embeddings.dimensions)} = ${params.dimensions},\n ${col(embeddings.updatedAt)} = ${timestamp}\n `;\n}\n\n/**\n * Builds a DELETE query for an embedding.\n */\nexport function buildDeleteEmbedding(\n tables: Tables,\n params: DeleteEmbeddingParams,\n): SQL {\n const { embeddings } = tables;\n\n return sql`\n DELETE FROM ${embeddings}\n WHERE ${embeddings.graphId} = ${params.graphId}\n AND ${embeddings.nodeKind} = ${params.nodeKind}\n AND ${embeddings.nodeId} = ${params.nodeId}\n AND ${embeddings.fieldPath} = ${params.fieldPath}\n `;\n}\n\n/**\n * Builds a SELECT query to get an embedding.\n */\nexport function buildGetEmbedding(\n tables: Tables,\n graphId: string,\n nodeKind: string,\n nodeId: string,\n fieldPath: string,\n): SQL {\n const { embeddings } = tables;\n\n return sql`\n SELECT * FROM ${embeddings}\n WHERE ${embeddings.graphId} = ${graphId}\n AND ${embeddings.nodeKind} = ${nodeKind}\n AND ${embeddings.nodeId} = ${nodeId}\n AND ${embeddings.fieldPath} = ${fieldPath}\n `;\n}\n\n/**\n * Builds the distance expression for a given metric.\n * Uses parameterized embedding literal to prevent SQL injection.\n */\nfunction buildDistanceExpression(\n embeddingColumn: SQL,\n queryLiteral: string,\n metric: VectorMetric,\n): SQL {\n // The query literal is passed as a parameter and cast to vector type\n // This ensures proper escaping by the database driver\n const vectorParam = sql`${queryLiteral}::vector`;\n\n switch (metric) {\n case \"cosine\": {\n return sql`(${embeddingColumn} <=> ${vectorParam})`;\n }\n case \"l2\": {\n return sql`(${embeddingColumn} <-> ${vectorParam})`;\n }\n case \"inner_product\": {\n return sql`(${embeddingColumn} <#> ${vectorParam})`;\n }\n }\n}\n\n/**\n * Builds a vector similarity search query (PostgreSQL).\n * Returns node IDs ordered by similarity (closest first).\n */\nexport function buildVectorSearchPostgres(\n tables: PostgresTables,\n params: VectorSearchParams,\n): SQL {\n const { embeddings } = tables;\n\n // Format and validate query embedding\n const queryLiteral = formatEmbeddingLiteral(params.queryEmbedding);\n\n // Build the distance expression using parameterized query literal\n // The embedding column reference and the validated literal are combined safely\n const embeddingColumn = sql`${embeddings.embedding}`;\n const distanceExpr = buildDistanceExpression(\n embeddingColumn,\n queryLiteral,\n params.metric,\n );\n\n // Build base conditions (all parameterized by Drizzle)\n const conditions = [\n sql`${embeddings.graphId} = ${params.graphId}`,\n sql`${embeddings.nodeKind} = ${params.nodeKind}`,\n sql`${embeddings.fieldPath} = ${params.fieldPath}`,\n ];\n\n // Add minScore filter if specified\n if (params.minScore !== undefined) {\n // Validate minScore is a finite number\n if (!Number.isFinite(params.minScore)) {\n throw new TypeError(`minScore must be a finite number, got: ${params.minScore}`);\n }\n // minScore is similarity (1.0 = identical), convert to distance threshold\n // For cosine: distance = 1 - similarity, so threshold = 1 - minScore\n const threshold = 1 - params.minScore;\n conditions.push(sql`${distanceExpr} <= ${threshold}`);\n }\n\n // Validate limit is a positive integer\n if (!Number.isInteger(params.limit) || params.limit <= 0) {\n throw new Error(`limit must be a positive integer, got: ${params.limit}`);\n }\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n return sql`\n SELECT\n ${embeddings.nodeId} as node_id,\n (1 - (${distanceExpr})) as score\n FROM ${embeddings}\n WHERE ${whereClause}\n ORDER BY ${distanceExpr} ASC\n LIMIT ${params.limit}\n `;\n}\n"]}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { parseJsonPointer } from './chunk-K7SQ3SWP.js';
|
|
2
|
+
import { sql } from 'drizzle-orm';
|
|
3
|
+
|
|
4
|
+
function escapePostgresLiteral(value) {
|
|
5
|
+
return `'${value.replaceAll("'", "''")}'`;
|
|
6
|
+
}
|
|
7
|
+
function toPostgresPath(pointer) {
|
|
8
|
+
if (!pointer || pointer === "" || pointer === "/") {
|
|
9
|
+
return sql.raw("ARRAY[]::text[]");
|
|
10
|
+
}
|
|
11
|
+
const segments = parseJsonPointer(pointer);
|
|
12
|
+
if (segments.length === 0) {
|
|
13
|
+
return sql.raw("ARRAY[]::text[]");
|
|
14
|
+
}
|
|
15
|
+
const escapedSegments = segments.map((segment) => escapePostgresLiteral(segment)).join(", ");
|
|
16
|
+
return sql.raw(`ARRAY[${escapedSegments}]`);
|
|
17
|
+
}
|
|
18
|
+
var postgresDialect = {
|
|
19
|
+
name: "postgres",
|
|
20
|
+
// ============================================================
|
|
21
|
+
// JSON Path Operations
|
|
22
|
+
// ============================================================
|
|
23
|
+
compilePath(pointer) {
|
|
24
|
+
return toPostgresPath(pointer);
|
|
25
|
+
},
|
|
26
|
+
jsonExtract(column, pointer) {
|
|
27
|
+
const path = toPostgresPath(pointer);
|
|
28
|
+
return sql`${column} #> ${path}`;
|
|
29
|
+
},
|
|
30
|
+
jsonExtractText(column, pointer) {
|
|
31
|
+
const path = toPostgresPath(pointer);
|
|
32
|
+
return sql`${column} #>> ${path}`;
|
|
33
|
+
},
|
|
34
|
+
jsonExtractNumber(column, pointer) {
|
|
35
|
+
const path = toPostgresPath(pointer);
|
|
36
|
+
return sql`(${column} #>> ${path})::numeric`;
|
|
37
|
+
},
|
|
38
|
+
jsonExtractBoolean(column, pointer) {
|
|
39
|
+
const path = toPostgresPath(pointer);
|
|
40
|
+
return sql`(${column} #>> ${path})::boolean`;
|
|
41
|
+
},
|
|
42
|
+
jsonExtractDate(column, pointer) {
|
|
43
|
+
const path = toPostgresPath(pointer);
|
|
44
|
+
return sql`(${column} #>> ${path})::timestamptz`;
|
|
45
|
+
},
|
|
46
|
+
// ============================================================
|
|
47
|
+
// JSON Array Operations
|
|
48
|
+
// ============================================================
|
|
49
|
+
jsonArrayLength(column) {
|
|
50
|
+
return sql`jsonb_array_length(${column})`;
|
|
51
|
+
},
|
|
52
|
+
jsonArrayContains(column, value) {
|
|
53
|
+
const jsonValue = JSON.stringify([value]);
|
|
54
|
+
return sql`${column} @> ${jsonValue}::jsonb`;
|
|
55
|
+
},
|
|
56
|
+
jsonArrayContainsAll(column, values) {
|
|
57
|
+
if (values.length === 0) {
|
|
58
|
+
return sql.raw("1=1");
|
|
59
|
+
}
|
|
60
|
+
const jsonValue = JSON.stringify(values);
|
|
61
|
+
return sql`${column} @> ${jsonValue}::jsonb`;
|
|
62
|
+
},
|
|
63
|
+
jsonArrayContainsAny(column, values) {
|
|
64
|
+
if (values.length === 0) {
|
|
65
|
+
return sql.raw("1=0");
|
|
66
|
+
}
|
|
67
|
+
const conditions = values.map((value) => {
|
|
68
|
+
const jsonValue = JSON.stringify([value]);
|
|
69
|
+
return sql`${column} @> ${jsonValue}::jsonb`;
|
|
70
|
+
});
|
|
71
|
+
return sql`(${sql.join(conditions, sql` OR `)})`;
|
|
72
|
+
},
|
|
73
|
+
// ============================================================
|
|
74
|
+
// JSON Object Operations
|
|
75
|
+
// ============================================================
|
|
76
|
+
jsonHasPath(column, pointer) {
|
|
77
|
+
const path = toPostgresPath(pointer);
|
|
78
|
+
return sql`${column} #> ${path} IS NOT NULL`;
|
|
79
|
+
},
|
|
80
|
+
jsonPathIsNull(column, pointer) {
|
|
81
|
+
const path = toPostgresPath(pointer);
|
|
82
|
+
return sql`(${column} #> ${path} IS NULL OR ${column} #>> ${path} = 'null')`;
|
|
83
|
+
},
|
|
84
|
+
jsonPathIsNotNull(column, pointer) {
|
|
85
|
+
const path = toPostgresPath(pointer);
|
|
86
|
+
return sql`(${column} #> ${path} IS NOT NULL AND ${column} #>> ${path} != 'null')`;
|
|
87
|
+
},
|
|
88
|
+
// ============================================================
|
|
89
|
+
// String Operations
|
|
90
|
+
// ============================================================
|
|
91
|
+
ilike(column, pattern) {
|
|
92
|
+
return sql`${column} ILIKE ${pattern}`;
|
|
93
|
+
},
|
|
94
|
+
// ============================================================
|
|
95
|
+
// Recursive CTE Path Operations
|
|
96
|
+
// ============================================================
|
|
97
|
+
initializePath(nodeId) {
|
|
98
|
+
return sql`ARRAY[${nodeId}]`;
|
|
99
|
+
},
|
|
100
|
+
extendPath(currentPath, nodeId) {
|
|
101
|
+
return sql`${currentPath} || ${nodeId}`;
|
|
102
|
+
},
|
|
103
|
+
cycleCheck(nodeId, path) {
|
|
104
|
+
return sql`${nodeId} != ALL(${path})`;
|
|
105
|
+
},
|
|
106
|
+
// ============================================================
|
|
107
|
+
// Type Utilities
|
|
108
|
+
// ============================================================
|
|
109
|
+
currentTimestamp() {
|
|
110
|
+
return sql`NOW()`;
|
|
111
|
+
},
|
|
112
|
+
// ============================================================
|
|
113
|
+
// Value Binding & Literals
|
|
114
|
+
// ============================================================
|
|
115
|
+
bindValue(value) {
|
|
116
|
+
return value;
|
|
117
|
+
},
|
|
118
|
+
booleanLiteral(value) {
|
|
119
|
+
return sql.raw(this.booleanLiteralString(value));
|
|
120
|
+
},
|
|
121
|
+
booleanLiteralString(value) {
|
|
122
|
+
return value ? "TRUE" : "FALSE";
|
|
123
|
+
},
|
|
124
|
+
quoteIdentifier(name) {
|
|
125
|
+
return `"${name.replaceAll('"', '""')}"`;
|
|
126
|
+
},
|
|
127
|
+
// ============================================================
|
|
128
|
+
// Vector Operations
|
|
129
|
+
// ============================================================
|
|
130
|
+
supportsVectors: true,
|
|
131
|
+
vectorDistance(column, embedding, metric) {
|
|
132
|
+
const formatted = this.formatEmbedding(embedding);
|
|
133
|
+
switch (metric) {
|
|
134
|
+
case "cosine": {
|
|
135
|
+
return sql`(${column} <=> ${formatted})`;
|
|
136
|
+
}
|
|
137
|
+
case "l2": {
|
|
138
|
+
return sql`(${column} <-> ${formatted})`;
|
|
139
|
+
}
|
|
140
|
+
case "inner_product": {
|
|
141
|
+
return sql`(${column} <#> ${formatted})`;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
formatEmbedding(embedding) {
|
|
146
|
+
for (const [index, value] of embedding.entries()) {
|
|
147
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
148
|
+
throw new TypeError(
|
|
149
|
+
`embedding[${index}] must be a finite number, got: ${value}`
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const asString = `[${embedding.join(",")}]`;
|
|
154
|
+
return sql`${asString}::vector`;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
function escapeSqliteLiteral(value) {
|
|
158
|
+
return `'${value.replaceAll("'", "''")}'`;
|
|
159
|
+
}
|
|
160
|
+
function toSqlitePath(pointer) {
|
|
161
|
+
if (!pointer || pointer === "" || pointer === "/") {
|
|
162
|
+
return "$";
|
|
163
|
+
}
|
|
164
|
+
const segments = parseJsonPointer(pointer);
|
|
165
|
+
const parts = ["$"];
|
|
166
|
+
for (const segment of segments) {
|
|
167
|
+
if (isArrayIndex(segment)) {
|
|
168
|
+
parts.push(`[${segment}]`);
|
|
169
|
+
} else {
|
|
170
|
+
parts.push(`.${JSON.stringify(segment)}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return parts.join("");
|
|
174
|
+
}
|
|
175
|
+
function isArrayIndex(segment) {
|
|
176
|
+
return /^\d+$/.test(segment);
|
|
177
|
+
}
|
|
178
|
+
var sqliteDialect = {
|
|
179
|
+
name: "sqlite",
|
|
180
|
+
// ============================================================
|
|
181
|
+
// JSON Path Operations
|
|
182
|
+
// ============================================================
|
|
183
|
+
compilePath(pointer) {
|
|
184
|
+
return sql.raw(escapeSqliteLiteral(toSqlitePath(pointer)));
|
|
185
|
+
},
|
|
186
|
+
jsonExtract(column, pointer) {
|
|
187
|
+
const path = toSqlitePath(pointer);
|
|
188
|
+
return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;
|
|
189
|
+
},
|
|
190
|
+
jsonExtractText(column, pointer) {
|
|
191
|
+
const path = toSqlitePath(pointer);
|
|
192
|
+
return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;
|
|
193
|
+
},
|
|
194
|
+
jsonExtractNumber(column, pointer) {
|
|
195
|
+
const path = toSqlitePath(pointer);
|
|
196
|
+
return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;
|
|
197
|
+
},
|
|
198
|
+
jsonExtractBoolean(column, pointer) {
|
|
199
|
+
const path = toSqlitePath(pointer);
|
|
200
|
+
return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;
|
|
201
|
+
},
|
|
202
|
+
jsonExtractDate(column, pointer) {
|
|
203
|
+
const path = toSqlitePath(pointer);
|
|
204
|
+
return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;
|
|
205
|
+
},
|
|
206
|
+
// ============================================================
|
|
207
|
+
// JSON Array Operations
|
|
208
|
+
// ============================================================
|
|
209
|
+
jsonArrayLength(column) {
|
|
210
|
+
return sql`json_array_length(${column})`;
|
|
211
|
+
},
|
|
212
|
+
jsonArrayContains(column, value) {
|
|
213
|
+
return sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`;
|
|
214
|
+
},
|
|
215
|
+
jsonArrayContainsAll(column, values) {
|
|
216
|
+
if (values.length === 0) {
|
|
217
|
+
return sql.raw("1=1");
|
|
218
|
+
}
|
|
219
|
+
const conditions = values.map(
|
|
220
|
+
(value) => sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`
|
|
221
|
+
);
|
|
222
|
+
return sql`(${sql.join(conditions, sql` AND `)})`;
|
|
223
|
+
},
|
|
224
|
+
jsonArrayContainsAny(column, values) {
|
|
225
|
+
if (values.length === 0) {
|
|
226
|
+
return sql.raw("1=0");
|
|
227
|
+
}
|
|
228
|
+
const conditions = values.map(
|
|
229
|
+
(value) => sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`
|
|
230
|
+
);
|
|
231
|
+
return sql`(${sql.join(conditions, sql` OR `)})`;
|
|
232
|
+
},
|
|
233
|
+
// ============================================================
|
|
234
|
+
// JSON Object Operations
|
|
235
|
+
// ============================================================
|
|
236
|
+
jsonHasPath(column, pointer) {
|
|
237
|
+
const path = toSqlitePath(pointer);
|
|
238
|
+
return sql`json_type(${column}, ${sql.raw(escapeSqliteLiteral(path))}) IS NOT NULL`;
|
|
239
|
+
},
|
|
240
|
+
jsonPathIsNull(column, pointer) {
|
|
241
|
+
const path = toSqlitePath(pointer);
|
|
242
|
+
const pathSql = sql.raw(escapeSqliteLiteral(path));
|
|
243
|
+
return sql`(json_extract(${column}, ${pathSql}) IS NULL OR json_type(${column}, ${pathSql}) = 'null')`;
|
|
244
|
+
},
|
|
245
|
+
jsonPathIsNotNull(column, pointer) {
|
|
246
|
+
const path = toSqlitePath(pointer);
|
|
247
|
+
const pathSql = sql.raw(escapeSqliteLiteral(path));
|
|
248
|
+
return sql`(json_extract(${column}, ${pathSql}) IS NOT NULL AND json_type(${column}, ${pathSql}) != 'null')`;
|
|
249
|
+
},
|
|
250
|
+
// ============================================================
|
|
251
|
+
// String Operations
|
|
252
|
+
// ============================================================
|
|
253
|
+
ilike(column, pattern) {
|
|
254
|
+
return sql`LOWER(${column}) LIKE LOWER(${pattern})`;
|
|
255
|
+
},
|
|
256
|
+
// ============================================================
|
|
257
|
+
// Recursive CTE Path Operations
|
|
258
|
+
// ============================================================
|
|
259
|
+
initializePath(nodeId) {
|
|
260
|
+
return sql`'|' || ${nodeId} || '|'`;
|
|
261
|
+
},
|
|
262
|
+
extendPath(currentPath, nodeId) {
|
|
263
|
+
return sql`${currentPath} || ${nodeId} || '|'`;
|
|
264
|
+
},
|
|
265
|
+
cycleCheck(nodeId, path) {
|
|
266
|
+
return sql`INSTR(${path}, '|' || ${nodeId} || '|') = 0`;
|
|
267
|
+
},
|
|
268
|
+
// ============================================================
|
|
269
|
+
// Type Utilities
|
|
270
|
+
// ============================================================
|
|
271
|
+
currentTimestamp() {
|
|
272
|
+
return sql`datetime('now')`;
|
|
273
|
+
},
|
|
274
|
+
// ============================================================
|
|
275
|
+
// Value Binding & Literals
|
|
276
|
+
// ============================================================
|
|
277
|
+
bindValue(value) {
|
|
278
|
+
if (typeof value === "boolean") {
|
|
279
|
+
return value ? 1 : 0;
|
|
280
|
+
}
|
|
281
|
+
return value;
|
|
282
|
+
},
|
|
283
|
+
booleanLiteral(value) {
|
|
284
|
+
return sql.raw(this.booleanLiteralString(value));
|
|
285
|
+
},
|
|
286
|
+
booleanLiteralString(value) {
|
|
287
|
+
return value ? "1" : "0";
|
|
288
|
+
},
|
|
289
|
+
quoteIdentifier(name) {
|
|
290
|
+
return `"${name.replaceAll('"', '""')}"`;
|
|
291
|
+
},
|
|
292
|
+
// ============================================================
|
|
293
|
+
// Vector Operations
|
|
294
|
+
// ============================================================
|
|
295
|
+
supportsVectors: true,
|
|
296
|
+
vectorDistance(column, embedding, metric) {
|
|
297
|
+
const formatted = this.formatEmbedding(embedding);
|
|
298
|
+
switch (metric) {
|
|
299
|
+
case "cosine": {
|
|
300
|
+
return sql`vec_distance_cosine(${column}, ${formatted})`;
|
|
301
|
+
}
|
|
302
|
+
case "l2": {
|
|
303
|
+
return sql`vec_distance_l2(${column}, ${formatted})`;
|
|
304
|
+
}
|
|
305
|
+
case "inner_product": {
|
|
306
|
+
throw new Error(
|
|
307
|
+
"Inner product distance is not supported by sqlite-vec. Use 'cosine' or 'l2' metrics instead."
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
formatEmbedding(embedding) {
|
|
313
|
+
for (const [index, value] of embedding.entries()) {
|
|
314
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
315
|
+
throw new TypeError(
|
|
316
|
+
`embedding[${index}] must be a finite number, got: ${value}`
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
const asJson = JSON.stringify(embedding);
|
|
321
|
+
return sql`vec_f32(${asJson})`;
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
// src/query/dialect/index.ts
|
|
326
|
+
var DIALECT_ADAPTERS = {
|
|
327
|
+
sqlite: sqliteDialect,
|
|
328
|
+
postgres: postgresDialect
|
|
329
|
+
};
|
|
330
|
+
function getDialect(dialect) {
|
|
331
|
+
return DIALECT_ADAPTERS[dialect];
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// src/system-fields.ts
|
|
335
|
+
var NODE_META_KEYS = [
|
|
336
|
+
"version",
|
|
337
|
+
"validFrom",
|
|
338
|
+
"validTo",
|
|
339
|
+
"createdAt",
|
|
340
|
+
"updatedAt",
|
|
341
|
+
"deletedAt"
|
|
342
|
+
];
|
|
343
|
+
var EDGE_META_KEYS = [
|
|
344
|
+
"validFrom",
|
|
345
|
+
"validTo",
|
|
346
|
+
"createdAt",
|
|
347
|
+
"updatedAt",
|
|
348
|
+
"deletedAt"
|
|
349
|
+
];
|
|
350
|
+
|
|
351
|
+
export { EDGE_META_KEYS, NODE_META_KEYS, getDialect };
|
|
352
|
+
//# sourceMappingURL=chunk-IIAT36MI.js.map
|
|
353
|
+
//# sourceMappingURL=chunk-IIAT36MI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/query/dialect/postgres.ts","../src/query/dialect/sqlite.ts","../src/query/dialect/index.ts","../src/system-fields.ts"],"names":["sql"],"mappings":"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","file":"chunk-IIAT36MI.js","sourcesContent":["/**\n * PostgreSQL Dialect Adapter\n *\n * Implements dialect-specific SQL generation for PostgreSQL databases.\n * Uses PostgreSQL's native JSONB operators for JSON operations.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { type JsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport { type DialectAdapter } from \"./types\";\n\n/**\n * Escapes a string for use in a PostgreSQL string literal.\n * Uses single quotes and escapes embedded single quotes.\n */\nfunction escapePostgresLiteral(value: string): string {\n // PostgreSQL uses '' to escape single quotes inside string literals\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\n/**\n * Converts a JSON pointer to PostgreSQL's text array path.\n *\n * Uses raw SQL (non-parameterized) to ensure the same expression text\n * is generated when the same field is used in multiple clauses (SELECT, GROUP BY).\n * This is safe because JSON pointers come from schema definitions, not user input.\n *\n * @example\n * \"/name\" → ARRAY['name']\n * \"/items/0\" → ARRAY['items', '0']\n * \"/a/b/c\" → ARRAY['a', 'b', 'c']\n */\nfunction toPostgresPath(pointer: JsonPointer): SQL {\n if (!pointer || pointer === \"\" || pointer === \"/\") {\n return sql.raw(\"ARRAY[]::text[]\");\n }\n\n const segments = parseJsonPointer(pointer);\n if (segments.length === 0) {\n return sql.raw(\"ARRAY[]::text[]\");\n }\n\n // Use raw SQL for path segments to ensure identical SQL text\n // when the same field is used in multiple clauses (e.g., SELECT and GROUP BY)\n const escapedSegments = segments\n .map((segment) => escapePostgresLiteral(segment))\n .join(\", \");\n return sql.raw(`ARRAY[${escapedSegments}]`);\n}\n\n/**\n * PostgreSQL dialect adapter implementation.\n */\nexport const postgresDialect: DialectAdapter = {\n name: \"postgres\",\n\n // ============================================================\n // JSON Path Operations\n // ============================================================\n\n compilePath(pointer) {\n return toPostgresPath(pointer);\n },\n\n jsonExtract(column, pointer) {\n // #> returns JSONB value at path\n const path = toPostgresPath(pointer);\n return sql`${column} #> ${path}`;\n },\n\n jsonExtractText(column, pointer) {\n // #>> returns text value at path\n const path = toPostgresPath(pointer);\n return sql`${column} #>> ${path}`;\n },\n\n jsonExtractNumber(column, pointer) {\n // Extract as text then cast to numeric\n const path = toPostgresPath(pointer);\n return sql`(${column} #>> ${path})::numeric`;\n },\n\n jsonExtractBoolean(column, pointer) {\n // Extract as text then cast to boolean\n const path = toPostgresPath(pointer);\n return sql`(${column} #>> ${path})::boolean`;\n },\n\n jsonExtractDate(column, pointer) {\n // Extract as text then cast to timestamptz\n const path = toPostgresPath(pointer);\n return sql`(${column} #>> ${path})::timestamptz`;\n },\n\n // ============================================================\n // JSON Array Operations\n // ============================================================\n\n jsonArrayLength(column) {\n return sql`jsonb_array_length(${column})`;\n },\n\n jsonArrayContains(column, value) {\n // @> checks if left contains right\n const jsonValue = JSON.stringify([value]);\n return sql`${column} @> ${jsonValue}::jsonb`;\n },\n\n jsonArrayContainsAll(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=1\");\n }\n\n // @> with full array checks all values\n const jsonValue = JSON.stringify(values);\n return sql`${column} @> ${jsonValue}::jsonb`;\n },\n\n jsonArrayContainsAny(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=0\");\n }\n\n // Check each value with @> and OR them together\n // PostgreSQL doesn't have a native \"overlaps\" for jsonb arrays\n const conditions = values.map((value) => {\n const jsonValue = JSON.stringify([value]);\n return sql`${column} @> ${jsonValue}::jsonb`;\n });\n return sql`(${sql.join(conditions, sql` OR `)})`;\n },\n\n // ============================================================\n // JSON Object Operations\n // ============================================================\n\n jsonHasPath(column, pointer) {\n const path = toPostgresPath(pointer);\n return sql`${column} #> ${path} IS NOT NULL`;\n },\n\n jsonPathIsNull(column, pointer) {\n const path = toPostgresPath(pointer);\n // Check both SQL NULL and JSON null literal\n return sql`(${column} #> ${path} IS NULL OR ${column} #>> ${path} = 'null')`;\n },\n\n jsonPathIsNotNull(column, pointer) {\n const path = toPostgresPath(pointer);\n return sql`(${column} #> ${path} IS NOT NULL AND ${column} #>> ${path} != 'null')`;\n },\n\n // ============================================================\n // String Operations\n // ============================================================\n\n ilike(column, pattern) {\n // PostgreSQL has native ILIKE operator\n return sql`${column} ILIKE ${pattern}`;\n },\n\n // ============================================================\n // Recursive CTE Path Operations\n // ============================================================\n\n initializePath(nodeId) {\n // PostgreSQL uses text arrays: ARRAY[id]\n return sql`ARRAY[${nodeId}]`;\n },\n\n extendPath(currentPath, nodeId) {\n // Array concatenation: path || id\n return sql`${currentPath} || ${nodeId}`;\n },\n\n cycleCheck(nodeId, path) {\n // Check that id is NOT in array path\n // Returns TRUE if no cycle (id not in array)\n return sql`${nodeId} != ALL(${path})`;\n },\n\n // ============================================================\n // Type Utilities\n // ============================================================\n\n currentTimestamp() {\n return sql`NOW()`;\n },\n\n // ============================================================\n // Value Binding & Literals\n // ============================================================\n\n bindValue(value) {\n // PostgreSQL supports native booleans, no conversion needed\n return value;\n },\n\n booleanLiteral(value) {\n return sql.raw(this.booleanLiteralString(value));\n },\n\n booleanLiteralString(value) {\n return value ? \"TRUE\" : \"FALSE\";\n },\n\n quoteIdentifier(name) {\n // PostgreSQL uses double quotes, escape embedded quotes by doubling\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n },\n\n // ============================================================\n // Vector Operations\n // ============================================================\n\n supportsVectors: true,\n\n vectorDistance(column, embedding, metric) {\n const formatted = this.formatEmbedding(embedding);\n // Column is native VECTOR type, no cast needed\n switch (metric) {\n case \"cosine\": {\n // Cosine distance: 1 - cosine_similarity\n // Lower is more similar (0 = identical)\n return sql`(${column} <=> ${formatted})`;\n }\n case \"l2\": {\n // Euclidean (L2) distance\n // Lower is more similar (0 = identical)\n return sql`(${column} <-> ${formatted})`;\n }\n case \"inner_product\": {\n // Inner product distance (negative inner product)\n // Note: pgvector uses <#> which returns NEGATIVE inner product\n // More negative = more similar for normalized vectors\n return sql`(${column} <#> ${formatted})`;\n }\n }\n },\n\n formatEmbedding(embedding) {\n // Validate all values are finite numbers to prevent injection\n for (const [index, value] of embedding.entries()) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new TypeError(\n `embedding[${index}] must be a finite number, got: ${value}`,\n );\n }\n }\n // Format as PostgreSQL vector literal: '[1.0,2.0,3.0]'::vector\n // Query embedding still needs cast since it's a literal string\n const asString = `[${embedding.join(\",\")}]`;\n return sql`${asString}::vector`;\n },\n};\n","/**\n * SQLite Dialect Adapter\n *\n * Implements dialect-specific SQL generation for SQLite databases.\n * Uses SQLite's JSON1 extension for JSON operations.\n */\nimport { sql } from \"drizzle-orm\";\n\nimport { type JsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport { type DialectAdapter } from \"./types\";\n\n/**\n * Escapes a string for use in a SQLite string literal.\n * SQLite uses single quotes and escapes embedded single quotes by doubling them.\n */\nfunction escapeSqliteLiteral(value: string): string {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\n/**\n * Converts a JSON pointer to SQLite's JSON path syntax.\n *\n * @example\n * \"/name\" → \"$.\\\"name\\\"\"\n * \"/items/0\" → \"$.\\\"items\\\"[0]\"\n * \"/a/b/c\" → \"$.\\\"a\\\".\\\"b\\\".\\\"c\\\"\"\n */\nfunction toSqlitePath(pointer: JsonPointer): string {\n if (!pointer || pointer === \"\" || pointer === \"/\") {\n return \"$\";\n }\n\n const segments = parseJsonPointer(pointer);\n const parts: string[] = [\"$\"];\n\n for (const segment of segments) {\n if (isArrayIndex(segment)) {\n parts.push(`[${segment}]`);\n } else {\n // Quote the key to handle special characters\n parts.push(`.${JSON.stringify(segment)}`);\n }\n }\n\n return parts.join(\"\");\n}\n\n/**\n * Checks if a JSON pointer segment is an array index.\n */\nfunction isArrayIndex(segment: string): boolean {\n return /^\\d+$/.test(segment);\n}\n\n/**\n * SQLite dialect adapter implementation.\n */\nexport const sqliteDialect: DialectAdapter = {\n name: \"sqlite\",\n\n // ============================================================\n // JSON Path Operations\n // ============================================================\n\n compilePath(pointer) {\n // Use raw SQL to ensure the path is a literal, which allows expression\n // indexes on json_extract(...) to be used by the query planner.\n return sql.raw(escapeSqliteLiteral(toSqlitePath(pointer)));\n },\n\n jsonExtract(column, pointer) {\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractText(column, pointer) {\n // SQLite's json_extract returns the native JSON type, which works\n // for text comparisons. For explicit text, we use the same function.\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractNumber(column, pointer) {\n // SQLite json_extract returns numbers natively when the value is numeric\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractBoolean(column, pointer) {\n // SQLite json_extract returns 0/1 for boolean values\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractDate(column, pointer) {\n // SQLite stores dates as ISO strings, json_extract returns them as text\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n // ============================================================\n // JSON Array Operations\n // ============================================================\n\n jsonArrayLength(column) {\n return sql`json_array_length(${column})`;\n },\n\n jsonArrayContains(column, value) {\n return sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`;\n },\n\n jsonArrayContainsAll(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=1\");\n }\n\n const conditions = values.map(\n (value) =>\n sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`,\n );\n return sql`(${sql.join(conditions, sql` AND `)})`;\n },\n\n jsonArrayContainsAny(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=0\");\n }\n\n const conditions = values.map(\n (value) =>\n sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`,\n );\n return sql`(${sql.join(conditions, sql` OR `)})`;\n },\n\n // ============================================================\n // JSON Object Operations\n // ============================================================\n\n jsonHasPath(column, pointer) {\n const path = toSqlitePath(pointer);\n return sql`json_type(${column}, ${sql.raw(escapeSqliteLiteral(path))}) IS NOT NULL`;\n },\n\n jsonPathIsNull(column, pointer) {\n const path = toSqlitePath(pointer);\n const pathSql = sql.raw(escapeSqliteLiteral(path));\n return sql`(json_extract(${column}, ${pathSql}) IS NULL OR json_type(${column}, ${pathSql}) = 'null')`;\n },\n\n jsonPathIsNotNull(column, pointer) {\n const path = toSqlitePath(pointer);\n const pathSql = sql.raw(escapeSqliteLiteral(path));\n return sql`(json_extract(${column}, ${pathSql}) IS NOT NULL AND json_type(${column}, ${pathSql}) != 'null')`;\n },\n\n // ============================================================\n // String Operations\n // ============================================================\n\n ilike(column, pattern) {\n // SQLite LIKE is case-insensitive for ASCII by default, but we use\n // LOWER() for consistency with non-ASCII characters\n return sql`LOWER(${column}) LIKE LOWER(${pattern})`;\n },\n\n // ============================================================\n // Recursive CTE Path Operations\n // ============================================================\n\n initializePath(nodeId) {\n // SQLite uses string-based paths with delimiters: '|id|'\n return sql`'|' || ${nodeId} || '|'`;\n },\n\n extendPath(currentPath, nodeId) {\n // Append: path || id || '|'\n return sql`${currentPath} || ${nodeId} || '|'`;\n },\n\n cycleCheck(nodeId, path) {\n // Check that id is NOT in path using INSTR\n // Returns TRUE if no cycle (id not found in path)\n return sql`INSTR(${path}, '|' || ${nodeId} || '|') = 0`;\n },\n\n // ============================================================\n // Type Utilities\n // ============================================================\n\n currentTimestamp() {\n return sql`datetime('now')`;\n },\n\n // ============================================================\n // Value Binding & Literals\n // ============================================================\n\n bindValue(value) {\n // SQLite doesn't support native booleans, convert to 0/1\n if (typeof value === \"boolean\") {\n return value ? 1 : 0;\n }\n return value;\n },\n\n booleanLiteral(value) {\n return sql.raw(this.booleanLiteralString(value));\n },\n\n booleanLiteralString(value) {\n return value ? \"1\" : \"0\";\n },\n\n quoteIdentifier(name) {\n // SQLite uses double quotes (or backticks), escape embedded quotes by doubling\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n },\n\n // ============================================================\n // Vector Operations\n // ============================================================\n\n supportsVectors: true,\n\n vectorDistance(column, embedding, metric) {\n // sqlite-vec functions expect vec_f32 format for the query embedding\n const formatted = this.formatEmbedding(embedding);\n switch (metric) {\n case \"cosine\": {\n // Cosine distance: 1 - cosine_similarity\n // Lower is more similar (0 = identical)\n return sql`vec_distance_cosine(${column}, ${formatted})`;\n }\n case \"l2\": {\n // Euclidean (L2) distance\n // Lower is more similar (0 = identical)\n return sql`vec_distance_l2(${column}, ${formatted})`;\n }\n case \"inner_product\": {\n // sqlite-vec does not support inner product distance\n // See: https://alexgarcia.xyz/sqlite-vec/api-reference.html\n throw new Error(\n \"Inner product distance is not supported by sqlite-vec. Use 'cosine' or 'l2' metrics instead.\",\n );\n }\n }\n },\n\n formatEmbedding(embedding) {\n // Validate all values are finite numbers\n for (const [index, value] of embedding.entries()) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new TypeError(\n `embedding[${index}] must be a finite number, got: ${value}`,\n );\n }\n }\n // sqlite-vec uses vec_f32() to convert JSON array to binary format\n const asJson = JSON.stringify(embedding);\n return sql`vec_f32(${asJson})`;\n },\n};\n","/**\n * SQL Dialect Module\n *\n * Provides dialect adapters for different SQL databases.\n * Use `getDialect()` to get the appropriate adapter for a dialect name.\n */\n\nexport { postgresDialect } from \"./postgres\";\nexport { sqliteDialect } from \"./sqlite\";\nexport type { DialectAdapter, SqlDialect } from \"./types\";\n\nimport { postgresDialect } from \"./postgres\";\nimport { sqliteDialect } from \"./sqlite\";\nimport { type DialectAdapter, type SqlDialect } from \"./types\";\n\n/**\n * Map of dialect names to their adapters.\n */\nconst DIALECT_ADAPTERS: Record<SqlDialect, DialectAdapter> = {\n sqlite: sqliteDialect,\n postgres: postgresDialect,\n};\n\n/**\n * Gets the dialect adapter for a given dialect name.\n *\n * @param dialect - The dialect name (\"sqlite\" or \"postgres\")\n * @returns The dialect adapter\n * @throws Error if the dialect is not supported\n *\n * @example\n * ```typescript\n * const adapter = getDialect(\"postgres\");\n * const sql = adapter.jsonExtract(column, \"/name\");\n * ```\n */\nexport function getDialect(dialect: SqlDialect): DialectAdapter {\n return DIALECT_ADAPTERS[dialect];\n}\n\n/**\n * Default dialect used when none is specified.\n */\nexport const DEFAULT_DIALECT: SqlDialect = \"sqlite\";\n","export const NODE_META_KEYS = [\n \"version\",\n \"validFrom\",\n \"validTo\",\n \"createdAt\",\n \"updatedAt\",\n \"deletedAt\",\n] as const;\n\nexport const EDGE_META_KEYS = [\n \"validFrom\",\n \"validTo\",\n \"createdAt\",\n \"updatedAt\",\n \"deletedAt\",\n] as const;\n"]}
|