@undefineds.co/xpod 0.2.42 → 0.2.44

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.
@@ -1 +1 @@
1
- {"version":3,"file":"PgQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/PgQuintStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PgQuintStore - PostgreSQL implementation of QuintStore\n * \n * 支持两种连接方式:\n * - PGLite: 嵌入式 PostgreSQL,用于测试\n * - pg (node-postgres): 真正的 PostgreSQL 连接,用于生产\n * \n * PostgreSQL 不支持 TEXT 字段中的 \\0 (null) 字符,\n * 所以我们需要对序列化的字符串进行转换。\n */\n\nimport { PGlite } from '@electric-sql/pglite';\n\nimport { BaseQuintStore, type SqlExecutor } from './BaseQuintStore';\nimport type { QuintStoreOptions, Quint } from './types';\nimport { getSharedPool } from '../database/PostgresPoolManager';\n\n/**\n * PostgreSQL 连接配置\n */\nexport interface PgQuintStoreOptions extends QuintStoreOptions {\n /** \n * 连接方式:\n * - 'pglite': 使用 PGLite 嵌入式数据库(测试用)\n * - 'pg': 使用 node-postgres 连接真正的 PostgreSQL(生产用)\n */\n driver?: 'pglite' | 'pg';\n \n /** PGLite 数据目录,仅当 driver='pglite' 时使用 */\n dataDir?: string;\n \n /** PostgreSQL 连接字符串,仅当 driver='pg' 时使用 */\n connectionString?: string;\n \n /** PostgreSQL 连接配置,仅当 driver='pg' 时使用 */\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n \n /** \n * 共享的 pg Pool 实例(避免多个组件创建独立连接池导致死锁)\n * 如果提供,将忽略其他连接配置\n */\n pool?: any;\n}\n\n/**\n * PostgreSQL 兼容的分隔符\n * 使用 Unicode 控制字符 U+001F (Unit Separator) 代替 \\0\n */\nconst PG_SEP = '\\u001f';\n\n/**\n * 将使用 \\0 分隔符的字符串转换为使用 PG_SEP 的字符串\n */\nfunction toPgSafe(str: string): string {\n return str.replace(/\\u0000/g, PG_SEP);\n}\n\n/**\n * 将使用 PG_SEP 分隔符的字符串转换回使用 \\0 的字符串\n */\nfunction fromPgSafe(str: string): string {\n return str.replace(new RegExp(PG_SEP, 'g'), '\\u0000');\n}\n\n/**\n * PGLite 执行器\n */\nclass PgliteExecutor implements SqlExecutor {\n constructor(private db: PGlite) {}\n\n async query<T = any>(sql: string, params?: any[]): Promise<T[]> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.db.query<T>(pgSql, safeParams);\n return result.rows.map(row => this.restoreRow(row));\n }\n\n async execute(sql: string, params?: any[]): Promise<number> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.db.query(pgSql, safeParams);\n return result.affectedRows ?? 0;\n }\n\n async executeInTransaction(statements: { sql: string; params?: any[] }[]): Promise<void> {\n await this.db.query('BEGIN');\n try {\n for (const { sql, params } of statements) {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n await this.db.query(pgSql, safeParams);\n }\n await this.db.query('COMMIT');\n } catch (error) {\n await this.db.query('ROLLBACK');\n throw error;\n }\n }\n\n async exec(sql: string): Promise<void> {\n await this.db.exec(sql);\n }\n\n private convertPlaceholders(sql: string): string {\n let index = 0;\n return sql.replace(/\\?/g, () => `$${++index}`);\n }\n\n private restoreRow<T>(row: T): T {\n if (!row || typeof row !== 'object') return row;\n \n const result: any = {};\n for (const [key, value] of Object.entries(row as any)) {\n result[key] = typeof value === 'string' ? fromPgSafe(value) : value;\n }\n return result as T;\n }\n}\n\n/**\n * node-postgres 执行器(需要安装 pg 包)\n */\nclass PgExecutor implements SqlExecutor {\n private pool: any; // pg.Pool\n \n constructor(pool: any) {\n this.pool = pool;\n }\n\n async query<T = any>(sql: string, params?: any[]): Promise<T[]> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n console.log(`[PgExecutor] Query: ${pgSql.slice(0, 60)}...`);\n const start = Date.now();\n const result = await this.pool.query(pgSql, safeParams);\n console.log(`[PgExecutor] Query done in ${Date.now() - start}ms, ${result.rows.length} rows`);\n return result.rows.map((row: any) => this.restoreRow(row));\n }\n\n async execute(sql: string, params?: any[]): Promise<number> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.pool.query(pgSql, safeParams);\n return result.rowCount ?? 0;\n }\n\n async executeInTransaction(statements: { sql: string; params?: any[] }[]): Promise<void> {\n console.log(`[PgExecutor] Getting connection from pool...`);\n const start = Date.now();\n const client = await this.pool.connect();\n console.log(`[PgExecutor] Got connection in ${Date.now() - start}ms`);\n try {\n console.log(`[PgExecutor] BEGIN transaction`);\n await client.query('BEGIN');\n for (let i = 0; i < statements.length; i++) {\n const { sql, params } = statements[i];\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n console.log(`[PgExecutor] Executing statement ${i + 1}/${statements.length}: ${pgSql.slice(0, 60)}...`);\n await client.query(pgSql, safeParams);\n }\n console.log(`[PgExecutor] COMMIT transaction`);\n await client.query('COMMIT');\n } catch (error) {\n console.error(`[PgExecutor] Error, rolling back:`, error);\n await client.query('ROLLBACK');\n throw error;\n } finally {\n console.log(`[PgExecutor] Releasing connection`);\n client.release();\n }\n }\n\n async exec(sql: string): Promise<void> {\n await this.pool.query(sql);\n }\n\n private convertPlaceholders(sql: string): string {\n let index = 0;\n return sql.replace(/\\?/g, () => `$${++index}`);\n }\n\n private restoreRow<T>(row: T): T {\n if (!row || typeof row !== 'object') return row;\n \n const result: any = {};\n for (const [key, value] of Object.entries(row as any)) {\n result[key] = typeof value === 'string' ? fromPgSafe(value) : value;\n }\n return result as T;\n }\n}\n\n/**\n * PostgreSQL QuintStore 实现\n */\nexport class PgQuintStore extends BaseQuintStore {\n private pglite: PGlite | null = null;\n private pgPool: any = null; // pg.Pool\n private pgOptions: PgQuintStoreOptions;\n\n constructor(options: PgQuintStoreOptions) {\n super(options);\n this.pgOptions = {\n driver: 'pglite', // 默认使用 PGLite\n ...options,\n };\n }\n\n protected async createExecutor(): Promise<SqlExecutor> {\n if (this.pgOptions.driver === 'pg') {\n // 使用共享的连接池(如果提供),避免死锁\n if (this.pgOptions.pool) {\n this.pgPool = this.pgOptions.pool;\n return new PgExecutor(this.pgPool);\n }\n \n // 使用共享连接池管理器,避免多个组件创建独立连接池\n this.pgPool = getSharedPool({\n connectionString: this.pgOptions.connectionString,\n host: this.pgOptions.host,\n port: this.pgOptions.port,\n database: this.pgOptions.database,\n user: this.pgOptions.user,\n password: this.pgOptions.password,\n });\n return new PgExecutor(this.pgPool);\n } else {\n // 使用 PGLite\n this.pglite = new PGlite(this.pgOptions.dataDir);\n await this.pglite.waitReady;\n return new PgliteExecutor(this.pglite);\n }\n }\n\n protected async closeExecutor(): Promise<void> {\n if (this.pglite) {\n await this.pglite.close();\n this.pglite = null;\n }\n if (this.pgPool) {\n await this.pgPool.end();\n this.pgPool = null;\n }\n }\n\n /**\n * 重写 open 方法,处理 PostgreSQL 特定的语法\n */\n override async open(): Promise<void> {\n if (this.executor) {\n return;\n }\n\n this.executor = await this.createExecutor();\n\n // PostgreSQL 建表语法\n await this.executor.exec(`\n CREATE TABLE IF NOT EXISTS quints (\n graph TEXT NOT NULL,\n subject TEXT NOT NULL,\n predicate TEXT NOT NULL,\n object TEXT NOT NULL,\n vector TEXT,\n PRIMARY KEY (graph, subject, predicate, object)\n )\n `);\n\n const indexes = [\n 'CREATE INDEX IF NOT EXISTS idx_spog ON quints (subject, predicate, object, graph)',\n 'CREATE INDEX IF NOT EXISTS idx_ogsp ON quints (object, graph, subject, predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_gspo ON quints (graph, subject, predicate, object)',\n 'CREATE INDEX IF NOT EXISTS idx_sopg ON quints (subject, object, predicate, graph)',\n 'CREATE INDEX IF NOT EXISTS idx_pogs ON quints (predicate, object, graph, subject)',\n 'CREATE INDEX IF NOT EXISTS idx_gpos ON quints (graph, predicate, object, subject)',\n ];\n\n for (const indexSql of indexes) {\n await this.executor.exec(indexSql);\n }\n }\n\n /**\n * 重写 put 方法,使用 PostgreSQL 的 ON CONFLICT\n */\n override async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToRow(quint);\n \n // PostgreSQL UPSERT 语法\n const sql = `\n INSERT INTO quints (graph, subject, predicate, object, vector) \n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (graph, subject, predicate, object) \n DO UPDATE SET vector = EXCLUDED.vector\n `;\n await this.executor!.execute(sql, [row.graph, row.subject, row.predicate, row.object, row.vector]);\n }\n\n /**\n * 重写 multiPut 方法,使用 PostgreSQL 的 ON CONFLICT\n */\n override async multiPut(quintList: Quint[]): Promise<void> {\n console.log(`[PgQuintStore.multiPut] Starting: ${quintList.length} quints`);\n this.ensureOpen();\n\n if (quintList.length === 0) {\n console.log(`[PgQuintStore.multiPut] Empty list, skipping`);\n return;\n }\n\n const statements = quintList.map(quint => {\n const row = this.quintToRow(quint);\n return {\n sql: `\n INSERT INTO quints (graph, subject, predicate, object, vector) \n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (graph, subject, predicate, object) \n DO UPDATE SET vector = EXCLUDED.vector\n `,\n params: [row.graph, row.subject, row.predicate, row.object, row.vector],\n };\n });\n\n console.log(`[PgQuintStore.multiPut] Executing ${statements.length} statements in transaction`);\n const start = Date.now();\n await this.executor!.executeInTransaction(statements);\n console.log(`[PgQuintStore.multiPut] Completed in ${Date.now() - start}ms`);\n }\n}\n"]}
1
+ {"version":3,"file":"PgQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/PgQuintStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PgQuintStore - PostgreSQL implementation of QuintStore\n *\n * 支持两种连接方式:\n * - PGLite: 嵌入式 PostgreSQL,用于测试\n * - pg (node-postgres): 真正的 PostgreSQL 连接,用于生产\n *\n * PostgreSQL 不支持 TEXT 字段中的 \\0 (null) 字符,\n * 所以我们需要对序列化的字符串进行转换。\n */\n\nimport { PGlite } from '@electric-sql/pglite';\nimport { createHash } from 'node:crypto';\nimport type { Term } from '@rdfjs/types';\n\nimport { BaseQuintStore, type SqlExecutor } from './BaseQuintStore';\nimport {\n isSerializedDateTimeLiteral,\n isSerializedNumericLiteral,\n serializeObject,\n termToId,\n} from './serialization';\nimport type { AttributeMap, CompoundPattern, QuintStoreOptions, Quint, QuintPattern, QueryOptions, TermMatch } from './types';\nimport {\n getPredicateObjectDataType,\n objectIndexFieldsFromSerialized,\n objectIndexFieldsFromTerm,\n type ObjectIndexFields,\n type PredicateObjectDataType,\n} from './value-types';\nimport { getSharedPool } from '../database/PostgresPoolManager';\n\n/**\n * PostgreSQL 连接配置\n */\nexport interface PgQuintStoreOptions extends QuintStoreOptions {\n /**\n * 连接方式:\n * - 'pglite': 使用 PGLite 嵌入式数据库(测试用)\n * - 'pg': 使用 node-postgres 连接真正的 PostgreSQL(生产用)\n */\n driver?: 'pglite' | 'pg';\n\n /** PGLite 数据目录,仅当 driver='pglite' 时使用 */\n dataDir?: string;\n\n /** PostgreSQL 连接字符串,仅当 driver='pg' 时使用 */\n connectionString?: string;\n\n /** PostgreSQL 连接配置,仅当 driver='pg' 时使用 */\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n\n /**\n * 共享的 pg Pool 实例(避免多个组件创建独立连接池导致死锁)\n * 如果提供,将忽略其他连接配置\n */\n pool?: any;\n}\n\n/**\n * PostgreSQL 兼容的分隔符\n * 使用 Unicode 控制字符 U+001F (Unit Separator) 代替 \\0\n */\nconst PG_SEP = '\\u001f';\n\n/**\n * 将使用 \\0 分隔符的字符串转换为使用 PG_SEP 的字符串\n */\nfunction toPgSafe(str: string): string {\n return str.replace(/\\u0000/g, PG_SEP);\n}\n\n/**\n * 将使用 PG_SEP 分隔符的字符串转换回使用 \\0 的字符串\n */\nfunction fromPgSafe(str: string): string {\n return str.replace(new RegExp(PG_SEP, 'g'), '\\u0000');\n}\n\ninterface PgQuintRow {\n graph: string;\n subject: string;\n predicate: string;\n object: string;\n vector: string | null;\n objectKind: PredicateObjectDataType;\n objectKey: string | null;\n objectText: string | null;\n objectDigest: string | null;\n}\n\nfunction digestObject(value: string): string {\n return createHash('sha256').update(toPgSafe(value)).digest('hex');\n}\n\n/**\n * PGLite 执行器\n */\nclass PgliteExecutor implements SqlExecutor {\n constructor(private db: PGlite) {}\n\n async query<T = any>(sql: string, params?: any[]): Promise<T[]> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.db.query<T>(pgSql, safeParams);\n return result.rows.map(row => this.restoreRow(row));\n }\n\n async execute(sql: string, params?: any[]): Promise<number> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.db.query(pgSql, safeParams);\n return result.affectedRows ?? 0;\n }\n\n async executeInTransaction(statements: { sql: string; params?: any[] }[]): Promise<void> {\n await this.db.query('BEGIN');\n try {\n for (const { sql, params } of statements) {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n await this.db.query(pgSql, safeParams);\n }\n await this.db.query('COMMIT');\n } catch (error) {\n await this.db.query('ROLLBACK');\n throw error;\n }\n }\n\n async exec(sql: string): Promise<void> {\n await this.db.exec(sql);\n }\n\n private convertPlaceholders(sql: string): string {\n let index = 0;\n return sql.replace(/\\?/g, () => `$${++index}`);\n }\n\n private restoreRow<T>(row: T): T {\n if (!row || typeof row !== 'object') return row;\n\n const result: any = {};\n for (const [key, value] of Object.entries(row as any)) {\n result[key] = typeof value === 'string' ? fromPgSafe(value) : value;\n }\n return result as T;\n }\n}\n\n/**\n * node-postgres 执行器(需要安装 pg 包)\n */\nclass PgExecutor implements SqlExecutor {\n private pool: any; // pg.Pool\n\n constructor(pool: any) {\n this.pool = pool;\n }\n\n async query<T = any>(sql: string, params?: any[]): Promise<T[]> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n console.log(`[PgExecutor] Query: ${pgSql.slice(0, 60)}...`);\n const start = Date.now();\n const result = await this.pool.query(pgSql, safeParams);\n console.log(`[PgExecutor] Query done in ${Date.now() - start}ms, ${result.rows.length} rows`);\n return result.rows.map((row: any) => this.restoreRow(row));\n }\n\n async execute(sql: string, params?: any[]): Promise<number> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.pool.query(pgSql, safeParams);\n return result.rowCount ?? 0;\n }\n\n async executeInTransaction(statements: { sql: string; params?: any[] }[]): Promise<void> {\n console.log(`[PgExecutor] Getting connection from pool...`);\n const start = Date.now();\n const client = await this.pool.connect();\n console.log(`[PgExecutor] Got connection in ${Date.now() - start}ms`);\n try {\n console.log(`[PgExecutor] BEGIN transaction`);\n await client.query('BEGIN');\n for (let i = 0; i < statements.length; i++) {\n const { sql, params } = statements[i];\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n console.log(`[PgExecutor] Executing statement ${i + 1}/${statements.length}: ${pgSql.slice(0, 60)}...`);\n await client.query(pgSql, safeParams);\n }\n console.log(`[PgExecutor] COMMIT transaction`);\n await client.query('COMMIT');\n } catch (error) {\n console.error(`[PgExecutor] Error, rolling back:`, error);\n await client.query('ROLLBACK');\n throw error;\n } finally {\n console.log(`[PgExecutor] Releasing connection`);\n client.release();\n }\n }\n\n async exec(sql: string): Promise<void> {\n await this.pool.query(sql);\n }\n\n private convertPlaceholders(sql: string): string {\n let index = 0;\n return sql.replace(/\\?/g, () => `$${++index}`);\n }\n\n private restoreRow<T>(row: T): T {\n if (!row || typeof row !== 'object') return row;\n\n const result: any = {};\n for (const [key, value] of Object.entries(row as any)) {\n result[key] = typeof value === 'string' ? fromPgSafe(value) : value;\n }\n return result as T;\n }\n}\n\n/**\n * PostgreSQL QuintStore 实现\n */\nexport class PgQuintStore extends BaseQuintStore {\n private pglite: PGlite | null = null;\n private pgPool: any = null; // pg.Pool\n private pgOptions: PgQuintStoreOptions;\n\n constructor(options: PgQuintStoreOptions) {\n super(options);\n this.pgOptions = {\n driver: 'pglite', // 默认使用 PGLite\n ...options,\n };\n }\n\n protected async createExecutor(): Promise<SqlExecutor> {\n if (this.pgOptions.driver === 'pg') {\n // 使用共享的连接池(如果提供),避免死锁\n if (this.pgOptions.pool) {\n this.pgPool = this.pgOptions.pool;\n return new PgExecutor(this.pgPool);\n }\n\n // 使用共享连接池管理器,避免多个组件创建独立连接池\n this.pgPool = getSharedPool({\n connectionString: this.pgOptions.connectionString,\n host: this.pgOptions.host,\n port: this.pgOptions.port,\n database: this.pgOptions.database,\n user: this.pgOptions.user,\n password: this.pgOptions.password,\n });\n return new PgExecutor(this.pgPool);\n } else {\n // 使用 PGLite\n this.pglite = new PGlite(this.pgOptions.dataDir);\n await this.pglite.waitReady;\n return new PgliteExecutor(this.pglite);\n }\n }\n\n protected async closeExecutor(): Promise<void> {\n if (this.pglite) {\n await this.pglite.close();\n this.pglite = null;\n }\n if (this.pgPool) {\n await this.pgPool.end();\n this.pgPool = null;\n }\n }\n\n /**\n * 重写 open 方法,处理 PostgreSQL 特定的语法\n */\n override async open(): Promise<void> {\n if (this.executor) {\n return;\n }\n\n this.executor = await this.createExecutor();\n\n // PostgreSQL 建表语法\n await this.executor.exec(`\n CREATE TABLE IF NOT EXISTS quints (\n object_kind TEXT,\n object_key TEXT,\n object_text TEXT,\n object_digest TEXT,\n graph TEXT NOT NULL,\n subject TEXT NOT NULL,\n predicate TEXT NOT NULL,\n object TEXT NOT NULL,\n vector TEXT\n )\n `);\n\n await this.ensureTypedObjectSchema();\n\n const indexes = [\n 'CREATE INDEX IF NOT EXISTS idx_quints_graph ON quints (graph)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_subject ON quints (subject)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_predicate ON quints (predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_object_key ON quints (object_kind, object_key)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_predicate_object_key ON quints (predicate, object_kind, object_key)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_predicate_object_digest ON quints (predicate, object_kind, object_digest)',\n 'CREATE UNIQUE INDEX IF NOT EXISTS idx_quints_gspo_key ON quints (graph, subject, predicate, object_kind, object_key) WHERE object_key IS NOT NULL',\n 'CREATE UNIQUE INDEX IF NOT EXISTS idx_quints_gspo_digest ON quints (graph, subject, predicate, object_kind, object_digest) WHERE object_digest IS NOT NULL',\n 'CREATE INDEX IF NOT EXISTS idx_quints_gsp ON quints (graph, subject, predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_sp ON quints (subject, predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_gp ON quints (graph, predicate)',\n ];\n\n for (const indexSql of indexes) {\n await this.executor.exec(indexSql);\n }\n }\n\n /**\n * 重写 put 方法,避免长文本对象进入 PostgreSQL btree 唯一键\n */\n override async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToPgRow(quint);\n\n await this.executor!.executeInTransaction(this.writeStatementsForRow(row));\n }\n\n /**\n * 重写 multiPut 方法,使用同一事务保持批量写入幂等\n */\n override async multiPut(quintList: Quint[]): Promise<void> {\n console.log(`[PgQuintStore.multiPut] Starting: ${quintList.length} quints`);\n this.ensureOpen();\n\n if (quintList.length === 0) {\n console.log(`[PgQuintStore.multiPut] Empty list, skipping`);\n return;\n }\n\n const statements = quintList.flatMap(quint => {\n const row = this.quintToPgRow(quint);\n return this.writeStatementsForRow(row);\n });\n\n console.log(`[PgQuintStore.multiPut] Executing ${statements.length} statements in transaction`);\n const start = Date.now();\n await this.executor!.executeInTransaction(statements);\n console.log(`[PgQuintStore.multiPut] Completed in ${Date.now() - start}ms`);\n }\n\n override async multiDel(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const statements = quintList.map(quint => {\n const row = this.quintToPgRow(quint);\n return {\n sql: `\n DELETE FROM quints\n WHERE graph = $1\n AND subject = $2\n AND predicate = $3\n AND object = $4\n `,\n params: [row.graph, row.subject, row.predicate, row.object],\n };\n });\n\n await this.executor!.executeInTransaction(statements);\n }\n\n override async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term,\n ): Promise<AttributeMap> {\n this.ensureOpen();\n\n if (subjects.length === 0 || predicates.length === 0) {\n return new Map();\n }\n\n const subjectPlaceholders = subjects.map(() => '?').join(', ');\n const predicatePlaceholders = predicates.map(() => '?').join(', ');\n\n let sql = `\n SELECT subject, predicate, object\n FROM quints\n WHERE subject IN (${subjectPlaceholders})\n AND predicate IN (${predicatePlaceholders})\n `;\n const params: any[] = [...subjects, ...predicates];\n\n if (graph && graph.termType !== 'DefaultGraph') {\n const graphValue = termToId(graph);\n sql += ` AND graph = ?`;\n params.push(graphValue);\n }\n\n const rows = await this.executor!.query<{ subject: string; predicate: string; object: string }>(sql, params);\n const result: AttributeMap = new Map();\n\n for (const row of rows) {\n if (!result.has(row.subject)) {\n result.set(row.subject, new Map());\n }\n const predicateMap = result.get(row.subject)!;\n if (!predicateMap.has(row.predicate)) {\n predicateMap.set(row.predicate, []);\n }\n predicateMap.get(row.predicate)!.push(this.deserializeObject(row.object));\n }\n\n return result;\n }\n\n protected override buildWhereClause(pattern: QuintPattern): { whereClause: string; params: any[] } {\n const conditions: string[] = [];\n const params: any[] = [];\n const predicate = this.extractExactPredicate(pattern.predicate);\n\n this.addPgCondition(conditions, params, 'graph', pattern.graph);\n this.addPgCondition(conditions, params, 'subject', pattern.subject);\n this.addPgCondition(conditions, params, 'predicate', pattern.predicate);\n if (pattern.object) {\n this.addObjectConditions(conditions, params, undefined, pattern.object, predicate);\n }\n\n const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';\n return { whereClause, params };\n }\n\n private addPgCondition(\n conditions: string[],\n params: any[],\n column: 'graph' | 'subject' | 'predicate',\n match: TermMatch | undefined,\n ): void {\n if (!match) return;\n\n if (typeof match === 'object' && 'termType' in match) {\n const value = termToId(match as Term);\n conditions.push(`${column} = ?`);\n params.push(value);\n return;\n }\n\n const ops = match as any;\n if (ops.$eq !== undefined) {\n const value = this.serializeOpValue(ops.$eq, false, '$eq');\n conditions.push(`${column} = ?`);\n params.push(String(value));\n return;\n }\n\n super.addConditions(conditions, params, column, match, false);\n }\n\n protected override addAliasedConditions(\n conditions: string[],\n params: any[],\n alias: string,\n pattern: any,\n ): void {\n this.addAliasedPgCondition(conditions, params, alias, 'graph', pattern.graph, false);\n this.addAliasedPgCondition(conditions, params, alias, 'subject', pattern.subject, false);\n this.addAliasedPgCondition(conditions, params, alias, 'predicate', pattern.predicate, false);\n this.addAliasedObjectConditions(conditions, params, alias, pattern);\n }\n\n protected override buildCompoundQuery(compound: CompoundPattern, options?: QueryOptions): { sql: string; params: any[] } {\n const { patterns, joinOn, select } = compound;\n const params: any[] = [];\n\n let selectClause = `q0.${joinOn} as join_value`;\n\n if (select) {\n for (const s of select) {\n selectClause += `, q${s.pattern}.${s.field} as ${s.alias}`;\n }\n } else {\n for (let i = 0; i < patterns.length; i++) {\n selectClause += `, q${i}.object as p${i}_object`;\n selectClause += `, q${i}.predicate as p${i}_predicate`;\n }\n }\n\n let fromClause = 'quints q0';\n for (let i = 1; i < patterns.length; i++) {\n fromClause += ` JOIN quints q${i} ON q0.${joinOn} = q${i}.${joinOn}`;\n fromClause += ` AND q0.graph = q${i}.graph`;\n }\n\n const whereParts: string[] = [];\n\n for (let i = 0; i < patterns.length; i++) {\n const pattern = patterns[i];\n const alias = `q${i}`;\n\n this.addAliasedConditions(whereParts, params, alias, pattern);\n }\n\n let sql = `SELECT ${selectClause} FROM ${fromClause}`;\n\n if (whereParts.length > 0) {\n sql += ` WHERE ${whereParts.join(' AND ')}`;\n }\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n protected override buildSelectQuery(pattern: QuintPattern, options?: QueryOptions): { sql: string; params: any[] } {\n const { whereClause, params } = this.buildWhereClause(pattern);\n\n let sql = `SELECT * FROM quints${whereClause}`;\n\n if (options?.order && options.order.length > 0) {\n const orderCols = options.order.map(field => {\n if (field === 'object') {\n const objectType = this.resolveObjectDataTypeForPattern(pattern);\n if (objectType === 'longText') {\n throw new Error('ORDER BY object is not supported for longText predicates');\n }\n return 'object_key';\n }\n return field;\n }).join(', ');\n sql += ` ORDER BY ${orderCols}`;\n if (options.reverse) {\n sql += ' DESC';\n }\n }\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n private async ensureTypedObjectSchema(): Promise<void> {\n const statements = [\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_kind TEXT',\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_key TEXT',\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_text TEXT',\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_digest TEXT',\n ];\n\n for (const statement of statements) {\n await this.executor!.exec(statement);\n }\n\n // The old Postgres schema indexed complete RDF terms. Long literals can\n // exceed the btree tuple size and surface as 500s while creating containers.\n const obsoleteIndexes = [\n 'idx_spog',\n 'idx_ogsp',\n 'idx_gspo',\n 'idx_sopg',\n 'idx_pogs',\n 'idx_gpos',\n 'idx_pg_spog',\n 'idx_pg_ogsp',\n 'idx_pg_gspo',\n 'idx_pg_sopg',\n 'idx_pg_pogs',\n 'idx_pg_gpos',\n 'idx_pg_graph_prefix',\n 'idx_quints_predicate_object_text',\n 'idx_quints_quint_hash',\n 'idx_quints_graph_hash',\n 'idx_quints_subject_hash',\n 'idx_quints_predicate_hash',\n 'idx_quints_object_hash',\n 'idx_quints_gsp_hash',\n 'idx_quints_sp_hash',\n 'idx_quints_gp_hash',\n ];\n\n for (const indexName of obsoleteIndexes) {\n await this.executor!.exec(`DROP INDEX IF EXISTS ${indexName}`);\n }\n\n await this.executor!.exec('ALTER TABLE quints DROP CONSTRAINT IF EXISTS quints_pkey');\n\n const obsoleteColumns = [\n 'quint_hash',\n 'graph_hash',\n 'subject_hash',\n 'predicate_hash',\n 'object_hash',\n ];\n\n for (const columnName of obsoleteColumns) {\n await this.executor!.exec(`ALTER TABLE quints DROP COLUMN IF EXISTS ${columnName}`);\n }\n\n await this.backfillMissingObjectIndexFields();\n await this.executor!.exec(`\n UPDATE quints\n SET object_kind = 'text'\n WHERE object_kind = 'shortText'\n `);\n }\n\n private async backfillMissingObjectIndexFields(): Promise<void> {\n const rows = await this.executor!.query<{\n graph: string;\n subject: string;\n predicate: string;\n object: string;\n }>(`\n SELECT graph, subject, predicate, object\n FROM quints\n WHERE object_kind IS NULL\n OR (object_key IS NULL AND object_digest IS NULL)\n `);\n\n for (const row of rows) {\n const objectIndex = this.objectIndexForSerialized(row.predicate, row.object);\n await this.executor!.execute(`\n UPDATE quints\n SET object_kind = $1,\n object_key = $2,\n object_text = $3,\n object_digest = $4\n WHERE graph = $5\n AND subject = $6\n AND predicate = $7\n AND object = $8\n `, [\n objectIndex.objectKind,\n objectIndex.objectKey,\n objectIndex.objectText,\n this.objectDigestForIndex(row.object, objectIndex),\n row.graph,\n row.subject,\n row.predicate,\n row.object,\n ]);\n }\n }\n\n private quintToPgRow(quint: Quint): PgQuintRow {\n const row = this.quintToRow(quint);\n const objectIndex = this.objectIndexForTerm(row.predicate, quint.object as Term);\n return {\n ...row,\n objectKind: objectIndex.objectKind,\n objectKey: objectIndex.objectKey,\n objectText: objectIndex.objectText,\n objectDigest: this.objectDigestForIndex(row.object, objectIndex),\n };\n }\n\n private objectIndexForTerm(predicate: string, object: Term): ObjectIndexFields {\n return objectIndexFieldsFromTerm(object, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectIndexForSerialized(predicate: string, object: string): ObjectIndexFields {\n return objectIndexFieldsFromSerialized(object, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectDigestForIndex(serialized: string, fields: ObjectIndexFields): string | null {\n return fields.objectKey === null ? digestObject(serialized) : null;\n }\n\n private writeStatementsForRow(row: PgQuintRow): { sql: string; params?: any[] }[] {\n const params = [\n row.objectKind,\n row.objectKey,\n row.objectText,\n row.objectDigest,\n row.graph,\n row.subject,\n row.predicate,\n row.object,\n row.vector,\n ];\n\n if (row.objectKey !== null) {\n return [{\n sql: `\n INSERT INTO quints (\n object_kind, object_key, object_text, object_digest,\n graph, subject, predicate, object, vector\n )\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n ON CONFLICT (graph, subject, predicate, object_kind, object_key)\n WHERE object_key IS NOT NULL\n DO UPDATE SET\n vector = EXCLUDED.vector,\n object_text = EXCLUDED.object_text,\n object_digest = EXCLUDED.object_digest\n WHERE quints.object = EXCLUDED.object\n `,\n params,\n }];\n }\n\n return [{\n sql: `\n INSERT INTO quints (\n object_kind, object_key, object_text, object_digest,\n graph, subject, predicate, object, vector\n )\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n ON CONFLICT (graph, subject, predicate, object_kind, object_digest)\n WHERE object_digest IS NOT NULL\n DO UPDATE SET\n object = CASE WHEN quints.object = EXCLUDED.object THEN EXCLUDED.object ELSE NULL END,\n vector = EXCLUDED.vector,\n object_text = EXCLUDED.object_text\n `,\n params,\n }];\n }\n\n private addObjectConditions(\n conditions: string[],\n params: any[],\n alias: string | undefined,\n match: TermMatch,\n predicate: string | undefined,\n ): void {\n const column = (name: string) => alias ? `${alias}.${name}` : name;\n\n if (typeof match === 'object' && 'termType' in match) {\n this.addObjectExactCondition(conditions, params, column, match, predicate);\n return;\n }\n\n const ops = match as any;\n\n if (ops.$eq !== undefined) {\n this.addObjectExactValueCondition(conditions, params, column, ops.$eq, '$eq', predicate);\n }\n if (ops.$ne !== undefined) {\n this.addObjectExactValueCondition(conditions, params, column, ops.$ne, '$ne', predicate);\n }\n if (ops.$gt !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '>', ops.$gt, '$gt', predicate);\n }\n if (ops.$gte !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '>=', ops.$gte, '$gte', predicate);\n }\n if (ops.$lt !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '<', ops.$lt, '$lt', predicate);\n }\n if (ops.$lte !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '<=', ops.$lte, '$lte', predicate);\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const predicates: Array<{ serialized: string; fields: ObjectIndexFields }> = ops.$in.map((value: any) => this.objectPredicateForOperatorValue(value, '$in', predicate));\n const placeholders = predicates.map((item) => {\n if (item.fields.objectKey === null) {\n return `(${column('object_digest')} = ? AND ${column('object')} = ?)`;\n }\n return `(${column('object_kind')} = ? AND ${column('object_key')} = ?)`;\n }).join(' OR ');\n conditions.push(`(${placeholders})`);\n for (const item of predicates) {\n if (item.fields.objectKey === null) {\n params.push(this.objectDigestForIndex(item.serialized, item.fields), item.serialized);\n } else {\n params.push(item.fields.objectKind, item.fields.objectKey);\n }\n }\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const values = ops.$notIn.map((value: any) => this.objectPredicateForOperatorValue(value, '$notIn', predicate).serialized);\n for (const value of values) {\n conditions.push(`${column('object')} != ?`);\n params.push(value);\n }\n }\n if (ops.$startsWith !== undefined) {\n const fields = this.objectFieldsForPrefix(ops.$startsWith, predicate);\n this.assertComparableObject(fields, '$startsWith');\n conditions.push(`${column('object_kind')} = ?`);\n params.push(fields.objectKind);\n conditions.push(`${column('object_key')} >= ? AND ${column('object_key')} < ?`);\n params.push(ops.$startsWith, ops.$startsWith + '\\uffff');\n }\n if (ops.$endsWith !== undefined) {\n this.addObjectTextCondition(conditions, params, column, 'LIKE', `%${ops.$endsWith}`, predicate);\n }\n if (ops.$contains !== undefined) {\n this.addObjectTextCondition(conditions, params, column, 'LIKE', `%${ops.$contains}%`, predicate);\n }\n if (ops.$regex !== undefined) {\n const pattern = ops.$regex.replace(/\\.\\*/g, '%').replace(/\\./g, '_');\n this.addObjectTextCondition(conditions, params, column, 'LIKE', pattern, predicate);\n }\n if (ops.$isNull === true) {\n conditions.push(`${column('object')} IS NULL`);\n }\n if (ops.$isNull === false) {\n conditions.push(`${column('object')} IS NOT NULL`);\n }\n }\n\n private addObjectExactCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n object: Term,\n predicate: string | undefined,\n ): void {\n const serialized = serializeObject(object);\n const fields = this.objectFieldsForTerm(object, predicate);\n this.addObjectExactSerializedCondition(conditions, params, column, serialized, fields);\n }\n\n private addObjectExactValueCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n value: any,\n op: '$eq' | '$ne',\n predicate: string | undefined,\n ): void {\n const item = this.objectPredicateForOperatorValue(value, op, predicate);\n if (op === '$ne') {\n conditions.push(`${column('object')} != ?`);\n params.push(item.serialized);\n return;\n }\n this.addObjectExactSerializedCondition(conditions, params, column, item.serialized, item.fields);\n }\n\n private addObjectExactSerializedCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n serialized: string,\n fields: ObjectIndexFields,\n ): void {\n if (fields.objectKey !== null) {\n conditions.push(`${column('object_kind')} = ?`);\n params.push(fields.objectKind);\n conditions.push(`${column('object_key')} = ?`);\n params.push(fields.objectKey);\n return;\n }\n\n conditions.push(`${column('object_digest')} = ?`);\n params.push(this.objectDigestForIndex(serialized, fields));\n conditions.push(`${column('object')} = ?`);\n params.push(serialized);\n }\n\n private addObjectComparableCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n sqlOperator: string,\n value: any,\n op: string,\n predicate: string | undefined,\n ): void {\n const item = this.objectPredicateForOperatorValue(value, op, predicate);\n this.assertComparableObject(item.fields, op);\n conditions.push(`${column('object_kind')} = ?`);\n params.push(item.fields.objectKind);\n conditions.push(`${column('object_key')} ${sqlOperator} ?`);\n params.push(item.serialized);\n }\n\n private addObjectTextCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n sqlOperator: string,\n value: string,\n predicate: string | undefined,\n ): void {\n const declaredType = getPredicateObjectDataType(predicate, this.options.predicateObjectDataTypes);\n if (declaredType) {\n if (!['text', 'longText', 'literal'].includes(declaredType)) {\n throw new Error(`Object text search is not supported for ${declaredType}`);\n }\n conditions.push(`${column('object_kind')} = ?`);\n params.push(declaredType);\n }\n conditions.push(`${column('object_text')} ${sqlOperator} ?`);\n params.push(value);\n }\n\n private objectPredicateForOperatorValue(\n value: any,\n op: string,\n predicate: string | undefined,\n ): { serialized: string; fields: ObjectIndexFields } {\n const serialized = this.serializeOpValue(value, true, op);\n return {\n serialized,\n fields: this.objectFieldsForSerialized(serialized, predicate),\n };\n }\n\n private objectFieldsForTerm(object: Term, predicate: string | undefined): ObjectIndexFields {\n return objectIndexFieldsFromTerm(object, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectFieldsForSerialized(serialized: string, predicate: string | undefined): ObjectIndexFields {\n return objectIndexFieldsFromSerialized(serialized, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectFieldsForPrefix(prefix: string, predicate: string | undefined): ObjectIndexFields {\n const declaredType = getPredicateObjectDataType(predicate, this.options.predicateObjectDataTypes);\n if (declaredType) {\n if (declaredType === 'longText') {\n return { objectKind: 'longText', objectKey: null, objectText: prefix };\n }\n return { objectKind: declaredType, objectKey: prefix, objectText: null };\n }\n\n if (isSerializedNumericLiteral(prefix)) {\n return { objectKind: 'numeric', objectKey: prefix, objectText: null };\n }\n if (isSerializedDateTimeLiteral(prefix)) {\n return { objectKind: 'dateTime', objectKey: prefix, objectText: null };\n }\n if (prefix.startsWith('\"')) {\n return { objectKind: 'text', objectKey: prefix, objectText: null };\n }\n if (prefix.startsWith('_:')) {\n return { objectKind: 'blankNode', objectKey: prefix, objectText: null };\n }\n return { objectKind: 'iri', objectKey: prefix, objectText: null };\n }\n\n private assertComparableObject(fields: ObjectIndexFields, op: string): void {\n if (fields.objectKey !== null && fields.objectKind !== 'longText') {\n return;\n }\n throw new Error(`Object ${op} is not supported for ${fields.objectKind}; declare/use a comparable data type instead of longText`);\n }\n\n private addAliasedObjectConditions(\n conditions: string[],\n params: any[],\n alias: string,\n pattern: QuintPattern,\n ): void {\n if (!pattern.object) return;\n this.addObjectConditions(\n conditions,\n params,\n alias,\n pattern.object,\n this.extractExactPredicate(pattern.predicate),\n );\n }\n\n private extractExactPredicate(match: TermMatch | undefined): string | undefined {\n if (!match) return undefined;\n if (typeof match === 'object' && 'termType' in match) {\n return termToId(match as Term);\n }\n const ops = match as any;\n if (ops.$eq !== undefined) {\n return String(this.serializeOpValue(ops.$eq, false, '$eq'));\n }\n return undefined;\n }\n\n private resolveObjectDataTypeForPattern(pattern: QuintPattern): PredicateObjectDataType | undefined {\n const predicate = this.extractExactPredicate(pattern.predicate);\n if (predicate) {\n return getPredicateObjectDataType(predicate, this.options.predicateObjectDataTypes);\n }\n if (pattern.object && typeof pattern.object === 'object' && 'termType' in pattern.object) {\n return this.objectFieldsForTerm(pattern.object as Term, predicate).objectKind;\n }\n return undefined;\n }\n\n private addAliasedPgCondition(\n conditions: string[],\n params: any[],\n alias: string,\n column: string,\n match: any,\n isObject: boolean,\n ): void {\n if (!match) return;\n\n if (isObject) {\n this.addObjectConditions(conditions, params, alias, match, undefined);\n return;\n }\n\n if (typeof match === 'object' && 'termType' in match) {\n const value = termToId(match);\n conditions.push(`${alias}.${column} = ?`);\n params.push(value);\n return;\n }\n\n if (match.$eq !== undefined) {\n const value = this.serializeOpValue(match.$eq, false, '$eq');\n conditions.push(`${alias}.${column} = ?`);\n params.push(value);\n return;\n }\n\n this.addFallbackAliasedCondition(conditions, params, alias, column, match, isObject);\n }\n\n private addFallbackAliasedCondition(\n conditions: string[],\n params: any[],\n alias: string,\n column: string,\n match: any,\n isObject: boolean,\n ): void {\n if (isObject) {\n this.addObjectConditions(conditions, params, alias, match, undefined);\n return;\n }\n if (match.$gt !== undefined) {\n conditions.push(`${alias}.${column} > ?`);\n params.push(this.serializeOpValue(match.$gt, false, '$gt'));\n }\n if (match.$gte !== undefined) {\n conditions.push(`${alias}.${column} >= ?`);\n params.push(this.serializeOpValue(match.$gte, false, '$gte'));\n }\n if (match.$lt !== undefined) {\n conditions.push(`${alias}.${column} < ?`);\n params.push(this.serializeOpValue(match.$lt, false, '$lt'));\n }\n if (match.$lte !== undefined) {\n conditions.push(`${alias}.${column} <= ?`);\n params.push(this.serializeOpValue(match.$lte, false, '$lte'));\n }\n if (match.$in !== undefined && match.$in.length > 0) {\n const placeholders = match.$in.map(() => '?').join(', ');\n conditions.push(`${alias}.${column} IN (${placeholders})`);\n params.push(...match.$in.map((value: any) => this.serializeOpValue(value, false, '$in')));\n }\n }\n}\n"]}
@@ -146,6 +146,67 @@
146
146
  }
