@traqula/rules-sparql-1-1 0.0.1-alpha.176 → 0.0.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 (100) hide show
  1. package/lib/RoundTripTypes.d.ts +379 -0
  2. package/lib/RoundTripTypes.js +2 -0
  3. package/lib/RoundTripTypes.js.map +1 -0
  4. package/lib/Sparql11types.d.ts +18 -245
  5. package/lib/Sparql11types.js.map +1 -1
  6. package/lib/SparqlParser.d.ts +13 -4
  7. package/lib/SparqlParser.js +7 -4
  8. package/lib/SparqlParser.js.map +1 -1
  9. package/lib/expressionHelpers.d.ts +8 -19
  10. package/lib/expressionHelpers.js +40 -103
  11. package/lib/expressionHelpers.js.map +1 -1
  12. package/lib/factory.d.ts +447 -0
  13. package/lib/factory.js +105 -0
  14. package/lib/factory.js.map +1 -0
  15. package/lib/factoryMixins/ContextFactory.d.ts +38 -0
  16. package/lib/factoryMixins/ContextFactory.js +30 -0
  17. package/lib/factoryMixins/ContextFactory.js.map +1 -0
  18. package/lib/factoryMixins/ExpressionFactory.d.ts +60 -0
  19. package/lib/factoryMixins/ExpressionFactory.js +83 -0
  20. package/lib/factoryMixins/ExpressionFactory.js.map +1 -0
  21. package/lib/factoryMixins/GraphRefFactory.d.ts +43 -0
  22. package/lib/factoryMixins/GraphRefFactory.js +51 -0
  23. package/lib/factoryMixins/GraphRefFactory.js.map +1 -0
  24. package/lib/factoryMixins/PathFactory.d.ts +51 -0
  25. package/lib/factoryMixins/PathFactory.js +68 -0
  26. package/lib/factoryMixins/PathFactory.js.map +1 -0
  27. package/lib/factoryMixins/Patternfactory.d.ts +55 -0
  28. package/lib/factoryMixins/Patternfactory.js +98 -0
  29. package/lib/factoryMixins/Patternfactory.js.map +1 -0
  30. package/lib/factoryMixins/QueryFactory.d.ts +41 -0
  31. package/lib/factoryMixins/QueryFactory.js +43 -0
  32. package/lib/factoryMixins/QueryFactory.js.map +1 -0
  33. package/lib/factoryMixins/SolutionModifiersFactory.d.ts +43 -0
  34. package/lib/factoryMixins/SolutionModifiersFactory.js +55 -0
  35. package/lib/factoryMixins/SolutionModifiersFactory.js.map +1 -0
  36. package/lib/factoryMixins/TermFactory.d.ts +76 -0
  37. package/lib/factoryMixins/TermFactory.js +84 -0
  38. package/lib/factoryMixins/TermFactory.js.map +1 -0
  39. package/lib/factoryMixins/UpdateOperationFactory.d.ts +68 -0
  40. package/lib/factoryMixins/UpdateOperationFactory.js +126 -0
  41. package/lib/factoryMixins/UpdateOperationFactory.js.map +1 -0
  42. package/lib/factoryMixins/mixins.d.ts +14 -0
  43. package/lib/factoryMixins/mixins.js +20 -0
  44. package/lib/factoryMixins/mixins.js.map +1 -0
  45. package/lib/grammar/builtIn.d.ts +59 -59
  46. package/lib/grammar/builtIn.js +50 -57
  47. package/lib/grammar/builtIn.js.map +1 -1
  48. package/lib/grammar/dataSetClause.d.ts +22 -9
  49. package/lib/grammar/dataSetClause.js +57 -14
  50. package/lib/grammar/dataSetClause.js.map +1 -1
  51. package/lib/grammar/expression.d.ts +12 -16
  52. package/lib/grammar/expression.js +224 -296
  53. package/lib/grammar/expression.js.map +1 -1
  54. package/lib/grammar/general.d.ts +8 -8
  55. package/lib/grammar/general.js +59 -94
  56. package/lib/grammar/general.js.map +1 -1
  57. package/lib/grammar/literals.d.ts +16 -13
  58. package/lib/grammar/literals.js +161 -144
  59. package/lib/grammar/literals.js.map +1 -1
  60. package/lib/grammar/propertyPaths.d.ts +16 -12
  61. package/lib/grammar/propertyPaths.js +100 -129
  62. package/lib/grammar/propertyPaths.js.map +1 -1
  63. package/lib/grammar/queryUnit/queryUnit.d.ts +13 -17
  64. package/lib/grammar/queryUnit/queryUnit.js +195 -329
  65. package/lib/grammar/queryUnit/queryUnit.js.map +1 -1
  66. package/lib/grammar/solutionModifier.d.ts +12 -11
  67. package/lib/grammar/solutionModifier.js +125 -109
  68. package/lib/grammar/solutionModifier.js.map +1 -1
  69. package/lib/grammar/tripleBlock.d.ts +24 -33
  70. package/lib/grammar/tripleBlock.js +172 -126
  71. package/lib/grammar/tripleBlock.js.map +1 -1
  72. package/lib/grammar/updateUnit/updateUnit.d.ts +28 -33
  73. package/lib/grammar/updateUnit/updateUnit.js +282 -367
  74. package/lib/grammar/updateUnit/updateUnit.js.map +1 -1
  75. package/lib/grammar/whereClause.d.ts +20 -19
  76. package/lib/grammar/whereClause.js +232 -245
  77. package/lib/grammar/whereClause.js.map +1 -1
  78. package/lib/grammar-helpers/utils.d.ts +0 -4
  79. package/lib/grammar-helpers/utils.js +0 -37
  80. package/lib/grammar-helpers/utils.js.map +1 -1
  81. package/lib/index.cjs +3061 -2438
  82. package/lib/index.d.ts +4 -2
  83. package/lib/index.js +4 -2
  84. package/lib/index.js.map +1 -1
  85. package/lib/lexer/lexer.d.ts +4 -3
  86. package/lib/lexer/lexer.js +11 -7
  87. package/lib/lexer/lexer.js.map +1 -1
  88. package/lib/lexer/terminals.d.ts +0 -34
  89. package/lib/lexer/terminals.js +35 -37
  90. package/lib/lexer/terminals.js.map +1 -1
  91. package/lib/utils.d.ts +0 -3
  92. package/lib/utils.js +0 -6
  93. package/lib/utils.js.map +1 -1
  94. package/lib/validation/validators.d.ts +14 -0
  95. package/lib/validation/validators.js +235 -0
  96. package/lib/validation/validators.js.map +1 -0
  97. package/package.json +6 -8
  98. package/lib/Wildcard.d.ts +0 -9
  99. package/lib/Wildcard.js +0 -19
  100. package/lib/Wildcard.js.map +0 -1
