@comake/skl-js-engine 1.5.4 → 1.5.5

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 (303) hide show
  1. package/dist/JsExecutor/PermissionBuilder.d.ts +14 -0
  2. package/dist/JsExecutor/PermissionBuilder.d.ts.map +1 -0
  3. package/dist/JsExecutor/PermissionBuilder.js +58 -0
  4. package/dist/JsExecutor/PermissionBuilder.js.map +1 -0
  5. package/dist/JsExecutor/constants.d.ts +27 -0
  6. package/dist/JsExecutor/constants.d.ts.map +1 -0
  7. package/dist/JsExecutor/constants.js +30 -0
  8. package/dist/JsExecutor/constants.js.map +1 -0
  9. package/dist/JsExecutor/denoUtils.d.ts +10 -0
  10. package/dist/JsExecutor/denoUtils.d.ts.map +1 -0
  11. package/dist/JsExecutor/denoUtils.js +24 -0
  12. package/dist/JsExecutor/denoUtils.js.map +1 -0
  13. package/dist/JsExecutor/errors.d.ts +40 -0
  14. package/dist/JsExecutor/errors.d.ts.map +1 -0
  15. package/dist/JsExecutor/errors.js +67 -0
  16. package/dist/JsExecutor/errors.js.map +1 -0
  17. package/dist/JsExecutor/examples/basic/index.d.ts +1 -0
  18. package/dist/JsExecutor/examples/basic/index.d.ts.map +1 -0
  19. package/dist/JsExecutor/examples/basic/index.js +46 -0
  20. package/dist/JsExecutor/examples/basic/index.js.map +1 -0
  21. package/dist/JsExecutor/examples/basic/process.d.ts +1 -0
  22. package/dist/JsExecutor/examples/basic/process.d.ts.map +1 -0
  23. package/dist/JsExecutor/examples/basic/process.js +34 -0
  24. package/dist/JsExecutor/examples/basic/process.js.map +1 -0
  25. package/dist/JsExecutor/examples/jsExecutor/index.d.ts +2 -0
  26. package/dist/JsExecutor/examples/jsExecutor/index.d.ts.map +1 -0
  27. package/dist/JsExecutor/examples/jsExecutor/index.js +47 -0
  28. package/dist/JsExecutor/examples/jsExecutor/index.js.map +1 -0
  29. package/dist/JsExecutor/examples/jsExecutor/process.d.ts +2 -0
  30. package/dist/JsExecutor/examples/jsExecutor/process.d.ts.map +1 -0
  31. package/dist/JsExecutor/examples/jsExecutor/process.js +58 -0
  32. package/dist/JsExecutor/examples/jsExecutor/process.js.map +1 -0
  33. package/dist/JsExecutor/index.d.ts +7 -0
  34. package/dist/JsExecutor/index.d.ts.map +1 -0
  35. package/dist/JsExecutor/index.js +36 -0
  36. package/dist/JsExecutor/index.js.map +1 -0
  37. package/dist/JsExecutor/jsExecutor.d.ts +68 -0
  38. package/dist/JsExecutor/jsExecutor.d.ts.map +1 -0
  39. package/dist/JsExecutor/jsExecutor.js +171 -0
  40. package/dist/JsExecutor/jsExecutor.js.map +1 -0
  41. package/dist/JsExecutor/jsonRpc/JsonRpcClient.d.ts +165 -0
  42. package/dist/JsExecutor/jsonRpc/JsonRpcClient.d.ts.map +1 -0
  43. package/dist/JsExecutor/jsonRpc/JsonRpcClient.js +335 -0
  44. package/dist/JsExecutor/jsonRpc/JsonRpcClient.js.map +1 -0
  45. package/dist/JsExecutor/jsonRpc/JsonRpcServer.d.ts +125 -0
  46. package/dist/JsExecutor/jsonRpc/JsonRpcServer.d.ts.map +1 -0
  47. package/dist/JsExecutor/jsonRpc/JsonRpcServer.js +391 -0
  48. package/dist/JsExecutor/jsonRpc/JsonRpcServer.js.map +1 -0
  49. package/dist/JsExecutor/jsonRpc/index.d.ts +4 -0
  50. package/dist/JsExecutor/jsonRpc/index.d.ts.map +1 -0
  51. package/dist/JsExecutor/jsonRpc/index.js +23 -0
  52. package/dist/JsExecutor/jsonRpc/index.js.map +1 -0
  53. package/dist/JsExecutor/jsonRpc/types.d.ts +193 -0
  54. package/dist/JsExecutor/jsonRpc/types.d.ts.map +1 -0
  55. package/dist/JsExecutor/jsonRpc/types.js +37 -0
  56. package/dist/JsExecutor/jsonRpc/types.js.map +1 -0
  57. package/dist/JsExecutor/transport/Transport.d.ts +74 -0
  58. package/dist/JsExecutor/transport/Transport.d.ts.map +1 -0
  59. package/dist/JsExecutor/transport/Transport.js +14 -0
  60. package/dist/JsExecutor/transport/Transport.js.map +1 -0
  61. package/dist/JsExecutor/transport/base/BaseTransport.d.ts +51 -0
  62. package/dist/JsExecutor/transport/base/BaseTransport.d.ts.map +1 -0
  63. package/dist/JsExecutor/transport/base/BaseTransport.js +68 -0
  64. package/dist/JsExecutor/transport/base/BaseTransport.js.map +1 -0
  65. package/dist/JsExecutor/transport/index.d.ts +13 -0
  66. package/dist/JsExecutor/transport/index.d.ts.map +1 -0
  67. package/dist/JsExecutor/transport/index.js +36 -0
  68. package/dist/JsExecutor/transport/index.js.map +1 -0
  69. package/dist/JsExecutor/transport/process/ProcessManager.d.ts +96 -0
  70. package/dist/JsExecutor/transport/process/ProcessManager.d.ts.map +1 -0
  71. package/dist/JsExecutor/transport/process/ProcessManager.js +219 -0
  72. package/dist/JsExecutor/transport/process/ProcessManager.js.map +1 -0
  73. package/dist/JsExecutor/transport/stdio/ChildStdioTransport.d.ts +87 -0
  74. package/dist/JsExecutor/transport/stdio/ChildStdioTransport.d.ts.map +1 -0
  75. package/dist/JsExecutor/transport/stdio/ChildStdioTransport.js +219 -0
  76. package/dist/JsExecutor/transport/stdio/ChildStdioTransport.js.map +1 -0
  77. package/dist/JsExecutor/transport/stdio/ParentStdioTransport.d.ts +81 -0
  78. package/dist/JsExecutor/transport/stdio/ParentStdioTransport.d.ts.map +1 -0
  79. package/dist/JsExecutor/transport/stdio/ParentStdioTransport.js +259 -0
  80. package/dist/JsExecutor/transport/stdio/ParentStdioTransport.js.map +1 -0
  81. package/dist/JsExecutor/transport/utils/MessageUtils.d.ts +68 -0
  82. package/dist/JsExecutor/transport/utils/MessageUtils.d.ts.map +1 -0
  83. package/dist/JsExecutor/transport/utils/MessageUtils.js +135 -0
  84. package/dist/JsExecutor/transport/utils/MessageUtils.js.map +1 -0
  85. package/dist/JsExecutor/transport/utils/PollingUtils.d.ts +53 -0
  86. package/dist/JsExecutor/transport/utils/PollingUtils.d.ts.map +1 -0
  87. package/dist/JsExecutor/transport/utils/PollingUtils.js +92 -0
  88. package/dist/JsExecutor/transport/utils/PollingUtils.js.map +1 -0
  89. package/dist/JsExecutor/types.d.ts +113 -0
  90. package/dist/JsExecutor/types.d.ts.map +1 -0
  91. package/dist/JsExecutor/types.js +3 -0
  92. package/dist/JsExecutor/types.js.map +1 -0
  93. package/dist/SklEngine.d.ts +132 -0
  94. package/dist/SklEngine.d.ts.map +1 -0
  95. package/dist/SklEngine.js +1508 -0
  96. package/dist/SklEngine.js.map +1 -0
  97. package/dist/SklEngineOptions.d.ts +58 -0
  98. package/dist/SklEngineOptions.d.ts.map +1 -0
  99. package/dist/SklEngineOptions.js +3 -0
  100. package/dist/SklEngineOptions.js.map +1 -0
  101. package/dist/constants.d.ts +96 -0
  102. package/dist/constants.d.ts.map +1 -0
  103. package/dist/constants.js +103 -0
  104. package/dist/constants.js.map +1 -0
  105. package/dist/customCapabilities.d.ts +22 -0
  106. package/dist/customCapabilities.d.ts.map +1 -0
  107. package/dist/customCapabilities.js +45 -0
  108. package/dist/customCapabilities.js.map +1 -0
  109. package/dist/examples/customCapabilitiesExample.d.ts +2 -0
  110. package/dist/examples/customCapabilitiesExample.d.ts.map +1 -0
  111. package/dist/examples/customCapabilitiesExample.js +59 -0
  112. package/dist/examples/customCapabilitiesExample.js.map +1 -0
  113. package/dist/executor.js +216 -0
  114. package/dist/hooks/globalHooks.d.ts +50 -0
  115. package/dist/hooks/globalHooks.d.ts.map +1 -0
  116. package/dist/hooks/globalHooks.js +164 -0
  117. package/dist/hooks/globalHooks.js.map +1 -0
  118. package/dist/hooks/types.d.ts +9 -0
  119. package/dist/hooks/types.d.ts.map +1 -0
  120. package/dist/hooks/types.js +3 -0
  121. package/dist/hooks/types.js.map +1 -0
  122. package/dist/index.d.ts +41 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +68 -0
  125. package/dist/index.js.map +1 -0
  126. package/dist/logger.d.ts +35 -0
  127. package/dist/logger.d.ts.map +1 -0
  128. package/dist/logger.js +119 -0
  129. package/dist/logger.js.map +1 -0
  130. package/dist/mapping/Mapper.d.ts +13 -0
  131. package/dist/mapping/Mapper.d.ts.map +1 -0
  132. package/dist/mapping/Mapper.js +64 -0
  133. package/dist/mapping/Mapper.js.map +1 -0
  134. package/dist/storage/FindOperator.d.ts +19 -0
  135. package/dist/storage/FindOperator.d.ts.map +1 -0
  136. package/dist/storage/FindOperator.js +23 -0
  137. package/dist/storage/FindOperator.js.map +1 -0
  138. package/dist/storage/FindOptionsTypes.d.ts +79 -0
  139. package/dist/storage/FindOptionsTypes.d.ts.map +1 -0
  140. package/dist/storage/FindOptionsTypes.js +3 -0
  141. package/dist/storage/FindOptionsTypes.js.map +1 -0
  142. package/dist/storage/GroupOptionTypes.d.ts +29 -0
  143. package/dist/storage/GroupOptionTypes.d.ts.map +1 -0
  144. package/dist/storage/GroupOptionTypes.js +3 -0
  145. package/dist/storage/GroupOptionTypes.js.map +1 -0
  146. package/dist/storage/operator/And.d.ts +4 -0
  147. package/dist/storage/operator/And.d.ts.map +1 -0
  148. package/dist/storage/operator/And.js +13 -0
  149. package/dist/storage/operator/And.js.map +1 -0
  150. package/dist/storage/operator/Contains.d.ts +3 -0
  151. package/dist/storage/operator/Contains.d.ts.map +1 -0
  152. package/dist/storage/operator/Contains.js +13 -0
  153. package/dist/storage/operator/Contains.js.map +1 -0
  154. package/dist/storage/operator/Equal.d.ts +5 -0
  155. package/dist/storage/operator/Equal.d.ts.map +1 -0
  156. package/dist/storage/operator/Equal.js +13 -0
  157. package/dist/storage/operator/Equal.js.map +1 -0
  158. package/dist/storage/operator/Exists.d.ts +3 -0
  159. package/dist/storage/operator/Exists.d.ts.map +1 -0
  160. package/dist/storage/operator/Exists.js +10 -0
  161. package/dist/storage/operator/Exists.js.map +1 -0
  162. package/dist/storage/operator/GreaterThan.d.ts +4 -0
  163. package/dist/storage/operator/GreaterThan.d.ts.map +1 -0
  164. package/dist/storage/operator/GreaterThan.js +13 -0
  165. package/dist/storage/operator/GreaterThan.js.map +1 -0
  166. package/dist/storage/operator/GreaterThanOrEqual.d.ts +4 -0
  167. package/dist/storage/operator/GreaterThanOrEqual.d.ts.map +1 -0
  168. package/dist/storage/operator/GreaterThanOrEqual.js +13 -0
  169. package/dist/storage/operator/GreaterThanOrEqual.js.map +1 -0
  170. package/dist/storage/operator/In.d.ts +4 -0
  171. package/dist/storage/operator/In.d.ts.map +1 -0
  172. package/dist/storage/operator/In.js +13 -0
  173. package/dist/storage/operator/In.js.map +1 -0
  174. package/dist/storage/operator/Inverse.d.ts +3 -0
  175. package/dist/storage/operator/Inverse.d.ts.map +1 -0
  176. package/dist/storage/operator/Inverse.js +13 -0
  177. package/dist/storage/operator/Inverse.js.map +1 -0
  178. package/dist/storage/operator/InversePath.d.ts +7 -0
  179. package/dist/storage/operator/InversePath.d.ts.map +1 -0
  180. package/dist/storage/operator/InversePath.js +13 -0
  181. package/dist/storage/operator/InversePath.js.map +1 -0
  182. package/dist/storage/operator/InverseRelation.d.ts +9 -0
  183. package/dist/storage/operator/InverseRelation.d.ts.map +1 -0
  184. package/dist/storage/operator/InverseRelation.js +13 -0
  185. package/dist/storage/operator/InverseRelation.js.map +1 -0
  186. package/dist/storage/operator/InverseRelationOrder.d.ts +8 -0
  187. package/dist/storage/operator/InverseRelationOrder.d.ts.map +1 -0
  188. package/dist/storage/operator/InverseRelationOrder.js +13 -0
  189. package/dist/storage/operator/InverseRelationOrder.js.map +1 -0
  190. package/dist/storage/operator/LessThan.d.ts +4 -0
  191. package/dist/storage/operator/LessThan.d.ts.map +1 -0
  192. package/dist/storage/operator/LessThan.js +13 -0
  193. package/dist/storage/operator/LessThan.js.map +1 -0
  194. package/dist/storage/operator/LessThanOrEqual.d.ts +4 -0
  195. package/dist/storage/operator/LessThanOrEqual.d.ts.map +1 -0
  196. package/dist/storage/operator/LessThanOrEqual.js +13 -0
  197. package/dist/storage/operator/LessThanOrEqual.js.map +1 -0
  198. package/dist/storage/operator/Not.d.ts +3 -0
  199. package/dist/storage/operator/Not.d.ts.map +1 -0
  200. package/dist/storage/operator/Not.js +13 -0
  201. package/dist/storage/operator/Not.js.map +1 -0
  202. package/dist/storage/operator/OneOrMorePath.d.ts +7 -0
  203. package/dist/storage/operator/OneOrMorePath.d.ts.map +1 -0
  204. package/dist/storage/operator/OneOrMorePath.js +13 -0
  205. package/dist/storage/operator/OneOrMorePath.js.map +1 -0
  206. package/dist/storage/operator/Or.d.ts +4 -0
  207. package/dist/storage/operator/Or.d.ts.map +1 -0
  208. package/dist/storage/operator/Or.js +13 -0
  209. package/dist/storage/operator/Or.js.map +1 -0
  210. package/dist/storage/operator/Sequence.d.ts +3 -0
  211. package/dist/storage/operator/Sequence.d.ts.map +1 -0
  212. package/dist/storage/operator/Sequence.js +13 -0
  213. package/dist/storage/operator/Sequence.js.map +1 -0
  214. package/dist/storage/operator/SequencePath.d.ts +7 -0
  215. package/dist/storage/operator/SequencePath.d.ts.map +1 -0
  216. package/dist/storage/operator/SequencePath.js +13 -0
  217. package/dist/storage/operator/SequencePath.js.map +1 -0
  218. package/dist/storage/operator/ZeroOrMorePath.d.ts +7 -0
  219. package/dist/storage/operator/ZeroOrMorePath.d.ts.map +1 -0
  220. package/dist/storage/operator/ZeroOrMorePath.js +13 -0
  221. package/dist/storage/operator/ZeroOrMorePath.js.map +1 -0
  222. package/dist/storage/query-adapter/QueryAdapter.d.ts +99 -0
  223. package/dist/storage/query-adapter/QueryAdapter.d.ts.map +1 -0
  224. package/dist/storage/query-adapter/QueryAdapter.js +3 -0
  225. package/dist/storage/query-adapter/QueryAdapter.js.map +1 -0
  226. package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.d.ts +40 -0
  227. package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.d.ts.map +1 -0
  228. package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.js +315 -0
  229. package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.js.map +1 -0
  230. package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.d.ts +34 -0
  231. package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.d.ts.map +1 -0
  232. package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.js +3 -0
  233. package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.js.map +1 -0
  234. package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.d.ts +104 -0
  235. package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.d.ts.map +1 -0
  236. package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.js +1210 -0
  237. package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.js.map +1 -0
  238. package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.d.ts +44 -0
  239. package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.d.ts.map +1 -0
  240. package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.js +397 -0
  241. package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.js.map +1 -0
  242. package/dist/storage/query-adapter/sparql/VariableGenerator.d.ts +5 -0
  243. package/dist/storage/query-adapter/sparql/VariableGenerator.d.ts.map +1 -0
  244. package/dist/storage/query-adapter/sparql/VariableGenerator.js +14 -0
  245. package/dist/storage/query-adapter/sparql/VariableGenerator.js.map +1 -0
  246. package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.d.ts +19 -0
  247. package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.d.ts.map +1 -0
  248. package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.js +90 -0
  249. package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.js.map +1 -0
  250. package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.d.ts +27 -0
  251. package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.d.ts.map +1 -0
  252. package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.js +116 -0
  253. package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.js.map +1 -0
  254. package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.d.ts +34 -0
  255. package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.d.ts.map +1 -0
  256. package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.js +3 -0
  257. package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.js.map +1 -0
  258. package/dist/tools/explain-findall-sparql.d.ts +2 -0
  259. package/dist/tools/explain-findall-sparql.d.ts.map +1 -0
  260. package/dist/tools/explain-findall-sparql.js +303 -0
  261. package/dist/tools/explain-findall-sparql.js.map +1 -0
  262. package/dist/util/PerformanceLogger.d.ts +28 -0
  263. package/dist/util/PerformanceLogger.d.ts.map +1 -0
  264. package/dist/util/PerformanceLogger.js +223 -0
  265. package/dist/util/PerformanceLogger.js.map +1 -0
  266. package/dist/util/ReadCacheHelper.d.ts +14 -0
  267. package/dist/util/ReadCacheHelper.d.ts.map +1 -0
  268. package/dist/util/ReadCacheHelper.js +61 -0
  269. package/dist/util/ReadCacheHelper.js.map +1 -0
  270. package/dist/util/SparqlUtil.d.ts +72 -0
  271. package/dist/util/SparqlUtil.d.ts.map +1 -0
  272. package/dist/util/SparqlUtil.js +456 -0
  273. package/dist/util/SparqlUtil.js.map +1 -0
  274. package/dist/util/TripleUtil.d.ts +10 -0
  275. package/dist/util/TripleUtil.d.ts.map +1 -0
  276. package/dist/util/TripleUtil.js +414 -0
  277. package/dist/util/TripleUtil.js.map +1 -0
  278. package/dist/util/Types.d.ts +271 -0
  279. package/dist/util/Types.d.ts.map +1 -0
  280. package/dist/util/Types.js +3 -0
  281. package/dist/util/Types.js.map +1 -0
  282. package/dist/util/Util.d.ts +26 -0
  283. package/dist/util/Util.d.ts.map +1 -0
  284. package/dist/util/Util.js +138 -0
  285. package/dist/util/Util.js.map +1 -0
  286. package/dist/util/Vocabularies/Shared.d.ts +13 -0
  287. package/dist/util/Vocabularies/Shared.d.ts.map +1 -0
  288. package/dist/util/Vocabularies/Shared.js +96 -0
  289. package/dist/util/Vocabularies/Shared.js.map +1 -0
  290. package/dist/util/Vocabularies/helper.d.ts +5 -0
  291. package/dist/util/Vocabularies/helper.d.ts.map +1 -0
  292. package/dist/util/Vocabularies/helper.js +10 -0
  293. package/dist/util/Vocabularies/helper.js.map +1 -0
  294. package/dist/util/Vocabularies/index.d.ts +8 -0
  295. package/dist/util/Vocabularies/index.d.ts.map +1 -0
  296. package/dist/util/Vocabularies/index.js +114 -0
  297. package/dist/util/Vocabularies/index.js.map +1 -0
  298. package/dist/util/safeJsonStringify.d.ts +1 -0
  299. package/dist/util/safeJsonStringify.d.ts.map +1 -0
  300. package/dist/util/safeJsonStringify.js +19 -0
  301. package/dist/util/safeJsonStringify.js.map +1 -0
  302. package/package.json +1 -1
  303. package/src/storage/query-adapter/sparql/SparqlUpdateBuilder.ts +106 -1
