@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.
- package/dist/JsExecutor/PermissionBuilder.d.ts +14 -0
- package/dist/JsExecutor/PermissionBuilder.d.ts.map +1 -0
- package/dist/JsExecutor/PermissionBuilder.js +58 -0
- package/dist/JsExecutor/PermissionBuilder.js.map +1 -0
- package/dist/JsExecutor/constants.d.ts +27 -0
- package/dist/JsExecutor/constants.d.ts.map +1 -0
- package/dist/JsExecutor/constants.js +30 -0
- package/dist/JsExecutor/constants.js.map +1 -0
- package/dist/JsExecutor/denoUtils.d.ts +10 -0
- package/dist/JsExecutor/denoUtils.d.ts.map +1 -0
- package/dist/JsExecutor/denoUtils.js +24 -0
- package/dist/JsExecutor/denoUtils.js.map +1 -0
- package/dist/JsExecutor/errors.d.ts +40 -0
- package/dist/JsExecutor/errors.d.ts.map +1 -0
- package/dist/JsExecutor/errors.js +67 -0
- package/dist/JsExecutor/errors.js.map +1 -0
- package/dist/JsExecutor/examples/basic/index.d.ts +1 -0
- package/dist/JsExecutor/examples/basic/index.d.ts.map +1 -0
- package/dist/JsExecutor/examples/basic/index.js +46 -0
- package/dist/JsExecutor/examples/basic/index.js.map +1 -0
- package/dist/JsExecutor/examples/basic/process.d.ts +1 -0
- package/dist/JsExecutor/examples/basic/process.d.ts.map +1 -0
- package/dist/JsExecutor/examples/basic/process.js +34 -0
- package/dist/JsExecutor/examples/basic/process.js.map +1 -0
- package/dist/JsExecutor/examples/jsExecutor/index.d.ts +2 -0
- package/dist/JsExecutor/examples/jsExecutor/index.d.ts.map +1 -0
- package/dist/JsExecutor/examples/jsExecutor/index.js +47 -0
- package/dist/JsExecutor/examples/jsExecutor/index.js.map +1 -0
- package/dist/JsExecutor/examples/jsExecutor/process.d.ts +2 -0
- package/dist/JsExecutor/examples/jsExecutor/process.d.ts.map +1 -0
- package/dist/JsExecutor/examples/jsExecutor/process.js +58 -0
- package/dist/JsExecutor/examples/jsExecutor/process.js.map +1 -0
- package/dist/JsExecutor/index.d.ts +7 -0
- package/dist/JsExecutor/index.d.ts.map +1 -0
- package/dist/JsExecutor/index.js +36 -0
- package/dist/JsExecutor/index.js.map +1 -0
- package/dist/JsExecutor/jsExecutor.d.ts +68 -0
- package/dist/JsExecutor/jsExecutor.d.ts.map +1 -0
- package/dist/JsExecutor/jsExecutor.js +171 -0
- package/dist/JsExecutor/jsExecutor.js.map +1 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcClient.d.ts +165 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcClient.d.ts.map +1 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcClient.js +335 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcClient.js.map +1 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcServer.d.ts +125 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcServer.d.ts.map +1 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcServer.js +391 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcServer.js.map +1 -0
- package/dist/JsExecutor/jsonRpc/index.d.ts +4 -0
- package/dist/JsExecutor/jsonRpc/index.d.ts.map +1 -0
- package/dist/JsExecutor/jsonRpc/index.js +23 -0
- package/dist/JsExecutor/jsonRpc/index.js.map +1 -0
- package/dist/JsExecutor/jsonRpc/types.d.ts +193 -0
- package/dist/JsExecutor/jsonRpc/types.d.ts.map +1 -0
- package/dist/JsExecutor/jsonRpc/types.js +37 -0
- package/dist/JsExecutor/jsonRpc/types.js.map +1 -0
- package/dist/JsExecutor/transport/Transport.d.ts +74 -0
- package/dist/JsExecutor/transport/Transport.d.ts.map +1 -0
- package/dist/JsExecutor/transport/Transport.js +14 -0
- package/dist/JsExecutor/transport/Transport.js.map +1 -0
- package/dist/JsExecutor/transport/base/BaseTransport.d.ts +51 -0
- package/dist/JsExecutor/transport/base/BaseTransport.d.ts.map +1 -0
- package/dist/JsExecutor/transport/base/BaseTransport.js +68 -0
- package/dist/JsExecutor/transport/base/BaseTransport.js.map +1 -0
- package/dist/JsExecutor/transport/index.d.ts +13 -0
- package/dist/JsExecutor/transport/index.d.ts.map +1 -0
- package/dist/JsExecutor/transport/index.js +36 -0
- package/dist/JsExecutor/transport/index.js.map +1 -0
- package/dist/JsExecutor/transport/process/ProcessManager.d.ts +96 -0
- package/dist/JsExecutor/transport/process/ProcessManager.d.ts.map +1 -0
- package/dist/JsExecutor/transport/process/ProcessManager.js +219 -0
- package/dist/JsExecutor/transport/process/ProcessManager.js.map +1 -0
- package/dist/JsExecutor/transport/stdio/ChildStdioTransport.d.ts +87 -0
- package/dist/JsExecutor/transport/stdio/ChildStdioTransport.d.ts.map +1 -0
- package/dist/JsExecutor/transport/stdio/ChildStdioTransport.js +219 -0
- package/dist/JsExecutor/transport/stdio/ChildStdioTransport.js.map +1 -0
- package/dist/JsExecutor/transport/stdio/ParentStdioTransport.d.ts +81 -0
- package/dist/JsExecutor/transport/stdio/ParentStdioTransport.d.ts.map +1 -0
- package/dist/JsExecutor/transport/stdio/ParentStdioTransport.js +259 -0
- package/dist/JsExecutor/transport/stdio/ParentStdioTransport.js.map +1 -0
- package/dist/JsExecutor/transport/utils/MessageUtils.d.ts +68 -0
- package/dist/JsExecutor/transport/utils/MessageUtils.d.ts.map +1 -0
- package/dist/JsExecutor/transport/utils/MessageUtils.js +135 -0
- package/dist/JsExecutor/transport/utils/MessageUtils.js.map +1 -0
- package/dist/JsExecutor/transport/utils/PollingUtils.d.ts +53 -0
- package/dist/JsExecutor/transport/utils/PollingUtils.d.ts.map +1 -0
- package/dist/JsExecutor/transport/utils/PollingUtils.js +92 -0
- package/dist/JsExecutor/transport/utils/PollingUtils.js.map +1 -0
- package/dist/JsExecutor/types.d.ts +113 -0
- package/dist/JsExecutor/types.d.ts.map +1 -0
- package/dist/JsExecutor/types.js +3 -0
- package/dist/JsExecutor/types.js.map +1 -0
- package/dist/SklEngine.d.ts +132 -0
- package/dist/SklEngine.d.ts.map +1 -0
- package/dist/SklEngine.js +1508 -0
- package/dist/SklEngine.js.map +1 -0
- package/dist/SklEngineOptions.d.ts +58 -0
- package/dist/SklEngineOptions.d.ts.map +1 -0
- package/dist/SklEngineOptions.js +3 -0
- package/dist/SklEngineOptions.js.map +1 -0
- package/dist/constants.d.ts +96 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +103 -0
- package/dist/constants.js.map +1 -0
- package/dist/customCapabilities.d.ts +22 -0
- package/dist/customCapabilities.d.ts.map +1 -0
- package/dist/customCapabilities.js +45 -0
- package/dist/customCapabilities.js.map +1 -0
- package/dist/examples/customCapabilitiesExample.d.ts +2 -0
- package/dist/examples/customCapabilitiesExample.d.ts.map +1 -0
- package/dist/examples/customCapabilitiesExample.js +59 -0
- package/dist/examples/customCapabilitiesExample.js.map +1 -0
- package/dist/executor.js +216 -0
- package/dist/hooks/globalHooks.d.ts +50 -0
- package/dist/hooks/globalHooks.d.ts.map +1 -0
- package/dist/hooks/globalHooks.js +164 -0
- package/dist/hooks/globalHooks.js.map +1 -0
- package/dist/hooks/types.d.ts +9 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +3 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +35 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +119 -0
- package/dist/logger.js.map +1 -0
- package/dist/mapping/Mapper.d.ts +13 -0
- package/dist/mapping/Mapper.d.ts.map +1 -0
- package/dist/mapping/Mapper.js +64 -0
- package/dist/mapping/Mapper.js.map +1 -0
- package/dist/storage/FindOperator.d.ts +19 -0
- package/dist/storage/FindOperator.d.ts.map +1 -0
- package/dist/storage/FindOperator.js +23 -0
- package/dist/storage/FindOperator.js.map +1 -0
- package/dist/storage/FindOptionsTypes.d.ts +79 -0
- package/dist/storage/FindOptionsTypes.d.ts.map +1 -0
- package/dist/storage/FindOptionsTypes.js +3 -0
- package/dist/storage/FindOptionsTypes.js.map +1 -0
- package/dist/storage/GroupOptionTypes.d.ts +29 -0
- package/dist/storage/GroupOptionTypes.d.ts.map +1 -0
- package/dist/storage/GroupOptionTypes.js +3 -0
- package/dist/storage/GroupOptionTypes.js.map +1 -0
- package/dist/storage/operator/And.d.ts +4 -0
- package/dist/storage/operator/And.d.ts.map +1 -0
- package/dist/storage/operator/And.js +13 -0
- package/dist/storage/operator/And.js.map +1 -0
- package/dist/storage/operator/Contains.d.ts +3 -0
- package/dist/storage/operator/Contains.d.ts.map +1 -0
- package/dist/storage/operator/Contains.js +13 -0
- package/dist/storage/operator/Contains.js.map +1 -0
- package/dist/storage/operator/Equal.d.ts +5 -0
- package/dist/storage/operator/Equal.d.ts.map +1 -0
- package/dist/storage/operator/Equal.js +13 -0
- package/dist/storage/operator/Equal.js.map +1 -0
- package/dist/storage/operator/Exists.d.ts +3 -0
- package/dist/storage/operator/Exists.d.ts.map +1 -0
- package/dist/storage/operator/Exists.js +10 -0
- package/dist/storage/operator/Exists.js.map +1 -0
- package/dist/storage/operator/GreaterThan.d.ts +4 -0
- package/dist/storage/operator/GreaterThan.d.ts.map +1 -0
- package/dist/storage/operator/GreaterThan.js +13 -0
- package/dist/storage/operator/GreaterThan.js.map +1 -0
- package/dist/storage/operator/GreaterThanOrEqual.d.ts +4 -0
- package/dist/storage/operator/GreaterThanOrEqual.d.ts.map +1 -0
- package/dist/storage/operator/GreaterThanOrEqual.js +13 -0
- package/dist/storage/operator/GreaterThanOrEqual.js.map +1 -0
- package/dist/storage/operator/In.d.ts +4 -0
- package/dist/storage/operator/In.d.ts.map +1 -0
- package/dist/storage/operator/In.js +13 -0
- package/dist/storage/operator/In.js.map +1 -0
- package/dist/storage/operator/Inverse.d.ts +3 -0
- package/dist/storage/operator/Inverse.d.ts.map +1 -0
- package/dist/storage/operator/Inverse.js +13 -0
- package/dist/storage/operator/Inverse.js.map +1 -0
- package/dist/storage/operator/InversePath.d.ts +7 -0
- package/dist/storage/operator/InversePath.d.ts.map +1 -0
- package/dist/storage/operator/InversePath.js +13 -0
- package/dist/storage/operator/InversePath.js.map +1 -0
- package/dist/storage/operator/InverseRelation.d.ts +9 -0
- package/dist/storage/operator/InverseRelation.d.ts.map +1 -0
- package/dist/storage/operator/InverseRelation.js +13 -0
- package/dist/storage/operator/InverseRelation.js.map +1 -0
- package/dist/storage/operator/InverseRelationOrder.d.ts +8 -0
- package/dist/storage/operator/InverseRelationOrder.d.ts.map +1 -0
- package/dist/storage/operator/InverseRelationOrder.js +13 -0
- package/dist/storage/operator/InverseRelationOrder.js.map +1 -0
- package/dist/storage/operator/LessThan.d.ts +4 -0
- package/dist/storage/operator/LessThan.d.ts.map +1 -0
- package/dist/storage/operator/LessThan.js +13 -0
- package/dist/storage/operator/LessThan.js.map +1 -0
- package/dist/storage/operator/LessThanOrEqual.d.ts +4 -0
- package/dist/storage/operator/LessThanOrEqual.d.ts.map +1 -0
- package/dist/storage/operator/LessThanOrEqual.js +13 -0
- package/dist/storage/operator/LessThanOrEqual.js.map +1 -0
- package/dist/storage/operator/Not.d.ts +3 -0
- package/dist/storage/operator/Not.d.ts.map +1 -0
- package/dist/storage/operator/Not.js +13 -0
- package/dist/storage/operator/Not.js.map +1 -0
- package/dist/storage/operator/OneOrMorePath.d.ts +7 -0
- package/dist/storage/operator/OneOrMorePath.d.ts.map +1 -0
- package/dist/storage/operator/OneOrMorePath.js +13 -0
- package/dist/storage/operator/OneOrMorePath.js.map +1 -0
- package/dist/storage/operator/Or.d.ts +4 -0
- package/dist/storage/operator/Or.d.ts.map +1 -0
- package/dist/storage/operator/Or.js +13 -0
- package/dist/storage/operator/Or.js.map +1 -0
- package/dist/storage/operator/Sequence.d.ts +3 -0
- package/dist/storage/operator/Sequence.d.ts.map +1 -0
- package/dist/storage/operator/Sequence.js +13 -0
- package/dist/storage/operator/Sequence.js.map +1 -0
- package/dist/storage/operator/SequencePath.d.ts +7 -0
- package/dist/storage/operator/SequencePath.d.ts.map +1 -0
- package/dist/storage/operator/SequencePath.js +13 -0
- package/dist/storage/operator/SequencePath.js.map +1 -0
- package/dist/storage/operator/ZeroOrMorePath.d.ts +7 -0
- package/dist/storage/operator/ZeroOrMorePath.d.ts.map +1 -0
- package/dist/storage/operator/ZeroOrMorePath.js +13 -0
- package/dist/storage/operator/ZeroOrMorePath.js.map +1 -0
- package/dist/storage/query-adapter/QueryAdapter.d.ts +99 -0
- package/dist/storage/query-adapter/QueryAdapter.d.ts.map +1 -0
- package/dist/storage/query-adapter/QueryAdapter.js +3 -0
- package/dist/storage/query-adapter/QueryAdapter.js.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.d.ts +40 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.js +315 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.js.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.d.ts +34 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.js +3 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.js.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.d.ts +104 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.js +1210 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.js.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.d.ts +44 -0
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.js +397 -0
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.js.map +1 -0
- package/dist/storage/query-adapter/sparql/VariableGenerator.d.ts +5 -0
- package/dist/storage/query-adapter/sparql/VariableGenerator.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/VariableGenerator.js +14 -0
- package/dist/storage/query-adapter/sparql/VariableGenerator.js.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.d.ts +19 -0
- package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.js +90 -0
- package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.js.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.d.ts +27 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.js +116 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.js.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.d.ts +34 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.js +3 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.js.map +1 -0
- package/dist/tools/explain-findall-sparql.d.ts +2 -0
- package/dist/tools/explain-findall-sparql.d.ts.map +1 -0
- package/dist/tools/explain-findall-sparql.js +303 -0
- package/dist/tools/explain-findall-sparql.js.map +1 -0
- package/dist/util/PerformanceLogger.d.ts +28 -0
- package/dist/util/PerformanceLogger.d.ts.map +1 -0
- package/dist/util/PerformanceLogger.js +223 -0
- package/dist/util/PerformanceLogger.js.map +1 -0
- package/dist/util/ReadCacheHelper.d.ts +14 -0
- package/dist/util/ReadCacheHelper.d.ts.map +1 -0
- package/dist/util/ReadCacheHelper.js +61 -0
- package/dist/util/ReadCacheHelper.js.map +1 -0
- package/dist/util/SparqlUtil.d.ts +72 -0
- package/dist/util/SparqlUtil.d.ts.map +1 -0
- package/dist/util/SparqlUtil.js +456 -0
- package/dist/util/SparqlUtil.js.map +1 -0
- package/dist/util/TripleUtil.d.ts +10 -0
- package/dist/util/TripleUtil.d.ts.map +1 -0
- package/dist/util/TripleUtil.js +414 -0
- package/dist/util/TripleUtil.js.map +1 -0
- package/dist/util/Types.d.ts +271 -0
- package/dist/util/Types.d.ts.map +1 -0
- package/dist/util/Types.js +3 -0
- package/dist/util/Types.js.map +1 -0
- package/dist/util/Util.d.ts +26 -0
- package/dist/util/Util.d.ts.map +1 -0
- package/dist/util/Util.js +138 -0
- package/dist/util/Util.js.map +1 -0
- package/dist/util/Vocabularies/Shared.d.ts +13 -0
- package/dist/util/Vocabularies/Shared.d.ts.map +1 -0
- package/dist/util/Vocabularies/Shared.js +96 -0
- package/dist/util/Vocabularies/Shared.js.map +1 -0
- package/dist/util/Vocabularies/helper.d.ts +5 -0
- package/dist/util/Vocabularies/helper.d.ts.map +1 -0
- package/dist/util/Vocabularies/helper.js +10 -0
- package/dist/util/Vocabularies/helper.js.map +1 -0
- package/dist/util/Vocabularies/index.d.ts +8 -0
- package/dist/util/Vocabularies/index.d.ts.map +1 -0
- package/dist/util/Vocabularies/index.js +114 -0
- package/dist/util/Vocabularies/index.js.map +1 -0
- package/dist/util/safeJsonStringify.d.ts +1 -0
- package/dist/util/safeJsonStringify.d.ts.map +1 -0
- package/dist/util/safeJsonStringify.js +19 -0
- package/dist/util/safeJsonStringify.js.map +1 -0
- package/package.json +1 -1
- 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 @@
|
|
|
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"]}
|