@@ -1,5 +1,7 @@
1
1
  import { unCapitalize } from '@traqula/core';
2
2
  import * as l from '../../lexer';
3
+ import { updateNoReuseBlankNodeLabels } from '../../validation/validators';
4
+ import { usingClauseStar } from '../dataSetClause';
3
5
  import { prologue, varOrIri, varOrTerm } from '../general';
4
6
  import { iri } from '../literals';
5
7
  import { triplesBlock, triplesTemplate } from '../tripleBlock';
@@ -9,50 +11,50 @@ import { groupGraphPattern } from '../whereClause';
9
11
  */
10
12
  export const updateUnit = {
11
13
  name: 'updateUnit',
12
- impl: ({ ACTION, SUBRULE }) => () => {
13
- const data = SUBRULE(update, undefined);
14
- ACTION(() => data.updates.reverse());
15
- return data;
16
- },
14
+ impl: ({ SUBRULE }) => () => SUBRULE(update, undefined),
17
15
  };
18
16
  /**
19
17
  * [[29]](https://www.w3.org/TR/sparql11-query/#rUpdate)
20
18
  */
21
19
  export const update = {
22
20
  name: 'update',
23
- impl: ({ ACTION, SUBRULE, SUBRULE1, SUBRULE2, CONSUME, OPTION1, MANY }) => () => {
21
+ impl: ({ ACTION, SUBRULE, SUBRULE1, SUBRULE2, CONSUME, OPTION1, MANY }) => (C) => {
22
+ // Override prologueValues on new reads of prologue and sink them into updates later
23
+ const updates = [];
24
24
  const prologueValues = SUBRULE1(prologue, undefined);
25
- const result = {
26
- type: 'update',
27
- base: prologueValues.base,
28
- prefixes: prologueValues.prefixes,
29
- updates: [],
30
- };
25
+ updates.push({ context: prologueValues });
31
26
  let parsedSemi = true;
32
27
  MANY({
33
28
  GATE: () => parsedSemi,
34
29
  DEF: () => {
35
- const updateOperation = SUBRULE(update1, undefined);
36
- result.updates.push(updateOperation);
30
+ parsedSemi = false;
31
+ updates.at(-1).operation = SUBRULE(update1, undefined);
37
32
  OPTION1(() => {
38
33
  CONSUME(l.symbols.semi);
39
34
  parsedSemi = true;
40
- SUBRULE2(prologue, undefined);
41
- ACTION(() => {
42
- result.base = prologueValues.base ?? result.base;
43
- result.prefixes = prologueValues.prefixes ?
44
- { ...result.prefixes, ...prologueValues.prefixes } :
45
- result.prefixes;
46
- });
35
+ const innerPrologue = SUBRULE2(prologue, undefined);
36
+ updates.push({ context: innerPrologue });
47
37
  });
48
38
  },
49
39
  });
50
- return result;
40
+ return ACTION(() => {
41
+ const update = {
42
+ type: 'update',
43
+ updates,
44
+ loc: C.factory.sourceLocation(...updates[0].context, updates[0].operation, ...updates.at(-1).context, updates.at(-1)?.operation),
45
+ };
46
+ updateNoReuseBlankNodeLabels(update);
47
+ return update;
48
+ });
51
49
  },
52
- gImpl: ({ SUBRULE }) => (ast) => {
53
- const prologueString = SUBRULE(prologue, ast, undefined);
54
- const updates = ast.updates.map(update => SUBRULE(update1, update, undefined)).join(' ;\n');
55
- return `${prologueString} ${updates}`;
50
+ gImpl: ({ SUBRULE, PRINT_WORD }) => (ast, { factory: F }) => {
51
+ for (const update of ast.updates) {
52
+ SUBRULE(prologue, update.context, undefined);
53
+ if (update.operation) {
54
+ SUBRULE(update1, update.operation, undefined);
55
+ F.printFilter(ast, () => PRINT_WORD(' ;\n'));
56
+ }
57
+ }
56
58
  },
57
59
  };
58
60
  /**
@@ -74,35 +76,40 @@ export const update1 = {
74
76
  { ALT: () => SUBRULE(modify, undefined) },
75
77
  ]),
76
78
  gImpl: ({ SUBRULE }) => (ast) => {
77
- if ('type' in ast) {
78
- // ManagementOperation
79
- switch (ast.type) {
80
- case 'load':
81
- return SUBRULE(load, ast, undefined);
82
- case 'clear':
83
- return SUBRULE(clear, ast, undefined);
84
- case 'drop':
85
- return SUBRULE(drop, ast, undefined);
86
- case 'add':
87
- return SUBRULE(add, ast, undefined);
88
- case 'move':
89
- return SUBRULE(move, ast, undefined);
90
- case 'copy':
91
- return SUBRULE(copy, ast, undefined);
92
- case 'create':
93
- return SUBRULE(create, ast, undefined);
94
- }
95
- }
96
- // InsertDeleteOperation
97
- switch (ast.updateType) {
98
- case 'insert':
99
- return SUBRULE(insertData, ast, undefined);
100
- case 'delete':
101
- return SUBRULE(deleteData, ast, undefined);
102
- case 'deletewhere':
103
- return SUBRULE(deleteWhere, ast, undefined);
104
- case 'insertdelete':
105
- return SUBRULE(modify, ast, undefined);
79
+ switch (ast.subType) {
80
+ case ('load'):
81
+ SUBRULE(load, ast, undefined);
82
+ break;
83
+ case ('clear'):
84
+ SUBRULE(clear, ast, undefined);
85
+ break;
86
+ case ('drop'):
87
+ SUBRULE(drop, ast, undefined);
88
+ break;
89
+ case ('add'):
90
+ SUBRULE(add, ast, undefined);
91
+ break;
92
+ case ('move'):
93
+ SUBRULE(move, ast, undefined);
94
+ break;
95
+ case ('copy'):
96
+ SUBRULE(copy, ast, undefined);
97
+ break;
98
+ case ('create'):
99
+ SUBRULE(create, ast, undefined);
100
+ break;
101
+ case ('insertdata'):
102
+ SUBRULE(insertData, ast, undefined);
103
+ break;
104
+ case ('deletedata'):
105
+ SUBRULE(deleteData, ast, undefined);
106
+ break;
107
+ case ('deletewhere'):
108
+ SUBRULE(deleteWhere, ast, undefined);
109
+ break;
110
+ case ('modify'):
111
+ SUBRULE(modify, ast, undefined);
112
+ break;
106
113
  }
107
114
  },
108
115
  };
@@ -111,132 +118,100 @@ export const update1 = {
111
118
  */
112
119
  export const load = {
113
120
  name: 'load',
114
- impl: ({ SUBRULE, CONSUME, OPTION1, OPTION2 }) => () => {
115
- CONSUME(l.load);
116
- const silent = Boolean(OPTION1(() => CONSUME(l.silent)));
117
- const source = SUBRULE(iri, undefined);
121
+ impl: ({ ACTION, SUBRULE1, CONSUME, OPTION1, OPTION2 }) => (C) => {
122
+ const loadToken = CONSUME(l.load);
123
+ const silent = OPTION1(() => CONSUME(l.silent));
124
+ const source = SUBRULE1(iri, undefined);
118
125
  const destination = OPTION2(() => {
119
126
  CONSUME(l.loadInto);
120
- return SUBRULE(graphRef, undefined);
127
+ return SUBRULE1(graphRef, undefined);
121
128
  });
122
- return {
123
- type: 'load',
124
- silent,
125
- source,
126
- ...(destination && { destination }),
127
- };
129
+ return ACTION(() => C.factory.updateOperationLoad(C.factory.sourceLocation(loadToken, source, destination), source, Boolean(silent), destination));
128
130
  },
129
- gImpl: ({ SUBRULE }) => (ast) => {
130
- const builder = ['LOAD'];
131
- if (ast.silent) {
132
- builder.push('SILENT');
133
- }
134
- builder.push(SUBRULE(iri, ast.source, undefined));
131
+ gImpl: ({ SUBRULE, PRINT_WORD }) => (ast, { factory: F }) => {
132
+ F.printFilter(ast, () => {
133
+ PRINT_WORD('LOAD');
134
+ if (ast.silent) {
135
+ PRINT_WORD('SILENT');
136
+ }
137
+ });
138
+ SUBRULE(iri, ast.source, undefined);
135
139
  if (ast.destination) {
136
- builder.push('INTO', SUBRULE(graphRef, ast.destination, undefined));
140
+ F.printFilter(ast, () => PRINT_WORD('INTO'));
141
+ SUBRULE(graphRefAll, ast.destination, undefined);
137
142
  }
138
- return builder.join(' ');
139
143
  },
140
144
  };
145
+ function clearOrDrop(operation) {
146
+ return {
147
+ name: unCapitalize(operation.name),
148
+ impl: ({ ACTION, SUBRULE1, CONSUME, OPTION }) => (C) => {
149
+ const opToken = CONSUME(operation);
150
+ const silent = OPTION(() => CONSUME(l.silent));
151
+ const destination = SUBRULE1(graphRefAll, undefined);
152
+ return ACTION(() => C.factory.updateOperationClearDrop(unCapitalize(operation.name), Boolean(silent), destination, C.factory.sourceLocation(opToken, destination)));
153
+ },
154
+ gImpl: ({ SUBRULE, PRINT_WORD }) => (ast, { factory: F }) => {
155
+ F.printFilter(ast, () => {
156
+ PRINT_WORD(operation.name.toUpperCase());
157
+ if (ast.silent) {
158
+ PRINT_WORD('SILENT');
159
+ }
160
+ });
161
+ SUBRULE(graphRefAll, ast.destination, undefined);
162
+ },
163
+ };
164
+ }
141
165
  /**
142
166
  * [[32]](https://www.w3.org/TR/sparql11-query/#rClear)
143
167
  */
144
- export const clear = {
145
- name: 'clear',
146
- impl: ({ SUBRULE, CONSUME, OPTION }) => () => {
147
- CONSUME(l.clear);
148
- const silent = Boolean(OPTION(() => CONSUME(l.silent)));
149
- const graph = SUBRULE(graphRefAll, undefined);
150
- return {
151
- type: 'clear',
152
- silent,
153
- graph,
154
- };
155
- },
156
- gImpl: ({ SUBRULE }) => (ast) => {
157
- const builder = ['CLEAR'];
158
- if (ast.silent) {
159
- builder.push('SILENT');
160
- }
161
- builder.push(SUBRULE(graphRefAll, ast.graph, undefined));
162
- return builder.join(' ');
163
- },
164
- };
168
+ export const clear = clearOrDrop(l.clear);
165
169
  /**
166
170
  * [[33]](https://www.w3.org/TR/sparql11-query/#rDrop)
167
171
  */
168
- export const drop = {
169
- name: 'drop',
170
- impl: ({ SUBRULE, CONSUME, OPTION }) => () => {
171
- CONSUME(l.drop);
172
- const silent = Boolean(OPTION(() => CONSUME(l.silent)));
173
- const graph = SUBRULE(graphRefAll, undefined);
174
- return {
175
- type: 'drop',
176
- silent,
177
- graph,
178
- };
179
- },
180
- gImpl: ({ SUBRULE }) => (ast) => {
181
- const builder = ['DROP'];
182
- if (ast.silent) {
183
- builder.push('SILENT');
184
- }
185
- builder.push(SUBRULE(graphRefAll, ast.graph, undefined));
186
- return builder.join(' ');
187
- },
188
- };
172
+ export const drop = clearOrDrop(l.drop);
189
173
  /**
190
174
  * [[34]](https://www.w3.org/TR/sparql11-query/#rCreate)
191
175
  */
192
176
  export const create = {
193
177
  name: 'create',
194
- impl: ({ SUBRULE, CONSUME, OPTION }) => () => {
195
- CONSUME(l.create);
196
- const silent = Boolean(OPTION(() => CONSUME(l.silent)));
197
- const graph = SUBRULE(graphRef, undefined);
198
- return {
199
- type: 'create',
200
- silent,
201
- graph: {
202
- type: 'graph',
203
- name: graph,
204
- },
205
- };
178
+ impl: ({ ACTION, SUBRULE1, CONSUME, OPTION }) => (C) => {
179
+ const createToken = CONSUME(l.create);
180
+ const silent = OPTION(() => CONSUME(l.silent));
181
+ const destination = SUBRULE1(graphRef, undefined);
182
+ return ACTION(() => C.factory.updateOperationCreate(destination, Boolean(silent), C.factory.sourceLocation(createToken, destination)));
206
183
  },
207
- gImpl: ({ SUBRULE }) => (ast) => {
208
- const builder = ['CREATE'];
209
- if (ast.silent) {
210
- builder.push('SILENT');
211
- }
212
- builder.push(SUBRULE(graphRef, ast.graph.name, undefined));
213
- return builder.join(' ');
184
+ gImpl: ({ SUBRULE, PRINT_WORD }) => (ast, { factory: F }) => {
185
+ F.printFilter(ast, () => {
186
+ PRINT_WORD('CREATE');
187
+ if (ast.silent) {
188
+ PRINT_WORD('SILENT');
189
+ }
190
+ });
191
+ SUBRULE(graphRefAll, ast.destination, undefined);
214
192
  },
215
193
  };
216
194
  function copyMoveAddOperation(operation) {
217
195
  return {
218
196
  name: unCapitalize(operation.name),
219
- impl: ({ CONSUME, SUBRULE1, SUBRULE2, OPTION }) => () => {
220
- CONSUME(operation);
221
- const silent = Boolean(OPTION(() => CONSUME(l.silent)));
197
+ impl: ({ ACTION, CONSUME, SUBRULE1, SUBRULE2, OPTION }) => (C) => {
198
+ const op = CONSUME(operation);
199
+ const silent = OPTION(() => CONSUME(l.silent));
222
200
  const source = SUBRULE1(graphOrDefault, undefined);
223
201
  CONSUME(l.to);
224
202
  const destination = SUBRULE2(graphOrDefault, undefined);
225
- return {
226
- type: unCapitalize(operation.name),
227
- silent,
228
- source,
229
- destination,
230
- };
203
+ return ACTION(() => C.factory.updateOperationAddMoveCopy(unCapitalize(operation.name), source, destination, Boolean(silent), C.factory.sourceLocation(op, destination)));
231
204
  },
232
- gImpl: ({ SUBRULE }) => (ast) => {
233
- const builder = [operation.name.toUpperCase()];
234
- if (ast.silent) {
235
- builder.push('SILENT');
236
- }
237
- builder.push(SUBRULE(graphOrDefault, ast.source, undefined));
238
- builder.push('TO', SUBRULE(graphOrDefault, ast.destination, undefined));
239
- return builder.join(' ');
205
+ gImpl: ({ SUBRULE, PRINT_WORD }) => (ast, { factory: F }) => {
206
+ F.printFilter(ast, () => {
207
+ PRINT_WORD(operation.name.toUpperCase());
208
+ if (ast.silent) {
209
+ PRINT_WORD('SILENT');
210
+ }
211
+ });
212
+ SUBRULE(graphRefAll, ast.source, undefined);
213
+ F.printFilter(ast, () => PRINT_WORD('TO'));
214
+ SUBRULE(graphRefAll, ast.destination, undefined);
240
215
  },
241
216
  };
242
217
  }
@@ -253,124 +228,113 @@ export const move = copyMoveAddOperation(l.move);
253
228
  */
254
229
  export const copy = copyMoveAddOperation(l.copy);
255
230
  /**
256
- * [[38]](https://www.w3.org/TR/sparql11-query/#rInsertData)
231
+ * [[48]](https://www.w3.org/TR/sparql11-query/#rQuadPattern)
257
232
  */
258
- export const insertData = {
259
- name: 'insertData',
260
- impl: ({ SUBRULE, CONSUME }) => () => {
261
- CONSUME(l.insertClause);
262
- CONSUME(l.dataClause);
263
- const insert = SUBRULE(quadData, undefined);
264
- return {
265
- updateType: 'insert',
266
- insert,
267
- };
233
+ export const quadPattern = {
234
+ name: 'quadPattern',
235
+ impl: ({ ACTION, SUBRULE1, CONSUME }) => (C) => {
236
+ const open = CONSUME(l.symbols.LCurly);
237
+ const val = SUBRULE1(quads, undefined);
238
+ const close = CONSUME(l.symbols.RCurly);
239
+ return ACTION(() => C.factory.wrap(val.val, C.factory.sourceLocation(open, close)));
268
240
  },
269
- gImpl: ({ SUBRULE }) => ast => `INSERT DATA ${SUBRULE(quadData, ast.insert, undefined)}`,
270
241
  };
271
242
  /**
272
- * [[39]](https://www.w3.org/TR/sparql11-query/#rDeleteData)
243
+ * [[49]](https://www.w3.org/TR/sparql11-query/#rQuadData)
273
244
  */
274
- export const deleteData = {
275
- name: 'deleteData',
276
- impl: ({ ACTION, SUBRULE, CONSUME }) => (C) => {
277
- CONSUME(l.deleteClause);
278
- CONSUME(l.dataClause);
279
- const couldCreateBlankNodes = ACTION(() => C.parseMode.delete('canCreateBlankNodes'));
280
- const del = SUBRULE(quadData, undefined);
281
- ACTION(() => couldCreateBlankNodes && C.parseMode.add('canCreateBlankNodes'));
282
- return {
283
- updateType: 'delete',
284
- delete: del,
285
- };
245
+ export const quadData = {
246
+ name: 'quadData',
247
+ impl: ({ ACTION, SUBRULE1, CONSUME }) => (C) => {
248
+ const open = CONSUME(l.symbols.LCurly);
249
+ const couldParseVars = ACTION(() => C.parseMode.delete('canParseVars'));
250
+ const val = SUBRULE1(quads, undefined);
251
+ ACTION(() => couldParseVars && C.parseMode.add('canParseVars'));
252
+ const close = CONSUME(l.symbols.RCurly);
253
+ return ACTION(() => C.factory.wrap(val.val, C.factory.sourceLocation(open, close)));
286
254
  },
287
- gImpl: ({ SUBRULE }) => ast => `DELETE DATA ${SUBRULE(quadData, ast.delete, undefined)}`,
288
255
  };
256
+ function insertDeleteDelWhere(name, subType, cons1, cons2, dataRule) {
257
+ return {
258
+ name,
259
+ impl: ({ ACTION, SUBRULE1, CONSUME }) => (C) => {
260
+ const insDelToken = CONSUME(cons1);
261
+ CONSUME(cons2);
262
+ let couldCreateBlankNodes = true;
263
+ if (name !== 'insertData') {
264
+ couldCreateBlankNodes = ACTION(() => C.parseMode.delete('canCreateBlankNodes'));
265
+ }
266
+ const data = SUBRULE1(dataRule, undefined);
267
+ if (name !== 'insertData') {
268
+ ACTION(() => couldCreateBlankNodes && C.parseMode.add('canCreateBlankNodes'));
269
+ }
270
+ return ACTION(() => C.factory.updateOperationInsDelDataWhere(subType, data.val, C.factory.sourceLocation(insDelToken, data)));
271
+ },
272
+ gImpl: ({ SUBRULE, PRINT_WORD }) => (ast, { factory: F }) => {
273
+ F.printFilter(ast, () => PRINT_WORD(subType === 'insertdata' ?
274
+ 'INSERT DATA' :
275
+ (subType === 'deletedata' ? 'DELETE DATA' : 'DELETE WHERE'), '{'));
276
+ SUBRULE(quads, F.wrap(ast.data, ast.loc), undefined);
277
+ F.printFilter(ast, () => PRINT_WORD('}'));
278
+ },
279
+ };
280
+ }
281
+ /**
282
+ * [[38]](https://www.w3.org/TR/sparql11-query/#rInsertData)
283
+ */
284
+ export const insertData = insertDeleteDelWhere('insertData', 'insertdata', l.insertClause, l.dataClause, quadData);
285
+ /**
286
+ * [[39]](https://www.w3.org/TR/sparql11-query/#rDeleteData)
287
+ */
288
+ export const deleteData = insertDeleteDelWhere('deleteData', 'deletedata', l.deleteClause, l.dataClause, quadData);
289
289
  /**
290
290
  * [[40]](https://www.w3.org/TR/sparql11-query/#rDeleteWhere)
291
291
  */
292
- export const deleteWhere = {
293
- name: 'deleteWhere',
294
- impl: ({ ACTION, SUBRULE, CONSUME }) => (C) => {
295
- CONSUME(l.deleteClause);
296
- CONSUME(l.where);
297
- const couldCreateBlankNodes = ACTION(() => C.parseMode.delete('canCreateBlankNodes'));
298
- const del = SUBRULE(quadPattern, undefined);
299
- ACTION(() => couldCreateBlankNodes && C.parseMode.add('canCreateBlankNodes'));
300
- return {
301
- updateType: 'deletewhere',
302
- delete: del,
303
- };
304
- },
305
- gImpl: ({ SUBRULE }) => ast => `DELETE WHERE ${SUBRULE(quadData, ast.delete, undefined)}`,
306
- };
292
+ export const deleteWhere = insertDeleteDelWhere('deleteWhere', 'deletewhere', l.deleteClause, l.where, quadPattern);
307
293
  /**
308
294
  * [[41]](https://www.w3.org/TR/sparql11-query/#rModify)
309
295
  */
310
296
  export const modify = {
311
297
  name: 'modify',
312
- impl: ({ ACTION, SUBRULE, CONSUME, MANY, SUBRULE1, SUBRULE2, OPTION1, OPTION2, OR }) => () => {
298
+ impl: ({ ACTION, CONSUME, SUBRULE1, SUBRULE2, OPTION1, OPTION2, OR }) => (C) => {
313
299
  const graph = OPTION1(() => {
314
- CONSUME(l.modifyWith);
315
- return SUBRULE(iri, undefined);
300
+ const withToken = CONSUME(l.modifyWith);
301
+ const graph = SUBRULE1(iri, undefined);
302
+ return { withToken, graph };
316
303
  });
317
- const { insert, delete: del } = OR([
318
- {
319
- ALT: () => {
320
- const del = SUBRULE(deleteClause, undefined);
321
- const insert = OPTION2(() => SUBRULE1(insertClause, undefined)) ?? [];
322
- return { delete: del, insert };
323
- },
324
- },
304
+ const { insert, del } = OR([
305
+ { ALT: () => {
306
+ const del = SUBRULE1(deleteClause, undefined);
307
+ const insert = OPTION2(() => SUBRULE1(insertClause, undefined));
308
+ return { del, insert };
309
+ } },
325
310
  { ALT: () => {
326
311
  const insert = SUBRULE2(insertClause, undefined);
327
- return { insert, delete: [] };
312
+ return { insert, del: undefined };
328
313
  } },
329
314
  ]);
330
- const usingArr = [];
331
- MANY(() => {
332
- usingArr.push(SUBRULE(usingClause, undefined));
333
- });
315
+ const using = SUBRULE1(usingClauseStar, undefined);
334
316
  CONSUME(l.where);
335
- const where = SUBRULE(groupGraphPattern, undefined);
336
- return ACTION(() => {
337
- const def = [];
338
- const named = [];
339
- for (const { value, type } of usingArr) {
340
- if (type === 'default') {
341
- def.push(value);
342
- }
343
- else {
344
- named.push(value);
345
- }
346
- }
347
- return {
348
- updateType: 'insertdelete',
349
- graph,
350
- insert,
351
- delete: del,
352
- using: usingArr.length > 0 ? { default: def, named } : undefined,
353
- where: where.patterns,
354
- };
355
- });
317
+ const where = SUBRULE1(groupGraphPattern, undefined);
318
+ return ACTION(() => C.factory.updateOperationModify(C.factory.sourceLocation(graph?.withToken, del, insert, where), insert?.val ?? [], del?.val ?? [], where, using, graph?.graph));
356
319
  },
357
- gImpl: ({ SUBRULE }) => (ast) => {
358
- const builder = [];
320
+ gImpl: ({ SUBRULE, PRINT_WORD }) => (ast, { factory: F }) => {
359
321
  if (ast.graph) {
360
- builder.push(`WITH ${SUBRULE(iri, ast.graph, undefined)}`);
322
+ F.printFilter(ast, () => PRINT_WORD('WITH'));
323
+ SUBRULE(iri, ast.graph, undefined);
361
324
  }
362
325
  if (ast.delete.length > 0) {
363
- builder.push(`DELETE ${SUBRULE(quadData, ast.delete, undefined)}`);
326
+ F.printFilter(ast, () => PRINT_WORD('DELETE', '{'));
327
+ SUBRULE(quads, F.wrap(ast.delete, ast.loc), undefined);
328
+ F.printFilter(ast, () => PRINT_WORD('}'));
364
329
  }
365
330
  if (ast.insert.length > 0) {
366
- builder.push(`INSERT ${SUBRULE(quadData, ast.insert, undefined)}`);
367
- }
368
- if (ast.using) {
369
- builder.push(...ast.using.default.map(val => `USING ${SUBRULE(iri, val, undefined)}`));
370
- builder.push(...ast.using.named.map(val => `USING NAMED ${SUBRULE(iri, val, undefined)}`));
331
+ F.printFilter(ast, () => PRINT_WORD('INSERT', '{'));
332
+ SUBRULE(quads, F.wrap(ast.insert, ast.loc), undefined);
333
+ F.printFilter(ast, () => PRINT_WORD('}'));
371
334
  }
372
- builder.push('WHERE', SUBRULE(groupGraphPattern, { type: 'group', patterns: ast.where }, undefined));
373
- return builder.join(' ');
335
+ SUBRULE(usingClauseStar, ast.from, undefined);
336
+ F.printFilter(ast, () => PRINT_WORD('WHERE'));
337
+ SUBRULE(groupGraphPattern, ast.where, undefined);
374
338
  },
375
339
  };
376
340
  /**
@@ -379,11 +343,11 @@ export const modify = {
379
343
  export const deleteClause = {
380
344
  name: 'deleteClause',
381
345
  impl: ({ ACTION, SUBRULE, CONSUME }) => (C) => {
382
- CONSUME(l.deleteClause);
346
+ const delToken = CONSUME(l.deleteClause);
383
347
  const couldCreateBlankNodes = ACTION(() => C.parseMode.delete('canCreateBlankNodes'));
384
348
  const del = SUBRULE(quadPattern, undefined);
385
349
  ACTION(() => couldCreateBlankNodes && C.parseMode.add('canCreateBlankNodes'));
386
- return del;
350
+ return ACTION(() => C.factory.wrap(del.val, C.factory.sourceLocation(delToken, del)));
387
351
  },
388
352
  };
389
353
  /**
@@ -391,31 +355,10 @@ export const deleteClause = {
391
355
  */
392
356
  export const insertClause = {
393
357
  name: 'insertClause',
394
- impl: ({ SUBRULE, CONSUME }) => () => {
395
- CONSUME(l.insertClause);
396
- return SUBRULE(quadPattern, undefined);
397
- },
398
- };
399
- /**
400
- * [[44]](https://www.w3.org/TR/sparql11-query/#rUsingClause)
401
- */
402
- export const usingClause = {
403
- name: 'usingClause',
404
- impl: ({ CONSUME, SUBRULE1, SUBRULE2, OR }) => () => {
405
- CONSUME(l.usingClause);
406
- return OR([
407
- { ALT: () => {
408
- const value = SUBRULE1(iri, undefined);
409
- return { value, type: 'default' };
410
- } },
411
- {
412
- ALT: () => {
413
- CONSUME(l.graph.named);
414
- const value = SUBRULE2(iri, undefined);
415
- return { value, type: 'named' };
416
- },
417
- },
418
- ]);
358
+ impl: ({ ACTION, SUBRULE, CONSUME }) => (C) => {
359
+ const insertToken = CONSUME(l.insertClause);
360
+ const insert = SUBRULE(quadPattern, undefined);
361
+ return ACTION(() => C.factory.wrap(insert.val, C.factory.sourceLocation(insertToken, insert)));
419
362
  },
420
363
  };
421
364
  /**
@@ -423,156 +366,128 @@ export const usingClause = {
423
366
  */
424
367
  export const graphOrDefault = {
425
368
  name: 'graphOrDefault',
426
- impl: ({ SUBRULE, CONSUME, OPTION, OR }) => () => OR([
369
+ impl: ({ ACTION, SUBRULE1, CONSUME, OPTION, OR }) => C => OR([
427
370
  { ALT: () => {
428
- CONSUME(l.graph.default_);
429
- return { type: 'graph', default: true };
371
+ const def = CONSUME(l.graph.default_);
372
+ return ACTION(() => C.factory.graphRefDefault(C.factory.sourceLocation(def)));
373
+ } },
374
+ { ALT: () => {
375
+ const graph = OPTION(() => CONSUME(l.graph.graph));
376
+ const name = SUBRULE1(iri, undefined);
377
+ return ACTION(() => C.factory.graphRefSpecific(name, C.factory.sourceLocation(graph, name)));
430
378
  } },
431
- {
432
- ALT: () => {
433
- OPTION(() => CONSUME(l.graph.graph));
434
- const name = SUBRULE(iri, undefined);
435
- return {
436
- type: 'graph',
437
- name,
438
- };
439
- },
440
- },
441
379
  ]),
442
- gImpl: ({ SUBRULE }) => (ast) => {
443
- if (ast.default) {
444
- return 'DEFAULT';
445
- }
446
- return SUBRULE(iri, ast.name, undefined);
447
- },
448
380
  };
449
381
  /**
450
382
  * [[46]](https://www.w3.org/TR/sparql11-query/#rGraphRef)
451
383
  */
452
384
  export const graphRef = {
453
385
  name: 'graphRef',
454
- impl: ({ SUBRULE, CONSUME }) => () => {
455
- CONSUME(l.graph.graph);
456
- return SUBRULE(iri, undefined);
386
+ impl: ({ ACTION, SUBRULE, CONSUME }) => (C) => {
387
+ const graph = CONSUME(l.graph.graph);
388
+ const val = SUBRULE(iri, undefined);
389
+ return ACTION(() => C.factory.graphRefSpecific(val, C.factory.sourceLocation(graph, val)));
390
+ },
391
+ gImpl: ({ SUBRULE, PRINT_WORD }) => (ast, { factory: F }) => {
392
+ F.printFilter(ast, () => PRINT_WORD('GRAPH'));
393
+ SUBRULE(iri, ast.graph, undefined);
457
394
  },
458
- gImpl: ({ SUBRULE }) => ast => `GRAPH ${SUBRULE(iri, ast, undefined)}`,
459
395
  };
460
396
  /**
461
397
  * [[47]](https://www.w3.org/TR/sparql11-query/#rGraphRefAll)
462
398
  */
463
399
  export const graphRefAll = {
464
400
  name: 'graphRefAll',
465
- impl: ({ SUBRULE, CONSUME, OR }) => () => OR([
401
+ impl: ({ ACTION, SUBRULE, CONSUME, OR }) => C => OR([
402
+ { ALT: () => SUBRULE(graphRef, undefined) },
466
403
  { ALT: () => {
467
- const name = SUBRULE(graphRef, undefined);
468
- return { type: 'graph', name };
404
+ const def = CONSUME(l.graph.default_);
405
+ return ACTION(() => C.factory.graphRefDefault(C.factory.sourceLocation(def)));
469
406
  } },
470
407
  { ALT: () => {
471
- CONSUME(l.graph.default_);
472
- return { default: true };
408
+ const named = CONSUME(l.graph.named);
409
+ return ACTION(() => C.factory.graphRefNamed(C.factory.sourceLocation(named)));
473
410
  } },
474
411
  { ALT: () => {
475
- CONSUME(l.graph.named);
476
- return { named: true };
477
- } },
478
- { ALT: () => {
479
- CONSUME(l.graph.graphAll);
480
- return { all: true };
412
+ const graphAll = CONSUME(l.graph.graphAll);
413
+ return ACTION(() => C.factory.graphRefAll(C.factory.sourceLocation(graphAll)));
481
414
  } },
482
415
  ]),
483
- gImpl: ({ SUBRULE }) => (ast) => {
484
- if (ast.all) {
485
- return 'ALL';
416
+ gImpl: ({ SUBRULE, PRINT_WORD }) => (ast, { factory: F }) => {
417
+ if (F.isGraphRefSpecific(ast)) {
418
+ SUBRULE(graphRef, ast, undefined);
486
419
  }
487
- if (ast.default) {
488
- return 'DEFAULT';
420
+ else if (F.isGraphRefDefault(ast)) {
421
+ F.printFilter(ast, () => PRINT_WORD('DEFAULT'));
489
422
  }
490
- if (ast.named) {
491
- return 'NAMED';
423
+ else if (F.isGraphRefNamed(ast)) {
424
+ F.printFilter(ast, () => PRINT_WORD('NAMED'));
425
+ }
426
+ else if (F.isGraphRefAll(ast)) {
427
+ F.printFilter(ast, () => PRINT_WORD('ALL'));
492
428
  }
493
- return SUBRULE(graphRef, ast.name, undefined);
494
- },
495
- };
496
- /**
497
- * [[48]](https://www.w3.org/TR/sparql11-query/#rQuadPattern)
498
- */
499
- export const quadPattern = {
500
- name: 'quadPattern',
501
- impl: ({ SUBRULE, CONSUME }) => () => {
502
- CONSUME(l.symbols.LCurly);
503
- const val = SUBRULE(quads, undefined);
504
- CONSUME(l.symbols.RCurly);
505
- return val;
506
- },
507
- };
508
- /**
509
- * [[49]](https://www.w3.org/TR/sparql11-query/#rQuadData)
510
- */
511
- export const quadData = {
512
- name: 'quadData',
513
- impl: ({ ACTION, SUBRULE, CONSUME }) => (C) => {
514
- CONSUME(l.symbols.LCurly);
515
- const couldParseVars = ACTION(() => C.parseMode.delete('canParseVars'));
516
- const val = SUBRULE(quads, undefined);
517
- ACTION(() => couldParseVars && C.parseMode.add('canParseVars'));
518
- CONSUME(l.symbols.RCurly);
519
- return val;
520
429
  },
521
- gImpl: ({ SUBRULE }) => ast => `{ ${SUBRULE(quads, ast, undefined)} }`,
522
430
  };
523
431
  /**
524
432
  * [[50]](https://www.w3.org/TR/sparql11-query/#rQuads)
525
433
  */
526
434
  export const quads = {
527
435
  name: 'quads',
528
- impl: ({ SUBRULE, CONSUME, MANY, SUBRULE1, SUBRULE2, OPTION1, OPTION2, OPTION3 }) => () => {
436
+ impl: ({ ACTION, SUBRULE, CONSUME, MANY, SUBRULE1, SUBRULE2, OPTION1, OPTION2, OPTION3 }) => (C) => {
529
437
  const quads = [];
438
+ let last;
530
439
  OPTION1(() => {
531
440
  const triples = SUBRULE1(triplesTemplate, undefined);
532
- quads.push({
533
- type: 'bgp',
534
- triples,
535
- });
441
+ last = triples;
442
+ ACTION(() => quads.push(triples));
536
443
  });
537
444
  MANY(() => {
538
- quads.push(SUBRULE(quadsNotTriples, undefined));
539
- OPTION2(() => CONSUME(l.symbols.dot));
445
+ const notTriples = SUBRULE(quadsNotTriples, undefined);
446
+ last = notTriples;
447
+ quads.push(notTriples);
448
+ OPTION2(() => {
449
+ const dotToken = CONSUME(l.symbols.dot);
450
+ last = dotToken;
451
+ return dotToken;
452
+ });
540
453
  OPTION3(() => {
541
454
  const triples = SUBRULE2(triplesTemplate, undefined);
542
- quads.push({
543
- type: 'bgp',
544
- triples,
545
- });
455
+ last = triples;
456
+ ACTION(() => quads.push(triples));
546
457
  });
547
458
  });
548
- return quads;
459
+ return ACTION(() => C.factory.wrap(quads, C.factory.sourceLocation(quads.at(0), last)));
549
460
  },
550
- gImpl: ({ SUBRULE }) => ast => ast.map((quad) => {
551
- if (quad.type === 'bgp') {
552
- return SUBRULE(triplesBlock, quad, undefined);
461
+ gImpl: ({ SUBRULE }) => (ast, { factory: F }) => {
462
+ for (const quad of ast.val) {
463
+ if (F.isPattern(quad)) {
464
+ SUBRULE(triplesBlock, quad, undefined);
465
+ }
466
+ else {
467
+ SUBRULE(quadsNotTriples, quad, undefined);
468
+ }
553
469
  }
554
- return SUBRULE(quadsNotTriples, quad, undefined);
555
- }).join(' '),
470
+ },
556
471
  };
557
472
  /**
558
473
  * [[51]](https://www.w3.org/TR/sparql11-query/#rQuadsNotTriples)
559
474
  */
560
475
  export const quadsNotTriples = {
561
476
  name: 'quadsNotTriples',
562
- impl: ({ SUBRULE, CONSUME, OPTION }) => () => {
563
- CONSUME(l.graph.graph);
564
- const name = SUBRULE(varOrIri, undefined);
477
+ impl: ({ ACTION, SUBRULE1, CONSUME, OPTION }) => (C) => {
478
+ const graph = CONSUME(l.graph.graph);
479
+ const name = SUBRULE1(varOrIri, undefined);
565
480
  CONSUME(l.symbols.LCurly);
566
- const triples = OPTION(() => SUBRULE(triplesTemplate, undefined)) ?? [];
567
- CONSUME(l.symbols.RCurly);
568
- return {
569
- type: 'graph',
570
- name,
571
- triples,
572
- };
481
+ const triples = OPTION(() => SUBRULE1(triplesTemplate, undefined));
482
+ const close = CONSUME(l.symbols.RCurly);
483
+ return ACTION(() => C.factory.graphQuads(name, triples ?? C.factory.patternBgp([], C.factory.sourceLocationNoMaterialize()), C.factory.sourceLocation(graph, close)));
484
+ },
485
+ gImpl: ({ SUBRULE, PRINT_WORD }) => (ast, { factory: F }) => {
486
+ F.printFilter(ast, () => PRINT_WORD('GRAPH'));
487
+ SUBRULE(varOrTerm, ast.graph, undefined);
488
+ F.printFilter(ast, () => PRINT_WORD('{'));
489
+ SUBRULE(triplesBlock, ast.triples, undefined);
490
+ F.printFilter(ast, () => PRINT_WORD('}'));
573
491
  },
574
- gImpl: ({ SUBRULE }) => ast => `GRAPH ${SUBRULE(varOrTerm, ast.name, undefined)} {
575
- ${SUBRULE(triplesBlock, { ...ast, type: 'bgp' }, undefined)}
576
- }`,
577
492
  };
578
493
  //# sourceMappingURL=updateUnit.js.map