@undefineds.co/xpod 0.3.18 → 0.3.23

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.
Files changed (115) hide show
  1. package/config/bun.json +57 -11
  2. package/config/cloud.json +14 -12
  3. package/config/local.json +16 -14
  4. package/config/xpod.json +47 -9
  5. package/dist/api/matrix/PodMatrixStore.d.ts +4 -7
  6. package/dist/api/matrix/PodMatrixStore.js +116 -148
  7. package/dist/api/matrix/PodMatrixStore.js.map +1 -1
  8. package/dist/api/matrix/types.d.ts +2 -0
  9. package/dist/api/matrix/types.js.map +1 -1
  10. package/dist/api/runs/PiAgentRuntimeDriver.d.ts +1 -0
  11. package/dist/api/runs/PiAgentRuntimeDriver.js +4 -1
  12. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  13. package/dist/components/components.jsonld +3 -0
  14. package/dist/components/context.jsonld +71 -32
  15. package/dist/http/SubgraphSparqlHttpHandler.d.ts +1 -0
  16. package/dist/http/SubgraphSparqlHttpHandler.js +27 -4
  17. package/dist/http/SubgraphSparqlHttpHandler.js.map +1 -1
  18. package/dist/http/SubgraphSparqlHttpHandler.jsonld +4 -0
  19. package/dist/http/vector/VectorHttpHandler.d.ts +5 -1
  20. package/dist/http/vector/VectorHttpHandler.js +5 -5
  21. package/dist/http/vector/VectorHttpHandler.js.map +1 -1
  22. package/dist/http/vector/VectorHttpHandler.jsonld +40 -28
  23. package/dist/index.d.ts +5 -2
  24. package/dist/index.js +9 -4
  25. package/dist/index.js.map +1 -1
  26. package/dist/runtime/Proxy.d.ts +3 -0
  27. package/dist/runtime/Proxy.js +31 -7
  28. package/dist/runtime/Proxy.js.map +1 -1
  29. package/dist/solidfs/LocalSolidFS.js +31 -124
  30. package/dist/solidfs/LocalSolidFS.js.map +1 -1
  31. package/dist/solidfs/SolidFsPathUtils.d.ts +13 -0
  32. package/dist/solidfs/SolidFsPathUtils.js +114 -0
  33. package/dist/solidfs/SolidFsPathUtils.js.map +1 -0
  34. package/dist/solidfs/SolidFsSyncJournal.d.ts +117 -0
  35. package/dist/solidfs/SolidFsSyncJournal.js +553 -0
  36. package/dist/solidfs/SolidFsSyncJournal.js.map +1 -0
  37. package/dist/solidfs/index.d.ts +1 -0
  38. package/dist/solidfs/index.js +1 -0
  39. package/dist/solidfs/index.js.map +1 -1
  40. package/dist/solidfs/types.d.ts +1 -0
  41. package/dist/solidfs/types.js.map +1 -1
  42. package/dist/storage/SparqlUpdateResourceStore.js +94 -33
  43. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  44. package/dist/storage/accessors/MixDataAccessor.d.ts +22 -5
  45. package/dist/storage/accessors/MixDataAccessor.js +376 -61
  46. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  47. package/dist/storage/accessors/MixDataAccessor.jsonld +73 -5
  48. package/dist/storage/accessors/QuadstoreSparqlDataAccessor.js +32 -10
  49. package/dist/storage/accessors/QuadstoreSparqlDataAccessor.js.map +1 -1
  50. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +28 -6
  51. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -1
  52. package/dist/storage/accessors/SolidRdfDataAccessor.d.ts +45 -0
  53. package/dist/storage/accessors/SolidRdfDataAccessor.js +277 -0
  54. package/dist/storage/accessors/SolidRdfDataAccessor.js.map +1 -0
  55. package/dist/storage/accessors/SolidRdfDataAccessor.jsonld +161 -0
  56. package/dist/storage/rdf/Rdf3xIndex.d.ts +122 -0
  57. package/dist/storage/rdf/Rdf3xIndex.js +2695 -0
  58. package/dist/storage/rdf/Rdf3xIndex.js.map +1 -0
  59. package/dist/storage/rdf/Rdf3xIndex.jsonld +528 -0
  60. package/dist/storage/rdf/Rdf3xSchema.d.ts +20 -0
  61. package/dist/storage/rdf/Rdf3xSchema.js +65 -0
  62. package/dist/storage/rdf/Rdf3xSchema.js.map +1 -0
  63. package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +10 -4
  64. package/dist/storage/rdf/RdfLocalQueryEngine.js +607 -127
  65. package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -1
  66. package/dist/storage/rdf/RdfQuadIndex.d.ts +12 -1
  67. package/dist/storage/rdf/RdfQuadIndex.js +152 -22
  68. package/dist/storage/rdf/RdfQuadIndex.js.map +1 -1
  69. package/dist/storage/rdf/RdfQuadIndex.jsonld +36 -4
  70. package/dist/storage/rdf/RdfSparqlAdapter.d.ts +20 -2
  71. package/dist/storage/rdf/RdfSparqlAdapter.js +364 -40
  72. package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -1
  73. package/dist/storage/rdf/RdfSparqlAdapter.jsonld +60 -0
  74. package/dist/storage/rdf/RdfTermDictionary.d.ts +8 -0
  75. package/dist/storage/rdf/RdfTermDictionary.js +141 -70
  76. package/dist/storage/rdf/RdfTermDictionary.js.map +1 -1
  77. package/dist/storage/rdf/RdfTermDictionary.jsonld +24 -0
  78. package/dist/storage/rdf/RdfTextIndex.js +10 -3
  79. package/dist/storage/rdf/RdfTextIndex.js.map +1 -1
  80. package/dist/storage/rdf/SolidRdfEngine.d.ts +15 -6
  81. package/dist/storage/rdf/SolidRdfEngine.js +218 -25
  82. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -1
  83. package/dist/storage/rdf/SolidRdfEngine.jsonld +70 -7
  84. package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +11 -7
  85. package/dist/storage/rdf/SolidRdfSparqlEngine.js +60 -47
  86. package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -1
  87. package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +9 -5
  88. package/dist/storage/rdf/index.d.ts +2 -2
  89. package/dist/storage/rdf/index.js +3 -3
  90. package/dist/storage/rdf/index.js.map +1 -1
  91. package/dist/storage/rdf/models-benchmark.d.ts +12 -1
  92. package/dist/storage/rdf/models-benchmark.js +549 -32
  93. package/dist/storage/rdf/models-benchmark.js.map +1 -1
  94. package/dist/storage/rdf/types.d.ts +81 -7
  95. package/dist/storage/rdf/types.js.map +1 -1
  96. package/dist/storage/sparql/CompatibilitySparqlEngine.d.ts +36 -0
  97. package/dist/storage/sparql/CompatibilitySparqlEngine.js +96 -0
  98. package/dist/storage/sparql/CompatibilitySparqlEngine.js.map +1 -0
  99. package/dist/storage/sparql/CompatibilitySparqlEngine.jsonld +123 -0
  100. package/dist/storage/sparql/CompatibilitySparqlEngineImpl.d.ts +35 -0
  101. package/dist/storage/sparql/CompatibilitySparqlEngineImpl.js +112 -0
  102. package/dist/storage/sparql/CompatibilitySparqlEngineImpl.js.map +1 -0
  103. package/dist/storage/sparql/SubgraphQueryEngine.d.ts +1 -36
  104. package/dist/storage/sparql/SubgraphQueryEngine.js +2 -115
  105. package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
  106. package/dist/storage/sparql/SubgraphQueryEngine.jsonld +1 -124
  107. package/dist/terminal/AclPermissionService.d.ts +2 -1
  108. package/dist/terminal/AclPermissionService.js +26 -3
  109. package/dist/terminal/AclPermissionService.js.map +1 -1
  110. package/dist/terminal/TerminalSessionManager.js +25 -3
  111. package/dist/terminal/TerminalSessionManager.js.map +1 -1
  112. package/package.json +1 -1
  113. package/dist/storage/rdf/Rdf3xTripleIndex.d.ts +0 -55
  114. package/dist/storage/rdf/Rdf3xTripleIndex.js +0 -1235
  115. package/dist/storage/rdf/Rdf3xTripleIndex.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RdfQuadIndex.js","sourceRoot":"","sources":["../../../src/storage/rdf/RdfQuadIndex.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { DataFactory } from 'n3';\nimport type { Quad, Term } from '@rdfjs/types';\nimport { createSqliteRuntime, type SqliteDatabase } from '../SqliteRuntime';\nimport type { QueryOptions, QuintPattern, TermOperators } from '../quint/types';\nimport { isTerm } from '../quint/types';\nimport { RdfTermDictionary } from './RdfTermDictionary';\nimport type {\n RdfCardinalityEstimate,\n RdfCardinalityDistributions,\n RdfCardinalityTerm,\n RdfIndexStats,\n RdfLiteralDatatypeDistribution,\n RdfIndexMetrics,\n RdfIndexPutOptions,\n RdfIndexSpaceObject,\n RdfQuadJoinAggregateOptions,\n RdfQuadJoinCountOptions,\n RdfQuadJoinGroupAggregateHaving,\n RdfQuadJoinGroupAggregateOptions,\n RdfQuadJoinOptions,\n RdfQuadJoinPattern,\n RdfQuadJoinScanResult,\n RdfQueryFilterOperator,\n RdfQuadTupleConstraintSource,\n RdfQuadIndexOptions,\n RdfQuadIndexScanResult,\n RdfQuadScanOptions,\n RdfQuadRow,\n RdfQueryAggregate,\n RdfSourceInput,\n RdfSourceRow,\n RdfTermKind,\n} from './types';\nimport { isRdfNumericDatatype, rdfNumericValue } from './RdfTermSemantics';\n\nconst XSD_INTEGER = 'http://www.w3.org/2001/XMLSchema#integer';\nconst XSD_DECIMAL = 'http://www.w3.org/2001/XMLSchema#decimal';\nconst XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string';\n\ntype IndexedColumn = 'graph_id' | 'subject_id' | 'predicate_id' | 'object_id';\ntype PatternKey = 'graph' | 'subject' | 'predicate' | 'object';\n\ninterface RdfWhereClause {\n joins: string;\n whereClause: string;\n params: unknown[];\n indexHint: string;\n queryPlan: string[];\n unresolved?: PatternKey;\n}\n\ninterface RdfCondition {\n joins: string[];\n sql?: string;\n params: unknown[];\n equality?: boolean;\n queryPlan: string[];\n unresolved?: boolean;\n}\n\ninterface RdfConditionScope {\n quadAlias?: string;\n aliasPrefix?: string;\n}\n\nconst TERM_COLUMN: Record<PatternKey, IndexedColumn> = {\n graph: 'graph_id',\n subject: 'subject_id',\n predicate: 'predicate_id',\n object: 'object_id',\n};\n\nconst TERM_KEYS: PatternKey[] = ['graph', 'subject', 'predicate', 'object'];\nconst TERM_IN_JOIN_THRESHOLD = 64;\nexport class RdfQuadIndex {\n private readonly sqliteRuntime = createSqliteRuntime();\n private db: SqliteDatabase | null = null;\n private dictionary: RdfTermDictionary | null = null;\n private readonly cardinalityCache = new Map<string, RdfCardinalityEstimate>();\n\n public constructor(private readonly options: RdfQuadIndexOptions) {}\n\n public open(): void {\n if (this.db) {\n return;\n }\n\n if (this.options.path !== ':memory:') {\n const dir = dirname(this.options.path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n this.db = this.sqliteRuntime.openDatabase(this.options.path);\n this.dictionary = new RdfTermDictionary(this.db);\n this.dictionary.initialize();\n this.initializeSchema();\n }\n\n public close(): void {\n this.db?.close();\n this.db = null;\n this.dictionary = null;\n }\n\n public clear(): void {\n const db = this.requireDb();\n db.exec('DELETE FROM rdf_quads; DELETE FROM rdf_sources; DELETE FROM rdf_terms;');\n this.cardinalityCache.clear();\n }\n\n public put(quad: Quad, options?: RdfIndexPutOptions): void {\n this.multiPut([quad], options);\n }\n\n public replaceSource(quads: Quad[], source: RdfSourceInput): void {\n const db = this.requireDb();\n db.transaction(() => {\n this.deleteSource(source.source);\n if (quads.length > 0) {\n this.insertQuads(quads, { source });\n } else {\n this.upsertSource(source);\n }\n })();\n this.cardinalityCache.clear();\n }\n\n public deleteSource(source: string): number {\n const db = this.requireDb();\n const row = db\n .prepare<{ id: number }>('SELECT id FROM rdf_sources WHERE source = ?')\n .get(source);\n if (!row) {\n return 0;\n }\n\n const result = db.prepare('DELETE FROM rdf_quads WHERE source_file_id = ?').run(row.id);\n db.prepare('DELETE FROM rdf_sources WHERE id = ?').run(row.id);\n if (result.changes > 0) {\n this.cardinalityCache.clear();\n }\n return result.changes;\n }\n\n public multiPut(quads: Quad[], options?: RdfIndexPutOptions): void {\n if (quads.length === 0) {\n return;\n }\n\n const db = this.requireDb();\n db.transaction(() => {\n this.insertQuads(quads, options);\n })();\n this.cardinalityCache.clear();\n }\n\n private insertQuads(quads: Quad[], options?: RdfIndexPutOptions): void {\n const db = this.requireDb();\n const dictionary = this.requireDictionary();\n const sourceId = options?.source ? this.upsertSource(options.source) : null;\n const insert = db.prepare(`\n INSERT INTO rdf_quads (\n graph_id,\n subject_id,\n predicate_id,\n object_id,\n source_file_id,\n source_line_no\n )\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT (graph_id, subject_id, predicate_id, object_id)\n DO UPDATE SET\n source_file_id = excluded.source_file_id,\n source_line_no = excluded.source_line_no\n `);\n\n for (const quad of quads) {\n insert.run(\n dictionary.getOrCreate(quad.graph),\n dictionary.getOrCreate(quad.subject),\n dictionary.getOrCreate(quad.predicate),\n dictionary.getOrCreate(quad.object),\n sourceId,\n options?.sourceLineNo ?? null,\n );\n }\n }\n\n public delete(pattern: QuintPattern): number {\n const db = this.requireDb();\n const { joins, whereClause, params } = this.buildWhereClause(pattern, false);\n if (!whereClause) {\n const result = db.prepare('DELETE FROM rdf_quads').run();\n this.cardinalityCache.clear();\n return result.changes;\n }\n const sql = joins\n ? `DELETE FROM rdf_quads WHERE rowid IN (SELECT rdf_quads.rowid FROM rdf_quads${joins}${whereClause})`\n : `DELETE FROM rdf_quads${whereClause}`;\n const changes = db.prepare(sql).run(...params).changes;\n if (changes > 0) {\n this.cardinalityCache.clear();\n }\n return changes;\n }\n\n public scan(pattern: QuintPattern, options?: RdfQuadScanOptions): RdfQuadIndexScanResult {\n return this.scanInternal(pattern, options);\n }\n\n public scanWithTupleConstraints(\n pattern: QuintPattern,\n tupleSource: RdfQuadTupleConstraintSource,\n options?: RdfQuadScanOptions,\n ): RdfQuadIndexScanResult {\n return this.scanInternal(pattern, options, tupleSource);\n }\n\n public joinPatterns(patterns: RdfQuadJoinPattern[], options?: RdfQuadJoinOptions): RdfQuadJoinScanResult {\n const start = Date.now();\n if (patterns.length === 0) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, ['JoinBGP(empty)']),\n };\n }\n\n const compiled = this.compileJoinPatterns(patterns, options);\n if (compiled.unresolved) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, [...compiled.queryPlan, `unresolved ${compiled.unresolved}`]),\n };\n }\n\n const rows = this.requireDb().prepare<Record<string, number>>(compiled.sql).all(...compiled.params);\n const matchedRows = compiled.countSql\n ? this.requireDb().prepare<{ count: number }>(compiled.countSql).get(...compiled.countParams)?.count ?? 0\n : rows.length;\n return {\n bindings: this.joinRowsToBindings(rows, compiled.variableAliases),\n metrics: this.metrics(\n compiled.indexChoice,\n matchedRows,\n rows.length,\n start,\n [...compiled.queryPlan, compiled.sql],\n ),\n };\n }\n\n public countJoinPatterns(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinCountOptions,\n ): RdfQuadJoinScanResult {\n return this.aggregateJoinPatternsInternal(patterns, options, 'JoinCount');\n }\n\n public aggregateJoinPatterns(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinAggregateOptions,\n ): RdfQuadJoinScanResult {\n return this.aggregateJoinPatternsInternal(patterns, options, 'JoinAggregate');\n }\n\n private aggregateJoinPatternsInternal(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinAggregateOptions,\n label: 'JoinCount' | 'JoinAggregate',\n ): RdfQuadJoinScanResult {\n const start = Date.now();\n if (patterns.length === 0) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, [`${label}(empty)`]),\n };\n }\n\n const compiled = this.compileJoinPatterns(patterns);\n if (compiled.unresolved) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, [...compiled.queryPlan, `unresolved ${compiled.unresolved}`]),\n };\n }\n\n const aggregateAliases = new Map<string, string>();\n const aggregateTypes = new Map<string, 'integer' | 'decimal'>();\n const numericJoins = new Map<string, string>();\n const numericJoinSql: string[] = [];\n const projection = options.aggregates.map((aggregate, index) => {\n const alias = `a${index}`;\n aggregateAliases.set(aggregate.as, alias);\n return this.buildJoinAggregateColumn(\n aggregate,\n alias,\n compiled.variableColumns,\n aggregateTypes,\n numericJoins,\n numericJoinSql,\n 'RDF BGP',\n this.joinRowKeyExpression(patterns),\n );\n }).join(', ');\n const aggregateJoins = numericJoinSql.join('');\n const sql = `SELECT ${projection} FROM ${compiled.from}${compiled.joins}${aggregateJoins}${compiled.whereClause}`;\n const rows = this.requireDb().prepare<Record<string, number>>(sql).all(...compiled.params);\n const matchedRows = this.requireDb()\n .prepare<{ count: number }>(`SELECT COUNT(*) AS count FROM ${compiled.from}${compiled.joins}${aggregateJoins}${compiled.whereClause}`)\n .get(...compiled.params)?.count ?? 0;\n return {\n bindings: this.joinRowsToBindings(rows, compiled.variableAliases, aggregateAliases, aggregateTypes),\n metrics: this.metrics(\n compiled.indexChoice,\n matchedRows,\n rows.length,\n start,\n [\n ...compiled.queryPlan,\n ...(numericJoinSql.length > 0 ? [`JoinAggregateNumeric(${[...numericJoins.keys()].map((variableName) => `?${variableName}`).join(',')})`] : []),\n `${label}(${options.aggregates.map((aggregate) => (\n `${aggregate.type}${aggregate.distinct ? ':DISTINCT' : ''}(${aggregate.variable ? `?${aggregate.variable}` : '*'})`\n )).join(',')})`,\n sql,\n ],\n ),\n };\n }\n\n public groupCountJoinPatterns(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinGroupAggregateOptions,\n ): RdfQuadJoinScanResult {\n return this.groupAggregateJoinPatternsInternal(patterns, options, 'JoinGroupCount');\n }\n\n public groupAggregateJoinPatterns(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinGroupAggregateOptions,\n ): RdfQuadJoinScanResult {\n return this.groupAggregateJoinPatternsInternal(patterns, options, 'JoinGroupAggregate');\n }\n\n private groupAggregateJoinPatternsInternal(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinGroupAggregateOptions,\n label: 'JoinGroupCount' | 'JoinGroupAggregate',\n ): RdfQuadJoinScanResult {\n const start = Date.now();\n if (patterns.length === 0) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, [`${label}(empty)`]),\n };\n }\n\n const compiled = this.compileJoinPatterns(patterns);\n if (compiled.unresolved) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, [...compiled.queryPlan, `unresolved ${compiled.unresolved}`]),\n };\n }\n\n const aggregateAliases = new Map<string, string>();\n const aggregateSqlAliases = new Map<string, string>();\n const aggregateTypes = new Map<string, 'integer' | 'decimal'>();\n const numericJoins = new Map<string, string>();\n const numericJoinSql: string[] = [];\n const groupColumns = options.groupBy.map((variableName) => {\n const column = compiled.variableColumns.get(variableName);\n if (!column) {\n throw new Error(`RDF BGP group aggregate cannot group by unbound variable: ${variableName}`);\n }\n return column;\n });\n const aggregateColumns = options.aggregates.map((aggregate, index) => {\n const alias = `a${index}`;\n aggregateAliases.set(aggregate.as, alias);\n aggregateSqlAliases.set(aggregate.as, alias);\n return this.buildJoinAggregateColumn(\n aggregate,\n alias,\n compiled.variableColumns,\n aggregateTypes,\n numericJoins,\n numericJoinSql,\n 'RDF BGP group aggregate',\n '__row_key',\n );\n });\n const projection = [\n ...options.groupBy.map((variableName) => {\n const alias = compiled.variableAliases.get(variableName);\n const column = compiled.variableColumns.get(variableName);\n if (!alias || !column) {\n throw new Error(`RDF BGP group aggregate cannot project unbound group variable: ${variableName}`);\n }\n return `${column} AS ${alias}`;\n }),\n ...aggregateColumns,\n ].join(', ');\n const groupBy = groupColumns.join(', ');\n const rowKeyExpression = this.joinRowKeyExpression(patterns);\n const aggregateJoins = numericJoinSql.join('');\n const havingClause = this.buildGroupAggregateHavingClause(options.having, aggregateSqlAliases);\n const orderScope = this.buildGroupAggregateOrderScope(options, compiled.variableColumns, aggregateSqlAliases);\n const fromSql = `${compiled.from}${compiled.joins}${aggregateJoins}${compiled.whereClause}`;\n const sourceFromSql = `${compiled.from}${compiled.joins}${aggregateJoins}${orderScope.joins}${compiled.whereClause}`;\n const sourceSql = aggregateColumns.some((entry) => entry.includes('__row_key'))\n ? `SELECT ${projection.replace(/__row_key/g, rowKeyExpression)} FROM ${sourceFromSql} GROUP BY ${groupBy}${havingClause.sql}`\n : `SELECT ${projection} FROM ${sourceFromSql} GROUP BY ${groupBy}${havingClause.sql}`;\n const orderClause = orderScope.orderBy;\n let sql = `${sourceSql}${orderClause}`;\n const params = [...compiled.params, ...havingClause.params];\n const paginated = options.limit !== undefined || options.offset !== undefined;\n if (options.limit !== undefined) {\n sql += ' LIMIT ?';\n params.push(options.limit);\n }\n if (options.offset !== undefined) {\n if (options.limit === undefined) {\n sql += ' LIMIT -1';\n }\n sql += ' OFFSET ?';\n params.push(options.offset);\n }\n const rows = this.requireDb().prepare<Record<string, number>>(sql).all(...params);\n const matchedRows = this.requireDb()\n .prepare<{ count: number }>(`SELECT COUNT(*) AS count FROM ${fromSql}`)\n .get(...compiled.params)?.count ?? 0;\n return {\n bindings: this.joinRowsToBindings(rows, compiled.variableAliases, aggregateAliases, aggregateTypes),\n metrics: this.metrics(\n compiled.indexChoice,\n matchedRows,\n rows.length,\n start,\n [\n ...compiled.queryPlan,\n ...(numericJoinSql.length > 0 ? [`JoinGroupAggregateNumeric(${[...numericJoins.keys()].map((variableName) => `?${variableName}`).join(',')})`] : []),\n `${label}(${options.groupBy.map((variableName) => `?${variableName}`).join(',')})`,\n ...(havingClause.sql ? [`${label}Having(${(options.having ?? []).map((entry) => `${entry.aggregate}${entry.operator}`).join(',')})`] : []),\n ...(orderClause ? [`${label}Order(${(options.orderBy ?? []).map((entry) => `${entry.direction ?? 'asc'}:${entry.variable}`).join(',')})`] : []),\n ...(paginated ? [`${label}Limit`] : []),\n sql,\n ],\n ),\n };\n }\n\n private scanInternal(\n pattern: QuintPattern,\n options?: RdfQuadScanOptions,\n tupleSource?: RdfQuadTupleConstraintSource,\n ): RdfQuadIndexScanResult {\n const start = Date.now();\n const { joins, whereClause, params, indexHint, queryPlan, unresolved } = this.buildWhereClause(pattern, true);\n if (unresolved) {\n return {\n quads: [],\n metrics: this.metrics(indexHint, 0, 0, start, [...queryPlan, `unresolved ${unresolved}`]),\n };\n }\n\n const orderClause = this.buildOrderClause(options);\n const tupleJoin = tupleSource ? this.buildTupleConstraintJoin(tupleSource) : undefined;\n let sql = `SELECT rdf_quads.graph_id, rdf_quads.subject_id, rdf_quads.predicate_id, rdf_quads.object_id, rdf_quads.source_file_id, rdf_quads.source_line_no FROM rdf_quads${joins}${tupleJoin?.join ?? ''}${orderClause.joins}`;\n if (whereClause) {\n sql += whereClause;\n }\n\n if (orderClause.orderBy) {\n sql += orderClause.orderBy;\n }\n\n if (options?.limit !== undefined) {\n sql += ' LIMIT ?';\n params.push(options.limit);\n }\n if (options?.offset !== undefined) {\n if (options.limit === undefined) {\n sql += ' LIMIT -1';\n }\n sql += ' OFFSET ?';\n params.push(options.offset);\n }\n\n const countSql = `SELECT COUNT(*) AS count FROM rdf_quads${joins}${tupleJoin?.join ?? ''}${orderClause.joins}${whereClause}`;\n const countParams = [...params.slice(0, params.length - this.paginationParamCount(options))];\n const countRow = this.requireDb().prepare<{ count: number }>(countSql).get(...countParams);\n const matchedRows = countRow?.count ?? 0;\n const rows = this.requireDb().prepare<RdfQuadRow>(sql).all(...params);\n return {\n quads: this.rowsToQuads(rows),\n metrics: this.metrics(indexHint, matchedRows, rows.length, start, [\n ...queryPlan,\n ...(tupleJoin ? [`TupleValuesJoin(${tupleSource?.columns.join(',')})`] : []),\n sql,\n ]),\n };\n }\n\n private compileJoinPatterns(patterns: RdfQuadJoinPattern[], options?: RdfQuadJoinOptions): {\n from: string;\n joins: string;\n whereClause: string;\n sql: string;\n params: unknown[];\n countSql?: string;\n countParams: unknown[];\n indexChoice: string;\n queryPlan: string[];\n variableColumns: Map<string, string>;\n variableAliases: Map<string, string>;\n unresolved?: PatternKey;\n } {\n const from = 'rdf_quads q0';\n const joins: string[] = [];\n const conditions: string[] = [];\n const params: unknown[] = [];\n const queryPlan: string[] = [`JoinBGP(${patterns.length})`];\n const variableColumns = new Map<string, string>();\n const variableAliases = new Map<string, string>();\n const indexChoices: string[] = [];\n\n for (const [patternIndex, entry] of patterns.entries()) {\n const alias = `q${patternIndex}`;\n if (patternIndex > 0) {\n joins.push(` JOIN rdf_quads ${alias} ON 1 = 1`);\n }\n const equalityColumns = new Set<IndexedColumn>();\n\n for (const key of TERM_KEYS) {\n const match = entry.pattern[key];\n const column = `${alias}.${TERM_COLUMN[key]}`;\n const variableName = entry.variables[key];\n if (variableName) {\n const existingColumn = variableColumns.get(variableName);\n if (existingColumn) {\n conditions.push(`${existingColumn} = ${column}`);\n } else {\n variableColumns.set(variableName, column);\n }\n }\n if (!match) {\n continue;\n }\n const condition = this.matchToJoinCondition(key, alias, TERM_COLUMN[key], match, true);\n if (condition.unresolved) {\n return {\n from,\n joins: joins.join(''),\n whereClause: '',\n sql: '',\n params: [],\n countParams: [],\n indexChoice: 'none',\n queryPlan,\n variableColumns,\n variableAliases,\n unresolved: key,\n };\n }\n joins.push(...condition.joins);\n if (condition.sql) {\n conditions.push(condition.sql);\n params.push(...condition.params);\n }\n queryPlan.push(...condition.queryPlan);\n if (condition.equality) {\n equalityColumns.add(TERM_COLUMN[key]);\n }\n }\n indexChoices.push(this.chooseIndex(equalityColumns));\n }\n\n const projectVariables = options?.project ?? [...variableColumns.keys()];\n const projectionColumns = projectVariables.map((variableName) => {\n const column = variableColumns.get(variableName);\n if (!column) {\n throw new Error(`RDF BGP join cannot project unbound variable: ${variableName}`);\n }\n const columnAlias = `v${variableAliases.size}`;\n variableAliases.set(variableName, columnAlias);\n return `${column} AS ${columnAlias}`;\n });\n const projection = projectionColumns.length > 0\n ? `${options?.distinct ? 'DISTINCT ' : ''}${projectionColumns.join(', ')}`\n : `${options?.distinct ? 'DISTINCT ' : ''}1 AS __empty`;\n const orderClause = this.buildJoinOrderClause(options, variableColumns);\n const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';\n let sql = `SELECT ${projection} FROM ${from}${joins.join('')}${orderClause.joins}${whereClause}${orderClause.orderBy}`;\n const sqlParams = [...params];\n const paginated = options?.limit !== undefined || options?.offset !== undefined;\n const countMatchedRows = options?.countMatchedRows ?? true;\n if (options?.limit !== undefined) {\n sql += ' LIMIT ?';\n sqlParams.push(options.limit);\n }\n if (options?.offset !== undefined) {\n if (options.limit === undefined) {\n sql += ' LIMIT -1';\n }\n sql += ' OFFSET ?';\n sqlParams.push(options.offset);\n }\n if (orderClause.orderBy) {\n queryPlan.push(`JoinOrder(${(options?.orderBy ?? []).map((entry) => `${entry.direction ?? 'asc'}:${entry.variable}`).join(',')})`);\n }\n if (options?.distinct) {\n queryPlan.push(`JoinDistinct(${projectVariables.map((variableName) => `?${variableName}`).join(',')})`);\n }\n if (paginated) {\n queryPlan.push('JoinLimit');\n }\n return {\n from,\n joins: joins.join(''),\n whereClause,\n sql,\n params: sqlParams,\n countSql: paginated && countMatchedRows ? `SELECT COUNT(*) AS count FROM ${from}${joins.join('')}${whereClause}` : undefined,\n countParams: params,\n indexChoice: `JoinBGP(${indexChoices.join('>')})`,\n queryPlan,\n variableColumns,\n variableAliases,\n };\n }\n\n private buildJoinOrderClause(\n options: RdfQuadJoinOptions | undefined,\n variableColumns: Map<string, string>,\n ): { joins: string; orderBy: string } {\n if (!options?.orderBy || options.orderBy.length === 0) {\n return { joins: '', orderBy: '' };\n }\n\n const joins = options.orderBy.map((entry, index) => {\n const column = variableColumns.get(entry.variable);\n if (!column) {\n throw new Error(`RDF BGP join cannot order by unbound variable: ${entry.variable}`);\n }\n const alias = `join_order_t${index}`;\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${column}`,\n order: `${alias}.value${entry.direction === 'desc' ? ' DESC' : ''}`,\n };\n });\n return {\n joins: joins.map((entry) => entry.join).join(''),\n orderBy: ` ORDER BY ${joins.map((entry) => entry.order).join(', ')}`,\n };\n }\n\n private joinRowKeyExpression(patterns: RdfQuadJoinPattern[]): string {\n return patterns.map((_, index) => `q${index}.rowid`).join(` || ':' || `);\n }\n\n private buildJoinAggregateColumn(\n aggregate: RdfQueryAggregate,\n alias: string,\n variableColumns: Map<string, string>,\n aggregateTypes: Map<string, 'integer' | 'decimal'>,\n numericJoins: Map<string, string>,\n numericJoinSql: string[],\n errorPrefix: string,\n rowKeyExpression: string,\n ): string {\n if (aggregate.type === 'count' && !aggregate.variable) {\n aggregateTypes.set(aggregate.as, 'integer');\n return `${aggregate.distinct ? `COUNT(DISTINCT ${rowKeyExpression})` : 'COUNT(*)'} AS ${alias}`;\n }\n if (!aggregate.variable) {\n throw new Error(`${errorPrefix} ${aggregate.type} aggregate requires a bound variable`);\n }\n const column = variableColumns.get(aggregate.variable);\n if (!column) {\n throw new Error(`${errorPrefix} aggregate cannot read unbound variable: ${aggregate.variable}`);\n }\n if (aggregate.type === 'count') {\n aggregateTypes.set(aggregate.as, 'integer');\n return `COUNT(${aggregate.distinct ? 'DISTINCT ' : ''}${column}) AS ${alias}`;\n }\n if (aggregate.distinct) {\n throw new Error(`${errorPrefix} ${aggregate.type} DISTINCT aggregate is not supported in SQL aggregate path`);\n }\n aggregateTypes.set(aggregate.as, 'decimal');\n const termAlias = numericJoins.get(aggregate.variable) ?? `agg_numeric_t${numericJoins.size}`;\n if (!numericJoins.has(aggregate.variable)) {\n numericJoins.set(aggregate.variable, termAlias);\n numericJoinSql.push(` JOIN rdf_terms ${termAlias} ON ${termAlias}.id = ${column} AND ${termAlias}.kind = 'literal' AND ${termAlias}.numeric_value IS NOT NULL`);\n }\n switch (aggregate.type) {\n case 'sum':\n return `COALESCE(SUM(${termAlias}.numeric_value), 0) AS ${alias}`;\n case 'avg':\n return `AVG(${termAlias}.numeric_value) AS ${alias}`;\n case 'min':\n return `MIN(${termAlias}.numeric_value) AS ${alias}`;\n case 'max':\n return `MAX(${termAlias}.numeric_value) AS ${alias}`;\n default: {\n const exhaustive: never = aggregate.type;\n throw new Error(`Unsupported RDF BGP aggregate type: ${exhaustive}`);\n }\n }\n }\n\n private buildGroupCountHavingClause(\n having: RdfQuadJoinGroupAggregateHaving[] | undefined,\n aggregateAliases: Map<string, string>,\n ): { sql: string; params: number[] } {\n return this.buildGroupAggregateHavingClause(having, aggregateAliases);\n }\n\n private buildGroupAggregateHavingClause(\n having: RdfQuadJoinGroupAggregateHaving[] | undefined,\n aggregateAliases: Map<string, string>,\n ): { sql: string; params: number[] } {\n if (!having || having.length === 0) {\n return { sql: '', params: [] };\n }\n\n const conditions: string[] = [];\n const params: number[] = [];\n for (const entry of having) {\n const alias = aggregateAliases.get(entry.aggregate);\n if (!alias) {\n throw new Error(`RDF BGP group count cannot HAVING on unknown aggregate: ${entry.aggregate}`);\n }\n conditions.push(`${alias} ${this.havingSqlOperator(entry.operator)} ?`);\n params.push(entry.value);\n }\n return {\n sql: ` HAVING ${conditions.join(' AND ')}`,\n params,\n };\n }\n\n private havingSqlOperator(operator: RdfQuadJoinGroupAggregateHaving['operator']): string {\n switch (operator) {\n case '$eq':\n return '=';\n case '$ne':\n return '!=';\n case '$gt':\n return '>';\n case '$gte':\n return '>=';\n case '$lt':\n return '<';\n case '$lte':\n return '<=';\n default: {\n const exhaustive: never = operator;\n throw new Error(`Unsupported RDF BGP group count HAVING operator: ${exhaustive}`);\n }\n }\n }\n\n private buildGroupCountOrderScope(\n options: RdfQuadJoinGroupAggregateOptions,\n variableColumns: Map<string, string>,\n aggregateAliases: Map<string, string>,\n ): { joins: string; orderBy: string } {\n return this.buildGroupAggregateOrderScope(options, variableColumns, aggregateAliases);\n }\n\n private buildGroupAggregateOrderScope(\n options: RdfQuadJoinGroupAggregateOptions,\n variableColumns: Map<string, string>,\n aggregateAliases: Map<string, string>,\n ): { joins: string; orderBy: string } {\n if (!options.orderBy || options.orderBy.length === 0) {\n return { joins: '', orderBy: '' };\n }\n\n const joins: string[] = [];\n const orders = options.orderBy.map((entry, index) => {\n const aggregateAlias = aggregateAliases.get(entry.variable);\n if (aggregateAlias) {\n return `${aggregateAlias}${entry.direction === 'desc' ? ' DESC' : ''}`;\n }\n const column = variableColumns.get(entry.variable);\n if (!column) {\n throw new Error(`RDF BGP group count cannot order by unbound variable: ${entry.variable}`);\n }\n const alias = `group_order_t${index}`;\n joins.push(` JOIN rdf_terms ${alias} ON ${alias}.id = ${column}`);\n return `${alias}.value${entry.direction === 'desc' ? ' DESC' : ''}`;\n });\n return {\n joins: joins.join(''),\n orderBy: ` ORDER BY ${orders.join(', ')}`,\n };\n }\n\n private matchToJoinCondition(\n key: PatternKey,\n alias: string,\n columnName: IndexedColumn,\n match: unknown,\n allowUnresolved: boolean,\n ): RdfCondition {\n return this.matchToCondition(key, columnName, match, allowUnresolved, {\n quadAlias: alias,\n aliasPrefix: alias,\n });\n }\n\n private joinRowsToBindings(\n rows: Array<Record<string, number>>,\n variableAliases: Map<string, string>,\n aggregateAliases?: Map<string, string>,\n aggregateTypes?: Map<string, 'integer' | 'decimal'>,\n ): RdfQuadJoinScanResult['bindings'] {\n const aliases = [...variableAliases.entries()];\n const termMap = this.requireDictionary().rowsForIds(rows.flatMap((row) => (\n aliases\n .map(([, alias]) => row[alias])\n .filter((id): id is number => typeof id === 'number')\n )));\n\n return rows.map((row) => {\n const binding: RdfQuadJoinScanResult['bindings'][number] = {};\n for (const [variableName, alias] of aliases) {\n const id = row[alias];\n if (typeof id !== 'number') {\n continue;\n }\n binding[variableName] = this.requiredTerm(termMap, id);\n }\n for (const [variableName, alias] of aggregateAliases ?? []) {\n const value = row[alias];\n if (typeof value === 'number') {\n const datatype = aggregateTypes?.get(variableName) === 'decimal' ? XSD_DECIMAL : XSD_INTEGER;\n binding[variableName] = DataFactory.literal(String(value), DataFactory.namedNode(datatype)) as Term;\n }\n }\n return binding;\n });\n }\n\n public count(pattern: QuintPattern): number {\n const { joins, whereClause, params, unresolved } = this.buildWhereClause(pattern, true);\n if (unresolved) {\n return 0;\n }\n const row = this.requireDb()\n .prepare<{ count: number }>(`SELECT COUNT(*) AS count FROM rdf_quads${joins}${whereClause}`)\n .get(...params);\n return row?.count ?? 0;\n }\n\n public estimateCardinality(pattern: QuintPattern): RdfCardinalityEstimate {\n const exact = this.exactTermPattern(pattern);\n if (!exact) {\n return {\n rows: this.count(pattern),\n source: 'exact-count',\n indexChoice: this.buildWhereClause(pattern, true).indexHint,\n };\n }\n\n const cacheKey = exact.cacheKey;\n const cached = this.cardinalityCache.get(cacheKey);\n if (cached) {\n return {\n ...cached,\n source: 'cached-exact-count',\n };\n }\n\n const estimate = this.countExactTermPattern(exact.ids, exact.indexChoice);\n this.cardinalityCache.set(cacheKey, estimate);\n return estimate;\n }\n\n public countDistinct(pattern: QuintPattern, distinctKey: PatternKey): RdfCardinalityEstimate {\n const exact = this.exactTermPattern(pattern);\n if (!exact) {\n const count = this.countDistinctPattern(pattern, distinctKey);\n return {\n rows: count,\n source: 'exact-distinct-count',\n indexChoice: this.buildWhereClause(pattern, true).indexHint,\n };\n }\n\n const cacheKey = `distinct:${distinctKey}|${exact.cacheKey}`;\n const cached = this.cardinalityCache.get(cacheKey);\n if (cached) {\n return {\n ...cached,\n source: 'cached-exact-distinct-count',\n };\n }\n\n const estimate = this.countExactDistinctTermPattern(exact.ids, exact.indexChoice, distinctKey);\n this.cardinalityCache.set(cacheKey, estimate);\n return estimate;\n }\n\n public countDistinctTuple(pattern: QuintPattern, distinctKeys: PatternKey[]): RdfCardinalityEstimate {\n const keys = uniquePatternKeys(distinctKeys);\n if (keys.length === 0) {\n return this.estimateCardinality(pattern);\n }\n if (keys.length === 1) {\n return this.countDistinct(pattern, keys[0]);\n }\n\n const exact = this.exactTermPattern(pattern);\n if (!exact) {\n const count = this.countDistinctTuplePattern(pattern, keys);\n return {\n rows: count,\n source: 'exact-distinct-tuple-count',\n indexChoice: this.buildWhereClause(pattern, true).indexHint,\n };\n }\n\n const cacheKey = `distinct-tuple:${keys.join(',')}|${exact.cacheKey}`;\n const cached = this.cardinalityCache.get(cacheKey);\n if (cached) {\n return {\n ...cached,\n source: 'cached-exact-distinct-tuple-count',\n };\n }\n\n const estimate = this.countExactDistinctTupleTermPattern(exact.ids, exact.indexChoice, keys);\n this.cardinalityCache.set(cacheKey, estimate);\n return estimate;\n }\n\n public stats(): RdfIndexStats {\n const db = this.requireDb();\n const spaceObjects = this.collectSpaceObjects();\n const databaseBytes = this.estimateDatabaseBytes();\n const accountedBytes = spaceObjects.reduce((sum, object) => sum + object.bytes, 0);\n return {\n termCount: this.requireDictionary().count(),\n quadCount: db.prepare<{ count: number }>('SELECT COUNT(*) AS count FROM rdf_quads').get()?.count ?? 0,\n sourceCount: db.prepare<{ count: number }>('SELECT COUNT(*) AS count FROM rdf_sources').get()?.count ?? 0,\n graphCount: db.prepare<{ count: number }>('SELECT COUNT(DISTINCT graph_id) AS count FROM rdf_quads').get()?.count ?? 0,\n databaseBytes: accountedBytes || databaseBytes,\n tableBytes: sumSpaceObjects(spaceObjects, 'table'),\n indexBytes: sumSpaceObjects(spaceObjects, 'index'),\n spaceObjects,\n serializedTermTextBytes: this.estimateSerializedTextBytes(),\n literalDatatypeDistribution: this.literalDatatypeDistribution(),\n cardinalityDistributions: this.cardinalityDistributions(),\n };\n }\n\n public cardinalityDistributions(limit = 100): RdfCardinalityDistributions {\n return {\n graphs: this.graphCardinalityDistribution(limit),\n predicates: this.predicateCardinalityDistribution(limit),\n predicateObjects: this.predicateObjectCardinalityDistribution(limit),\n subjectPredicates: this.subjectPredicateCardinalityDistribution(limit),\n };\n }\n\n public literalDatatypeDistribution(): RdfLiteralDatatypeDistribution[] {\n const rows = this.requireDb().prepare<{\n datatype: string | null;\n term_count: number;\n object_quad_count: number | null;\n }>(`\n SELECT\n COALESCE(datatype.value, 'http://www.w3.org/2001/XMLSchema#string') AS datatype,\n COUNT(DISTINCT literal.id) AS term_count,\n COUNT(quad.object_id) AS object_quad_count\n FROM rdf_terms literal\n LEFT JOIN rdf_terms datatype ON datatype.id = literal.datatype_id\n LEFT JOIN rdf_quads quad ON quad.object_id = literal.id\n WHERE literal.kind = 'literal'\n GROUP BY datatype\n ORDER BY object_quad_count DESC, term_count DESC, datatype ASC\n `).all();\n return rows.map((row) => ({\n datatype: row.datatype ?? 'http://www.w3.org/2001/XMLSchema#string',\n termCount: row.term_count,\n objectQuadCount: row.object_quad_count ?? 0,\n }));\n }\n\n private graphCardinalityDistribution(limit: number): RdfCardinalityDistributions['graphs'] {\n const rows = this.requireDb().prepare<{\n graph_id: number;\n quad_count: number;\n distinct_subjects: number;\n distinct_predicates: number;\n distinct_objects: number;\n }>(`\n SELECT\n graph_id,\n COUNT(*) AS quad_count,\n COUNT(DISTINCT subject_id) AS distinct_subjects,\n COUNT(DISTINCT predicate_id) AS distinct_predicates,\n COUNT(DISTINCT object_id) AS distinct_objects\n FROM rdf_quads\n GROUP BY graph_id\n ORDER BY quad_count DESC, graph_id ASC\n LIMIT ?\n `).all(limit);\n const termMap = this.requireDictionary().rowsForIds(rows.map((row) => row.graph_id));\n return rows.map((row) => ({\n graph: this.cardinalityTerm(termMap, row.graph_id),\n quadCount: row.quad_count,\n distinctSubjects: row.distinct_subjects,\n distinctPredicates: row.distinct_predicates,\n distinctObjects: row.distinct_objects,\n }));\n }\n\n private predicateCardinalityDistribution(limit: number): RdfCardinalityDistributions['predicates'] {\n const rows = this.requireDb().prepare<{\n predicate_id: number;\n quad_count: number;\n graph_count: number;\n distinct_subjects: number;\n distinct_objects: number;\n }>(`\n SELECT\n predicate_id,\n COUNT(*) AS quad_count,\n COUNT(DISTINCT graph_id) AS graph_count,\n COUNT(DISTINCT subject_id) AS distinct_subjects,\n COUNT(DISTINCT object_id) AS distinct_objects\n FROM rdf_quads\n GROUP BY predicate_id\n ORDER BY quad_count DESC, predicate_id ASC\n LIMIT ?\n `).all(limit);\n const termMap = this.requireDictionary().rowsForIds(rows.map((row) => row.predicate_id));\n return rows.map((row) => ({\n predicate: this.cardinalityTerm(termMap, row.predicate_id),\n quadCount: row.quad_count,\n graphCount: row.graph_count,\n distinctSubjects: row.distinct_subjects,\n distinctObjects: row.distinct_objects,\n }));\n }\n\n private predicateObjectCardinalityDistribution(limit: number): RdfCardinalityDistributions['predicateObjects'] {\n const rows = this.requireDb().prepare<{\n predicate_id: number;\n object_id: number;\n quad_count: number;\n graph_count: number;\n distinct_subjects: number;\n }>(`\n SELECT\n predicate_id,\n object_id,\n COUNT(*) AS quad_count,\n COUNT(DISTINCT graph_id) AS graph_count,\n COUNT(DISTINCT subject_id) AS distinct_subjects\n FROM rdf_quads\n GROUP BY predicate_id, object_id\n ORDER BY quad_count DESC, predicate_id ASC, object_id ASC\n LIMIT ?\n `).all(limit);\n const termMap = this.requireDictionary().rowsForIds(rows.flatMap((row) => [row.predicate_id, row.object_id]));\n return rows.map((row) => ({\n predicate: this.cardinalityTerm(termMap, row.predicate_id),\n object: this.cardinalityTerm(termMap, row.object_id),\n quadCount: row.quad_count,\n graphCount: row.graph_count,\n distinctSubjects: row.distinct_subjects,\n }));\n }\n\n private subjectPredicateCardinalityDistribution(limit: number): RdfCardinalityDistributions['subjectPredicates'] {\n const rows = this.requireDb().prepare<{\n subject_id: number;\n predicate_id: number;\n quad_count: number;\n graph_count: number;\n distinct_objects: number;\n }>(`\n SELECT\n subject_id,\n predicate_id,\n COUNT(*) AS quad_count,\n COUNT(DISTINCT graph_id) AS graph_count,\n COUNT(DISTINCT object_id) AS distinct_objects\n FROM rdf_quads\n GROUP BY subject_id, predicate_id\n ORDER BY quad_count DESC, subject_id ASC, predicate_id ASC\n LIMIT ?\n `).all(limit);\n const termMap = this.requireDictionary().rowsForIds(rows.flatMap((row) => [row.subject_id, row.predicate_id]));\n return rows.map((row) => ({\n subject: this.cardinalityTerm(termMap, row.subject_id),\n predicate: this.cardinalityTerm(termMap, row.predicate_id),\n quadCount: row.quad_count,\n graphCount: row.graph_count,\n distinctObjects: row.distinct_objects,\n }));\n }\n\n private cardinalityTerm(termMap: Map<number, Term>, id: number): RdfCardinalityTerm {\n const term = this.requiredTerm(termMap, id);\n const result: RdfCardinalityTerm = {\n value: term.value,\n kind: rdfTermKind(term),\n };\n if (term.termType === 'Literal') {\n if (term.datatype.value) {\n result.datatype = term.datatype.value;\n }\n if (term.language) {\n result.language = term.language;\n }\n }\n return result;\n }\n\n public estimateSerializedTextBytes(): number {\n const db = this.requireDb();\n const row = db.prepare<{ bytes: number | null }>(`\n SELECT\n COALESCE(SUM(length(value)), 0) +\n COALESCE(SUM(CASE WHEN lang IS NULL THEN 0 ELSE length(lang) END), 0) AS bytes\n FROM rdf_terms\n `).get();\n return row?.bytes ?? 0;\n }\n\n public estimateDatabaseBytes(): number {\n const db = this.requireDb();\n try {\n const pageCount = db.prepare<{ page_count: number }>('PRAGMA page_count').get()?.page_count ?? 0;\n const pageSize = db.prepare<{ page_size: number }>('PRAGMA page_size').get()?.page_size ?? 0;\n return pageCount * pageSize;\n } catch {\n return 0;\n }\n }\n\n public collectSpaceObjects(): RdfIndexSpaceObject[] {\n const db = this.requireDb();\n try {\n const schemaRows = db.prepare<{ name: string; type: string; tbl_name: string }>(`\n SELECT name, type, tbl_name\n FROM sqlite_schema\n WHERE type IN ('table', 'index')\n AND (\n name IN ('rdf_terms', 'rdf_sources', 'rdf_quads')\n OR tbl_name IN ('rdf_terms', 'rdf_sources', 'rdf_quads')\n )\n `).all();\n const schema = new Map(schemaRows.map((row) => [row.name, row]));\n try {\n const rows = db.prepare<{ name: string; pages: number; bytes: number | null }>(`\n SELECT name, COUNT(*) AS pages, SUM(pgsize) AS bytes\n FROM dbstat\n WHERE name IN (\n SELECT name\n FROM sqlite_schema\n WHERE type IN ('table', 'index')\n AND (\n name IN ('rdf_terms', 'rdf_sources', 'rdf_quads')\n OR tbl_name IN ('rdf_terms', 'rdf_sources', 'rdf_quads')\n )\n )\n GROUP BY name\n ORDER BY name\n `).all();\n\n if (rows.length > 0) {\n return rows.map((row) => {\n const object = schema.get(row.name);\n const kind = rdfSpaceObjectKind(row.name, object?.type, object?.tbl_name);\n return {\n name: row.name,\n kind,\n ...(object?.tbl_name && object.tbl_name !== row.name ? { tableName: object.tbl_name } : {}),\n pages: row.pages,\n bytes: row.bytes ?? 0,\n };\n });\n }\n } catch {\n // Some SQLite builds do not expose dbstat for in-memory databases.\n }\n\n return this.estimateSpaceObjectsFromSchema(schemaRows);\n } catch {\n return [];\n }\n }\n\n private estimateSpaceObjectsFromSchema(schemaRows: Array<{ name: string; type: string; tbl_name: string }>): RdfIndexSpaceObject[] {\n const pageSize = this.estimatePageSize();\n return schemaRows.map((object) => ({\n name: object.name,\n kind: rdfSpaceObjectKind(object.name, object.type, object.tbl_name),\n ...(object.tbl_name && object.tbl_name !== object.name ? { tableName: object.tbl_name } : {}),\n pages: 1,\n bytes: pageSize,\n estimated: true,\n }));\n }\n\n private estimatePageSize(): number {\n try {\n return this.requireDb().prepare<{ page_size: number }>('PRAGMA page_size').get()?.page_size ?? 4096;\n } catch {\n return 4096;\n }\n }\n\n private initializeSchema(): void {\n this.requireDb().exec(`\n CREATE TABLE IF NOT EXISTS rdf_sources (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n source TEXT NOT NULL UNIQUE,\n workspace TEXT NOT NULL,\n local_path TEXT,\n content_type TEXT,\n last_indexed_at TEXT,\n source_version TEXT\n );\n\n CREATE TABLE IF NOT EXISTS rdf_quads (\n graph_id INTEGER NOT NULL,\n subject_id INTEGER NOT NULL,\n predicate_id INTEGER NOT NULL,\n object_id INTEGER NOT NULL,\n source_file_id INTEGER,\n source_line_no INTEGER,\n PRIMARY KEY (graph_id, subject_id, predicate_id, object_id),\n FOREIGN KEY (graph_id) REFERENCES rdf_terms(id),\n FOREIGN KEY (subject_id) REFERENCES rdf_terms(id),\n FOREIGN KEY (predicate_id) REFERENCES rdf_terms(id),\n FOREIGN KEY (object_id) REFERENCES rdf_terms(id),\n FOREIGN KEY (source_file_id) REFERENCES rdf_sources(id)\n );\n\n CREATE INDEX IF NOT EXISTS rdf_quads_spog ON rdf_quads(subject_id, predicate_id, object_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_sopg ON rdf_quads(subject_id, object_id, predicate_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_psog ON rdf_quads(predicate_id, subject_id, object_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_posg ON rdf_quads(predicate_id, object_id, subject_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_ospg ON rdf_quads(object_id, subject_id, predicate_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_opsg ON rdf_quads(object_id, predicate_id, subject_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_gspo ON rdf_quads(graph_id, subject_id, predicate_id, object_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_gpos ON rdf_quads(graph_id, predicate_id, object_id, subject_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_source ON rdf_quads(source_file_id);\n `);\n }\n\n private upsertSource(source: RdfSourceInput): number {\n const db = this.requireDb();\n db.prepare(`\n INSERT INTO rdf_sources (\n source,\n workspace,\n local_path,\n content_type,\n last_indexed_at,\n source_version\n )\n VALUES (?, ?, ?, ?, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'), ?)\n ON CONFLICT (source)\n DO UPDATE SET\n workspace = excluded.workspace,\n local_path = excluded.local_path,\n content_type = excluded.content_type,\n last_indexed_at = excluded.last_indexed_at,\n source_version = excluded.source_version\n `).run(\n source.source,\n source.workspace,\n source.localPath ?? null,\n source.contentType ?? null,\n source.sourceVersion ?? null,\n );\n\n const row = db.prepare<RdfSourceRow>('SELECT * FROM rdf_sources WHERE source = ?').get(source.source);\n if (!row) {\n throw new Error(`Failed to upsert RDF source: ${source.source}`);\n }\n return row.id;\n }\n\n private buildWhereClause(\n pattern: QuintPattern,\n allowUnresolved: boolean,\n ): RdfWhereClause {\n const conditions: string[] = [];\n const joins: string[] = [];\n const params: unknown[] = [];\n const queryPlan: string[] = [];\n const equalityColumns = new Set<IndexedColumn>();\n\n for (const key of TERM_KEYS) {\n const match = pattern[key];\n if (!match) {\n continue;\n }\n const column = TERM_COLUMN[key];\n const condition = this.matchToCondition(key, column, match, allowUnresolved);\n if (condition.unresolved) {\n return { joins: '', whereClause: '', params: [], indexHint: 'none', queryPlan, unresolved: key };\n }\n joins.push(...condition.joins);\n if (condition.sql) {\n conditions.push(condition.sql);\n params.push(...condition.params);\n }\n queryPlan.push(...condition.queryPlan);\n if (condition.equality) {\n equalityColumns.add(column);\n }\n }\n\n return {\n joins: joins.join(''),\n whereClause: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n params,\n indexHint: this.chooseIndex(equalityColumns),\n queryPlan,\n };\n }\n\n private matchToCondition(\n key: PatternKey,\n column: IndexedColumn,\n match: unknown,\n allowUnresolved: boolean,\n scope?: RdfConditionScope,\n ): RdfCondition {\n const columnRef = this.scopedQuadColumn(column, scope);\n if (isTerm(match as any)) {\n const id = this.requireDictionary().find(match as Term);\n if (id === undefined) {\n if (allowUnresolved) {\n return { joins: [], params: [], queryPlan: [], unresolved: true };\n }\n return { joins: [], sql: `${columnRef} = ?`, params: [-1], equality: true, queryPlan: [] };\n }\n return { joins: [], sql: `${columnRef} = ?`, params: [id], equality: true, queryPlan: [] };\n }\n\n const ops = match as TermOperators;\n const fragments: string[] = [];\n const joins: string[] = [];\n const params: unknown[] = [];\n const queryPlan: string[] = [];\n let equality = false;\n\n if (ops.$eq !== undefined) {\n const id = this.termOperatorValueId(ops.$eq, allowUnresolved);\n if (id === undefined) return { joins, params: [], queryPlan, unresolved: true };\n fragments.push(`${columnRef} = ?`);\n params.push(id);\n equality = true;\n }\n if (ops.$in !== undefined) {\n const ids = uniqueNumbers(ops.$in\n .map((value) => this.termOperatorValueId(value, allowUnresolved))\n .filter((value): value is number => value !== undefined));\n if (ids.length === 0) {\n return { joins, params: [], queryPlan, unresolved: true };\n }\n if (ids.length > TERM_IN_JOIN_THRESHOLD) {\n const candidateTable = this.populateTermInCandidateTable(column, 'in', ids, scope);\n const candidateAlias = this.scopedSqlName(`${column}_in_candidates`, scope);\n joins.push(` JOIN ${candidateTable} ${candidateAlias} ON ${candidateAlias}.id = ${columnRef}`);\n } else {\n fragments.push(`${columnRef} IN (${ids.map(() => '?').join(', ')})`);\n params.push(...ids);\n }\n queryPlan.push(`TermIn(${key})`);\n equality = true;\n }\n if (ops.$ne !== undefined) {\n const id = this.termOperatorValueId(ops.$ne, allowUnresolved);\n if (id !== undefined) {\n fragments.push(`${columnRef} != ?`);\n params.push(id);\n }\n }\n for (const operator of ['$gt', '$gte', '$lt', '$lte'] as const) {\n if (ops[operator] !== undefined) {\n const range = this.termRangeCondition(key, column, operator, ops[operator], allowUnresolved, scope);\n if (range.unresolved) {\n return { joins, params: [], queryPlan, unresolved: true };\n }\n joins.push(...(range.joins ?? []));\n fragments.push(range.sql);\n params.push(...range.params);\n queryPlan.push(...(range.queryPlan ?? []));\n }\n }\n\n if (ops.$notIn !== undefined) {\n const ids = uniqueNumbers(ops.$notIn\n .map((value) => this.termOperatorValueId(value, allowUnresolved))\n .filter((value): value is number => value !== undefined));\n if (ids.length > 0) {\n if (ids.length > TERM_IN_JOIN_THRESHOLD) {\n const candidateTable = this.populateTermInCandidateTable(column, 'not_in', ids, scope);\n const candidateAlias = this.scopedSqlName(`${column}_not_in_candidates`, scope);\n joins.push(` LEFT JOIN ${candidateTable} ${candidateAlias} ON ${candidateAlias}.id = ${columnRef}`);\n fragments.push(`${candidateAlias}.id IS NULL`);\n } else {\n fragments.push(`${columnRef} NOT IN (${ids.map(() => '?').join(', ')})`);\n params.push(...ids);\n }\n queryPlan.push(`TermNotIn(${key})`);\n }\n }\n\n if (ops.$termType !== undefined) {\n const condition = this.termTypeConditionJoin(key, column, ops.$termType, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$language !== undefined) {\n const condition = this.languageConditionJoin(key, column, '$language', ops.$language, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$notLanguage !== undefined) {\n const condition = this.languageConditionJoin(key, column, '$notLanguage', ops.$notLanguage, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$langMatches !== undefined) {\n const condition = this.languageConditionJoin(key, column, '$langMatches', ops.$langMatches, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$datatype !== undefined) {\n const condition = this.datatypeConditionJoin(key, column, '$datatype', ops.$datatype, allowUnresolved, scope);\n if (condition.unresolved) {\n return { joins, params: [], queryPlan, unresolved: true };\n }\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$notDatatype !== undefined) {\n const condition = this.datatypeConditionJoin(key, column, '$notDatatype', ops.$notDatatype, allowUnresolved, scope);\n if (condition.unresolved) {\n return { joins, params: [], queryPlan, unresolved: true };\n }\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$startsWith !== undefined) {\n const condition = this.prefixSearchConditionJoin(key, column, ops.$startsWith, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(`PrefixRange(${key})`);\n equality = true;\n }\n\n equality = this.addTextSearchCondition(joins, fragments, params, queryPlan, key, column, '$contains', ops.$contains, scope) || equality;\n equality = this.addTextSearchCondition(joins, fragments, params, queryPlan, key, column, '$endsWith', ops.$endsWith, scope) || equality;\n equality = this.addTextSearchCondition(joins, fragments, params, queryPlan, key, column, '$regex', ops.$regex, scope) || equality;\n\n return {\n joins,\n sql: fragments.length > 0 ? fragments.join(' AND ') : undefined,\n params,\n equality,\n queryPlan,\n };\n }\n\n private termTypeConditionJoin(\n key: PatternKey,\n column: IndexedColumn,\n termType: 'iri' | 'blank' | 'literal' | 'numeric',\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[]; queryPlan: string } {\n const alias = this.scopedSqlName(`${column}_term_type_${termType}`, scope);\n const columnRef = this.scopedQuadColumn(column, scope);\n const possibleKinds = this.termKindsForPatternKey(key);\n if (termType === 'numeric') {\n if (!possibleKinds.includes('literal')) {\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: '1 = 0',\n params: [],\n queryPlan: `TermType(${key}:numeric)`,\n };\n }\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: `${alias}.kind = 'literal' AND ${alias}.numeric_value IS NOT NULL`,\n params: [],\n queryPlan: `TermType(${key}:numeric)`,\n };\n }\n if (!possibleKinds.includes(termType)) {\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: '1 = 0',\n params: [],\n queryPlan: `TermType(${key}:${termType})`,\n };\n }\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: `${alias}.kind = ?`,\n params: [termType],\n queryPlan: `TermType(${key}:${termType})`,\n };\n }\n\n private languageConditionJoin(\n key: PatternKey,\n column: IndexedColumn,\n operator: '$language' | '$notLanguage' | '$langMatches',\n language: string,\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[]; queryPlan: string } {\n const alias = this.scopedSqlName(`${column}_${operator.slice(1).toLowerCase()}`, scope);\n const columnRef = this.scopedQuadColumn(column, scope);\n if (!this.termKindsForPatternKey(key).includes('literal')) {\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: '1 = 0',\n params: [],\n queryPlan: `Language(${key}${operator})`,\n };\n }\n const join = ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`;\n if (operator === '$language') {\n return {\n join,\n sql: `${alias}.kind = 'literal' AND COALESCE(${alias}.lang, '') = ?`,\n params: [language],\n queryPlan: `Language(${key}${operator})`,\n };\n }\n if (operator === '$notLanguage') {\n return {\n join,\n sql: `${alias}.kind = 'literal' AND COALESCE(${alias}.lang, '') != ?`,\n params: [language],\n queryPlan: `Language(${key}${operator})`,\n };\n }\n if (language === '*') {\n return {\n join,\n sql: `${alias}.kind = 'literal' AND ${alias}.lang IS NOT NULL AND ${alias}.lang != ''`,\n params: [],\n queryPlan: `Language(${key}${operator})`,\n };\n }\n return {\n join,\n sql: `${alias}.kind = 'literal'\n AND (lower(${alias}.lang) = lower(?) OR lower(${alias}.lang) LIKE lower(?) ESCAPE '\\\\')`,\n params: [language, `${escapeLikePattern(language)}-%`],\n queryPlan: `Language(${key}${operator})`,\n };\n }\n\n private datatypeConditionJoin(\n key: PatternKey,\n column: IndexedColumn,\n operator: '$datatype' | '$notDatatype',\n datatype: Term,\n allowUnresolved: boolean,\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[]; queryPlan: string; unresolved?: boolean } {\n const alias = this.scopedSqlName(`${column}_${operator.slice(1).toLowerCase()}`, scope);\n const columnRef = this.scopedQuadColumn(column, scope);\n if (datatype.termType !== 'NamedNode') {\n throw new Error('RdfQuadIndex datatype filters only support named node datatype terms');\n }\n if (!this.termKindsForPatternKey(key).includes('literal')) {\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: '1 = 0',\n params: [],\n queryPlan: `Datatype(${key}${operator})`,\n };\n }\n const join = ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`;\n if (datatype.value === XSD_STRING) {\n return {\n join,\n sql: operator === '$datatype'\n ? `${alias}.kind = 'literal' AND ${alias}.lang IS NULL AND ${alias}.datatype_id IS NULL`\n : `${alias}.kind = 'literal' AND NOT (${alias}.lang IS NULL AND ${alias}.datatype_id IS NULL)`,\n params: [],\n queryPlan: `Datatype(${key}${operator})`,\n };\n }\n const datatypeId = this.requireDictionary().find(datatype);\n if (datatypeId === undefined) {\n if (operator === '$notDatatype') {\n return {\n join,\n sql: `${alias}.kind = 'literal'`,\n params: [],\n queryPlan: `Datatype(${key}${operator})`,\n };\n }\n if (allowUnresolved) {\n return { join, sql: '', params: [], queryPlan: `Datatype(${key}${operator})`, unresolved: true };\n }\n return {\n join,\n sql: operator === '$datatype' ? '1 = 0' : `${alias}.kind = 'literal'`,\n params: [],\n queryPlan: `Datatype(${key}${operator})`,\n };\n }\n return {\n join,\n sql: operator === '$datatype'\n ? `${alias}.kind = 'literal' AND ${alias}.datatype_id = ?`\n : `${alias}.kind = 'literal' AND (${alias}.datatype_id IS NULL OR ${alias}.datatype_id != ?)`,\n params: [datatypeId],\n queryPlan: `Datatype(${key}${operator})`,\n };\n }\n\n private termRangeCondition(\n key: PatternKey,\n column: IndexedColumn,\n operator: '$gt' | '$gte' | '$lt' | '$lte',\n value: unknown,\n allowUnresolved: boolean,\n scope?: RdfConditionScope,\n ): { joins?: string[]; sql: string; params: unknown[]; queryPlan?: string[]; unresolved?: boolean } {\n const kinds = this.termKindsForPatternKey(key);\n const lexicalValue = this.termOperatorLexicalValue(value);\n if (lexicalValue === undefined) {\n if (allowUnresolved) {\n return { sql: '', params: [], unresolved: true };\n }\n return { sql: '1 = 0', params: [] };\n }\n\n const comparator = {\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n }[operator];\n const numericValue = this.termOperatorNumericValue(value);\n if (numericValue !== undefined) {\n if (!kinds.includes('literal')) {\n if (allowUnresolved) {\n return { sql: '', params: [], unresolved: true };\n }\n return { sql: '1 = 0', params: [] };\n }\n const termAlias = this.scopedSqlName(`${column}_numeric_range_${operator.slice(1)}`, scope);\n return {\n joins: [` JOIN rdf_terms ${termAlias} ON ${termAlias}.id = ${this.scopedQuadColumn(column, scope)}`],\n sql: `${termAlias}.kind = 'literal'\n AND ${termAlias}.numeric_value IS NOT NULL\n AND ${termAlias}.numeric_value ${comparator} ?`,\n params: [numericValue],\n queryPlan: [`NumericRange(${key}${operator})`],\n };\n }\n\n const termAlias = this.scopedSqlName(`${column}_range_${operator.slice(1)}`, scope);\n return {\n joins: [` JOIN rdf_terms ${termAlias} ON ${termAlias}.id = ${this.scopedQuadColumn(column, scope)}`],\n sql: `${termAlias}.kind IN (${kinds.map(() => '?').join(', ')})\n AND ${termAlias}.value ${comparator} ?`,\n params: [...kinds, lexicalValue],\n queryPlan: [`LexicalRange(${key}${operator})`],\n };\n }\n\n private termOperatorLexicalValue(value: unknown): string | undefined {\n if (!value || typeof value !== 'object' || !('termType' in value)) {\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value);\n }\n throw new Error('RdfQuadIndex range operators only support Term, string, or number values');\n }\n const term = value as Term;\n switch (term.termType) {\n case 'NamedNode':\n case 'BlankNode':\n case 'Literal':\n return term.value;\n case 'DefaultGraph':\n return '';\n default:\n throw new Error(`RdfQuadIndex range operators do not support ${term.termType}`);\n }\n }\n\n private termOperatorNumericValue(value: unknown): number | undefined {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : undefined;\n }\n if (!value || typeof value !== 'object' || !('termType' in value)) {\n return undefined;\n }\n const term = value as Term;\n if (term.termType !== 'Literal' || !isRdfNumericDatatype(term.datatype.value)) {\n return undefined;\n }\n const parsed = rdfNumericValue(term.value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n private termKindsForPatternKey(key: PatternKey): RdfTermKind[] {\n switch (key) {\n case 'object':\n return ['iri', 'literal', 'blank'];\n case 'subject':\n return ['iri', 'blank'];\n case 'graph':\n return ['iri', 'default_graph'];\n case 'predicate':\n return ['iri'];\n default: {\n const exhaustive: never = key;\n throw new Error(`Unsupported RDF pattern key: ${exhaustive}`);\n }\n }\n }\n\n private termOperatorValueId(value: unknown, allowUnresolved: boolean): number | undefined {\n if (!value || typeof value !== 'object' || !('termType' in value)) {\n throw new Error('RdfQuadIndex only supports Term values in first-stage exact scans');\n }\n const id = this.requireDictionary().find(value as Term);\n if (id === undefined && !allowUnresolved) {\n return -1;\n }\n return id;\n }\n\n private addTextSearchCondition(\n joins: string[],\n fragments: string[],\n params: unknown[],\n queryPlan: string[],\n key: PatternKey,\n column: IndexedColumn,\n operator: RdfQueryFilterOperator,\n value: string | undefined,\n scope?: RdfConditionScope,\n ): boolean {\n if (value === undefined) {\n return false;\n }\n if (typeof value !== 'string') {\n throw new Error(`RdfQuadIndex text search ${operator} only supports string values`);\n }\n const kind = this.termKindsForPatternKey(key);\n queryPlan.push(`TextSearch(${key}${operator})`);\n const condition = this.textSearchConditionJoin(kind, column, operator, value, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n return true;\n }\n\n private prefixSearchConditionJoin(\n key: PatternKey,\n column: IndexedColumn,\n prefix: string,\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[] } {\n const kind = this.termKindsForPatternKey(key);\n const alias = this.scopedSqlName(`prefix_${column}`, scope);\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${this.scopedQuadColumn(column, scope)}`,\n sql: `${alias}.kind IN (${kind.map(() => '?').join(', ')})\n AND ${alias}.value >= ?\n AND ${alias}.value < ?`,\n params: [...kind, prefix, `${prefix}\\uffff`],\n };\n }\n\n private textSearchConditionJoin(\n kind: RdfTermKind[],\n column: IndexedColumn,\n operator: RdfQueryFilterOperator,\n value: string,\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[] } {\n const alias = this.scopedSqlName(`text_${column}_${operator.slice(1).toLowerCase()}`, scope);\n if (kind.length === 0) {\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${this.scopedQuadColumn(column, scope)}`,\n sql: '1 = 0',\n params: [],\n };\n }\n const kindPlaceholders = kind.map(() => '?').join(', ');\n const normalized = value.toLowerCase();\n const join = ` JOIN rdf_terms ${alias} ON ${alias}.id = ${this.scopedQuadColumn(column, scope)}`;\n switch (operator) {\n case '$contains':\n return {\n join,\n sql: `${alias}.kind IN (${kindPlaceholders})\n AND ${alias}.normalized_text LIKE ? ESCAPE '\\\\'\n AND instr(${alias}.value, ?) > 0`,\n params: [...kind, `%${escapeLikePattern(normalized)}%`, value],\n };\n case '$endsWith':\n return {\n join,\n sql: `${alias}.kind IN (${kindPlaceholders})\n AND ${alias}.normalized_text LIKE ? ESCAPE '\\\\'\n AND substr(${alias}.value, -length(?)) = ?`,\n params: [...kind, `%${escapeLikePattern(normalized)}`, value, value],\n };\n case '$regex':\n return this.regexTextSearchConditionJoin(kind, alias, column, value, scope);\n default:\n throw new Error(`Unsupported RDF text search operator: ${operator}`);\n }\n }\n\n private regexTextSearchConditionJoin(\n kind: RdfTermKind[],\n alias: string,\n column: IndexedColumn,\n pattern: string,\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[] } {\n const ids = this.requireDictionary().idsByNormalizedTextRegex(kind, pattern);\n const candidateTable = this.populateRegexCandidateTable(column, ids, scope);\n const candidateAlias = `${alias}_candidates`;\n const join = ` JOIN rdf_terms ${alias} ON ${alias}.id = ${this.scopedQuadColumn(column, scope)}\n JOIN ${candidateTable} ${candidateAlias} ON ${candidateAlias}.id = ${alias}.id`;\n if (ids.length === 0) {\n return { join, sql: '1 = 0', params: [] };\n }\n const kindPlaceholders = kind.map(() => '?').join(', ');\n return {\n join,\n sql: `${alias}.kind IN (${kindPlaceholders})`,\n params: kind,\n };\n }\n\n private populateRegexCandidateTable(column: IndexedColumn, ids: number[], scope?: RdfConditionScope): string {\n const tableName = this.scopedSqlName(`rdf_regex_candidates_${column}`, scope);\n this.populateCandidateTable(tableName, ids);\n return tableName;\n }\n\n private populateTermInCandidateTable(column: IndexedColumn, operator: 'in' | 'not_in', ids: number[], scope?: RdfConditionScope): string {\n const tableName = this.scopedSqlName(`rdf_term_${operator}_candidates_${column}`, scope);\n this.populateCandidateTable(tableName, ids);\n return tableName;\n }\n\n private scopedQuadColumn(column: IndexedColumn, scope?: RdfConditionScope): string {\n return `${scope?.quadAlias ?? 'rdf_quads'}.${column}`;\n }\n\n private scopedSqlName(base: string, scope?: RdfConditionScope): string {\n const name = scope?.aliasPrefix ? `${scope.aliasPrefix}_${base}` : base;\n return name.replace(/[^A-Za-z0-9_]/g, '_');\n }\n\n private buildTupleConstraintJoin(source: RdfQuadTupleConstraintSource): { join: string } {\n const columns = Array.from(new Set(source.columns));\n if (columns.length === 0) {\n return { join: '' };\n }\n\n const candidateColumns = columns.map((key) => TERM_COLUMN[key]);\n const tableName = `rdf_tuple_values_${candidateColumns.join('_')}`;\n this.populateTupleConstraintTable(tableName, columns, source.rows);\n const alias = 'tuple_values';\n const onClause = columns\n .map((key) => `${alias}.${TERM_COLUMN[key]} = rdf_quads.${TERM_COLUMN[key]}`)\n .join(' AND ');\n return {\n join: ` JOIN ${tableName} ${alias} ON ${onClause}`,\n };\n }\n\n private populateTupleConstraintTable(\n tableName: string,\n columns: PatternKey[],\n rows: RdfQuadTupleConstraintSource['rows'],\n ): void {\n const db = this.requireDb();\n const columnDefs = columns.map((key) => `${TERM_COLUMN[key]} INTEGER NOT NULL`).join(', ');\n const primaryKey = columns.map((key) => TERM_COLUMN[key]).join(', ');\n db.exec(`CREATE TEMP TABLE IF NOT EXISTS ${tableName} (${columnDefs}, PRIMARY KEY (${primaryKey}))`);\n db.prepare(`DELETE FROM ${tableName}`).run();\n\n const valueRows = rows\n .map((row) => columns.map((key) => this.termIdForTupleConstraint(row[key])))\n .filter((ids): ids is number[] => ids.every((id) => id !== undefined));\n if (valueRows.length === 0) {\n return;\n }\n\n const insertColumns = columns.map((key) => TERM_COLUMN[key]).join(', ');\n const placeholders = `(${columns.map(() => '?').join(', ')})`;\n const insert = db.prepare(`INSERT OR IGNORE INTO ${tableName} (${insertColumns}) VALUES ${placeholders}`);\n for (const valueRow of valueRows) {\n insert.run(...valueRow);\n }\n }\n\n private termIdForTupleConstraint(term: Term | undefined): number | undefined {\n if (!term) {\n return undefined;\n }\n return this.requireDictionary().find(term);\n }\n\n private populateCandidateTable(tableName: string, ids: number[]): void {\n const db = this.requireDb();\n db.exec(`CREATE TEMP TABLE IF NOT EXISTS ${tableName} (id INTEGER PRIMARY KEY)`);\n db.prepare(`DELETE FROM ${tableName}`).run();\n for (let offset = 0; offset < ids.length; offset += 500) {\n const batch = ids.slice(offset, offset + 500);\n db.prepare(`INSERT OR IGNORE INTO ${tableName} (id) VALUES ${batch.map(() => '(?)').join(', ')}`).run(...batch);\n }\n }\n\n private chooseIndex(columns: Set<IndexedColumn>): string {\n const has = (column: IndexedColumn): boolean => columns.has(column);\n if (has('graph_id') && has('subject_id')) return 'GSPO';\n if (has('graph_id') && has('predicate_id')) return 'GPOS';\n if (has('subject_id') && has('predicate_id')) return 'SPOG';\n if (has('subject_id') && has('object_id')) return 'SOPG';\n if (has('predicate_id') && has('object_id')) return 'POSG';\n if (has('object_id') && has('subject_id')) return 'OSPG';\n if (has('subject_id')) return 'SPOG';\n if (has('predicate_id')) return 'POSG';\n if (has('object_id')) return 'OSPG';\n if (has('graph_id')) return 'GSPO';\n return 'full-scan';\n }\n\n private exactTermPattern(pattern: QuintPattern): { ids: Partial<Record<PatternKey, number>>; cacheKey: string; indexChoice: string } | undefined {\n const ids: Partial<Record<PatternKey, number>> = {};\n const columns = new Set<IndexedColumn>();\n\n for (const key of TERM_KEYS) {\n const match = pattern[key];\n if (!match) {\n continue;\n }\n if (!isTerm(match as any)) {\n return undefined;\n }\n const id = this.requireDictionary().find(match as Term);\n if (id === undefined) {\n return {\n ids: { [key]: -1 },\n cacheKey: `${key}=-1`,\n indexChoice: this.chooseIndex(new Set([TERM_COLUMN[key]])),\n };\n }\n ids[key] = id;\n columns.add(TERM_COLUMN[key]);\n }\n\n return {\n ids,\n cacheKey: TERM_KEYS\n .map((key) => `${key}:${ids[key] ?? '*'}`)\n .join('|'),\n indexChoice: this.chooseIndex(columns),\n };\n }\n\n private countExactTermPattern(\n ids: Partial<Record<PatternKey, number>>,\n indexChoice: string,\n ): RdfCardinalityEstimate {\n if (Object.values(ids).some((id) => id === -1)) {\n return {\n rows: 0,\n source: 'exact-count',\n indexChoice,\n };\n }\n\n const conditions: string[] = [];\n const params: number[] = [];\n for (const key of TERM_KEYS) {\n const id = ids[key];\n if (id === undefined) {\n continue;\n }\n conditions.push(`${TERM_COLUMN[key]} = ?`);\n params.push(id);\n }\n\n const sql = `SELECT COUNT(*) AS count FROM rdf_quads${conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : ''}`;\n const row = this.requireDb().prepare<{ count: number }>(sql).get(...params);\n return {\n rows: row?.count ?? 0,\n source: 'exact-count',\n indexChoice,\n };\n }\n\n private countExactDistinctTermPattern(\n ids: Partial<Record<PatternKey, number>>,\n indexChoice: string,\n distinctKey: PatternKey,\n ): RdfCardinalityEstimate {\n if (Object.values(ids).some((id) => id === -1)) {\n return {\n rows: 0,\n source: 'exact-distinct-count',\n indexChoice,\n };\n }\n\n const conditions: string[] = [];\n const params: number[] = [];\n for (const key of TERM_KEYS) {\n const id = ids[key];\n if (id === undefined) {\n continue;\n }\n conditions.push(`${TERM_COLUMN[key]} = ?`);\n params.push(id);\n }\n\n const sql = `SELECT COUNT(DISTINCT ${TERM_COLUMN[distinctKey]}) AS count FROM rdf_quads${conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : ''}`;\n const row = this.requireDb().prepare<{ count: number }>(sql).get(...params);\n return {\n rows: row?.count ?? 0,\n source: 'exact-distinct-count',\n indexChoice,\n };\n }\n\n private countExactDistinctTupleTermPattern(\n ids: Partial<Record<PatternKey, number>>,\n indexChoice: string,\n distinctKeys: PatternKey[],\n ): RdfCardinalityEstimate {\n if (Object.values(ids).some((id) => id === -1)) {\n return {\n rows: 0,\n source: 'exact-distinct-tuple-count',\n indexChoice,\n };\n }\n\n const conditions: string[] = [];\n const params: number[] = [];\n for (const key of TERM_KEYS) {\n const id = ids[key];\n if (id === undefined) {\n continue;\n }\n conditions.push(`${TERM_COLUMN[key]} = ?`);\n params.push(id);\n }\n\n const tupleProjection = distinctKeys.map((key) => TERM_COLUMN[key]).join(', ');\n const sql = `\n SELECT COUNT(*) AS count\n FROM (\n SELECT DISTINCT ${tupleProjection}\n FROM rdf_quads${conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : ''}\n ) distinct_tuple\n `;\n const row = this.requireDb().prepare<{ count: number }>(sql).get(...params);\n return {\n rows: row?.count ?? 0,\n source: 'exact-distinct-tuple-count',\n indexChoice,\n };\n }\n\n private countDistinctPattern(pattern: QuintPattern, distinctKey: PatternKey): number {\n const { joins, whereClause, params, unresolved } = this.buildWhereClause(pattern, true);\n if (unresolved) {\n return 0;\n }\n const row = this.requireDb()\n .prepare<{ count: number }>(`SELECT COUNT(DISTINCT rdf_quads.${TERM_COLUMN[distinctKey]}) AS count FROM rdf_quads${joins}${whereClause}`)\n .get(...params);\n return row?.count ?? 0;\n }\n\n private countDistinctTuplePattern(pattern: QuintPattern, distinctKeys: PatternKey[]): number {\n const { joins, whereClause, params, unresolved } = this.buildWhereClause(pattern, true);\n if (unresolved) {\n return 0;\n }\n const tupleProjection = distinctKeys.map((key) => `rdf_quads.${TERM_COLUMN[key]}`).join(', ');\n const row = this.requireDb()\n .prepare<{ count: number }>(`\n SELECT COUNT(*) AS count\n FROM (\n SELECT DISTINCT ${tupleProjection}\n FROM rdf_quads${joins}${whereClause}\n ) distinct_tuple\n `)\n .get(...params);\n return row?.count ?? 0;\n }\n\n private buildOrderClause(options?: RdfQuadScanOptions): { joins: string; orderBy: string } {\n if (!options?.order || options.order.length === 0) {\n return { joins: '', orderBy: '' };\n }\n const columns = options.order.map((termName) => TERM_COLUMN[termName as PatternKey]);\n if (columns.some((column) => !column)) {\n throw new Error(`Unsupported RDF quad order fields: ${options.order.join(', ')}`);\n }\n const joins = options.order.map((termName, index) => {\n const column = TERM_COLUMN[termName as PatternKey];\n const direction = options.orderDirections?.[index] ?? (options.reverse ? 'desc' : 'asc');\n return {\n join: ` JOIN rdf_terms order_t${index} ON order_t${index}.id = rdf_quads.${column}`,\n order: `order_t${index}.value${direction === 'desc' ? ' DESC' : ''}`,\n };\n });\n return {\n joins: joins.map((join) => join.join).join(''),\n orderBy: ` ORDER BY ${joins.map((join) => join.order).join(', ')}`,\n };\n }\n\n private paginationParamCount(options?: QueryOptions): number {\n return (options?.limit !== undefined ? 1 : 0) + (options?.offset !== undefined ? 1 : 0);\n }\n\n private rowsToQuads(rows: RdfQuadRow[]): Quad[] {\n const dictionary = this.requireDictionary();\n const termMap = dictionary.rowsForIds(rows.flatMap((row) => [\n row.graph_id,\n row.subject_id,\n row.predicate_id,\n row.object_id,\n ]));\n\n return rows.map((row) => DataFactory.quad(\n this.requiredTerm(termMap, row.subject_id) as any,\n this.requiredTerm(termMap, row.predicate_id) as any,\n this.requiredTerm(termMap, row.object_id) as any,\n this.requiredTerm(termMap, row.graph_id) as any,\n ));\n }\n\n private requiredTerm(termMap: Map<number, Term>, id: number): Term {\n const term = termMap.get(id);\n if (!term) {\n throw new Error(`RDF term not found while reading quad index: ${id}`);\n }\n return term;\n }\n\n private metrics(\n indexChoice: string,\n matchedRows: number,\n returnedRows: number,\n start: number,\n queryPlan?: string[],\n ): RdfIndexMetrics {\n return {\n engine: 'solid-rdf',\n indexChoice,\n matchedRows,\n returnedRows,\n durationMs: Date.now() - start,\n queryPlan,\n };\n }\n\n private requireDb(): SqliteDatabase {\n if (!this.db) {\n throw new Error('RdfQuadIndex is not open');\n }\n return this.db;\n }\n\n private requireDictionary(): RdfTermDictionary {\n if (!this.dictionary) {\n throw new Error('RdfQuadIndex is not open');\n }\n return this.dictionary;\n }\n}\n\nfunction sumSpaceObjects(objects: RdfIndexSpaceObject[], kind: RdfIndexSpaceObject['kind']): number {\n return objects\n .filter((object) => object.kind === kind)\n .reduce((sum, object) => sum + object.bytes, 0);\n}\n\nfunction rdfSpaceObjectKind(name: string, schemaType?: string, tableName?: string): RdfIndexSpaceObject['kind'] {\n if (schemaType === 'table' && name.startsWith('rdf_')) {\n return 'table';\n }\n if (schemaType === 'index' && (name.startsWith('rdf_') || tableName?.startsWith('rdf_'))) {\n return 'index';\n }\n if (name.startsWith('sqlite_')) {\n return 'internal';\n }\n return 'unknown';\n}\n\nfunction rdfTermKind(term: Term): RdfTermKind {\n switch (term.termType) {\n case 'NamedNode':\n return 'iri';\n case 'BlankNode':\n return 'blank';\n case 'Literal':\n return 'literal';\n case 'DefaultGraph':\n return 'default_graph';\n default:\n return 'iri';\n }\n}\n\nfunction escapeLikePattern(value: string): string {\n return value.replace(/[\\\\%_]/g, (match) => `\\\\${match}`);\n}\n\nfunction uniqueNumbers(values: number[]): number[] {\n return [...new Set(values)];\n}\n\nfunction uniquePatternKeys(values: PatternKey[]): PatternKey[] {\n return TERM_KEYS.filter((key) => values.includes(key));\n}\n"]}
1
+ {"version":3,"file":"RdfQuadIndex.js","sourceRoot":"","sources":["../../../src/storage/rdf/RdfQuadIndex.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { DataFactory } from 'n3';\nimport type { Quad, Term } from '@rdfjs/types';\nimport { createSqliteRuntime, type SqliteDatabase } from '../SqliteRuntime';\nimport type { QueryOptions, QuintPattern, TermOperators } from '../quint/types';\nimport { isTerm } from '../quint/types';\nimport { RdfTermDictionary, rdfTermValueHead } from './RdfTermDictionary';\nimport { dropRdf3xDerivedSchemaObjects } from './Rdf3xSchema';\nimport type {\n RdfCardinalityEstimate,\n RdfCardinalityDistributions,\n RdfCardinalityTerm,\n RdfIndexStats,\n RdfLiteralDatatypeDistribution,\n RdfIndexMetrics,\n RdfIndexPutOptions,\n RdfIndexSpaceObject,\n RdfQuadJoinAggregateOptions,\n RdfQuadJoinCountOptions,\n RdfQuadJoinGroupAggregateHaving,\n RdfQuadJoinGroupAggregateOptions,\n RdfQuadJoinOptions,\n RdfQuadJoinPattern,\n RdfQuadJoinScanResult,\n RdfQueryFilterOperator,\n RdfQuadTupleConstraintSource,\n RdfQuadIndexOptions,\n RdfQuadIndexScanResult,\n RdfQuadScanOptions,\n RdfQuadRow,\n RdfQueryAggregate,\n RdfSourceInput,\n RdfSourceRow,\n RdfTermKind,\n} from './types';\nimport { isRdfNumericDatatype, rdfNumericValue } from './RdfTermSemantics';\n\nconst XSD_INTEGER = 'http://www.w3.org/2001/XMLSchema#integer';\nconst XSD_DECIMAL = 'http://www.w3.org/2001/XMLSchema#decimal';\nconst XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string';\nconst RDF_QUAD_INDEX_SCHEMA_VERSION = 1;\n\ntype IndexedColumn = 'graph_id' | 'subject_id' | 'predicate_id' | 'object_id';\ntype PatternKey = 'graph' | 'subject' | 'predicate' | 'object';\n\ninterface RdfWhereClause {\n joins: string;\n whereClause: string;\n params: unknown[];\n indexHint: string;\n queryPlan: string[];\n unresolved?: PatternKey;\n}\n\ninterface RdfCondition {\n joins: string[];\n sql?: string;\n params: unknown[];\n equality?: boolean;\n queryPlan: string[];\n unresolved?: boolean;\n}\n\ninterface RdfConditionScope {\n quadAlias?: string;\n aliasPrefix?: string;\n}\n\nconst TERM_COLUMN: Record<PatternKey, IndexedColumn> = {\n graph: 'graph_id',\n subject: 'subject_id',\n predicate: 'predicate_id',\n object: 'object_id',\n};\n\nconst TERM_KEYS: PatternKey[] = ['graph', 'subject', 'predicate', 'object'];\nconst TERM_IN_JOIN_THRESHOLD = 64;\nexport class RdfQuadIndex {\n private readonly sqliteRuntime = createSqliteRuntime();\n private db: SqliteDatabase | null = null;\n private dictionary: RdfTermDictionary | null = null;\n private readonly cardinalityCache = new Map<string, RdfCardinalityEstimate>();\n\n public constructor(private readonly options: RdfQuadIndexOptions) {}\n\n public open(): void {\n if (this.db) {\n return;\n }\n\n if (this.options.path !== ':memory:') {\n const dir = dirname(this.options.path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n this.db = this.sqliteRuntime.openDatabase(this.options.path);\n this.prepareSchemaVersion();\n this.dictionary = new RdfTermDictionary(this.db);\n this.dictionary.initialize();\n this.initializeSchema();\n }\n\n public close(): void {\n this.db?.close();\n this.db = null;\n this.dictionary = null;\n }\n\n public clear(): void {\n const db = this.requireDb();\n db.exec('DELETE FROM rdf_quads; DELETE FROM rdf_sources; DELETE FROM rdf_terms;');\n this.cardinalityCache.clear();\n this.bumpDataVersion();\n }\n\n public put(quad: Quad, options?: RdfIndexPutOptions): void {\n this.multiPut([quad], options);\n }\n\n public replaceSource(quads: Quad[], source: RdfSourceInput): void {\n const db = this.requireDb();\n db.transaction(() => {\n this.deleteSourceInternal(source.source);\n if (quads.length > 0) {\n this.insertQuads(quads, { source });\n } else {\n this.upsertSource(source);\n }\n })();\n this.cardinalityCache.clear();\n this.bumpDataVersion();\n }\n\n public deleteSource(source: string): number {\n const result = this.deleteSourceInternal(source);\n if (result > 0) {\n this.cardinalityCache.clear();\n this.bumpDataVersion();\n }\n return result;\n }\n\n private deleteSourceInternal(source: string): number {\n const db = this.requireDb();\n const row = db\n .prepare<{ id: number }>('SELECT id FROM rdf_sources WHERE source = ?')\n .get(source);\n if (!row) {\n return 0;\n }\n\n const result = db.prepare('DELETE FROM rdf_quads WHERE source_file_id = ?').run(row.id);\n db.prepare('DELETE FROM rdf_sources WHERE id = ?').run(row.id);\n return result.changes;\n }\n\n public multiPut(quads: Quad[], options?: RdfIndexPutOptions): void {\n if (quads.length === 0) {\n return;\n }\n\n const db = this.requireDb();\n db.transaction(() => {\n this.insertQuads(quads, options);\n })();\n this.cardinalityCache.clear();\n this.bumpDataVersion();\n }\n\n private insertQuads(quads: Quad[], options?: RdfIndexPutOptions): void {\n const db = this.requireDb();\n const dictionary = this.requireDictionary();\n const sourceId = options?.source ? this.upsertSource(options.source) : null;\n const insert = db.prepare(`\n INSERT INTO rdf_quads (\n graph_id,\n subject_id,\n predicate_id,\n object_id,\n source_file_id,\n source_line_no\n )\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT (graph_id, subject_id, predicate_id, object_id)\n DO UPDATE SET\n source_file_id = excluded.source_file_id,\n source_line_no = excluded.source_line_no\n `);\n\n for (const quad of quads) {\n insert.run(\n dictionary.getOrCreate(quad.graph),\n dictionary.getOrCreate(quad.subject),\n dictionary.getOrCreate(quad.predicate),\n dictionary.getOrCreate(quad.object),\n sourceId,\n options?.sourceLineNo ?? null,\n );\n }\n }\n\n public delete(pattern: QuintPattern): number {\n const changes = this.deleteInternal(pattern);\n if (changes > 0) {\n this.cardinalityCache.clear();\n this.bumpDataVersion();\n }\n return changes;\n }\n\n public applyDelta(deletes: QuintPattern[], inserts: Quad[], options?: RdfIndexPutOptions): { deletedRows: number; insertedRows: number } {\n if (deletes.length === 0 && inserts.length === 0) {\n return { deletedRows: 0, insertedRows: 0 };\n }\n\n const db = this.requireDb();\n let deletedRows = 0;\n db.transaction(() => {\n for (const pattern of deletes) {\n deletedRows += this.deleteInternal(pattern);\n }\n if (inserts.length > 0) {\n this.insertQuads(inserts, options);\n }\n })();\n if (deletedRows > 0 || inserts.length > 0) {\n this.cardinalityCache.clear();\n this.bumpDataVersion();\n }\n return {\n deletedRows,\n insertedRows: inserts.length,\n };\n }\n\n private deleteInternal(pattern: QuintPattern): number {\n const db = this.requireDb();\n const { joins, whereClause, params } = this.buildWhereClause(pattern, false);\n if (!whereClause) {\n const result = db.prepare('DELETE FROM rdf_quads').run();\n return result.changes;\n }\n const sql = joins\n ? `DELETE FROM rdf_quads WHERE rowid IN (SELECT rdf_quads.rowid FROM rdf_quads${joins}${whereClause})`\n : `DELETE FROM rdf_quads${whereClause}`;\n return db.prepare(sql).run(...params).changes;\n }\n\n public dataVersion(): number {\n const row = this.requireDb()\n .prepare<{ value: string }>(\"SELECT value FROM rdf_index_metadata WHERE key = 'data_version'\")\n .get();\n return Number(row?.value ?? 0) || 0;\n }\n\n public scan(pattern: QuintPattern, options?: RdfQuadScanOptions): RdfQuadIndexScanResult {\n return this.scanInternal(pattern, options);\n }\n\n public scanWithTupleConstraints(\n pattern: QuintPattern,\n tupleSource: RdfQuadTupleConstraintSource,\n options?: RdfQuadScanOptions,\n ): RdfQuadIndexScanResult {\n return this.scanInternal(pattern, options, tupleSource);\n }\n\n public joinPatterns(patterns: RdfQuadJoinPattern[], options?: RdfQuadJoinOptions): RdfQuadJoinScanResult {\n const start = Date.now();\n if (patterns.length === 0) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, ['JoinBGP(empty)']),\n };\n }\n\n const compiled = this.compileJoinPatterns(patterns, options);\n if (compiled.unresolved) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, [...compiled.queryPlan, `unresolved ${compiled.unresolved}`]),\n };\n }\n\n const rows = this.requireDb().prepare<Record<string, number>>(compiled.sql).all(...compiled.params);\n const matchedRows = compiled.countSql\n ? this.requireDb().prepare<{ count: number }>(compiled.countSql).get(...compiled.countParams)?.count ?? 0\n : rows.length;\n return {\n bindings: this.joinRowsToBindings(rows, compiled.variableAliases),\n metrics: this.metrics(\n compiled.indexChoice,\n matchedRows,\n rows.length,\n start,\n [...compiled.queryPlan, compiled.sql],\n ),\n };\n }\n\n public countJoinPatterns(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinCountOptions,\n ): RdfQuadJoinScanResult {\n return this.aggregateJoinPatternsInternal(patterns, options, 'JoinCount');\n }\n\n public aggregateJoinPatterns(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinAggregateOptions,\n ): RdfQuadJoinScanResult {\n return this.aggregateJoinPatternsInternal(patterns, options, 'JoinAggregate');\n }\n\n private aggregateJoinPatternsInternal(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinAggregateOptions,\n label: 'JoinCount' | 'JoinAggregate',\n ): RdfQuadJoinScanResult {\n const start = Date.now();\n if (patterns.length === 0) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, [`${label}(empty)`]),\n };\n }\n\n const compiled = this.compileJoinPatterns(patterns);\n if (compiled.unresolved) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, [...compiled.queryPlan, `unresolved ${compiled.unresolved}`]),\n };\n }\n\n const aggregateAliases = new Map<string, string>();\n const aggregateTypes = new Map<string, 'integer' | 'decimal'>();\n const numericJoins = new Map<string, string>();\n const numericJoinSql: string[] = [];\n const projection = options.aggregates.map((aggregate, index) => {\n const alias = `a${index}`;\n aggregateAliases.set(aggregate.as, alias);\n return this.buildJoinAggregateColumn(\n aggregate,\n alias,\n compiled.variableColumns,\n aggregateTypes,\n numericJoins,\n numericJoinSql,\n 'RDF BGP',\n );\n }).join(', ');\n const aggregateJoins = numericJoinSql.join('');\n const sql = `SELECT ${projection} FROM ${compiled.from}${compiled.joins}${aggregateJoins}${compiled.whereClause}`;\n const rows = this.requireDb().prepare<Record<string, number>>(sql).all(...compiled.params);\n const matchedRows = this.requireDb()\n .prepare<{ count: number }>(`SELECT COUNT(*) AS count FROM ${compiled.from}${compiled.joins}${aggregateJoins}${compiled.whereClause}`)\n .get(...compiled.params)?.count ?? 0;\n return {\n bindings: this.joinRowsToBindings(rows, compiled.variableAliases, aggregateAliases, aggregateTypes),\n metrics: this.metrics(\n compiled.indexChoice,\n matchedRows,\n rows.length,\n start,\n [\n ...compiled.queryPlan,\n ...(numericJoinSql.length > 0 ? [`JoinAggregateNumeric(${[...numericJoins.keys()].map((variableName) => `?${variableName}`).join(',')})`] : []),\n `${label}(${options.aggregates.map((aggregate) => (\n `${aggregate.type}${aggregate.distinct ? ':DISTINCT' : ''}(${aggregate.variable ? `?${aggregate.variable}` : '*'})`\n )).join(',')})`,\n sql,\n ],\n ),\n };\n }\n\n public groupCountJoinPatterns(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinGroupAggregateOptions,\n ): RdfQuadJoinScanResult {\n return this.groupAggregateJoinPatternsInternal(patterns, options, 'JoinGroupCount');\n }\n\n public groupAggregateJoinPatterns(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinGroupAggregateOptions,\n ): RdfQuadJoinScanResult {\n return this.groupAggregateJoinPatternsInternal(patterns, options, 'JoinGroupAggregate');\n }\n\n private groupAggregateJoinPatternsInternal(\n patterns: RdfQuadJoinPattern[],\n options: RdfQuadJoinGroupAggregateOptions,\n label: 'JoinGroupCount' | 'JoinGroupAggregate',\n ): RdfQuadJoinScanResult {\n const start = Date.now();\n if (patterns.length === 0) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, [`${label}(empty)`]),\n };\n }\n\n const compiled = this.compileJoinPatterns(patterns);\n if (compiled.unresolved) {\n return {\n bindings: [],\n metrics: this.metrics('none', 0, 0, start, [...compiled.queryPlan, `unresolved ${compiled.unresolved}`]),\n };\n }\n\n const aggregateAliases = new Map<string, string>();\n const aggregateSqlAliases = new Map<string, string>();\n const aggregateTypes = new Map<string, 'integer' | 'decimal'>();\n const numericJoins = new Map<string, string>();\n const numericJoinSql: string[] = [];\n const groupColumns = options.groupBy.map((variableName) => {\n const column = compiled.variableColumns.get(variableName);\n if (!column) {\n throw new Error(`RDF BGP group aggregate cannot group by unbound variable: ${variableName}`);\n }\n return column;\n });\n const aggregateColumns = options.aggregates.map((aggregate, index) => {\n const alias = `a${index}`;\n aggregateAliases.set(aggregate.as, alias);\n aggregateSqlAliases.set(aggregate.as, alias);\n return this.buildJoinAggregateColumn(\n aggregate,\n alias,\n compiled.variableColumns,\n aggregateTypes,\n numericJoins,\n numericJoinSql,\n 'RDF BGP group aggregate',\n );\n });\n const projection = [\n ...options.groupBy.map((variableName) => {\n const alias = compiled.variableAliases.get(variableName);\n const column = compiled.variableColumns.get(variableName);\n if (!alias || !column) {\n throw new Error(`RDF BGP group aggregate cannot project unbound group variable: ${variableName}`);\n }\n return `${column} AS ${alias}`;\n }),\n ...aggregateColumns,\n ].join(', ');\n const groupBy = groupColumns.join(', ');\n const aggregateJoins = numericJoinSql.join('');\n const havingClause = this.buildGroupAggregateHavingClause(options.having, aggregateSqlAliases);\n const orderScope = this.buildGroupAggregateOrderScope(options, compiled.variableColumns, aggregateSqlAliases);\n const fromSql = `${compiled.from}${compiled.joins}${aggregateJoins}${compiled.whereClause}`;\n const sourceFromSql = `${compiled.from}${compiled.joins}${aggregateJoins}${orderScope.joins}${compiled.whereClause}`;\n const sourceSql = `SELECT ${projection} FROM ${sourceFromSql} GROUP BY ${groupBy}${havingClause.sql}`;\n const orderClause = orderScope.orderBy;\n let sql = `${sourceSql}${orderClause}`;\n const params = [...compiled.params, ...havingClause.params];\n const paginated = options.limit !== undefined || options.offset !== undefined;\n if (options.limit !== undefined) {\n sql += ' LIMIT ?';\n params.push(options.limit);\n }\n if (options.offset !== undefined) {\n if (options.limit === undefined) {\n sql += ' LIMIT -1';\n }\n sql += ' OFFSET ?';\n params.push(options.offset);\n }\n const rows = this.requireDb().prepare<Record<string, number>>(sql).all(...params);\n const matchedRows = this.requireDb()\n .prepare<{ count: number }>(`SELECT COUNT(*) AS count FROM ${fromSql}`)\n .get(...compiled.params)?.count ?? 0;\n return {\n bindings: this.joinRowsToBindings(rows, compiled.variableAliases, aggregateAliases, aggregateTypes),\n metrics: this.metrics(\n compiled.indexChoice,\n matchedRows,\n rows.length,\n start,\n [\n ...compiled.queryPlan,\n ...(numericJoinSql.length > 0 ? [`JoinGroupAggregateNumeric(${[...numericJoins.keys()].map((variableName) => `?${variableName}`).join(',')})`] : []),\n `${label}(${options.groupBy.map((variableName) => `?${variableName}`).join(',')})`,\n ...(havingClause.sql ? [`${label}Having(${(options.having ?? []).map((entry) => `${entry.aggregate}${entry.operator}`).join(',')})`] : []),\n ...(orderClause ? [`${label}Order(${(options.orderBy ?? []).map((entry) => `${entry.direction ?? 'asc'}:${entry.variable}`).join(',')})`] : []),\n ...(paginated ? [`${label}Limit`] : []),\n sql,\n ],\n ),\n };\n }\n\n private scanInternal(\n pattern: QuintPattern,\n options?: RdfQuadScanOptions,\n tupleSource?: RdfQuadTupleConstraintSource,\n ): RdfQuadIndexScanResult {\n const start = Date.now();\n const { joins, whereClause, params, indexHint, queryPlan, unresolved } = this.buildWhereClause(pattern, true);\n if (unresolved) {\n return {\n quads: [],\n metrics: this.metrics(indexHint, 0, 0, start, [...queryPlan, `unresolved ${unresolved}`]),\n };\n }\n\n const orderClause = this.buildOrderClause(options);\n const tupleJoin = tupleSource ? this.buildTupleConstraintJoin(tupleSource) : undefined;\n let sql = `SELECT rdf_quads.graph_id, rdf_quads.subject_id, rdf_quads.predicate_id, rdf_quads.object_id, rdf_quads.source_file_id, rdf_quads.source_line_no FROM rdf_quads${joins}${tupleJoin?.join ?? ''}${orderClause.joins}`;\n if (whereClause) {\n sql += whereClause;\n }\n\n if (orderClause.orderBy) {\n sql += orderClause.orderBy;\n }\n\n if (options?.limit !== undefined) {\n sql += ' LIMIT ?';\n params.push(options.limit);\n }\n if (options?.offset !== undefined) {\n if (options.limit === undefined) {\n sql += ' LIMIT -1';\n }\n sql += ' OFFSET ?';\n params.push(options.offset);\n }\n\n const countSql = `SELECT COUNT(*) AS count FROM rdf_quads${joins}${tupleJoin?.join ?? ''}${orderClause.joins}${whereClause}`;\n const countParams = [...params.slice(0, params.length - this.paginationParamCount(options))];\n const countRow = this.requireDb().prepare<{ count: number }>(countSql).get(...countParams);\n const matchedRows = countRow?.count ?? 0;\n const rows = this.requireDb().prepare<RdfQuadRow>(sql).all(...params);\n return {\n quads: this.rowsToQuads(rows),\n metrics: this.metrics(indexHint, matchedRows, rows.length, start, [\n ...queryPlan,\n ...(tupleJoin ? [`TupleValuesJoin(${tupleSource?.columns.join(',')})`] : []),\n sql,\n ]),\n };\n }\n\n private compileJoinPatterns(patterns: RdfQuadJoinPattern[], options?: RdfQuadJoinOptions): {\n from: string;\n joins: string;\n whereClause: string;\n sql: string;\n params: unknown[];\n countSql?: string;\n countParams: unknown[];\n indexChoice: string;\n queryPlan: string[];\n variableColumns: Map<string, string>;\n variableAliases: Map<string, string>;\n unresolved?: PatternKey;\n } {\n const from = 'rdf_quads q0';\n const joins: string[] = [];\n const conditions: string[] = [];\n const params: unknown[] = [];\n const queryPlan: string[] = [`JoinBGP(${patterns.length})`];\n const variableColumns = new Map<string, string>();\n const variableAliases = new Map<string, string>();\n const indexChoices: string[] = [];\n\n for (const [patternIndex, entry] of patterns.entries()) {\n const alias = `q${patternIndex}`;\n if (patternIndex > 0) {\n joins.push(` JOIN rdf_quads ${alias} ON 1 = 1`);\n }\n const equalityColumns = new Set<IndexedColumn>();\n\n for (const key of TERM_KEYS) {\n const match = entry.pattern[key];\n const column = `${alias}.${TERM_COLUMN[key]}`;\n const variableName = entry.variables[key];\n if (variableName) {\n const existingColumn = variableColumns.get(variableName);\n if (existingColumn) {\n conditions.push(`${existingColumn} = ${column}`);\n } else {\n variableColumns.set(variableName, column);\n }\n }\n if (!match) {\n continue;\n }\n const condition = this.matchToJoinCondition(key, alias, TERM_COLUMN[key], match, true);\n if (condition.unresolved) {\n return {\n from,\n joins: joins.join(''),\n whereClause: '',\n sql: '',\n params: [],\n countParams: [],\n indexChoice: 'none',\n queryPlan,\n variableColumns,\n variableAliases,\n unresolved: key,\n };\n }\n joins.push(...condition.joins);\n if (condition.sql) {\n conditions.push(condition.sql);\n params.push(...condition.params);\n }\n queryPlan.push(...condition.queryPlan);\n if (condition.equality) {\n equalityColumns.add(TERM_COLUMN[key]);\n }\n }\n indexChoices.push(this.chooseIndex(equalityColumns));\n }\n\n const projectVariables = options?.project ?? [...variableColumns.keys()];\n const projectionColumns = projectVariables.map((variableName) => {\n const column = variableColumns.get(variableName);\n if (!column) {\n throw new Error(`RDF BGP join cannot project unbound variable: ${variableName}`);\n }\n const columnAlias = `v${variableAliases.size}`;\n variableAliases.set(variableName, columnAlias);\n return `${column} AS ${columnAlias}`;\n });\n const projection = projectionColumns.length > 0\n ? `${options?.distinct ? 'DISTINCT ' : ''}${projectionColumns.join(', ')}`\n : `${options?.distinct ? 'DISTINCT ' : ''}1 AS __empty`;\n const orderClause = this.buildJoinOrderClause(options, variableColumns);\n const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';\n let sql = `SELECT ${projection} FROM ${from}${joins.join('')}${orderClause.joins}${whereClause}${orderClause.orderBy}`;\n const sqlParams = [...params];\n const paginated = options?.limit !== undefined || options?.offset !== undefined;\n const countMatchedRows = options?.countMatchedRows ?? true;\n if (options?.limit !== undefined) {\n sql += ' LIMIT ?';\n sqlParams.push(options.limit);\n }\n if (options?.offset !== undefined) {\n if (options.limit === undefined) {\n sql += ' LIMIT -1';\n }\n sql += ' OFFSET ?';\n sqlParams.push(options.offset);\n }\n if (orderClause.orderBy) {\n queryPlan.push(`JoinOrder(${(options?.orderBy ?? []).map((entry) => `${entry.direction ?? 'asc'}:${entry.variable}`).join(',')})`);\n }\n if (options?.distinct) {\n queryPlan.push(`JoinDistinct(${projectVariables.map((variableName) => `?${variableName}`).join(',')})`);\n }\n if (paginated) {\n queryPlan.push('JoinLimit');\n }\n return {\n from,\n joins: joins.join(''),\n whereClause,\n sql,\n params: sqlParams,\n countSql: paginated && countMatchedRows ? `SELECT COUNT(*) AS count FROM ${from}${joins.join('')}${whereClause}` : undefined,\n countParams: params,\n indexChoice: `JoinBGP(${indexChoices.join('>')})`,\n queryPlan,\n variableColumns,\n variableAliases,\n };\n }\n\n private buildJoinOrderClause(\n options: RdfQuadJoinOptions | undefined,\n variableColumns: Map<string, string>,\n ): { joins: string; orderBy: string } {\n if (!options?.orderBy || options.orderBy.length === 0) {\n return { joins: '', orderBy: '' };\n }\n\n const joins = options.orderBy.map((entry, index) => {\n const column = variableColumns.get(entry.variable);\n if (!column) {\n throw new Error(`RDF BGP join cannot order by unbound variable: ${entry.variable}`);\n }\n const alias = `join_order_t${index}`;\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${column}`,\n order: `${alias}.value${entry.direction === 'desc' ? ' DESC' : ''}`,\n };\n });\n return {\n joins: joins.map((entry) => entry.join).join(''),\n orderBy: ` ORDER BY ${joins.map((entry) => entry.order).join(', ')}`,\n };\n }\n\n private buildJoinAggregateColumn(\n aggregate: RdfQueryAggregate,\n alias: string,\n variableColumns: Map<string, string>,\n aggregateTypes: Map<string, 'integer' | 'decimal'>,\n numericJoins: Map<string, string>,\n numericJoinSql: string[],\n errorPrefix: string,\n ): string {\n if (aggregate.type === 'count' && !aggregate.variable) {\n aggregateTypes.set(aggregate.as, 'integer');\n return `${aggregate.distinct ? `COUNT(DISTINCT ${joinSolutionMappingKeyExpression(variableColumns, aggregate.distinctVariables, errorPrefix)})` : 'COUNT(*)'} AS ${alias}`;\n }\n if (!aggregate.variable) {\n throw new Error(`${errorPrefix} ${aggregate.type} aggregate requires a bound variable`);\n }\n const column = variableColumns.get(aggregate.variable);\n if (!column) {\n throw new Error(`${errorPrefix} aggregate cannot read unbound variable: ${aggregate.variable}`);\n }\n if (aggregate.type === 'count') {\n aggregateTypes.set(aggregate.as, 'integer');\n return `COUNT(${aggregate.distinct ? 'DISTINCT ' : ''}${column}) AS ${alias}`;\n }\n if (aggregate.distinct) {\n throw new Error(`${errorPrefix} ${aggregate.type} DISTINCT aggregate is not supported in SQL aggregate path`);\n }\n aggregateTypes.set(aggregate.as, 'decimal');\n const termAlias = numericJoins.get(aggregate.variable) ?? `agg_numeric_t${numericJoins.size}`;\n if (!numericJoins.has(aggregate.variable)) {\n numericJoins.set(aggregate.variable, termAlias);\n numericJoinSql.push(` JOIN rdf_terms ${termAlias} ON ${termAlias}.id = ${column} AND ${termAlias}.kind = 'literal' AND ${termAlias}.numeric_value IS NOT NULL`);\n }\n switch (aggregate.type) {\n case 'sum':\n return `COALESCE(SUM(${termAlias}.numeric_value), 0) AS ${alias}`;\n case 'avg':\n return `AVG(${termAlias}.numeric_value) AS ${alias}`;\n case 'min':\n return `MIN(${termAlias}.numeric_value) AS ${alias}`;\n case 'max':\n return `MAX(${termAlias}.numeric_value) AS ${alias}`;\n default: {\n const exhaustive: never = aggregate.type;\n throw new Error(`Unsupported RDF BGP aggregate type: ${exhaustive}`);\n }\n }\n }\n\n private buildGroupCountHavingClause(\n having: RdfQuadJoinGroupAggregateHaving[] | undefined,\n aggregateAliases: Map<string, string>,\n ): { sql: string; params: number[] } {\n return this.buildGroupAggregateHavingClause(having, aggregateAliases);\n }\n\n private buildGroupAggregateHavingClause(\n having: RdfQuadJoinGroupAggregateHaving[] | undefined,\n aggregateAliases: Map<string, string>,\n ): { sql: string; params: number[] } {\n if (!having || having.length === 0) {\n return { sql: '', params: [] };\n }\n\n const conditions: string[] = [];\n const params: number[] = [];\n for (const entry of having) {\n const alias = aggregateAliases.get(entry.aggregate);\n if (!alias) {\n throw new Error(`RDF BGP group count cannot HAVING on unknown aggregate: ${entry.aggregate}`);\n }\n conditions.push(`${alias} ${this.havingSqlOperator(entry.operator)} ?`);\n params.push(entry.value);\n }\n return {\n sql: ` HAVING ${conditions.join(' AND ')}`,\n params,\n };\n }\n\n private havingSqlOperator(operator: RdfQuadJoinGroupAggregateHaving['operator']): string {\n switch (operator) {\n case '$eq':\n return '=';\n case '$ne':\n return '!=';\n case '$gt':\n return '>';\n case '$gte':\n return '>=';\n case '$lt':\n return '<';\n case '$lte':\n return '<=';\n default: {\n const exhaustive: never = operator;\n throw new Error(`Unsupported RDF BGP group count HAVING operator: ${exhaustive}`);\n }\n }\n }\n\n private buildGroupCountOrderScope(\n options: RdfQuadJoinGroupAggregateOptions,\n variableColumns: Map<string, string>,\n aggregateAliases: Map<string, string>,\n ): { joins: string; orderBy: string } {\n return this.buildGroupAggregateOrderScope(options, variableColumns, aggregateAliases);\n }\n\n private buildGroupAggregateOrderScope(\n options: RdfQuadJoinGroupAggregateOptions,\n variableColumns: Map<string, string>,\n aggregateAliases: Map<string, string>,\n ): { joins: string; orderBy: string } {\n if (!options.orderBy || options.orderBy.length === 0) {\n return { joins: '', orderBy: '' };\n }\n\n const joins: string[] = [];\n const orders = options.orderBy.map((entry, index) => {\n const aggregateAlias = aggregateAliases.get(entry.variable);\n if (aggregateAlias) {\n return `${aggregateAlias}${entry.direction === 'desc' ? ' DESC' : ''}`;\n }\n const column = variableColumns.get(entry.variable);\n if (!column) {\n throw new Error(`RDF BGP group count cannot order by unbound variable: ${entry.variable}`);\n }\n const alias = `group_order_t${index}`;\n joins.push(` JOIN rdf_terms ${alias} ON ${alias}.id = ${column}`);\n return `${alias}.value${entry.direction === 'desc' ? ' DESC' : ''}`;\n });\n return {\n joins: joins.join(''),\n orderBy: ` ORDER BY ${orders.join(', ')}`,\n };\n }\n\n private matchToJoinCondition(\n key: PatternKey,\n alias: string,\n columnName: IndexedColumn,\n match: unknown,\n allowUnresolved: boolean,\n ): RdfCondition {\n return this.matchToCondition(key, columnName, match, allowUnresolved, {\n quadAlias: alias,\n aliasPrefix: alias,\n });\n }\n\n private joinRowsToBindings(\n rows: Array<Record<string, number>>,\n variableAliases: Map<string, string>,\n aggregateAliases?: Map<string, string>,\n aggregateTypes?: Map<string, 'integer' | 'decimal'>,\n ): RdfQuadJoinScanResult['bindings'] {\n const aliases = [...variableAliases.entries()];\n const termMap = this.requireDictionary().rowsForIds(rows.flatMap((row) => (\n aliases\n .map(([, alias]) => row[alias])\n .filter((id): id is number => typeof id === 'number')\n )));\n\n return rows.map((row) => {\n const binding: RdfQuadJoinScanResult['bindings'][number] = {};\n for (const [variableName, alias] of aliases) {\n const id = row[alias];\n if (typeof id !== 'number') {\n continue;\n }\n binding[variableName] = this.requiredTerm(termMap, id);\n }\n for (const [variableName, alias] of aggregateAliases ?? []) {\n const value = row[alias];\n if (typeof value === 'number') {\n const datatype = aggregateTypes?.get(variableName) === 'decimal' ? XSD_DECIMAL : XSD_INTEGER;\n binding[variableName] = DataFactory.literal(String(value), DataFactory.namedNode(datatype)) as Term;\n }\n }\n return binding;\n });\n }\n\n public count(pattern: QuintPattern): number {\n const { joins, whereClause, params, unresolved } = this.buildWhereClause(pattern, true);\n if (unresolved) {\n return 0;\n }\n const row = this.requireDb()\n .prepare<{ count: number }>(`SELECT COUNT(*) AS count FROM rdf_quads${joins}${whereClause}`)\n .get(...params);\n return row?.count ?? 0;\n }\n\n public estimateCardinality(pattern: QuintPattern): RdfCardinalityEstimate {\n const exact = this.exactTermPattern(pattern);\n if (!exact) {\n return {\n rows: this.count(pattern),\n source: 'exact-count',\n indexChoice: this.buildWhereClause(pattern, true).indexHint,\n };\n }\n\n const cacheKey = exact.cacheKey;\n const cached = this.cardinalityCache.get(cacheKey);\n if (cached) {\n return {\n ...cached,\n source: 'cached-exact-count',\n };\n }\n\n const estimate = this.countExactTermPattern(exact.ids, exact.indexChoice);\n this.cardinalityCache.set(cacheKey, estimate);\n return estimate;\n }\n\n public countDistinct(pattern: QuintPattern, distinctKey: PatternKey): RdfCardinalityEstimate {\n const exact = this.exactTermPattern(pattern);\n if (!exact) {\n const count = this.countDistinctPattern(pattern, distinctKey);\n return {\n rows: count,\n source: 'exact-distinct-count',\n indexChoice: this.buildWhereClause(pattern, true).indexHint,\n };\n }\n\n const cacheKey = `distinct:${distinctKey}|${exact.cacheKey}`;\n const cached = this.cardinalityCache.get(cacheKey);\n if (cached) {\n return {\n ...cached,\n source: 'cached-exact-distinct-count',\n };\n }\n\n const estimate = this.countExactDistinctTermPattern(exact.ids, exact.indexChoice, distinctKey);\n this.cardinalityCache.set(cacheKey, estimate);\n return estimate;\n }\n\n public countDistinctTuple(pattern: QuintPattern, distinctKeys: PatternKey[]): RdfCardinalityEstimate {\n const keys = uniquePatternKeys(distinctKeys);\n if (keys.length === 0) {\n return this.estimateCardinality(pattern);\n }\n if (keys.length === 1) {\n return this.countDistinct(pattern, keys[0]);\n }\n\n const exact = this.exactTermPattern(pattern);\n if (!exact) {\n const count = this.countDistinctTuplePattern(pattern, keys);\n return {\n rows: count,\n source: 'exact-distinct-tuple-count',\n indexChoice: this.buildWhereClause(pattern, true).indexHint,\n };\n }\n\n const cacheKey = `distinct-tuple:${keys.join(',')}|${exact.cacheKey}`;\n const cached = this.cardinalityCache.get(cacheKey);\n if (cached) {\n return {\n ...cached,\n source: 'cached-exact-distinct-tuple-count',\n };\n }\n\n const estimate = this.countExactDistinctTupleTermPattern(exact.ids, exact.indexChoice, keys);\n this.cardinalityCache.set(cacheKey, estimate);\n return estimate;\n }\n\n public stats(): RdfIndexStats {\n const db = this.requireDb();\n const spaceObjects = this.collectSpaceObjects();\n const databaseBytes = this.estimateDatabaseBytes();\n const accountedBytes = spaceObjects.reduce((sum, object) => sum + object.bytes, 0);\n return {\n termCount: this.requireDictionary().count(),\n quadCount: db.prepare<{ count: number }>('SELECT COUNT(*) AS count FROM rdf_quads').get()?.count ?? 0,\n sourceCount: db.prepare<{ count: number }>('SELECT COUNT(*) AS count FROM rdf_sources').get()?.count ?? 0,\n graphCount: db.prepare<{ count: number }>('SELECT COUNT(DISTINCT graph_id) AS count FROM rdf_quads').get()?.count ?? 0,\n databaseBytes: accountedBytes || databaseBytes,\n tableBytes: sumSpaceObjects(spaceObjects, 'table'),\n indexBytes: sumSpaceObjects(spaceObjects, 'index'),\n spaceObjects,\n serializedTermTextBytes: this.estimateSerializedTextBytes(),\n literalDatatypeDistribution: this.literalDatatypeDistribution(),\n cardinalityDistributions: this.cardinalityDistributions(),\n };\n }\n\n public cardinalityDistributions(limit = 100): RdfCardinalityDistributions {\n return {\n graphs: this.graphCardinalityDistribution(limit),\n predicates: this.predicateCardinalityDistribution(limit),\n predicateObjects: this.predicateObjectCardinalityDistribution(limit),\n subjectPredicates: this.subjectPredicateCardinalityDistribution(limit),\n };\n }\n\n public literalDatatypeDistribution(): RdfLiteralDatatypeDistribution[] {\n const rows = this.requireDb().prepare<{\n datatype: string | null;\n term_count: number;\n object_quad_count: number | null;\n }>(`\n SELECT\n COALESCE(datatype.value, 'http://www.w3.org/2001/XMLSchema#string') AS datatype,\n COUNT(DISTINCT literal.id) AS term_count,\n COUNT(quad.object_id) AS object_quad_count\n FROM rdf_terms literal\n LEFT JOIN rdf_terms datatype ON datatype.id = literal.datatype_id\n LEFT JOIN rdf_quads quad ON quad.object_id = literal.id\n WHERE literal.kind = 'literal'\n GROUP BY datatype\n ORDER BY object_quad_count DESC, term_count DESC, datatype ASC\n `).all();\n return rows.map((row) => ({\n datatype: row.datatype ?? 'http://www.w3.org/2001/XMLSchema#string',\n termCount: row.term_count,\n objectQuadCount: row.object_quad_count ?? 0,\n }));\n }\n\n private graphCardinalityDistribution(limit: number): RdfCardinalityDistributions['graphs'] {\n const rows = this.requireDb().prepare<{\n graph_id: number;\n quad_count: number;\n distinct_subjects: number;\n distinct_predicates: number;\n distinct_objects: number;\n }>(`\n SELECT\n graph_id,\n COUNT(*) AS quad_count,\n COUNT(DISTINCT subject_id) AS distinct_subjects,\n COUNT(DISTINCT predicate_id) AS distinct_predicates,\n COUNT(DISTINCT object_id) AS distinct_objects\n FROM rdf_quads\n GROUP BY graph_id\n ORDER BY quad_count DESC, graph_id ASC\n LIMIT ?\n `).all(limit);\n const termMap = this.requireDictionary().rowsForIds(rows.map((row) => row.graph_id));\n return rows.map((row) => ({\n graph: this.cardinalityTerm(termMap, row.graph_id),\n quadCount: row.quad_count,\n distinctSubjects: row.distinct_subjects,\n distinctPredicates: row.distinct_predicates,\n distinctObjects: row.distinct_objects,\n }));\n }\n\n private predicateCardinalityDistribution(limit: number): RdfCardinalityDistributions['predicates'] {\n const rows = this.requireDb().prepare<{\n predicate_id: number;\n quad_count: number;\n graph_count: number;\n distinct_subjects: number;\n distinct_objects: number;\n }>(`\n SELECT\n predicate_id,\n COUNT(*) AS quad_count,\n COUNT(DISTINCT graph_id) AS graph_count,\n COUNT(DISTINCT subject_id) AS distinct_subjects,\n COUNT(DISTINCT object_id) AS distinct_objects\n FROM rdf_quads\n GROUP BY predicate_id\n ORDER BY quad_count DESC, predicate_id ASC\n LIMIT ?\n `).all(limit);\n const termMap = this.requireDictionary().rowsForIds(rows.map((row) => row.predicate_id));\n return rows.map((row) => ({\n predicate: this.cardinalityTerm(termMap, row.predicate_id),\n quadCount: row.quad_count,\n graphCount: row.graph_count,\n distinctSubjects: row.distinct_subjects,\n distinctObjects: row.distinct_objects,\n }));\n }\n\n private predicateObjectCardinalityDistribution(limit: number): RdfCardinalityDistributions['predicateObjects'] {\n const rows = this.requireDb().prepare<{\n predicate_id: number;\n object_id: number;\n quad_count: number;\n graph_count: number;\n distinct_subjects: number;\n }>(`\n SELECT\n predicate_id,\n object_id,\n COUNT(*) AS quad_count,\n COUNT(DISTINCT graph_id) AS graph_count,\n COUNT(DISTINCT subject_id) AS distinct_subjects\n FROM rdf_quads\n GROUP BY predicate_id, object_id\n ORDER BY quad_count DESC, predicate_id ASC, object_id ASC\n LIMIT ?\n `).all(limit);\n const termMap = this.requireDictionary().rowsForIds(rows.flatMap((row) => [row.predicate_id, row.object_id]));\n return rows.map((row) => ({\n predicate: this.cardinalityTerm(termMap, row.predicate_id),\n object: this.cardinalityTerm(termMap, row.object_id),\n quadCount: row.quad_count,\n graphCount: row.graph_count,\n distinctSubjects: row.distinct_subjects,\n }));\n }\n\n private subjectPredicateCardinalityDistribution(limit: number): RdfCardinalityDistributions['subjectPredicates'] {\n const rows = this.requireDb().prepare<{\n subject_id: number;\n predicate_id: number;\n quad_count: number;\n graph_count: number;\n distinct_objects: number;\n }>(`\n SELECT\n subject_id,\n predicate_id,\n COUNT(*) AS quad_count,\n COUNT(DISTINCT graph_id) AS graph_count,\n COUNT(DISTINCT object_id) AS distinct_objects\n FROM rdf_quads\n GROUP BY subject_id, predicate_id\n ORDER BY quad_count DESC, subject_id ASC, predicate_id ASC\n LIMIT ?\n `).all(limit);\n const termMap = this.requireDictionary().rowsForIds(rows.flatMap((row) => [row.subject_id, row.predicate_id]));\n return rows.map((row) => ({\n subject: this.cardinalityTerm(termMap, row.subject_id),\n predicate: this.cardinalityTerm(termMap, row.predicate_id),\n quadCount: row.quad_count,\n graphCount: row.graph_count,\n distinctObjects: row.distinct_objects,\n }));\n }\n\n private cardinalityTerm(termMap: Map<number, Term>, id: number): RdfCardinalityTerm {\n const term = this.requiredTerm(termMap, id);\n const result: RdfCardinalityTerm = {\n value: term.value,\n kind: rdfTermKind(term),\n };\n if (term.termType === 'Literal') {\n if (term.datatype.value) {\n result.datatype = term.datatype.value;\n }\n if (term.language) {\n result.language = term.language;\n }\n }\n return result;\n }\n\n public estimateSerializedTextBytes(): number {\n const db = this.requireDb();\n const row = db.prepare<{ bytes: number | null }>(`\n SELECT\n COALESCE(SUM(length(value)), 0) +\n COALESCE(SUM(CASE WHEN lang IS NULL THEN 0 ELSE length(lang) END), 0) AS bytes\n FROM rdf_terms\n `).get();\n return row?.bytes ?? 0;\n }\n\n public estimateDatabaseBytes(): number {\n const db = this.requireDb();\n try {\n const pageCount = db.prepare<{ page_count: number }>('PRAGMA page_count').get()?.page_count ?? 0;\n const pageSize = db.prepare<{ page_size: number }>('PRAGMA page_size').get()?.page_size ?? 0;\n return pageCount * pageSize;\n } catch {\n return 0;\n }\n }\n\n public collectSpaceObjects(): RdfIndexSpaceObject[] {\n const db = this.requireDb();\n try {\n const schemaRows = db.prepare<{ name: string; type: string; tbl_name: string }>(`\n SELECT name, type, tbl_name\n FROM sqlite_schema\n WHERE type IN ('table', 'index')\n AND (\n name IN ('rdf_terms', 'rdf_sources', 'rdf_quads')\n OR tbl_name IN ('rdf_terms', 'rdf_sources', 'rdf_quads')\n )\n `).all();\n const schema = new Map(schemaRows.map((row) => [row.name, row]));\n try {\n const rows = db.prepare<{ name: string; pages: number; bytes: number | null }>(`\n SELECT name, COUNT(*) AS pages, SUM(pgsize) AS bytes\n FROM dbstat\n WHERE name IN (\n SELECT name\n FROM sqlite_schema\n WHERE type IN ('table', 'index')\n AND (\n name IN ('rdf_terms', 'rdf_sources', 'rdf_quads')\n OR tbl_name IN ('rdf_terms', 'rdf_sources', 'rdf_quads')\n )\n )\n GROUP BY name\n ORDER BY name\n `).all();\n\n if (rows.length > 0) {\n return rows.map((row) => {\n const object = schema.get(row.name);\n const kind = rdfSpaceObjectKind(row.name, object?.type, object?.tbl_name);\n return {\n name: row.name,\n kind,\n ...(object?.tbl_name && object.tbl_name !== row.name ? { tableName: object.tbl_name } : {}),\n pages: row.pages,\n bytes: row.bytes ?? 0,\n };\n });\n }\n } catch {\n // Some SQLite builds do not expose dbstat for in-memory databases.\n }\n\n return this.estimateSpaceObjectsFromSchema(schemaRows);\n } catch {\n return [];\n }\n }\n\n private estimateSpaceObjectsFromSchema(schemaRows: Array<{ name: string; type: string; tbl_name: string }>): RdfIndexSpaceObject[] {\n const pageSize = this.estimatePageSize();\n return schemaRows.map((object) => ({\n name: object.name,\n kind: rdfSpaceObjectKind(object.name, object.type, object.tbl_name),\n ...(object.tbl_name && object.tbl_name !== object.name ? { tableName: object.tbl_name } : {}),\n pages: 1,\n bytes: pageSize,\n estimated: true,\n }));\n }\n\n private estimatePageSize(): number {\n try {\n return this.requireDb().prepare<{ page_size: number }>('PRAGMA page_size').get()?.page_size ?? 4096;\n } catch {\n return 4096;\n }\n }\n\n private initializeSchema(): void {\n this.requireDb().exec(`\n CREATE TABLE IF NOT EXISTS rdf_sources (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n source TEXT NOT NULL UNIQUE,\n workspace TEXT NOT NULL,\n local_path TEXT,\n content_type TEXT,\n last_indexed_at TEXT,\n source_version TEXT\n );\n\n CREATE TABLE IF NOT EXISTS rdf_quads (\n graph_id INTEGER NOT NULL,\n subject_id INTEGER NOT NULL,\n predicate_id INTEGER NOT NULL,\n object_id INTEGER NOT NULL,\n source_file_id INTEGER,\n source_line_no INTEGER,\n PRIMARY KEY (graph_id, subject_id, predicate_id, object_id),\n FOREIGN KEY (graph_id) REFERENCES rdf_terms(id),\n FOREIGN KEY (subject_id) REFERENCES rdf_terms(id),\n FOREIGN KEY (predicate_id) REFERENCES rdf_terms(id),\n FOREIGN KEY (object_id) REFERENCES rdf_terms(id),\n FOREIGN KEY (source_file_id) REFERENCES rdf_sources(id)\n );\n\n CREATE INDEX IF NOT EXISTS rdf_quads_spog ON rdf_quads(subject_id, predicate_id, object_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_sopg ON rdf_quads(subject_id, object_id, predicate_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_psog ON rdf_quads(predicate_id, subject_id, object_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_posg ON rdf_quads(predicate_id, object_id, subject_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_ospg ON rdf_quads(object_id, subject_id, predicate_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_opsg ON rdf_quads(object_id, predicate_id, subject_id, graph_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_gspo ON rdf_quads(graph_id, subject_id, predicate_id, object_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_gpos ON rdf_quads(graph_id, predicate_id, object_id, subject_id);\n CREATE INDEX IF NOT EXISTS rdf_quads_source ON rdf_quads(source_file_id);\n\n CREATE TABLE IF NOT EXISTS rdf_index_metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n `);\n this.requireDb().prepare(`\n INSERT OR IGNORE INTO rdf_index_metadata (key, value)\n SELECT 'data_version', '1'\n WHERE EXISTS (SELECT 1 FROM rdf_quads LIMIT 1)\n `).run();\n }\n\n private prepareSchemaVersion(): void {\n this.ensureMetadataTable();\n const db = this.requireDb();\n const row = db\n .prepare<{ value: string }>(\"SELECT value FROM rdf_index_metadata WHERE key = 'schema_version'\")\n .get();\n if (row && row.value !== String(RDF_QUAD_INDEX_SCHEMA_VERSION)) {\n this.dropIndexSchema();\n this.ensureMetadataTable();\n }\n this.setMetadataValue('schema_version', String(RDF_QUAD_INDEX_SCHEMA_VERSION));\n }\n\n private ensureMetadataTable(): void {\n this.requireDb().exec(`\n CREATE TABLE IF NOT EXISTS rdf_index_metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n `);\n }\n\n private dropIndexSchema(): void {\n const db = this.requireDb();\n const foreignKeys = db.prepare<{ foreign_keys: number }>('PRAGMA foreign_keys').get()?.foreign_keys ?? 0;\n db.exec('PRAGMA foreign_keys = OFF;');\n try {\n db.exec(`\n DROP INDEX IF EXISTS rdf_quads_spog;\n DROP INDEX IF EXISTS rdf_quads_sopg;\n DROP INDEX IF EXISTS rdf_quads_psog;\n DROP INDEX IF EXISTS rdf_quads_posg;\n DROP INDEX IF EXISTS rdf_quads_ospg;\n DROP INDEX IF EXISTS rdf_quads_opsg;\n DROP INDEX IF EXISTS rdf_quads_gspo;\n DROP INDEX IF EXISTS rdf_quads_gpos;\n DROP INDEX IF EXISTS rdf_quads_source;\n DROP TABLE IF EXISTS rdf_quads;\n DROP TABLE IF EXISTS rdf_sources;\n DROP TABLE IF EXISTS rdf_terms;\n DROP TABLE IF EXISTS rdf_index_metadata;\n `);\n dropRdf3xDerivedSchemaObjects(db);\n } finally {\n if (foreignKeys) {\n db.exec('PRAGMA foreign_keys = ON;');\n }\n }\n this.cardinalityCache.clear();\n }\n\n private bumpDataVersion(): void {\n this.requireDb().prepare(`\n INSERT INTO rdf_index_metadata (key, value)\n VALUES ('data_version', '1')\n ON CONFLICT (key)\n DO UPDATE SET value = CAST(value AS INTEGER) + 1\n `).run();\n }\n\n private setMetadataValue(key: string, value: string): void {\n this.requireDb().prepare(`\n INSERT INTO rdf_index_metadata (key, value)\n VALUES (?, ?)\n ON CONFLICT (key)\n DO UPDATE SET value = excluded.value\n `).run(key, value);\n }\n\n private upsertSource(source: RdfSourceInput): number {\n const db = this.requireDb();\n db.prepare(`\n INSERT INTO rdf_sources (\n source,\n workspace,\n local_path,\n content_type,\n last_indexed_at,\n source_version\n )\n VALUES (?, ?, ?, ?, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'), ?)\n ON CONFLICT (source)\n DO UPDATE SET\n workspace = excluded.workspace,\n local_path = excluded.local_path,\n content_type = excluded.content_type,\n last_indexed_at = excluded.last_indexed_at,\n source_version = excluded.source_version\n `).run(\n source.source,\n source.workspace,\n source.localPath ?? null,\n source.contentType ?? null,\n source.sourceVersion ?? null,\n );\n\n const row = db.prepare<RdfSourceRow>('SELECT * FROM rdf_sources WHERE source = ?').get(source.source);\n if (!row) {\n throw new Error(`Failed to upsert RDF source: ${source.source}`);\n }\n return row.id;\n }\n\n private buildWhereClause(\n pattern: QuintPattern,\n allowUnresolved: boolean,\n ): RdfWhereClause {\n const conditions: string[] = [];\n const joins: string[] = [];\n const params: unknown[] = [];\n const queryPlan: string[] = [];\n const equalityColumns = new Set<IndexedColumn>();\n\n for (const key of TERM_KEYS) {\n const match = pattern[key];\n if (!match) {\n continue;\n }\n const column = TERM_COLUMN[key];\n const condition = this.matchToCondition(key, column, match, allowUnresolved);\n if (condition.unresolved) {\n return { joins: '', whereClause: '', params: [], indexHint: 'none', queryPlan, unresolved: key };\n }\n joins.push(...condition.joins);\n if (condition.sql) {\n conditions.push(condition.sql);\n params.push(...condition.params);\n }\n queryPlan.push(...condition.queryPlan);\n if (condition.equality) {\n equalityColumns.add(column);\n }\n }\n\n return {\n joins: joins.join(''),\n whereClause: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n params,\n indexHint: this.chooseIndex(equalityColumns),\n queryPlan,\n };\n }\n\n private matchToCondition(\n key: PatternKey,\n column: IndexedColumn,\n match: unknown,\n allowUnresolved: boolean,\n scope?: RdfConditionScope,\n ): RdfCondition {\n const columnRef = this.scopedQuadColumn(column, scope);\n if (isTerm(match as any)) {\n const id = this.requireDictionary().find(match as Term);\n if (id === undefined) {\n if (allowUnresolved) {\n return { joins: [], params: [], queryPlan: [], unresolved: true };\n }\n return { joins: [], sql: `${columnRef} = ?`, params: [-1], equality: true, queryPlan: [] };\n }\n return { joins: [], sql: `${columnRef} = ?`, params: [id], equality: true, queryPlan: [] };\n }\n\n const ops = match as TermOperators;\n const fragments: string[] = [];\n const joins: string[] = [];\n const params: unknown[] = [];\n const queryPlan: string[] = [];\n let equality = false;\n\n if (ops.$eq !== undefined) {\n const id = this.termOperatorValueId(ops.$eq, allowUnresolved);\n if (id === undefined) return { joins, params: [], queryPlan, unresolved: true };\n fragments.push(`${columnRef} = ?`);\n params.push(id);\n equality = true;\n }\n if (ops.$in !== undefined) {\n const ids = uniqueNumbers(ops.$in\n .map((value) => this.termOperatorValueId(value, allowUnresolved))\n .filter((value): value is number => value !== undefined));\n if (ids.length === 0) {\n return { joins, params: [], queryPlan, unresolved: true };\n }\n if (ids.length > TERM_IN_JOIN_THRESHOLD) {\n const candidateTable = this.populateTermInCandidateTable(column, 'in', ids, scope);\n const candidateAlias = this.scopedSqlName(`${column}_in_candidates`, scope);\n joins.push(` JOIN ${candidateTable} ${candidateAlias} ON ${candidateAlias}.id = ${columnRef}`);\n } else {\n fragments.push(`${columnRef} IN (${ids.map(() => '?').join(', ')})`);\n params.push(...ids);\n }\n queryPlan.push(`TermIn(${key})`);\n equality = true;\n }\n if (ops.$ne !== undefined) {\n const id = this.termOperatorValueId(ops.$ne, allowUnresolved);\n if (id !== undefined) {\n fragments.push(`${columnRef} != ?`);\n params.push(id);\n }\n }\n for (const operator of ['$gt', '$gte', '$lt', '$lte'] as const) {\n if (ops[operator] !== undefined) {\n const range = this.termRangeCondition(key, column, operator, ops[operator], allowUnresolved, scope);\n if (range.unresolved) {\n return { joins, params: [], queryPlan, unresolved: true };\n }\n joins.push(...(range.joins ?? []));\n fragments.push(range.sql);\n params.push(...range.params);\n queryPlan.push(...(range.queryPlan ?? []));\n }\n }\n\n if (ops.$notIn !== undefined) {\n const ids = uniqueNumbers(ops.$notIn\n .map((value) => this.termOperatorValueId(value, allowUnresolved))\n .filter((value): value is number => value !== undefined));\n if (ids.length > 0) {\n if (ids.length > TERM_IN_JOIN_THRESHOLD) {\n const candidateTable = this.populateTermInCandidateTable(column, 'not_in', ids, scope);\n const candidateAlias = this.scopedSqlName(`${column}_not_in_candidates`, scope);\n joins.push(` LEFT JOIN ${candidateTable} ${candidateAlias} ON ${candidateAlias}.id = ${columnRef}`);\n fragments.push(`${candidateAlias}.id IS NULL`);\n } else {\n fragments.push(`${columnRef} NOT IN (${ids.map(() => '?').join(', ')})`);\n params.push(...ids);\n }\n queryPlan.push(`TermNotIn(${key})`);\n }\n }\n\n if (ops.$termType !== undefined) {\n const condition = this.termTypeConditionJoin(key, column, ops.$termType, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$language !== undefined) {\n const condition = this.languageConditionJoin(key, column, '$language', ops.$language, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$notLanguage !== undefined) {\n const condition = this.languageConditionJoin(key, column, '$notLanguage', ops.$notLanguage, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$langMatches !== undefined) {\n const condition = this.languageConditionJoin(key, column, '$langMatches', ops.$langMatches, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$datatype !== undefined) {\n const condition = this.datatypeConditionJoin(key, column, '$datatype', ops.$datatype, allowUnresolved, scope);\n if (condition.unresolved) {\n return { joins, params: [], queryPlan, unresolved: true };\n }\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$notDatatype !== undefined) {\n const condition = this.datatypeConditionJoin(key, column, '$notDatatype', ops.$notDatatype, allowUnresolved, scope);\n if (condition.unresolved) {\n return { joins, params: [], queryPlan, unresolved: true };\n }\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(condition.queryPlan);\n }\n\n if (ops.$startsWith !== undefined) {\n const condition = this.prefixSearchConditionJoin(key, column, ops.$startsWith, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n queryPlan.push(`PrefixRange(${key})`);\n equality = true;\n }\n\n equality = this.addTextSearchCondition(joins, fragments, params, queryPlan, key, column, '$contains', ops.$contains, scope) || equality;\n equality = this.addTextSearchCondition(joins, fragments, params, queryPlan, key, column, '$endsWith', ops.$endsWith, scope) || equality;\n equality = this.addTextSearchCondition(joins, fragments, params, queryPlan, key, column, '$regex', ops.$regex, scope) || equality;\n\n return {\n joins,\n sql: fragments.length > 0 ? fragments.join(' AND ') : undefined,\n params,\n equality,\n queryPlan,\n };\n }\n\n private termTypeConditionJoin(\n key: PatternKey,\n column: IndexedColumn,\n termType: 'iri' | 'blank' | 'literal' | 'numeric',\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[]; queryPlan: string } {\n const alias = this.scopedSqlName(`${column}_term_type_${termType}`, scope);\n const columnRef = this.scopedQuadColumn(column, scope);\n const possibleKinds = this.termKindsForPatternKey(key);\n if (termType === 'numeric') {\n if (!possibleKinds.includes('literal')) {\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: '1 = 0',\n params: [],\n queryPlan: `TermType(${key}:numeric)`,\n };\n }\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: `${alias}.kind = 'literal' AND ${alias}.numeric_value IS NOT NULL`,\n params: [],\n queryPlan: `TermType(${key}:numeric)`,\n };\n }\n if (!possibleKinds.includes(termType)) {\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: '1 = 0',\n params: [],\n queryPlan: `TermType(${key}:${termType})`,\n };\n }\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: `${alias}.kind = ?`,\n params: [termType],\n queryPlan: `TermType(${key}:${termType})`,\n };\n }\n\n private languageConditionJoin(\n key: PatternKey,\n column: IndexedColumn,\n operator: '$language' | '$notLanguage' | '$langMatches',\n language: string,\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[]; queryPlan: string } {\n const alias = this.scopedSqlName(`${column}_${operator.slice(1).toLowerCase()}`, scope);\n const columnRef = this.scopedQuadColumn(column, scope);\n if (!this.termKindsForPatternKey(key).includes('literal')) {\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: '1 = 0',\n params: [],\n queryPlan: `Language(${key}${operator})`,\n };\n }\n const join = ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`;\n if (operator === '$language') {\n return {\n join,\n sql: `${alias}.kind = 'literal' AND COALESCE(${alias}.lang, '') = ?`,\n params: [language],\n queryPlan: `Language(${key}${operator})`,\n };\n }\n if (operator === '$notLanguage') {\n return {\n join,\n sql: `${alias}.kind = 'literal' AND COALESCE(${alias}.lang, '') != ?`,\n params: [language],\n queryPlan: `Language(${key}${operator})`,\n };\n }\n if (language === '*') {\n return {\n join,\n sql: `${alias}.kind = 'literal' AND ${alias}.lang IS NOT NULL AND ${alias}.lang != ''`,\n params: [],\n queryPlan: `Language(${key}${operator})`,\n };\n }\n return {\n join,\n sql: `${alias}.kind = 'literal'\n AND (lower(${alias}.lang) = lower(?) OR lower(${alias}.lang) LIKE lower(?) ESCAPE '\\\\')`,\n params: [language, `${escapeLikePattern(language)}-%`],\n queryPlan: `Language(${key}${operator})`,\n };\n }\n\n private datatypeConditionJoin(\n key: PatternKey,\n column: IndexedColumn,\n operator: '$datatype' | '$notDatatype',\n datatype: Term,\n allowUnresolved: boolean,\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[]; queryPlan: string; unresolved?: boolean } {\n const alias = this.scopedSqlName(`${column}_${operator.slice(1).toLowerCase()}`, scope);\n const columnRef = this.scopedQuadColumn(column, scope);\n if (datatype.termType !== 'NamedNode') {\n throw new Error('RdfQuadIndex datatype filters only support named node datatype terms');\n }\n if (!this.termKindsForPatternKey(key).includes('literal')) {\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`,\n sql: '1 = 0',\n params: [],\n queryPlan: `Datatype(${key}${operator})`,\n };\n }\n const join = ` JOIN rdf_terms ${alias} ON ${alias}.id = ${columnRef}`;\n if (datatype.value === XSD_STRING) {\n return {\n join,\n sql: operator === '$datatype'\n ? `${alias}.kind = 'literal' AND ${alias}.lang IS NULL AND ${alias}.datatype_id IS NULL`\n : `${alias}.kind = 'literal' AND NOT (${alias}.lang IS NULL AND ${alias}.datatype_id IS NULL)`,\n params: [],\n queryPlan: `Datatype(${key}${operator})`,\n };\n }\n const datatypeId = this.requireDictionary().find(datatype);\n if (datatypeId === undefined) {\n if (operator === '$notDatatype') {\n return {\n join,\n sql: `${alias}.kind = 'literal'`,\n params: [],\n queryPlan: `Datatype(${key}${operator})`,\n };\n }\n if (allowUnresolved) {\n return { join, sql: '', params: [], queryPlan: `Datatype(${key}${operator})`, unresolved: true };\n }\n return {\n join,\n sql: operator === '$datatype' ? '1 = 0' : `${alias}.kind = 'literal'`,\n params: [],\n queryPlan: `Datatype(${key}${operator})`,\n };\n }\n return {\n join,\n sql: operator === '$datatype'\n ? `${alias}.kind = 'literal' AND ${alias}.datatype_id = ?`\n : `${alias}.kind = 'literal' AND (${alias}.datatype_id IS NULL OR ${alias}.datatype_id != ?)`,\n params: [datatypeId],\n queryPlan: `Datatype(${key}${operator})`,\n };\n }\n\n private termRangeCondition(\n key: PatternKey,\n column: IndexedColumn,\n operator: '$gt' | '$gte' | '$lt' | '$lte',\n value: unknown,\n allowUnresolved: boolean,\n scope?: RdfConditionScope,\n ): { joins?: string[]; sql: string; params: unknown[]; queryPlan?: string[]; unresolved?: boolean } {\n const kinds = this.termKindsForPatternKey(key);\n const lexicalValue = this.termOperatorLexicalValue(value);\n if (lexicalValue === undefined) {\n if (allowUnresolved) {\n return { sql: '', params: [], unresolved: true };\n }\n return { sql: '1 = 0', params: [] };\n }\n\n const comparator = {\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n }[operator];\n const numericValue = this.termOperatorNumericValue(value);\n if (numericValue !== undefined) {\n if (!kinds.includes('literal')) {\n if (allowUnresolved) {\n return { sql: '', params: [], unresolved: true };\n }\n return { sql: '1 = 0', params: [] };\n }\n const termAlias = this.scopedSqlName(`${column}_numeric_range_${operator.slice(1)}`, scope);\n return {\n joins: [` JOIN rdf_terms ${termAlias} ON ${termAlias}.id = ${this.scopedQuadColumn(column, scope)}`],\n sql: `${termAlias}.kind = 'literal'\n AND ${termAlias}.numeric_value IS NOT NULL\n AND ${termAlias}.numeric_value ${comparator} ?`,\n params: [numericValue],\n queryPlan: [`NumericRange(${key}${operator})`],\n };\n }\n\n const termAlias = this.scopedSqlName(`${column}_range_${operator.slice(1)}`, scope);\n return {\n joins: [` JOIN rdf_terms ${termAlias} ON ${termAlias}.id = ${this.scopedQuadColumn(column, scope)}`],\n sql: `${termAlias}.kind IN (${kinds.map(() => '?').join(', ')})\n AND ${termAlias}.value ${comparator} ?`,\n params: [...kinds, lexicalValue],\n queryPlan: [`LexicalRange(${key}${operator})`],\n };\n }\n\n private termOperatorLexicalValue(value: unknown): string | undefined {\n if (!value || typeof value !== 'object' || !('termType' in value)) {\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value);\n }\n throw new Error('RdfQuadIndex range operators only support Term, string, or number values');\n }\n const term = value as Term;\n switch (term.termType) {\n case 'NamedNode':\n case 'BlankNode':\n case 'Literal':\n return term.value;\n case 'DefaultGraph':\n return '';\n default:\n throw new Error(`RdfQuadIndex range operators do not support ${term.termType}`);\n }\n }\n\n private termOperatorNumericValue(value: unknown): number | undefined {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : undefined;\n }\n if (!value || typeof value !== 'object' || !('termType' in value)) {\n return undefined;\n }\n const term = value as Term;\n if (term.termType !== 'Literal' || !isRdfNumericDatatype(term.datatype.value)) {\n return undefined;\n }\n const parsed = rdfNumericValue(term.value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n private termKindsForPatternKey(key: PatternKey): RdfTermKind[] {\n switch (key) {\n case 'object':\n return ['iri', 'literal', 'blank'];\n case 'subject':\n return ['iri', 'blank'];\n case 'graph':\n return ['iri', 'default_graph'];\n case 'predicate':\n return ['iri'];\n default: {\n const exhaustive: never = key;\n throw new Error(`Unsupported RDF pattern key: ${exhaustive}`);\n }\n }\n }\n\n private termOperatorValueId(value: unknown, allowUnresolved: boolean): number | undefined {\n if (!value || typeof value !== 'object' || !('termType' in value)) {\n throw new Error('RdfQuadIndex only supports Term values in first-stage exact scans');\n }\n const id = this.requireDictionary().find(value as Term);\n if (id === undefined && !allowUnresolved) {\n return -1;\n }\n return id;\n }\n\n private addTextSearchCondition(\n joins: string[],\n fragments: string[],\n params: unknown[],\n queryPlan: string[],\n key: PatternKey,\n column: IndexedColumn,\n operator: RdfQueryFilterOperator,\n value: string | undefined,\n scope?: RdfConditionScope,\n ): boolean {\n if (value === undefined) {\n return false;\n }\n if (typeof value !== 'string') {\n throw new Error(`RdfQuadIndex text search ${operator} only supports string values`);\n }\n const kind = this.termKindsForPatternKey(key);\n queryPlan.push(`TextSearch(${key}${operator})`);\n const condition = this.textSearchConditionJoin(kind, column, operator, value, scope);\n joins.push(condition.join);\n fragments.push(condition.sql);\n params.push(...condition.params);\n return true;\n }\n\n private prefixSearchConditionJoin(\n key: PatternKey,\n column: IndexedColumn,\n prefix: string,\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[] } {\n const kind = this.termKindsForPatternKey(key);\n const alias = this.scopedSqlName(`prefix_${column}`, scope);\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${this.scopedQuadColumn(column, scope)}`,\n sql: `${alias}.kind IN (${kind.map(() => '?').join(', ')})\n AND ${alias}.value_head >= ?\n AND ${alias}.value_head < ?\n AND ${alias}.value >= ?\n AND ${alias}.value < ?`,\n params: [...kind, rdfTermValueHead(prefix), `${rdfTermValueHead(prefix)}\\uffff`, prefix, `${prefix}\\uffff`],\n };\n }\n\n private textSearchConditionJoin(\n kind: RdfTermKind[],\n column: IndexedColumn,\n operator: RdfQueryFilterOperator,\n value: string,\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[] } {\n const alias = this.scopedSqlName(`text_${column}_${operator.slice(1).toLowerCase()}`, scope);\n if (kind.length === 0) {\n return {\n join: ` JOIN rdf_terms ${alias} ON ${alias}.id = ${this.scopedQuadColumn(column, scope)}`,\n sql: '1 = 0',\n params: [],\n };\n }\n const kindPlaceholders = kind.map(() => '?').join(', ');\n const normalized = value.toLowerCase();\n const join = ` JOIN rdf_terms ${alias} ON ${alias}.id = ${this.scopedQuadColumn(column, scope)}`;\n switch (operator) {\n case '$contains':\n return {\n join,\n sql: `${alias}.kind IN (${kindPlaceholders})\n AND ${alias}.normalized_text LIKE ? ESCAPE '\\\\'\n AND instr(${alias}.value, ?) > 0`,\n params: [...kind, `%${escapeLikePattern(normalized)}%`, value],\n };\n case '$endsWith':\n return {\n join,\n sql: `${alias}.kind IN (${kindPlaceholders})\n AND ${alias}.normalized_text LIKE ? ESCAPE '\\\\'\n AND substr(${alias}.value, -length(?)) = ?`,\n params: [...kind, `%${escapeLikePattern(normalized)}`, value, value],\n };\n case '$regex':\n return this.regexTextSearchConditionJoin(kind, alias, column, value, scope);\n default:\n throw new Error(`Unsupported RDF text search operator: ${operator}`);\n }\n }\n\n private regexTextSearchConditionJoin(\n kind: RdfTermKind[],\n alias: string,\n column: IndexedColumn,\n pattern: string,\n scope?: RdfConditionScope,\n ): { join: string; sql: string; params: unknown[] } {\n const ids = this.requireDictionary().idsByNormalizedTextRegex(kind, pattern);\n const candidateTable = this.populateRegexCandidateTable(column, ids, scope);\n const candidateAlias = `${alias}_candidates`;\n const join = ` JOIN rdf_terms ${alias} ON ${alias}.id = ${this.scopedQuadColumn(column, scope)}\n JOIN ${candidateTable} ${candidateAlias} ON ${candidateAlias}.id = ${alias}.id`;\n if (ids.length === 0) {\n return { join, sql: '1 = 0', params: [] };\n }\n const kindPlaceholders = kind.map(() => '?').join(', ');\n return {\n join,\n sql: `${alias}.kind IN (${kindPlaceholders})`,\n params: kind,\n };\n }\n\n private populateRegexCandidateTable(column: IndexedColumn, ids: number[], scope?: RdfConditionScope): string {\n const tableName = this.scopedSqlName(`rdf_regex_candidates_${column}`, scope);\n this.populateCandidateTable(tableName, ids);\n return tableName;\n }\n\n private populateTermInCandidateTable(column: IndexedColumn, operator: 'in' | 'not_in', ids: number[], scope?: RdfConditionScope): string {\n const tableName = this.scopedSqlName(`rdf_term_${operator}_candidates_${column}`, scope);\n this.populateCandidateTable(tableName, ids);\n return tableName;\n }\n\n private scopedQuadColumn(column: IndexedColumn, scope?: RdfConditionScope): string {\n return `${scope?.quadAlias ?? 'rdf_quads'}.${column}`;\n }\n\n private scopedSqlName(base: string, scope?: RdfConditionScope): string {\n const name = scope?.aliasPrefix ? `${scope.aliasPrefix}_${base}` : base;\n return name.replace(/[^A-Za-z0-9_]/g, '_');\n }\n\n private buildTupleConstraintJoin(source: RdfQuadTupleConstraintSource): { join: string } {\n const columns = Array.from(new Set(source.columns));\n if (columns.length === 0) {\n return { join: '' };\n }\n\n const candidateColumns = columns.map((key) => TERM_COLUMN[key]);\n const tableName = `rdf_tuple_values_${candidateColumns.join('_')}`;\n this.populateTupleConstraintTable(tableName, columns, source.rows);\n const alias = 'tuple_values';\n const onClause = columns\n .map((key) => `${alias}.${TERM_COLUMN[key]} = rdf_quads.${TERM_COLUMN[key]}`)\n .join(' AND ');\n return {\n join: ` JOIN ${tableName} ${alias} ON ${onClause}`,\n };\n }\n\n private populateTupleConstraintTable(\n tableName: string,\n columns: PatternKey[],\n rows: RdfQuadTupleConstraintSource['rows'],\n ): void {\n const db = this.requireDb();\n const columnDefs = columns.map((key) => `${TERM_COLUMN[key]} INTEGER NOT NULL`).join(', ');\n const primaryKey = columns.map((key) => TERM_COLUMN[key]).join(', ');\n db.exec(`CREATE TEMP TABLE IF NOT EXISTS ${tableName} (${columnDefs}, PRIMARY KEY (${primaryKey}))`);\n db.prepare(`DELETE FROM ${tableName}`).run();\n\n const valueRows = rows\n .map((row) => columns.map((key) => this.termIdForTupleConstraint(row[key])))\n .filter((ids): ids is number[] => ids.every((id) => id !== undefined));\n if (valueRows.length === 0) {\n return;\n }\n\n const insertColumns = columns.map((key) => TERM_COLUMN[key]).join(', ');\n const placeholders = `(${columns.map(() => '?').join(', ')})`;\n const insert = db.prepare(`INSERT OR IGNORE INTO ${tableName} (${insertColumns}) VALUES ${placeholders}`);\n for (const valueRow of valueRows) {\n insert.run(...valueRow);\n }\n }\n\n private termIdForTupleConstraint(term: Term | undefined): number | undefined {\n if (!term) {\n return undefined;\n }\n return this.requireDictionary().find(term);\n }\n\n private populateCandidateTable(tableName: string, ids: number[]): void {\n const db = this.requireDb();\n db.exec(`CREATE TEMP TABLE IF NOT EXISTS ${tableName} (id INTEGER PRIMARY KEY)`);\n db.prepare(`DELETE FROM ${tableName}`).run();\n for (let offset = 0; offset < ids.length; offset += 500) {\n const batch = ids.slice(offset, offset + 500);\n db.prepare(`INSERT OR IGNORE INTO ${tableName} (id) VALUES ${batch.map(() => '(?)').join(', ')}`).run(...batch);\n }\n }\n\n private chooseIndex(columns: Set<IndexedColumn>): string {\n const has = (column: IndexedColumn): boolean => columns.has(column);\n if (has('graph_id') && has('subject_id')) return 'GSPO';\n if (has('graph_id') && has('predicate_id')) return 'GPOS';\n if (has('subject_id') && has('predicate_id')) return 'SPOG';\n if (has('subject_id') && has('object_id')) return 'SOPG';\n if (has('predicate_id') && has('object_id')) return 'POSG';\n if (has('object_id') && has('subject_id')) return 'OSPG';\n if (has('subject_id')) return 'SPOG';\n if (has('predicate_id')) return 'POSG';\n if (has('object_id')) return 'OSPG';\n if (has('graph_id')) return 'GSPO';\n return 'full-scan';\n }\n\n private exactTermPattern(pattern: QuintPattern): { ids: Partial<Record<PatternKey, number>>; cacheKey: string; indexChoice: string } | undefined {\n const ids: Partial<Record<PatternKey, number>> = {};\n const columns = new Set<IndexedColumn>();\n\n for (const key of TERM_KEYS) {\n const match = pattern[key];\n if (!match) {\n continue;\n }\n if (!isTerm(match as any)) {\n return undefined;\n }\n const id = this.requireDictionary().find(match as Term);\n if (id === undefined) {\n return {\n ids: { [key]: -1 },\n cacheKey: `${key}=-1`,\n indexChoice: this.chooseIndex(new Set([TERM_COLUMN[key]])),\n };\n }\n ids[key] = id;\n columns.add(TERM_COLUMN[key]);\n }\n\n return {\n ids,\n cacheKey: TERM_KEYS\n .map((key) => `${key}:${ids[key] ?? '*'}`)\n .join('|'),\n indexChoice: this.chooseIndex(columns),\n };\n }\n\n private countExactTermPattern(\n ids: Partial<Record<PatternKey, number>>,\n indexChoice: string,\n ): RdfCardinalityEstimate {\n if (Object.values(ids).some((id) => id === -1)) {\n return {\n rows: 0,\n source: 'exact-count',\n indexChoice,\n };\n }\n\n const conditions: string[] = [];\n const params: number[] = [];\n for (const key of TERM_KEYS) {\n const id = ids[key];\n if (id === undefined) {\n continue;\n }\n conditions.push(`${TERM_COLUMN[key]} = ?`);\n params.push(id);\n }\n\n const sql = `SELECT COUNT(*) AS count FROM rdf_quads${conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : ''}`;\n const row = this.requireDb().prepare<{ count: number }>(sql).get(...params);\n return {\n rows: row?.count ?? 0,\n source: 'exact-count',\n indexChoice,\n };\n }\n\n private countExactDistinctTermPattern(\n ids: Partial<Record<PatternKey, number>>,\n indexChoice: string,\n distinctKey: PatternKey,\n ): RdfCardinalityEstimate {\n if (Object.values(ids).some((id) => id === -1)) {\n return {\n rows: 0,\n source: 'exact-distinct-count',\n indexChoice,\n };\n }\n\n const conditions: string[] = [];\n const params: number[] = [];\n for (const key of TERM_KEYS) {\n const id = ids[key];\n if (id === undefined) {\n continue;\n }\n conditions.push(`${TERM_COLUMN[key]} = ?`);\n params.push(id);\n }\n\n const sql = `SELECT COUNT(DISTINCT ${TERM_COLUMN[distinctKey]}) AS count FROM rdf_quads${conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : ''}`;\n const row = this.requireDb().prepare<{ count: number }>(sql).get(...params);\n return {\n rows: row?.count ?? 0,\n source: 'exact-distinct-count',\n indexChoice,\n };\n }\n\n private countExactDistinctTupleTermPattern(\n ids: Partial<Record<PatternKey, number>>,\n indexChoice: string,\n distinctKeys: PatternKey[],\n ): RdfCardinalityEstimate {\n if (Object.values(ids).some((id) => id === -1)) {\n return {\n rows: 0,\n source: 'exact-distinct-tuple-count',\n indexChoice,\n };\n }\n\n const conditions: string[] = [];\n const params: number[] = [];\n for (const key of TERM_KEYS) {\n const id = ids[key];\n if (id === undefined) {\n continue;\n }\n conditions.push(`${TERM_COLUMN[key]} = ?`);\n params.push(id);\n }\n\n const tupleProjection = distinctKeys.map((key) => TERM_COLUMN[key]).join(', ');\n const sql = `\n SELECT COUNT(*) AS count\n FROM (\n SELECT DISTINCT ${tupleProjection}\n FROM rdf_quads${conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : ''}\n ) distinct_tuple\n `;\n const row = this.requireDb().prepare<{ count: number }>(sql).get(...params);\n return {\n rows: row?.count ?? 0,\n source: 'exact-distinct-tuple-count',\n indexChoice,\n };\n }\n\n private countDistinctPattern(pattern: QuintPattern, distinctKey: PatternKey): number {\n const { joins, whereClause, params, unresolved } = this.buildWhereClause(pattern, true);\n if (unresolved) {\n return 0;\n }\n const row = this.requireDb()\n .prepare<{ count: number }>(`SELECT COUNT(DISTINCT rdf_quads.${TERM_COLUMN[distinctKey]}) AS count FROM rdf_quads${joins}${whereClause}`)\n .get(...params);\n return row?.count ?? 0;\n }\n\n private countDistinctTuplePattern(pattern: QuintPattern, distinctKeys: PatternKey[]): number {\n const { joins, whereClause, params, unresolved } = this.buildWhereClause(pattern, true);\n if (unresolved) {\n return 0;\n }\n const tupleProjection = distinctKeys.map((key) => `rdf_quads.${TERM_COLUMN[key]}`).join(', ');\n const row = this.requireDb()\n .prepare<{ count: number }>(`\n SELECT COUNT(*) AS count\n FROM (\n SELECT DISTINCT ${tupleProjection}\n FROM rdf_quads${joins}${whereClause}\n ) distinct_tuple\n `)\n .get(...params);\n return row?.count ?? 0;\n }\n\n private buildOrderClause(options?: RdfQuadScanOptions): { joins: string; orderBy: string } {\n if (!options?.order || options.order.length === 0) {\n return { joins: '', orderBy: '' };\n }\n const columns = options.order.map((termName) => TERM_COLUMN[termName as PatternKey]);\n if (columns.some((column) => !column)) {\n throw new Error(`Unsupported RDF quad order fields: ${options.order.join(', ')}`);\n }\n const joins = options.order.map((termName, index) => {\n const column = TERM_COLUMN[termName as PatternKey];\n const direction = options.orderDirections?.[index] ?? (options.reverse ? 'desc' : 'asc');\n return {\n join: ` JOIN rdf_terms order_t${index} ON order_t${index}.id = rdf_quads.${column}`,\n order: `order_t${index}.value${direction === 'desc' ? ' DESC' : ''}`,\n };\n });\n return {\n joins: joins.map((join) => join.join).join(''),\n orderBy: ` ORDER BY ${joins.map((join) => join.order).join(', ')}`,\n };\n }\n\n private paginationParamCount(options?: QueryOptions): number {\n return (options?.limit !== undefined ? 1 : 0) + (options?.offset !== undefined ? 1 : 0);\n }\n\n private rowsToQuads(rows: RdfQuadRow[]): Quad[] {\n const dictionary = this.requireDictionary();\n const termMap = dictionary.rowsForIds(rows.flatMap((row) => [\n row.graph_id,\n row.subject_id,\n row.predicate_id,\n row.object_id,\n ]));\n\n return rows.map((row) => DataFactory.quad(\n this.requiredTerm(termMap, row.subject_id) as any,\n this.requiredTerm(termMap, row.predicate_id) as any,\n this.requiredTerm(termMap, row.object_id) as any,\n this.requiredTerm(termMap, row.graph_id) as any,\n ));\n }\n\n private requiredTerm(termMap: Map<number, Term>, id: number): Term {\n const term = termMap.get(id);\n if (!term) {\n throw new Error(`RDF term not found while reading quad index: ${id}`);\n }\n return term;\n }\n\n private metrics(\n indexChoice: string,\n matchedRows: number,\n returnedRows: number,\n start: number,\n queryPlan?: string[],\n ): RdfIndexMetrics {\n return {\n engine: 'solid-rdf',\n indexChoice,\n matchedRows,\n returnedRows,\n durationMs: Date.now() - start,\n queryPlan,\n };\n }\n\n private requireDb(): SqliteDatabase {\n if (!this.db) {\n throw new Error('RdfQuadIndex is not open');\n }\n return this.db;\n }\n\n private requireDictionary(): RdfTermDictionary {\n if (!this.dictionary) {\n throw new Error('RdfQuadIndex is not open');\n }\n return this.dictionary;\n }\n}\n\nfunction sumSpaceObjects(objects: RdfIndexSpaceObject[], kind: RdfIndexSpaceObject['kind']): number {\n return objects\n .filter((object) => object.kind === kind)\n .reduce((sum, object) => sum + object.bytes, 0);\n}\n\nfunction rdfSpaceObjectKind(name: string, schemaType?: string, tableName?: string): RdfIndexSpaceObject['kind'] {\n if (schemaType === 'table' && name.startsWith('rdf_')) {\n return 'table';\n }\n if (schemaType === 'index' && (name.startsWith('rdf_') || tableName?.startsWith('rdf_'))) {\n return 'index';\n }\n if (name.startsWith('sqlite_')) {\n return 'internal';\n }\n return 'unknown';\n}\n\nfunction rdfTermKind(term: Term): RdfTermKind {\n switch (term.termType) {\n case 'NamedNode':\n return 'iri';\n case 'BlankNode':\n return 'blank';\n case 'Literal':\n return 'literal';\n case 'DefaultGraph':\n return 'default_graph';\n default:\n return 'iri';\n }\n}\n\nfunction escapeLikePattern(value: string): string {\n return value.replace(/[\\\\%_]/g, (match) => `\\\\${match}`);\n}\n\nfunction uniqueNumbers(values: number[]): number[] {\n return [...new Set(values)];\n}\n\nfunction uniquePatternKeys(values: PatternKey[]): PatternKey[] {\n return TERM_KEYS.filter((key) => values.includes(key));\n}\n\nfunction uniqueVariableNames(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction joinSolutionMappingKeyExpression(\n variableColumns: Map<string, string>,\n variables: string[] | undefined,\n errorPrefix: string,\n): string {\n const variableNames = uniqueVariableNames(variables ?? [...variableColumns.keys()]);\n if (variableNames.length === 0) {\n return '1';\n }\n return variableNames.map((variableName) => {\n const column = variableColumns.get(variableName);\n if (!column) {\n throw new Error(`${errorPrefix} COUNT(DISTINCT *) cannot read unbound variable: ${variableName}`);\n }\n return column;\n }).join(` || ':' || `);\n}\n"]}