147
147
  ]
148
148
  }
149
+ },
150
+ {
151
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore_options_predicateObjectDataTypes",
152
+ "range": {
153
+ "@type": "ParameterRangeCollectEntries",
154
+ "parameterRangeCollectEntriesParameters": [
155
+ {
156
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore_options_predicateObjectDataTypes_key"
157
+ },
158
+ {
159
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore_options_predicateObjectDataTypes_value",
160
+ "range": {
161
+ "@type": "ParameterRangeUnion",
162
+ "parameterRangeElements": [
163
+ {
164
+ "@type": "ParameterRangeLiteral",
165
+ "parameterRangeValueLiteral": "iri"
166
+ },
167
+ {
168
+ "@type": "ParameterRangeLiteral",
169
+ "parameterRangeValueLiteral": "blankNode"
170
+ },
171
+ {
172
+ "@type": "ParameterRangeLiteral",
173
+ "parameterRangeValueLiteral": "text"
174
+ },
175
+ {
176
+ "@type": "ParameterRangeLiteral",
177
+ "parameterRangeValueLiteral": "longText"
178
+ },
179
+ {
180
+ "@type": "ParameterRangeLiteral",
181
+ "parameterRangeValueLiteral": "numeric"
182
+ },
183
+ {
184
+ "@type": "ParameterRangeLiteral",
185
+ "parameterRangeValueLiteral": "dateTime"
186
+ },
187
+ {
188
+ "@type": "ParameterRangeLiteral",
189
+ "parameterRangeValueLiteral": "literal"
190
+ }
191
+ ]
192
+ }
193
+ }
194
+ ]
195
+ },
196
+ "comment": "Predicate-level RDF object data declarations. This declares schema value types, not query modes. The store derives whether exact/range/prefix/search can be pushed down from the data type."
197
+ },
198
+ {
199
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore_options_textMaxBytes",
200
+ "range": {
201
+ "@type": "ParameterRangeUnion",
202
+ "parameterRangeElements": [
203
+ "xsd:number",
204
+ {
205
+ "@type": "ParameterRangeUndefined"
206
+ }
207
+ ]
208
+ },
209
+ "comment": "Maximum serialized byte length that can be indexed as text. Longer undeclared text literals are stored as longText."
149
210
  }
