@undefineds.co/xpod 0.3.6 → 0.3.15
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 +308 -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/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 +79 -0
- package/dist/storage/rdf/RdfLocalQueryEngine.js +2705 -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 +56 -0
- package/dist/storage/rdf/SolidRdfEngine.js +292 -0
- package/dist/storage/rdf/SolidRdfEngine.js.map +1 -0
- package/dist/storage/rdf/SolidRdfEngine.jsonld +372 -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,352 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RdfTermDictionary = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const n3_1 = require("n3");
|
|
6
|
+
const RdfTermSemantics_1 = require("./RdfTermSemantics");
|
|
7
|
+
const XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string';
|
|
8
|
+
const RDF_LANG_STRING = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#langString';
|
|
9
|
+
class RdfTermDictionary {
|
|
10
|
+
constructor(db) {
|
|
11
|
+
this.db = db;
|
|
12
|
+
this.termCache = new Map();
|
|
13
|
+
this.idCache = new Map();
|
|
14
|
+
}
|
|
15
|
+
initialize() {
|
|
16
|
+
this.db.exec(`
|
|
17
|
+
CREATE TABLE IF NOT EXISTS rdf_terms (
|
|
18
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
19
|
+
kind TEXT NOT NULL,
|
|
20
|
+
value TEXT NOT NULL,
|
|
21
|
+
datatype_id INTEGER,
|
|
22
|
+
lang TEXT,
|
|
23
|
+
hash TEXT NOT NULL,
|
|
24
|
+
normalized_text TEXT,
|
|
25
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
26
|
+
UNIQUE (kind, value, datatype_id, lang)
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
CREATE INDEX IF NOT EXISTS rdf_terms_hash ON rdf_terms (hash);
|
|
30
|
+
CREATE INDEX IF NOT EXISTS rdf_terms_kind_value ON rdf_terms (kind, value);
|
|
31
|
+
CREATE INDEX IF NOT EXISTS rdf_terms_kind_datatype ON rdf_terms (kind, datatype_id);
|
|
32
|
+
CREATE INDEX IF NOT EXISTS rdf_terms_kind_lang ON rdf_terms (kind, lang);
|
|
33
|
+
CREATE INDEX IF NOT EXISTS rdf_terms_normalized_text ON rdf_terms (normalized_text);
|
|
34
|
+
`);
|
|
35
|
+
this.ensureNumericValueColumn();
|
|
36
|
+
this.db.exec('CREATE INDEX IF NOT EXISTS rdf_terms_kind_numeric_value ON rdf_terms (kind, numeric_value);');
|
|
37
|
+
this.backfillNumericValues();
|
|
38
|
+
}
|
|
39
|
+
getOrCreate(term) {
|
|
40
|
+
const identity = this.toIdentity(term);
|
|
41
|
+
const cacheKey = this.identityCacheKey(identity);
|
|
42
|
+
const cached = this.termCache.get(cacheKey);
|
|
43
|
+
if (cached !== undefined) {
|
|
44
|
+
return cached;
|
|
45
|
+
}
|
|
46
|
+
const existing = this.findId(identity);
|
|
47
|
+
if (existing !== undefined) {
|
|
48
|
+
this.termCache.set(cacheKey, existing);
|
|
49
|
+
return existing;
|
|
50
|
+
}
|
|
51
|
+
const stmt = this.db.prepare(`
|
|
52
|
+
INSERT INTO rdf_terms (kind, value, datatype_id, lang, hash, normalized_text, numeric_value)
|
|
53
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
54
|
+
`);
|
|
55
|
+
const result = stmt.run(identity.kind, identity.value, identity.datatypeId, identity.lang, identity.hash, identity.normalizedText, identity.numericValue);
|
|
56
|
+
const id = Number(result.lastInsertRowid);
|
|
57
|
+
this.termCache.set(cacheKey, id);
|
|
58
|
+
this.idCache.set(id, term);
|
|
59
|
+
return id;
|
|
60
|
+
}
|
|
61
|
+
find(term) {
|
|
62
|
+
const identity = this.toIdentity(term);
|
|
63
|
+
const cacheKey = this.identityCacheKey(identity);
|
|
64
|
+
const cached = this.termCache.get(cacheKey);
|
|
65
|
+
if (cached !== undefined) {
|
|
66
|
+
return cached;
|
|
67
|
+
}
|
|
68
|
+
const id = this.findId(identity);
|
|
69
|
+
if (id !== undefined) {
|
|
70
|
+
this.termCache.set(cacheKey, id);
|
|
71
|
+
}
|
|
72
|
+
return id;
|
|
73
|
+
}
|
|
74
|
+
termForId(id) {
|
|
75
|
+
const cached = this.idCache.get(id);
|
|
76
|
+
if (cached) {
|
|
77
|
+
return cached;
|
|
78
|
+
}
|
|
79
|
+
const row = this.db
|
|
80
|
+
.prepare('SELECT * FROM rdf_terms WHERE id = ?')
|
|
81
|
+
.get(id);
|
|
82
|
+
if (!row) {
|
|
83
|
+
throw new Error(`RDF term not found: ${id}`);
|
|
84
|
+
}
|
|
85
|
+
const term = this.rowToTerm(row);
|
|
86
|
+
this.idCache.set(id, term);
|
|
87
|
+
return term;
|
|
88
|
+
}
|
|
89
|
+
rowsForIds(ids) {
|
|
90
|
+
const uniqueIds = Array.from(new Set(ids));
|
|
91
|
+
const result = new Map();
|
|
92
|
+
const missing = [];
|
|
93
|
+
for (const id of uniqueIds) {
|
|
94
|
+
const cached = this.idCache.get(id);
|
|
95
|
+
if (cached) {
|
|
96
|
+
result.set(id, cached);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
missing.push(id);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (missing.length === 0) {
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
const placeholders = missing.map(() => '?').join(', ');
|
|
106
|
+
const rows = this.db
|
|
107
|
+
.prepare(`SELECT * FROM rdf_terms WHERE id IN (${placeholders})`)
|
|
108
|
+
.all(...missing);
|
|
109
|
+
for (const row of rows) {
|
|
110
|
+
const term = this.rowToTerm(row);
|
|
111
|
+
this.idCache.set(row.id, term);
|
|
112
|
+
result.set(row.id, term);
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
idsByValuePrefix(kind, prefix) {
|
|
117
|
+
const kinds = Array.isArray(kind) ? kind : [kind];
|
|
118
|
+
if (kinds.length === 0) {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
const rows = this.db
|
|
122
|
+
.prepare(`
|
|
123
|
+
SELECT id FROM rdf_terms
|
|
124
|
+
WHERE kind IN (${kinds.map(() => '?').join(', ')})
|
|
125
|
+
AND value >= ?
|
|
126
|
+
AND value < ?
|
|
127
|
+
`)
|
|
128
|
+
.all(...kinds, prefix, `${prefix}\uffff`);
|
|
129
|
+
return rows.map((row) => row.id);
|
|
130
|
+
}
|
|
131
|
+
idsByNormalizedTextContains(kind, text) {
|
|
132
|
+
const kinds = Array.isArray(kind) ? kind : [kind];
|
|
133
|
+
if (kinds.length === 0) {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
const needle = normalizeSearchText(text);
|
|
137
|
+
const rows = this.db
|
|
138
|
+
.prepare(`
|
|
139
|
+
SELECT id, value FROM rdf_terms
|
|
140
|
+
WHERE kind IN (${kinds.map(() => '?').join(', ')})
|
|
141
|
+
AND normalized_text LIKE ? ESCAPE '\\'
|
|
142
|
+
`)
|
|
143
|
+
.all(...kinds, `%${escapeLikePattern(needle)}%`);
|
|
144
|
+
return rows
|
|
145
|
+
.filter((row) => row.value.includes(text))
|
|
146
|
+
.map((row) => row.id);
|
|
147
|
+
}
|
|
148
|
+
idsByNormalizedTextSuffix(kind, suffix) {
|
|
149
|
+
const kinds = Array.isArray(kind) ? kind : [kind];
|
|
150
|
+
if (kinds.length === 0) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
const needle = normalizeSearchText(suffix);
|
|
154
|
+
const rows = this.db
|
|
155
|
+
.prepare(`
|
|
156
|
+
SELECT id, value FROM rdf_terms
|
|
157
|
+
WHERE kind IN (${kinds.map(() => '?').join(', ')})
|
|
158
|
+
AND normalized_text LIKE ? ESCAPE '\\'
|
|
159
|
+
`)
|
|
160
|
+
.all(...kinds, `%${escapeLikePattern(needle)}`);
|
|
161
|
+
return rows
|
|
162
|
+
.filter((row) => row.value.endsWith(suffix))
|
|
163
|
+
.map((row) => row.id);
|
|
164
|
+
}
|
|
165
|
+
idsByNormalizedTextRegex(kind, pattern, flags) {
|
|
166
|
+
const kinds = Array.isArray(kind) ? kind : [kind];
|
|
167
|
+
if (kinds.length === 0) {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
const rows = this.db
|
|
171
|
+
.prepare(`
|
|
172
|
+
SELECT * FROM rdf_terms
|
|
173
|
+
WHERE kind IN (${kinds.map(() => '?').join(', ')})
|
|
174
|
+
AND normalized_text IS NOT NULL
|
|
175
|
+
`)
|
|
176
|
+
.all(...kinds);
|
|
177
|
+
const regex = new RegExp(pattern, flags);
|
|
178
|
+
return rows
|
|
179
|
+
.filter((row) => regex.test(row.value))
|
|
180
|
+
.map((row) => row.id);
|
|
181
|
+
}
|
|
182
|
+
count() {
|
|
183
|
+
const row = this.db.prepare('SELECT COUNT(*) AS count FROM rdf_terms').get();
|
|
184
|
+
return row?.count ?? 0;
|
|
185
|
+
}
|
|
186
|
+
findId(identity) {
|
|
187
|
+
const row = identity.datatypeId === null && identity.lang === null
|
|
188
|
+
? this.db
|
|
189
|
+
.prepare(`
|
|
190
|
+
SELECT id FROM rdf_terms
|
|
191
|
+
WHERE kind = ?
|
|
192
|
+
AND value = ?
|
|
193
|
+
AND datatype_id IS NULL
|
|
194
|
+
AND lang IS NULL
|
|
195
|
+
LIMIT 1
|
|
196
|
+
`)
|
|
197
|
+
.get(identity.kind, identity.value)
|
|
198
|
+
: identity.datatypeId === null
|
|
199
|
+
? this.db
|
|
200
|
+
.prepare(`
|
|
201
|
+
SELECT id FROM rdf_terms
|
|
202
|
+
WHERE kind = ?
|
|
203
|
+
AND value = ?
|
|
204
|
+
AND datatype_id IS NULL
|
|
205
|
+
AND lang = ?
|
|
206
|
+
LIMIT 1
|
|
207
|
+
`)
|
|
208
|
+
.get(identity.kind, identity.value, identity.lang)
|
|
209
|
+
: identity.lang === null
|
|
210
|
+
? this.db
|
|
211
|
+
.prepare(`
|
|
212
|
+
SELECT id FROM rdf_terms
|
|
213
|
+
WHERE kind = ?
|
|
214
|
+
AND value = ?
|
|
215
|
+
AND datatype_id = ?
|
|
216
|
+
AND lang IS NULL
|
|
217
|
+
LIMIT 1
|
|
218
|
+
`)
|
|
219
|
+
.get(identity.kind, identity.value, identity.datatypeId)
|
|
220
|
+
: this.db
|
|
221
|
+
.prepare(`
|
|
222
|
+
SELECT id FROM rdf_terms
|
|
223
|
+
WHERE kind = ?
|
|
224
|
+
AND value = ?
|
|
225
|
+
AND datatype_id = ?
|
|
226
|
+
AND lang = ?
|
|
227
|
+
LIMIT 1
|
|
228
|
+
`)
|
|
229
|
+
.get(identity.kind, identity.value, identity.datatypeId, identity.lang);
|
|
230
|
+
return row?.id;
|
|
231
|
+
}
|
|
232
|
+
toIdentity(term) {
|
|
233
|
+
switch (term.termType) {
|
|
234
|
+
case 'NamedNode':
|
|
235
|
+
return this.identity('iri', term.value, null, null, term.value, null);
|
|
236
|
+
case 'BlankNode':
|
|
237
|
+
return this.identity('blank', term.value, null, null, term.value, null);
|
|
238
|
+
case 'DefaultGraph':
|
|
239
|
+
return this.identity('default_graph', '', null, null, null, null);
|
|
240
|
+
case 'Literal': {
|
|
241
|
+
const datatypeValue = term.datatype?.value || XSD_STRING;
|
|
242
|
+
const datatypeId = datatypeValue === XSD_STRING && !term.language
|
|
243
|
+
? null
|
|
244
|
+
: this.getOrCreate(n3_1.DataFactory.namedNode(datatypeValue));
|
|
245
|
+
return this.identity('literal', term.value, datatypeId, term.language || null, term.value, this.numericValueForLiteral(term.value, datatypeValue));
|
|
246
|
+
}
|
|
247
|
+
case 'Variable':
|
|
248
|
+
throw new Error(`Variables cannot be indexed as RDF terms: ${term.value}`);
|
|
249
|
+
case 'Quad':
|
|
250
|
+
throw new Error('Nested RDF-star quads are not supported by the first SolidRdfEngine index');
|
|
251
|
+
default: {
|
|
252
|
+
const exhaustive = term;
|
|
253
|
+
throw new Error(`Unsupported RDF term: ${String(exhaustive)}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
identity(kind, value, datatypeId, lang, normalizedText, numericValue) {
|
|
258
|
+
const hash = (0, node_crypto_1.createHash)('sha256')
|
|
259
|
+
.update(kind)
|
|
260
|
+
.update('\0')
|
|
261
|
+
.update(value)
|
|
262
|
+
.update('\0')
|
|
263
|
+
.update(String(datatypeId ?? ''))
|
|
264
|
+
.update('\0')
|
|
265
|
+
.update(lang ?? '')
|
|
266
|
+
.digest('hex');
|
|
267
|
+
return {
|
|
268
|
+
kind,
|
|
269
|
+
value,
|
|
270
|
+
datatypeId,
|
|
271
|
+
lang,
|
|
272
|
+
normalizedText: normalizedText ? normalizedText.toLowerCase() : null,
|
|
273
|
+
numericValue,
|
|
274
|
+
hash,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
numericValueForLiteral(value, datatypeValue) {
|
|
278
|
+
if (!(0, RdfTermSemantics_1.isRdfNumericDatatype)(datatypeValue)) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
const numeric = (0, RdfTermSemantics_1.rdfNumericValue)(value);
|
|
282
|
+
return Number.isFinite(numeric) ? numeric : null;
|
|
283
|
+
}
|
|
284
|
+
ensureNumericValueColumn() {
|
|
285
|
+
const columns = this.db.prepare('PRAGMA table_info(rdf_terms)').all();
|
|
286
|
+
if (columns.some((column) => column.name === 'numeric_value')) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
this.db.exec('ALTER TABLE rdf_terms ADD COLUMN numeric_value REAL;');
|
|
290
|
+
}
|
|
291
|
+
backfillNumericValues() {
|
|
292
|
+
const rows = this.db.prepare(`
|
|
293
|
+
SELECT literal.*
|
|
294
|
+
FROM rdf_terms literal
|
|
295
|
+
JOIN rdf_terms datatype ON datatype.id = literal.datatype_id
|
|
296
|
+
WHERE literal.kind = 'literal'
|
|
297
|
+
AND literal.numeric_value IS NULL
|
|
298
|
+
AND datatype.kind = 'iri'
|
|
299
|
+
`).all();
|
|
300
|
+
const update = this.db.prepare('UPDATE rdf_terms SET numeric_value = ? WHERE id = ?');
|
|
301
|
+
for (const row of rows) {
|
|
302
|
+
const datatype = this.termForId(row.datatype_id);
|
|
303
|
+
if (datatype.termType !== 'NamedNode') {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const numericValue = this.numericValueForLiteral(row.value, datatype.value);
|
|
307
|
+
if (numericValue !== null) {
|
|
308
|
+
update.run(numericValue, row.id);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
identityCacheKey(identity) {
|
|
313
|
+
return [
|
|
314
|
+
identity.kind,
|
|
315
|
+
identity.value,
|
|
316
|
+
identity.datatypeId ?? '',
|
|
317
|
+
identity.lang ?? '',
|
|
318
|
+
].join('\u001f');
|
|
319
|
+
}
|
|
320
|
+
rowToTerm(row) {
|
|
321
|
+
switch (row.kind) {
|
|
322
|
+
case 'iri':
|
|
323
|
+
return n3_1.DataFactory.namedNode(row.value);
|
|
324
|
+
case 'blank':
|
|
325
|
+
return n3_1.DataFactory.blankNode(row.value);
|
|
326
|
+
case 'default_graph':
|
|
327
|
+
return n3_1.DataFactory.defaultGraph();
|
|
328
|
+
case 'literal': {
|
|
329
|
+
if (row.lang) {
|
|
330
|
+
return n3_1.DataFactory.literal(row.value, row.lang);
|
|
331
|
+
}
|
|
332
|
+
if (row.datatype_id) {
|
|
333
|
+
const datatype = this.termForId(row.datatype_id);
|
|
334
|
+
if (datatype.termType === 'NamedNode' && datatype.value !== XSD_STRING && datatype.value !== RDF_LANG_STRING) {
|
|
335
|
+
return n3_1.DataFactory.literal(row.value, datatype);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return n3_1.DataFactory.literal(row.value);
|
|
339
|
+
}
|
|
340
|
+
default:
|
|
341
|
+
throw new Error(`Unsupported RDF term kind in dictionary row: ${row.kind}`);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
exports.RdfTermDictionary = RdfTermDictionary;
|
|
346
|
+
function normalizeSearchText(value) {
|
|
347
|
+
return value.toLowerCase();
|
|
348
|
+
}
|
|
349
|
+
function escapeLikePattern(value) {
|
|
350
|
+
return value.replace(/[\\%_]/g, (match) => `\\${match}`);
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=RdfTermDictionary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RdfTermDictionary.js","sourceRoot":"","sources":["../../../src/storage/rdf/RdfTermDictionary.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport { DataFactory } from 'n3';\nimport type { Term } from '@rdfjs/types';\nimport type { SqliteDatabase } from '../SqliteRuntime';\nimport type { RdfTermKind, RdfTermRow } from './types';\nimport { isRdfNumericDatatype, rdfNumericValue } from './RdfTermSemantics';\n\ninterface RdfTermIdentity {\n kind: RdfTermKind;\n value: string;\n datatypeId: number | null;\n lang: string | null;\n normalizedText: string | null;\n numericValue: number | null;\n hash: string;\n}\n\nconst XSD_STRING = 'http://www.w3.org/2001/XMLSchema#string';\nconst RDF_LANG_STRING = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#langString';\n\nexport class RdfTermDictionary {\n private readonly termCache = new Map<string, number>();\n private readonly idCache = new Map<number, Term>();\n\n public constructor(private readonly db: SqliteDatabase) {}\n\n public initialize(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS rdf_terms (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n kind TEXT NOT NULL,\n value TEXT NOT NULL,\n datatype_id INTEGER,\n lang TEXT,\n hash TEXT NOT NULL,\n normalized_text TEXT,\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),\n UNIQUE (kind, value, datatype_id, lang)\n );\n\n CREATE INDEX IF NOT EXISTS rdf_terms_hash ON rdf_terms (hash);\n CREATE INDEX IF NOT EXISTS rdf_terms_kind_value ON rdf_terms (kind, value);\n CREATE INDEX IF NOT EXISTS rdf_terms_kind_datatype ON rdf_terms (kind, datatype_id);\n CREATE INDEX IF NOT EXISTS rdf_terms_kind_lang ON rdf_terms (kind, lang);\n CREATE INDEX IF NOT EXISTS rdf_terms_normalized_text ON rdf_terms (normalized_text);\n `);\n this.ensureNumericValueColumn();\n this.db.exec('CREATE INDEX IF NOT EXISTS rdf_terms_kind_numeric_value ON rdf_terms (kind, numeric_value);');\n this.backfillNumericValues();\n }\n\n public getOrCreate(term: Term): number {\n const identity = this.toIdentity(term);\n const cacheKey = this.identityCacheKey(identity);\n const cached = this.termCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const existing = this.findId(identity);\n if (existing !== undefined) {\n this.termCache.set(cacheKey, existing);\n return existing;\n }\n\n const stmt = this.db.prepare(`\n INSERT INTO rdf_terms (kind, value, datatype_id, lang, hash, normalized_text, numeric_value)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n const result = stmt.run(\n identity.kind,\n identity.value,\n identity.datatypeId,\n identity.lang,\n identity.hash,\n identity.normalizedText,\n identity.numericValue,\n );\n const id = Number(result.lastInsertRowid);\n this.termCache.set(cacheKey, id);\n this.idCache.set(id, term);\n return id;\n }\n\n public find(term: Term): number | undefined {\n const identity = this.toIdentity(term);\n const cacheKey = this.identityCacheKey(identity);\n const cached = this.termCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const id = this.findId(identity);\n if (id !== undefined) {\n this.termCache.set(cacheKey, id);\n }\n return id;\n }\n\n public termForId(id: number): Term {\n const cached = this.idCache.get(id);\n if (cached) {\n return cached;\n }\n\n const row = this.db\n .prepare<RdfTermRow>('SELECT * FROM rdf_terms WHERE id = ?')\n .get(id);\n if (!row) {\n throw new Error(`RDF term not found: ${id}`);\n }\n\n const term = this.rowToTerm(row);\n this.idCache.set(id, term);\n return term;\n }\n\n public rowsForIds(ids: number[]): Map<number, Term> {\n const uniqueIds = Array.from(new Set(ids));\n const result = new Map<number, Term>();\n const missing: number[] = [];\n\n for (const id of uniqueIds) {\n const cached = this.idCache.get(id);\n if (cached) {\n result.set(id, cached);\n } else {\n missing.push(id);\n }\n }\n\n if (missing.length === 0) {\n return result;\n }\n\n const placeholders = missing.map(() => '?').join(', ');\n const rows = this.db\n .prepare<RdfTermRow>(`SELECT * FROM rdf_terms WHERE id IN (${placeholders})`)\n .all(...missing);\n\n for (const row of rows) {\n const term = this.rowToTerm(row);\n this.idCache.set(row.id, term);\n result.set(row.id, term);\n }\n\n return result;\n }\n\n public idsByValuePrefix(kind: RdfTermKind | RdfTermKind[], prefix: string): number[] {\n const kinds = Array.isArray(kind) ? kind : [kind];\n if (kinds.length === 0) {\n return [];\n }\n const rows = this.db\n .prepare<{ id: number }>(`\n SELECT id FROM rdf_terms\n WHERE kind IN (${kinds.map(() => '?').join(', ')})\n AND value >= ?\n AND value < ?\n `)\n .all(...kinds, prefix, `${prefix}\\uffff`);\n return rows.map((row) => row.id);\n }\n\n public idsByNormalizedTextContains(kind: RdfTermKind | RdfTermKind[], text: string): number[] {\n const kinds = Array.isArray(kind) ? kind : [kind];\n if (kinds.length === 0) {\n return [];\n }\n const needle = normalizeSearchText(text);\n const rows = this.db\n .prepare<{ id: number; value: string }>(`\n SELECT id, value FROM rdf_terms\n WHERE kind IN (${kinds.map(() => '?').join(', ')})\n AND normalized_text LIKE ? ESCAPE '\\\\'\n `)\n .all(...kinds, `%${escapeLikePattern(needle)}%`);\n return rows\n .filter((row) => row.value.includes(text))\n .map((row) => row.id);\n }\n\n public idsByNormalizedTextSuffix(kind: RdfTermKind | RdfTermKind[], suffix: string): number[] {\n const kinds = Array.isArray(kind) ? kind : [kind];\n if (kinds.length === 0) {\n return [];\n }\n const needle = normalizeSearchText(suffix);\n const rows = this.db\n .prepare<{ id: number; value: string }>(`\n SELECT id, value FROM rdf_terms\n WHERE kind IN (${kinds.map(() => '?').join(', ')})\n AND normalized_text LIKE ? ESCAPE '\\\\'\n `)\n .all(...kinds, `%${escapeLikePattern(needle)}`);\n return rows\n .filter((row) => row.value.endsWith(suffix))\n .map((row) => row.id);\n }\n\n public idsByNormalizedTextRegex(kind: RdfTermKind | RdfTermKind[], pattern: string, flags?: string): number[] {\n const kinds = Array.isArray(kind) ? kind : [kind];\n if (kinds.length === 0) {\n return [];\n }\n const rows = this.db\n .prepare<RdfTermRow>(`\n SELECT * FROM rdf_terms\n WHERE kind IN (${kinds.map(() => '?').join(', ')})\n AND normalized_text IS NOT NULL\n `)\n .all(...kinds);\n const regex = new RegExp(pattern, flags);\n return rows\n .filter((row) => regex.test(row.value))\n .map((row) => row.id);\n }\n\n public count(): number {\n const row = this.db.prepare<{ count: number }>('SELECT COUNT(*) AS count FROM rdf_terms').get();\n return row?.count ?? 0;\n }\n\n private findId(identity: RdfTermIdentity): number | undefined {\n const row = identity.datatypeId === null && identity.lang === null\n ? this.db\n .prepare<{ id: number }>(`\n SELECT id FROM rdf_terms\n WHERE kind = ?\n AND value = ?\n AND datatype_id IS NULL\n AND lang IS NULL\n LIMIT 1\n `)\n .get(identity.kind, identity.value)\n : identity.datatypeId === null\n ? this.db\n .prepare<{ id: number }>(`\n SELECT id FROM rdf_terms\n WHERE kind = ?\n AND value = ?\n AND datatype_id IS NULL\n AND lang = ?\n LIMIT 1\n `)\n .get(identity.kind, identity.value, identity.lang)\n : identity.lang === null\n ? this.db\n .prepare<{ id: number }>(`\n SELECT id FROM rdf_terms\n WHERE kind = ?\n AND value = ?\n AND datatype_id = ?\n AND lang IS NULL\n LIMIT 1\n `)\n .get(identity.kind, identity.value, identity.datatypeId)\n : this.db\n .prepare<{ id: number }>(`\n SELECT id FROM rdf_terms\n WHERE kind = ?\n AND value = ?\n AND datatype_id = ?\n AND lang = ?\n LIMIT 1\n `)\n .get(identity.kind, identity.value, identity.datatypeId, identity.lang);\n return row?.id;\n }\n\n private toIdentity(term: Term): RdfTermIdentity {\n switch (term.termType) {\n case 'NamedNode':\n return this.identity('iri', term.value, null, null, term.value, null);\n case 'BlankNode':\n return this.identity('blank', term.value, null, null, term.value, null);\n case 'DefaultGraph':\n return this.identity('default_graph', '', null, null, null, null);\n case 'Literal': {\n const datatypeValue = term.datatype?.value || XSD_STRING;\n const datatypeId = datatypeValue === XSD_STRING && !term.language\n ? null\n : this.getOrCreate(DataFactory.namedNode(datatypeValue));\n return this.identity(\n 'literal',\n term.value,\n datatypeId,\n term.language || null,\n term.value,\n this.numericValueForLiteral(term.value, datatypeValue),\n );\n }\n case 'Variable':\n throw new Error(`Variables cannot be indexed as RDF terms: ${term.value}`);\n case 'Quad':\n throw new Error('Nested RDF-star quads are not supported by the first SolidRdfEngine index');\n default: {\n const exhaustive: never = term;\n throw new Error(`Unsupported RDF term: ${String(exhaustive)}`);\n }\n }\n }\n\n private identity(\n kind: RdfTermKind,\n value: string,\n datatypeId: number | null,\n lang: string | null,\n normalizedText: string | null,\n numericValue: number | null,\n ): RdfTermIdentity {\n const hash = createHash('sha256')\n .update(kind)\n .update('\\0')\n .update(value)\n .update('\\0')\n .update(String(datatypeId ?? ''))\n .update('\\0')\n .update(lang ?? '')\n .digest('hex');\n return {\n kind,\n value,\n datatypeId,\n lang,\n normalizedText: normalizedText ? normalizedText.toLowerCase() : null,\n numericValue,\n hash,\n };\n }\n\n private numericValueForLiteral(value: string, datatypeValue: string): number | null {\n if (!isRdfNumericDatatype(datatypeValue)) {\n return null;\n }\n const numeric = rdfNumericValue(value);\n return Number.isFinite(numeric) ? numeric : null;\n }\n\n private ensureNumericValueColumn(): void {\n const columns = this.db.prepare<{ name: string }>('PRAGMA table_info(rdf_terms)').all();\n if (columns.some((column) => column.name === 'numeric_value')) {\n return;\n }\n this.db.exec('ALTER TABLE rdf_terms ADD COLUMN numeric_value REAL;');\n }\n\n private backfillNumericValues(): void {\n const rows = this.db.prepare<RdfTermRow>(`\n SELECT literal.*\n FROM rdf_terms literal\n JOIN rdf_terms datatype ON datatype.id = literal.datatype_id\n WHERE literal.kind = 'literal'\n AND literal.numeric_value IS NULL\n AND datatype.kind = 'iri'\n `).all();\n const update = this.db.prepare('UPDATE rdf_terms SET numeric_value = ? WHERE id = ?');\n for (const row of rows) {\n const datatype = this.termForId(row.datatype_id as number);\n if (datatype.termType !== 'NamedNode') {\n continue;\n }\n const numericValue = this.numericValueForLiteral(row.value, datatype.value);\n if (numericValue !== null) {\n update.run(numericValue, row.id);\n }\n }\n }\n\n private identityCacheKey(identity: RdfTermIdentity): string {\n return [\n identity.kind,\n identity.value,\n identity.datatypeId ?? '',\n identity.lang ?? '',\n ].join('\\u001f');\n }\n\n private rowToTerm(row: RdfTermRow): Term {\n switch (row.kind) {\n case 'iri':\n return DataFactory.namedNode(row.value);\n case 'blank':\n return DataFactory.blankNode(row.value);\n case 'default_graph':\n return DataFactory.defaultGraph();\n case 'literal': {\n if (row.lang) {\n return DataFactory.literal(row.value, row.lang);\n }\n if (row.datatype_id) {\n const datatype = this.termForId(row.datatype_id);\n if (datatype.termType === 'NamedNode' && datatype.value !== XSD_STRING && datatype.value !== RDF_LANG_STRING) {\n return DataFactory.literal(row.value, datatype);\n }\n }\n return DataFactory.literal(row.value);\n }\n default:\n throw new Error(`Unsupported RDF term kind in dictionary row: ${(row as RdfTermRow).kind}`);\n }\n }\n}\n\nfunction normalizeSearchText(value: string): string {\n return value.toLowerCase();\n}\n\nfunction escapeLikePattern(value: string): string {\n return value.replace(/[\\\\%_]/g, (match) => `\\\\${match}`);\n}\n"]}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"@context": [
|
|
3
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld"
|
|
4
|
+
],
|
|
5
|
+
"@id": "npmd:@undefineds.co/xpod",
|
|
6
|
+
"components": [
|
|
7
|
+
{
|
|
8
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary",
|
|
9
|
+
"@type": "Class",
|
|
10
|
+
"requireElement": "RdfTermDictionary",
|
|
11
|
+
"parameters": [
|
|
12
|
+
{
|
|
13
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary_db",
|
|
14
|
+
"range": "undefineds:dist/storage/sqlite/types.jsonld#SqliteDatabase"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"memberFields": [
|
|
18
|
+
{
|
|
19
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_db",
|
|
20
|
+
"memberFieldName": "db"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_termCache",
|
|
24
|
+
"memberFieldName": "termCache"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_idCache",
|
|
28
|
+
"memberFieldName": "idCache"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_constructor",
|
|
32
|
+
"memberFieldName": "constructor"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_initialize",
|
|
36
|
+
"memberFieldName": "initialize"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_getOrCreate",
|
|
40
|
+
"memberFieldName": "getOrCreate"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_find",
|
|
44
|
+
"memberFieldName": "find"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_termForId",
|
|
48
|
+
"memberFieldName": "termForId"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_rowsForIds",
|
|
52
|
+
"memberFieldName": "rowsForIds"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_idsByValuePrefix",
|
|
56
|
+
"memberFieldName": "idsByValuePrefix"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_idsByNormalizedTextContains",
|
|
60
|
+
"memberFieldName": "idsByNormalizedTextContains"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_idsByNormalizedTextSuffix",
|
|
64
|
+
"memberFieldName": "idsByNormalizedTextSuffix"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_idsByNormalizedTextRegex",
|
|
68
|
+
"memberFieldName": "idsByNormalizedTextRegex"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_count",
|
|
72
|
+
"memberFieldName": "count"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_findId",
|
|
76
|
+
"memberFieldName": "findId"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_toIdentity",
|
|
80
|
+
"memberFieldName": "toIdentity"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_identity",
|
|
84
|
+
"memberFieldName": "identity"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_numericValueForLiteral",
|
|
88
|
+
"memberFieldName": "numericValueForLiteral"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_ensureNumericValueColumn",
|
|
92
|
+
"memberFieldName": "ensureNumericValueColumn"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_backfillNumericValues",
|
|
96
|
+
"memberFieldName": "backfillNumericValues"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_identityCacheKey",
|
|
100
|
+
"memberFieldName": "identityCacheKey"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary__member_rowToTerm",
|
|
104
|
+
"memberFieldName": "rowToTerm"
|
|
105
|
+
}
|
|
106
|
+
],
|
|
107
|
+
"constructorArguments": [
|
|
108
|
+
{
|
|
109
|
+
"@id": "undefineds:dist/storage/rdf/RdfTermDictionary.jsonld#RdfTermDictionary_db"
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Term } from '@rdfjs/types';
|
|
2
|
+
export declare const RDF_NUMERIC_DATATYPES: readonly ["http://www.w3.org/2001/XMLSchema#integer", "http://www.w3.org/2001/XMLSchema#decimal", "http://www.w3.org/2001/XMLSchema#double", "http://www.w3.org/2001/XMLSchema#float", "http://www.w3.org/2001/XMLSchema#long", "http://www.w3.org/2001/XMLSchema#int", "http://www.w3.org/2001/XMLSchema#short", "http://www.w3.org/2001/XMLSchema#byte", "http://www.w3.org/2001/XMLSchema#nonNegativeInteger", "http://www.w3.org/2001/XMLSchema#nonPositiveInteger", "http://www.w3.org/2001/XMLSchema#positiveInteger", "http://www.w3.org/2001/XMLSchema#negativeInteger", "http://www.w3.org/2001/XMLSchema#unsignedLong", "http://www.w3.org/2001/XMLSchema#unsignedInt", "http://www.w3.org/2001/XMLSchema#unsignedShort", "http://www.w3.org/2001/XMLSchema#unsignedByte"];
|
|
3
|
+
export declare function isRdfNumericDatatype(datatype: string): boolean;
|
|
4
|
+
export declare function isFiniteNumericLexical(value: string | number): boolean;
|
|
5
|
+
export declare function rdfNumericValue(value: string | number): number;
|
|
6
|
+
export declare function isRdfNumericTerm(term: Term): boolean;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RDF_NUMERIC_DATATYPES = void 0;
|
|
4
|
+
exports.isRdfNumericDatatype = isRdfNumericDatatype;
|
|
5
|
+
exports.isFiniteNumericLexical = isFiniteNumericLexical;
|
|
6
|
+
exports.rdfNumericValue = rdfNumericValue;
|
|
7
|
+
exports.isRdfNumericTerm = isRdfNumericTerm;
|
|
8
|
+
exports.RDF_NUMERIC_DATATYPES = [
|
|
9
|
+
'http://www.w3.org/2001/XMLSchema#integer',
|
|
10
|
+
'http://www.w3.org/2001/XMLSchema#decimal',
|
|
11
|
+
'http://www.w3.org/2001/XMLSchema#double',
|
|
12
|
+
'http://www.w3.org/2001/XMLSchema#float',
|
|
13
|
+
'http://www.w3.org/2001/XMLSchema#long',
|
|
14
|
+
'http://www.w3.org/2001/XMLSchema#int',
|
|
15
|
+
'http://www.w3.org/2001/XMLSchema#short',
|
|
16
|
+
'http://www.w3.org/2001/XMLSchema#byte',
|
|
17
|
+
'http://www.w3.org/2001/XMLSchema#nonNegativeInteger',
|
|
18
|
+
'http://www.w3.org/2001/XMLSchema#nonPositiveInteger',
|
|
19
|
+
'http://www.w3.org/2001/XMLSchema#positiveInteger',
|
|
20
|
+
'http://www.w3.org/2001/XMLSchema#negativeInteger',
|
|
21
|
+
'http://www.w3.org/2001/XMLSchema#unsignedLong',
|
|
22
|
+
'http://www.w3.org/2001/XMLSchema#unsignedInt',
|
|
23
|
+
'http://www.w3.org/2001/XMLSchema#unsignedShort',
|
|
24
|
+
'http://www.w3.org/2001/XMLSchema#unsignedByte',
|
|
25
|
+
];
|
|
26
|
+
function isRdfNumericDatatype(datatype) {
|
|
27
|
+
return exports.RDF_NUMERIC_DATATYPES.includes(datatype);
|
|
28
|
+
}
|
|
29
|
+
function isFiniteNumericLexical(value) {
|
|
30
|
+
return Number.isFinite(Number(value));
|
|
31
|
+
}
|
|
32
|
+
function rdfNumericValue(value) {
|
|
33
|
+
return Number(value);
|
|
34
|
+
}
|
|
35
|
+
function isRdfNumericTerm(term) {
|
|
36
|
+
return term.termType === 'Literal'
|
|
37
|
+
&& isRdfNumericDatatype(term.datatype.value)
|
|
38
|
+
&& isFiniteNumericLexical(term.value);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=RdfTermSemantics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RdfTermSemantics.js","sourceRoot":"","sources":["../../../src/storage/rdf/RdfTermSemantics.ts"],"names":[],"mappings":";;;AAqBA,oDAEC;AAED,wDAEC;AAED,0CAEC;AAED,4CAIC;AAnCY,QAAA,qBAAqB,GAAG;IACnC,0CAA0C;IAC1C,0CAA0C;IAC1C,yCAAyC;IACzC,wCAAwC;IACxC,uCAAuC;IACvC,sCAAsC;IACtC,wCAAwC;IACxC,uCAAuC;IACvC,qDAAqD;IACrD,qDAAqD;IACrD,kDAAkD;IAClD,kDAAkD;IAClD,+CAA+C;IAC/C,8CAA8C;IAC9C,gDAAgD;IAChD,+CAA+C;CACvC,CAAC;AAEX,SAAgB,oBAAoB,CAAC,QAAgB;IACnD,OAAO,6BAAqB,CAAC,QAAQ,CAAC,QAAgD,CAAC,CAAC;AAC1F,CAAC;AAED,SAAgB,sBAAsB,CAAC,KAAsB;IAC3D,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,eAAe,CAAC,KAAsB;IACpD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAU;IACzC,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS;WAC7B,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;WACzC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["import type { Term } from '@rdfjs/types';\n\nexport const RDF_NUMERIC_DATATYPES = [\n 'http://www.w3.org/2001/XMLSchema#integer',\n 'http://www.w3.org/2001/XMLSchema#decimal',\n 'http://www.w3.org/2001/XMLSchema#double',\n 'http://www.w3.org/2001/XMLSchema#float',\n 'http://www.w3.org/2001/XMLSchema#long',\n 'http://www.w3.org/2001/XMLSchema#int',\n 'http://www.w3.org/2001/XMLSchema#short',\n 'http://www.w3.org/2001/XMLSchema#byte',\n 'http://www.w3.org/2001/XMLSchema#nonNegativeInteger',\n 'http://www.w3.org/2001/XMLSchema#nonPositiveInteger',\n 'http://www.w3.org/2001/XMLSchema#positiveInteger',\n 'http://www.w3.org/2001/XMLSchema#negativeInteger',\n 'http://www.w3.org/2001/XMLSchema#unsignedLong',\n 'http://www.w3.org/2001/XMLSchema#unsignedInt',\n 'http://www.w3.org/2001/XMLSchema#unsignedShort',\n 'http://www.w3.org/2001/XMLSchema#unsignedByte',\n] as const;\n\nexport function isRdfNumericDatatype(datatype: string): boolean {\n return RDF_NUMERIC_DATATYPES.includes(datatype as typeof RDF_NUMERIC_DATATYPES[number]);\n}\n\nexport function isFiniteNumericLexical(value: string | number): boolean {\n return Number.isFinite(Number(value));\n}\n\nexport function rdfNumericValue(value: string | number): number {\n return Number(value);\n}\n\nexport function isRdfNumericTerm(term: Term): boolean {\n return term.termType === 'Literal'\n && isRdfNumericDatatype(term.datatype.value)\n && isFiniteNumericLexical(term.value);\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RdfTextChunkInput, RdfTextIndexOptions, RdfTextIndexStats, RdfSearchCardinalityEstimate, RdfTextSearchOptions, RdfTextSearchResult, RdfTextSourceInput, RdfTextTermDocumentFrequency } from './types';
|
|
2
|
+
export declare class RdfTextIndex {
|
|
3
|
+
private readonly options;
|
|
4
|
+
private readonly sqliteRuntime;
|
|
5
|
+
private db;
|
|
6
|
+
constructor(options: RdfTextIndexOptions);
|
|
7
|
+
open(): void;
|
|
8
|
+
close(): void;
|
|
9
|
+
clear(): void;
|
|
10
|
+
indexText(source: RdfTextSourceInput, text: string, chunks?: RdfTextChunkInput[]): void;
|
|
11
|
+
deleteSource(source: string): number;
|
|
12
|
+
search(options: RdfTextSearchOptions): RdfTextSearchResult[];
|
|
13
|
+
estimateSearchCardinality(options: RdfTextSearchOptions): RdfSearchCardinalityEstimate;
|
|
14
|
+
stats(): RdfTextIndexStats;
|
|
15
|
+
termDocumentFrequency(limit?: number): RdfTextTermDocumentFrequency[];
|
|
16
|
+
private initializeSchema;
|
|
17
|
+
private backfillTermPostings;
|
|
18
|
+
private upsertSource;
|
|
19
|
+
private chunkText;
|
|
20
|
+
private estimateDatabaseBytes;
|
|
21
|
+
private toSearchResult;
|
|
22
|
+
private requireDb;
|
|
23
|
+
}
|