@undefineds.co/xpod 0.2.44 → 0.2.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/runtime/configure-drizzle-solid.js +52 -0
- package/dist/runtime/configure-drizzle-solid.js.map +1 -1
- package/dist/storage/quint/PgQuintStore.d.ts +6 -0
- package/dist/storage/quint/PgQuintStore.js +83 -5
- package/dist/storage/quint/PgQuintStore.js.map +1 -1
- package/dist/storage/quint/PgQuintStore.jsonld +24 -0
- package/dist/storage/quint/SqliteQuintStore.d.ts +1 -0
- package/dist/storage/quint/SqliteQuintStore.js +52 -0
- package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.jsonld +4 -0
- package/dist/storage/quint/types.d.ts +6 -0
- package/dist/storage/quint/types.js.map +1 -1
- package/dist/storage/sparql/FilterPushdownExtractor.js +23 -11
- package/dist/storage/sparql/FilterPushdownExtractor.js.map +1 -1
- package/dist/util/identifiers/ClusterIdentifierStrategy.js +29 -1
- package/dist/util/identifiers/ClusterIdentifierStrategy.js.map +1 -1
- package/package.json +1 -1
- package/scripts/patch-jose.js +62 -12
|
@@ -222,6 +222,10 @@
|
|
|
222
222
|
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_pgOptions",
|
|
223
223
|
"memberFieldName": "pgOptions"
|
|
224
224
|
},
|
|
225
|
+
{
|
|
226
|
+
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_sharedPoolConfig",
|
|
227
|
+
"memberFieldName": "sharedPoolConfig"
|
|
228
|
+
},
|
|
225
229
|
{
|
|
226
230
|
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_constructor",
|
|
227
231
|
"memberFieldName": "constructor"
|
|
@@ -274,6 +278,14 @@
|
|
|
274
278
|
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_buildSelectQuery",
|
|
275
279
|
"memberFieldName": "buildSelectQuery"
|
|
276
280
|
},
|
|
281
|
+
{
|
|
282
|
+
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_count",
|
|
283
|
+
"memberFieldName": "count"
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_stats",
|
|
287
|
+
"memberFieldName": "stats"
|
|
288
|
+
},
|
|
277
289
|
{
|
|
278
290
|
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_ensureTypedObjectSchema",
|
|
279
291
|
"memberFieldName": "ensureTypedObjectSchema"
|
|
@@ -326,6 +338,18 @@
|
|
|
326
338
|
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addObjectTextCondition",
|
|
327
339
|
"memberFieldName": "addObjectTextCondition"
|
|
328
340
|
},
|
|
341
|
+
{
|
|
342
|
+
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addObjectLexicalStringCondition",
|
|
343
|
+
"memberFieldName": "addObjectLexicalStringCondition"
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_objectLexicalSql",
|
|
347
|
+
"memberFieldName": "objectLexicalSql"
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_addObjectLanguageCondition",
|
|
351
|
+
"memberFieldName": "addObjectLanguageCondition"
|
|
352
|
+
},
|
|
329
353
|
{
|
|
330
354
|
"@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_objectPredicateForOperatorValue",
|
|
331
355
|
"memberFieldName": "objectPredicateForOperatorValue"
|
|
@@ -380,6 +380,29 @@ class SqliteQuintStore {
|
|
|
380
380
|
conditions.push(`${fullColumn} LIKE ?`);
|
|
381
381
|
params.push(`%${ops.$contains}%`);
|
|
382
382
|
}
|
|
383
|
+
if (isObject && ops.$strStartsWith !== undefined) {
|
|
384
|
+
const lexical = this.objectLexicalSql(fullColumn);
|
|
385
|
+
conditions.push(`${lexical} >= ?`);
|
|
386
|
+
conditions.push(`${lexical} < ?`);
|
|
387
|
+
params.push(ops.$strStartsWith);
|
|
388
|
+
params.push(ops.$strStartsWith + '\uffff');
|
|
389
|
+
}
|
|
390
|
+
if (isObject && ops.$strEndsWith !== undefined) {
|
|
391
|
+
conditions.push(`${this.objectLexicalSql(fullColumn)} LIKE ?`);
|
|
392
|
+
params.push(`%${ops.$strEndsWith}`);
|
|
393
|
+
}
|
|
394
|
+
if (isObject && ops.$strContains !== undefined) {
|
|
395
|
+
conditions.push(`${this.objectLexicalSql(fullColumn)} LIKE ?`);
|
|
396
|
+
params.push(`%${ops.$strContains}%`);
|
|
397
|
+
}
|
|
398
|
+
if (isObject && ops.$strRegex !== undefined) {
|
|
399
|
+
conditions.push(`${this.objectLexicalSql(fullColumn)} GLOB ?`);
|
|
400
|
+
params.push(ops.$strRegex.replace(/\.\*/g, '*').replace(/\./g, '?'));
|
|
401
|
+
}
|
|
402
|
+
if (isObject && ops.$language !== undefined) {
|
|
403
|
+
conditions.push(`lower(${fullColumn}) LIKE ?`);
|
|
404
|
+
params.push(ops.$language === '*' ? '%"@%' : `%"@${ops.$language.toLowerCase()}`);
|
|
405
|
+
}
|
|
383
406
|
if (ops.$isNull === true) {
|
|
384
407
|
conditions.push(`${fullColumn} IS NULL`);
|
|
385
408
|
}
|
|
@@ -588,6 +611,25 @@ class SqliteQuintStore {
|
|
|
588
611
|
// SQLite uses GLOB as regex approximation
|
|
589
612
|
conditions.push((0, drizzle_orm_1.sql) `${column} GLOB ${ops.$regex.replace(/\.\*/g, '*').replace(/\./g, '?')}`);
|
|
590
613
|
}
|
|
614
|
+
if (isObject && ops.$strStartsWith !== undefined) {
|
|
615
|
+
const lexical = drizzle_orm_1.sql.raw(this.objectLexicalSql('object'));
|
|
616
|
+
conditions.push((0, drizzle_orm_1.sql) `${lexical} >= ${ops.$strStartsWith}`);
|
|
617
|
+
conditions.push((0, drizzle_orm_1.sql) `${lexical} < ${ops.$strStartsWith + '\uffff'}`);
|
|
618
|
+
}
|
|
619
|
+
if (isObject && ops.$strEndsWith !== undefined) {
|
|
620
|
+
conditions.push((0, drizzle_orm_1.sql) `${drizzle_orm_1.sql.raw(this.objectLexicalSql('object'))} LIKE ${`%${ops.$strEndsWith}`}`);
|
|
621
|
+
}
|
|
622
|
+
if (isObject && ops.$strContains !== undefined) {
|
|
623
|
+
conditions.push((0, drizzle_orm_1.sql) `${drizzle_orm_1.sql.raw(this.objectLexicalSql('object'))} LIKE ${`%${ops.$strContains}%`}`);
|
|
624
|
+
}
|
|
625
|
+
if (isObject && ops.$strRegex !== undefined) {
|
|
626
|
+
conditions.push((0, drizzle_orm_1.sql) `${drizzle_orm_1.sql.raw(this.objectLexicalSql('object'))} GLOB ${ops.$strRegex.replace(/\.\*/g, '*').replace(/\./g, '?')}`);
|
|
627
|
+
}
|
|
628
|
+
if (isObject && ops.$language !== undefined) {
|
|
629
|
+
conditions.push(ops.$language === '*'
|
|
630
|
+
? (0, drizzle_orm_1.sql) `lower(${column}) LIKE ${`%"@%`}`
|
|
631
|
+
: (0, drizzle_orm_1.sql) `lower(${column}) LIKE ${`%"@${ops.$language.toLowerCase()}`}`);
|
|
632
|
+
}
|
|
591
633
|
if (ops.$isNull === true) {
|
|
592
634
|
conditions.push((0, drizzle_orm_1.isNull)(column));
|
|
593
635
|
}
|
|
@@ -602,6 +644,16 @@ class SqliteQuintStore {
|
|
|
602
644
|
addTermConditions(schema_1.quints.object, pattern.object, true);
|
|
603
645
|
return conditions;
|
|
604
646
|
}
|
|
647
|
+
objectLexicalSql(column) {
|
|
648
|
+
return `CASE
|
|
649
|
+
WHEN ${column} LIKE '"%"@%' THEN substr(${column}, 2, instr(substr(${column}, 2), '"') - 1)
|
|
650
|
+
WHEN ${column} LIKE '"%"^^%' THEN substr(${column}, 2, instr(substr(${column}, 2), '"') - 1)
|
|
651
|
+
WHEN ${column} LIKE '"%"' THEN substr(${column}, 2, length(${column}) - 2)
|
|
652
|
+
WHEN ${column} LIKE 'N${serialization_1.SEP}%' THEN substr(${column}, length('N${serialization_1.SEP}') + instr(substr(${column}, length('N${serialization_1.SEP}') + 1), '${serialization_1.SEP}') + instr(substr(${column}, length('N${serialization_1.SEP}') + instr(substr(${column}, length('N${serialization_1.SEP}') + 1), '${serialization_1.SEP}') + 1), '${serialization_1.SEP}') + 1)
|
|
653
|
+
WHEN ${column} LIKE 'D${serialization_1.SEP}%' THEN substr(${column}, length('D${serialization_1.SEP}') + instr(substr(${column}, length('D${serialization_1.SEP}') + 1), '${serialization_1.SEP}') + 1)
|
|
654
|
+
ELSE ${column}
|
|
655
|
+
END`;
|
|
656
|
+
}
|
|
605
657
|
quintToRow(quint) {
|
|
606
658
|
return {
|
|
607
659
|
graph: (0, serialization_1.termToId)(quint.graph),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/SqliteQuintStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SqliteQuintStore - SQLite implementation of QuintStore using Drizzle ORM\n */\n\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { eq, ne, and, gte, gt, lt, lte, like, inArray, notInArray, isNull, isNotNull, sql } from 'drizzle-orm';\nimport type { SQL } from 'drizzle-orm';\nimport { wrap, AsyncIterator } from 'asynciterator';\nimport { DataFactory } from 'n3';\nimport type { Term, Quad } from '@rdfjs/types';\n\nimport { quints, type QuintRow, type NewQuintRow } from './schema';\nimport {\n quadToRow,\n rowToQuad,\n parseVector,\n termToId,\n serializeObject,\n deserializeObject,\n fpEncode,\n SEP,\n isSerializedObjectValue,\n} from './serialization';\nimport { getSqliteRuntime, type SqliteDatabase } from '../SqliteRuntime';\nimport type {\n Quint,\n QuintPattern,\n QuintStore,\n QuintStoreOptions,\n QueryOptions,\n StoreStats,\n TermMatch,\n TermOperators,\n CompoundPattern,\n CompoundResult,\n OperatorValue,\n} from './types';\nimport { isTerm } from './types';\n\nconst SQLITE_UNBOUNDED_LIMIT = Number.MAX_SAFE_INTEGER;\n\nexport interface SqliteQuintStoreOptions extends QuintStoreOptions {\n /** SQLite database file path, use ':memory:' for in-memory database */\n path: string;\n}\n\nexport class SqliteQuintStore {\n private sqlite: SqliteDatabase | null = null;\n private db: any | null = null;\n private options: SqliteQuintStoreOptions;\n private readonly sqliteRuntime = getSqliteRuntime();\n\n constructor(options: SqliteQuintStoreOptions) {\n // Handle sqlite: prefix\n let path = options.path;\n if (path.startsWith('sqlite:')) {\n path = path.slice(7);\n }\n this.options = { ...options, path };\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n async open(): Promise<void> {\n // Idempotent: if already open, do nothing\n if (this.sqlite) {\n return;\n }\n\n const dbPath = this.options.path;\n \n // Ensure directory exists (unless it's in-memory)\n if (dbPath !== ':memory:') {\n const dir = dirname(dbPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n \n this.sqlite = this.sqliteRuntime.openDatabase(dbPath);\n this.db = this.sqliteRuntime.createDrizzleDatabase(this.sqlite);\n\n // Create table and indexes\n this.sqlite.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 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\n async close(): Promise<void> {\n if (this.sqlite) {\n this.sqlite.close();\n this.sqlite = null;\n this.db = null;\n }\n }\n\n // ============================================\n // Query Operations\n // ============================================\n\n async get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n \n let query = this.db!.select().from(quints);\n \n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n // ORDER BY 支持\n if (options?.order && options.order.length > 0) {\n // 使用 sql 模板构建 ORDER BY\n const orderCol = options.order[0]; // 目前只支持单列排序\n const direction = options.reverse ? 'DESC' : 'ASC';\n query = query.orderBy(sql.raw(`${orderCol} ${direction}`)) as any;\n }\n\n if (options?.limit !== undefined) {\n query = query.limit(options.limit) as any;\n }\n if (options?.offset !== undefined) {\n // SQLite requires LIMIT when using OFFSET\n if (options?.limit === undefined) {\n query = query.limit(SQLITE_UNBOUNDED_LIMIT) as any;\n }\n query = query.offset(options.offset) as any;\n }\n\n const rows = await query;\n return rows.map((row: QuintRow) => this.rowToQuint(row));\n }\n\n match(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null,\n ): AsyncIterator<Quint> {\n const pattern: QuintPattern = {};\n if (subject) pattern.subject = subject;\n if (predicate) pattern.predicate = predicate;\n if (object) pattern.object = object;\n if (graph) pattern.graph = graph;\n\n return wrap(this.get(pattern));\n }\n\n async getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]> {\n return this.get({ graph: { $startsWith: prefix } }, options);\n }\n\n async count(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n let query = this.db!.select({ count: sql<number>`count(*)` }).from(quints);\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n const result = await query;\n return result[0]?.count ?? 0;\n }\n\n /**\n * Compound query - multiple patterns JOINed by a common field\n * This executes a single SQL query with JOINs, letting SQLite optimize the execution plan\n */\n async getCompound(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]> {\n this.ensureOpen();\n\n const { patterns, joinOn, select } = compound;\n \n if (patterns.length === 0) {\n return [];\n }\n\n if (patterns.length === 1) {\n // Single pattern, fall back to regular get\n const quads = await this.get(patterns[0], options);\n return quads.map(q => ({\n joinValue: termToId((q as any)[joinOn]),\n bindings: {},\n quads: [q],\n }));\n }\n\n // Build JOIN SQL\n const { sql: sqlQuery, params } = this.buildCompoundSQL(compound, options);\n \n if (this.options.debug) {\n console.log('[SqliteQuintStore] Compound SQL:', sqlQuery);\n console.log('[SqliteQuintStore] Params:', params);\n }\n\n // Execute raw SQL\n const stmt = this.sqlite!.prepare(sqlQuery);\n const rows = stmt.all(...params) as Record<string, string>[];\n\n // Convert rows to CompoundResult\n return rows.map(row => {\n const bindings: Record<string, string> = {};\n \n // Extract bindings based on select config or default naming\n if (select) {\n for (const s of select) {\n bindings[s.alias] = row[s.alias];\n }\n } else {\n // Default: include all fields from all patterns\n for (const key of Object.keys(row)) {\n if (key !== 'join_value') {\n bindings[key] = row[key];\n }\n }\n }\n\n return {\n joinValue: row.join_value,\n bindings,\n };\n });\n }\n\n /**\n * 批量获取多个 subject 的多个属性\n * \n * 用于优化 OPTIONAL 查询:避免每个 OPTIONAL 变成一次 LEFT JOIN\n * \n * SQL: SELECT subject, predicate, object FROM quints \n * WHERE subject IN (...) AND predicate IN (...)\n */\n async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<Map<string, Map<string, Term[]>>> {\n this.ensureOpen();\n\n if (subjects.length === 0 || predicates.length === 0) {\n return new Map();\n }\n\n // Build SQL with IN clauses\n const params: string[] = [];\n let sql = `SELECT subject, predicate, object FROM quints WHERE subject IN (${\n subjects.map(() => '?').join(', ')\n }) AND predicate IN (${\n predicates.map(() => '?').join(', ')\n })`;\n \n params.push(...subjects);\n params.push(...predicates);\n\n // Add graph filter if specified\n if (graph && graph.termType !== 'DefaultGraph') {\n sql += ` AND graph = ?`;\n params.push(termToId(graph as any));\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes SQL:', sql);\n console.log('[SqliteQuintStore] Params:', params.length, 'subjects:', subjects.length, 'predicates:', predicates.length);\n }\n\n const stmt = this.sqlite!.prepare(sql);\n const rows = stmt.all(...params) as { subject: string; predicate: string; object: string }[];\n\n // Build result map: subject -> predicate -> object[]\n const result = new Map<string, Map<string, Term[]>>();\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 \n if (!predicateMap.has(row.predicate)) {\n predicateMap.set(row.predicate, []);\n }\n \n // Deserialize object back to Term\n const objectTerm = deserializeObject(row.object);\n predicateMap.get(row.predicate)!.push(objectTerm);\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes returned', result.size, 'subjects');\n }\n\n return result;\n }\n\n /**\n * Build SQL for compound query with JOINs\n */\n private buildCompoundSQL(\n compound: CompoundPattern,\n options?: QueryOptions\n ): { sql: string; params: (string | number)[] } {\n const { patterns, joinOn, select } = compound;\n const params: (string | number)[] = [];\n \n // Map joinOn to column name\n const joinColumn = joinOn; // 'subject' | 'predicate' | 'object' | 'graph'\n\n // Build SELECT clause\n let selectClause = `q0.${joinColumn} 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 // Default: select object from each pattern as p0_object, p1_object, etc.\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 // Build FROM clause with JOINs\n let fromClause = 'quints q0';\n for (let i = 1; i < patterns.length; i++) {\n fromClause += ` JOIN quints q${i} ON q0.${joinColumn} = q${i}.${joinColumn}`;\n // Also join on graph to ensure same graph\n fromClause += ` AND q0.graph = q${i}.graph`;\n }\n\n // Build WHERE clause\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 const conditions = this.buildConditionsForAlias(pattern, alias, params);\n whereParts.push(...conditions);\n }\n\n let sql = `SELECT ${selectClause} FROM ${fromClause}`;\n \n if (whereParts.length > 0) {\n sql += ` WHERE ${whereParts.join(' AND ')}`;\n }\n\n // Add LIMIT/OFFSET\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n if (!options?.limit) {\n sql += ` LIMIT -1`;\n }\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n /**\n * Build WHERE conditions for a specific table alias\n */\n private buildConditionsForAlias(\n pattern: QuintPattern,\n alias: string,\n params: (string | number)[]\n ): string[] {\n const conditions: string[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): string | number => {\n if (typeof value === 'object' && 'termType' in value) {\n // It's a Term - use full serialization\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix to compare correctly\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n // $lt and $gte use prefix only\n return fpValue;\n }\n return value;\n }\n \n if (isObject) {\n if (isSerializedObjectValue(value)) {\n return value;\n }\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addCondition = (\n column: string,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n const fullColumn = `${alias}.${column}`;\n\n if (isTerm(match)) {\n conditions.push(`${fullColumn} = ?`);\n params.push(isObject ? serializeObject(match as any) : termToId(match as any));\n } else {\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(`${fullColumn} = ?`);\n params.push(serializeOpValue(ops.$eq, isObject, '$eq'));\n }\n if (ops.$ne !== undefined) {\n conditions.push(`${fullColumn} != ?`);\n params.push(serializeOpValue(ops.$ne, isObject, '$ne'));\n }\n if (ops.$gt !== undefined) {\n conditions.push(`${fullColumn} > ?`);\n params.push(serializeOpValue(ops.$gt, isObject, '$gt'));\n }\n if (ops.$gte !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n params.push(serializeOpValue(ops.$gte, isObject, '$gte'));\n }\n if (ops.$lt !== undefined) {\n conditions.push(`${fullColumn} < ?`);\n params.push(serializeOpValue(ops.$lt, isObject, '$lt'));\n }\n if (ops.$lte !== undefined) {\n conditions.push(`${fullColumn} <= ?`);\n params.push(serializeOpValue(ops.$lte, isObject, '$lte'));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const placeholders = ops.$in.map(() => '?').join(', ');\n conditions.push(`${fullColumn} IN (${placeholders})`);\n params.push(...ops.$in.map(v => serializeOpValue(v, isObject, '$in')));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const placeholders = ops.$notIn.map(() => '?').join(', ');\n conditions.push(`${fullColumn} NOT IN (${placeholders})`);\n params.push(...ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn')));\n }\n if (ops.$startsWith !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n conditions.push(`${fullColumn} < ?`);\n params.push(ops.$startsWith);\n params.push(ops.$startsWith + '\\uffff');\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$endsWith}`);\n }\n if (ops.$contains !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$contains}%`);\n }\n if (ops.$isNull === true) {\n conditions.push(`${fullColumn} IS NULL`);\n }\n if (ops.$isNull === false) {\n conditions.push(`${fullColumn} IS NOT NULL`);\n }\n }\n };\n\n addCondition('graph', pattern.graph);\n addCondition('subject', pattern.subject);\n addCondition('predicate', pattern.predicate);\n addCondition('object', pattern.object, true);\n\n return conditions;\n }\n\n // ============================================\n // Write Operations\n // ============================================\n\n async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToRow(quint);\n\n await this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n });\n }\n\n async multiPut(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const rows = quintList.map(q => this.quintToRow(q));\n\n // Use transaction for batch insert\n this.sqlite!.transaction(() => {\n for (const row of rows) {\n this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n })\n .run();\n }\n })();\n }\n\n async updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n const vectorJson = JSON.stringify(embedding);\n\n if (conditions.length === 0) {\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson });\n return result.changes;\n }\n\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson })\n .where(and(...conditions));\n\n return result.changes;\n }\n\n // ============================================\n // Delete Operations\n // ============================================\n\n async del(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n if (conditions.length === 0) {\n // Delete all - dangerous!\n const result = await this.db!.delete(quints);\n return result.changes;\n }\n\n const result = await this.db!.delete(quints).where(and(...conditions));\n return result.changes;\n }\n\n async multiDel(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n this.sqlite!.transaction(() => {\n for (const quint of quintList) {\n const g = termToId(quint.graph as any);\n const s = termToId(quint.subject as any);\n const p = termToId(quint.predicate as any);\n const o = serializeObject(quint.object as any);\n\n this.db!.delete(quints)\n .where(\n and(\n eq(quints.graph, g),\n eq(quints.subject, s),\n eq(quints.predicate, p),\n eq(quints.object, o),\n ),\n )\n .run();\n }\n })();\n }\n\n // ============================================\n // Management\n // ============================================\n\n async stats(): Promise<StoreStats> {\n this.ensureOpen();\n\n const totalResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints);\n\n const vectorResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints)\n .where(sql`${quints.vector} IS NOT NULL`);\n\n const graphResult = await this.db!\n .select({ count: sql<number>`COUNT(DISTINCT ${quints.graph})` })\n .from(quints);\n\n return {\n totalCount: totalResult[0]?.count ?? 0,\n vectorCount: vectorResult[0]?.count ?? 0,\n graphCount: graphResult[0]?.count ?? 0,\n };\n }\n\n async clear(): Promise<void> {\n this.ensureOpen();\n await this.db!.delete(quints);\n }\n\n // ============================================\n // Private Helpers\n // ============================================\n\n private ensureOpen(): void {\n if (!this.db) {\n throw new Error('Store not open. Call open() first.');\n }\n }\n\n private buildConditions(pattern: QuintPattern): SQL[] {\n const conditions: SQL[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): any => {\n if (typeof value === 'object' && 'termType' in value) {\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n return fpValue;\n }\n return value;\n }\n \n if (isObject && !isSerializedObjectValue(value)) {\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addTermConditions = (\n column: typeof quints.graph | typeof quints.subject | typeof quints.predicate | typeof quints.object,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n if (isTerm(match)) {\n // Exact Term match\n conditions.push(eq(column, isObject ? serializeObject(match as any) : termToId(match as any)));\n } else {\n // Operator match\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(eq(column, serializeOpValue(ops.$eq, isObject, '$eq')));\n }\n if (ops.$ne !== undefined) {\n conditions.push(ne(column, serializeOpValue(ops.$ne, isObject, '$ne')));\n }\n if (ops.$gt !== undefined) {\n conditions.push(gt(column, serializeOpValue(ops.$gt, isObject, '$gt')));\n }\n if (ops.$gte !== undefined) {\n conditions.push(gte(column, serializeOpValue(ops.$gte, isObject, '$gte')));\n }\n if (ops.$lt !== undefined) {\n conditions.push(lt(column, serializeOpValue(ops.$lt, isObject, '$lt')));\n }\n if (ops.$lte !== undefined) {\n conditions.push(lte(column, serializeOpValue(ops.$lte, isObject, '$lte')));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const serializedValues = ops.$in.map(v => serializeOpValue(v, isObject, '$in'));\n conditions.push(inArray(column, serializedValues));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const serializedValues = ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn'));\n conditions.push(notInArray(column, serializedValues));\n }\n if (ops.$startsWith !== undefined) {\n // Use range query for prefix matching (index-friendly)\n conditions.push(gte(column, ops.$startsWith));\n conditions.push(lt(column, ops.$startsWith + '\\uffff'));\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(like(column, `%${ops.$endsWith}`));\n }\n if (ops.$contains !== undefined) {\n conditions.push(like(column, `%${ops.$contains}%`));\n }\n if (ops.$regex !== undefined) {\n // SQLite uses GLOB as regex approximation\n conditions.push(sql`${column} GLOB ${ops.$regex.replace(/\\.\\*/g, '*').replace(/\\./g, '?')}`);\n }\n if (ops.$isNull === true) {\n conditions.push(isNull(column));\n }\n if (ops.$isNull === false) {\n conditions.push(isNotNull(column));\n }\n }\n };\n\n addTermConditions(quints.graph, pattern.graph);\n addTermConditions(quints.subject, pattern.subject);\n addTermConditions(quints.predicate, pattern.predicate);\n addTermConditions(quints.object, pattern.object, true);\n\n return conditions;\n }\n\n private quintToRow(quint: Quint): NewQuintRow {\n return {\n graph: termToId(quint.graph as any),\n subject: termToId(quint.subject as any),\n predicate: termToId(quint.predicate as any),\n object: serializeObject(quint.object as any),\n vector: quint.vector ? JSON.stringify(quint.vector) : null,\n };\n }\n\n private rowToQuint(row: QuintRow): Quint {\n const quad = rowToQuad(row);\n const quint: Quint = quad as Quint;\n if (row.vector) {\n quint.vector = parseVector(row.vector);\n }\n return quint;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SqliteQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/SqliteQuintStore.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,qCAAgD;AAChD,yCAAoC;AACpC,6CAA+G;AAE/G,iDAAoD;AACpD,2BAAiC;AAGjC,qCAAmE;AACnE,mDAUyB;AACzB,oDAAyE;AAczE,mCAAiC;AAEjC,MAAM,sBAAsB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAOvD,MAAa,gBAAgB;IAM3B,YAAY,OAAgC;QALpC,WAAM,GAA0B,IAAI,CAAC;QACrC,OAAE,GAAe,IAAI,CAAC;QAEb,kBAAa,GAAG,IAAA,gCAAgB,GAAE,CAAC;QAGlD,wBAAwB;QACxB,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,+CAA+C;IAC/C,YAAY;IACZ,+CAA+C;IAE/C,KAAK,CAAC,IAAI;QACR,0CAA0C;QAC1C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAEjC,kDAAkD;QAClD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAA,mBAAO,EAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,IAAA,mBAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhE,2BAA2B;QAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;KAgBhB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,mBAAmB;IACnB,+CAA+C;IAE/C,KAAK,CAAC,GAAG,CAAC,OAAqB,EAAE,OAAsB;QACrD,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEjD,IAAI,KAAK,GAAG,IAAI,CAAC,EAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,eAAM,CAAC,CAAC;QAE3C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAA,iBAAG,EAAC,GAAG,UAAU,CAAC,CAAQ,CAAC;QACjD,CAAC;QAED,cAAc;QACd,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,uBAAuB;YACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;YAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YACnD,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAQ,CAAC;QACpE,CAAC;QAED,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAQ,CAAC;QAC5C,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YAClC,0CAA0C;YAC1C,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;gBACjC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAQ,CAAC;YACrD,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAQ,CAAC;QAC9C,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;QACzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAa,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CACH,OAAqB,EACrB,SAAuB,EACvB,MAAoB,EACpB,KAAmB;QAEnB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,IAAI,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QACvC,IAAI,SAAS;YAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7C,IAAI,MAAM;YAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QACpC,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QAEjC,OAAO,IAAA,oBAAI,EAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,OAAsB;QAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAqB;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEjD,IAAI,KAAK,GAAG,IAAI,CAAC,EAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAA,iBAAG,EAAQ,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,CAAC;QAE3E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAA,iBAAG,EAAC,GAAG,UAAU,CAAC,CAAQ,CAAC;QACjD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;QAC3B,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,QAAyB,EAAE,OAAsB;QACjE,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAE9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,2CAA2C;YAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrB,SAAS,EAAE,IAAA,wBAAQ,EAAE,CAAS,CAAC,MAAM,CAAC,CAAC;gBACvC,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,CAAC,CAAC,CAAC;aACX,CAAC,CAAC,CAAC;QACN,CAAC;QAED,iBAAiB;QACjB,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE3E,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,QAAQ,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,kBAAkB;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAA6B,CAAC;QAE7D,iCAAiC;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpB,MAAM,QAAQ,GAA2B,EAAE,CAAC;YAE5C,4DAA4D;YAC5D,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,gDAAgD;gBAChD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnC,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;wBACzB,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,SAAS,EAAE,GAAG,CAAC,UAAU;gBACzB,QAAQ;aACT,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,aAAa,CACjB,QAAkB,EAClB,UAAoB,EACpB,KAAY;QAEZ,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,4BAA4B;QAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,GAAG,GAAG,mEACR,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CACnC,uBACE,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CACrC,GAAG,CAAC;QAEJ,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAE3B,gCAAgC;QAChC,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;YAC/C,GAAG,IAAI,gBAAgB,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,IAAA,wBAAQ,EAAC,KAAY,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3H,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,MAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAA6D,CAAC;QAE7F,qDAAqD;QACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA+B,CAAC;QAEtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACrC,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;YAE9C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACtC,CAAC;YAED,kCAAkC;YAClC,MAAM,UAAU,GAAG,IAAA,iCAAiB,EAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjD,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,gBAAgB,CACtB,QAAyB,EACzB,OAAsB;QAEtB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAC9C,MAAM,MAAM,GAAwB,EAAE,CAAC;QAEvC,4BAA4B;QAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,+CAA+C;QAE1E,sBAAsB;QACtB,IAAI,YAAY,GAAG,MAAM,UAAU,gBAAgB,CAAC;QAEpD,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,YAAY,IAAI,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,yEAAyE;YACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,YAAY,IAAI,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC;gBACjD,YAAY,IAAI,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACzD,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,UAAU,GAAG,WAAW,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,UAAU,IAAI,iBAAiB,CAAC,UAAU,UAAU,OAAO,CAAC,IAAI,UAAU,EAAE,CAAC;YAC7E,0CAA0C;YAC1C,UAAU,IAAI,oBAAoB,CAAC,QAAQ,CAAC;QAC9C,CAAC;QAED,qBAAqB;QACrB,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;YAEtB,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACxE,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,GAAG,GAAG,UAAU,YAAY,SAAS,UAAU,EAAE,CAAC;QAEtD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,GAAG,IAAI,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,CAAC;QAED,mBAAmB;QACnB,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,GAAG,IAAI,UAAU,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBACpB,GAAG,IAAI,WAAW,CAAC;YACrB,CAAC;YACD,GAAG,IAAI,WAAW,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,uBAAuB,CAC7B,OAAqB,EACrB,KAAa,EACb,MAA2B;QAE3B,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC;;;;;;WAMG;QACH,MAAM,gBAAgB,GAAG,CAAC,KAAoB,EAAE,QAAiB,EAAE,QAAgB,EAAmB,EAAE;YACtG,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;gBACrD,uCAAuC;gBACvC,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAA,+BAAe,EAAC,KAAY,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAQ,EAAC,KAAY,CAAC,CAAC;YAC3E,CAAC;YAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,IAAI,QAAQ,EAAE,CAAC;oBACb,4FAA4F;oBAC5F,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBAC5F,MAAM,GAAG,GAAG,gBAAW,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,gBAAW,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC,CAAC;wBAClH,OAAO,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;oBAC9B,CAAC;oBACD,sCAAsC;oBACtC,MAAM,OAAO,GAAG,IAAI,mBAAG,GAAG,IAAA,wBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;oBAC5C,oDAAoD;oBACpD,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;wBAC9C,OAAO,OAAO,GAAG,mBAAG,GAAG,QAAQ,CAAC;oBAClC,CAAC;oBACD,+BAA+B;oBAC/B,OAAO,OAAO,CAAC;gBACjB,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,IAAA,uCAAuB,EAAC,KAAK,CAAC,EAAE,CAAC;oBACnC,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,IAAI,KAAK,GAAG,CAAC;YACtB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,CACnB,MAAc,EACd,KAA4B,EAC5B,WAAoB,KAAK,EACzB,EAAE;YACF,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,MAAM,UAAU,GAAG,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC;YAExC,IAAI,IAAA,cAAM,EAAC,KAAK,CAAC,EAAE,CAAC;gBAClB,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,MAAM,CAAC,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAA,+BAAe,EAAC,KAAY,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAQ,EAAC,KAAY,CAAC,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,KAAsB,CAAC;gBAEnC,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,MAAM,CAAC,CAAC;oBACrC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,OAAO,CAAC,CAAC;oBACtC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,MAAM,CAAC,CAAC;oBACrC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,OAAO,CAAC,CAAC;oBACtC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,MAAM,CAAC,CAAC;oBACrC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,OAAO,CAAC,CAAC;oBACtC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChD,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvD,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,QAAQ,YAAY,GAAG,CAAC,CAAC;oBACtD,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzE,CAAC;gBACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtD,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC1D,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,YAAY,YAAY,GAAG,CAAC,CAAC;oBAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC/E,CAAC;gBACD,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;oBAClC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,OAAO,CAAC,CAAC;oBACtC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,MAAM,CAAC,CAAC;oBACrC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC;gBAC1C,CAAC;gBACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBAChC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,SAAS,CAAC,CAAC;oBACxC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;gBACnC,CAAC;gBACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBAChC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,SAAS,CAAC,CAAC;oBACxC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;gBACpC,CAAC;gBACD,IAAI,QAAQ,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;oBACjD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;oBAClD,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC;oBACnC,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC;oBAClC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,QAAQ,CAAC,CAAC;gBAC7C,CAAC;gBACD,IAAI,QAAQ,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/C,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;oBAC/D,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;gBACtC,CAAC;gBACD,IAAI,QAAQ,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/C,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;oBAC/D,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;gBACvC,CAAC;gBACD,IAAI,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5C,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;oBAC/D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBACvE,CAAC;gBACD,IAAI,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5C,UAAU,CAAC,IAAI,CAAC,SAAS,UAAU,UAAU,CAAC,CAAC;oBAC/C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACpF,CAAC;gBACD,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;oBACzB,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,UAAU,CAAC,CAAC;gBAC3C,CAAC;gBACD,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,cAAc,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACrC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7C,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE7C,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,+CAA+C;IAC/C,mBAAmB;IACnB,+CAA+C;IAE/C,KAAK,CAAC,GAAG,CAAC,KAAY;QACpB,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAEnC,MAAM,IAAI,CAAC,EAAG,CAAC,MAAM,CAAC,eAAM,CAAC;aAC1B,MAAM,CAAC,GAAG,CAAC;aACX,kBAAkB,CAAC;YAClB,MAAM,EAAE,CAAC,eAAM,CAAC,KAAK,EAAE,eAAM,CAAC,OAAO,EAAE,eAAM,CAAC,SAAS,EAAE,eAAM,CAAC,MAAM,CAAC;YACvE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;SAC5B,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAkB;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpD,mCAAmC;QACnC,IAAI,CAAC,MAAO,CAAC,WAAW,CAAC,GAAG,EAAE;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,EAAG,CAAC,MAAM,CAAC,eAAM,CAAC;qBACpB,MAAM,CAAC,GAAG,CAAC;qBACX,kBAAkB,CAAC;oBAClB,MAAM,EAAE,CAAC,eAAM,CAAC,KAAK,EAAE,eAAM,CAAC,OAAO,EAAE,eAAM,CAAC,SAAS,EAAE,eAAM,CAAC,MAAM,CAAC;oBACvE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;iBAC5B,CAAC;qBACD,GAAG,EAAE,CAAC;YACX,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAqB,EAAE,SAAmB;QAC9D,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE7C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAG,CAAC,MAAM,CAAC,eAAM,CAAC;iBACzC,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YAC/B,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAG,CAAC,MAAM,CAAC,eAAM,CAAC;aACzC,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;aAC3B,KAAK,CAAC,IAAA,iBAAG,EAAC,GAAG,UAAU,CAAC,CAAC,CAAC;QAE7B,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,+CAA+C;IAC/C,oBAAoB;IACpB,+CAA+C;IAE/C,KAAK,CAAC,GAAG,CAAC,OAAqB;QAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEjD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,0BAA0B;YAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAG,CAAC,MAAM,CAAC,eAAM,CAAC,CAAC;YAC7C,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAG,CAAC,MAAM,CAAC,eAAM,CAAC,CAAC,KAAK,CAAC,IAAA,iBAAG,EAAC,GAAG,UAAU,CAAC,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAkB;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnC,IAAI,CAAC,MAAO,CAAC,WAAW,CAAC,GAAG,EAAE;YAC5B,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,IAAA,wBAAQ,EAAC,KAAK,CAAC,KAAY,CAAC,CAAC;gBACvC,MAAM,CAAC,GAAG,IAAA,wBAAQ,EAAC,KAAK,CAAC,OAAc,CAAC,CAAC;gBACzC,MAAM,CAAC,GAAG,IAAA,wBAAQ,EAAC,KAAK,CAAC,SAAgB,CAAC,CAAC;gBAC3C,MAAM,CAAC,GAAG,IAAA,+BAAe,EAAC,KAAK,CAAC,MAAa,CAAC,CAAC;gBAE/C,IAAI,CAAC,EAAG,CAAC,MAAM,CAAC,eAAM,CAAC;qBACpB,KAAK,CACJ,IAAA,iBAAG,EACD,IAAA,gBAAE,EAAC,eAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EACnB,IAAA,gBAAE,EAAC,eAAM,CAAC,OAAO,EAAE,CAAC,CAAC,EACrB,IAAA,gBAAE,EAAC,eAAM,CAAC,SAAS,EAAE,CAAC,CAAC,EACvB,IAAA,gBAAE,EAAC,eAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CACrB,CACF;qBACA,GAAG,EAAE,CAAC;YACX,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAED,+CAA+C;IAC/C,aAAa;IACb,+CAA+C;IAE/C,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,EAAG;aAC/B,MAAM,CAAC,EAAE,KAAK,EAAE,IAAA,iBAAG,EAAQ,UAAU,EAAE,CAAC;aACxC,IAAI,CAAC,eAAM,CAAC,CAAC;QAEhB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,EAAG;aAChC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAA,iBAAG,EAAQ,UAAU,EAAE,CAAC;aACxC,IAAI,CAAC,eAAM,CAAC;aACZ,KAAK,CAAC,IAAA,iBAAG,EAAA,GAAG,eAAM,CAAC,MAAM,cAAc,CAAC,CAAC;QAE5C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,EAAG;aAC/B,MAAM,CAAC,EAAE,KAAK,EAAE,IAAA,iBAAG,EAAQ,kBAAkB,eAAM,CAAC,KAAK,GAAG,EAAE,CAAC;aAC/D,IAAI,CAAC,eAAM,CAAC,CAAC;QAEhB,OAAO;YACL,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;YACtC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;YACxC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;SACvC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,EAAG,CAAC,MAAM,CAAC,eAAM,CAAC,CAAC;IAChC,CAAC;IAED,+CAA+C;IAC/C,kBAAkB;IAClB,+CAA+C;IAEvC,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,OAAqB;QAC3C,MAAM,UAAU,GAAU,EAAE,CAAC;QAE7B;;;;;;WAMG;QACH,MAAM,gBAAgB,GAAG,CAAC,KAAoB,EAAE,QAAiB,EAAE,QAAgB,EAAO,EAAE;YAC1F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;gBACrD,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAA,+BAAe,EAAC,KAAY,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAQ,EAAC,KAAY,CAAC,CAAC;YAC3E,CAAC;YAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,IAAI,QAAQ,EAAE,CAAC;oBACb,4FAA4F;oBAC5F,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBAC5F,MAAM,GAAG,GAAG,gBAAW,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,gBAAW,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC,CAAC;wBAClH,OAAO,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;oBAC9B,CAAC;oBACD,sCAAsC;oBACtC,MAAM,OAAO,GAAG,IAAI,mBAAG,GAAG,IAAA,wBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;oBAC5C,+BAA+B;oBAC/B,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;wBAC9C,OAAO,OAAO,GAAG,mBAAG,GAAG,QAAQ,CAAC;oBAClC,CAAC;oBACD,OAAO,OAAO,CAAC;gBACjB,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,QAAQ,IAAI,CAAC,IAAA,uCAAuB,EAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,OAAO,IAAI,KAAK,GAAG,CAAC;YACtB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,iBAAiB,GAAG,CACxB,MAAoG,EACpG,KAA4B,EAC5B,WAAoB,KAAK,EACzB,EAAE;YACF,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,IAAI,IAAA,cAAM,EAAC,KAAK,CAAC,EAAE,CAAC;gBAClB,mBAAmB;gBACnB,UAAU,CAAC,IAAI,CAAC,IAAA,gBAAE,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAA,+BAAe,EAAC,KAAY,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAQ,EAAC,KAAY,CAAC,CAAC,CAAC,CAAC;YACjG,CAAC;iBAAM,CAAC;gBACN,iBAAiB;gBACjB,MAAM,GAAG,GAAG,KAAsB,CAAC;gBAEnC,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,IAAA,gBAAE,EAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1E,CAAC;gBACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,IAAA,gBAAE,EAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1E,CAAC;gBACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,IAAA,gBAAE,EAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1E,CAAC;gBACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC,IAAA,iBAAG,EAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,IAAA,gBAAE,EAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1E,CAAC;gBACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC,IAAA,iBAAG,EAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChD,MAAM,gBAAgB,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;oBAChF,UAAU,CAAC,IAAI,CAAC,IAAA,qBAAO,EAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;gBACrD,CAAC;gBACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtD,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;oBACtF,UAAU,CAAC,IAAI,CAAC,IAAA,wBAAU,EAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;gBACxD,CAAC;gBACD,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;oBAClC,uDAAuD;oBACvD,UAAU,CAAC,IAAI,CAAC,IAAA,iBAAG,EAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC9C,UAAU,CAAC,IAAI,CAAC,IAAA,gBAAE,EAAC,MAAM,EAAE,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBAChC,UAAU,CAAC,IAAI,CAAC,IAAA,kBAAI,EAAC,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBACrD,CAAC;gBACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBAChC,UAAU,CAAC,IAAI,CAAC,IAAA,kBAAI,EAAC,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;gBACtD,CAAC;gBACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC7B,0CAA0C;oBAC1C,UAAU,CAAC,IAAI,CAAC,IAAA,iBAAG,EAAA,GAAG,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/F,CAAC;gBACD,IAAI,QAAQ,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;oBACjD,MAAM,OAAO,GAAG,iBAAG,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACzD,UAAU,CAAC,IAAI,CAAC,IAAA,iBAAG,EAAA,GAAG,OAAO,OAAO,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;oBAC1D,UAAU,CAAC,IAAI,CAAC,IAAA,iBAAG,EAAA,GAAG,OAAO,MAAM,GAAG,CAAC,cAAc,GAAG,QAAQ,EAAE,CAAC,CAAC;gBACtE,CAAC;gBACD,IAAI,QAAQ,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/C,UAAU,CAAC,IAAI,CAAC,IAAA,iBAAG,EAAA,GAAG,iBAAG,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBACnG,CAAC;gBACD,IAAI,QAAQ,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/C,UAAU,CAAC,IAAI,CAAC,IAAA,iBAAG,EAAA,GAAG,iBAAG,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;gBACpG,CAAC;gBACD,IAAI,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5C,UAAU,CAAC,IAAI,CAAC,IAAA,iBAAG,EAAA,GAAG,iBAAG,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,SAAS,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBACpI,CAAC;gBACD,IAAI,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5C,UAAU,CAAC,IAAI,CACb,GAAG,CAAC,SAAS,KAAK,GAAG;wBACnB,CAAC,CAAC,IAAA,iBAAG,EAAA,SAAS,MAAM,UAAU,MAAM,EAAE;wBACtC,CAAC,CAAC,IAAA,iBAAG,EAAA,SAAS,MAAM,UAAU,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,EAAE,CACtE,CAAC;gBACJ,CAAC;gBACD,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;oBACzB,UAAU,CAAC,IAAI,CAAC,IAAA,oBAAM,EAAC,MAAM,CAAC,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,IAAA,uBAAS,EAAC,MAAM,CAAC,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,iBAAiB,CAAC,eAAM,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/C,iBAAiB,CAAC,eAAM,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,iBAAiB,CAAC,eAAM,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,iBAAiB,CAAC,eAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEvD,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,gBAAgB,CAAC,MAAc;QACrC,OAAO;aACE,MAAM,6BAA6B,MAAM,qBAAqB,MAAM;aACpE,MAAM,8BAA8B,MAAM,qBAAqB,MAAM;aACrE,MAAM,2BAA2B,MAAM,eAAe,MAAM;aAC5D,MAAM,WAAW,mBAAG,kBAAkB,MAAM,cAAc,mBAAG,qBAAqB,MAAM,cAAc,mBAAG,aAAa,mBAAG,qBAAqB,MAAM,cAAc,mBAAG,qBAAqB,MAAM,cAAc,mBAAG,aAAa,mBAAG,aAAa,mBAAG;aACjP,MAAM,WAAW,mBAAG,kBAAkB,MAAM,cAAc,mBAAG,qBAAqB,MAAM,cAAc,mBAAG,aAAa,mBAAG;aACzH,MAAM;QACX,CAAC;IACP,CAAC;IAEO,UAAU,CAAC,KAAY;QAC7B,OAAO;YACL,KAAK,EAAE,IAAA,wBAAQ,EAAC,KAAK,CAAC,KAAY,CAAC;YACnC,OAAO,EAAE,IAAA,wBAAQ,EAAC,KAAK,CAAC,OAAc,CAAC;YACvC,SAAS,EAAE,IAAA,wBAAQ,EAAC,KAAK,CAAC,SAAgB,CAAC;YAC3C,MAAM,EAAE,IAAA,+BAAe,EAAC,KAAK,CAAC,MAAa,CAAC;YAC5C,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;SAC3D,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,GAAa;QAC9B,MAAM,IAAI,GAAG,IAAA,yBAAS,EAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAU,IAAa,CAAC;QACnC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,KAAK,CAAC,MAAM,GAAG,IAAA,2BAAW,EAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA3xBD,4CA2xBC","sourcesContent":["/**\n * SqliteQuintStore - SQLite implementation of QuintStore using Drizzle ORM\n */\n\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { eq, ne, and, gte, gt, lt, lte, like, inArray, notInArray, isNull, isNotNull, sql } from 'drizzle-orm';\nimport type { SQL } from 'drizzle-orm';\nimport { wrap, AsyncIterator } from 'asynciterator';\nimport { DataFactory } from 'n3';\nimport type { Term, Quad } from '@rdfjs/types';\n\nimport { quints, type QuintRow, type NewQuintRow } from './schema';\nimport {\n quadToRow,\n rowToQuad,\n parseVector,\n termToId,\n serializeObject,\n deserializeObject,\n fpEncode,\n SEP,\n isSerializedObjectValue,\n} from './serialization';\nimport { getSqliteRuntime, type SqliteDatabase } from '../SqliteRuntime';\nimport type {\n Quint,\n QuintPattern,\n QuintStore,\n QuintStoreOptions,\n QueryOptions,\n StoreStats,\n TermMatch,\n TermOperators,\n CompoundPattern,\n CompoundResult,\n OperatorValue,\n} from './types';\nimport { isTerm } from './types';\n\nconst SQLITE_UNBOUNDED_LIMIT = Number.MAX_SAFE_INTEGER;\n\nexport interface SqliteQuintStoreOptions extends QuintStoreOptions {\n /** SQLite database file path, use ':memory:' for in-memory database */\n path: string;\n}\n\nexport class SqliteQuintStore {\n private sqlite: SqliteDatabase | null = null;\n private db: any | null = null;\n private options: SqliteQuintStoreOptions;\n private readonly sqliteRuntime = getSqliteRuntime();\n\n constructor(options: SqliteQuintStoreOptions) {\n // Handle sqlite: prefix\n let path = options.path;\n if (path.startsWith('sqlite:')) {\n path = path.slice(7);\n }\n this.options = { ...options, path };\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n async open(): Promise<void> {\n // Idempotent: if already open, do nothing\n if (this.sqlite) {\n return;\n }\n\n const dbPath = this.options.path;\n \n // Ensure directory exists (unless it's in-memory)\n if (dbPath !== ':memory:') {\n const dir = dirname(dbPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n \n this.sqlite = this.sqliteRuntime.openDatabase(dbPath);\n this.db = this.sqliteRuntime.createDrizzleDatabase(this.sqlite);\n\n // Create table and indexes\n this.sqlite.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 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\n async close(): Promise<void> {\n if (this.sqlite) {\n this.sqlite.close();\n this.sqlite = null;\n this.db = null;\n }\n }\n\n // ============================================\n // Query Operations\n // ============================================\n\n async get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n \n let query = this.db!.select().from(quints);\n \n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n // ORDER BY 支持\n if (options?.order && options.order.length > 0) {\n // 使用 sql 模板构建 ORDER BY\n const orderCol = options.order[0]; // 目前只支持单列排序\n const direction = options.reverse ? 'DESC' : 'ASC';\n query = query.orderBy(sql.raw(`${orderCol} ${direction}`)) as any;\n }\n\n if (options?.limit !== undefined) {\n query = query.limit(options.limit) as any;\n }\n if (options?.offset !== undefined) {\n // SQLite requires LIMIT when using OFFSET\n if (options?.limit === undefined) {\n query = query.limit(SQLITE_UNBOUNDED_LIMIT) as any;\n }\n query = query.offset(options.offset) as any;\n }\n\n const rows = await query;\n return rows.map((row: QuintRow) => this.rowToQuint(row));\n }\n\n match(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null,\n ): AsyncIterator<Quint> {\n const pattern: QuintPattern = {};\n if (subject) pattern.subject = subject;\n if (predicate) pattern.predicate = predicate;\n if (object) pattern.object = object;\n if (graph) pattern.graph = graph;\n\n return wrap(this.get(pattern));\n }\n\n async getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]> {\n return this.get({ graph: { $startsWith: prefix } }, options);\n }\n\n async count(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n let query = this.db!.select({ count: sql<number>`count(*)` }).from(quints);\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n const result = await query;\n return result[0]?.count ?? 0;\n }\n\n /**\n * Compound query - multiple patterns JOINed by a common field\n * This executes a single SQL query with JOINs, letting SQLite optimize the execution plan\n */\n async getCompound(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]> {\n this.ensureOpen();\n\n const { patterns, joinOn, select } = compound;\n \n if (patterns.length === 0) {\n return [];\n }\n\n if (patterns.length === 1) {\n // Single pattern, fall back to regular get\n const quads = await this.get(patterns[0], options);\n return quads.map(q => ({\n joinValue: termToId((q as any)[joinOn]),\n bindings: {},\n quads: [q],\n }));\n }\n\n // Build JOIN SQL\n const { sql: sqlQuery, params } = this.buildCompoundSQL(compound, options);\n \n if (this.options.debug) {\n console.log('[SqliteQuintStore] Compound SQL:', sqlQuery);\n console.log('[SqliteQuintStore] Params:', params);\n }\n\n // Execute raw SQL\n const stmt = this.sqlite!.prepare(sqlQuery);\n const rows = stmt.all(...params) as Record<string, string>[];\n\n // Convert rows to CompoundResult\n return rows.map(row => {\n const bindings: Record<string, string> = {};\n \n // Extract bindings based on select config or default naming\n if (select) {\n for (const s of select) {\n bindings[s.alias] = row[s.alias];\n }\n } else {\n // Default: include all fields from all patterns\n for (const key of Object.keys(row)) {\n if (key !== 'join_value') {\n bindings[key] = row[key];\n }\n }\n }\n\n return {\n joinValue: row.join_value,\n bindings,\n };\n });\n }\n\n /**\n * 批量获取多个 subject 的多个属性\n * \n * 用于优化 OPTIONAL 查询:避免每个 OPTIONAL 变成一次 LEFT JOIN\n * \n * SQL: SELECT subject, predicate, object FROM quints \n * WHERE subject IN (...) AND predicate IN (...)\n */\n async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<Map<string, Map<string, Term[]>>> {\n this.ensureOpen();\n\n if (subjects.length === 0 || predicates.length === 0) {\n return new Map();\n }\n\n // Build SQL with IN clauses\n const params: string[] = [];\n let sql = `SELECT subject, predicate, object FROM quints WHERE subject IN (${\n subjects.map(() => '?').join(', ')\n }) AND predicate IN (${\n predicates.map(() => '?').join(', ')\n })`;\n \n params.push(...subjects);\n params.push(...predicates);\n\n // Add graph filter if specified\n if (graph && graph.termType !== 'DefaultGraph') {\n sql += ` AND graph = ?`;\n params.push(termToId(graph as any));\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes SQL:', sql);\n console.log('[SqliteQuintStore] Params:', params.length, 'subjects:', subjects.length, 'predicates:', predicates.length);\n }\n\n const stmt = this.sqlite!.prepare(sql);\n const rows = stmt.all(...params) as { subject: string; predicate: string; object: string }[];\n\n // Build result map: subject -> predicate -> object[]\n const result = new Map<string, Map<string, Term[]>>();\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 \n if (!predicateMap.has(row.predicate)) {\n predicateMap.set(row.predicate, []);\n }\n \n // Deserialize object back to Term\n const objectTerm = deserializeObject(row.object);\n predicateMap.get(row.predicate)!.push(objectTerm);\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes returned', result.size, 'subjects');\n }\n\n return result;\n }\n\n /**\n * Build SQL for compound query with JOINs\n */\n private buildCompoundSQL(\n compound: CompoundPattern,\n options?: QueryOptions\n ): { sql: string; params: (string | number)[] } {\n const { patterns, joinOn, select } = compound;\n const params: (string | number)[] = [];\n \n // Map joinOn to column name\n const joinColumn = joinOn; // 'subject' | 'predicate' | 'object' | 'graph'\n\n // Build SELECT clause\n let selectClause = `q0.${joinColumn} 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 // Default: select object from each pattern as p0_object, p1_object, etc.\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 // Build FROM clause with JOINs\n let fromClause = 'quints q0';\n for (let i = 1; i < patterns.length; i++) {\n fromClause += ` JOIN quints q${i} ON q0.${joinColumn} = q${i}.${joinColumn}`;\n // Also join on graph to ensure same graph\n fromClause += ` AND q0.graph = q${i}.graph`;\n }\n\n // Build WHERE clause\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 const conditions = this.buildConditionsForAlias(pattern, alias, params);\n whereParts.push(...conditions);\n }\n\n let sql = `SELECT ${selectClause} FROM ${fromClause}`;\n \n if (whereParts.length > 0) {\n sql += ` WHERE ${whereParts.join(' AND ')}`;\n }\n\n // Add LIMIT/OFFSET\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n if (!options?.limit) {\n sql += ` LIMIT -1`;\n }\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n /**\n * Build WHERE conditions for a specific table alias\n */\n private buildConditionsForAlias(\n pattern: QuintPattern,\n alias: string,\n params: (string | number)[]\n ): string[] {\n const conditions: string[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): string | number => {\n if (typeof value === 'object' && 'termType' in value) {\n // It's a Term - use full serialization\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix to compare correctly\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n // $lt and $gte use prefix only\n return fpValue;\n }\n return value;\n }\n \n if (isObject) {\n if (isSerializedObjectValue(value)) {\n return value;\n }\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addCondition = (\n column: string,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n const fullColumn = `${alias}.${column}`;\n\n if (isTerm(match)) {\n conditions.push(`${fullColumn} = ?`);\n params.push(isObject ? serializeObject(match as any) : termToId(match as any));\n } else {\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(`${fullColumn} = ?`);\n params.push(serializeOpValue(ops.$eq, isObject, '$eq'));\n }\n if (ops.$ne !== undefined) {\n conditions.push(`${fullColumn} != ?`);\n params.push(serializeOpValue(ops.$ne, isObject, '$ne'));\n }\n if (ops.$gt !== undefined) {\n conditions.push(`${fullColumn} > ?`);\n params.push(serializeOpValue(ops.$gt, isObject, '$gt'));\n }\n if (ops.$gte !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n params.push(serializeOpValue(ops.$gte, isObject, '$gte'));\n }\n if (ops.$lt !== undefined) {\n conditions.push(`${fullColumn} < ?`);\n params.push(serializeOpValue(ops.$lt, isObject, '$lt'));\n }\n if (ops.$lte !== undefined) {\n conditions.push(`${fullColumn} <= ?`);\n params.push(serializeOpValue(ops.$lte, isObject, '$lte'));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const placeholders = ops.$in.map(() => '?').join(', ');\n conditions.push(`${fullColumn} IN (${placeholders})`);\n params.push(...ops.$in.map(v => serializeOpValue(v, isObject, '$in')));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const placeholders = ops.$notIn.map(() => '?').join(', ');\n conditions.push(`${fullColumn} NOT IN (${placeholders})`);\n params.push(...ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn')));\n }\n if (ops.$startsWith !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n conditions.push(`${fullColumn} < ?`);\n params.push(ops.$startsWith);\n params.push(ops.$startsWith + '\\uffff');\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$endsWith}`);\n }\n if (ops.$contains !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$contains}%`);\n }\n if (isObject && ops.$strStartsWith !== undefined) {\n const lexical = this.objectLexicalSql(fullColumn);\n conditions.push(`${lexical} >= ?`);\n conditions.push(`${lexical} < ?`);\n params.push(ops.$strStartsWith);\n params.push(ops.$strStartsWith + '\\uffff');\n }\n if (isObject && ops.$strEndsWith !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} LIKE ?`);\n params.push(`%${ops.$strEndsWith}`);\n }\n if (isObject && ops.$strContains !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} LIKE ?`);\n params.push(`%${ops.$strContains}%`);\n }\n if (isObject && ops.$strRegex !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} GLOB ?`);\n params.push(ops.$strRegex.replace(/\\.\\*/g, '*').replace(/\\./g, '?'));\n }\n if (isObject && ops.$language !== undefined) {\n conditions.push(`lower(${fullColumn}) LIKE ?`);\n params.push(ops.$language === '*' ? '%\"@%' : `%\"@${ops.$language.toLowerCase()}`);\n }\n if (ops.$isNull === true) {\n conditions.push(`${fullColumn} IS NULL`);\n }\n if (ops.$isNull === false) {\n conditions.push(`${fullColumn} IS NOT NULL`);\n }\n }\n };\n\n addCondition('graph', pattern.graph);\n addCondition('subject', pattern.subject);\n addCondition('predicate', pattern.predicate);\n addCondition('object', pattern.object, true);\n\n return conditions;\n }\n\n // ============================================\n // Write Operations\n // ============================================\n\n async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToRow(quint);\n\n await this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n });\n }\n\n async multiPut(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const rows = quintList.map(q => this.quintToRow(q));\n\n // Use transaction for batch insert\n this.sqlite!.transaction(() => {\n for (const row of rows) {\n this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n })\n .run();\n }\n })();\n }\n\n async updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n const vectorJson = JSON.stringify(embedding);\n\n if (conditions.length === 0) {\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson });\n return result.changes;\n }\n\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson })\n .where(and(...conditions));\n\n return result.changes;\n }\n\n // ============================================\n // Delete Operations\n // ============================================\n\n async del(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n if (conditions.length === 0) {\n // Delete all - dangerous!\n const result = await this.db!.delete(quints);\n return result.changes;\n }\n\n const result = await this.db!.delete(quints).where(and(...conditions));\n return result.changes;\n }\n\n async multiDel(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n this.sqlite!.transaction(() => {\n for (const quint of quintList) {\n const g = termToId(quint.graph as any);\n const s = termToId(quint.subject as any);\n const p = termToId(quint.predicate as any);\n const o = serializeObject(quint.object as any);\n\n this.db!.delete(quints)\n .where(\n and(\n eq(quints.graph, g),\n eq(quints.subject, s),\n eq(quints.predicate, p),\n eq(quints.object, o),\n ),\n )\n .run();\n }\n })();\n }\n\n // ============================================\n // Management\n // ============================================\n\n async stats(): Promise<StoreStats> {\n this.ensureOpen();\n\n const totalResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints);\n\n const vectorResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints)\n .where(sql`${quints.vector} IS NOT NULL`);\n\n const graphResult = await this.db!\n .select({ count: sql<number>`COUNT(DISTINCT ${quints.graph})` })\n .from(quints);\n\n return {\n totalCount: totalResult[0]?.count ?? 0,\n vectorCount: vectorResult[0]?.count ?? 0,\n graphCount: graphResult[0]?.count ?? 0,\n };\n }\n\n async clear(): Promise<void> {\n this.ensureOpen();\n await this.db!.delete(quints);\n }\n\n // ============================================\n // Private Helpers\n // ============================================\n\n private ensureOpen(): void {\n if (!this.db) {\n throw new Error('Store not open. Call open() first.');\n }\n }\n\n private buildConditions(pattern: QuintPattern): SQL[] {\n const conditions: SQL[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): any => {\n if (typeof value === 'object' && 'termType' in value) {\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n return fpValue;\n }\n return value;\n }\n \n if (isObject && !isSerializedObjectValue(value)) {\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addTermConditions = (\n column: typeof quints.graph | typeof quints.subject | typeof quints.predicate | typeof quints.object,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n if (isTerm(match)) {\n // Exact Term match\n conditions.push(eq(column, isObject ? serializeObject(match as any) : termToId(match as any)));\n } else {\n // Operator match\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(eq(column, serializeOpValue(ops.$eq, isObject, '$eq')));\n }\n if (ops.$ne !== undefined) {\n conditions.push(ne(column, serializeOpValue(ops.$ne, isObject, '$ne')));\n }\n if (ops.$gt !== undefined) {\n conditions.push(gt(column, serializeOpValue(ops.$gt, isObject, '$gt')));\n }\n if (ops.$gte !== undefined) {\n conditions.push(gte(column, serializeOpValue(ops.$gte, isObject, '$gte')));\n }\n if (ops.$lt !== undefined) {\n conditions.push(lt(column, serializeOpValue(ops.$lt, isObject, '$lt')));\n }\n if (ops.$lte !== undefined) {\n conditions.push(lte(column, serializeOpValue(ops.$lte, isObject, '$lte')));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const serializedValues = ops.$in.map(v => serializeOpValue(v, isObject, '$in'));\n conditions.push(inArray(column, serializedValues));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const serializedValues = ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn'));\n conditions.push(notInArray(column, serializedValues));\n }\n if (ops.$startsWith !== undefined) {\n // Use range query for prefix matching (index-friendly)\n conditions.push(gte(column, ops.$startsWith));\n conditions.push(lt(column, ops.$startsWith + '\\uffff'));\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(like(column, `%${ops.$endsWith}`));\n }\n if (ops.$contains !== undefined) {\n conditions.push(like(column, `%${ops.$contains}%`));\n }\n if (ops.$regex !== undefined) {\n // SQLite uses GLOB as regex approximation\n conditions.push(sql`${column} GLOB ${ops.$regex.replace(/\\.\\*/g, '*').replace(/\\./g, '?')}`);\n }\n if (isObject && ops.$strStartsWith !== undefined) {\n const lexical = sql.raw(this.objectLexicalSql('object'));\n conditions.push(sql`${lexical} >= ${ops.$strStartsWith}`);\n conditions.push(sql`${lexical} < ${ops.$strStartsWith + '\\uffff'}`);\n }\n if (isObject && ops.$strEndsWith !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} LIKE ${`%${ops.$strEndsWith}`}`);\n }\n if (isObject && ops.$strContains !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} LIKE ${`%${ops.$strContains}%`}`);\n }\n if (isObject && ops.$strRegex !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} GLOB ${ops.$strRegex.replace(/\\.\\*/g, '*').replace(/\\./g, '?')}`);\n }\n if (isObject && ops.$language !== undefined) {\n conditions.push(\n ops.$language === '*'\n ? sql`lower(${column}) LIKE ${`%\"@%`}`\n : sql`lower(${column}) LIKE ${`%\"@${ops.$language.toLowerCase()}`}`,\n );\n }\n if (ops.$isNull === true) {\n conditions.push(isNull(column));\n }\n if (ops.$isNull === false) {\n conditions.push(isNotNull(column));\n }\n }\n };\n\n addTermConditions(quints.graph, pattern.graph);\n addTermConditions(quints.subject, pattern.subject);\n addTermConditions(quints.predicate, pattern.predicate);\n addTermConditions(quints.object, pattern.object, true);\n\n return conditions;\n }\n\n private objectLexicalSql(column: string): string {\n return `CASE\n WHEN ${column} LIKE '\"%\"@%' THEN substr(${column}, 2, instr(substr(${column}, 2), '\"') - 1)\n WHEN ${column} LIKE '\"%\"^^%' THEN substr(${column}, 2, instr(substr(${column}, 2), '\"') - 1)\n WHEN ${column} LIKE '\"%\"' THEN substr(${column}, 2, length(${column}) - 2)\n WHEN ${column} LIKE 'N${SEP}%' THEN substr(${column}, length('N${SEP}') + instr(substr(${column}, length('N${SEP}') + 1), '${SEP}') + instr(substr(${column}, length('N${SEP}') + instr(substr(${column}, length('N${SEP}') + 1), '${SEP}') + 1), '${SEP}') + 1)\n WHEN ${column} LIKE 'D${SEP}%' THEN substr(${column}, length('D${SEP}') + instr(substr(${column}, length('D${SEP}') + 1), '${SEP}') + 1)\n ELSE ${column}\n END`;\n }\n\n private quintToRow(quint: Quint): NewQuintRow {\n return {\n graph: termToId(quint.graph as any),\n subject: termToId(quint.subject as any),\n predicate: termToId(quint.predicate as any),\n object: serializeObject(quint.object as any),\n vector: quint.vector ? JSON.stringify(quint.vector) : null,\n };\n }\n\n private rowToQuint(row: QuintRow): Quint {\n const quad = rowToQuad(row);\n const quint: Quint = quad as Quint;\n if (row.vector) {\n quint.vector = parseVector(row.vector);\n }\n return quint;\n }\n}\n"]}
|
|
@@ -185,6 +185,10 @@
|
|
|
185
185
|
"@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_buildConditions",
|
|
186
186
|
"memberFieldName": "buildConditions"
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
"@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_objectLexicalSql",
|
|
190
|
+
"memberFieldName": "objectLexicalSql"
|
|
191
|
+
},
|
|
188
192
|
{
|
|
189
193
|
"@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_quintToRow",
|
|
190
194
|
"memberFieldName": "quintToRow"
|
|
@@ -43,6 +43,12 @@ export interface TermOperators {
|
|
|
43
43
|
$endsWith?: string;
|
|
44
44
|
$contains?: string;
|
|
45
45
|
$regex?: string;
|
|
46
|
+
/** RDF term lexical string operators for STR(?object) pushdown. */
|
|
47
|
+
$strStartsWith?: string;
|
|
48
|
+
$strEndsWith?: string;
|
|
49
|
+
$strContains?: string;
|
|
50
|
+
$strRegex?: string;
|
|
51
|
+
$language?: string;
|
|
46
52
|
$isNull?: boolean;
|
|
47
53
|
}
|
|
48
54
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/storage/quint/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/storage/quint/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AA0DH,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 /** RDF term lexical string operators for STR(?object) pushdown. */\n $strStartsWith?: string;\n $strEndsWith?: string;\n $strContains?: string;\n $strRegex?: string;\n $language?: 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"]}
|
|
@@ -172,23 +172,25 @@ class FilterPushdownExtractor {
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
// STRSTARTS, STRENDS, CONTAINS
|
|
175
|
-
//
|
|
176
|
-
//
|
|
177
|
-
//
|
|
178
|
-
// - STRENDS('e') -> $endsWith: 'e"' (add trailing quote)
|
|
179
|
-
// - CONTAINS('x') -> $contains: 'x' (quotes don't affect middle content)
|
|
175
|
+
// Subject/predicate/graph columns store raw IRI strings. Object string
|
|
176
|
+
// operators are explicit lexical STR(?object) pushdowns so the store can
|
|
177
|
+
// route text literals to object_text and IRIs/blank nodes to object_key.
|
|
180
178
|
if (['strstarts', 'strends', 'contains'].includes(op) && expr.args.length === 2) {
|
|
181
179
|
const varName = (0, AlgebraUtils_1.extractStrVariable)(expr.args[0]);
|
|
182
180
|
const value = (0, AlgebraUtils_1.extractLiteralValue)(expr.args[1]);
|
|
183
181
|
if (varName && value && (0, AlgebraUtils_1.isVariableInPattern)(varName, pattern)) {
|
|
182
|
+
const position = (0, AlgebraUtils_1.getVariablePosition)(varName, pattern);
|
|
183
|
+
const startsWithOp = position === 'object' ? '$strStartsWith' : '$startsWith';
|
|
184
|
+
const endsWithOp = position === 'object' ? '$strEndsWith' : '$endsWith';
|
|
185
|
+
const containsOp = position === 'object' ? '$strContains' : '$contains';
|
|
184
186
|
if (op === 'strstarts') {
|
|
185
|
-
filters[varName] = {
|
|
187
|
+
filters[varName] = { [startsWithOp]: value };
|
|
186
188
|
}
|
|
187
189
|
else if (op === 'strends') {
|
|
188
|
-
filters[varName] = {
|
|
190
|
+
filters[varName] = { [endsWithOp]: value };
|
|
189
191
|
}
|
|
190
192
|
else {
|
|
191
|
-
filters[varName] = {
|
|
193
|
+
filters[varName] = { [containsOp]: value };
|
|
192
194
|
}
|
|
193
195
|
return filters;
|
|
194
196
|
}
|
|
@@ -198,7 +200,10 @@ class FilterPushdownExtractor {
|
|
|
198
200
|
const varName = (0, AlgebraUtils_1.extractStrVariable)(expr.args[0]);
|
|
199
201
|
const regexPattern = (0, AlgebraUtils_1.extractLiteralValue)(expr.args[1]);
|
|
200
202
|
if (varName && regexPattern && (0, AlgebraUtils_1.isVariableInPattern)(varName, pattern)) {
|
|
201
|
-
|
|
203
|
+
const position = (0, AlgebraUtils_1.getVariablePosition)(varName, pattern);
|
|
204
|
+
filters[varName] = position === 'object'
|
|
205
|
+
? { $strRegex: regexPattern }
|
|
206
|
+
: { $regex: regexPattern };
|
|
202
207
|
return filters;
|
|
203
208
|
}
|
|
204
209
|
}
|
|
@@ -293,7 +298,6 @@ class FilterPushdownExtractor {
|
|
|
293
298
|
}
|
|
294
299
|
}
|
|
295
300
|
// LANGMATCHES(LANG(?x), "en") - language tagged literals end with @lang"
|
|
296
|
-
// Serialization format: "value"@en
|
|
297
301
|
if (op === 'langmatches' && expr.args.length === 2) {
|
|
298
302
|
const langExpr = expr.args[0];
|
|
299
303
|
const langPattern = expr.args[1];
|
|
@@ -303,6 +307,14 @@ class FilterPushdownExtractor {
|
|
|
303
307
|
langExpr.args.length === 1) {
|
|
304
308
|
const varName = (0, AlgebraUtils_1.extractVariable)(langExpr.args[0]);
|
|
305
309
|
if (varName && (0, AlgebraUtils_1.isVariableInPattern)(varName, pattern)) {
|
|
310
|
+
const position = (0, AlgebraUtils_1.getVariablePosition)(varName, pattern);
|
|
311
|
+
if (position === 'object') {
|
|
312
|
+
if (langPattern.termType === 'Literal') {
|
|
313
|
+
const lang = langPattern.value.toLowerCase();
|
|
314
|
+
filters[varName] = { $language: lang };
|
|
315
|
+
return filters;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
306
318
|
// Get the language pattern
|
|
307
319
|
if (langPattern.termType === 'Literal') {
|
|
308
320
|
const lang = langPattern.value.toLowerCase();
|
|
@@ -349,7 +361,7 @@ class FilterPushdownExtractor {
|
|
|
349
361
|
const rightTerm = (0, AlgebraUtils_1.extractTerm)(right);
|
|
350
362
|
if (leftVarForTerm && rightTerm && (op === '=' || op === '!=')) {
|
|
351
363
|
const filterOp = op === '=' ? '$eq' : '$ne';
|
|
352
|
-
return { varName: leftVarForTerm, op: filterOp, value:
|
|
364
|
+
return { varName: leftVarForTerm, op: filterOp, value: rightTerm };
|
|
353
365
|
}
|
|
354
366
|
return null;
|
|
355
367
|
}
|