150
211
  ],
151
212
  "memberFields": [
@@ -184,6 +245,126 @@
184
245
  {
185
246
  "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_multiPut",
186
247
  "memberFieldName": "multiPut"
248
+ },
249
+ {
250
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_multiDel",
251
+ "memberFieldName": "multiDel"
252
+ },
253
+ {
254
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_getAttributes",
255
+ "memberFieldName": "getAttributes"
256
+ },
257
+ {
258
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_buildWhereClause",
259
+ "memberFieldName": "buildWhereClause"
260
+ },
261
+ {
262
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addPgCondition",
263
+ "memberFieldName": "addPgCondition"
264
+ },
265
+ {
266
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addAliasedConditions",
267
+ "memberFieldName": "addAliasedConditions"
268
+ },
269
+ {
270
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_buildCompoundQuery",
271
+ "memberFieldName": "buildCompoundQuery"
272
+ },
273
+ {
274
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_buildSelectQuery",
275
+ "memberFieldName": "buildSelectQuery"
276
+ },
277
+ {
278
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_ensureTypedObjectSchema",
279
+ "memberFieldName": "ensureTypedObjectSchema"
280
+ },
281
+ {
282
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_backfillMissingObjectIndexFields",
283
+ "memberFieldName": "backfillMissingObjectIndexFields"
284
+ },
285
+ {
286
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_quintToPgRow",
287
+ "memberFieldName": "quintToPgRow"
288
+ },
289
+ {
290
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_objectIndexForTerm",
291
+ "memberFieldName": "objectIndexForTerm"
292
+ },
293
+ {
294
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_objectIndexForSerialized",
295
+ "memberFieldName": "objectIndexForSerialized"
296
+ },
297
+ {
298
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_objectDigestForIndex",
299
+ "memberFieldName": "objectDigestForIndex"
300
+ },
301
+ {
302
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_writeStatementsForRow",
303
+ "memberFieldName": "writeStatementsForRow"
304
+ },
305
+ {
306
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addObjectConditions",
307
+ "memberFieldName": "addObjectConditions"
308
+ },
309
+ {
310
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addObjectExactCondition",
311
+ "memberFieldName": "addObjectExactCondition"
312
+ },
313
+ {
314
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addObjectExactValueCondition",
315
+ "memberFieldName": "addObjectExactValueCondition"
316
+ },
317
+ {
318
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addObjectExactSerializedCondition",
319
+ "memberFieldName": "addObjectExactSerializedCondition"
320
+ },
321
+ {
322
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addObjectComparableCondition",
323
+ "memberFieldName": "addObjectComparableCondition"
324
+ },
325
+ {
326
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addObjectTextCondition",
327
+ "memberFieldName": "addObjectTextCondition"
328
+ },
329
+ {
330
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_objectPredicateForOperatorValue",
331
+ "memberFieldName": "objectPredicateForOperatorValue"
332
+ },
333
+ {
334
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_objectFieldsForTerm",
335
+ "memberFieldName": "objectFieldsForTerm"
336
+ },
337
+ {
338
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_objectFieldsForSerialized",
339
+ "memberFieldName": "objectFieldsForSerialized"
340
+ },
341
+ {
342
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_objectFieldsForPrefix",
343
+ "memberFieldName": "objectFieldsForPrefix"
344
+ },
345
+ {
346
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_assertComparableObject",
347
+ "memberFieldName": "assertComparableObject"
348
+ },
349
+ {
350
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addAliasedObjectConditions",
351
+ "memberFieldName": "addAliasedObjectConditions"
352
+ },
353
+ {
354
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_extractExactPredicate",
355
+ "memberFieldName": "extractExactPredicate"
356
+ },
357
+ {
358
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_resolveObjectDataTypeForPattern",
359
+ "memberFieldName": "resolveObjectDataTypeForPattern"
360
+ },
361
+ {
362
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addAliasedPgCondition",
363
+ "memberFieldName": "addAliasedPgCondition"
364
+ },
365
+ {
366
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addFallbackAliasedCondition",
367
+ "memberFieldName": "addFallbackAliasedCondition"
187
368
  }
188
369
  ],
