flowquery 1.0.14 → 1.0.16

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 (59) hide show
  1. package/.editorconfig +21 -0
  2. package/.husky/pre-commit +1 -0
  3. package/.prettierrc +22 -0
  4. package/dist/flowquery.min.js +1 -1
  5. package/dist/parsing/expressions/expression_map.d.ts +9 -0
  6. package/dist/parsing/expressions/expression_map.d.ts.map +1 -0
  7. package/dist/parsing/expressions/expression_map.js +24 -0
  8. package/dist/parsing/expressions/expression_map.js.map +1 -0
  9. package/dist/parsing/operations/call.d.ts +17 -0
  10. package/dist/parsing/operations/call.d.ts.map +1 -0
  11. package/dist/parsing/operations/call.js +105 -0
  12. package/dist/parsing/operations/call.js.map +1 -0
  13. package/dist/parsing/operations/load.d.ts +6 -6
  14. package/dist/parsing/operations/load.d.ts.map +1 -1
  15. package/dist/parsing/operations/load.js +8 -6
  16. package/dist/parsing/operations/load.js.map +1 -1
  17. package/dist/parsing/operations/operation.d.ts +1 -0
  18. package/dist/parsing/operations/operation.d.ts.map +1 -1
  19. package/dist/parsing/operations/operation.js +6 -5
  20. package/dist/parsing/operations/operation.js.map +1 -1
  21. package/dist/parsing/operations/projection.d.ts +1 -1
  22. package/dist/parsing/operations/projection.d.ts.map +1 -1
  23. package/dist/parsing/operations/projection.js.map +1 -1
  24. package/dist/parsing/parser.d.ts +1 -0
  25. package/dist/parsing/parser.d.ts.map +1 -1
  26. package/dist/parsing/parser.js +148 -99
  27. package/dist/parsing/parser.js.map +1 -1
  28. package/dist/parsing/token_to_node.d.ts +2 -2
  29. package/dist/parsing/token_to_node.d.ts.map +1 -1
  30. package/dist/parsing/token_to_node.js +12 -12
  31. package/dist/parsing/token_to_node.js.map +1 -1
  32. package/dist/tokenization/token.d.ts +5 -1
  33. package/dist/tokenization/token.d.ts.map +1 -1
  34. package/dist/tokenization/token.js +17 -5
  35. package/dist/tokenization/token.js.map +1 -1
  36. package/docs/flowquery.min.js +1 -1
  37. package/flowquery-vscode/flowQueryEngine/flowquery.min.js +1 -1
  38. package/misc/apps/RAG/package.json +1 -1
  39. package/misc/apps/RAG/src/plugins/loaders/CatFacts.ts +21 -26
  40. package/misc/apps/RAG/src/plugins/loaders/FetchJson.ts +65 -0
  41. package/misc/apps/RAG/src/plugins/loaders/Form.ts +163 -147
  42. package/misc/apps/RAG/src/plugins/loaders/Llm.ts +106 -92
  43. package/misc/apps/RAG/src/plugins/loaders/MockData.ts +80 -58
  44. package/misc/apps/RAG/src/plugins/loaders/Table.ts +106 -103
  45. package/misc/apps/RAG/src/plugins/loaders/Weather.ts +50 -38
  46. package/misc/apps/RAG/src/prompts/FlowQuerySystemPrompt.ts +77 -78
  47. package/package.json +12 -2
  48. package/src/parsing/expressions/expression_map.ts +22 -0
  49. package/src/parsing/operations/call.ts +69 -0
  50. package/src/parsing/operations/load.ts +123 -120
  51. package/src/parsing/operations/operation.ts +14 -13
  52. package/src/parsing/operations/projection.ts +3 -3
  53. package/src/parsing/parser.ts +303 -239
  54. package/src/parsing/token_to_node.ts +67 -50
  55. package/src/tokenization/token.ts +29 -14
  56. package/tests/compute/runner.test.ts +277 -165
  57. package/tests/parsing/parser.test.ts +352 -303
  58. package/tests/tokenization/tokenizer.test.ts +17 -17
  59. package/vscode-settings.json.recommended +16 -0
@@ -1,434 +1,483 @@
1
+ import AsyncFunction from "../../src/parsing/functions/async_function";
2
+ import { FunctionDef } from "../../src/parsing/functions/function_metadata";
1
3
  import Parser from "../../src/parsing/parser";
2
4
 
