@undefineds.co/xpod 0.3.5 → 0.3.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/cli.json +1 -1
- package/config/cloud.json +54 -22
- package/config/local.json +56 -12
- package/config/resolver.json +10 -2
- package/config/xpod.base.json +50 -0
- package/config/xpod.json +8 -8
- package/dist/agents/config/resolve.js +10 -10
- package/dist/agents/config/resolve.js.map +1 -1
- package/dist/api/chatkit/index.d.ts +1 -1
- package/dist/api/chatkit/index.js.map +1 -1
- package/dist/api/chatkit/pod-store.d.ts +14 -11
- package/dist/api/chatkit/pod-store.js +114 -78
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
- package/dist/api/chatkit/service.js +1 -1
- package/dist/api/chatkit/service.js.map +1 -1
- package/dist/api/chatkit/types.d.ts +11 -11
- package/dist/api/chatkit/types.js +3 -3
- package/dist/api/chatkit/types.js.map +1 -1
- package/dist/api/container/cloud.js +0 -8
- package/dist/api/container/cloud.js.map +1 -1
- package/dist/api/container/index.js +2 -1
- package/dist/api/container/index.js.map +1 -1
- package/dist/api/container/local.js +0 -7
- package/dist/api/container/local.js.map +1 -1
- package/dist/api/container/routes.js +3 -17
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +0 -2
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/PodManagementHandler.d.ts +3 -0
- package/dist/api/handlers/PodManagementHandler.js +71 -1
- package/dist/api/handlers/PodManagementHandler.js.map +1 -1
- package/dist/api/handlers/RunHandler.js +5 -5
- package/dist/api/handlers/RunHandler.js.map +1 -1
- package/dist/api/runs/AgentRuntimeTypes.d.ts +7 -8
- package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
- package/dist/api/runs/InngestRunExecutionBackend.d.ts +2 -2
- package/dist/api/runs/ManagedRunWorker.d.ts +1 -1
- package/dist/api/runs/ManagedRunWorker.js +6 -6
- package/dist/api/runs/ManagedRunWorker.js.map +1 -1
- package/dist/api/runs/PiAgentRuntimeDriver.d.ts +16 -1
- package/dist/api/runs/PiAgentRuntimeDriver.js +182 -23
- package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
- package/dist/api/runs/RunStateCenter.d.ts +3 -3
- package/dist/api/runs/RunStateCenter.js +13 -13
- package/dist/api/runs/RunStateCenter.js.map +1 -1
- package/dist/api/runs/store.d.ts +4 -4
- package/dist/api/runs/store.js +2 -2
- package/dist/api/runs/store.js.map +1 -1
- package/dist/api/service/VectorStoreService.d.ts +1 -1
- package/dist/api/service/VectorStoreService.js +16 -16
- package/dist/api/service/VectorStoreService.js.map +1 -1
- package/dist/api/tasks/InngestTaskScheduler.d.ts +4 -4
- package/dist/api/tasks/TaskMaterializer.d.ts +3 -3
- package/dist/api/tasks/TaskMaterializer.js +11 -11
- package/dist/api/tasks/TaskMaterializer.js.map +1 -1
- package/dist/api/tasks/TaskService.d.ts +3 -3
- package/dist/api/tasks/TaskService.js +11 -7
- package/dist/api/tasks/TaskService.js.map +1 -1
- package/dist/api/tasks/store.d.ts +10 -4
- package/dist/api/tasks/store.js +14 -4
- package/dist/api/tasks/store.js.map +1 -1
- package/dist/api/workspace/types.d.ts +3 -3
- package/dist/api/workspace/types.js +6 -6
- package/dist/api/workspace/types.js.map +1 -1
- package/dist/cli/commands/config.js +2 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/start.js +9 -3
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/components/components.jsonld +8 -2
- package/dist/components/context.jsonld +302 -51
- package/dist/http/search/SearchHttpHandler.js +8 -8
- package/dist/http/search/SearchHttpHandler.js.map +1 -1
- package/dist/identity/drizzle/PodLookupRepository.d.ts +11 -1
- package/dist/identity/drizzle/PodLookupRepository.js +95 -4
- package/dist/identity/drizzle/PodLookupRepository.js.map +1 -1
- package/dist/identity/drizzle/db.js +4 -43
- package/dist/identity/drizzle/db.js.map +1 -1
- package/dist/identity/drizzle/schema.pg.d.ts +0 -5
- package/dist/identity/drizzle/schema.pg.js +2 -16
- package/dist/identity/drizzle/schema.pg.js.map +1 -1
- package/dist/identity/drizzle/schema.sqlite.d.ts +19 -176
- package/dist/identity/drizzle/schema.sqlite.js +2 -16
- package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +4 -4
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +7 -7
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +6 -6
- package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +4 -4
- package/dist/identity/oidc/AutoDetectOidcHandler.js +6 -6
- package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +6 -6
- package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +37 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.js +211 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +158 -0
- package/dist/index.d.ts +12 -2
- package/dist/index.js +16 -4
- package/dist/index.js.map +1 -1
- package/dist/main.js +8 -2
- package/dist/main.js.map +1 -1
- package/dist/provision/ProvisionPodCreator.d.ts +3 -4
- package/dist/provision/ProvisionPodCreator.js +8 -13
- package/dist/provision/ProvisionPodCreator.js.map +1 -1
- package/dist/provision/ProvisionPodCreator.jsonld +7 -7
- package/dist/runtime/Proxy.d.ts +0 -1
- package/dist/runtime/Proxy.js +0 -9
- package/dist/runtime/Proxy.js.map +1 -1
- package/dist/runtime/bootstrap.d.ts +1 -0
- package/dist/runtime/bootstrap.js +5 -2
- package/dist/runtime/bootstrap.js.map +1 -1
- package/dist/runtime/css-process.d.ts +12 -4
- package/dist/runtime/css-process.js +61 -14
- package/dist/runtime/css-process.js.map +1 -1
- package/dist/runtime/oidc-issuer.d.ts +3 -2
- package/dist/runtime/oidc-issuer.js +3 -2
- package/dist/runtime/oidc-issuer.js.map +1 -1
- package/dist/runtime/runtime-types.d.ts +1 -0
- package/dist/runtime/runtime-types.js.map +1 -1
- package/dist/solidfs/LocalFirstRdfRepresentationResolver.d.ts +21 -0
- package/dist/solidfs/LocalFirstRdfRepresentationResolver.js +38 -0
- package/dist/solidfs/LocalFirstRdfRepresentationResolver.js.map +1 -0
- package/dist/solidfs/LocalSolidFS.d.ts +18 -0
- package/dist/solidfs/LocalSolidFS.js +539 -0
- package/dist/solidfs/LocalSolidFS.js.map +1 -0
- package/dist/solidfs/PodSolidFsHttpClient.d.ts +16 -0
- package/dist/solidfs/PodSolidFsHttpClient.js +93 -0
- package/dist/solidfs/PodSolidFsHttpClient.js.map +1 -0
- package/dist/solidfs/PodSolidFsHydrator.d.ts +27 -0
- package/dist/solidfs/PodSolidFsHydrator.js +127 -0
- package/dist/solidfs/PodSolidFsHydrator.js.map +1 -0
- package/dist/solidfs/PodSolidFsSyncer.d.ts +21 -0
- package/dist/solidfs/PodSolidFsSyncer.js +78 -0
- package/dist/solidfs/PodSolidFsSyncer.js.map +1 -0
- package/dist/solidfs/RdfIndexSolidFsSyncer.d.ts +22 -0
- package/dist/solidfs/RdfIndexSolidFsSyncer.js +131 -0
- package/dist/solidfs/RdfIndexSolidFsSyncer.js.map +1 -0
- package/dist/solidfs/index.d.ts +7 -0
- package/dist/solidfs/index.js +24 -0
- package/dist/solidfs/index.js.map +1 -0
- package/dist/solidfs/types.d.ts +131 -0
- package/dist/solidfs/types.js +19 -0
- package/dist/solidfs/types.js.map +1 -0
- package/dist/storage/RepresentationPartialConvertingStore.js +6 -13
- package/dist/storage/RepresentationPartialConvertingStore.js.map +1 -1
- package/dist/storage/SparqlUpdateResourceStore.d.ts +4 -0
- package/dist/storage/SparqlUpdateResourceStore.js +13 -0
- package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
- package/dist/storage/SparqlUpdateResourceStore.jsonld +26 -0
- package/dist/storage/accessors/MinioDataAccessor.d.ts +2 -0
- package/dist/storage/accessors/MinioDataAccessor.js +13 -7
- package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MinioDataAccessor.jsonld +8 -0
- package/dist/storage/accessors/MixDataAccessor.d.ts +85 -4
- package/dist/storage/accessors/MixDataAccessor.js +511 -16
- package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MixDataAccessor.jsonld +176 -1
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.d.ts +7 -0
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +72 -4
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -1
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.jsonld +24 -0
- package/dist/storage/quint/BaseQuintStore.d.ts +3 -0
- package/dist/storage/quint/BaseQuintStore.js +51 -27
- package/dist/storage/quint/BaseQuintStore.js.map +1 -1
- package/dist/storage/quint/PgQuintStore.d.ts +1 -0
- package/dist/storage/quint/PgQuintStore.js +50 -32
- package/dist/storage/quint/PgQuintStore.js.map +1 -1
- package/dist/storage/quint/PgQuintStore.jsonld +4 -3
- package/dist/storage/quint/SqliteQuintStore.d.ts +5 -0
- package/dist/storage/quint/SqliteQuintStore.js +100 -0
- package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.jsonld +20 -0
- package/dist/storage/quint/types.d.ts +16 -0
- package/dist/storage/quint/types.js.map +1 -1
- package/dist/storage/rdf/Rdf3xTripleIndex.d.ts +55 -0
- package/dist/storage/rdf/Rdf3xTripleIndex.js +1235 -0
- package/dist/storage/rdf/Rdf3xTripleIndex.js.map +1 -0
- package/dist/storage/rdf/RdfContentTypes.d.ts +9 -0
- package/dist/storage/rdf/RdfContentTypes.js +79 -0
- package/dist/storage/rdf/RdfContentTypes.js.map +1 -0
- package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +76 -0
- package/dist/storage/rdf/RdfLocalQueryEngine.js +2636 -0
- package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -0
- package/dist/storage/rdf/RdfQuadIndex.d.ts +98 -0
- package/dist/storage/rdf/RdfQuadIndex.js +1840 -0
- package/dist/storage/rdf/RdfQuadIndex.js.map +1 -0
- package/dist/storage/rdf/RdfQuadIndex.jsonld +416 -0
- package/dist/storage/rdf/RdfShadowComparator.d.ts +12 -0
- package/dist/storage/rdf/RdfShadowComparator.js +47 -0
- package/dist/storage/rdf/RdfShadowComparator.js.map +1 -0
- package/dist/storage/rdf/RdfSparqlAdapter.d.ts +147 -0
- package/dist/storage/rdf/RdfSparqlAdapter.js +2420 -0
- package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -0
- package/dist/storage/rdf/RdfSparqlAdapter.jsonld +414 -0
- package/dist/storage/rdf/RdfTermDictionary.d.ts +27 -0
- package/dist/storage/rdf/RdfTermDictionary.js +352 -0
- package/dist/storage/rdf/RdfTermDictionary.js.map +1 -0
- package/dist/storage/rdf/RdfTermDictionary.jsonld +114 -0
- package/dist/storage/rdf/RdfTermSemantics.d.ts +6 -0
- package/dist/storage/rdf/RdfTermSemantics.js +40 -0
- package/dist/storage/rdf/RdfTermSemantics.js.map +1 -0
- package/dist/storage/rdf/RdfTextIndex.d.ts +23 -0
- package/dist/storage/rdf/RdfTextIndex.js +569 -0
- package/dist/storage/rdf/RdfTextIndex.js.map +1 -0
- package/dist/storage/rdf/RdfVectorIndex.d.ts +22 -0
- package/dist/storage/rdf/RdfVectorIndex.js +631 -0
- package/dist/storage/rdf/RdfVectorIndex.js.map +1 -0
- package/dist/storage/rdf/RdfXmlSerializer.d.ts +2 -0
- package/dist/storage/rdf/RdfXmlSerializer.js +123 -0
- package/dist/storage/rdf/RdfXmlSerializer.js.map +1 -0
- package/dist/storage/rdf/ShadowRdfQuintStore.d.ts +58 -0
- package/dist/storage/rdf/ShadowRdfQuintStore.js +202 -0
- package/dist/storage/rdf/ShadowRdfQuintStore.js.map +1 -0
- package/dist/storage/rdf/ShadowRdfQuintStore.jsonld +308 -0
- package/dist/storage/rdf/SolidRdfEngine.d.ts +51 -0
- package/dist/storage/rdf/SolidRdfEngine.js +264 -0
- package/dist/storage/rdf/SolidRdfEngine.js.map +1 -0
- package/dist/storage/rdf/SolidRdfEngine.jsonld +338 -0
- package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +92 -0
- package/dist/storage/rdf/SolidRdfSparqlEngine.js +477 -0
- package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -0
- package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +257 -0
- package/dist/storage/rdf/index.d.ts +15 -0
- package/dist/storage/rdf/index.js +61 -0
- package/dist/storage/rdf/index.js.map +1 -0
- package/dist/storage/rdf/models-benchmark.d.ts +260 -0
- package/dist/storage/rdf/models-benchmark.js +1405 -0
- package/dist/storage/rdf/models-benchmark.js.map +1 -0
- package/dist/storage/rdf/types.d.ts +726 -0
- package/dist/storage/rdf/types.js +3 -0
- package/dist/storage/rdf/types.js.map +1 -0
- package/dist/storage/rdf/types.jsonld +316 -0
- package/dist/storage/vector/VectorIndexingListener.d.ts +5 -5
- package/dist/storage/vector/VectorIndexingListener.js +19 -19
- package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
- package/package.json +3 -2
- package/templates/pod/acp/.acr.hbs +39 -0
- package/templates/pod/acp/README.acr +18 -0
- package/templates/pod/acp/profile/card.acr +22 -0
- package/templates/pod/base/README$.md.hbs +27 -0
- package/templates/pod/base/profile/card$.ttl.hbs +13 -0
- package/templates/pod/wac/.acl.hbs +26 -0
- package/templates/pod/wac/README.acl.hbs +14 -0
- package/templates/pod/wac/profile/card.acl.hbs +19 -0
- package/dist/api/handlers/WebIdProfileHandler.d.ts +0 -16
- package/dist/api/handlers/WebIdProfileHandler.js +0 -423
- package/dist/api/handlers/WebIdProfileHandler.js.map +0 -1
- package/dist/identity/drizzle/WebIdProfileRepository.d.ts +0 -63
- package/dist/identity/drizzle/WebIdProfileRepository.js +0 -168
- package/dist/identity/drizzle/WebIdProfileRepository.js.map +0 -1
- package/dist/identity/drizzle/WebIdProfileRepository.jsonld +0 -112
- package/dist/storage/quint/BaseQuintStore.jsonld +0 -257
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RdfVectorIndex.js","sourceRoot":"","sources":["../../../src/storage/rdf/RdfVectorIndex.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { createSqliteRuntime, type SqliteDatabase } from '../SqliteRuntime';\nimport type {\n RdfVectorChunkInput,\n RdfVectorChunkRow,\n RdfVectorDistanceMetric,\n RdfSearchCardinalityEstimate,\n RdfVectorIndexOptions,\n RdfVectorIndexStats,\n RdfVectorModelDistribution,\n RdfVectorSearchOrder,\n RdfVectorSearchOptions,\n RdfVectorSearchResult,\n RdfVectorSourceInput,\n} from './types';\n\ninterface RdfVectorSourceRow {\n id: number;\n source: string;\n workspace: string;\n local_path: string | null;\n content_type: string | null;\n source_version: string | null;\n source_hash: string | null;\n updated_at: string;\n}\n\ninterface RdfVectorScoredChunkRow extends RdfVectorChunkRow {\n dot_product: number;\n vector_score: number;\n vector_distance: number | null;\n vector_distance_squared: number | null;\n}\n\nexport class RdfVectorIndex {\n private readonly sqliteRuntime = createSqliteRuntime();\n private db: SqliteDatabase | null = null;\n\n public constructor(private readonly options: RdfVectorIndexOptions) {}\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.initializeSchema();\n }\n\n public close(): void {\n this.db?.close();\n this.db = null;\n }\n\n public clear(): void {\n this.requireDb().exec('DELETE FROM rdf_vector_components; DELETE FROM rdf_vector_chunks; DELETE FROM rdf_vector_sources;');\n }\n\n public indexVector(source: RdfVectorSourceInput, chunks: RdfVectorChunkInput[]): void {\n const db = this.requireDb();\n const sourceId = this.upsertSource(source);\n const insertChunk = db.prepare(`\n INSERT INTO rdf_vector_chunks (\n source_id,\n chunk_key,\n ordinal,\n level,\n heading,\n path,\n content,\n start_offset,\n end_offset,\n embedding_json,\n dimensions,\n magnitude,\n model,\n updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n `);\n const insertComponent = db.prepare(`\n INSERT INTO rdf_vector_components (\n chunk_id,\n dimension,\n value,\n updated_at\n )\n VALUES (?, ?, ?, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n `);\n\n db.transaction(() => {\n db.prepare(`\n DELETE FROM rdf_vector_components\n WHERE chunk_id IN (\n SELECT id FROM rdf_vector_chunks WHERE source_id = ?\n )\n `).run(sourceId);\n db.prepare('DELETE FROM rdf_vector_chunks WHERE source_id = ?').run(sourceId);\n for (const chunk of chunks) {\n const embedding = normalizeEmbedding(chunk.embedding);\n const result = insertChunk.run(\n sourceId,\n chunk.chunkKey,\n chunk.ordinal,\n chunk.level,\n chunk.heading || null,\n JSON.stringify(chunk.path ?? []),\n chunk.content,\n chunk.startOffset,\n chunk.endOffset,\n JSON.stringify(embedding),\n embedding.length,\n vectorMagnitude(embedding),\n chunk.model ?? '',\n );\n insertVectorComponents(insertComponent, Number(result.lastInsertRowid), embedding);\n }\n })();\n }\n\n public deleteSource(source: string): number {\n const db = this.requireDb();\n const row = db.prepare<{ id: number }>('SELECT id FROM rdf_vector_sources WHERE source = ?').get(source);\n if (!row) {\n return 0;\n }\n\n return db.transaction(() => {\n db.prepare(`\n DELETE FROM rdf_vector_components\n WHERE chunk_id IN (\n SELECT id FROM rdf_vector_chunks WHERE source_id = ?\n )\n `).run(row.id);\n const deletedChunks = db.prepare('DELETE FROM rdf_vector_chunks WHERE source_id = ?').run(row.id).changes;\n db.prepare('DELETE FROM rdf_vector_sources WHERE id = ?').run(row.id);\n return deletedChunks;\n })();\n }\n\n public search(options: RdfVectorSearchOptions): RdfVectorSearchResult[] {\n const embedding = normalizeEmbedding(options.embedding);\n if (embedding.length === 0) {\n return [];\n }\n\n const metric = options.metric ?? this.options.defaultMetric ?? 'cosine';\n if (metric === 'cosine' && vectorMagnitude(embedding) === 0) {\n return [];\n }\n const scoredQuery = buildVectorScoredRowsQuery(embedding, metric, options);\n return this.requireDb()\n .prepare<RdfVectorScoredChunkRow>(scoredQuery.sql)\n .all(...scoredQuery.params)\n .map((row) => {\n const rowEmbedding = parseEmbedding(row.embedding_json);\n const distance = scoredVectorDistance(row, metric);\n return this.toSearchResult(row, rowEmbedding, vectorScore(distance, metric), distance);\n });\n }\n\n public estimateSearchCardinality(options: RdfVectorSearchOptions): RdfSearchCardinalityEstimate {\n const embedding = normalizeEmbedding(options.embedding);\n if (embedding.length === 0) {\n return {\n rows: 0,\n source: 'vector-candidate-count',\n indexChoice: 'vector-candidate-count',\n };\n }\n\n const metric = options.metric ?? this.options.defaultMetric ?? 'cosine';\n if (metric === 'cosine' && vectorMagnitude(embedding) === 0) {\n return {\n rows: 0,\n source: 'vector-candidate-count',\n indexChoice: 'vector-candidate-count',\n };\n }\n\n if (options.threshold !== undefined) {\n const countQuery = buildVectorScoredCountQuery(embedding, metric, options);\n const rows = this.requireDb().prepare<{ count: number }>(countQuery.sql).get(...countQuery.params)?.count ?? 0;\n return {\n rows: applyResultWindow(rows, options.offset, options.limit),\n source: 'vector-component-score',\n indexChoice: 'vector-component-score',\n };\n }\n\n const params: unknown[] = [embedding.length];\n const conditions = ['chunk.dimensions = ?'];\n\n if (options.workspace) {\n conditions.push('source.workspace = ?');\n params.push(options.workspace);\n }\n if (options.source) {\n conditions.push('source.source = ?');\n params.push(options.source);\n }\n if (options.sourcePrefix) {\n conditions.push('source.source >= ? AND source.source < ?');\n params.push(options.sourcePrefix, `${options.sourcePrefix}\\uffff`);\n }\n if (options.model !== undefined) {\n conditions.push('chunk.model = ?');\n params.push(options.model);\n }\n\n const rows = this.requireDb().prepare<{ count: number }>(`\n SELECT COUNT(*) AS count\n FROM rdf_vector_chunks chunk\n JOIN rdf_vector_sources source ON source.id = chunk.source_id\n WHERE ${conditions.join(' AND ')}\n `).get(...params)?.count ?? 0;\n\n return {\n rows: applyResultWindow(rows, options.offset, options.limit),\n source: 'vector-candidate-count',\n indexChoice: 'vector-candidate-count',\n };\n }\n\n public stats(): RdfVectorIndexStats {\n const db = this.requireDb();\n return {\n sourceCount: db.prepare<{ count: number }>('SELECT COUNT(*) AS count FROM rdf_vector_sources').get()?.count ?? 0,\n chunkCount: db.prepare<{ count: number }>('SELECT COUNT(*) AS count FROM rdf_vector_chunks').get()?.count ?? 0,\n componentCount: db.prepare<{ count: number }>('SELECT COUNT(*) AS count FROM rdf_vector_components').get()?.count ?? 0,\n databaseBytes: this.estimateDatabaseBytes(),\n modelDistribution: this.modelDistribution(),\n };\n }\n\n public modelDistribution(): RdfVectorModelDistribution[] {\n const rows = this.requireDb().prepare<{\n model: string;\n dimensions: number;\n source_count: number;\n chunk_count: number;\n min_magnitude: number | null;\n max_magnitude: number | null;\n average_magnitude: number | null;\n }>(`\n SELECT\n chunk.model,\n chunk.dimensions,\n COUNT(DISTINCT chunk.source_id) AS source_count,\n COUNT(*) AS chunk_count,\n MIN(chunk.magnitude) AS min_magnitude,\n MAX(chunk.magnitude) AS max_magnitude,\n AVG(chunk.magnitude) AS average_magnitude\n FROM rdf_vector_chunks chunk\n GROUP BY chunk.model, chunk.dimensions\n ORDER BY chunk_count DESC, source_count DESC, chunk.model ASC, chunk.dimensions ASC\n `).all();\n\n return rows.map((row) => ({\n model: row.model,\n dimensions: row.dimensions,\n sourceCount: row.source_count,\n chunkCount: row.chunk_count,\n minMagnitude: row.min_magnitude ?? 0,\n maxMagnitude: row.max_magnitude ?? 0,\n averageMagnitude: row.average_magnitude ?? 0,\n }));\n }\n\n private initializeSchema(): void {\n this.requireDb().exec(`\n CREATE TABLE IF NOT EXISTS rdf_vector_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 source_version TEXT,\n source_hash TEXT,\n updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n );\n\n CREATE TABLE IF NOT EXISTS rdf_vector_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n source_id INTEGER NOT NULL,\n chunk_key TEXT NOT NULL,\n ordinal INTEGER NOT NULL,\n level INTEGER NOT NULL,\n heading TEXT,\n path TEXT,\n content TEXT NOT NULL,\n start_offset INTEGER NOT NULL,\n end_offset INTEGER NOT NULL,\n embedding_json TEXT NOT NULL,\n dimensions INTEGER NOT NULL,\n magnitude REAL NOT NULL,\n model TEXT NOT NULL,\n updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),\n UNIQUE (source_id, chunk_key),\n FOREIGN KEY (source_id) REFERENCES rdf_vector_sources(id)\n );\n\n CREATE TABLE IF NOT EXISTS rdf_vector_components (\n chunk_id INTEGER NOT NULL,\n dimension INTEGER NOT NULL,\n value REAL NOT NULL,\n updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),\n PRIMARY KEY (chunk_id, dimension),\n FOREIGN KEY (chunk_id) REFERENCES rdf_vector_chunks(id)\n );\n\n CREATE INDEX IF NOT EXISTS rdf_vector_sources_workspace ON rdf_vector_sources(workspace);\n CREATE INDEX IF NOT EXISTS rdf_vector_sources_source ON rdf_vector_sources(source);\n CREATE INDEX IF NOT EXISTS rdf_vector_chunks_source ON rdf_vector_chunks(source_id, ordinal);\n CREATE INDEX IF NOT EXISTS rdf_vector_chunks_model_dimensions ON rdf_vector_chunks(model, dimensions);\n CREATE INDEX IF NOT EXISTS rdf_vector_components_dimension ON rdf_vector_components(dimension, chunk_id);\n `);\n this.backfillVectorComponents();\n }\n\n private backfillVectorComponents(): void {\n const db = this.requireDb();\n const rows = db.prepare<{\n id: number;\n dimensions: number;\n embedding_json: string;\n component_count: number;\n }>(`\n SELECT\n chunk.id,\n chunk.dimensions,\n chunk.embedding_json,\n COUNT(component.dimension) AS component_count\n FROM rdf_vector_chunks chunk\n LEFT JOIN rdf_vector_components component ON component.chunk_id = chunk.id\n WHERE chunk.dimensions > 0\n GROUP BY chunk.id\n HAVING component_count <> chunk.dimensions\n `).all();\n if (rows.length === 0) {\n return;\n }\n\n const deleteComponents = db.prepare('DELETE FROM rdf_vector_components WHERE chunk_id = ?');\n const insertComponent = db.prepare(`\n INSERT INTO rdf_vector_components (\n chunk_id,\n dimension,\n value,\n updated_at\n )\n VALUES (?, ?, ?, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n `);\n db.transaction(() => {\n for (const row of rows) {\n deleteComponents.run(row.id);\n insertVectorComponents(insertComponent, row.id, parseEmbedding(row.embedding_json));\n }\n })();\n }\n\n private upsertSource(source: RdfVectorSourceInput): number {\n const db = this.requireDb();\n db.prepare(`\n INSERT INTO rdf_vector_sources (\n source,\n workspace,\n local_path,\n content_type,\n source_version,\n source_hash,\n updated_at\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 source_version = excluded.source_version,\n source_hash = excluded.source_hash,\n updated_at = excluded.updated_at\n `).run(\n source.source,\n source.workspace,\n source.localPath ?? null,\n source.contentType ?? null,\n source.sourceVersion ?? null,\n source.sourceHash ?? null,\n );\n\n const row = db.prepare<RdfVectorSourceRow>('SELECT * FROM rdf_vector_sources WHERE source = ?').get(source.source);\n if (!row) {\n throw new Error(`Failed to upsert RDF vector source: ${source.source}`);\n }\n return row.id;\n }\n\n private 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 private toSearchResult(\n row: RdfVectorChunkRow,\n embedding: number[],\n score: number,\n distance: number,\n ): RdfVectorSearchResult {\n return {\n source: row.source,\n workspace: row.workspace,\n localPath: row.local_path ?? undefined,\n contentType: row.content_type ?? undefined,\n sourceVersion: row.source_version ?? undefined,\n sourceHash: row.source_hash ?? undefined,\n chunkKey: row.chunk_key,\n ordinal: row.ordinal,\n level: row.level,\n heading: row.heading ?? undefined,\n path: parsePath(row.path),\n content: row.content,\n startOffset: row.start_offset,\n endOffset: row.end_offset,\n embedding,\n model: row.model || undefined,\n score,\n distance,\n };\n }\n\n private requireDb(): SqliteDatabase {\n if (!this.db) {\n throw new Error('RdfVectorIndex is not open');\n }\n return this.db;\n }\n}\n\nfunction normalizeEmbedding(embedding: number[]): number[] {\n return embedding.filter((value) => Number.isFinite(value));\n}\n\nfunction parseEmbedding(value: string): number[] {\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? normalizeEmbedding(parsed) : [];\n } catch {\n return [];\n }\n}\n\nfunction vectorMagnitude(embedding: number[]): number {\n return Math.sqrt(embedding.reduce((sum, value) => sum + value * value, 0));\n}\n\nfunction vectorScore(distance: number, metric: RdfVectorDistanceMetric): number {\n if (!Number.isFinite(distance)) {\n return Number.NEGATIVE_INFINITY;\n }\n if (metric === 'cosine') {\n return 1 - distance;\n }\n return -distance;\n}\n\nfunction scoredVectorDistance(row: RdfVectorScoredChunkRow, metric: RdfVectorDistanceMetric): number {\n if (metric === 'euclidean') {\n const squared = row.vector_distance_squared ?? Number.POSITIVE_INFINITY;\n const stableSquared = Math.abs(squared) < 1e-12 ? 0 : squared;\n return Math.sqrt(Math.max(0, stableSquared));\n }\n return row.vector_distance ?? Number.POSITIVE_INFINITY;\n}\n\nfunction dotProduct(left: number[], right: number[]): number {\n let sum = 0;\n for (let index = 0; index < left.length; index++) {\n sum += left[index] * right[index];\n }\n return sum;\n}\n\nfunction insertVectorComponents(insertComponent: { run(...params: unknown[]): unknown }, chunkId: number, embedding: number[]): void {\n for (let dimension = 0; dimension < embedding.length; dimension++) {\n insertComponent.run(chunkId, dimension, embedding[dimension]);\n }\n}\n\nfunction parsePath(value: string | null): string[] {\n if (!value) {\n return [];\n }\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string') : [];\n } catch {\n return [];\n }\n}\n\nfunction buildVectorScoredRowsQuery(\n embedding: number[],\n metric: RdfVectorDistanceMetric,\n options: RdfVectorSearchOptions,\n): { sql: string; params: unknown[] } {\n const scored = buildVectorScoredBaseQuery(embedding, metric, options);\n const orderBy = buildVectorOrderClause(metric, options.orderBy);\n const window = buildVectorWindowClause(options.limit, options.offset);\n return {\n sql: `\n ${scored.withSql}\n SELECT\n scored.*,\n scored.dot_product AS dot_product,\n ${vectorScoreSql(metric, scored.queryMagnitude)} AS vector_score,\n ${vectorDistanceSql(metric, scored.queryMagnitude)} AS vector_distance,\n ${vectorSquaredDistanceSql(scored.queryMagnitude)} AS vector_distance_squared\n FROM scored\n ${scored.thresholdWhere}\n ORDER BY ${orderBy}\n ${window.sql}\n `,\n params: [...scored.params, ...window.params],\n };\n}\n\nfunction buildVectorScoredCountQuery(\n embedding: number[],\n metric: RdfVectorDistanceMetric,\n options: RdfVectorSearchOptions,\n): { sql: string; params: unknown[] } {\n const scored = buildVectorScoredBaseQuery(embedding, metric, options);\n return {\n sql: `\n ${scored.withSql}\n SELECT COUNT(*) AS count\n FROM scored\n ${scored.thresholdWhere}\n `,\n params: scored.params,\n };\n}\n\nfunction buildVectorScoredBaseQuery(\n embedding: number[],\n metric: RdfVectorDistanceMetric,\n options: RdfVectorSearchOptions,\n): {\n withSql: string;\n params: unknown[];\n thresholdWhere: string;\n queryMagnitude: number;\n} {\n const queryMagnitude = vectorMagnitude(embedding);\n const vectorValues = embedding.map(() => '(?, ?)').join(', ');\n const vectorParams = embedding.flatMap((value, dimension) => [dimension, value]);\n const conditions = ['chunk.dimensions = ?'];\n const params: unknown[] = [...vectorParams, embedding.length];\n\n if (metric === 'cosine') {\n conditions.push('chunk.magnitude > 0');\n }\n if (options.workspace) {\n conditions.push('source.workspace = ?');\n params.push(options.workspace);\n }\n if (options.source) {\n conditions.push('source.source = ?');\n params.push(options.source);\n }\n if (options.sourcePrefix) {\n conditions.push('source.source >= ? AND source.source < ?');\n params.push(options.sourcePrefix, `${options.sourcePrefix}\\uffff`);\n }\n if (options.model !== undefined) {\n conditions.push('chunk.model = ?');\n params.push(options.model);\n }\n\n const thresholdWhere = options.threshold === undefined\n ? ''\n : `WHERE ${vectorThresholdSql(metric, queryMagnitude, options.threshold)}`;\n\n return {\n withSql: `\n WITH query_vector(dimension, value) AS (\n VALUES ${vectorValues}\n ),\n scored AS (\n SELECT\n chunk.id,\n chunk.source_id,\n source.source,\n source.workspace,\n source.local_path,\n source.content_type,\n source.source_version,\n source.source_hash,\n chunk.chunk_key,\n chunk.ordinal,\n chunk.level,\n chunk.heading,\n chunk.path,\n chunk.content,\n chunk.start_offset,\n chunk.end_offset,\n chunk.embedding_json,\n chunk.dimensions,\n chunk.magnitude,\n chunk.model,\n chunk.updated_at,\n SUM(component.value * query_vector.value) AS dot_product\n FROM rdf_vector_chunks chunk\n JOIN rdf_vector_sources source ON source.id = chunk.source_id\n JOIN rdf_vector_components component ON component.chunk_id = chunk.id\n JOIN query_vector ON query_vector.dimension = component.dimension\n WHERE ${conditions.join(' AND ')}\n GROUP BY chunk.id\n HAVING COUNT(component.dimension) = ${sqlInteger(embedding.length)}\n )\n `,\n params,\n thresholdWhere,\n queryMagnitude,\n };\n}\n\nfunction buildVectorOrderClause(\n metric: RdfVectorDistanceMetric,\n orderBy: RdfVectorSearchOrder[] | undefined,\n): string {\n const order = orderBy?.length ? orderBy : [{ field: 'score' as const, direction: 'desc' as const }];\n const entries = order.map((entry) => `${vectorOrderExpression(metric, entry.field)} ${entry.direction === 'desc' ? 'DESC' : 'ASC'}`);\n return [...entries, 'source_id ASC', 'ordinal ASC'].join(', ');\n}\n\nfunction vectorOrderExpression(metric: RdfVectorDistanceMetric, field: RdfVectorSearchOrder['field']): string {\n switch (field) {\n case 'score':\n return 'vector_score';\n case 'distance':\n return metric === 'euclidean' ? 'vector_distance_squared' : 'vector_distance';\n case 'source':\n return 'source';\n case 'localPath':\n return \"COALESCE(local_path, '')\";\n case 'ordinal':\n return 'ordinal';\n case 'startOffset':\n return 'start_offset';\n case 'endOffset':\n return 'end_offset';\n default: {\n const exhaustive: never = field;\n throw new Error(`Unsupported RDF vector search order field: ${exhaustive}`);\n }\n }\n}\n\nfunction buildVectorWindowClause(limit: number | undefined, offset: number | undefined): { sql: string; params: unknown[] } {\n const hasLimit = limit !== undefined;\n const hasOffset = offset !== undefined;\n if (!hasLimit && !hasOffset) {\n return { sql: '', params: [] };\n }\n if (hasLimit) {\n const params: unknown[] = [Math.max(0, limit)];\n if (hasOffset) {\n params.push(Math.max(0, offset));\n return { sql: 'LIMIT ? OFFSET ?', params };\n }\n return { sql: 'LIMIT ?', params };\n }\n return { sql: 'LIMIT -1 OFFSET ?', params: [Math.max(0, offset ?? 0)] };\n}\n\nfunction vectorScoreSql(metric: RdfVectorDistanceMetric, queryMagnitude: number): string {\n switch (metric) {\n case 'cosine':\n return `dot_product / (${sqlNumber(queryMagnitude)} * magnitude)`;\n case 'dot':\n return 'dot_product';\n case 'euclidean':\n return `-(${vectorSquaredDistanceSql(queryMagnitude)})`;\n default: {\n const exhaustive: never = metric;\n throw new Error(`Unsupported RDF vector distance metric: ${exhaustive}`);\n }\n }\n}\n\nfunction vectorDistanceSql(metric: RdfVectorDistanceMetric, queryMagnitude: number): string {\n switch (metric) {\n case 'cosine':\n return `1 - (${vectorScoreSql(metric, queryMagnitude)})`;\n case 'dot':\n return '-dot_product';\n case 'euclidean':\n return 'NULL';\n default: {\n const exhaustive: never = metric;\n throw new Error(`Unsupported RDF vector distance metric: ${exhaustive}`);\n }\n }\n}\n\nfunction vectorSquaredDistanceSql(queryMagnitude: number): string {\n return `(${sqlNumber(queryMagnitude * queryMagnitude)} + magnitude * magnitude - 2 * dot_product)`;\n}\n\nfunction vectorThresholdSql(metric: RdfVectorDistanceMetric, queryMagnitude: number, threshold: number): string {\n if (!Number.isFinite(threshold)) {\n return threshold === Number.NEGATIVE_INFINITY ? '1 = 1' : '1 = 0';\n }\n\n switch (metric) {\n case 'cosine':\n case 'dot':\n return `${vectorScoreSql(metric, queryMagnitude)} >= ${sqlNumber(threshold)}`;\n case 'euclidean':\n return threshold <= 0\n ? `${vectorSquaredDistanceSql(queryMagnitude)} <= ${sqlNumber(threshold * threshold)}`\n : '1 = 0';\n default: {\n const exhaustive: never = metric;\n throw new Error(`Unsupported RDF vector distance metric: ${exhaustive}`);\n }\n }\n}\n\nfunction applyResultWindow(rows: number, offset: number | undefined, limit: number | undefined): number {\n const start = Math.max(0, offset ?? 0);\n if (rows <= start) {\n return 0;\n }\n const remaining = rows - start;\n return limit === undefined ? remaining : Math.min(remaining, Math.max(0, limit));\n}\n\nfunction sqlInteger(value: number): string {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`Invalid RDF vector SQL integer: ${value}`);\n }\n return String(value);\n}\n\nfunction sqlNumber(value: number): string {\n if (!Number.isFinite(value)) {\n throw new Error(`Invalid RDF vector SQL number: ${value}`);\n }\n return String(value);\n}\n"]}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serializeRdfXml = serializeRdfXml;
|
|
4
|
+
const n3_1 = require("n3");
|
|
5
|
+
const RDF_NS = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
6
|
+
const XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string';
|
|
7
|
+
const RDF_LANG_STRING = `${RDF_NS}langString`;
|
|
8
|
+
const NC_NAME = /^[A-Za-z_][A-Za-z0-9._-]*$/u;
|
|
9
|
+
function serializeRdfXml(quads) {
|
|
10
|
+
const predicateNames = new Map();
|
|
11
|
+
const namespacePrefixes = new Map([[RDF_NS, 'rdf']]);
|
|
12
|
+
for (const quad of quads) {
|
|
13
|
+
if (quad.graph.termType !== 'DefaultGraph') {
|
|
14
|
+
throw new Error(`RDF/XML cannot serialize named graph quads: ${quad.graph.value}`);
|
|
15
|
+
}
|
|
16
|
+
if (quad.predicate.termType !== 'NamedNode') {
|
|
17
|
+
throw new Error(`RDF/XML predicate must be a named node: ${(0, n3_1.termToId)(quad.predicate)}`);
|
|
18
|
+
}
|
|
19
|
+
const name = splitPredicateIri(quad.predicate.value);
|
|
20
|
+
predicateNames.set(quad.predicate.value, name);
|
|
21
|
+
if (!namespacePrefixes.has(name.namespace)) {
|
|
22
|
+
namespacePrefixes.set(name.namespace, `ns${namespacePrefixes.size}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const blankNodeIds = new Map();
|
|
26
|
+
const lines = [
|
|
27
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
28
|
+
'<rdf:RDF',
|
|
29
|
+
...[...namespacePrefixes.entries()]
|
|
30
|
+
.map(([namespace, prefix]) => ` xmlns:${prefix}="${escapeXmlAttribute(namespace)}"`),
|
|
31
|
+
'>',
|
|
32
|
+
];
|
|
33
|
+
for (const [subject, subjectQuads] of groupBySubject(quads)) {
|
|
34
|
+
lines.push(` <rdf:Description ${subjectAttribute(subjectQuads[0].subject, blankNodeIds)}>`);
|
|
35
|
+
for (const quad of subjectQuads) {
|
|
36
|
+
const name = predicateNames.get(quad.predicate.value);
|
|
37
|
+
const prefix = namespacePrefixes.get(name.namespace);
|
|
38
|
+
lines.push(` ${propertyElement(`${prefix}:${name.localName}`, quad.object, blankNodeIds)}`);
|
|
39
|
+
}
|
|
40
|
+
lines.push(' </rdf:Description>');
|
|
41
|
+
}
|
|
42
|
+
lines.push('</rdf:RDF>', '');
|
|
43
|
+
return lines.join('\n');
|
|
44
|
+
}
|
|
45
|
+
function groupBySubject(quads) {
|
|
46
|
+
const groups = new Map();
|
|
47
|
+
for (const quad of quads) {
|
|
48
|
+
const key = (0, n3_1.termToId)(quad.subject);
|
|
49
|
+
const group = groups.get(key);
|
|
50
|
+
if (group) {
|
|
51
|
+
group.push(quad);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
groups.set(key, [quad]);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return groups;
|
|
58
|
+
}
|
|
59
|
+
function subjectAttribute(subject, blankNodeIds) {
|
|
60
|
+
if (subject.termType === 'NamedNode') {
|
|
61
|
+
return `rdf:about="${escapeXmlAttribute(subject.value)}"`;
|
|
62
|
+
}
|
|
63
|
+
if (subject.termType === 'BlankNode') {
|
|
64
|
+
return `rdf:nodeID="${blankNodeId(subject, blankNodeIds)}"`;
|
|
65
|
+
}
|
|
66
|
+
throw new Error(`RDF/XML subject must be a named node or blank node: ${(0, n3_1.termToId)(subject)}`);
|
|
67
|
+
}
|
|
68
|
+
function propertyElement(qname, object, blankNodeIds) {
|
|
69
|
+
if (object.termType === 'NamedNode') {
|
|
70
|
+
return `<${qname} rdf:resource="${escapeXmlAttribute(object.value)}"/>`;
|
|
71
|
+
}
|
|
72
|
+
if (object.termType === 'BlankNode') {
|
|
73
|
+
return `<${qname} rdf:nodeID="${blankNodeId(object, blankNodeIds)}"/>`;
|
|
74
|
+
}
|
|
75
|
+
if (object.termType !== 'Literal') {
|
|
76
|
+
throw new Error(`RDF/XML object must be a named node, blank node, or literal: ${(0, n3_1.termToId)(object)}`);
|
|
77
|
+
}
|
|
78
|
+
const attributes = [];
|
|
79
|
+
if (object.language) {
|
|
80
|
+
attributes.push(`xml:lang="${escapeXmlAttribute(object.language)}"`);
|
|
81
|
+
}
|
|
82
|
+
if (object.datatype
|
|
83
|
+
&& object.datatype.value !== XSD_STRING
|
|
84
|
+
&& object.datatype.value !== RDF_LANG_STRING) {
|
|
85
|
+
attributes.push(`rdf:datatype="${escapeXmlAttribute(object.datatype.value)}"`);
|
|
86
|
+
}
|
|
87
|
+
const suffix = attributes.length > 0 ? ` ${attributes.join(' ')}` : '';
|
|
88
|
+
return `<${qname}${suffix}>${escapeXmlText(object.value)}</${qname}>`;
|
|
89
|
+
}
|
|
90
|
+
function splitPredicateIri(iri) {
|
|
91
|
+
for (const separator of ['#', '/', ':']) {
|
|
92
|
+
const index = iri.lastIndexOf(separator);
|
|
93
|
+
if (index > -1 && index < iri.length - 1) {
|
|
94
|
+
const namespace = iri.slice(0, index + 1);
|
|
95
|
+
const localName = iri.slice(index + 1);
|
|
96
|
+
if (NC_NAME.test(localName)) {
|
|
97
|
+
return { namespace, localName };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
throw new Error(`RDF/XML predicate IRI cannot be represented as an XML QName: ${iri}`);
|
|
102
|
+
}
|
|
103
|
+
function blankNodeId(node, blankNodeIds) {
|
|
104
|
+
const existing = blankNodeIds.get(node.value);
|
|
105
|
+
if (existing) {
|
|
106
|
+
return existing;
|
|
107
|
+
}
|
|
108
|
+
const generated = NC_NAME.test(node.value) ? node.value : `b${blankNodeIds.size + 1}`;
|
|
109
|
+
blankNodeIds.set(node.value, generated);
|
|
110
|
+
return generated;
|
|
111
|
+
}
|
|
112
|
+
function escapeXmlText(value) {
|
|
113
|
+
return value
|
|
114
|
+
.replaceAll('&', '&')
|
|
115
|
+
.replaceAll('<', '<')
|
|
116
|
+
.replaceAll('>', '>');
|
|
117
|
+
}
|
|
118
|
+
function escapeXmlAttribute(value) {
|
|
119
|
+
return escapeXmlText(value)
|
|
120
|
+
.replaceAll('"', '"')
|
|
121
|
+
.replaceAll("'", ''');
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=RdfXmlSerializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RdfXmlSerializer.js","sourceRoot":"","sources":["../../../src/storage/rdf/RdfXmlSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BlankNode, NamedNode, Quad, Term } from '@rdfjs/types';\nimport { termToId } from 'n3';\n\nconst RDF_NS = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';\nconst XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string';\nconst RDF_LANG_STRING = `${RDF_NS}langString`;\nconst NC_NAME = /^[A-Za-z_][A-Za-z0-9._-]*$/u;\n\ninterface PredicateName {\n namespace: string;\n localName: string;\n}\n\nexport function serializeRdfXml(quads: Quad[]): string {\n const predicateNames = new Map<string, PredicateName>();\n const namespacePrefixes = new Map<string, string>([[RDF_NS, 'rdf']]);\n\n for (const quad of quads) {\n if (quad.graph.termType !== 'DefaultGraph') {\n throw new Error(`RDF/XML cannot serialize named graph quads: ${quad.graph.value}`);\n }\n if (quad.predicate.termType !== 'NamedNode') {\n throw new Error(`RDF/XML predicate must be a named node: ${termToId(quad.predicate as any)}`);\n }\n const name = splitPredicateIri(quad.predicate.value);\n predicateNames.set(quad.predicate.value, name);\n if (!namespacePrefixes.has(name.namespace)) {\n namespacePrefixes.set(name.namespace, `ns${namespacePrefixes.size}`);\n }\n }\n\n const blankNodeIds = new Map<string, string>();\n const lines: string[] = [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<rdf:RDF',\n ...[...namespacePrefixes.entries()]\n .map(([namespace, prefix]) => ` xmlns:${prefix}=\"${escapeXmlAttribute(namespace)}\"`),\n '>',\n ];\n\n for (const [subject, subjectQuads] of groupBySubject(quads)) {\n lines.push(` <rdf:Description ${subjectAttribute(subjectQuads[0].subject, blankNodeIds)}>`);\n for (const quad of subjectQuads) {\n const name = predicateNames.get(quad.predicate.value)!;\n const prefix = namespacePrefixes.get(name.namespace)!;\n lines.push(` ${propertyElement(`${prefix}:${name.localName}`, quad.object, blankNodeIds)}`);\n }\n lines.push(' </rdf:Description>');\n }\n\n lines.push('</rdf:RDF>', '');\n return lines.join('\\n');\n}\n\nfunction groupBySubject(quads: Quad[]): Map<string, Quad[]> {\n const groups = new Map<string, Quad[]>();\n for (const quad of quads) {\n const key = termToId(quad.subject as any);\n const group = groups.get(key);\n if (group) {\n group.push(quad);\n } else {\n groups.set(key, [quad]);\n }\n }\n return groups;\n}\n\nfunction subjectAttribute(subject: Term, blankNodeIds: Map<string, string>): string {\n if (subject.termType === 'NamedNode') {\n return `rdf:about=\"${escapeXmlAttribute(subject.value)}\"`;\n }\n if (subject.termType === 'BlankNode') {\n return `rdf:nodeID=\"${blankNodeId(subject, blankNodeIds)}\"`;\n }\n throw new Error(`RDF/XML subject must be a named node or blank node: ${termToId(subject as any)}`);\n}\n\nfunction propertyElement(\n qname: string,\n object: Term,\n blankNodeIds: Map<string, string>,\n): string {\n if (object.termType === 'NamedNode') {\n return `<${qname} rdf:resource=\"${escapeXmlAttribute(object.value)}\"/>`;\n }\n if (object.termType === 'BlankNode') {\n return `<${qname} rdf:nodeID=\"${blankNodeId(object, blankNodeIds)}\"/>`;\n }\n if (object.termType !== 'Literal') {\n throw new Error(`RDF/XML object must be a named node, blank node, or literal: ${termToId(object as any)}`);\n }\n\n const attributes: string[] = [];\n if (object.language) {\n attributes.push(`xml:lang=\"${escapeXmlAttribute(object.language)}\"`);\n }\n if (\n object.datatype\n && object.datatype.value !== XSD_STRING\n && object.datatype.value !== RDF_LANG_STRING\n ) {\n attributes.push(`rdf:datatype=\"${escapeXmlAttribute(object.datatype.value)}\"`);\n }\n\n const suffix = attributes.length > 0 ? ` ${attributes.join(' ')}` : '';\n return `<${qname}${suffix}>${escapeXmlText(object.value)}</${qname}>`;\n}\n\nfunction splitPredicateIri(iri: string): PredicateName {\n for (const separator of ['#', '/', ':']) {\n const index = iri.lastIndexOf(separator);\n if (index > -1 && index < iri.length - 1) {\n const namespace = iri.slice(0, index + 1);\n const localName = iri.slice(index + 1);\n if (NC_NAME.test(localName)) {\n return { namespace, localName };\n }\n }\n }\n throw new Error(`RDF/XML predicate IRI cannot be represented as an XML QName: ${iri}`);\n}\n\nfunction blankNodeId(node: BlankNode, blankNodeIds: Map<string, string>): string {\n const existing = blankNodeIds.get(node.value);\n if (existing) {\n return existing;\n }\n const generated = NC_NAME.test(node.value) ? node.value : `b${blankNodeIds.size + 1}`;\n blankNodeIds.set(node.value, generated);\n return generated;\n}\n\nfunction escapeXmlText(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>');\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return escapeXmlText(value)\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Term } from '@rdfjs/types';
|
|
2
|
+
import type { AsyncIterator } from 'asynciterator';
|
|
3
|
+
import type { AttributeMap, CompoundPattern, CompoundResult, QueryOptions, Quint, QuintPattern, QuintStore, StoreStats } from '../quint/types';
|
|
4
|
+
import { RdfQuadIndex } from './RdfQuadIndex';
|
|
5
|
+
import type { RdfQuadIndexOptions, RdfSourceInput, RdfShadowAutoBackfillOptions, RdfShadowBackfillOptions, RdfShadowBackfillResult, RdfShadowScanResult } from './types';
|
|
6
|
+
export interface ShadowRdfQuintStoreOptions {
|
|
7
|
+
compatibilityStore: QuintStore;
|
|
8
|
+
index: RdfQuadIndex | RdfQuadIndexOptions;
|
|
9
|
+
autoOpen?: boolean;
|
|
10
|
+
autoBackfill?: boolean | RdfShadowAutoBackfillOptions;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Shadow-first bridge from the existing TEXT QuintStore to the term-id RDF index.
|
|
14
|
+
*
|
|
15
|
+
* Reads keep using the compatibility store. Writes are mirrored into
|
|
16
|
+
* RdfQuadIndex so callers can run explicit shadow comparisons before any query
|
|
17
|
+
* path is switched to SolidRdfEngine.
|
|
18
|
+
*/
|
|
19
|
+
export declare class ShadowRdfQuintStore implements QuintStore {
|
|
20
|
+
readonly index: RdfQuadIndex;
|
|
21
|
+
private readonly compatibilityStore;
|
|
22
|
+
private readonly ownsIndex;
|
|
23
|
+
private readonly comparator;
|
|
24
|
+
private readonly autoBackfill?;
|
|
25
|
+
private opened;
|
|
26
|
+
private opening;
|
|
27
|
+
private autoBackfilled;
|
|
28
|
+
constructor(options: ShadowRdfQuintStoreOptions);
|
|
29
|
+
open(): Promise<void>;
|
|
30
|
+
private openOnce;
|
|
31
|
+
close(): Promise<void>;
|
|
32
|
+
get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]>;
|
|
33
|
+
match(subject?: Term | null, predicate?: Term | null, object?: Term | null, graph?: Term | null): AsyncIterator<Quint>;
|
|
34
|
+
getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]>;
|
|
35
|
+
count(pattern: QuintPattern): Promise<number>;
|
|
36
|
+
getCompound(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]>;
|
|
37
|
+
getAttributes(subjects: string[], predicates: string[], graph?: Term): Promise<AttributeMap>;
|
|
38
|
+
put(quint: Quint): Promise<void>;
|
|
39
|
+
multiPut(quints: Quint[]): Promise<void>;
|
|
40
|
+
replaceSource(quints: Quint[], source: RdfSourceInput): Promise<void>;
|
|
41
|
+
deleteSource(source: string): Promise<number>;
|
|
42
|
+
updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number>;
|
|
43
|
+
del(pattern: QuintPattern): Promise<number>;
|
|
44
|
+
multiDel(quints: Quint[]): Promise<void>;
|
|
45
|
+
stats(): Promise<StoreStats>;
|
|
46
|
+
clear(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Rebuild the term-id shadow index from the existing TEXT QuintStore.
|
|
49
|
+
*
|
|
50
|
+
* This is intentionally explicit: reads still use the compatibility store,
|
|
51
|
+
* and callers decide when it is acceptable to clear/rebuild the shadow index.
|
|
52
|
+
*/
|
|
53
|
+
backfillShadowIndex(options?: RdfShadowBackfillOptions): Promise<RdfShadowBackfillResult>;
|
|
54
|
+
shadowGet(pattern: QuintPattern, options?: QueryOptions): Promise<RdfShadowScanResult>;
|
|
55
|
+
private runAutoBackfill;
|
|
56
|
+
private shouldAutoBackfill;
|
|
57
|
+
private autoBackfillOptions;
|
|
58
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ShadowRdfQuintStore = void 0;
|
|
4
|
+
const n3_1 = require("n3");
|
|
5
|
+
const RdfQuadIndex_1 = require("./RdfQuadIndex");
|
|
6
|
+
const RdfShadowComparator_1 = require("./RdfShadowComparator");
|
|
7
|
+
/**
|
|
8
|
+
* Shadow-first bridge from the existing TEXT QuintStore to the term-id RDF index.
|
|
9
|
+
*
|
|
10
|
+
* Reads keep using the compatibility store. Writes are mirrored into
|
|
11
|
+
* RdfQuadIndex so callers can run explicit shadow comparisons before any query
|
|
12
|
+
* path is switched to SolidRdfEngine.
|
|
13
|
+
*/
|
|
14
|
+
class ShadowRdfQuintStore {
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.opened = false;
|
|
17
|
+
this.opening = null;
|
|
18
|
+
this.autoBackfilled = false;
|
|
19
|
+
this.compatibilityStore = options.compatibilityStore;
|
|
20
|
+
this.autoBackfill = options.autoBackfill;
|
|
21
|
+
if (options.index instanceof RdfQuadIndex_1.RdfQuadIndex) {
|
|
22
|
+
this.index = options.index;
|
|
23
|
+
this.ownsIndex = false;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
this.index = new RdfQuadIndex_1.RdfQuadIndex(options.index);
|
|
27
|
+
this.ownsIndex = true;
|
|
28
|
+
}
|
|
29
|
+
this.comparator = new RdfShadowComparator_1.RdfShadowComparator(this.index, this.compatibilityStore);
|
|
30
|
+
if (options.autoOpen) {
|
|
31
|
+
void this.open();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async open() {
|
|
35
|
+
if (this.opened) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
this.opening ??= this.openOnce().finally(() => {
|
|
39
|
+
this.opening = null;
|
|
40
|
+
});
|
|
41
|
+
await this.opening;
|
|
42
|
+
}
|
|
43
|
+
async openOnce() {
|
|
44
|
+
await this.compatibilityStore.open();
|
|
45
|
+
this.index.open();
|
|
46
|
+
this.opened = true;
|
|
47
|
+
await this.runAutoBackfill();
|
|
48
|
+
}
|
|
49
|
+
async close() {
|
|
50
|
+
if (this.opening) {
|
|
51
|
+
await this.opening.catch(() => { });
|
|
52
|
+
}
|
|
53
|
+
await this.compatibilityStore.close();
|
|
54
|
+
if (this.ownsIndex) {
|
|
55
|
+
this.index.close();
|
|
56
|
+
}
|
|
57
|
+
this.opened = false;
|
|
58
|
+
this.autoBackfilled = false;
|
|
59
|
+
}
|
|
60
|
+
async get(pattern, options) {
|
|
61
|
+
return this.compatibilityStore.get(pattern, options);
|
|
62
|
+
}
|
|
63
|
+
match(subject, predicate, object, graph) {
|
|
64
|
+
return this.compatibilityStore.match(subject, predicate, object, graph);
|
|
65
|
+
}
|
|
66
|
+
async getByGraphPrefix(prefix, options) {
|
|
67
|
+
return this.compatibilityStore.getByGraphPrefix(prefix, options);
|
|
68
|
+
}
|
|
69
|
+
async count(pattern) {
|
|
70
|
+
return this.compatibilityStore.count(pattern);
|
|
71
|
+
}
|
|
72
|
+
async getCompound(compound, options) {
|
|
73
|
+
const getCompound = this.compatibilityStore.getCompound?.bind(this.compatibilityStore);
|
|
74
|
+
if (!getCompound) {
|
|
75
|
+
throw new Error('Compatibility QuintStore does not support compound queries');
|
|
76
|
+
}
|
|
77
|
+
return getCompound(compound, options);
|
|
78
|
+
}
|
|
79
|
+
async getAttributes(subjects, predicates, graph) {
|
|
80
|
+
const getAttributes = this.compatibilityStore.getAttributes?.bind(this.compatibilityStore);
|
|
81
|
+
if (!getAttributes) {
|
|
82
|
+
throw new Error('Compatibility QuintStore does not support attribute queries');
|
|
83
|
+
}
|
|
84
|
+
return getAttributes(subjects, predicates, graph);
|
|
85
|
+
}
|
|
86
|
+
async put(quint) {
|
|
87
|
+
await this.compatibilityStore.put(quint);
|
|
88
|
+
this.index.put(quint);
|
|
89
|
+
}
|
|
90
|
+
async multiPut(quints) {
|
|
91
|
+
await this.compatibilityStore.multiPut(quints);
|
|
92
|
+
this.index.multiPut(quints);
|
|
93
|
+
}
|
|
94
|
+
async replaceSource(quints, source) {
|
|
95
|
+
await this.compatibilityStore.del({ graph: n3_1.DataFactory.namedNode(source.source) });
|
|
96
|
+
if (quints.length > 0) {
|
|
97
|
+
await this.compatibilityStore.multiPut(quints);
|
|
98
|
+
}
|
|
99
|
+
this.index.replaceSource(quints, source);
|
|
100
|
+
}
|
|
101
|
+
async deleteSource(source) {
|
|
102
|
+
const deleted = await this.compatibilityStore.del({ graph: n3_1.DataFactory.namedNode(source) });
|
|
103
|
+
this.index.deleteSource(source);
|
|
104
|
+
return deleted;
|
|
105
|
+
}
|
|
106
|
+
async updateEmbedding(pattern, embedding) {
|
|
107
|
+
return this.compatibilityStore.updateEmbedding(pattern, embedding);
|
|
108
|
+
}
|
|
109
|
+
async del(pattern) {
|
|
110
|
+
const deleted = await this.compatibilityStore.del(pattern);
|
|
111
|
+
this.index.delete(pattern);
|
|
112
|
+
return deleted;
|
|
113
|
+
}
|
|
114
|
+
async multiDel(quints) {
|
|
115
|
+
await this.compatibilityStore.multiDel(quints);
|
|
116
|
+
for (const quint of quints) {
|
|
117
|
+
this.index.delete({
|
|
118
|
+
graph: quint.graph,
|
|
119
|
+
subject: quint.subject,
|
|
120
|
+
predicate: quint.predicate,
|
|
121
|
+
object: quint.object,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async stats() {
|
|
126
|
+
return this.compatibilityStore.stats();
|
|
127
|
+
}
|
|
128
|
+
async clear() {
|
|
129
|
+
await this.compatibilityStore.clear();
|
|
130
|
+
this.index.clear();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Rebuild the term-id shadow index from the existing TEXT QuintStore.
|
|
134
|
+
*
|
|
135
|
+
* This is intentionally explicit: reads still use the compatibility store,
|
|
136
|
+
* and callers decide when it is acceptable to clear/rebuild the shadow index.
|
|
137
|
+
*/
|
|
138
|
+
async backfillShadowIndex(options = {}) {
|
|
139
|
+
await this.open();
|
|
140
|
+
const start = Date.now();
|
|
141
|
+
const batchSize = Math.max(1, Math.floor(options.batchSize ?? 1000));
|
|
142
|
+
if (options.clear) {
|
|
143
|
+
this.index.clear();
|
|
144
|
+
}
|
|
145
|
+
let scannedRows = 0;
|
|
146
|
+
let indexedRows = 0;
|
|
147
|
+
let batchCount = 0;
|
|
148
|
+
while (true) {
|
|
149
|
+
const batch = await this.compatibilityStore.get({}, {
|
|
150
|
+
order: ['graph', 'subject', 'predicate', 'object'],
|
|
151
|
+
limit: batchSize,
|
|
152
|
+
offset: scannedRows,
|
|
153
|
+
});
|
|
154
|
+
if (batch.length === 0) {
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
scannedRows += batch.length;
|
|
158
|
+
batchCount += 1;
|
|
159
|
+
this.index.multiPut(batch);
|
|
160
|
+
indexedRows += batch.length;
|
|
161
|
+
if (batch.length < batchSize) {
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
scannedRows,
|
|
167
|
+
indexedRows,
|
|
168
|
+
batchCount,
|
|
169
|
+
durationMs: Date.now() - start,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
async shadowGet(pattern, options) {
|
|
173
|
+
return this.comparator.compareScan({ pattern, options });
|
|
174
|
+
}
|
|
175
|
+
async runAutoBackfill() {
|
|
176
|
+
if (this.autoBackfilled || !this.shouldAutoBackfill()) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
this.autoBackfilled = true;
|
|
180
|
+
await this.backfillShadowIndex(this.autoBackfillOptions());
|
|
181
|
+
}
|
|
182
|
+
shouldAutoBackfill() {
|
|
183
|
+
if (this.autoBackfill === true) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
if (typeof this.autoBackfill === 'object') {
|
|
187
|
+
return this.autoBackfill.enabled !== false;
|
|
188
|
+
}
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
autoBackfillOptions() {
|
|
192
|
+
if (typeof this.autoBackfill !== 'object') {
|
|
193
|
+
return {};
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
clear: this.autoBackfill.clear,
|
|
197
|
+
batchSize: this.autoBackfill.batchSize,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.ShadowRdfQuintStore = ShadowRdfQuintStore;
|
|
202
|
+
//# sourceMappingURL=ShadowRdfQuintStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShadowRdfQuintStore.js","sourceRoot":"","sources":["../../../src/storage/rdf/ShadowRdfQuintStore.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Term } from '@rdfjs/types';\nimport { DataFactory } from 'n3';\nimport type { AsyncIterator } from 'asynciterator';\nimport type {\n AttributeMap,\n CompoundPattern,\n CompoundResult,\n QueryOptions,\n Quint,\n QuintPattern,\n QuintStore,\n StoreStats,\n} from '../quint/types';\nimport { RdfQuadIndex } from './RdfQuadIndex';\nimport { RdfShadowComparator } from './RdfShadowComparator';\nimport type {\n RdfQuadIndexOptions,\n RdfSourceInput,\n RdfShadowAutoBackfillOptions,\n RdfShadowBackfillOptions,\n RdfShadowBackfillResult,\n RdfShadowScanResult,\n} from './types';\n\nexport interface ShadowRdfQuintStoreOptions {\n compatibilityStore: QuintStore;\n index: RdfQuadIndex | RdfQuadIndexOptions;\n autoOpen?: boolean;\n autoBackfill?: boolean | RdfShadowAutoBackfillOptions;\n}\n\n/**\n * Shadow-first bridge from the existing TEXT QuintStore to the term-id RDF index.\n *\n * Reads keep using the compatibility store. Writes are mirrored into\n * RdfQuadIndex so callers can run explicit shadow comparisons before any query\n * path is switched to SolidRdfEngine.\n */\nexport class ShadowRdfQuintStore implements QuintStore {\n public readonly index: RdfQuadIndex;\n private readonly compatibilityStore: QuintStore;\n private readonly ownsIndex: boolean;\n private readonly comparator: RdfShadowComparator;\n private readonly autoBackfill?: boolean | RdfShadowAutoBackfillOptions;\n private opened = false;\n private opening: Promise<void> | null = null;\n private autoBackfilled = false;\n\n public constructor(options: ShadowRdfQuintStoreOptions) {\n this.compatibilityStore = options.compatibilityStore;\n this.autoBackfill = options.autoBackfill;\n if (options.index instanceof RdfQuadIndex) {\n this.index = options.index;\n this.ownsIndex = false;\n } else {\n this.index = new RdfQuadIndex(options.index);\n this.ownsIndex = true;\n }\n this.comparator = new RdfShadowComparator(this.index, this.compatibilityStore);\n if (options.autoOpen) {\n void this.open();\n }\n }\n\n public async open(): Promise<void> {\n if (this.opened) {\n return;\n }\n\n this.opening ??= this.openOnce().finally(() => {\n this.opening = null;\n });\n\n await this.opening;\n }\n\n private async openOnce(): Promise<void> {\n await this.compatibilityStore.open();\n this.index.open();\n this.opened = true;\n await this.runAutoBackfill();\n }\n\n public async close(): Promise<void> {\n if (this.opening) {\n await this.opening.catch(() => {});\n }\n await this.compatibilityStore.close();\n if (this.ownsIndex) {\n this.index.close();\n }\n this.opened = false;\n this.autoBackfilled = false;\n }\n\n public async get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]> {\n return this.compatibilityStore.get(pattern, options);\n }\n\n public match(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null,\n ): AsyncIterator<Quint> {\n return this.compatibilityStore.match(subject, predicate, object, graph);\n }\n\n public async getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]> {\n return this.compatibilityStore.getByGraphPrefix(prefix, options);\n }\n\n public async count(pattern: QuintPattern): Promise<number> {\n return this.compatibilityStore.count(pattern);\n }\n\n public async getCompound(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]> {\n const getCompound = this.compatibilityStore.getCompound?.bind(this.compatibilityStore);\n if (!getCompound) {\n throw new Error('Compatibility QuintStore does not support compound queries');\n }\n return getCompound(compound, options);\n }\n\n public async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term,\n ): Promise<AttributeMap> {\n const getAttributes = this.compatibilityStore.getAttributes?.bind(this.compatibilityStore);\n if (!getAttributes) {\n throw new Error('Compatibility QuintStore does not support attribute queries');\n }\n return getAttributes(subjects, predicates, graph);\n }\n\n public async put(quint: Quint): Promise<void> {\n await this.compatibilityStore.put(quint);\n this.index.put(quint);\n }\n\n public async multiPut(quints: Quint[]): Promise<void> {\n await this.compatibilityStore.multiPut(quints);\n this.index.multiPut(quints);\n }\n\n public async replaceSource(quints: Quint[], source: RdfSourceInput): Promise<void> {\n await this.compatibilityStore.del({ graph: DataFactory.namedNode(source.source) });\n if (quints.length > 0) {\n await this.compatibilityStore.multiPut(quints);\n }\n this.index.replaceSource(quints, source);\n }\n\n public async deleteSource(source: string): Promise<number> {\n const deleted = await this.compatibilityStore.del({ graph: DataFactory.namedNode(source) });\n this.index.deleteSource(source);\n return deleted;\n }\n\n public async updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number> {\n return this.compatibilityStore.updateEmbedding(pattern, embedding);\n }\n\n public async del(pattern: QuintPattern): Promise<number> {\n const deleted = await this.compatibilityStore.del(pattern);\n this.index.delete(pattern);\n return deleted;\n }\n\n public async multiDel(quints: Quint[]): Promise<void> {\n await this.compatibilityStore.multiDel(quints);\n for (const quint of quints) {\n this.index.delete({\n graph: quint.graph,\n subject: quint.subject,\n predicate: quint.predicate,\n object: quint.object,\n });\n }\n }\n\n public async stats(): Promise<StoreStats> {\n return this.compatibilityStore.stats();\n }\n\n public async clear(): Promise<void> {\n await this.compatibilityStore.clear();\n this.index.clear();\n }\n\n /**\n * Rebuild the term-id shadow index from the existing TEXT QuintStore.\n *\n * This is intentionally explicit: reads still use the compatibility store,\n * and callers decide when it is acceptable to clear/rebuild the shadow index.\n */\n public async backfillShadowIndex(options: RdfShadowBackfillOptions = {}): Promise<RdfShadowBackfillResult> {\n await this.open();\n\n const start = Date.now();\n const batchSize = Math.max(1, Math.floor(options.batchSize ?? 1000));\n if (options.clear) {\n this.index.clear();\n }\n\n let scannedRows = 0;\n let indexedRows = 0;\n let batchCount = 0;\n\n while (true) {\n const batch = await this.compatibilityStore.get({}, {\n order: ['graph', 'subject', 'predicate', 'object'],\n limit: batchSize,\n offset: scannedRows,\n });\n if (batch.length === 0) {\n break;\n }\n\n scannedRows += batch.length;\n batchCount += 1;\n this.index.multiPut(batch);\n indexedRows += batch.length;\n\n if (batch.length < batchSize) {\n break;\n }\n }\n\n return {\n scannedRows,\n indexedRows,\n batchCount,\n durationMs: Date.now() - start,\n };\n }\n\n public async shadowGet(pattern: QuintPattern, options?: QueryOptions): Promise<RdfShadowScanResult> {\n return this.comparator.compareScan({ pattern, options });\n }\n\n private async runAutoBackfill(): Promise<void> {\n if (this.autoBackfilled || !this.shouldAutoBackfill()) {\n return;\n }\n this.autoBackfilled = true;\n await this.backfillShadowIndex(this.autoBackfillOptions());\n }\n\n private shouldAutoBackfill(): boolean {\n if (this.autoBackfill === true) {\n return true;\n }\n if (typeof this.autoBackfill === 'object') {\n return this.autoBackfill.enabled !== false;\n }\n return false;\n }\n\n private autoBackfillOptions(): RdfShadowBackfillOptions {\n if (typeof this.autoBackfill !== 'object') {\n return {};\n }\n return {\n clear: this.autoBackfill.clear,\n batchSize: this.autoBackfill.batchSize,\n };\n }\n}\n"]}
|