189
370
  "constructorArguments": [
@@ -249,6 +430,27 @@
249
430
  "value": {
250
431
  "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore_options_debug"
251
432
  }
433
+ },
434
+ {
435
+ "keyRaw": "predicateObjectDataTypes",
436
+ "value": {
437
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore_options_predicateObjectDataTypes__constructorArgument",
438
+ "fields": [
439
+ {
440
+ "collectEntries": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore_options_predicateObjectDataTypes",
441
+ "key": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore_options_predicateObjectDataTypes_key",
442
+ "value": {
443
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore_options_predicateObjectDataTypes_value"
444
+ }
445
+ }
446
+ ]
447
+ }
448
+ },
449
+ {
450
+ "keyRaw": "textMaxBytes",
451
+ "value": {
452
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore_options_textMaxBytes"
453
+ }
252
454
  }
253
455
  ]
254
456
  }
@@ -25,6 +25,67 @@
25
25
  }
26
26
  ]
27
27
  }
28
+ },
29
+ {
30
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore_options_predicateObjectDataTypes",
31
+ "range": {
32
+ "@type": "ParameterRangeCollectEntries",
33
+ "parameterRangeCollectEntriesParameters": [
34
+ {
35
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore_options_predicateObjectDataTypes_key"
36
+ },
37
+ {
38
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore_options_predicateObjectDataTypes_value",
39
+ "range": {
40
+ "@type": "ParameterRangeUnion",
41
+ "parameterRangeElements": [
42
+ {
43
+ "@type": "ParameterRangeLiteral",
44
+ "parameterRangeValueLiteral": "iri"
45
+ },
46
+ {
47
+ "@type": "ParameterRangeLiteral",
48
+ "parameterRangeValueLiteral": "blankNode"
49
+ },
50
+ {
51
+ "@type": "ParameterRangeLiteral",
52
+ "parameterRangeValueLiteral": "text"
53
+ },
54
+ {
55
+ "@type": "ParameterRangeLiteral",
56
+ "parameterRangeValueLiteral": "longText"
57
+ },
58
+ {
59
+ "@type": "ParameterRangeLiteral",
60
+ "parameterRangeValueLiteral": "numeric"
61
+ },
62
+ {
63
+ "@type": "ParameterRangeLiteral",
64
+ "parameterRangeValueLiteral": "dateTime"
65
+ },
66
+ {
67
+ "@type": "ParameterRangeLiteral",
68
+ "parameterRangeValueLiteral": "literal"
69
+ }
70
+ ]
71
+ }
72
+ }
73
+ ]
74
+ },
75
+ "comment": "Predicate-level RDF object data declarations. This declares schema value types, not query modes. The store derives whether exact/range/prefix/search can be pushed down from the data type."
76
+ },
77
+ {
78
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore_options_textMaxBytes",
79
+ "range": {
80
+ "@type": "ParameterRangeUnion",
81
+ "parameterRangeElements": [
82
+ "xsd:number",
83
+ {
84
+ "@type": "ParameterRangeUndefined"
85
+ }
86
+ ]
87
+ },
88
+ "comment": "Maximum serialized byte length that can be indexed as text. Longer undeclared text literals are stored as longText."
28
89
  }
