@comake/skl-js-engine 0.15.5 → 0.16.1

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 (44) hide show
  1. package/dist/SklEngine.d.ts +15 -3
  2. package/dist/SklEngine.js +172 -60
  3. package/dist/SklEngine.js.map +1 -1
  4. package/dist/SklEngineOptions.d.ts +3 -5
  5. package/dist/index.d.ts +7 -8
  6. package/dist/index.js +7 -9
  7. package/dist/index.js.map +1 -1
  8. package/dist/storage/operator/OneOrMorePath.d.ts +3 -3
  9. package/dist/storage/operator/OneOrMorePath.js.map +1 -1
  10. package/dist/storage/operator/SequencePath.d.ts +3 -3
  11. package/dist/storage/operator/SequencePath.js.map +1 -1
  12. package/dist/storage/operator/ZeroOrMorePath.d.ts +3 -3
  13. package/dist/storage/operator/ZeroOrMorePath.js.map +1 -1
  14. package/dist/storage/query-adapter/QueryAdapter.d.ts +89 -0
  15. package/dist/storage/query-adapter/QueryAdapter.js +3 -0
  16. package/dist/storage/query-adapter/QueryAdapter.js.map +1 -0
  17. package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.d.ts +35 -0
  18. package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.js +152 -0
  19. package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.js.map +1 -0
  20. package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.d.ts +33 -0
  21. package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.js +3 -0
  22. package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.js.map +1 -0
  23. package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.d.ts +68 -0
  24. package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.js +667 -0
  25. package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.js.map +1 -0
  26. package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.d.ts +38 -0
  27. package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.js +246 -0
  28. package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.js.map +1 -0
  29. package/dist/storage/query-adapter/sparql/VariableGenerator.d.ts +4 -0
  30. package/dist/storage/query-adapter/sparql/VariableGenerator.js +14 -0
  31. package/dist/storage/query-adapter/sparql/VariableGenerator.js.map +1 -0
  32. package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.d.ts +15 -0
  33. package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.js +76 -0
  34. package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.js.map +1 -0
  35. package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.d.ts +23 -0
  36. package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.js +63 -0
  37. package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.js.map +1 -0
  38. package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.d.ts +25 -0
  39. package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.js +3 -0
  40. package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.js.map +1 -0
  41. package/dist/util/SparqlUtil.d.ts +2 -2
  42. package/dist/util/SparqlUtil.js.map +1 -1
  43. package/dist/util/Types.d.ts +10 -1
  44. package/package.json +8 -3
