@undefineds.co/xpod 0.3.6 → 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.
Files changed (249) hide show
  1. package/config/cli.json +1 -1
  2. package/config/cloud.json +54 -22
  3. package/config/local.json +56 -12
  4. package/config/resolver.json +10 -2
  5. package/config/xpod.base.json +50 -0
  6. package/config/xpod.json +8 -8
  7. package/dist/agents/config/resolve.js +10 -10
  8. package/dist/agents/config/resolve.js.map +1 -1
  9. package/dist/api/chatkit/index.d.ts +1 -1
  10. package/dist/api/chatkit/index.js.map +1 -1
  11. package/dist/api/chatkit/pod-store.d.ts +14 -11
  12. package/dist/api/chatkit/pod-store.js +114 -78
  13. package/dist/api/chatkit/pod-store.js.map +1 -1
  14. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
  15. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
  16. package/dist/api/chatkit/service.js +1 -1
  17. package/dist/api/chatkit/service.js.map +1 -1
  18. package/dist/api/chatkit/types.d.ts +11 -11
  19. package/dist/api/chatkit/types.js +3 -3
  20. package/dist/api/chatkit/types.js.map +1 -1
  21. package/dist/api/container/cloud.js +0 -8
  22. package/dist/api/container/cloud.js.map +1 -1
  23. package/dist/api/container/index.js +2 -1
  24. package/dist/api/container/index.js.map +1 -1
  25. package/dist/api/container/local.js +0 -7
  26. package/dist/api/container/local.js.map +1 -1
  27. package/dist/api/container/routes.js +3 -17
  28. package/dist/api/container/routes.js.map +1 -1
  29. package/dist/api/container/types.d.ts +0 -2
  30. package/dist/api/container/types.js.map +1 -1
  31. package/dist/api/handlers/PodManagementHandler.d.ts +3 -0
  32. package/dist/api/handlers/PodManagementHandler.js +71 -1
  33. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  34. package/dist/api/handlers/RunHandler.js +5 -5
  35. package/dist/api/handlers/RunHandler.js.map +1 -1
  36. package/dist/api/runs/AgentRuntimeTypes.d.ts +7 -8
  37. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
  38. package/dist/api/runs/InngestRunExecutionBackend.d.ts +2 -2
  39. package/dist/api/runs/ManagedRunWorker.d.ts +1 -1
  40. package/dist/api/runs/ManagedRunWorker.js +6 -6
  41. package/dist/api/runs/ManagedRunWorker.js.map +1 -1
  42. package/dist/api/runs/PiAgentRuntimeDriver.d.ts +16 -1
  43. package/dist/api/runs/PiAgentRuntimeDriver.js +182 -23
  44. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  45. package/dist/api/runs/RunStateCenter.d.ts +3 -3
  46. package/dist/api/runs/RunStateCenter.js +13 -13
  47. package/dist/api/runs/RunStateCenter.js.map +1 -1
  48. package/dist/api/runs/store.d.ts +4 -4
  49. package/dist/api/runs/store.js +2 -2
  50. package/dist/api/runs/store.js.map +1 -1
  51. package/dist/api/service/VectorStoreService.d.ts +1 -1
  52. package/dist/api/service/VectorStoreService.js +16 -16
  53. package/dist/api/service/VectorStoreService.js.map +1 -1
  54. package/dist/api/tasks/InngestTaskScheduler.d.ts +4 -4
  55. package/dist/api/tasks/TaskMaterializer.d.ts +3 -3
  56. package/dist/api/tasks/TaskMaterializer.js +11 -11
  57. package/dist/api/tasks/TaskMaterializer.js.map +1 -1
  58. package/dist/api/tasks/TaskService.d.ts +3 -3
  59. package/dist/api/tasks/TaskService.js +11 -7
  60. package/dist/api/tasks/TaskService.js.map +1 -1
  61. package/dist/api/tasks/store.d.ts +10 -4
  62. package/dist/api/tasks/store.js +14 -4
  63. package/dist/api/tasks/store.js.map +1 -1
  64. package/dist/api/workspace/types.d.ts +3 -3
  65. package/dist/api/workspace/types.js +6 -6
  66. package/dist/api/workspace/types.js.map +1 -1
  67. package/dist/cli/commands/config.js +2 -2
  68. package/dist/cli/commands/config.js.map +1 -1
  69. package/dist/cli/commands/start.js +9 -3
  70. package/dist/cli/commands/start.js.map +1 -1
  71. package/dist/components/components.jsonld +8 -2
  72. package/dist/components/context.jsonld +302 -51
  73. package/dist/http/search/SearchHttpHandler.js +8 -8
  74. package/dist/http/search/SearchHttpHandler.js.map +1 -1
  75. package/dist/identity/drizzle/PodLookupRepository.d.ts +11 -1
  76. package/dist/identity/drizzle/PodLookupRepository.js +95 -4
  77. package/dist/identity/drizzle/PodLookupRepository.js.map +1 -1
  78. package/dist/identity/drizzle/db.js +4 -43
  79. package/dist/identity/drizzle/db.js.map +1 -1
  80. package/dist/identity/drizzle/schema.pg.d.ts +0 -5
  81. package/dist/identity/drizzle/schema.pg.js +2 -16
  82. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  83. package/dist/identity/drizzle/schema.sqlite.d.ts +19 -176
  84. package/dist/identity/drizzle/schema.sqlite.js +2 -16
  85. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  86. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +4 -4
  87. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +7 -7
  88. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  89. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +6 -6
  90. package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +4 -4
  91. package/dist/identity/oidc/AutoDetectOidcHandler.js +6 -6
  92. package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
  93. package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +6 -6
  94. package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +37 -0
  95. package/dist/identity/oidc/ScopedPickWebIdHandler.js +211 -0
  96. package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -0
  97. package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +158 -0
  98. package/dist/index.d.ts +12 -2
  99. package/dist/index.js +16 -4
  100. package/dist/index.js.map +1 -1
  101. package/dist/main.js +8 -2
  102. package/dist/main.js.map +1 -1
  103. package/dist/provision/ProvisionPodCreator.d.ts +3 -4
  104. package/dist/provision/ProvisionPodCreator.js +8 -13
  105. package/dist/provision/ProvisionPodCreator.js.map +1 -1
  106. package/dist/provision/ProvisionPodCreator.jsonld +7 -7
  107. package/dist/runtime/Proxy.d.ts +0 -1
  108. package/dist/runtime/Proxy.js +0 -9
  109. package/dist/runtime/Proxy.js.map +1 -1
  110. package/dist/runtime/bootstrap.d.ts +1 -0
  111. package/dist/runtime/bootstrap.js +5 -2
  112. package/dist/runtime/bootstrap.js.map +1 -1
  113. package/dist/runtime/css-process.d.ts +12 -4
  114. package/dist/runtime/css-process.js +61 -14
  115. package/dist/runtime/css-process.js.map +1 -1
  116. package/dist/runtime/oidc-issuer.d.ts +3 -2
  117. package/dist/runtime/oidc-issuer.js +3 -2
  118. package/dist/runtime/oidc-issuer.js.map +1 -1
  119. package/dist/runtime/runtime-types.d.ts +1 -0
  120. package/dist/runtime/runtime-types.js.map +1 -1
  121. package/dist/solidfs/LocalFirstRdfRepresentationResolver.d.ts +21 -0
  122. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js +38 -0
  123. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js.map +1 -0
  124. package/dist/solidfs/LocalSolidFS.d.ts +18 -0
  125. package/dist/solidfs/LocalSolidFS.js +539 -0
  126. package/dist/solidfs/LocalSolidFS.js.map +1 -0
  127. package/dist/solidfs/PodSolidFsHttpClient.d.ts +16 -0
  128. package/dist/solidfs/PodSolidFsHttpClient.js +93 -0
  129. package/dist/solidfs/PodSolidFsHttpClient.js.map +1 -0
  130. package/dist/solidfs/PodSolidFsHydrator.d.ts +27 -0
  131. package/dist/solidfs/PodSolidFsHydrator.js +127 -0
  132. package/dist/solidfs/PodSolidFsHydrator.js.map +1 -0
  133. package/dist/solidfs/PodSolidFsSyncer.d.ts +21 -0
  134. package/dist/solidfs/PodSolidFsSyncer.js +78 -0
  135. package/dist/solidfs/PodSolidFsSyncer.js.map +1 -0
  136. package/dist/solidfs/RdfIndexSolidFsSyncer.d.ts +22 -0
  137. package/dist/solidfs/RdfIndexSolidFsSyncer.js +131 -0
  138. package/dist/solidfs/RdfIndexSolidFsSyncer.js.map +1 -0
  139. package/dist/solidfs/index.d.ts +7 -0
  140. package/dist/solidfs/index.js +24 -0
  141. package/dist/solidfs/index.js.map +1 -0
  142. package/dist/solidfs/types.d.ts +131 -0
  143. package/dist/solidfs/types.js +19 -0
  144. package/dist/solidfs/types.js.map +1 -0
  145. package/dist/storage/RepresentationPartialConvertingStore.js +6 -13
  146. package/dist/storage/RepresentationPartialConvertingStore.js.map +1 -1
  147. package/dist/storage/SparqlUpdateResourceStore.d.ts +4 -0
  148. package/dist/storage/SparqlUpdateResourceStore.js +13 -0
  149. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  150. package/dist/storage/SparqlUpdateResourceStore.jsonld +26 -0
  151. package/dist/storage/accessors/MixDataAccessor.d.ts +85 -4
  152. package/dist/storage/accessors/MixDataAccessor.js +511 -16
  153. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  154. package/dist/storage/accessors/MixDataAccessor.jsonld +176 -1
  155. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.d.ts +7 -0
  156. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +72 -4
  157. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -1
  158. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.jsonld +24 -0
  159. package/dist/storage/quint/BaseQuintStore.d.ts +3 -0
  160. package/dist/storage/quint/BaseQuintStore.js +51 -27
  161. package/dist/storage/quint/BaseQuintStore.js.map +1 -1
  162. package/dist/storage/quint/PgQuintStore.d.ts +1 -0
  163. package/dist/storage/quint/PgQuintStore.js +50 -32
  164. package/dist/storage/quint/PgQuintStore.js.map +1 -1
  165. package/dist/storage/quint/PgQuintStore.jsonld +4 -3
  166. package/dist/storage/quint/SqliteQuintStore.d.ts +5 -0
  167. package/dist/storage/quint/SqliteQuintStore.js +100 -0
  168. package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
  169. package/dist/storage/quint/SqliteQuintStore.jsonld +20 -0
  170. package/dist/storage/quint/types.d.ts +16 -0
  171. package/dist/storage/quint/types.js.map +1 -1
  172. package/dist/storage/rdf/Rdf3xTripleIndex.d.ts +55 -0
  173. package/dist/storage/rdf/Rdf3xTripleIndex.js +1235 -0
  174. package/dist/storage/rdf/Rdf3xTripleIndex.js.map +1 -0
  175. package/dist/storage/rdf/RdfContentTypes.d.ts +9 -0
  176. package/dist/storage/rdf/RdfContentTypes.js +79 -0
  177. package/dist/storage/rdf/RdfContentTypes.js.map +1 -0
  178. package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +76 -0
  179. package/dist/storage/rdf/RdfLocalQueryEngine.js +2636 -0
  180. package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -0
  181. package/dist/storage/rdf/RdfQuadIndex.d.ts +98 -0
  182. package/dist/storage/rdf/RdfQuadIndex.js +1840 -0
  183. package/dist/storage/rdf/RdfQuadIndex.js.map +1 -0
  184. package/dist/storage/rdf/RdfQuadIndex.jsonld +416 -0
  185. package/dist/storage/rdf/RdfShadowComparator.d.ts +12 -0
  186. package/dist/storage/rdf/RdfShadowComparator.js +47 -0
  187. package/dist/storage/rdf/RdfShadowComparator.js.map +1 -0
  188. package/dist/storage/rdf/RdfSparqlAdapter.d.ts +147 -0
  189. package/dist/storage/rdf/RdfSparqlAdapter.js +2420 -0
  190. package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -0
  191. package/dist/storage/rdf/RdfSparqlAdapter.jsonld +414 -0
  192. package/dist/storage/rdf/RdfTermDictionary.d.ts +27 -0
  193. package/dist/storage/rdf/RdfTermDictionary.js +352 -0
  194. package/dist/storage/rdf/RdfTermDictionary.js.map +1 -0
  195. package/dist/storage/rdf/RdfTermDictionary.jsonld +114 -0
  196. package/dist/storage/rdf/RdfTermSemantics.d.ts +6 -0
  197. package/dist/storage/rdf/RdfTermSemantics.js +40 -0
  198. package/dist/storage/rdf/RdfTermSemantics.js.map +1 -0
  199. package/dist/storage/rdf/RdfTextIndex.d.ts +23 -0
  200. package/dist/storage/rdf/RdfTextIndex.js +569 -0
  201. package/dist/storage/rdf/RdfTextIndex.js.map +1 -0
  202. package/dist/storage/rdf/RdfVectorIndex.d.ts +22 -0
  203. package/dist/storage/rdf/RdfVectorIndex.js +631 -0
  204. package/dist/storage/rdf/RdfVectorIndex.js.map +1 -0
  205. package/dist/storage/rdf/RdfXmlSerializer.d.ts +2 -0
  206. package/dist/storage/rdf/RdfXmlSerializer.js +123 -0
  207. package/dist/storage/rdf/RdfXmlSerializer.js.map +1 -0
  208. package/dist/storage/rdf/ShadowRdfQuintStore.d.ts +58 -0
  209. package/dist/storage/rdf/ShadowRdfQuintStore.js +202 -0
  210. package/dist/storage/rdf/ShadowRdfQuintStore.js.map +1 -0
  211. package/dist/storage/rdf/ShadowRdfQuintStore.jsonld +308 -0
  212. package/dist/storage/rdf/SolidRdfEngine.d.ts +51 -0
  213. package/dist/storage/rdf/SolidRdfEngine.js +264 -0
  214. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -0
  215. package/dist/storage/rdf/SolidRdfEngine.jsonld +338 -0
  216. package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +92 -0
  217. package/dist/storage/rdf/SolidRdfSparqlEngine.js +477 -0
  218. package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -0
  219. package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +257 -0
  220. package/dist/storage/rdf/index.d.ts +15 -0
  221. package/dist/storage/rdf/index.js +61 -0
  222. package/dist/storage/rdf/index.js.map +1 -0
  223. package/dist/storage/rdf/models-benchmark.d.ts +260 -0
  224. package/dist/storage/rdf/models-benchmark.js +1405 -0
  225. package/dist/storage/rdf/models-benchmark.js.map +1 -0
  226. package/dist/storage/rdf/types.d.ts +726 -0
  227. package/dist/storage/rdf/types.js +3 -0
  228. package/dist/storage/rdf/types.js.map +1 -0
  229. package/dist/storage/rdf/types.jsonld +316 -0
  230. package/dist/storage/vector/VectorIndexingListener.d.ts +5 -5
  231. package/dist/storage/vector/VectorIndexingListener.js +19 -19
  232. package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
  233. package/package.json +3 -2
  234. package/templates/pod/acp/.acr.hbs +39 -0
  235. package/templates/pod/acp/README.acr +18 -0
  236. package/templates/pod/acp/profile/card.acr +22 -0
  237. package/templates/pod/base/README$.md.hbs +27 -0
  238. package/templates/pod/base/profile/card$.ttl.hbs +13 -0
  239. package/templates/pod/wac/.acl.hbs +26 -0
  240. package/templates/pod/wac/README.acl.hbs +14 -0
  241. package/templates/pod/wac/profile/card.acl.hbs +19 -0
  242. package/dist/api/handlers/WebIdProfileHandler.d.ts +0 -16
  243. package/dist/api/handlers/WebIdProfileHandler.js +0 -423
  244. package/dist/api/handlers/WebIdProfileHandler.js.map +0 -1
  245. package/dist/identity/drizzle/WebIdProfileRepository.d.ts +0 -63
  246. package/dist/identity/drizzle/WebIdProfileRepository.js +0 -168
  247. package/dist/identity/drizzle/WebIdProfileRepository.js.map +0 -1
  248. package/dist/identity/drizzle/WebIdProfileRepository.jsonld +0 -112
  249. package/dist/storage/quint/BaseQuintStore.jsonld +0 -257