29
90
  ],
30
91
  "memberFields": [
@@ -148,6 +209,27 @@
148
209
  "value": {
149
210
  "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore_options_debug"
150
211
  }
212
+ },
213
+ {
214
+ "keyRaw": "predicateObjectDataTypes",
215
+ "value": {
216
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore_options_predicateObjectDataTypes__constructorArgument",
217
+ "fields": [
218
+ {
219
+ "collectEntries": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore_options_predicateObjectDataTypes",
220
+ "key": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore_options_predicateObjectDataTypes_key",
221
+ "value": {
222
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore_options_predicateObjectDataTypes_value"
223
+ }
224
+ }
225
+ ]
226
+ }
227
+ },
228
+ {
229
+ "keyRaw": "textMaxBytes",
230
+ "value": {
231
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore_options_textMaxBytes"
232
+ }
151
233
  }
152
234
  ]
153
235
  }
@@ -6,6 +6,7 @@
6
6
  export * from './types';
7
7
  export * from './schema';
8
8
  export * from './serialization';
9
+ export * from './value-types';
9
10
  export { SqliteQuintStore, type SqliteQuintStoreOptions } from './SqliteQuintStore';
10
11
  export { PgQuintStore, type PgQuintStoreOptions } from './PgQuintStore';