@@ -0,0 +1,667 @@
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.SparqlQueryBuilder = void 0;
7
+ const data_model_1 = __importDefault(require("@rdfjs/data-model"));
8
+ const SparqlUtil_1 = require("../../../util/SparqlUtil");
9
+ const TripleUtil_1 = require("../../../util/TripleUtil");
10
+ const Util_1 = require("../../../util/Util");
11
+ const Vocabularies_1 = require("../../../util/Vocabularies");
12
+ const FindOperator_1 = require("../../FindOperator");
13
+ const VariableGenerator_1 = require("./VariableGenerator");
14
+ class SparqlQueryBuilder {
15
+ constructor() {
16
+ this.variableGenerator = new VariableGenerator_1.VariableGenerator();
17
+ }
18
+ buildEntitySelectPatternsFromOptions(subject, options) {
19
+ const relations = options?.select ? undefined : options?.relations;
20
+ const whereQueryData = this.createWhereQueryData(subject, options?.where);
21
+ const orderQueryData = this.createOrderQueryData(subject, options?.order);
22
+ const relationsQueryData = this.createRelationsQueryData(subject, relations);
23
+ if (whereQueryData.triples.length === 0 && (whereQueryData.filters.length > 0 ||
24
+ orderQueryData.triples.length > 0 ||
25
+ (whereQueryData.values.length === 0 &&
26
+ whereQueryData.graphValues.length === 0 &&
27
+ whereQueryData.graphTriples.length === 0))) {
28
+ whereQueryData.triples.push({
29
+ subject,
30
+ predicate: this.createVariable(),
31
+ object: this.createVariable(),
32
+ });
33
+ }
34
+ const wherePatterns = this.createWherePatternsFromQueryData(whereQueryData.values, whereQueryData.triples, whereQueryData.filters, orderQueryData.triples, orderQueryData.filters);
35
+ const graphWherePatterns = this.createWherePatternsFromQueryData(whereQueryData.graphValues, whereQueryData.graphTriples, whereQueryData.graphFilters, undefined, undefined, undefined, relationsQueryData.patterns);
36
+ return {
37
+ where: wherePatterns,
38
+ orders: orderQueryData.orders,
39
+ group: orderQueryData.groupByParent ? subject : undefined,
40
+ graphWhere: graphWherePatterns,
41
+ graphSelectionTriples: relationsQueryData.selectionTriples,
42
+ };
43
+ }
44
+ buildConstructFromEntitySelectQuery(graphWhere, graphSelectionTriples, select) {
45
+ let triples;
46
+ let where = [];
47
+ if (select) {
48
+ triples = this.createSelectPattern(select, SparqlUtil_1.entityVariable);
49
+ where = [
50
+ (0, SparqlUtil_1.createSparqlOptional)([
51
+ (0, SparqlUtil_1.createSparqlBasicGraphPattern)(triples),
52
+ ]),
53
+ ...graphWhere,
54
+ ];
55
+ }
56
+ else {
57
+ triples = [SparqlUtil_1.entityGraphTriple, ...graphSelectionTriples];
58
+ where = [
59
+ ...graphWhere,
60
+ (0, SparqlUtil_1.createSparqlGraphPattern)(SparqlUtil_1.entityVariable, [(0, SparqlUtil_1.createSparqlBasicGraphPattern)([SparqlUtil_1.entityGraphTriple])]),
61
+ ];
62
+ }
63
+ return (0, SparqlUtil_1.createSparqlConstructQuery)(triples, where);
64
+ }
65
+ createWhereQueryData(subject, where, baseTriples = []) {
66
+ const hasSingleKey = Object.keys(where ?? {}).length === 1;
67
+ const whereQueryData = Object.entries(where ?? {}).reduce((obj, [key, value]) => {
68
+ const whereQueryDataForField = this.createWhereQueryDataForField(subject, key, value, hasSingleKey);
69
+ return {
70
+ values: [...obj.values, ...whereQueryDataForField.values],
71
+ triples: [...obj.triples, ...whereQueryDataForField.triples],
72
+ filters: [...obj.filters, ...whereQueryDataForField.filters],
73
+ graphValues: [...obj.graphValues, ...whereQueryDataForField.graphValues],
74
+ graphTriples: [...obj.graphTriples, ...whereQueryDataForField.graphTriples],
75
+ graphFilters: [...obj.graphFilters, ...whereQueryDataForField.graphFilters],
76
+ };
77
+ }, { values: [], triples: baseTriples, filters: [], graphValues: [], graphTriples: [], graphFilters: [] });
78
+ return whereQueryData;
79
+ }
80
+ createWhereQueryDataForField(subject, field, value, isOnlyField) {
81
+ if (field === 'id') {
82
+ return this.createWhereQueryDataForIdValue(subject, value, isOnlyField);
83
+ }
84
+ if (field === 'type') {
85
+ return this.createWhereQueryDataForType(subject, value);
86
+ }
87
+ const predicate = data_model_1.default.namedNode(field);
88
+ return this.createWhereQueryDataFromKeyValue(subject, predicate, value);
89
+ }
90
+ createWhereQueryDataForIdValue(term, value, isOnlyField) {
91
+ let filters = [];
92
+ let values = [];
93
+ let triples = [];
94
+ if (FindOperator_1.FindOperator.isFindOperator(value)) {
95
+ ({ filters, values, triples } =
96
+ this.resolveFindOperatorAsExpressionForId(term, value));
97
+ }
98
+ else {
99
+ values = [{
100
+ type: 'values',
101
+ values: [{
102
+ [`?${term.value}`]: data_model_1.default.namedNode(value),
103
+ }],
104
+ }];
105
+ }
106
+ if (isOnlyField) {
107
+ return {
108
+ values: [],
109
+ filters: [],
110
+ triples: [],
111
+ graphValues: values,
112
+ graphFilters: filters,
113
+ graphTriples: triples,
114
+ };
115
+ }
116
+ return {
117
+ values,
118
+ filters,
119
+ triples,
120
+ graphValues: [],
121
+ graphFilters: [],
122
+ graphTriples: [],
123
+ };
124
+ }
125
+ createWhereQueryDataForType(subject, value) {
126
+ if (FindOperator_1.FindOperator.isFindOperator(value)) {
127
+ if (value.operator === 'inverse') {
128
+ const inversePredicate = (0, SparqlUtil_1.createSparqlInversePredicate)([SparqlUtil_1.allTypesAndSuperTypesPath]);
129
+ const inverseWhereQueryData = this.createWhereQueryDataFromKeyValue(subject, inversePredicate, value.value);
130
+ return {
131
+ values: inverseWhereQueryData.values,
132
+ filters: inverseWhereQueryData.filters,
133
+ triples: inverseWhereQueryData.triples,
134
+ graphValues: [],
135
+ graphTriples: [],
136
+ graphFilters: [],
137
+ };
138
+ }
139
+ const variable = this.createVariable();
140
+ const triple = { subject, predicate: SparqlUtil_1.allTypesAndSuperTypesPath, object: variable };
141
+ const { filter, valuePattern, tripleInFilter } = this.resolveFindOperatorAsExpressionWithMultipleValues(variable, value, triple);
142
+ return {
143
+ values: valuePattern ? [valuePattern] : [],
144
+ filters: filter ? [filter] : [],
145
+ triples: tripleInFilter ? [] : [triple],
146
+ graphValues: [],
147
+ graphFilters: [],
148
+ graphTriples: [],
149
+ };
150
+ }
151
+ return {
152
+ values: [],
153
+ filters: [],
154
+ triples: [{
155
+ subject,
156
+ predicate: SparqlUtil_1.allTypesAndSuperTypesPath,
157
+ object: data_model_1.default.namedNode(value),
158
+ }],
159
+ graphValues: [],
160
+ graphFilters: [],
161
+ graphTriples: [],
162
+ };
163
+ }
164
+ createWhereQueryDataFromKeyValue(subject, predicate, value) {
165
+ if (Array.isArray(value) && FindOperator_1.FindOperator.isFindOperator(value[0])) {
166
+ return this.createWhereQueryDataForMultipleFindOperators(subject, predicate, value);
167
+ }
168
+ if (FindOperator_1.FindOperator.isFindOperator(value)) {
169
+ return this.createWhereQueryDataForFindOperator(subject, predicate, value);
170
+ }
171
+ if (Array.isArray(value)) {
172
+ return value.reduce((obj, valueItem) => {
173
+ const valueWhereQueryData = this.createWhereQueryDataFromKeyValue(subject, predicate, valueItem);
174
+ return {
175
+ values: [...obj.values, ...valueWhereQueryData.values],
176
+ filters: [...obj.filters, ...valueWhereQueryData.filters],
177
+ triples: [...obj.triples, ...valueWhereQueryData.triples],
178
+ graphValues: [...obj.graphValues, ...valueWhereQueryData.graphValues],
179
+ graphFilters: [...obj.graphFilters, ...valueWhereQueryData.graphFilters],
180
+ graphTriples: [...obj.graphTriples, ...valueWhereQueryData.graphTriples],
181
+ };
182
+ }, { values: [], filters: [], triples: [], graphTriples: [], graphValues: [], graphFilters: [] });
183
+ }
184
+ if (typeof value === 'object') {
185
+ if ('@value' in value) {
186
+ return this.createWhereQueryDataForValueObject(subject, predicate, value);
187
+ }
188
+ return this.createWhereQueryDataForNestedWhere(subject, predicate, value);
189
+ }
190
+ const term = this.resolveValueToTerm(value);
191
+ return {
192
+ values: [],
193
+ filters: [],
194
+ triples: [{ subject, predicate, object: term }],
195
+ graphValues: [],
196
+ graphFilters: [],
197
+ graphTriples: [],
198
+ };
199
+ }
200
+ createWhereQueryDataForFindOperator(subject, predicate, operator) {
201
+ if (operator.operator === 'inverse') {
202
+ const inversePredicate = (0, SparqlUtil_1.createSparqlInversePredicate)([predicate]);
203
+ const inverseWhereQueryData = this.createWhereQueryDataFromKeyValue(subject, inversePredicate, operator.value);
204
+ return {
205
+ values: inverseWhereQueryData.values,
206
+ filters: inverseWhereQueryData.filters,
207
+ triples: inverseWhereQueryData.triples,
208
+ graphValues: [],
209
+ graphTriples: [],
210
+ graphFilters: [],
211
+ };
212
+ }
213
+ if (FindOperator_1.FindOperator.isPathOperator(operator)) {
214
+ const pathPredicate = this.pathOperatorToPropertyPath(operator);
215
+ const combinedPredicate = (0, SparqlUtil_1.createSparqlSequencePredicate)([
216
+ predicate,
217
+ pathPredicate,
218
+ ]);
219
+ return this.createWhereQueryDataFromKeyValue(subject, combinedPredicate, operator.value.value);
220
+ }
221
+ const variable = this.createVariable();
222
+ const triple = { subject, predicate, object: variable };
223
+ const { filter, valuePattern } = this.resolveFindOperatorAsExpressionWithMultipleValues(variable, operator, triple);
224
+ return {
225
+ values: valuePattern ? [valuePattern] : [],
226
+ filters: filter ? [filter] : [],
227
+ triples: [triple],
228
+ graphValues: [],
229
+ graphTriples: [],
230
+ graphFilters: [],
231
+ };
232
+ }
233
+ pathOperatorToPropertyPath(operator) {
234
+ if (operator.operator === 'inversePath') {
235
+ let subPredicate;
236
+ const { subPath } = operator.value;
237
+ if (typeof subPath === 'string') {
238
+ subPredicate = data_model_1.default.namedNode(subPath);
239
+ }
240
+ else {
241
+ subPredicate = this.pathOperatorToPropertyPath(subPath);
242
+ }
243
+ return (0, SparqlUtil_1.createSparqlInversePredicate)([subPredicate]);
244
+ }
245
+ if (operator.operator === 'sequencePath') {
246
+ const { subPath } = operator.value;
247
+ const subPredicates = subPath
248
+ .map((sequencePart) => {
249
+ if (typeof sequencePart === 'string') {
250
+ return data_model_1.default.namedNode(sequencePart);
251
+ }
252
+ return this.pathOperatorToPropertyPath(sequencePart);
253
+ });
254
+ return (0, SparqlUtil_1.createSparqlSequencePredicate)(subPredicates);
255
+ }
256
+ if (operator.operator === 'zeroOrMorePath') {
257
+ const { subPath } = operator.value;
258
+ let subPredicate;
259
+ if (typeof subPath === 'string') {
260
+ subPredicate = data_model_1.default.namedNode(subPath);
261
+ }
262
+ else {
263
+ subPredicate = this.pathOperatorToPropertyPath(subPath);
264
+ }
265
+ return (0, SparqlUtil_1.createSparqlZeroOrMorePredicate)([subPredicate]);
266
+ }
267
+ if (operator.operator === 'oneOrMorePath') {
268
+ const { subPath } = operator.value;
269
+ let subPredicate;
270
+ if (typeof subPath === 'string') {
271
+ subPredicate = data_model_1.default.namedNode(subPath);
272
+ }
273
+ else {
274
+ subPredicate = this.pathOperatorToPropertyPath(subPath);
275
+ }
276
+ return (0, SparqlUtil_1.createSparqlOneOrMorePredicate)([subPredicate]);
277
+ }
278
+ throw new Error(`Operator ${operator.operator} not supported`);
279
+ }
280
+ createWhereQueryDataForMultipleFindOperators(subject, predicate, operators) {
281
+ const variable = this.createVariable();
282
+ const triple = { subject, predicate, object: variable };
283
+ const whereQueryData = {
284
+ values: [],
285
+ filters: [],
286
+ triples: [triple],
287
+ graphValues: [],
288
+ graphTriples: [],
289
+ graphFilters: [],
290
+ };
291
+ return operators.reduce((obj, operator) => {
292
+ const { filter, valuePattern } = this.resolveFindOperatorAsExpressionWithMultipleValues(variable, operator, triple);
293
+ if (valuePattern) {
294
+ obj.values.push(valuePattern);
295
+ }
296
+ if (filter) {
297
+ obj.filters.push(filter);
298
+ }
299
+ return obj;
300
+ }, whereQueryData);
301
+ }
302
+ createWhereQueryDataForNestedWhere(subject, predicate, where) {
303
+ const subNodeVariable = this.createVariable();
304
+ const subWhereQueryData = this.createWhereQueryData(subNodeVariable, where);
305
+ return {
306
+ values: [...subWhereQueryData.values, ...subWhereQueryData.graphValues],
307
+ filters: subWhereQueryData.filters,
308
+ triples: [
309
+ { subject, predicate, object: subNodeVariable },
310
+ ...subWhereQueryData.triples,
311
+ ],
312
+ graphValues: [],
313
+ graphFilters: [],
314
+ graphTriples: [],
315
+ };
316
+ }
317
+ createWhereQueryDataForValueObject(subject, predicate, valueObject) {
318
+ const term = this.valueObjectToTerm(valueObject);
319
+ return {
320
+ values: [],
321
+ filters: [],
322
+ triples: [{ subject, predicate, object: term }],
323
+ graphValues: [],
324
+ graphFilters: [],
325
+ graphTriples: [],
326
+ };
327
+ }
328
+ valueObjectToTerm(valueObject) {
329
+ let typeOrLanguage;
330
+ let value;
331
+ if ('@type' in valueObject && valueObject['@type'] === '@json') {
332
+ typeOrLanguage = Vocabularies_1.RDF.JSON;
333
+ value = JSON.stringify(valueObject['@value']);
334
+ }
335
+ else {
336
+ typeOrLanguage = ('@type' in valueObject ? valueObject['@type'] : valueObject['@language']);
337
+ value = valueObject['@value'].toString();
338
+ }
339
+ return data_model_1.default.literal(value, typeOrLanguage);
340
+ }
341
+ resolveFindOperatorAsExpressionWithMultipleValues(leftSide, operator, triple, dontUseValuePattern = false) {
342
+ if (operator.operator === 'in') {
343
+ const resolvedValue = this.resolveValueToExpression(operator.value);
344
+ if (Array.isArray(resolvedValue) && !dontUseValuePattern) {
345
+ return {
346
+ valuePattern: {
347
+ type: 'values',
348
+ values: resolvedValue.map((value) => ({ [`?${leftSide.value}`]: value })),
349
+ },
350
+ };
351
+ }
352
+ return {
353
+ filter: (0, SparqlUtil_1.createSparqlInOperation)(leftSide, resolvedValue),
354
+ };
355
+ }
356
+ if (operator.operator === 'not') {
357
+ const resolvedExpression = this.resolveValueToExpression(operator.value);
358
+ return {
359
+ filter: this.buildNotOperationForMultiValued(leftSide, resolvedExpression, triple),
360
+ tripleInFilter: true,
361
+ };
362
+ }
363
+ const resolvedExpression = this.resolveValueToExpression(operator.value);
364
+ switch (operator.operator) {
365
+ case 'equal':
366
+ return { filter: (0, SparqlUtil_1.createSparqlEqualOperation)(leftSide, resolvedExpression) };
367
+ case 'gt':
368
+ return { filter: (0, SparqlUtil_1.createSparqlGtOperation)(leftSide, resolvedExpression) };
369
+ case 'gte':
370
+ return { filter: (0, SparqlUtil_1.createSparqlGteOperation)(leftSide, resolvedExpression) };
371
+ case 'lt':
372
+ return { filter: (0, SparqlUtil_1.createSparqlLtOperation)(leftSide, resolvedExpression) };
373
+ case 'lte':
374
+ return { filter: (0, SparqlUtil_1.createSparqlLteOperation)(leftSide, resolvedExpression) };
375
+ default:
376
+ throw new Error(`Unsupported operator "${operator.operator}"`);
377
+ }
378
+ }
379
+ resolveFindOperatorAsExpressionForId(leftSide, operator) {
380
+ switch (operator.operator) {
381
+ case 'inversePath': {
382
+ const predicate = this.pathOperatorToPropertyPath(operator);
383
+ return this.createWhereQueryDataFromKeyValue(leftSide, predicate, operator.value.value);
384
+ }
385
+ case 'in': {
386
+ const resolvedValue = this.resolveValueToExpression(operator.value);
387
+ return {
388
+ triples: [],
389
+ filters: [],
390
+ values: [{
391
+ type: 'values',
392
+ values: resolvedValue.map((value) => ({ [`?${leftSide.value}`]: value })),
393
+ }],
394
+ };
395
+ }
396
+ case 'not':
397
+ return {
398
+ triples: [],
399
+ values: [],
400
+ filters: [
401
+ this.buildNotOperationForId(leftSide, this.resolveValueToExpression(operator.value)),
402
+ ],
403
+ };
404
+ case 'equal':
405
+ return {
406
+ triples: [],
407
+ values: [],
408
+ filters: [
409
+ (0, SparqlUtil_1.createSparqlEqualOperation)(leftSide, this.resolveValueToExpression(operator.value)),
410
+ ],
411
+ };
412
+ default:
413
+ throw new Error(`Unsupported operator "${operator.operator}"`);
414
+ }
415
+ }
416
+ resolveValueToExpression(value) {
417
+ if (FindOperator_1.FindOperator.isFindOperator(value)) {
418
+ return value;
419
+ }
420
+ if (Array.isArray(value)) {
421
+ return value.map((valueItem) => this.resolveValueToTerm(valueItem));
422
+ }
423
+ return this.resolveValueToTerm(value);
424
+ }
425
+ buildNotOperationForMultiValued(leftSide, rightSide, triple) {
426
+ let filterExpression;
427
+ const rightSideIsOperation = typeof rightSide === 'object' && 'operator' in rightSide;
428
+ if (rightSideIsOperation) {
429
+ let expression;
430
+ try {
431
+ ({ filter: expression } = this.resolveFindOperatorAsExpressionWithMultipleValues(leftSide, rightSide, triple, true));
432
+ }
433
+ catch {
434
+ throw new Error(`Unsupported Not sub operator "${rightSide.operator}"`);
435
+ }
436
+ filterExpression = (0, SparqlUtil_1.createSparqlFilterWithExpression)(expression);
437
+ }
438
+ else {
439
+ filterExpression = (0, SparqlUtil_1.createSparqlFilterWithExpression)((0, SparqlUtil_1.createSparqlEqualOperation)(leftSide, rightSide));
440
+ }
441
+ return (0, SparqlUtil_1.createSparqlNotExistsOperation)([
442
+ (0, SparqlUtil_1.createSparqlSelectGroup)([
443
+ (0, SparqlUtil_1.createSparqlBasicGraphPattern)([triple]),
444
+ filterExpression,
445
+ ]),
446
+ ]);
447
+ }
448
+ buildNotOperationForId(leftSide, rightSide) {
449
+ if (FindOperator_1.FindOperator.isFindOperator(rightSide)) {
450
+ const resolvedValue = this.resolveValueToExpression(rightSide.value);
451
+ switch (rightSide.operator) {
452
+ case 'in':
453
+ return (0, SparqlUtil_1.createSparqlNotInOperation)(leftSide, resolvedValue);
454
+ case 'equal':
455
+ return (0, SparqlUtil_1.createSparqlNotEqualOperation)(leftSide, resolvedValue);
456
+ default:
457
+ throw new Error(`Unsupported Not sub operator "${rightSide.operator}"`);
458
+ }
459
+ }
460
+ return (0, SparqlUtil_1.createSparqlNotEqualOperation)(leftSide, rightSide);
461
+ }
462
+ resolveValueToTerm(value) {
463
+ if (typeof value === 'object' && '@value' in value) {
464
+ return (0, TripleUtil_1.valueToLiteral)(value['@value'], '@type' in value ? value['@type'] : undefined);
465
+ }
466
+ if ((0, Util_1.isUrl)(value)) {
467
+ return data_model_1.default.namedNode(value);
468
+ }
469
+ return (0, TripleUtil_1.valueToLiteral)(value);
470
+ }
471
+ createOrderQueryData(subject, order, isNested = false) {
472
+ if (!order) {
473
+ return { triples: [], orders: [], filters: [] };
474
+ }
475
+ return Object.entries(order).reduce((obj, [property, orderValue]) => {
476
+ const orderQueryData = this.createOrderQueryDataForProperty(subject, property, orderValue, isNested);
477
+ obj.orders = [...obj.orders, ...orderQueryData.orders];
478
+ obj.triples = [...obj.triples, ...orderQueryData.triples];
479
+ obj.filters = [...obj.filters, ...orderQueryData.filters];
480
+ obj.groupByParent = obj.groupByParent ?? orderQueryData.groupByParent;
481
+ return obj;
482
+ }, { triples: [], orders: [], filters: [] });
483
+ }
484
+ createOrderQueryDataForProperty(subject, property, orderValue, isNested = false) {
485
+ const predicate = data_model_1.default.namedNode(property);
486
+ if (FindOperator_1.FindOperator.isFindOperator(orderValue)) {
487
+ const variable = this.createVariable();
488
+ const inverseRelationTriple = {
489
+ subject,
490
+ predicate: (0, SparqlUtil_1.createSparqlInversePredicate)([predicate]),
491
+ object: variable,
492
+ };
493
+ const subRelationOperatorValue = orderValue.value;
494
+ const subRelationOrderQueryData = this.createOrderQueryData(variable, subRelationOperatorValue.order, true);
495
+ const subRelationWhereQueryData = this.createWhereQueryData(variable, subRelationOperatorValue.where);
496
+ return {
497
+ triples: [inverseRelationTriple, ...subRelationOrderQueryData.triples, ...subRelationWhereQueryData.triples],
498
+ filters: subRelationWhereQueryData.filters,
499
+ orders: subRelationOrderQueryData.orders,
500
+ groupByParent: true,
501
+ };
502
+ }
503
+ if (property === 'id') {
504
+ return {
505
+ triples: [],
506
+ filters: [],
507
+ orders: [{
508
+ expression: subject,
509
+ descending: orderValue === 'DESC' || orderValue === 'desc',
510
+ }],
511
+ };
512
+ }
513
+ const variable = this.createVariable();
514
+ const isDescending = orderValue === 'DESC' || orderValue === 'desc';
515
+ return {
516
+ triples: [{ subject, predicate, object: variable }],
517
+ filters: [],
518
+ orders: [{
519
+ expression: isNested
520
+ ? {
521
+ type: 'aggregate',
522
+ expression: variable,
523
+ aggregation: isDescending ? 'max' : 'min',
524
+ }
525
+ : variable,
526
+ descending: isDescending,
527
+ }],
528
+ };
529
+ }
530
+ createRelationsQueryData(subject, relations) {
531
+ if (!relations) {
532
+ return { patterns: [], selectionTriples: [] };
533
+ }
534
+ return Object.entries(relations)
535
+ .reduce((obj, [property, relationsValue]) => {
536
+ const predicate = data_model_1.default.namedNode(property);
537
+ if (typeof relationsValue === 'object') {
538
+ if (FindOperator_1.FindOperator.isFindOperator(relationsValue)) {
539
+ const { patterns, selectionTriples } = this.createRelationsQueryDataForInverseRelation(subject, predicate, relationsValue);
540
+ return {
541
+ patterns: [...obj.patterns, ...patterns],
542
+ selectionTriples: [...obj.selectionTriples, ...selectionTriples],
543
+ };
544
+ }
545
+ const { patterns, selectionTriples } = this.createRelationsQueryDataForNestedRelation(subject, predicate, relationsValue);
546
+ return {
547
+ patterns: [...obj.patterns, ...patterns],
548
+ selectionTriples: [...obj.selectionTriples, ...selectionTriples],
549
+ };
550
+ }
551
+ const variable = this.createVariable();
552
+ const graphTriple = {
553
+ subject: this.createVariable(),
554
+ predicate: this.createVariable(),
555
+ object: this.createVariable(),
556
+ };
557
+ const relationPattern = (0, SparqlUtil_1.createSparqlOptional)([
558
+ (0, SparqlUtil_1.createSparqlBasicGraphPattern)([{ subject, predicate, object: variable }]),
559
+ (0, SparqlUtil_1.createSparqlGraphPattern)(variable, [(0, SparqlUtil_1.createSparqlBasicGraphPattern)([graphTriple])]),
560
+ ]);
561
+ return {
562
+ patterns: [...obj.patterns, relationPattern],
563
+ selectionTriples: [...obj.selectionTriples, graphTriple],
564
+ };
565
+ }, { patterns: [], selectionTriples: [] });
566
+ }
567
+ createRelationsQueryDataForInverseRelation(subject, predicate, relationsValue) {
568
+ const variable = this.createVariable();
569
+ const graphTriple = {
570
+ subject: this.createVariable(),
571
+ predicate: this.createVariable(),
572
+ object: this.createVariable(),
573
+ };
574
+ const inverseRelationTriple = {
575
+ subject,
576
+ predicate: (0, SparqlUtil_1.createSparqlInversePredicate)([predicate]),
577
+ object: variable,
578
+ };
579
+ if (typeof relationsValue.value === 'object' &&
580
+ relationsValue.value.relations) {
581
+ const subRelationsQueryData = this.createRelationsQueryData(variable, relationsValue.value.relations);
582
+ const relationPattern = (0, SparqlUtil_1.createSparqlOptional)([
583
+ (0, SparqlUtil_1.createSparqlBasicGraphPattern)([inverseRelationTriple]),
584
+ (0, SparqlUtil_1.createSparqlGraphPattern)(variable, [(0, SparqlUtil_1.createSparqlBasicGraphPattern)([graphTriple])]),
585
+ ...subRelationsQueryData.patterns,
586
+ ]);
587
+ return {
588
+ patterns: [relationPattern],
589
+ selectionTriples: [graphTriple, ...subRelationsQueryData.selectionTriples],
590
+ };
591
+ }
592
+ const relationPattern = (0, SparqlUtil_1.createSparqlOptional)([
593
+ (0, SparqlUtil_1.createSparqlBasicGraphPattern)([inverseRelationTriple]),
594
+ (0, SparqlUtil_1.createSparqlGraphPattern)(variable, [(0, SparqlUtil_1.createSparqlBasicGraphPattern)([graphTriple])]),
595
+ ]);
596
+ return {
597
+ patterns: [relationPattern],
598
+ selectionTriples: [graphTriple],
599
+ };
600
+ }
601
+ createRelationsQueryDataForNestedRelation(subject, predicate, relationsValue) {
602
+ const variable = this.createVariable();
603
+ const graphTriple = {
604
+ subject: this.createVariable(),
605
+ predicate: this.createVariable(),
606
+ object: this.createVariable(),
607
+ };
608
+ const relationTriple = { subject, predicate, object: variable };
609
+ const subRelationsQueryData = this.createRelationsQueryData(variable, relationsValue);
610
+ const relationPattern = (0, SparqlUtil_1.createSparqlOptional)([
611
+ (0, SparqlUtil_1.createSparqlBasicGraphPattern)([relationTriple]),
612
+ (0, SparqlUtil_1.createSparqlGraphPattern)(variable, [(0, SparqlUtil_1.createSparqlBasicGraphPattern)([graphTriple])]),
613
+ ...subRelationsQueryData.patterns,
614
+ ]);
615
+ return {
616
+ patterns: [relationPattern],
617
+ selectionTriples: [graphTriple, ...subRelationsQueryData.selectionTriples],
618
+ };
619
+ }
620
+ createVariable() {
621
+ return data_model_1.default.variable(this.variableGenerator.getNext());
622
+ }
623
+ createSelectPattern(select, subject) {
624
+ if (Array.isArray(select)) {
625
+ return select.map((selectPredicate) => ({
626
+ subject,
627
+ predicate: data_model_1.default.namedNode(selectPredicate),
628
+ object: this.createVariable(),
629
+ }));
630
+ }
631
+ return Object.entries(select).reduce((arr, [key, value]) => {
632
+ const variable = this.createVariable();
633
+ arr.push({ subject, predicate: data_model_1.default.namedNode(key), object: variable });
634
+ if (typeof value === 'object') {
635
+ arr = [...arr, ...this.createSelectPattern(value, variable)];
636
+ }
637
+ return arr;
638
+ }, []);
639
+ }
640
+ createWherePatternsFromQueryData(values, triples, filters, orderTriples, orderFilters, serviceTriples, additionalPatterns) {
641
+ let patterns = values;
642
+ if (triples.length > 0) {
643
+ patterns.push((0, SparqlUtil_1.createSparqlBasicGraphPattern)(triples));
644
+ }
645
+ if (orderTriples && orderTriples.length > 0) {
646
+ const optionalPatterns = [(0, SparqlUtil_1.createSparqlBasicGraphPattern)(orderTriples)];
647
+ if (orderFilters && orderFilters.length > 0) {
648
+ optionalPatterns.push((0, SparqlUtil_1.createFilterPatternFromFilters)(orderFilters));
649
+ }
650
+ patterns.push((0, SparqlUtil_1.createSparqlOptional)(optionalPatterns));
651
+ }
652
+ if (filters.length > 0) {
653
+ patterns.push((0, SparqlUtil_1.createFilterPatternFromFilters)(filters));
654
+ }
655
+ if (serviceTriples) {
656
+ for (const [service, sTriples] of Object.entries(serviceTriples)) {
657
+ patterns.unshift((0, SparqlUtil_1.createSparqlServicePattern)(service, sTriples));
658
+ }
659
+ }
660
+ if (additionalPatterns) {
661
+ patterns = [...patterns, ...additionalPatterns];
662
+ }
663
+ return patterns;
664
+ }
665
+ }
666
+ exports.SparqlQueryBuilder = SparqlQueryBuilder;
667
+ //# sourceMappingURL=SparqlQueryBuilder.js.map