3
- test('Test Parser', () => {
5
+ // Test class for CALL operation parsing test - defined at module level for Prettier compatibility
6
+ @FunctionDef({
7
+ description: "Asynchronous function for testing CALL operation",
8
+ category: "async",
9
+ parameters: [],
10
+ output: { description: "Yields test values", type: "any" },
11
+ })
12
+ class Test extends AsyncFunction {
13
+ constructor() {
14
+ super();
15
+ this._expectedParameterCount = 0;
16
+ }
17
+ public async *generate(): AsyncGenerator<any> {
18
+ yield 1;
19
+ yield 2;
20
+ yield 3;
21
+ }
22
+ }
23
+
24
+ test("Test Parser", () => {
4
25
  const parser = new Parser();
5
- const ast = parser.parse('RETURN 1, 2, 3');
26
+ const ast = parser.parse("RETURN 1, 2, 3");
6
27
  expect(ast.print()).toBe(
7
- 'ASTNode\n' +
8
- '- Return\n' +
9
- '-- Expression\n' +
10
- '--- Number (1)\n' +
11
- '-- Expression\n' +
12
- '--- Number (2)\n' +
13
- '-- Expression\n' +
14
- '--- Number (3)'
28
+ "ASTNode\n" +
29
+ "- Return\n" +
30
+ "-- Expression\n" +
31
+ "--- Number (1)\n" +
32
+ "-- Expression\n" +
33
+ "--- Number (2)\n" +
34
+ "-- Expression\n" +
35
+ "--- Number (3)"
15
36
  );
16
37
  });
17
38
 
18
- test('Test Parser with function', () => {
39
+ test("Test Parser with function", () => {
19
40
  const parser = new Parser();
20
- const ast = parser.parse('RETURN rand()');
41
+ const ast = parser.parse("RETURN rand()");
21
42
  expect(ast.print()).toBe(
22
- 'ASTNode\n' +
23
- '- Return\n' +
24
- '-- Expression\n' +
25
- '--- Function (rand)'
43
+ "ASTNode\n" + "- Return\n" + "-- Expression\n" + "--- Function (rand)"
26
44
  );
27
45
  });
28
46
 
29
- test('Test Parser with associative array', () => {
47
+ test("Test Parser with associative array", () => {
30
48
  const parser = new Parser();
31
- const ast = parser.parse('RETURN {a: 1, b: 2}');
49
+ const ast = parser.parse("RETURN {a: 1, b: 2}");
32
50
  expect(ast.print()).toBe(
33
- 'ASTNode\n' +
34
- '- Return\n' +
35
- '-- Expression\n' +
36
- '--- AssociativeArray\n' +
37
- '---- KeyValuePair\n' +
38
- '----- String (a)\n' +
39
- '----- Expression\n' +
40
- '------ Number (1)\n' +
41
- '---- KeyValuePair\n' +
42
- '----- String (b)\n' +
43
- '----- Expression\n' +
44
- '------ Number (2)'
51
+ "ASTNode\n" +
52
+ "- Return\n" +
53
+ "-- Expression\n" +
54
+ "--- AssociativeArray\n" +
55
+ "---- KeyValuePair\n" +
56
+ "----- String (a)\n" +
57
+ "----- Expression\n" +
58
+ "------ Number (1)\n" +
59
+ "---- KeyValuePair\n" +
60
+ "----- String (b)\n" +
61
+ "----- Expression\n" +
62
+ "------ Number (2)"
45
63
  );
46
64
  });
47
65
 
48
- test('Test Parser with JSON array', () => {
66
+ test("Test Parser with JSON array", () => {
49
67
  const parser = new Parser();
50
- const ast = parser.parse('RETURN [1, 2]');
68
+ const ast = parser.parse("RETURN [1, 2]");
51
69
  expect(ast.print()).toBe(
52
- 'ASTNode\n' +
53
- '- Return\n' +
54
- '-- Expression\n' +
55
- '--- JSONArray\n' +
56
- '---- Expression\n' +
57
- '----- Number (1)\n' +
58
- '---- Expression\n' +
59
- '----- Number (2)'
70
+ "ASTNode\n" +
71
+ "- Return\n" +
72
+ "-- Expression\n" +
73
+ "--- JSONArray\n" +
74
+ "---- Expression\n" +
75
+ "----- Number (1)\n" +
76
+ "---- Expression\n" +
77
+ "----- Number (2)"
60
78
  );
61
79
  });
62
80
 
63
- test('Test Parser with nested associative array', () => {
81
+ test("Test Parser with nested associative array", () => {
64
82
  const parser = new Parser();
65
- const ast = parser.parse('RETURN {a:{}}');
83
+ const ast = parser.parse("RETURN {a:{}}");
66
84
  expect(ast.print()).toBe(
67
- 'ASTNode\n' +
68
- '- Return\n' +
69
- '-- Expression\n' +
70
- '--- AssociativeArray\n' +
71
- '---- KeyValuePair\n' +
72
- '----- String (a)\n' +
73
- '----- Expression\n' +
74
- '------ AssociativeArray'
85
+ "ASTNode\n" +
86
+ "- Return\n" +
87
+ "-- Expression\n" +
88
+ "--- AssociativeArray\n" +
89
+ "---- KeyValuePair\n" +
90
+ "----- String (a)\n" +
91
+ "----- Expression\n" +
92
+ "------ AssociativeArray"
75
93
  );
76
94
  });
77
95
 
78
- test('Test Parser with multiple operations', () => {
96
+ test("Test Parser with multiple operations", () => {
79
97
  const parser = new Parser();
80
- const ast = parser.parse('WITH 1 AS n RETURN n');
98
+ const ast = parser.parse("WITH 1 AS n RETURN n");
81
99
  expect(ast.print()).toBe(
82
- 'ASTNode\n' +
83
- '- With\n' +
84
- '-- Expression (n)\n' +
85
- '--- Number (1)\n' +
86
- '- Return\n' +
87
- '-- Expression (n)\n' +
88
- '--- Reference (n)'
100
+ "ASTNode\n" +
101
+ "- With\n" +
102
+ "-- Expression (n)\n" +
103
+ "--- Number (1)\n" +
104
+ "- Return\n" +
105
+ "-- Expression (n)\n" +
106
+ "--- Reference (n)"
89
107
  );
90
108
  });
91
109
 
92
- test('Test Parser with multiple operations and comments', () => {
110
+ test("Test Parser with multiple operations and comments", () => {
93
111
  const parser = new Parser();
94
- const ast = parser.parse('WITH 1 AS n /* comment */ RETURN n');
112
+ const ast = parser.parse("WITH 1 AS n /* comment */ RETURN n");
95
113
  expect(ast.print()).toBe(
96
- 'ASTNode\n' +
97
- '- With\n' +
98
- '-- Expression (n)\n' +
99
- '--- Number (1)\n' +
100
- '- Return\n' +
101
- '-- Expression (n)\n' +
102
- '--- Reference (n)'
114
+ "ASTNode\n" +
115
+ "- With\n" +
116
+ "-- Expression (n)\n" +
117
+ "--- Number (1)\n" +
118
+ "- Return\n" +
119
+ "-- Expression (n)\n" +
120
+ "--- Reference (n)"
103
121
  );
104
122
  });
105
123
 
106
- test('Test Parser with multiple operations including UNWIND', () => {
124
+ test("Test Parser with multiple operations including UNWIND", () => {
107
125
  const parser = new Parser();
108
- const ast = parser.parse('UNWIND [1, 2, 3] AS n RETURN n');
126
+ const ast = parser.parse("UNWIND [1, 2, 3] AS n RETURN n");
109
127
  expect(ast.print()).toBe(
110
- 'ASTNode\n' +
111
- '- Unwind\n' +
112
- '-- Expression (n)\n' +
113
- '--- JSONArray\n' +
114
- '---- Expression\n' +
115
- '----- Number (1)\n' +
116
- '---- Expression\n' +
117
- '----- Number (2)\n' +
118
- '---- Expression\n' +
119
- '----- Number (3)\n' +
120
- '- Return\n' +
121
- '-- Expression (n)\n' +
122
- '--- Reference (n)'
128
+ "ASTNode\n" +
129
+ "- Unwind\n" +
130
+ "-- Expression (n)\n" +
131
+ "--- JSONArray\n" +
132
+ "---- Expression\n" +
133
+ "----- Number (1)\n" +
134
+ "---- Expression\n" +
135
+ "----- Number (2)\n" +
136
+ "---- Expression\n" +
137
+ "----- Number (3)\n" +
138
+ "- Return\n" +
139
+ "-- Expression (n)\n" +
140
+ "--- Reference (n)"
123
141
  );
124
142
  });
125
143
 
126
- test('Test Unwind with invalid expression', () => {
144
+ test("Test Unwind with invalid expression", () => {
127
145
  const parser = new Parser();
128
- expect(() => parser.parse('UNWIND 1 AS n RETURN n')).toThrow('Expected array, function, reference, or lookup.');
146
+ expect(() => parser.parse("UNWIND 1 AS n RETURN n")).toThrow(
147
+ "Expected array, function, reference, or lookup."
148
+ );
129
149
  });
130
150
 
131
- test('Test Unwind with invalid alias', () => {
151
+ test("Test Unwind with invalid alias", () => {
132
152
  const parser = new Parser();
133
- expect(() => parser.parse('UNWIND [1, 2, 3] AS 1 RETURN n')).toThrow('Expected identifier');
153
+ expect(() => parser.parse("UNWIND [1, 2, 3] AS 1 RETURN n")).toThrow("Expected identifier");
134
154
  });
135
155
 
136
- test('Test Unwind with missing alias', () => {
156
+ test("Test Unwind with missing alias", () => {
137
157
  const parser = new Parser();
138
- expect(() => parser.parse('UNWIND [1, 2, 3] RETURN n')).toThrow('Expected alias');
158
+ expect(() => parser.parse("UNWIND [1, 2, 3] RETURN n")).toThrow("Expected alias");
139
159
  });
140
160
 
141
- test('Test statement with where clause', () => {
161
+ test("Test statement with where clause", () => {
142
162
  const parser = new Parser();
143
- const ast = parser.parse('with 1 as n where n > 0 return n');
163
+ const ast = parser.parse("with 1 as n where n > 0 return n");
144
164
  expect(ast.print()).toBe(
145
- 'ASTNode\n' +
146
- '- With\n' +
147
- '-- Expression (n)\n' +
148
- '--- Number (1)\n' +
149
- '- Where\n' +
150
- '-- Expression\n' +
151
- '--- GreaterThan\n' +
152
- '---- Reference (n)\n' +
153
- '---- Number (0)\n' +
154
- '- Return\n' +
155
- '-- Expression (n)\n' +
156
- '--- Reference (n)'
165
+ "ASTNode\n" +
166
+ "- With\n" +
167
+ "-- Expression (n)\n" +
168
+ "--- Number (1)\n" +
169
+ "- Where\n" +
170
+ "-- Expression\n" +
171
+ "--- GreaterThan\n" +
172
+ "---- Reference (n)\n" +
173
+ "---- Number (0)\n" +
174
+ "- Return\n" +
175
+ "-- Expression (n)\n" +
176
+ "--- Reference (n)"
157
177
  );
158
178
  });
159
179
 
160
- test('Test lookup', () => {
180
+ test("Test lookup", () => {
161
181
  const parser = new Parser();
162
- const ast = parser.parse('return {a: 1}.a');
182
+ const ast = parser.parse("return {a: 1}.a");
163
183
  expect(ast.print()).toBe(
164
- 'ASTNode\n' +
165
- '- Return\n' +
166
- '-- Expression\n' +
167
- '--- Lookup\n' +
168
- '---- Identifier (a)\n' +
169
- '---- AssociativeArray\n' +
170
- '----- KeyValuePair\n' +
171
- '------ String (a)\n' +
172
- '------ Expression\n' +
173
- '------- Number (1)'
184
+ "ASTNode\n" +
185
+ "- Return\n" +
186
+ "-- Expression\n" +
187
+ "--- Lookup\n" +
188
+ "---- Identifier (a)\n" +
189
+ "---- AssociativeArray\n" +
190
+ "----- KeyValuePair\n" +
191
+ "------ String (a)\n" +
192
+ "------ Expression\n" +
193
+ "------- Number (1)"
174
194
  );
175
195
  });
176
196
 
177
- test('Test lookup as part of expression', () => {
197
+ test("Test lookup as part of expression", () => {
178
198
  const parser = new Parser();
179
- const ast = parser.parse('return {a: 1}.a + 1');
199
+ const ast = parser.parse("return {a: 1}.a + 1");
180
200
  expect(ast.print()).toBe(
181
- 'ASTNode\n' +
182
- '- Return\n' +
183
- '-- Expression\n' +
184
- '--- Add\n' +
185
- '---- Lookup\n' +
186
- '----- Identifier (a)\n' +
187
- '----- AssociativeArray\n' +
188
- '------ KeyValuePair\n' +
189
- '------- String (a)\n' +
190
- '------- Expression\n' +
191
- '-------- Number (1)\n' +
192
- '---- Number (1)'
201
+ "ASTNode\n" +
202
+ "- Return\n" +
203
+ "-- Expression\n" +
204
+ "--- Add\n" +
205
+ "---- Lookup\n" +
206
+ "----- Identifier (a)\n" +
207
+ "----- AssociativeArray\n" +
208
+ "------ KeyValuePair\n" +
209
+ "------- String (a)\n" +
210
+ "------- Expression\n" +
211
+ "-------- Number (1)\n" +
212
+ "---- Number (1)"
193
213
  );
194
214
  });
195
215
 
196
- test('Test lookup with nested associative array', () => {
216
+ test("Test lookup with nested associative array", () => {
197
217
  const parser = new Parser();
198
- const ast = parser.parse('return {a: {b: 1}}.a.b');
218
+ const ast = parser.parse("return {a: {b: 1}}.a.b");
199
219
  const _return = ast.firstChild();
200
220
  expect(ast.print()).toBe(
201
- 'ASTNode\n' +
202
- '- Return\n' +
203
- '-- Expression\n' +
204
- '--- Lookup\n' +
205
- '---- Identifier (b)\n' +
206
- '---- Lookup\n' +
207
- '----- Identifier (a)\n' +
208
- '----- AssociativeArray\n' +
209
- '------ KeyValuePair\n' +
210
- '------- String (a)\n' +
211
- '------- Expression\n' +
212
- '-------- AssociativeArray\n' +
213
- '--------- KeyValuePair\n' +
214
- '---------- String (b)\n' +
215
- '---------- Expression\n' +
216
- '----------- Number (1)'
221
+ "ASTNode\n" +
222
+ "- Return\n" +
223
+ "-- Expression\n" +
224
+ "--- Lookup\n" +
225
+ "---- Identifier (b)\n" +
226
+ "---- Lookup\n" +
227
+ "----- Identifier (a)\n" +
228
+ "----- AssociativeArray\n" +
229
+ "------ KeyValuePair\n" +
230
+ "------- String (a)\n" +
231
+ "------- Expression\n" +
232
+ "-------- AssociativeArray\n" +
233
+ "--------- KeyValuePair\n" +
234
+ "---------- String (b)\n" +
235
+ "---------- Expression\n" +
236
+ "----------- Number (1)"
217
237
  );
218
238
  expect(_return.firstChild().value()).toBe(1);
219
239
  });
220
240
 
221
- test('Test lookup with JSON array', () => {
241
+ test("Test lookup with JSON array", () => {
222
242
  const parser = new Parser();
223
- const ast = parser.parse('return [1, 2][1]');
243
+ const ast = parser.parse("return [1, 2][1]");
224
244
  const _return = ast.firstChild();
225
245
  expect(ast.print()).toBe(
226
- 'ASTNode\n' +
227
- '- Return\n' +
228
- '-- Expression\n' +
229
- '--- Lookup\n' +
230
- '---- Expression\n' +
231
- '----- Number (1)\n' +
232
- '---- JSONArray\n' +
233
- '----- Expression\n' +
234
- '------ Number (1)\n' +
235
- '----- Expression\n' +
236
- '------ Number (2)'
246
+ "ASTNode\n" +
247
+ "- Return\n" +
248
+ "-- Expression\n" +
249
+ "--- Lookup\n" +
250
+ "---- Expression\n" +
251
+ "----- Number (1)\n" +
252
+ "---- JSONArray\n" +
253
+ "----- Expression\n" +
254
+ "------ Number (1)\n" +
255
+ "----- Expression\n" +
256
+ "------ Number (2)"
237
257
  );
238
258
  expect(_return.firstChild().value()).toBe(2);
239
259
  });
240
260
 
241
- test('Test load with post', () => {
261
+ test("Test load with post", () => {
242
262
  const parser = new Parser();
243
- const ast = parser.parse('load json from "https://jsonplaceholder.typicode.com/posts" post {userId: 1} as data return data');
263
+ const ast = parser.parse(
264
+ 'load json from "https://jsonplaceholder.typicode.com/posts" post {userId: 1} as data return data'
265
+ );
244
266
  expect(ast.print()).toBe(
245
- 'ASTNode\n' +
246
- '- Load\n' +
247
- '-- JSON\n' +
248
- '-- From\n' +
249
- '--- Expression\n' +
250
- '---- String (https://jsonplaceholder.typicode.com/posts)\n' +
251
- '-- Post\n' +
252
- '--- Expression\n' +
253
- '---- AssociativeArray\n' +
254
- '----- KeyValuePair\n' +
255
- '------ String (userId)\n' +
256
- '------ Expression\n' +
257
- '------- Number (1)\n' +
258
- '-- Alias (data)\n' +
259
- '- Return\n' +
260
- '-- Expression (data)\n' +
261
- '--- Reference (data)'
267
+ "ASTNode\n" +
268
+ "- Load\n" +
269
+ "-- JSON\n" +
270
+ "-- From\n" +
271
+ "--- Expression\n" +
272
+ "---- String (https://jsonplaceholder.typicode.com/posts)\n" +
273
+ "-- Post\n" +
274
+ "--- Expression\n" +
275
+ "---- AssociativeArray\n" +
276
+ "----- KeyValuePair\n" +
277
+ "------ String (userId)\n" +
278
+ "------ Expression\n" +
279
+ "------- Number (1)\n" +
280
+ "-- Alias (data)\n" +
281
+ "- Return\n" +
282
+ "-- Expression (data)\n" +
283
+ "--- Reference (data)"
262
284
  );
263
285
  });
264
286
 
265
- test('Test nested aggregate functions', () => {
287
+ test("Test nested aggregate functions", () => {
266
288
  expect(() => {
267
289
  const parser = new Parser();
268
- parser.parse('RETURN sum(sum(1))');
269
- }).toThrow('Aggregate functions cannot be nested');
290
+ parser.parse("RETURN sum(sum(1))");
291
+ }).toThrow("Aggregate functions cannot be nested");
270
292
  });
271
293
 
272
- test('Test with and return with renamed variable', () => {
294
+ test("Test with and return with renamed variable", () => {
273
295
  const parser = new Parser();
274
- const ast = parser.parse('WITH 1 AS n RETURN n AS m');
296
+ const ast = parser.parse("WITH 1 AS n RETURN n AS m");
275
297
  expect(ast.print()).toBe(
276
- 'ASTNode\n' +
277
- '- With\n' +
278
- '-- Expression (n)\n' +
279
- '--- Number (1)\n' +
280
- '- Return\n' +
281
- '-- Expression (m)\n' +
282
- '--- Reference (n)'
298
+ "ASTNode\n" +
299
+ "- With\n" +
300
+ "-- Expression (n)\n" +
301
+ "--- Number (1)\n" +
302
+ "- Return\n" +
303
+ "-- Expression (m)\n" +
304
+ "--- Reference (n)"
283
305
  );
284
306
  });
285
307
 
286
- test('Test with and return with variable lookup', () => {
308
+ test("Test with and return with variable lookup", () => {
287
309
  const parser = new Parser();
288
- const ast = parser.parse('WITH {a: n} AS obj RETURN obj.a');
310
+ const ast = parser.parse("WITH {a: n} AS obj RETURN obj.a");
289
311
  expect(ast.print()).toBe(
290
- 'ASTNode\n' +
291
- '- With\n' +
292
- '-- Expression (obj)\n' +
293
- '--- AssociativeArray\n' +
294
- '---- KeyValuePair\n' +
295
- '----- String (a)\n' +
296
- '----- Expression\n' +
297
- '------ Reference (n)\n' +
298
- '- Return\n' +
299
- '-- Expression\n' +
300
- '--- Lookup\n' +
301
- '---- Identifier (a)\n' +
302
- '---- Reference (obj)'
312
+ "ASTNode\n" +
313
+ "- With\n" +
314
+ "-- Expression (obj)\n" +
315
+ "--- AssociativeArray\n" +
316
+ "---- KeyValuePair\n" +
317
+ "----- String (a)\n" +
318
+ "----- Expression\n" +
319
+ "------ Reference (n)\n" +
320
+ "- Return\n" +
321
+ "-- Expression\n" +
322
+ "--- Lookup\n" +
323
+ "---- Identifier (a)\n" +
324
+ "---- Reference (obj)"
303
325
  );
304
326
  });
305
327
 
306
- test('Test unwind', () => {
328
+ test("Test unwind", () => {
307
329
  const parser = new Parser();
308
- const ast = parser.parse('WITH [1, 2, 4] as n unwind n as i return i');
330
+ const ast = parser.parse("WITH [1, 2, 4] as n unwind n as i return i");
309
331
  expect(ast.print()).toBe(
310
- 'ASTNode\n' +
311
- '- With\n' +
312
- '-- Expression (n)\n' +
313
- '--- JSONArray\n' +
314
- '---- Expression\n' +
315
- '----- Number (1)\n' +
316
- '---- Expression\n' +
317
- '----- Number (2)\n' +
318
- '---- Expression\n' +
319
- '----- Number (4)\n' +
320
- '- Unwind\n' +
321
- '-- Expression (i)\n' +
322
- '--- Reference (n)\n' +
323
- '- Return\n' +
324
- '-- Expression (i)\n' +
325
- '--- Reference (i)'
332
+ "ASTNode\n" +
333
+ "- With\n" +
334
+ "-- Expression (n)\n" +
335
+ "--- JSONArray\n" +
336
+ "---- Expression\n" +
337
+ "----- Number (1)\n" +
338
+ "---- Expression\n" +
339
+ "----- Number (2)\n" +
340
+ "---- Expression\n" +
341
+ "----- Number (4)\n" +
342
+ "- Unwind\n" +
343
+ "-- Expression (i)\n" +
344
+ "--- Reference (n)\n" +
345
+ "- Return\n" +
346
+ "-- Expression (i)\n" +
347
+ "--- Reference (i)"
326
348
  );
327
349
  });
328
350
 
329
- test('Test predicate function', () => {
351
+ test("Test predicate function", () => {
330
352
  const parser = new Parser();
331
- const ast = parser.parse('RETURN sum(n in [1, 2, 3] | n where n > 1)');
353
+ const ast = parser.parse("RETURN sum(n in [1, 2, 3] | n where n > 1)");
332
354
  expect(ast.print()).toBe(
333
- 'ASTNode\n' +
334
- '- Return\n' +
335
- '-- Expression\n' +
336
- '--- PredicateFunction (sum)\n' +
337
- '---- Reference (n)\n' +
338
- '---- Expression\n' +
339
- '----- JSONArray\n' +
340
- '------ Expression\n' +
341
- '------- Number (1)\n' +
342
- '------ Expression\n' +
343
- '------- Number (2)\n' +
344
- '------ Expression\n' +
345
- '------- Number (3)\n' +
346
- '---- Expression\n' +
347
- '----- Reference (n)\n' +
348
- '---- Where\n' +
349
- '----- Expression\n' +
350
- '------ GreaterThan\n' +
351
- '------- Reference (n)\n' +
352
- '------- Number (1)'
355
+ "ASTNode\n" +
356
+ "- Return\n" +
357
+ "-- Expression\n" +
358
+ "--- PredicateFunction (sum)\n" +
359
+ "---- Reference (n)\n" +
360
+ "---- Expression\n" +
361
+ "----- JSONArray\n" +
362
+ "------ Expression\n" +
363
+ "------- Number (1)\n" +
364
+ "------ Expression\n" +
365
+ "------- Number (2)\n" +
366
+ "------ Expression\n" +
367
+ "------- Number (3)\n" +
368
+ "---- Expression\n" +
369
+ "----- Reference (n)\n" +
370
+ "---- Where\n" +
371
+ "----- Expression\n" +
372
+ "------ GreaterThan\n" +
373
+ "------- Reference (n)\n" +
374
+ "------- Number (1)"
353
375
  );
354
376
  });
355
377
 
356
- test('Test case statement', () => {
378
+ test("Test case statement", () => {
357
379
  const parser = new Parser();
358
- const ast = parser.parse('RETURN CASE WHEN 1 THEN 2 ELSE 3 END');
380
+ const ast = parser.parse("RETURN CASE WHEN 1 THEN 2 ELSE 3 END");
359
381
  expect(ast.print()).toBe(
360
- 'ASTNode\n' +
361
- '- Return\n' +
362
- '-- Expression\n' +
363
- '--- Case\n' +
364
- '---- When\n' +
365
- '----- Expression\n' +
366
- '------ Number (1)\n' +
367
- '---- Then\n' +
368
- '----- Expression\n' +
369
- '------ Number (2)\n' +
370
- '---- Else\n' +
371
- '----- Expression\n' +
372
- '------ Number (3)'
382
+ "ASTNode\n" +
383
+ "- Return\n" +
384
+ "-- Expression\n" +
385
+ "--- Case\n" +
386
+ "---- When\n" +
387
+ "----- Expression\n" +
388
+ "------ Number (1)\n" +
389
+ "---- Then\n" +
390
+ "----- Expression\n" +
391
+ "------ Number (2)\n" +
392
+ "---- Else\n" +
393
+ "----- Expression\n" +
394
+ "------ Number (3)"
373
395
  );
374
396
  });
375
397
 
376
- test('Test functions with wrong number of arguments', () => {
377
- expect(() => (new Parser()).parse('RETURN range(1)')).toThrow('Function range expected 2 parameters, but got 1');
378
- expect(() => (new Parser()).parse('RETURN range(1, 2, 3)')).toThrow('Function range expected 2 parameters, but got 3');
379
- expect(() => (new Parser()).parse('RETURN avg(1, 2, 3)')).toThrow('Function avg expected 1 parameters, but got 3');
380
- expect(() => (new Parser()).parse('RETURN sum(1, 2)')).toThrow('Function sum expected 1 parameters, but got 2');
381
- expect(() => (new Parser()).parse('RETURN split("a", "b", "c")')).toThrow('Function split expected 2 parameters, but got 3');
382
- expect(() => (new Parser()).parse('RETURN size(1, 2)')).toThrow('Function size expected 1 parameters, but got 2');
383
- expect(() => (new Parser()).parse('RETURN round(1, 2)')).toThrow('Function round expected 1 parameters, but got 2');
398
+ test("Test functions with wrong number of arguments", () => {
399
+ expect(() => new Parser().parse("RETURN range(1)")).toThrow(
400
+ "Function range expected 2 parameters, but got 1"
401
+ );
402
+ expect(() => new Parser().parse("RETURN range(1, 2, 3)")).toThrow(
403
+ "Function range expected 2 parameters, but got 3"
404
+ );
405
+ expect(() => new Parser().parse("RETURN avg(1, 2, 3)")).toThrow(
406
+ "Function avg expected 1 parameters, but got 3"
407
+ );
408
+ expect(() => new Parser().parse("RETURN sum(1, 2)")).toThrow(
409
+ "Function sum expected 1 parameters, but got 2"
410
+ );
411
+ expect(() => new Parser().parse('RETURN split("a", "b", "c")')).toThrow(
412
+ "Function split expected 2 parameters, but got 3"
413
+ );
414
+ expect(() => new Parser().parse("RETURN size(1, 2)")).toThrow(
415
+ "Function size expected 1 parameters, but got 2"
416
+ );
417
+ expect(() => new Parser().parse("RETURN round(1, 2)")).toThrow(
418
+ "Function round expected 1 parameters, but got 2"
419
+ );
384
420
  });
385
421
 
386
- test('Test non-well formed statements', () => {
387
- expect(() => (new Parser()).parse('return 1 return 1')).toThrow('Only one RETURN statement is allowed');
388
- expect(() => (new Parser()).parse('return 1 with 1 as n')).toThrow('Last statement must be a RETURN or a WHERE statement');
422
+ test("Test non-well formed statements", () => {
423
+ expect(() => new Parser().parse("return 1 return 1")).toThrow(
424
+ "Only one RETURN statement is allowed"
425
+ );
426
+ expect(() => new Parser().parse("return 1 with 1 as n")).toThrow(
427
+ "Last statement must be a RETURN, WHERE, or a CALL statement"
428
+ );
389
429
  });
390
430
 
391
- test('Test associative array with backtick string', () => {
431
+ test("Test associative array with backtick string", () => {
392
432
  const parser = new Parser();
393
- const ast = parser.parse('RETURN {`key`: `value`}');
433
+ const ast = parser.parse("RETURN {`key`: `value`}");
394
434
  expect(ast.print()).toBe(
395
- 'ASTNode\n' +
396
- '- Return\n' +
397
- '-- Expression\n' +
398
- '--- AssociativeArray\n' +
399
- '---- KeyValuePair\n' +
400
- '----- String (key)\n' +
401
- '----- Expression\n' +
402
- '------ Reference (value)'
435
+ "ASTNode\n" +
436
+ "- Return\n" +
437
+ "-- Expression\n" +
438
+ "--- AssociativeArray\n" +
439
+ "---- KeyValuePair\n" +
440
+ "----- String (key)\n" +
441
+ "----- Expression\n" +
442
+ "------ Reference (value)"
403
443
  );
404
444
  });
405
445
 
406
- test('Test limit', () => {
446
+ test("Test limit", () => {
407
447
  const parser = new Parser();
408
- const ast = parser.parse('unwind range(1, 10) as n limit 5 return n');
448
+ const ast = parser.parse("unwind range(1, 10) as n limit 5 return n");
409
449
  expect(ast.print()).toBe(
410
- 'ASTNode\n' +
411
- '- Unwind\n' +
412
- '-- Expression (n)\n' +
413
- '--- Function (range)\n' +
414
- '---- Expression\n' +
415
- '----- Number (1)\n' +
416
- '---- Expression\n' +
417
- '----- Number (10)\n' +
418
- '- Limit\n' +
419
- '- Return\n' +
420
- '-- Expression (n)\n' +
421
- '--- Reference (n)'
450
+ "ASTNode\n" +
451
+ "- Unwind\n" +
452
+ "-- Expression (n)\n" +
453
+ "--- Function (range)\n" +
454
+ "---- Expression\n" +
455
+ "----- Number (1)\n" +
456
+ "---- Expression\n" +
457
+ "----- Number (10)\n" +
458
+ "- Limit\n" +
459
+ "- Return\n" +
460
+ "-- Expression (n)\n" +
461
+ "--- Reference (n)"
422
462
  );
423
463
  });
424
464
 
425
- test('Test return -2', () => {
465
+ test("Test return -2", () => {
426
466
  const parser = new Parser();
427
- const ast = parser.parse('return -2');
467
+ const ast = parser.parse("return -2");
468
+ expect(ast.print()).toBe("ASTNode\n" + "- Return\n" + "-- Expression\n" + "--- Number (-2)");
469
+ });
470
+
471
+ test("Test call operation", () => {
472
+ const parser = new Parser();
473
+ const ast = parser.parse("CALL test() YIELD result RETURN result");
428
474
  expect(ast.print()).toBe(
429
- 'ASTNode\n' +
430
- '- Return\n' +
431
- '-- Expression\n' +
432
- '--- Number (-2)'
475
+ "ASTNode\n" +
476
+ "- Call\n" +
477
+ "-- Expression (result)\n" +
478
+ "--- Reference (result)\n" +
479
+ "- Return\n" +
480
+ "-- Expression (result)\n" +
481
+ "--- Reference (result)"
433
482
  );
434
- });
483
+ });