11
12
  export type { SqlExecutor, QuintRow } from './BaseQuintStore';
@@ -23,6 +23,7 @@ exports.PgQuintStore = exports.SqliteQuintStore = void 0;
23
23
  __exportStar(require("./types"), exports);
24
24
  __exportStar(require("./schema"), exports);
25
25
  __exportStar(require("./serialization"), exports);
26
+ __exportStar(require("./value-types"), exports);
26
27
  var SqliteQuintStore_1 = require("./SqliteQuintStore");
27
28
  Object.defineProperty(exports, "SqliteQuintStore", { enumerable: true, get: function () { return SqliteQuintStore_1.SqliteQuintStore; } });
28
29
  var PgQuintStore_1 = require("./PgQuintStore");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/quint/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,2CAAyB;AACzB,kDAAgC;AAChC,uDAAoF;AAA3E,oHAAA,gBAAgB,OAAA;AACzB,+CAAwE;AAA/D,4GAAA,YAAY,OAAA","sourcesContent":["/**\n * QuintStore - Five-tuple storage for RDF with vector embeddings\n * \n * Quint = G, S, P, O, V (Graph, Subject, Predicate, Object, Vector)\n */\n\nexport * from './types';\nexport * from './schema';\nexport * from './serialization';\nexport { SqliteQuintStore, type SqliteQuintStoreOptions } from './SqliteQuintStore';\nexport { PgQuintStore, type PgQuintStoreOptions } from './PgQuintStore';\n// BaseQuintStore 是内部抽象类,不对外导出\n// 如需扩展,直接 import from './BaseQuintStore'\nexport type { SqlExecutor, QuintRow } from './BaseQuintStore';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/quint/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,2CAAyB;AACzB,kDAAgC;AAChC,gDAA8B;AAC9B,uDAAoF;AAA3E,oHAAA,gBAAgB,OAAA;AACzB,+CAAwE;AAA/D,4GAAA,YAAY,OAAA","sourcesContent":["/**\n * QuintStore - Five-tuple storage for RDF with vector embeddings\n * \n * Quint = G, S, P, O, V (Graph, Subject, Predicate, Object, Vector)\n */\n\nexport * from './types';\nexport * from './schema';\nexport * from './serialization';\nexport * from './value-types';\nexport { SqliteQuintStore, type SqliteQuintStoreOptions } from './SqliteQuintStore';\nexport { PgQuintStore, type PgQuintStoreOptions } from './PgQuintStore';\n// BaseQuintStore 是内部抽象类,不对外导出\n// 如需扩展,直接 import from './BaseQuintStore'\nexport type { SqlExecutor, QuintRow } from './BaseQuintStore';\n"]}
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import type { Term, Quad } from '@rdfjs/types';
12
12
  import type { AsyncIterator } from 'asynciterator';