@@ -0,0 +1,477 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SolidRdfSparqlEngine = void 0;
4
+ const asynciterator_1 = require("asynciterator");
5
+ const rdf_data_factory_1 = require("rdf-data-factory");
6
+ const utils_bindings_factory_1 = require("@comunica/utils-bindings-factory");
7
+ const n3_1 = require("n3");
8
+ const RdfSparqlAdapter_1 = require("./RdfSparqlAdapter");
9
+ const rdfDataFactory = new rdf_data_factory_1.DataFactory();
10
+ class SolidRdfSparqlEngine {
11
+ constructor(rdfEngine, fallback, shadowStore, enablePrimary = true, onFallback) {
12
+ this.adapter = new RdfSparqlAdapter_1.RdfSparqlAdapter();
13
+ this.bindingsFactory = new utils_bindings_factory_1.BindingsFactory(rdfDataFactory);
14
+ this.operationCounts = new Map();
15
+ this.rdfEngine = rdfEngine;
16
+ this.fallback = fallback;
17
+ this.shadowStore = shadowStore;
18
+ this.enablePrimary = enablePrimary;
19
+ this.onFallback = onFallback;
20
+ }
21
+ async queryBindings(query, basePath) {
22
+ await this.ensureReady();
23
+ if (!this.enablePrimary) {
24
+ return this.fallbackWith('queryBindings', 'primary disabled', () => this.fallback.queryBindings(query, basePath));
25
+ }
26
+ const start = Date.now();
27
+ try {
28
+ const compiled = this.adapter.compile(query, basePath);
29
+ if (compiled.queryType !== 'SELECT') {
30
+ return this.fallbackWith('queryBindings', `compiled ${compiled.queryType} cannot produce bindings`, () => this.fallback.queryBindings(query, basePath));
31
+ }
32
+ const result = await this.rdfEngine.query(compiled.query);
33
+ this.recordPrimary('queryBindings', start, result);
34
+ return this.bindingsStream(result, compiled.variables);
35
+ }
36
+ catch (error) {
37
+ if (error instanceof RdfSparqlAdapter_1.DisabledSparqlFeatureError) {
38
+ throw error;
39
+ }
40
+ return this.fallbackWith('queryBindings', fallbackReason(error), () => this.fallback.queryBindings(query, basePath));
41
+ }
42
+ }
43
+ async queryBoolean(query, basePath) {
44
+ await this.ensureReady();
45
+ if (!this.enablePrimary) {
46
+ return this.fallbackWith('queryBoolean', 'primary disabled', () => this.fallback.queryBoolean(query, basePath));
47
+ }
48
+ const start = Date.now();
49
+ try {
50
+ const compiled = this.adapter.compile(query, basePath);
51
+ if (compiled.queryType !== 'ASK') {
52
+ return this.fallbackWith('queryBoolean', `compiled ${compiled.queryType} cannot produce boolean`, () => this.fallback.queryBoolean(query, basePath));
53
+ }
54
+ const result = await this.rdfEngine.query(compiled.query);
55
+ this.recordPrimary('queryBoolean', start, result);
56
+ return result.bindings.length > 0;
57
+ }
58
+ catch (error) {
59
+ if (error instanceof RdfSparqlAdapter_1.DisabledSparqlFeatureError) {
60
+ throw error;
61
+ }
62
+ return this.fallbackWith('queryBoolean', fallbackReason(error), () => this.fallback.queryBoolean(query, basePath));
63
+ }
64
+ }
65
+ async queryQuads(query, basePath) {
66
+ await this.ensureReady();
67
+ if (!this.enablePrimary) {
68
+ return this.fallbackWith('queryQuads', 'primary disabled', () => this.fallback.queryQuads(query, basePath));
69
+ }
70
+ const start = Date.now();
71
+ try {
72
+ const quads = this.executeQuadsPrimary(query, basePath, 'queryQuads', start);
73
+ return new asynciterator_1.ArrayIterator(quads);
74
+ }
75
+ catch (error) {
76
+ if (error instanceof RdfSparqlAdapter_1.DisabledSparqlFeatureError) {
77
+ throw error;
78
+ }
79
+ return this.fallbackWith('queryQuads', fallbackReason(error), () => this.fallback.queryQuads(query, basePath));
80
+ }
81
+ }
82
+ async queryVoid(query, basePath) {
83
+ await this.ensureReady();
84
+ if (!this.enablePrimary) {
85
+ return this.fallbackWith('queryVoid', 'primary disabled', () => this.fallback.queryVoid(query, basePath));
86
+ }
87
+ const start = Date.now();
88
+ try {
89
+ const delta = this.adapter.compileUpdateDelta(query, basePath);
90
+ let deletedRows = 0;
91
+ let computedDeletes = 0;
92
+ let computedInserts = 0;
93
+ for (const operation of delta.operations) {
94
+ if (operation.type === 'delete') {
95
+ for (const quad of operation.quads) {
96
+ deletedRows += this.rdfEngine.delete({
97
+ graph: quad.graph,
98
+ subject: quad.subject,
99
+ predicate: quad.predicate,
100
+ object: quad.object,
101
+ });
102
+ }
103
+ }
104
+ else if (operation.type === 'insert') {
105
+ this.rdfEngine.put(operation.quads);
106
+ }
107
+ else if (operation.type === 'insertDeleteWhere') {
108
+ const result = this.rdfEngine.query(operation.query);
109
+ const deletes = this.adapter.materializeDeleteWhere(operation.deletes, result.bindings);
110
+ const inserts = this.adapter.materializeDeleteWhere(operation.inserts, result.bindings);
111
+ computedDeletes += deletes.length;
112
+ computedInserts += inserts.length;
113
+ for (const quad of deletes) {
114
+ deletedRows += this.rdfEngine.delete({
115
+ graph: quad.graph,
116
+ subject: quad.subject,
117
+ predicate: quad.predicate,
118
+ object: quad.object,
119
+ });
120
+ }
121
+ this.rdfEngine.put(inserts);
122
+ }
123
+ else if (operation.type === 'insertWhere') {
124
+ const result = this.rdfEngine.query(operation.query);
125
+ const inserts = this.adapter.materializeDeleteWhere(operation.inserts, result.bindings);
126
+ computedInserts += inserts.length;
127
+ this.rdfEngine.put(inserts);
128
+ }
129
+ else {
130
+ const result = this.rdfEngine.query(operation.query);
131
+ const quads = this.adapter.materializeDeleteWhere(operation.template, result.bindings);
132
+ computedDeletes += quads.length;
133
+ for (const quad of quads) {
134
+ deletedRows += this.rdfEngine.delete({
135
+ graph: quad.graph,
136
+ subject: quad.subject,
137
+ predicate: quad.predicate,
138
+ object: quad.object,
139
+ });
140
+ }
141
+ }
142
+ }
143
+ this.recordPrimary('queryVoid', start, {
144
+ bindings: [],
145
+ metrics: {
146
+ engine: 'solid-rdf',
147
+ plan: ['UpdateDelta', `delete:${delta.deletes.length + computedDeletes}`, `deletedRows:${deletedRows}`, `insert:${delta.inserts.length + computedInserts}`],
148
+ scannedRows: delta.deletes.length + computedDeletes + delta.inserts.length + computedInserts,
149
+ joinedRows: 0,
150
+ returnedRows: 0,
151
+ durationMs: Date.now() - start,
152
+ indexChoices: ['update-delta'],
153
+ filtersApplied: 0,
154
+ filtersPushedDown: 0,
155
+ },
156
+ });
157
+ return undefined;
158
+ }
159
+ catch (error) {
160
+ if (error instanceof RdfSparqlAdapter_1.DisabledSparqlFeatureError) {
161
+ throw error;
162
+ }
163
+ return this.fallbackWith('queryVoid', fallbackReason(error), () => this.fallback.queryVoid(query, basePath));
164
+ }
165
+ }
166
+ async constructGraph(graph, basePath) {
167
+ await this.ensureReady();
168
+ if (!this.enablePrimary) {
169
+ return this.fallbackWith('constructGraph', 'primary disabled', () => this.fallback.constructGraph(graph, basePath));
170
+ }
171
+ if (!graph.startsWith(basePath)) {
172
+ return new asynciterator_1.ArrayIterator([]);
173
+ }
174
+ const start = Date.now();
175
+ try {
176
+ const quads = this.executeConstructPrimary(`
177
+ CONSTRUCT { ?s ?p ?o }
178
+ WHERE { GRAPH <${escapeIri(graph)}> { ?s ?p ?o } }
179
+ `, basePath, 'constructGraph', start);
180
+ return new asynciterator_1.ArrayIterator(quads);
181
+ }
182
+ catch (error) {
183
+ if (error instanceof RdfSparqlAdapter_1.DisabledSparqlFeatureError) {
184
+ throw error;
185
+ }
186
+ return this.fallbackWith('constructGraph', fallbackReason(error), () => this.fallback.constructGraph(graph, basePath));
187
+ }
188
+ }
189
+ async listGraphs(basePath) {
190
+ await this.ensureReady();
191
+ if (!this.enablePrimary) {
192
+ return this.fallbackWith('listGraphs', 'primary disabled', () => this.fallback.listGraphs(basePath));
193
+ }
194
+ const start = Date.now();
195
+ try {
196
+ const result = this.executeSelectPrimary(`
197
+ SELECT DISTINCT ?g WHERE { GRAPH ?g { ?s ?p ?o } }
198
+ `, basePath, 'listGraphs', start);
199
+ const graphs = new Set();
200
+ for (const binding of result.bindings) {
201
+ const graph = binding.g;
202
+ if (graph?.termType === 'NamedNode') {
203
+ graphs.add(graph.value);
204
+ }
205
+ }
206
+ return graphs;
207
+ }
208
+ catch (error) {
209
+ if (error instanceof RdfSparqlAdapter_1.DisabledSparqlFeatureError) {
210
+ throw error;
211
+ }
212
+ return this.fallbackWith('listGraphs', fallbackReason(error), () => this.fallback.listGraphs(basePath));
213
+ }
214
+ }
215
+ async close() {
216
+ await this.rdfEngine.close();
217
+ await this.fallback.close();
218
+ }
219
+ getMetrics() {
220
+ const operationCounts = [...this.operationCounts.entries()]
221
+ .map(([operation, counts]) => operationCountSnapshot(operation, counts))
222
+ .sort((left, right) => left.operation.localeCompare(right.operation));
223
+ const primaryCount = operationCounts.reduce((sum, counts) => sum + counts.primaryCount, 0);
224
+ const fallbackCount = operationCounts.reduce((sum, counts) => sum + counts.fallbackCount, 0);
225
+ const totalCount = primaryCount + fallbackCount;
226
+ return {
227
+ primaryCount,
228
+ fallbackCount,
229
+ totalCount,
230
+ fallbackRate: ratio(fallbackCount, totalCount),
231
+ operationCounts,
232
+ lastPrimary: this.lastPrimary,
233
+ lastFallback: this.lastFallback,
234
+ };
235
+ }
236
+ assertFallbackBudget(budget = {}) {
237
+ const snapshot = this.getMetrics();
238
+ const maxFallbackRate = budget.maxFallbackRate ?? 0;
239
+ const maxFallbackCount = budget.maxFallbackCount ?? 0;
240
+ const operationSet = budget.operations ? new Set(budget.operations) : undefined;
241
+ const counts = operationSet
242
+ ? snapshot.operationCounts.filter((count) => operationSet.has(count.operation))
243
+ : snapshot.operationCounts;
244
+ const primaryCount = counts.reduce((sum, count) => sum + count.primaryCount, 0);
245
+ const fallbackCount = counts.reduce((sum, count) => sum + count.fallbackCount, 0);
246
+ const totalCount = primaryCount + fallbackCount;
247
+ const fallbackRate = ratio(fallbackCount, totalCount);
248
+ if (fallbackCount <= maxFallbackCount && fallbackRate <= maxFallbackRate) {
249
+ return;
250
+ }
251
+ const scope = operationSet ? ` for ${[...operationSet].join(',')}` : '';
252
+ const reason = snapshot.lastFallback ? `; last fallback ${snapshot.lastFallback.operation}: ${snapshot.lastFallback.reason}` : '';
253
+ throw new Error(`SolidRdfSparql fallback budget exceeded${scope}: ${fallbackCount}/${totalCount} (${fallbackRate}) > count ${maxFallbackCount}, rate ${maxFallbackRate}${reason}`);
254
+ }
255
+ resetMetrics() {
256
+ this.operationCounts.clear();
257
+ this.lastPrimary = undefined;
258
+ this.lastFallback = undefined;
259
+ }
260
+ bindingsStream(result, variables) {
261
+ const projectedVariables = variables.length > 0
262
+ ? variables
263
+ : inferVariables(result.bindings);
264
+ const rows = result.bindings.map((binding) => this.bindings(binding, projectedVariables));
265
+ const iterator = new asynciterator_1.ArrayIterator(rows);
266
+ iterator.metadata = async () => ({
267
+ variables: projectedVariables.map((variableName) => rdfDataFactory.variable(variableName)),
268
+ });
269
+ return iterator;
270
+ }
271
+ bindings(binding, variables) {
272
+ const entries = variables
273
+ .map((variableName) => {
274
+ const term = binding[variableName];
275
+ return term ? [rdfDataFactory.variable(variableName), term] : null;
276
+ })
277
+ .filter((entry) => entry !== null);
278
+ return this.bindingsFactory.bindings(entries);
279
+ }
280
+ async fallbackWith(operation, reason, run) {
281
+ this.onFallback?.({ operation, reason });
282
+ const start = Date.now();
283
+ try {
284
+ return await run();
285
+ }
286
+ finally {
287
+ this.recordFallback(operation, reason, Date.now() - start);
288
+ }
289
+ }
290
+ async ensureReady() {
291
+ if (this.shadowStore) {
292
+ await this.shadowStore.open();
293
+ }
294
+ }
295
+ executeSelectPrimary(query, basePath, operation, start) {
296
+ const compiled = this.adapter.compile(query, basePath);
297
+ if (compiled.queryType !== 'SELECT') {
298
+ throw new RdfSparqlAdapter_1.UnsupportedSparqlQueryError(`compiled ${compiled.queryType} cannot produce bindings`);
299
+ }
300
+ const result = this.rdfEngine.query(compiled.query);
301
+ this.recordPrimary(operation, start, result);
302
+ return result;
303
+ }
304
+ executeConstructPrimary(query, basePath, operation, start) {
305
+ const compiled = this.adapter.compile(query, basePath);
306
+ if (compiled.queryType !== 'CONSTRUCT' || !compiled.constructTemplate) {
307
+ throw new RdfSparqlAdapter_1.UnsupportedSparqlQueryError(`compiled ${compiled.queryType} cannot produce quads`);
308
+ }
309
+ const result = this.rdfEngine.query(compiled.query);
310
+ const quads = this.adapter.materializeConstruct(compiled.constructTemplate, result.bindings, rdfDataFactory.defaultGraph());
311
+ this.recordPrimary(operation, start, {
312
+ ...result,
313
+ bindings: [],
314
+ metrics: {
315
+ ...result.metrics,
316
+ returnedRows: quads.length,
317
+ plan: [...result.metrics.plan, 'Construct'],
318
+ },
319
+ });
320
+ return quads;
321
+ }
322
+ executeQuadsPrimary(query, basePath, operation, start) {
323
+ const compiled = this.adapter.compile(query, basePath);
324
+ if (compiled.queryType === 'CONSTRUCT' && compiled.constructTemplate) {
325
+ const result = this.rdfEngine.query(compiled.query);
326
+ const quads = this.adapter.materializeConstruct(compiled.constructTemplate, result.bindings, rdfDataFactory.defaultGraph());
327
+ this.recordPrimary(operation, start, {
328
+ ...result,
329
+ bindings: [],
330
+ metrics: {
331
+ ...result.metrics,
332
+ returnedRows: quads.length,
333
+ plan: [...result.metrics.plan, 'Construct'],
334
+ },
335
+ });
336
+ return quads;
337
+ }
338
+ if (compiled.queryType === 'DESCRIBE' && compiled.describeTargets) {
339
+ return this.executeDescribePrimary(compiled.query, compiled.describeTargets, basePath, operation, start);
340
+ }
341
+ throw new RdfSparqlAdapter_1.UnsupportedSparqlQueryError(`compiled ${compiled.queryType} cannot produce quads`);
342
+ }
343
+ executeDescribePrimary(query, targets, basePath, operation, start) {
344
+ const seed = this.rdfEngine.query(query);
345
+ const quads = [];
346
+ const seen = new Set();
347
+ for (const target of targets) {
348
+ for (const binding of seed.bindings) {
349
+ const subject = resolveQueryTerm(target, binding);
350
+ if (!subject || subject.termType !== 'NamedNode') {
351
+ continue;
352
+ }
353
+ const describe = this.rdfEngine.query({
354
+ patterns: [
355
+ {
356
+ subject,
357
+ predicate: { variable: 'p' },
358
+ object: { variable: 'o' },
359
+ graph: { $startsWith: basePath },
360
+ },
361
+ ],
362
+ select: ['p', 'o'],
363
+ });
364
+ for (const row of describe.bindings) {
365
+ const predicate = row.p;
366
+ const object = row.o;
367
+ if (predicate?.termType !== 'NamedNode' || !isQuadObjectTerm(object)) {
368
+ continue;
369
+ }
370
+ const quad = rdfDataFactory.quad(subject, predicate, object, rdfDataFactory.defaultGraph());
371
+ const key = [quad.subject, quad.predicate, quad.object, quad.graph].map((term) => (0, n3_1.termToId)(term)).join('\u001f');
372
+ if (!seen.has(key)) {
373
+ seen.add(key);
374
+ quads.push(quad);
375
+ }
376
+ }
377
+ }
378
+ }
379
+ this.recordPrimary(operation, start, {
380
+ bindings: [],
381
+ metrics: {
382
+ ...seed.metrics,
383
+ returnedRows: quads.length,
384
+ plan: [...seed.metrics.plan, 'Describe'],
385
+ },
386
+ });
387
+ return quads;
388
+ }
389
+ recordPrimary(operation, start, result) {
390
+ const durationMs = Date.now() - start;
391
+ const counts = this.countsFor(operation);
392
+ counts.primaryCount += 1;
393
+ counts.primaryDurationMs += durationMs;
394
+ this.lastPrimary = {
395
+ operation,
396
+ durationMs,
397
+ scannedRows: result.metrics.scannedRows,
398
+ returnedRows: result.metrics.returnedRows,
399
+ plan: result.metrics.plan,
400
+ indexChoices: result.metrics.indexChoices,
401
+ };
402
+ }
403
+ recordFallback(operation, reason, durationMs) {
404
+ const counts = this.countsFor(operation);
405
+ counts.fallbackCount += 1;
406
+ counts.fallbackDurationMs += durationMs;
407
+ this.lastFallback = {
408
+ operation,
409
+ reason,
410
+ durationMs,
411
+ };
412
+ }
413
+ countsFor(operation) {
414
+ const existing = this.operationCounts.get(operation);
415
+ if (existing) {
416
+ return existing;
417
+ }
418
+ const created = {
419
+ primaryCount: 0,
420
+ fallbackCount: 0,
421
+ primaryDurationMs: 0,
422
+ fallbackDurationMs: 0,
423
+ };
424
+ this.operationCounts.set(operation, created);
425
+ return created;
426
+ }
427
+ }
428
+ exports.SolidRdfSparqlEngine = SolidRdfSparqlEngine;
429
+ function inferVariables(bindings) {
430
+ const names = new Set();
431
+ for (const binding of bindings) {
432
+ for (const name of Object.keys(binding)) {
433
+ names.add(name);
434
+ }
435
+ }
436
+ return [...names];
437
+ }
438
+ function resolveQueryTerm(term, binding) {
439
+ if (term && typeof term === 'object' && 'variable' in term) {
440
+ return binding[term.variable];
441
+ }
442
+ return term;
443
+ }
444
+ function isQuadObjectTerm(term) {
445
+ return Boolean(term
446
+ && term.termType !== 'Variable'
447
+ && term.termType !== 'DefaultGraph'
448
+ && term.termType !== 'Quad');
449
+ }
450
+ function fallbackReason(error) {
451
+ if (error instanceof RdfSparqlAdapter_1.UnsupportedSparqlQueryError) {
452
+ return error.message;
453
+ }
454
+ if (error instanceof Error) {
455
+ return error.message;
456
+ }
457
+ return String(error);
458
+ }
459
+ function operationCountSnapshot(operation, counts) {
460
+ const totalCount = counts.primaryCount + counts.fallbackCount;
461
+ return {
462
+ operation,
463
+ primaryCount: counts.primaryCount,
464
+ fallbackCount: counts.fallbackCount,
465
+ totalCount,
466
+ fallbackRate: ratio(counts.fallbackCount, totalCount),
467
+ primaryDurationMs: counts.primaryDurationMs,
468
+ fallbackDurationMs: counts.fallbackDurationMs,
469
+ };
470
+ }
471
+ function ratio(numerator, denominator) {
472
+ return denominator === 0 ? 0 : numerator / denominator;
473
+ }
474
+ function escapeIri(value) {
475
+ return value.replace(/[<>"{}|^`\\]/g, (char) => encodeURIComponent(char));
476
+ }
477
+ //# sourceMappingURL=SolidRdfSparqlEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SolidRdfSparqlEngine.js","sourceRoot":"","sources":["../../../src/storage/rdf/SolidRdfSparqlEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArrayIterator } from 'asynciterator';\nimport type { AsyncIterator } from 'asynciterator';\nimport type { Bindings } from '@comunica/types';\nimport type { DefaultGraph, Quad, Quad_Object, Term } from '@rdfjs/types';\nimport { DataFactory as RdfDataFactory } from 'rdf-data-factory';\nimport { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { termToId } from 'n3';\nimport type { SparqlEngine } from '../sparql/SubgraphQueryEngine';\nimport { DisabledSparqlFeatureError, RdfSparqlAdapter, UnsupportedSparqlQueryError } from './RdfSparqlAdapter';\nimport type { ShadowRdfQuintStore } from './ShadowRdfQuintStore';\nimport type { SolidRdfEngine } from './SolidRdfEngine';\nimport type { RdfBindingRow, RdfLocalQueryResult, RdfQueryTermPattern } from './types';\n\nexport interface SolidRdfSparqlEngineOptions {\n rdfEngine: SolidRdfEngine;\n fallback: SparqlEngine;\n shadowStore?: ShadowRdfQuintStore;\n enablePrimary?: boolean;\n onFallback?: (reason: SolidRdfSparqlFallback) => void;\n}\n\nexport interface SolidRdfSparqlFallback {\n operation: 'queryBindings' | 'queryBoolean' | 'queryQuads' | 'queryVoid' | 'constructGraph' | 'listGraphs';\n reason: string;\n}\n\nexport type SolidRdfSparqlOperation = SolidRdfSparqlFallback['operation'];\n\nexport interface SolidRdfSparqlOperationCount {\n operation: SolidRdfSparqlOperation;\n primaryCount: number;\n fallbackCount: number;\n totalCount: number;\n fallbackRate: number;\n primaryDurationMs: number;\n fallbackDurationMs: number;\n}\n\nexport interface SolidRdfSparqlPrimaryMetric {\n operation: SolidRdfSparqlOperation;\n durationMs: number;\n scannedRows: number;\n returnedRows: number;\n plan: string[];\n indexChoices: string[];\n}\n\nexport interface SolidRdfSparqlFallbackMetric extends SolidRdfSparqlFallback {\n durationMs: number;\n}\n\nexport interface SolidRdfSparqlMetricsSnapshot {\n primaryCount: number;\n fallbackCount: number;\n totalCount: number;\n fallbackRate: number;\n operationCounts: SolidRdfSparqlOperationCount[];\n lastPrimary?: SolidRdfSparqlPrimaryMetric;\n lastFallback?: SolidRdfSparqlFallbackMetric;\n}\n\nexport interface SolidRdfSparqlFallbackBudget {\n maxFallbackRate?: number;\n maxFallbackCount?: number;\n operations?: SolidRdfSparqlOperation[];\n}\n\ntype BindingsStream = AsyncIterator<Bindings> & {\n metadata?: () => Promise<{ variables: import('@rdfjs/types').Variable[] }>;\n};\n\ninterface MutableOperationCount {\n primaryCount: number;\n fallbackCount: number;\n primaryDurationMs: number;\n fallbackDurationMs: number;\n}\n\nconst rdfDataFactory = new RdfDataFactory();\n\nexport class SolidRdfSparqlEngine implements SparqlEngine {\n private readonly adapter = new RdfSparqlAdapter();\n private readonly bindingsFactory = new (BindingsFactory as any)(rdfDataFactory);\n private readonly rdfEngine: SolidRdfEngine;\n private readonly fallback: SparqlEngine;\n private readonly shadowStore?: ShadowRdfQuintStore;\n private readonly enablePrimary: boolean;\n private readonly onFallback?: (reason: SolidRdfSparqlFallback) => void;\n private readonly operationCounts = new Map<SolidRdfSparqlOperation, MutableOperationCount>();\n private lastPrimary?: SolidRdfSparqlPrimaryMetric;\n private lastFallback?: SolidRdfSparqlFallbackMetric;\n\n public constructor(\n rdfEngine: SolidRdfEngine,\n fallback: SparqlEngine,\n shadowStore?: ShadowRdfQuintStore,\n enablePrimary = true,\n onFallback?: (reason: SolidRdfSparqlFallback) => void,\n ) {\n this.rdfEngine = rdfEngine;\n this.fallback = fallback;\n this.shadowStore = shadowStore;\n this.enablePrimary = enablePrimary;\n this.onFallback = onFallback;\n }\n\n public async queryBindings(query: string, basePath: string): Promise<BindingsStream> {\n await this.ensureReady();\n if (!this.enablePrimary) {\n return this.fallbackWith('queryBindings', 'primary disabled', () => this.fallback.queryBindings(query, basePath));\n }\n\n const start = Date.now();\n try {\n const compiled = this.adapter.compile(query, basePath);\n if (compiled.queryType !== 'SELECT') {\n return this.fallbackWith('queryBindings', `compiled ${compiled.queryType} cannot produce bindings`, () => this.fallback.queryBindings(query, basePath));\n }\n const result = await this.rdfEngine.query(compiled.query);\n this.recordPrimary('queryBindings', start, result);\n return this.bindingsStream(result, compiled.variables);\n } catch (error) {\n if (error instanceof DisabledSparqlFeatureError) {\n throw error;\n }\n return this.fallbackWith('queryBindings', fallbackReason(error), () => this.fallback.queryBindings(query, basePath));\n }\n }\n\n public async queryBoolean(query: string, basePath: string): Promise<boolean> {\n await this.ensureReady();\n if (!this.enablePrimary) {\n return this.fallbackWith('queryBoolean', 'primary disabled', () => this.fallback.queryBoolean(query, basePath));\n }\n\n const start = Date.now();\n try {\n const compiled = this.adapter.compile(query, basePath);\n if (compiled.queryType !== 'ASK') {\n return this.fallbackWith('queryBoolean', `compiled ${compiled.queryType} cannot produce boolean`, () => this.fallback.queryBoolean(query, basePath));\n }\n const result = await this.rdfEngine.query(compiled.query);\n this.recordPrimary('queryBoolean', start, result);\n return result.bindings.length > 0;\n } catch (error) {\n if (error instanceof DisabledSparqlFeatureError) {\n throw error;\n }\n return this.fallbackWith('queryBoolean', fallbackReason(error), () => this.fallback.queryBoolean(query, basePath));\n }\n }\n\n public async queryQuads(query: string, basePath: string): Promise<any> {\n await this.ensureReady();\n if (!this.enablePrimary) {\n return this.fallbackWith('queryQuads', 'primary disabled', () => this.fallback.queryQuads(query, basePath));\n }\n\n const start = Date.now();\n try {\n const quads = this.executeQuadsPrimary(query, basePath, 'queryQuads', start);\n return new ArrayIterator(quads);\n } catch (error) {\n if (error instanceof DisabledSparqlFeatureError) {\n throw error;\n }\n return this.fallbackWith('queryQuads', fallbackReason(error), () => this.fallback.queryQuads(query, basePath));\n }\n }\n\n public async queryVoid(query: string, basePath: string): Promise<void> {\n await this.ensureReady();\n if (!this.enablePrimary) {\n return this.fallbackWith('queryVoid', 'primary disabled', () => this.fallback.queryVoid(query, basePath));\n }\n\n const start = Date.now();\n try {\n const delta = this.adapter.compileUpdateDelta(query, basePath);\n let deletedRows = 0;\n let computedDeletes = 0;\n let computedInserts = 0;\n for (const operation of delta.operations) {\n if (operation.type === 'delete') {\n for (const quad of operation.quads) {\n deletedRows += this.rdfEngine.delete({\n graph: quad.graph,\n subject: quad.subject,\n predicate: quad.predicate,\n object: quad.object,\n });\n }\n } else if (operation.type === 'insert') {\n this.rdfEngine.put(operation.quads);\n } else if (operation.type === 'insertDeleteWhere') {\n const result = this.rdfEngine.query(operation.query);\n const deletes = this.adapter.materializeDeleteWhere(operation.deletes, result.bindings);\n const inserts = this.adapter.materializeDeleteWhere(operation.inserts, result.bindings);\n computedDeletes += deletes.length;\n computedInserts += inserts.length;\n for (const quad of deletes) {\n deletedRows += this.rdfEngine.delete({\n graph: quad.graph,\n subject: quad.subject,\n predicate: quad.predicate,\n object: quad.object,\n });\n }\n this.rdfEngine.put(inserts);\n } else if (operation.type === 'insertWhere') {\n const result = this.rdfEngine.query(operation.query);\n const inserts = this.adapter.materializeDeleteWhere(operation.inserts, result.bindings);\n computedInserts += inserts.length;\n this.rdfEngine.put(inserts);\n } else {\n const result = this.rdfEngine.query(operation.query);\n const quads = this.adapter.materializeDeleteWhere(operation.template, result.bindings);\n computedDeletes += quads.length;\n for (const quad of quads) {\n deletedRows += this.rdfEngine.delete({\n graph: quad.graph,\n subject: quad.subject,\n predicate: quad.predicate,\n object: quad.object,\n });\n }\n }\n }\n this.recordPrimary('queryVoid', start, {\n bindings: [],\n metrics: {\n engine: 'solid-rdf',\n plan: ['UpdateDelta', `delete:${delta.deletes.length + computedDeletes}`, `deletedRows:${deletedRows}`, `insert:${delta.inserts.length + computedInserts}`],\n scannedRows: delta.deletes.length + computedDeletes + delta.inserts.length + computedInserts,\n joinedRows: 0,\n returnedRows: 0,\n durationMs: Date.now() - start,\n indexChoices: ['update-delta'],\n filtersApplied: 0,\n filtersPushedDown: 0,\n },\n });\n return undefined;\n } catch (error) {\n if (error instanceof DisabledSparqlFeatureError) {\n throw error;\n }\n return this.fallbackWith('queryVoid', fallbackReason(error), () => this.fallback.queryVoid(query, basePath));\n }\n }\n\n public async constructGraph(graph: string, basePath: string): Promise<AsyncIterator<Quad>> {\n await this.ensureReady();\n if (!this.enablePrimary) {\n return this.fallbackWith('constructGraph', 'primary disabled', () => this.fallback.constructGraph(graph, basePath));\n }\n if (!graph.startsWith(basePath)) {\n return new ArrayIterator([] as Quad[]);\n }\n\n const start = Date.now();\n try {\n const quads = this.executeConstructPrimary(`\n CONSTRUCT { ?s ?p ?o }\n WHERE { GRAPH <${escapeIri(graph)}> { ?s ?p ?o } }\n `, basePath, 'constructGraph', start);\n return new ArrayIterator(quads);\n } catch (error) {\n if (error instanceof DisabledSparqlFeatureError) {\n throw error;\n }\n return this.fallbackWith('constructGraph', fallbackReason(error), () => this.fallback.constructGraph(graph, basePath));\n }\n }\n\n public async listGraphs(basePath: string): Promise<Set<string>> {\n await this.ensureReady();\n if (!this.enablePrimary) {\n return this.fallbackWith('listGraphs', 'primary disabled', () => this.fallback.listGraphs(basePath));\n }\n\n const start = Date.now();\n try {\n const result = this.executeSelectPrimary(`\n SELECT DISTINCT ?g WHERE { GRAPH ?g { ?s ?p ?o } }\n `, basePath, 'listGraphs', start);\n const graphs = new Set<string>();\n for (const binding of result.bindings) {\n const graph = binding.g;\n if (graph?.termType === 'NamedNode') {\n graphs.add(graph.value);\n }\n }\n return graphs;\n } catch (error) {\n if (error instanceof DisabledSparqlFeatureError) {\n throw error;\n }\n return this.fallbackWith('listGraphs', fallbackReason(error), () => this.fallback.listGraphs(basePath));\n }\n }\n\n public async close(): Promise<void> {\n await this.rdfEngine.close();\n await this.fallback.close();\n }\n\n public getMetrics(): SolidRdfSparqlMetricsSnapshot {\n const operationCounts = [...this.operationCounts.entries()]\n .map(([ operation, counts ]) => operationCountSnapshot(operation, counts))\n .sort((left, right) => left.operation.localeCompare(right.operation));\n const primaryCount = operationCounts.reduce((sum, counts) => sum + counts.primaryCount, 0);\n const fallbackCount = operationCounts.reduce((sum, counts) => sum + counts.fallbackCount, 0);\n const totalCount = primaryCount + fallbackCount;\n return {\n primaryCount,\n fallbackCount,\n totalCount,\n fallbackRate: ratio(fallbackCount, totalCount),\n operationCounts,\n lastPrimary: this.lastPrimary,\n lastFallback: this.lastFallback,\n };\n }\n\n public assertFallbackBudget(budget: SolidRdfSparqlFallbackBudget = {}): void {\n const snapshot = this.getMetrics();\n const maxFallbackRate = budget.maxFallbackRate ?? 0;\n const maxFallbackCount = budget.maxFallbackCount ?? 0;\n const operationSet = budget.operations ? new Set(budget.operations) : undefined;\n const counts = operationSet\n ? snapshot.operationCounts.filter((count) => operationSet.has(count.operation))\n : snapshot.operationCounts;\n const primaryCount = counts.reduce((sum, count) => sum + count.primaryCount, 0);\n const fallbackCount = counts.reduce((sum, count) => sum + count.fallbackCount, 0);\n const totalCount = primaryCount + fallbackCount;\n const fallbackRate = ratio(fallbackCount, totalCount);\n if (fallbackCount <= maxFallbackCount && fallbackRate <= maxFallbackRate) {\n return;\n }\n const scope = operationSet ? ` for ${[...operationSet].join(',')}` : '';\n const reason = snapshot.lastFallback ? `; last fallback ${snapshot.lastFallback.operation}: ${snapshot.lastFallback.reason}` : '';\n throw new Error(`SolidRdfSparql fallback budget exceeded${scope}: ${fallbackCount}/${totalCount} (${fallbackRate}) > count ${maxFallbackCount}, rate ${maxFallbackRate}${reason}`);\n }\n\n public resetMetrics(): void {\n this.operationCounts.clear();\n this.lastPrimary = undefined;\n this.lastFallback = undefined;\n }\n\n private bindingsStream(result: RdfLocalQueryResult, variables: string[]): BindingsStream {\n const projectedVariables = variables.length > 0\n ? variables\n : inferVariables(result.bindings);\n const rows = result.bindings.map((binding) => this.bindings(binding, projectedVariables));\n const iterator = new ArrayIterator(rows) as BindingsStream;\n iterator.metadata = async () => ({\n variables: projectedVariables.map((variableName) => rdfDataFactory.variable(variableName) as import('@rdfjs/types').Variable),\n });\n return iterator;\n }\n\n private bindings(binding: RdfBindingRow, variables: string[]): Bindings {\n const entries: [import('@rdfjs/types').Variable, import('@rdfjs/types').Term][] = variables\n .map((variableName) => {\n const term = binding[variableName];\n return term ? [rdfDataFactory.variable(variableName), term] : null;\n })\n .filter((entry): entry is [import('@rdfjs/types').Variable, import('@rdfjs/types').Term] => entry !== null);\n return this.bindingsFactory.bindings(entries);\n }\n\n private async fallbackWith<T>(\n operation: SolidRdfSparqlOperation,\n reason: string,\n run: () => Promise<T>,\n ): Promise<T> {\n this.onFallback?.({ operation, reason });\n const start = Date.now();\n try {\n return await run();\n } finally {\n this.recordFallback(operation, reason, Date.now() - start);\n }\n }\n\n private async ensureReady(): Promise<void> {\n if (this.shadowStore) {\n await this.shadowStore.open();\n }\n }\n\n private executeSelectPrimary(\n query: string,\n basePath: string,\n operation: SolidRdfSparqlOperation,\n start: number,\n ): RdfLocalQueryResult {\n const compiled = this.adapter.compile(query, basePath);\n if (compiled.queryType !== 'SELECT') {\n throw new UnsupportedSparqlQueryError(`compiled ${compiled.queryType} cannot produce bindings`);\n }\n const result = this.rdfEngine.query(compiled.query);\n this.recordPrimary(operation, start, result);\n return result;\n }\n\n private executeConstructPrimary(\n query: string,\n basePath: string,\n operation: SolidRdfSparqlOperation,\n start: number,\n ): Quad[] {\n const compiled = this.adapter.compile(query, basePath);\n if (compiled.queryType !== 'CONSTRUCT' || !compiled.constructTemplate) {\n throw new UnsupportedSparqlQueryError(`compiled ${compiled.queryType} cannot produce quads`);\n }\n const result = this.rdfEngine.query(compiled.query);\n const quads = this.adapter.materializeConstruct(compiled.constructTemplate, result.bindings, rdfDataFactory.defaultGraph() as Term);\n this.recordPrimary(operation, start, {\n ...result,\n bindings: [],\n metrics: {\n ...result.metrics,\n returnedRows: quads.length,\n plan: [...result.metrics.plan, 'Construct'],\n },\n });\n return quads;\n }\n\n private executeQuadsPrimary(\n query: string,\n basePath: string,\n operation: SolidRdfSparqlOperation,\n start: number,\n ): Quad[] {\n const compiled = this.adapter.compile(query, basePath);\n if (compiled.queryType === 'CONSTRUCT' && compiled.constructTemplate) {\n const result = this.rdfEngine.query(compiled.query);\n const quads = this.adapter.materializeConstruct(compiled.constructTemplate, result.bindings, rdfDataFactory.defaultGraph() as Term);\n this.recordPrimary(operation, start, {\n ...result,\n bindings: [],\n metrics: {\n ...result.metrics,\n returnedRows: quads.length,\n plan: [...result.metrics.plan, 'Construct'],\n },\n });\n return quads;\n }\n if (compiled.queryType === 'DESCRIBE' && compiled.describeTargets) {\n return this.executeDescribePrimary(compiled.query, compiled.describeTargets, basePath, operation, start);\n }\n throw new UnsupportedSparqlQueryError(`compiled ${compiled.queryType} cannot produce quads`);\n }\n\n private executeDescribePrimary(\n query: import('./types').RdfLocalQuery,\n targets: RdfQueryTermPattern[],\n basePath: string,\n operation: SolidRdfSparqlOperation,\n start: number,\n ): Quad[] {\n const seed = this.rdfEngine.query(query);\n const quads: Quad[] = [];\n const seen = new Set<string>();\n\n for (const target of targets) {\n for (const binding of seed.bindings) {\n const subject = resolveQueryTerm(target, binding);\n if (!subject || subject.termType !== 'NamedNode') {\n continue;\n }\n const describe = this.rdfEngine.query({\n patterns: [\n {\n subject,\n predicate: { variable: 'p' },\n object: { variable: 'o' },\n graph: { $startsWith: basePath },\n },\n ],\n select: ['p', 'o'],\n });\n for (const row of describe.bindings) {\n const predicate = row.p;\n const object = row.o;\n if (predicate?.termType !== 'NamedNode' || !isQuadObjectTerm(object)) {\n continue;\n }\n const quad = rdfDataFactory.quad(subject, predicate, object, rdfDataFactory.defaultGraph() as DefaultGraph) as Quad;\n const key = [quad.subject, quad.predicate, quad.object, quad.graph].map((term) => termToId(term as any)).join('\\u001f');\n if (!seen.has(key)) {\n seen.add(key);\n quads.push(quad);\n }\n }\n }\n }\n\n this.recordPrimary(operation, start, {\n bindings: [],\n metrics: {\n ...seed.metrics,\n returnedRows: quads.length,\n plan: [...seed.metrics.plan, 'Describe'],\n },\n });\n return quads;\n }\n\n private recordPrimary(\n operation: SolidRdfSparqlOperation,\n start: number,\n result: RdfLocalQueryResult,\n ): void {\n const durationMs = Date.now() - start;\n const counts = this.countsFor(operation);\n counts.primaryCount += 1;\n counts.primaryDurationMs += durationMs;\n this.lastPrimary = {\n operation,\n durationMs,\n scannedRows: result.metrics.scannedRows,\n returnedRows: result.metrics.returnedRows,\n plan: result.metrics.plan,\n indexChoices: result.metrics.indexChoices,\n };\n }\n\n private recordFallback(operation: SolidRdfSparqlOperation, reason: string, durationMs: number): void {\n const counts = this.countsFor(operation);\n counts.fallbackCount += 1;\n counts.fallbackDurationMs += durationMs;\n this.lastFallback = {\n operation,\n reason,\n durationMs,\n };\n }\n\n private countsFor(operation: SolidRdfSparqlOperation): MutableOperationCount {\n const existing = this.operationCounts.get(operation);\n if (existing) {\n return existing;\n }\n const created = {\n primaryCount: 0,\n fallbackCount: 0,\n primaryDurationMs: 0,\n fallbackDurationMs: 0,\n };\n this.operationCounts.set(operation, created);\n return created;\n }\n\n}\n\nfunction inferVariables(bindings: RdfBindingRow[]): string[] {\n const names = new Set<string>();\n for (const binding of bindings) {\n for (const name of Object.keys(binding)) {\n names.add(name);\n }\n }\n return [...names];\n}\n\nfunction resolveQueryTerm(term: RdfQueryTermPattern, binding: RdfBindingRow): Term | undefined {\n if (term && typeof term === 'object' && 'variable' in term) {\n return binding[term.variable];\n }\n return term as Term;\n}\n\nfunction isQuadObjectTerm(term: Term | undefined): term is Quad_Object {\n return Boolean(\n term\n && term.termType !== 'Variable'\n && term.termType !== 'DefaultGraph'\n && term.termType !== 'Quad',\n );\n}\n\nfunction fallbackReason(error: unknown): string {\n if (error instanceof UnsupportedSparqlQueryError) {\n return error.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction operationCountSnapshot(\n operation: SolidRdfSparqlOperation,\n counts: MutableOperationCount,\n): SolidRdfSparqlOperationCount {\n const totalCount = counts.primaryCount + counts.fallbackCount;\n return {\n operation,\n primaryCount: counts.primaryCount,\n fallbackCount: counts.fallbackCount,\n totalCount,\n fallbackRate: ratio(counts.fallbackCount, totalCount),\n primaryDurationMs: counts.primaryDurationMs,\n fallbackDurationMs: counts.fallbackDurationMs,\n };\n}\n\nfunction ratio(numerator: number, denominator: number): number {\n return denominator === 0 ? 0 : numerator / denominator;\n}\n\nfunction escapeIri(value: string): string {\n return value.replace(/[<>\"{}|^`\\\\]/g, (char) => encodeURIComponent(char));\n}\n"]}