@@ -0,0 +1,397 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SparqlUpdateBuilder = void 0;
7
+ const rmlmapper_js_1 = require("@comake/rmlmapper-js");
8
+ const data_model_1 = __importDefault(require("@rdfjs/data-model"));
9
+ const constants_1 = require("../../../constants");
10
+ const SparqlUtil_1 = require("../../../util/SparqlUtil");
11
+ const TripleUtil_1 = require("../../../util/TripleUtil");
12
+ const Util_1 = require("../../../util/Util");
13
+ const VariableGenerator_1 = require("./VariableGenerator");
14
+ class SparqlUpdateBuilder {
15
+ constructor(args) {
16
+ this.variableGenerator = new VariableGenerator_1.VariableGenerator();
17
+ this.setTimestamps = args?.setTimestamps ?? false;
18
+ }
19
+ buildPartialUpdate(idOrIds, attributes) {
20
+ const ids = (0, Util_1.ensureArray)(idOrIds);
21
+ const updates = this.idsAndAttributesToGraphDeletionsAndInsertions(ids, attributes);
22
+ return (0, SparqlUtil_1.createSparqlUpdate)(updates);
23
+ }
24
+ buildUpdate(entityOrEntities) {
25
+ const entities = (0, Util_1.ensureArray)(entityOrEntities);
26
+ const { clear, insertions, timestampInsertions } = this.entitiesToGraphDeletionsAndInsertions(entities);
27
+ const insertUpdate = {
28
+ updateType: 'insert',
29
+ insert: insertions
30
+ };
31
+ const updates = [...clear, insertUpdate];
32
+ if (timestampInsertions.length > 0) {
33
+ updates.push({
34
+ updateType: 'insertdelete',
35
+ delete: [],
36
+ insert: timestampInsertions,
37
+ where: [SparqlUtil_1.bindNow]
38
+ });
39
+ }
40
+ return (0, SparqlUtil_1.createSparqlUpdate)(updates);
41
+ }
42
+ buildDeleteById(idOrIds) {
43
+ const ids = (0, Util_1.ensureArray)(idOrIds);
44
+ const drops = this.idsToGraphDropUpdates(ids);
45
+ return (0, SparqlUtil_1.createSparqlUpdate)(drops);
46
+ }
47
+ buildDelete(entityOrEntities) {
48
+ const entities = (0, Util_1.ensureArray)(entityOrEntities);
49
+ const drops = this.entitiesToGraphDropUpdates(entities);
50
+ return (0, SparqlUtil_1.createSparqlUpdate)(drops);
51
+ }
52
+ buildDeleteAll() {
53
+ return (0, SparqlUtil_1.createSparqlUpdate)([SparqlUtil_1.dropAll]);
54
+ }
55
+ idsAndAttributesToGraphDeletionsAndInsertions(ids, attributes) {
56
+ return ids.flatMap((id) => {
57
+ const subject = data_model_1.default.namedNode(id);
58
+ const { attributesToUpdate, attributesToDelete } = this.partitionAttributes(attributes);
59
+ const { triples: deletionTriples, deletions: deletionDeletions } = this.partialEntityToDeletionTriples(attributesToUpdate, subject);
60
+ const { triples: insertionTriples, insertions: insertionInsertions } = this.partialEntityToTriples(subject, attributesToUpdate);
61
+ const { triples: deleteOnlyTriples } = this.partialEntityToDeletionTriples(attributesToDelete, subject);
62
+ const updates = [];
63
+ updates.push(...this.createBlankNodeCleanupUpdates(subject, attributesToUpdate));
64
+ if (deletionTriples.length > 0) {
65
+ updates.push({
66
+ updateType: 'insertdelete',
67
+ delete: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, deletionTriples)],
68
+ insert: [],
69
+ where: deletionTriples.map((triple) => (0, SparqlUtil_1.createSparqlOptional)([(0, SparqlUtil_1.createSparqlBasicGraphPattern)([triple])])),
70
+ using: {
71
+ default: [subject]
72
+ }
73
+ });
74
+ }
75
+ for (const deletion of deletionDeletions) {
76
+ updates.push({
77
+ updateType: 'insertdelete',
78
+ delete: [deletion],
79
+ insert: [],
80
+ where: [
81
+ ...deletion.triples.map((triple) => (0, SparqlUtil_1.createSparqlOptional)([(0, SparqlUtil_1.createSparqlBasicGraphPattern)([triple])]))
82
+ ],
83
+ using: {
84
+ default: [deletion.name]
85
+ }
86
+ });
87
+ }
88
+ if (insertionTriples.length > 0) {
89
+ updates.push({
90
+ updateType: 'insert',
91
+ insert: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, insertionTriples), ...insertionInsertions]
92
+ });
93
+ }
94
+ if (deleteOnlyTriples.length > 0) {
95
+ updates.push({
96
+ updateType: 'insertdelete',
97
+ delete: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, deleteOnlyTriples)],
98
+ insert: [],
99
+ where: deleteOnlyTriples.map((triple) => (0, SparqlUtil_1.createSparqlOptional)([(0, SparqlUtil_1.createSparqlBasicGraphPattern)([triple])])),
100
+ using: {
101
+ default: [subject]
102
+ }
103
+ });
104
+ }
105
+ const hasAnyChanges = deletionTriples.length > 0 || insertionTriples.length > 0 || deleteOnlyTriples.length > 0;
106
+ if (this.setTimestamps && hasAnyChanges) {
107
+ const modifiedVariable = data_model_1.default.variable(this.variableGenerator.getNext());
108
+ const modifiedDeletionTriple = { subject, predicate: SparqlUtil_1.modified, object: modifiedVariable };
109
+ const modifiedInsertionTriple = { subject, predicate: SparqlUtil_1.modified, object: SparqlUtil_1.now };
110
+ updates.push({
111
+ updateType: 'insertdelete',
112
+ delete: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, [modifiedDeletionTriple])],
113
+ insert: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, [modifiedInsertionTriple])],
114
+ where: [(0, SparqlUtil_1.createSparqlOptional)([(0, SparqlUtil_1.createSparqlBasicGraphPattern)([modifiedDeletionTriple])]), SparqlUtil_1.bindNow],
115
+ using: {
116
+ default: [subject]
117
+ }
118
+ });
119
+ }
120
+ return updates;
121
+ });
122
+ }
123
+ partitionAttributes(attributes) {
124
+ const attributesToUpdate = {};
125
+ const attributesToDelete = {};
126
+ Object.entries(attributes).forEach(([key, value]) => {
127
+ if (key === '@id') {
128
+ return;
129
+ }
130
+ if (value === null) {
131
+ attributesToDelete[key] = value;
132
+ }
133
+ else if (value !== undefined) {
134
+ attributesToUpdate[key] = value;
135
+ }
136
+ });
137
+ return { attributesToUpdate, attributesToDelete };
138
+ }
139
+ createBlankNodeCleanupUpdates(subject, attributesToUpdate) {
140
+ const updateKeysToCleanup = Object.entries(attributesToUpdate)
141
+ .filter(([, value]) => this.shouldCleanupBlankNodeSubgraphForValue(value))
142
+ .map(([key]) => key);
143
+ return updateKeysToCleanup.map((predicate) => this.createBlankNodeCleanupUpdate(subject, predicate));
144
+ }
145
+ shouldCleanupBlankNodeSubgraphForValue(value) {
146
+ return (0, Util_1.ensureArray)(value).some((valueItem) => {
147
+ if (!valueItem || typeof valueItem !== 'object') {
148
+ return false;
149
+ }
150
+ const nodeObject = valueItem;
151
+ if ('@value' in nodeObject) {
152
+ return false;
153
+ }
154
+ if ('@id' in nodeObject && typeof nodeObject['@id'] === 'string') {
155
+ return nodeObject['@id'].startsWith('_:');
156
+ }
157
+ return true;
158
+ });
159
+ }
160
+ createBlankNodeCleanupUpdate(subject, predicate) {
161
+ const existingObjectVariable = data_model_1.default.variable(this.variableGenerator.getNext());
162
+ const existingBlankNodeVariable = data_model_1.default.variable(this.variableGenerator.getNext());
163
+ const existingBlankPredicateVariable = data_model_1.default.variable(this.variableGenerator.getNext());
164
+ const existingBlankObjectVariable = data_model_1.default.variable(this.variableGenerator.getNext());
165
+ const existingIncomingSubjectVariable = data_model_1.default.variable(this.variableGenerator.getNext());
166
+ const existingIncomingPredicateVariable = data_model_1.default.variable(this.variableGenerator.getNext());
167
+ const predicateTerm = predicate === '@type' ? SparqlUtil_1.rdfTypeNamedNode : data_model_1.default.namedNode(predicate);
168
+ // Traverse any outgoing predicate path from the old predicate value to clean nested blank-node trees.
169
+ const anyPredicatePath = {
170
+ type: 'path',
171
+ pathType: '!',
172
+ items: [data_model_1.default.namedNode('urn:skl-js-engine:blank-node-cleanup')]
173
+ };
174
+ const anyPredicatePathZeroOrMore = (0, SparqlUtil_1.createSparqlZeroOrMorePredicate)([anyPredicatePath]);
175
+ const oldRootTriple = { subject, predicate: predicateTerm, object: existingObjectVariable };
176
+ const blankOutgoingTriple = {
177
+ subject: existingBlankNodeVariable,
178
+ predicate: existingBlankPredicateVariable,
179
+ object: existingBlankObjectVariable
180
+ };
181
+ const incomingToBlankTriple = {
182
+ subject: existingIncomingSubjectVariable,
183
+ predicate: existingIncomingPredicateVariable,
184
+ object: existingBlankNodeVariable
185
+ };
186
+ const existingBlankPathTriple = {
187
+ subject: existingObjectVariable,
188
+ predicate: anyPredicatePathZeroOrMore,
189
+ object: existingBlankNodeVariable
190
+ };
191
+ const blankNodeFilters = [
192
+ (0, SparqlUtil_1.createSparqlFilterWithExpression)({
193
+ type: 'operation',
194
+ operator: 'isblank',
195
+ args: [existingObjectVariable]
196
+ }),
197
+ (0, SparqlUtil_1.createSparqlFilterWithExpression)({
198
+ type: 'operation',
199
+ operator: 'isblank',
200
+ args: [existingBlankNodeVariable]
201
+ })
202
+ ];
203
+ return {
204
+ updateType: 'insertdelete',
205
+ delete: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, [blankOutgoingTriple, incomingToBlankTriple])],
206
+ insert: [],
207
+ where: [
208
+ (0, SparqlUtil_1.createSparqlOptional)([
209
+ (0, SparqlUtil_1.createSparqlBasicGraphPattern)([
210
+ oldRootTriple,
211
+ existingBlankPathTriple,
212
+ blankOutgoingTriple
213
+ ]),
214
+ ...blankNodeFilters
215
+ ]),
216
+ (0, SparqlUtil_1.createSparqlOptional)([
217
+ (0, SparqlUtil_1.createSparqlBasicGraphPattern)([
218
+ oldRootTriple,
219
+ existingBlankPathTriple,
220
+ incomingToBlankTriple
221
+ ]),
222
+ ...blankNodeFilters
223
+ ])
224
+ ],
225
+ using: {
226
+ default: [subject]
227
+ }
228
+ };
229
+ }
230
+ entitiesToGraphDeletionsAndInsertions(entities) {
231
+ return entities.reduce((obj, entity) => {
232
+ const entityGraphName = data_model_1.default.namedNode(entity['@id']);
233
+ const { entityTriples, timestampTriples, insertions } = this.entityToTriples(entity, entityGraphName);
234
+ obj.clear.push((0, SparqlUtil_1.createSparqlClearUpdate)(entityGraphName));
235
+ obj.insertions.push((0, SparqlUtil_1.createSparqlGraphQuads)(entityGraphName, entityTriples), ...insertions);
236
+ if (timestampTriples.length > 0) {
237
+ obj.timestampInsertions.push((0, SparqlUtil_1.createSparqlGraphQuads)(entityGraphName, timestampTriples));
238
+ }
239
+ return obj;
240
+ }, { clear: [], insertions: [], timestampInsertions: [] });
241
+ }
242
+ idsToGraphDropUpdates(ids) {
243
+ return ids.map((id) => {
244
+ const entityGraphName = data_model_1.default.namedNode(id);
245
+ return (0, SparqlUtil_1.createSparqlDropUpdate)(entityGraphName);
246
+ });
247
+ }
248
+ entitiesToGraphDropUpdates(entities) {
249
+ return entities.map((entity) => {
250
+ const entityGraphName = data_model_1.default.namedNode(entity['@id']);
251
+ return (0, SparqlUtil_1.createSparqlDropUpdate)(entityGraphName);
252
+ });
253
+ }
254
+ partialEntityToDeletionTriples(entity, subject) {
255
+ return Object.entries(entity).reduce((acc, [key, value]) => {
256
+ if (key !== '@id') {
257
+ let deletions = [];
258
+ if (value && typeof value === 'object' && '@id' in value && typeof value['@id'] === 'string' && '@type' in value) {
259
+ const { triples: nestedTriples, deletions: nestedDeletions } = this.partialEntityToDeletionTriples(value, data_model_1.default.namedNode(value['@id']));
260
+ deletions = [...deletions, (0, SparqlUtil_1.createSparqlGraphQuads)(data_model_1.default.namedNode(value['@id']), nestedTriples), ...nestedDeletions];
261
+ }
262
+ return {
263
+ triples: [
264
+ ...acc.triples,
265
+ this.buildTriplesWithSubjectPredicateAndVariableValue(subject, key === '@type' ? SparqlUtil_1.rdfTypeNamedNode : data_model_1.default.namedNode(key), this.variableGenerator.getNext())
266
+ ],
267
+ deletions: [...acc.deletions, ...deletions]
268
+ };
269
+ }
270
+ return acc;
271
+ }, { triples: [], deletions: [] });
272
+ }
273
+ partialEntityToTriples(subject, entity) {
274
+ return Object.entries(entity).reduce((acc, [key, value]) => {
275
+ const values = (0, Util_1.ensureArray)(value);
276
+ if (key !== '@id') {
277
+ let predicateTriples;
278
+ if (key === '@type') {
279
+ predicateTriples = { triples: this.buildTriplesWithSubjectPredicateAndIriValue(subject, SparqlUtil_1.rdfTypeNamedNode, values), insertions: [] };
280
+ }
281
+ else {
282
+ predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);
283
+ }
284
+ return { triples: [...acc.triples, ...predicateTriples.triples], insertions: [...acc.insertions, ...predicateTriples.insertions] };
285
+ }
286
+ return acc;
287
+ }, { triples: [], insertions: [] });
288
+ }
289
+ entityToTriples(entity, subject) {
290
+ const entityTriples = Object.entries(entity).reduce((acc, [key, value]) => {
291
+ const values = (0, Util_1.ensureArray)(value);
292
+ if (key !== '@id') {
293
+ if (key === '@type') {
294
+ const predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(subject, SparqlUtil_1.rdfTypeNamedNode, values);
295
+ return { triples: [...acc.triples, ...predicateTriples], insertions: acc.insertions };
296
+ }
297
+ if (!(this.setTimestamps && key === constants_1.EngineConstants.prop.dateModified)) {
298
+ const predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);
299
+ return { triples: [...acc.triples, ...predicateTriples.triples], insertions: [...acc.insertions, ...predicateTriples.insertions] };
300
+ }
301
+ }
302
+ return acc;
303
+ }, { triples: [], insertions: [] });
304
+ const timestampTriples = [];
305
+ if (this.setTimestamps && subject.termType === 'NamedNode') {
306
+ if (!(constants_1.EngineConstants.prop.dateCreated in entity)) {
307
+ timestampTriples.push({ subject, predicate: SparqlUtil_1.created, object: SparqlUtil_1.now });
308
+ }
309
+ timestampTriples.push({ subject, predicate: SparqlUtil_1.modified, object: SparqlUtil_1.now });
310
+ }
311
+ return {
312
+ entityTriples: entityTriples.triples,
313
+ insertions: entityTriples.insertions,
314
+ timestampTriples
315
+ };
316
+ }
317
+ buildTriplesForSubjectPredicateAndValues(subject, predicate, values) {
318
+ const predicateTerm = data_model_1.default.namedNode(predicate);
319
+ // Return values.flatMap((value: any): { triples: Triple[]; insertions: GraphQuads[] } =>
320
+ // this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value));
321
+ return values.reduce((acc, value) => {
322
+ const { triples, insertions } = this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value);
323
+ return { triples: [...acc.triples, ...triples], insertions: [...acc.insertions, ...insertions] };
324
+ }, { triples: [], insertions: [] });
325
+ }
326
+ buildTriplesWithSubjectPredicateAndIriValue(subject, predicate, values) {
327
+ return values.map((valueItem) => ({
328
+ subject,
329
+ predicate,
330
+ object: data_model_1.default.namedNode(valueItem)
331
+ }));
332
+ }
333
+ buildTriplesWithSubjectPredicateAndVariableValue(subject, predicate, value) {
334
+ return {
335
+ subject,
336
+ predicate,
337
+ object: data_model_1.default.variable(value)
338
+ };
339
+ }
340
+ buildTriplesWithSubjectPredicateAndValue(subject, predicate, value) {
341
+ const isObject = typeof value === 'object';
342
+ if (isObject) {
343
+ if ('@list' in value) {
344
+ return { triples: this.buildTriplesForList(subject, predicate, value['@list']), insertions: [] };
345
+ }
346
+ if ('@value' in value) {
347
+ return { triples: [{ subject, predicate, object: this.jsonLdValueObjectToLiteral(value) }], insertions: [] };
348
+ }
349
+ const isReferenceObject = '@id' in value;
350
+ const isBlankNodeReferenceObject = !isReferenceObject || value['@id'].startsWith('_:');
351
+ if (isBlankNodeReferenceObject) {
352
+ return { triples: this.buildTriplesForBlankNode(subject, predicate, value), insertions: [] };
353
+ }
354
+ if (isReferenceObject) {
355
+ const triples = [
356
+ { subject, predicate, object: data_model_1.default.namedNode(value['@id']) }
357
+ ];
358
+ if (value['@type']) {
359
+ const { entityTriples, insertions } = this.entityToTriples(value, data_model_1.default.namedNode(value['@id']));
360
+ return { triples, insertions: [...insertions, (0, SparqlUtil_1.createSparqlGraphQuads)(data_model_1.default.namedNode(value['@id']), entityTriples)] };
361
+ }
362
+ return { triples, insertions: [] };
363
+ }
364
+ }
365
+ return { triples: [{ subject, predicate, object: (0, TripleUtil_1.valueToLiteral)(value) }], insertions: [] };
366
+ }
367
+ jsonLdValueObjectToLiteral(value) {
368
+ if (typeof value['@value'] === 'object') {
369
+ return data_model_1.default.literal(JSON.stringify(value['@value']), rmlmapper_js_1.RDF.JSON);
370
+ }
371
+ if (value['@language']) {
372
+ return data_model_1.default.literal(value['@value'], value['@language']);
373
+ }
374
+ if (value['@type']) {
375
+ return data_model_1.default.literal(value['@value'].toString(), value['@type']);
376
+ }
377
+ return (0, TripleUtil_1.valueToLiteral)(value['@value']);
378
+ }
379
+ buildTriplesForList(subject, predicate, value) {
380
+ const blankNode = data_model_1.default.blankNode(this.variableGenerator.getNext());
381
+ const rest = value.length > 1
382
+ ? this.buildTriplesForList(blankNode, SparqlUtil_1.restPredicate, value.slice(1))
383
+ : [{ subject: blankNode, predicate: SparqlUtil_1.restPredicate, object: SparqlUtil_1.nilPredicate }];
384
+ return [
385
+ { subject, predicate, object: blankNode },
386
+ ...this.buildTriplesWithSubjectPredicateAndValue(blankNode, SparqlUtil_1.firstPredicate, value[0]).triples,
387
+ ...rest
388
+ ];
389
+ }
390
+ buildTriplesForBlankNode(subject, predicate, value) {
391
+ const blankNode = data_model_1.default.blankNode(this.variableGenerator.getNext());
392
+ const { entityTriples } = this.entityToTriples(value, blankNode);
393
+ return [{ subject, predicate, object: blankNode }, ...entityTriples];
394
+ }
395
+ }
396
+ exports.SparqlUpdateBuilder = SparqlUpdateBuilder;
397
+ //# sourceMappingURL=SparqlUpdateBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SparqlUpdateBuilder.js","sourceRoot":"","sources":["../../../../src/storage/query-adapter/sparql/SparqlUpdateBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import { RDF } from '@comake/rmlmapper-js';\nimport DataFactory from '@rdfjs/data-model';\nimport type { BlankNode, NamedNode, Term } from '@rdfjs/types';\nimport type { NodeObject, ValueObject } from 'jsonld/jsonld';\nimport type {\n Update,\n GraphQuads,\n Triple,\n InsertDeleteOperation,\n UpdateOperation,\n ClearDropOperation,\n Pattern,\n PropertyPath\n} from 'sparqljs';\nimport { EngineConstants } from '../../../constants';\nimport {\n bindNow,\n created,\n createSparqlBasicGraphPattern,\n createSparqlClearUpdate,\n createSparqlFilterWithExpression,\n createSparqlDropUpdate,\n createSparqlGraphQuads,\n createSparqlOptional,\n createSparqlUpdate,\n createSparqlZeroOrMorePredicate,\n dropAll,\n firstPredicate,\n modified,\n nilPredicate,\n now,\n rdfTypeNamedNode,\n restPredicate\n} from '../../../util/SparqlUtil';\nimport { valueToLiteral } from '../../../util/TripleUtil';\nimport type { Entity } from '../../../util/Types';\nimport { ensureArray } from '../../../util/Util';\nimport { VariableGenerator } from './VariableGenerator';\n\nexport interface EntityUpdateQueries {\n clear: ClearDropOperation[];\n insertions: GraphQuads[];\n timestampInsertions: GraphQuads[];\n}\n\nexport interface EntityUpdateTriples {\n entityTriples: Triple[];\n timestampTriples: Triple[];\n insertions: GraphQuads[];\n}\n\nexport interface SparqlUpdateBuilderArgs {\n setTimestamps?: boolean;\n}\n\nexport class SparqlUpdateBuilder {\n private readonly variableGenerator: VariableGenerator;\n private readonly setTimestamps: boolean;\n\n public constructor(args?: SparqlUpdateBuilderArgs) {\n this.variableGenerator = new VariableGenerator();\n this.setTimestamps = args?.setTimestamps ?? false;\n }\n\n public buildPartialUpdate(idOrIds: string | string[], attributes: Partial<Entity>): Update {\n const ids = ensureArray(idOrIds);\n const updates = this.idsAndAttributesToGraphDeletionsAndInsertions(ids, attributes);\n return createSparqlUpdate(updates);\n }\n\n public buildUpdate(entityOrEntities: Entity | Entity[]): Update {\n const entities = ensureArray(entityOrEntities);\n const { clear, insertions, timestampInsertions } = this.entitiesToGraphDeletionsAndInsertions(entities);\n const insertUpdate: InsertDeleteOperation = {\n updateType: 'insert',\n insert: insertions\n };\n const updates = [ ...clear, insertUpdate ];\n if (timestampInsertions.length > 0) {\n updates.push({\n updateType: 'insertdelete',\n delete: [],\n insert: timestampInsertions,\n where: [ bindNow ]\n });\n }\n return createSparqlUpdate(updates);\n }\n\n public buildDeleteById(idOrIds: string | string[]): Update {\n const ids = ensureArray(idOrIds);\n const drops = this.idsToGraphDropUpdates(ids);\n return createSparqlUpdate(drops);\n }\n\n public buildDelete(entityOrEntities: Entity | Entity[]): Update {\n const entities = ensureArray(entityOrEntities);\n const drops = this.entitiesToGraphDropUpdates(entities);\n return createSparqlUpdate(drops);\n }\n\n public buildDeleteAll(): Update {\n return createSparqlUpdate([ dropAll ]);\n }\n\n private idsAndAttributesToGraphDeletionsAndInsertions(\n ids: string[],\n attributes: Partial<Entity>\n ): InsertDeleteOperation[] {\n return ids.flatMap((id): InsertDeleteOperation[] => {\n const subject = DataFactory.namedNode(id);\n const { attributesToUpdate, attributesToDelete } = this.partitionAttributes(attributes);\n const { triples: deletionTriples, deletions: deletionDeletions } = this.partialEntityToDeletionTriples(attributesToUpdate, subject);\n const { triples: insertionTriples, insertions: insertionInsertions } = this.partialEntityToTriples(subject, attributesToUpdate);\n const { triples: deleteOnlyTriples } = this.partialEntityToDeletionTriples(attributesToDelete, subject);\n\n const updates: InsertDeleteOperation[] = [];\n updates.push(...this.createBlankNodeCleanupUpdates(subject, attributesToUpdate));\n\n if (deletionTriples.length > 0) {\n updates.push({\n updateType: 'insertdelete',\n delete: [ createSparqlGraphQuads(subject, deletionTriples) ],\n insert: [],\n where: deletionTriples.map(\n (triple): Pattern => createSparqlOptional([ createSparqlBasicGraphPattern([ triple ]) ])\n ),\n using: {\n default: [ subject ]\n }\n } as InsertDeleteOperation);\n }\n\n for (const deletion of deletionDeletions) {\n updates.push({\n updateType: 'insertdelete',\n delete: [ deletion ],\n insert: [],\n where: [\n ...deletion.triples.map(\n (triple): Pattern => createSparqlOptional([ createSparqlBasicGraphPattern([ triple ]) ])\n )\n ],\n using: {\n default: [ deletion.name ]\n }\n } as InsertDeleteOperation);\n }\n\n if (insertionTriples.length > 0) {\n updates.push({\n updateType: 'insert',\n insert: [ createSparqlGraphQuads(subject, insertionTriples), ...insertionInsertions ]\n } as InsertDeleteOperation);\n }\n\n if (deleteOnlyTriples.length > 0) {\n updates.push({\n updateType: 'insertdelete',\n delete: [ createSparqlGraphQuads(subject, deleteOnlyTriples) ],\n insert: [],\n where: deleteOnlyTriples.map(\n (triple): Pattern => createSparqlOptional([ createSparqlBasicGraphPattern([ triple ]) ])\n ),\n using: {\n default: [ subject ]\n }\n } as InsertDeleteOperation);\n }\n\n const hasAnyChanges = deletionTriples.length > 0 || insertionTriples.length > 0 || deleteOnlyTriples.length > 0;\n\n if (this.setTimestamps && hasAnyChanges) {\n const modifiedVariable = DataFactory.variable(this.variableGenerator.getNext());\n const modifiedDeletionTriple = { subject, predicate: modified, object: modifiedVariable };\n const modifiedInsertionTriple = { subject, predicate: modified, object: now };\n updates.push({\n updateType: 'insertdelete',\n delete: [ createSparqlGraphQuads(subject, [ modifiedDeletionTriple ]) ],\n insert: [ createSparqlGraphQuads(subject, [ modifiedInsertionTriple ]) ],\n where: [ createSparqlOptional([ createSparqlBasicGraphPattern([ modifiedDeletionTriple ]) ]), bindNow ],\n using: {\n default: [ subject ]\n }\n } as InsertDeleteOperation);\n }\n\n return updates;\n });\n }\n\n private partitionAttributes(\n attributes: Partial<Entity>\n ): { attributesToUpdate: Partial<Entity>; attributesToDelete: Partial<Entity> } {\n const attributesToUpdate: Partial<Entity> = {};\n const attributesToDelete: Partial<Entity> = {};\n\n Object.entries(attributes).forEach(([ key, value ]) => {\n if (key === '@id') {\n return;\n }\n if (value === null) {\n attributesToDelete[key] = value;\n } else if (value !== undefined) {\n attributesToUpdate[key] = value;\n }\n });\n\n return { attributesToUpdate, attributesToDelete };\n }\n\n private createBlankNodeCleanupUpdates(\n subject: NamedNode,\n attributesToUpdate: Partial<Entity>\n ): InsertDeleteOperation[] {\n const updateKeysToCleanup = Object.entries(attributesToUpdate)\n .filter(([, value ]): boolean => this.shouldCleanupBlankNodeSubgraphForValue(value))\n .map(([ key ]): string => key);\n return updateKeysToCleanup.map(\n (predicate): InsertDeleteOperation => this.createBlankNodeCleanupUpdate(subject, predicate)\n );\n }\n\n private shouldCleanupBlankNodeSubgraphForValue(value: unknown): boolean {\n return ensureArray(value).some((valueItem: unknown): boolean => {\n if (!valueItem || typeof valueItem !== 'object') {\n return false;\n }\n const nodeObject = valueItem as Record<string, unknown>;\n if ('@value' in nodeObject) {\n return false;\n }\n if ('@id' in nodeObject && typeof nodeObject['@id'] === 'string') {\n return nodeObject['@id'].startsWith('_:');\n }\n return true;\n });\n }\n\n private createBlankNodeCleanupUpdate(subject: NamedNode, predicate: string): InsertDeleteOperation {\n const existingObjectVariable = DataFactory.variable(this.variableGenerator.getNext());\n const existingBlankNodeVariable = DataFactory.variable(this.variableGenerator.getNext());\n const existingBlankPredicateVariable = DataFactory.variable(this.variableGenerator.getNext());\n const existingBlankObjectVariable = DataFactory.variable(this.variableGenerator.getNext());\n const existingIncomingSubjectVariable = DataFactory.variable(this.variableGenerator.getNext());\n const existingIncomingPredicateVariable = DataFactory.variable(this.variableGenerator.getNext());\n const predicateTerm = predicate === '@type' ? rdfTypeNamedNode : DataFactory.namedNode(predicate);\n\n // Traverse any outgoing predicate path from the old predicate value to clean nested blank-node trees.\n const anyPredicatePath = {\n type: 'path',\n pathType: '!',\n items: [ DataFactory.namedNode('urn:skl-js-engine:blank-node-cleanup') ]\n } as PropertyPath;\n const anyPredicatePathZeroOrMore = createSparqlZeroOrMorePredicate([ anyPredicatePath ]);\n const oldRootTriple = { subject, predicate: predicateTerm, object: existingObjectVariable } as Triple;\n const blankOutgoingTriple = {\n subject: existingBlankNodeVariable,\n predicate: existingBlankPredicateVariable,\n object: existingBlankObjectVariable\n } as Triple;\n const incomingToBlankTriple = {\n subject: existingIncomingSubjectVariable,\n predicate: existingIncomingPredicateVariable,\n object: existingBlankNodeVariable\n } as Triple;\n const existingBlankPathTriple = {\n subject: existingObjectVariable,\n predicate: anyPredicatePathZeroOrMore,\n object: existingBlankNodeVariable\n } as Triple;\n const blankNodeFilters = [\n createSparqlFilterWithExpression({\n type: 'operation',\n operator: 'isblank',\n args: [ existingObjectVariable ]\n }),\n createSparqlFilterWithExpression({\n type: 'operation',\n operator: 'isblank',\n args: [ existingBlankNodeVariable ]\n })\n ];\n\n return {\n updateType: 'insertdelete',\n delete: [ createSparqlGraphQuads(subject, [ blankOutgoingTriple, incomingToBlankTriple ]) ],\n insert: [],\n where: [\n createSparqlOptional([\n createSparqlBasicGraphPattern([\n oldRootTriple,\n existingBlankPathTriple,\n blankOutgoingTriple\n ]),\n ...blankNodeFilters\n ]),\n createSparqlOptional([\n createSparqlBasicGraphPattern([\n oldRootTriple,\n existingBlankPathTriple,\n incomingToBlankTriple\n ]),\n ...blankNodeFilters\n ])\n ],\n using: {\n default: [ subject ]\n }\n } as InsertDeleteOperation;\n }\n\n private entitiesToGraphDeletionsAndInsertions(entities: Entity[]): EntityUpdateQueries {\n return entities.reduce(\n (obj: EntityUpdateQueries, entity): EntityUpdateQueries => {\n const entityGraphName = DataFactory.namedNode(entity['@id']);\n const { entityTriples, timestampTriples, insertions } = this.entityToTriples(entity, entityGraphName);\n obj.clear.push(createSparqlClearUpdate(entityGraphName));\n obj.insertions.push(createSparqlGraphQuads(entityGraphName, entityTriples), ...insertions);\n if (timestampTriples.length > 0) {\n obj.timestampInsertions.push(createSparqlGraphQuads(entityGraphName, timestampTriples));\n }\n return obj;\n },\n { clear: [], insertions: [], timestampInsertions: []}\n );\n }\n\n private idsToGraphDropUpdates(ids: string[]): UpdateOperation[] {\n return ids.map((id): UpdateOperation => {\n const entityGraphName = DataFactory.namedNode(id);\n return createSparqlDropUpdate(entityGraphName);\n });\n }\n\n private entitiesToGraphDropUpdates(entities: Entity[]): UpdateOperation[] {\n return entities.map((entity): UpdateOperation => {\n const entityGraphName = DataFactory.namedNode(entity['@id']);\n return createSparqlDropUpdate(entityGraphName);\n });\n }\n\n private partialEntityToDeletionTriples(entity: NodeObject, subject: NamedNode): { triples: Triple[]; deletions: GraphQuads[] } {\n return Object.entries(entity).reduce((acc: { triples: Triple[]; deletions: GraphQuads[] }, [ key, value ]): { triples: Triple[]; deletions: GraphQuads[] } => {\n if (key !== '@id') {\n let deletions: GraphQuads[] = [];\n if (value && typeof value === 'object' && '@id' in value && typeof value['@id'] === 'string' && '@type' in value) {\n const { triples: nestedTriples, deletions: nestedDeletions } = this.partialEntityToDeletionTriples(value as NodeObject, DataFactory.namedNode(value['@id']));\n deletions = [ ...deletions, createSparqlGraphQuads(DataFactory.namedNode(value['@id']), nestedTriples), ...nestedDeletions ];\n }\n return {\n triples: [\n ...acc.triples,\n this.buildTriplesWithSubjectPredicateAndVariableValue(\n subject,\n key === '@type' ? rdfTypeNamedNode : DataFactory.namedNode(key),\n this.variableGenerator.getNext()\n )\n ],\n deletions: [ ...acc.deletions, ...deletions ]\n };\n }\n return acc;\n }, { triples: [], deletions: [] });\n }\n\n private partialEntityToTriples(subject: NamedNode, entity: NodeObject): { triples: Triple[]; insertions: GraphQuads[] } {\n return Object.entries(entity).reduce((acc: { triples: Triple[]; insertions: GraphQuads[] }, [ key, value ]): { triples: Triple[]; insertions: GraphQuads[] } => {\n const values = ensureArray(value);\n if (key !== '@id') {\n let predicateTriples: { triples: Triple[]; insertions: GraphQuads[] };\n if (key === '@type') {\n predicateTriples = { triples: this.buildTriplesWithSubjectPredicateAndIriValue(\n subject,\n rdfTypeNamedNode,\n values as string[]\n ), insertions: [] };\n } else {\n predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);\n }\n return { triples: [ ...acc.triples, ...predicateTriples.triples ], insertions: [ ...acc.insertions, ...predicateTriples.insertions ] };\n }\n return acc;\n }, { triples: [], insertions: [] });\n }\n\n private entityToTriples(entity: NodeObject, subject: BlankNode | NamedNode): EntityUpdateTriples {\n const entityTriples = Object.entries(entity).reduce((acc: { triples: Triple[]; insertions: GraphQuads[] }, [ key, value ]): { triples: Triple[]; insertions: GraphQuads[] } => {\n const values = ensureArray(value);\n if (key !== '@id') {\n if (key === '@type') {\n const predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(\n subject,\n rdfTypeNamedNode,\n values as string[]\n );\n return { triples: [ ...acc.triples, ...predicateTriples ], insertions: acc.insertions };\n }\n if (!(this.setTimestamps && key === EngineConstants.prop.dateModified)) {\n const predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);\n return { triples: [ ...acc.triples, ...predicateTriples.triples ], insertions: [ ...acc.insertions, ...predicateTriples.insertions ] };\n }\n }\n return acc;\n }, { triples: [], insertions: [] });\n\n const timestampTriples = [];\n if (this.setTimestamps && subject.termType === 'NamedNode') {\n if (!(EngineConstants.prop.dateCreated in entity)) {\n timestampTriples.push({ subject, predicate: created, object: now });\n }\n timestampTriples.push({ subject, predicate: modified, object: now });\n }\n return {\n entityTriples: entityTriples.triples,\n insertions: entityTriples.insertions,\n timestampTriples\n };\n }\n\n private buildTriplesForSubjectPredicateAndValues(\n subject: BlankNode | NamedNode,\n predicate: string,\n values: any[]\n ): { triples: Triple[]; insertions: GraphQuads[] } {\n const predicateTerm = DataFactory.namedNode(predicate);\n // Return values.flatMap((value: any): { triples: Triple[]; insertions: GraphQuads[] } =>\n // this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value));\n return values.reduce((acc: { triples: Triple[]; insertions: GraphQuads[] }, value: any) => {\n const { triples, insertions } = this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value);\n return { triples: [ ...acc.triples, ...triples ], insertions: [ ...acc.insertions, ...insertions ] };\n }, { triples: [], insertions: [] });\n }\n\n private buildTriplesWithSubjectPredicateAndIriValue(\n subject: BlankNode | NamedNode,\n predicate: NamedNode,\n values: string[]\n ): Triple[] {\n return values.map(\n (valueItem): Triple =>\n ({\n subject,\n predicate,\n object: DataFactory.namedNode(valueItem)\n } as Triple)\n );\n }\n\n private buildTriplesWithSubjectPredicateAndVariableValue(\n subject: NamedNode,\n predicate: NamedNode,\n value: string\n ): Triple {\n return {\n subject,\n predicate,\n object: DataFactory.variable(value)\n };\n }\n\n private buildTriplesWithSubjectPredicateAndValue(\n subject: BlankNode | NamedNode,\n predicate: NamedNode,\n value: any\n ): { triples: Triple[]; insertions: GraphQuads[] } {\n const isObject = typeof value === 'object';\n if (isObject) {\n if ('@list' in value) {\n return { triples: this.buildTriplesForList(subject, predicate, value['@list']), insertions: [] };\n }\n if ('@value' in value) {\n return { triples: [ { subject, predicate, object: this.jsonLdValueObjectToLiteral(value) } as Triple ], insertions: [] };\n }\n\n const isReferenceObject = '@id' in value;\n const isBlankNodeReferenceObject = !isReferenceObject || (value['@id'] as string).startsWith('_:');\n if (isBlankNodeReferenceObject) {\n return { triples: this.buildTriplesForBlankNode(subject, predicate, value as NodeObject), insertions: [] };\n }\n if (isReferenceObject) {\n const triples = [ \n { subject, predicate, object: DataFactory.namedNode(value['@id']) } as Triple\n ];\n if (value['@type']) {\n const { entityTriples, insertions } = this.entityToTriples(value as NodeObject, DataFactory.namedNode(value['@id']));\n return { triples, insertions: [ ...insertions, createSparqlGraphQuads(DataFactory.namedNode(value['@id']), entityTriples) ] };\n }\n return { triples, insertions: [] };\n }\n }\n return { triples: [ { subject, predicate, object: valueToLiteral(value) } as Triple ], insertions: [] };\n }\n\n private jsonLdValueObjectToLiteral(value: ValueObject): Term {\n if (typeof value['@value'] === 'object') {\n return DataFactory.literal(JSON.stringify(value['@value']), RDF.JSON);\n }\n if ((value as any)['@language']) {\n return DataFactory.literal(value['@value'] as string, (value as any)['@language']);\n }\n if ((value as any)['@type']) {\n return DataFactory.literal(value['@value'].toString(), (value as any)['@type']);\n }\n return valueToLiteral(value['@value']);\n }\n\n private buildTriplesForList(subject: BlankNode | NamedNode, predicate: NamedNode, value: NodeObject[]): Triple[] {\n const blankNode = DataFactory.blankNode(this.variableGenerator.getNext());\n const rest =\n value.length > 1\n ? this.buildTriplesForList(blankNode, restPredicate, value.slice(1))\n : [{ subject: blankNode, predicate: restPredicate, object: nilPredicate }];\n return [\n { subject, predicate, object: blankNode },\n ...this.buildTriplesWithSubjectPredicateAndValue(blankNode, firstPredicate, value[0]).triples,\n ...rest\n ];\n }\n\n private buildTriplesForBlankNode(subject: BlankNode | NamedNode, predicate: NamedNode, value: NodeObject): Triple[] {\n const blankNode = DataFactory.blankNode(this.variableGenerator.getNext());\n const { entityTriples } = this.entityToTriples(value, blankNode);\n return [{ subject, predicate, object: blankNode }, ...entityTriples ];\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export declare class VariableGenerator {
2
+ private currentVariable;
3
+ getNext(): string;
4
+ }
5
+ //# sourceMappingURL=VariableGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VariableGenerator.d.ts","sourceRoot":"","sources":["../../../../src/storage/query-adapter/sparql/VariableGenerator.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,eAAe,CAAK;IAErB,OAAO,IAAI,MAAM;CAIzB"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VariableGenerator = void 0;
4
+ class VariableGenerator {
5
+ constructor() {
6
+ this.currentVariable = 0;
7
+ }
8
+ getNext() {
9
+ this.currentVariable += 1;
10
+ return `c${this.currentVariable}`;
11
+ }
12
+ }
13
+ exports.VariableGenerator = VariableGenerator;
14
+ //# sourceMappingURL=VariableGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VariableGenerator.js","sourceRoot":"","sources":["../../../../src/storage/query-adapter/sparql/VariableGenerator.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAiB;IAA9B;QACU,oBAAe,GAAG,CAAC,CAAC;IAM9B,CAAC;IAJQ,OAAO;QACZ,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;QAC1B,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;IACpC,CAAC;CACF;AAPD,8CAOC","sourcesContent":["export class VariableGenerator {\n private currentVariable = 0;\n\n public getNext(): string {\n this.currentVariable += 1;\n return `c${this.currentVariable}`;\n }\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import type { Quad } from '@rdfjs/types';
2
+ import type { Update, AskQuery, SelectQuery, ConstructQuery } from 'sparqljs';
3
+ import type { QueryExecutor, SelectVariableQueryResult } from './SparqlQueryExecutor';
4
+ export declare class InMemorySparqlQueryExecutor implements QueryExecutor {
5
+ private readonly engine;
6
+ private readonly store;
7
+ private readonly sparqlGenerator;
8
+ private readonly queryContext;
9
+ constructor();
10
+ executeSparqlSelectAndGetData<TQuery extends SelectQuery | ConstructQuery, TReturn extends Quad | SelectVariableQueryResult<any> = TQuery extends SelectQuery ? SelectVariableQueryResult<any> : Quad>(query: TQuery): Promise<TReturn[]>;
11
+ executeSparqlSelectAndGetDataRaw(query: string): Promise<SelectVariableQueryResult<any>[]>;
12
+ executeSparqlConstructAndGetDataRaw(query: string): Promise<Quad[]>;
13
+ private getDataFromStream;
14
+ executeSparqlUpdate(query: Update): Promise<void>;
15
+ executeRawSparqlUpdate(query: string): Promise<void>;
16
+ executeAskQueryAndGetResponse(query: AskQuery): Promise<boolean>;
17
+ executeSelectCountAndGetResponse(query: SelectQuery): Promise<number>;
18
+ }
19
+ //# sourceMappingURL=InMemorySparqlQueryExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemorySparqlQueryExecutor.d.ts","sourceRoot":"","sources":["../../../../../src/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAA0C,MAAM,cAAc,CAAC;AAGjF,OAAO,KAAK,EACV,MAAM,EAEN,QAAQ,EACR,WAAW,EACX,cAAc,EACf,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEtF,qBAAa,2BAA4B,YAAW,aAAa;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiD;;IAYjE,6BAA6B,CACxC,MAAM,SAAS,WAAW,GAAG,cAAc,EAC3C,OAAO,SAAS,IAAI,GAAG,yBAAyB,CAAC,GAAG,CAAC,GACrD,MAAM,SAAS,WAAW,GAAG,yBAAyB,CAAC,GAAG,CAAC,GAAG,IAAI,EAElE,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,EAAE,CAAC;IAQR,gCAAgC,CAC3C,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,yBAAyB,CAAC,GAAG,CAAC,EAAE,CAAC;IAa/B,mCAAmC,CAC9C,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,EAAE,CAAC;YAOJ,iBAAiB;IAoBlB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjD,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD,6BAA6B,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAQhE,gCAAgC,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAwBnF"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemorySparqlQueryExecutor = void 0;
4
+ const query_sparql_rdfjs_1 = require("@comunica/query-sparql-rdfjs");
5
+ const n3_1 = require("n3");
6
+ const sparqljs_1 = require("sparqljs");
7
+ class InMemorySparqlQueryExecutor {
8
+ constructor() {
9
+ this.sparqlGenerator = new sparqljs_1.Generator();
10
+ this.store = new n3_1.Store();
11
+ this.engine = new query_sparql_rdfjs_1.QueryEngine();
12
+ this.queryContext = {
13
+ sources: [this.store],
14
+ unionDefaultGraph: true
15
+ };
16
+ }
17
+ async executeSparqlSelectAndGetData(query) {
18
+ const generatedQuery = this.sparqlGenerator.stringify(query);
19
+ if (query.queryType === 'CONSTRUCT') {
20
+ return (await this.executeSparqlConstructAndGetDataRaw(generatedQuery));
21
+ }
22
+ return (await this.executeSparqlSelectAndGetDataRaw(generatedQuery));
23
+ }
24
+ async executeSparqlSelectAndGetDataRaw(query) {
25
+ const stream = await this.engine.queryBindings(query, this.queryContext);
26
+ return this.getDataFromStream(stream, (row, data) => {
27
+ if (row.entries.size > 0) {
28
+ const bindingRow = {};
29
+ for (const [key, value] of row.entries) {
30
+ bindingRow[key] = value;
31
+ }
32
+ data.push(bindingRow);
33
+ }
34
+ });
35
+ }
36
+ async executeSparqlConstructAndGetDataRaw(query) {
37
+ const stream = await this.engine.queryQuads(query, this.queryContext);
38
+ return this.getDataFromStream(stream, (row, data) => {
39
+ data.push(row);
40
+ });
41
+ }
42
+ async getDataFromStream(stream, dataCallback) {
43
+ return new Promise((resolve, reject) => {
44
+ const data = [];
45
+ stream.on('data', (row) => {
46
+ dataCallback(row, data);
47
+ });
48
+ stream.on('end', () => {
49
+ resolve(data);
50
+ });
51
+ stream.on('error', (error) => {
52
+ reject(error);
53
+ });
54
+ });
55
+ }
56
+ async executeSparqlUpdate(query) {
57
+ if ((query?.updates?.length ?? 0) > 0) {
58
+ const generatedQuery = this.sparqlGenerator.stringify(query);
59
+ await this.executeRawSparqlUpdate(generatedQuery);
60
+ }
61
+ }
62
+ async executeRawSparqlUpdate(query) {
63
+ await this.engine.queryVoid(query, this.queryContext);
64
+ }
65
+ async executeAskQueryAndGetResponse(query) {
66
+ const generatedQuery = this.sparqlGenerator.stringify(query);
67
+ return await this.engine.queryBoolean(generatedQuery, this.queryContext);
68
+ }
69
+ async executeSelectCountAndGetResponse(query) {
70
+ const generatedQuery = this.sparqlGenerator.stringify(query);
71
+ const stream = await this.engine.queryBindings(generatedQuery, this.queryContext);
72
+ return new Promise((resolve, reject) => {
73
+ let countValue;
74
+ stream.on('data', (row) => {
75
+ if (row.entries.has('count')) {
76
+ const countLiteral = row.entries.get('count');
77
+ countValue = Number.parseInt(countLiteral.value, 10);
78
+ }
79
+ });
80
+ stream.on('end', () => {
81
+ resolve(countValue);
82
+ });
83
+ stream.on('error', (error) => {
84
+ reject(error);
85
+ });
86
+ });
87
+ }
88
+ }
89
+ exports.InMemorySparqlQueryExecutor = InMemorySparqlQueryExecutor;
90
+ //# sourceMappingURL=InMemorySparqlQueryExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemorySparqlQueryExecutor.js","sourceRoot":"","sources":["../../../../../src/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.ts"],"names":[],"mappings":";;;AAAA,qEAA2D;AAE3D,2BAA2B;AAS3B,uCAAqC;AAGrC,MAAa,2BAA2B;IAMtC;QACE,IAAI,CAAC,eAAe,GAAG,IAAI,oBAAS,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,UAAK,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,gCAAW,EAAE,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG;YAClB,OAAO,EAAE,CAAE,IAAI,CAAC,KAAK,CAAE;YACvB,iBAAiB,EAAE,IAAI;SACxB,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,6BAA6B,CAKxC,KAAa;QAEb,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;YACnC,OAAO,CAAC,MAAM,IAAI,CAAC,mCAAmC,CAAC,cAAc,CAAC,CAAc,CAAC;SACtF;QACD,OAAO,CAAC,MAAM,IAAI,CAAC,gCAAgC,CAAC,cAAc,CAAC,CAAc,CAAC;IACpF,CAAC;IAEM,KAAK,CAAC,gCAAgC,CAC3C,KAAa;QAEb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAQ,EAAE;YACxD,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE;gBACxB,MAAM,UAAU,GAAmC,EAAE,CAAC;gBACtD,KAAK,MAAM,CAAE,GAAG,EAAE,KAAK,CAAE,IAAI,GAAG,CAAC,OAAO,EAAE;oBACxC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;iBACzB;gBACD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aACvB;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,mCAAmC,CAC9C,KAAa;QAEb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAQ,EAAE;YACxD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,MAA2B,EAC3B,YAA2C;QAE3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAQ,EAAE;YAC3C,MAAM,IAAI,GAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAQ,EAAE;gBAC9B,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAS,EAAE;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAQ,EAAE;gBACjC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,KAAa;QAC5C,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE;YACrC,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC7D,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;SACnD;IACH,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAC,KAAa;QAC/C,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CACzB,KAAK,EACL,IAAI,CAAC,YAAY,CAClB,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,6BAA6B,CAAC,KAAe;QACxD,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7D,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CACnC,cAAc,EACd,IAAI,CAAC,YAAY,CAClB,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,gCAAgC,CAAC,KAAkB;QAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAC5C,cAAc,EACd,IAAI,CAAC,YAAY,CAClB,CAAC;QACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAQ,EAAE;YAC3C,IAAI,UAAkB,CAAC;YACvB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAQ,EAAE;gBAC9B,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;oBAC5B,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC9C,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;iBACtD;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAS,EAAE;gBAC1B,OAAO,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAQ,EAAE;gBACjC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAxHD,kEAwHC","sourcesContent":["import { QueryEngine } from '@comunica/query-sparql-rdfjs';\nimport type { Quad, QueryStringContext, QuerySourceContext } from '@rdfjs/types';\nimport { Store } from 'n3';\n\nimport type {\n Update,\n SparqlGenerator,\n AskQuery,\n SelectQuery,\n ConstructQuery\n} from 'sparqljs';\nimport { Generator } from 'sparqljs';\nimport type { QueryExecutor, SelectVariableQueryResult } from './SparqlQueryExecutor';\n\nexport class InMemorySparqlQueryExecutor implements QueryExecutor {\n private readonly engine: QueryEngine;\n private readonly store: Store;\n private readonly sparqlGenerator: SparqlGenerator;\n private readonly queryContext: QueryStringContext & QuerySourceContext<Store>;\n\n public constructor() {\n this.sparqlGenerator = new Generator();\n this.store = new Store();\n this.engine = new QueryEngine();\n this.queryContext = {\n sources: [ this.store ],\n unionDefaultGraph: true\n };\n }\n\n public async executeSparqlSelectAndGetData<\n TQuery extends SelectQuery | ConstructQuery,\n TReturn extends Quad | SelectVariableQueryResult<any> =\n TQuery extends SelectQuery ? SelectVariableQueryResult<any> : Quad\n >(\n query: TQuery\n ): Promise<TReturn[]> {\n const generatedQuery = this.sparqlGenerator.stringify(query);\n if (query.queryType === 'CONSTRUCT') {\n return (await this.executeSparqlConstructAndGetDataRaw(generatedQuery)) as TReturn[];\n }\n return (await this.executeSparqlSelectAndGetDataRaw(generatedQuery)) as TReturn[];\n }\n\n public async executeSparqlSelectAndGetDataRaw(\n query: string\n ): Promise<SelectVariableQueryResult<any>[]> {\n const stream = await this.engine.queryBindings(query, this.queryContext);\n return this.getDataFromStream(stream, (row, data): void => {\n if (row.entries.size > 0) {\n const bindingRow: SelectVariableQueryResult<any> = {};\n for (const [ key, value ] of row.entries) {\n bindingRow[key] = value;\n }\n data.push(bindingRow);\n }\n });\n }\n\n public async executeSparqlConstructAndGetDataRaw(\n query: string\n ): Promise<Quad[]> {\n const stream = await this.engine.queryQuads(query, this.queryContext);\n return this.getDataFromStream(stream, (row, data): void => {\n data.push(row);\n });\n }\n\n private async getDataFromStream<T extends Quad | SelectVariableQueryResult<any> = Quad>(\n stream: NodeJS.EventEmitter,\n dataCallback: (row: any, data: T[]) => void\n ): Promise<T[]> {\n return new Promise((resolve, reject): void => {\n const data: T[] = [];\n stream.on('data', (row): void => {\n dataCallback(row, data);\n });\n\n stream.on('end', (): void => {\n resolve(data);\n });\n\n stream.on('error', (error): void => {\n reject(error);\n });\n });\n }\n\n public async executeSparqlUpdate(query: Update): Promise<void> {\n if ((query?.updates?.length ?? 0) > 0) {\n const generatedQuery = this.sparqlGenerator.stringify(query);\n await this.executeRawSparqlUpdate(generatedQuery);\n }\n }\n\n public async executeRawSparqlUpdate(query: string): Promise<void> {\n await this.engine.queryVoid(\n query,\n this.queryContext\n );\n }\n\n public async executeAskQueryAndGetResponse(query: AskQuery): Promise<boolean> {\n const generatedQuery = this.sparqlGenerator.stringify(query);\n return await this.engine.queryBoolean(\n generatedQuery,\n this.queryContext\n );\n }\n\n public async executeSelectCountAndGetResponse(query: SelectQuery): Promise<number> {\n const generatedQuery = this.sparqlGenerator.stringify(query);\n const stream = await this.engine.queryBindings(\n generatedQuery,\n this.queryContext\n );\n return new Promise((resolve, reject): void => {\n let countValue: number;\n stream.on('data', (row): void => {\n if (row.entries.has('count')) {\n const countLiteral = row.entries.get('count');\n countValue = Number.parseInt(countLiteral.value, 10);\n }\n });\n\n stream.on('end', (): void => {\n resolve(countValue);\n });\n\n stream.on('error', (error): void => {\n reject(error);\n });\n });\n }\n}\n"]}