13
+ import type { PredicateObjectDataTypes } from './value-types';
13
14
  /**
14
15
  * 五元组 - 扩展 RDF Quad,增加向量
15
16
  */
@@ -99,6 +100,18 @@ export interface StoreStats {
99
100
  */
100
101
  export interface QuintStoreOptions {
101
102
  debug?: boolean;
103
+ /**
104
+ * Predicate-level RDF object data declarations.
105
+ *
106
+ * This declares schema value types, not query modes. The store derives
107
+ * whether exact/range/prefix/search can be pushed down from the data type.
108
+ */
109
+ predicateObjectDataTypes?: PredicateObjectDataTypes;
110
+ /**
111
+ * Maximum serialized byte length that can be indexed as text.
112
+ * Longer undeclared text literals are stored as longText.
113
+ */
114
+ textMaxBytes?: number;
102
115
  }
103
116
  /**
104
117
  * 复合查询结果 - 包含多个 pattern 的绑定值
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/storage/quint/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAmDH,wBAEC;AALD;;GAEG;AACH,SAAgB,MAAM,CAAC,KAAgB;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,CAAC;AAC5E,CAAC;AAyED;;GAEG;AACH,MAAsB,UAAU;CA4C/B;AA5CD,gCA4CC","sourcesContent":["/**\n * QuintStore - 五元组存储类型定义\n * \n * Quint = (G)raph, (S)ubject, (P)redicate, (O)bject, (V)ector\n * \n * 核心能力:\n * - RDF 四元组存储与查询\n * - 通用操作符查询($startsWith, $contains 等)\n * - 向量嵌入存储(搜索后续再做)\n */\n\nimport type { Term, Quad } from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\n\n/**\n * 五元组 - 扩展 RDF Quad,增加向量\n */\nexport interface Quint extends Quad {\n vector?: number[];\n}\n\n/**\n * Term 名称类型\n */\nexport type TermName = 'subject' | 'predicate' | 'object' | 'graph';\n\n/**\n * 操作符值类型 - 可以是 Term、string 或 number\n * 存储层会自动处理序列化\n */\nexport type OperatorValue = Term | string | number;\n\n/**\n * Term 操作符 - 用于灵活查询\n * 值可以是 Term、string 或 number,存储层自动处理序列化\n */\nexport interface TermOperators {\n $eq?: OperatorValue;\n $ne?: OperatorValue;\n $gt?: OperatorValue;\n $gte?: OperatorValue;\n $lt?: OperatorValue;\n $lte?: OperatorValue;\n $in?: OperatorValue[];\n $notIn?: OperatorValue[];\n $startsWith?: string;\n $endsWith?: string;\n $contains?: string;\n $regex?: string;\n $isNull?: boolean;\n}\n\n/**\n * Term 匹配 - Term 精确匹配或操作符匹配\n */\nexport type TermMatch = Term | TermOperators;\n\n/**\n * 判断是否为 Term(而非操作符)\n */\nexport function isTerm(value: TermMatch): value is Term {\n return value !== null && typeof value === 'object' && 'termType' in value;\n}\n\n/**\n * 查询模式\n */\nexport interface QuintPattern {\n subject?: TermMatch;\n predicate?: TermMatch;\n object?: TermMatch;\n graph?: TermMatch;\n}\n\n/**\n * 查询选项\n */\nexport interface QueryOptions {\n limit?: number;\n offset?: number;\n order?: TermName[];\n reverse?: boolean;\n}\n\n/**\n * 复合查询模式 - 多个 pattern 通过 subject 关联\n * 用于多 pattern + FILTER 查询,由数据库内部做 JOIN\n */\nexport interface CompoundPattern {\n /** 多个 pattern,每个 pattern 对应一个三元组匹配 */\n patterns: QuintPattern[];\n /** JOIN 的字段,通常是 subject */\n joinOn: TermName;\n /** 返回哪些字段的值 */\n select?: {\n pattern: number; // pattern 索引\n field: TermName; // 要返回的字段\n alias: string; // 别名\n }[];\n}\n\n/**\n * 存储统计信息\n */\nexport interface StoreStats {\n totalCount: number;\n vectorCount: number;\n graphCount: number;\n}\n\n/**\n * QuintStore 配置选项\n */\nexport interface QuintStoreOptions {\n debug?: boolean;\n}\n\n/**\n * 复合查询结果 - 包含多个 pattern 的绑定值\n */\nexport interface CompoundResult {\n /** JOIN 字段的值 */\n joinValue: string;\n /** 各 pattern 的匹配结果,key 是 alias */\n bindings: Record<string, string>;\n /** 原始 quad 数据(可选,用于获取完整信息) */\n quads?: Quint[];\n}\n\n/**\n * 批量属性查询结果\n * Map<subject, Map<predicate, object[]>>\n */\nexport type AttributeMap = Map<string, Map<string, Term[]>>;\n\n/**\n * QuintStore - 五元组存储抽象基类\n */\nexport abstract class QuintStore {\n // 查询\n abstract get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]>;\n abstract match(subject?: Term | null, predicate?: Term | null, object?: Term | null, graph?: Term | null): AsyncIterator<Quint>;\n abstract getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]>;\n abstract count(pattern: QuintPattern): Promise<number>;\n \n // 复合查询 - 多 pattern JOIN,由数据库内部执行\n getCompound?(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]>;\n \n /**\n * 批量获取多个 subject 的多个属性\n * \n * 用于优化 OPTIONAL 查询:先用 WHERE 条件获取 subjects,\n * 然后一次性获取所有属性,避免每个 OPTIONAL 变成一次 LEFT JOIN\n * \n * SQL: SELECT subject, predicate, object FROM quints \n * WHERE subject IN (...) AND predicate IN (...)\n * \n * @param subjects - 要查询的 subject IRIs\n * @param predicates - 要获取的属性 predicate IRIs\n * @param graph - 可选,限定图\n * @returns Map<subject, Map<predicate, object[]>>\n */\n getAttributes?(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<AttributeMap>;\n\n // 写入\n abstract put(quint: Quint): Promise<void>;\n abstract multiPut(quints: Quint[]): Promise<void>;\n abstract updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number>;\n\n // 删除\n abstract del(pattern: QuintPattern): Promise<number>;\n abstract multiDel(quints: Quint[]): Promise<void>;\n\n // 生命周期\n abstract open(): Promise<void>;\n abstract close(): Promise<void>;\n abstract stats(): Promise<StoreStats>;\n abstract clear(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/storage/quint/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAoDH,wBAEC;AALD;;GAEG;AACH,SAAgB,MAAM,CAAC,KAAgB;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,CAAC;AAC5E,CAAC;AAqFD;;GAEG;AACH,MAAsB,UAAU;CA4C/B;AA5CD,gCA4CC","sourcesContent":["/**\n * QuintStore - 五元组存储类型定义\n * \n * Quint = (G)raph, (S)ubject, (P)redicate, (O)bject, (V)ector\n * \n * 核心能力:\n * - RDF 四元组存储与查询\n * - 通用操作符查询($startsWith, $contains 等)\n * - 向量嵌入存储(搜索后续再做)\n */\n\nimport type { Term, Quad } from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport type { PredicateObjectDataTypes } from './value-types';\n\n/**\n * 五元组 - 扩展 RDF Quad,增加向量\n */\nexport interface Quint extends Quad {\n vector?: number[];\n}\n\n/**\n * Term 名称类型\n */\nexport type TermName = 'subject' | 'predicate' | 'object' | 'graph';\n\n/**\n * 操作符值类型 - 可以是 Term、string 或 number\n * 存储层会自动处理序列化\n */\nexport type OperatorValue = Term | string | number;\n\n/**\n * Term 操作符 - 用于灵活查询\n * 值可以是 Term、string 或 number,存储层自动处理序列化\n */\nexport interface TermOperators {\n $eq?: OperatorValue;\n $ne?: OperatorValue;\n $gt?: OperatorValue;\n $gte?: OperatorValue;\n $lt?: OperatorValue;\n $lte?: OperatorValue;\n $in?: OperatorValue[];\n $notIn?: OperatorValue[];\n $startsWith?: string;\n $endsWith?: string;\n $contains?: string;\n $regex?: string;\n $isNull?: boolean;\n}\n\n/**\n * Term 匹配 - Term 精确匹配或操作符匹配\n */\nexport type TermMatch = Term | TermOperators;\n\n/**\n * 判断是否为 Term(而非操作符)\n */\nexport function isTerm(value: TermMatch): value is Term {\n return value !== null && typeof value === 'object' && 'termType' in value;\n}\n\n/**\n * 查询模式\n */\nexport interface QuintPattern {\n subject?: TermMatch;\n predicate?: TermMatch;\n object?: TermMatch;\n graph?: TermMatch;\n}\n\n/**\n * 查询选项\n */\nexport interface QueryOptions {\n limit?: number;\n offset?: number;\n order?: TermName[];\n reverse?: boolean;\n}\n\n/**\n * 复合查询模式 - 多个 pattern 通过 subject 关联\n * 用于多 pattern + FILTER 查询,由数据库内部做 JOIN\n */\nexport interface CompoundPattern {\n /** 多个 pattern,每个 pattern 对应一个三元组匹配 */\n patterns: QuintPattern[];\n /** JOIN 的字段,通常是 subject */\n joinOn: TermName;\n /** 返回哪些字段的值 */\n select?: {\n pattern: number; // pattern 索引\n field: TermName; // 要返回的字段\n alias: string; // 别名\n }[];\n}\n\n/**\n * 存储统计信息\n */\nexport interface StoreStats {\n totalCount: number;\n vectorCount: number;\n graphCount: number;\n}\n\n/**\n * QuintStore 配置选项\n */\nexport interface QuintStoreOptions {\n debug?: boolean;\n /**\n * Predicate-level RDF object data declarations.\n *\n * This declares schema value types, not query modes. The store derives\n * whether exact/range/prefix/search can be pushed down from the data type.\n */\n predicateObjectDataTypes?: PredicateObjectDataTypes;\n /**\n * Maximum serialized byte length that can be indexed as text.\n * Longer undeclared text literals are stored as longText.\n */\n textMaxBytes?: number;\n}\n\n/**\n * 复合查询结果 - 包含多个 pattern 的绑定值\n */\nexport interface CompoundResult {\n /** JOIN 字段的值 */\n joinValue: string;\n /** 各 pattern 的匹配结果,key 是 alias */\n bindings: Record<string, string>;\n /** 原始 quad 数据(可选,用于获取完整信息) */\n quads?: Quint[];\n}\n\n/**\n * 批量属性查询结果\n * Map<subject, Map<predicate, object[]>>\n */\nexport type AttributeMap = Map<string, Map<string, Term[]>>;\n\n/**\n * QuintStore - 五元组存储抽象基类\n */\nexport abstract class QuintStore {\n // 查询\n abstract get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]>;\n abstract match(subject?: Term | null, predicate?: Term | null, object?: Term | null, graph?: Term | null): AsyncIterator<Quint>;\n abstract getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]>;\n abstract count(pattern: QuintPattern): Promise<number>;\n \n // 复合查询 - 多 pattern JOIN,由数据库内部执行\n getCompound?(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]>;\n \n /**\n * 批量获取多个 subject 的多个属性\n * \n * 用于优化 OPTIONAL 查询:先用 WHERE 条件获取 subjects,\n * 然后一次性获取所有属性,避免每个 OPTIONAL 变成一次 LEFT JOIN\n * \n * SQL: SELECT subject, predicate, object FROM quints \n * WHERE subject IN (...) AND predicate IN (...)\n * \n * @param subjects - 要查询的 subject IRIs\n * @param predicates - 要获取的属性 predicate IRIs\n * @param graph - 可选,限定图\n * @returns Map<subject, Map<predicate, object[]>>\n */\n getAttributes?(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<AttributeMap>;\n\n // 写入\n abstract put(quint: Quint): Promise<void>;\n abstract multiPut(quints: Quint[]): Promise<void>;\n abstract updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number>;\n\n // 删除\n abstract del(pattern: QuintPattern): Promise<number>;\n abstract multiDel(quints: Quint[]): Promise<void>;\n\n // 生命周期\n abstract open(): Promise<void>;\n abstract close(): Promise<void>;\n abstract stats(): Promise<StoreStats>;\n abstract clear(): Promise<void>;\n}\n"]}