flowquery 1.0.46 → 1.0.48

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 (422) hide show
  1. package/dist/flowquery.min.js +1 -1
  2. package/dist/index.d.ts +0 -7
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +6 -4
  5. package/dist/index.js.map +1 -1
  6. package/dist/parsing/data_structures/list_comprehension.d.ts +56 -0
  7. package/dist/parsing/data_structures/list_comprehension.d.ts.map +1 -0
  8. package/dist/parsing/data_structures/list_comprehension.js +102 -0
  9. package/dist/parsing/data_structures/list_comprehension.js.map +1 -0
  10. package/dist/parsing/parser.d.ts +18 -0
  11. package/dist/parsing/parser.d.ts.map +1 -1
  12. package/dist/parsing/parser.js +92 -0
  13. package/dist/parsing/parser.js.map +1 -1
  14. package/package.json +4 -1
  15. package/.editorconfig +0 -21
  16. package/.gitattributes +0 -3
  17. package/.github/workflows/npm-publish.yml +0 -32
  18. package/.github/workflows/python-publish.yml +0 -143
  19. package/.github/workflows/release.yml +0 -107
  20. package/.husky/pre-commit +0 -28
  21. package/.prettierrc +0 -22
  22. package/CODE_OF_CONDUCT.md +0 -10
  23. package/FlowQueryLogoIcon.png +0 -0
  24. package/SECURITY.md +0 -14
  25. package/SUPPORT.md +0 -13
  26. package/docs/flowquery.min.js +0 -1
  27. package/docs/index.html +0 -105
  28. package/flowquery-py/CONTRIBUTING.md +0 -127
  29. package/flowquery-py/README.md +0 -67
  30. package/flowquery-py/misc/data/test.json +0 -10
  31. package/flowquery-py/misc/data/users.json +0 -242
  32. package/flowquery-py/notebooks/TestFlowQuery.ipynb +0 -440
  33. package/flowquery-py/pyproject.toml +0 -121
  34. package/flowquery-py/setup_env.ps1 +0 -92
  35. package/flowquery-py/setup_env.sh +0 -87
  36. package/flowquery-py/src/__init__.py +0 -38
  37. package/flowquery-py/src/__main__.py +0 -10
  38. package/flowquery-py/src/compute/__init__.py +0 -6
  39. package/flowquery-py/src/compute/flowquery.py +0 -68
  40. package/flowquery-py/src/compute/runner.py +0 -64
  41. package/flowquery-py/src/extensibility.py +0 -52
  42. package/flowquery-py/src/graph/__init__.py +0 -31
  43. package/flowquery-py/src/graph/data.py +0 -136
  44. package/flowquery-py/src/graph/database.py +0 -141
  45. package/flowquery-py/src/graph/hops.py +0 -43
  46. package/flowquery-py/src/graph/node.py +0 -143
  47. package/flowquery-py/src/graph/node_data.py +0 -26
  48. package/flowquery-py/src/graph/node_reference.py +0 -50
  49. package/flowquery-py/src/graph/pattern.py +0 -115
  50. package/flowquery-py/src/graph/pattern_expression.py +0 -67
  51. package/flowquery-py/src/graph/patterns.py +0 -42
  52. package/flowquery-py/src/graph/physical_node.py +0 -41
  53. package/flowquery-py/src/graph/physical_relationship.py +0 -36
  54. package/flowquery-py/src/graph/relationship.py +0 -193
  55. package/flowquery-py/src/graph/relationship_data.py +0 -36
  56. package/flowquery-py/src/graph/relationship_match_collector.py +0 -85
  57. package/flowquery-py/src/graph/relationship_reference.py +0 -21
  58. package/flowquery-py/src/io/__init__.py +0 -5
  59. package/flowquery-py/src/io/command_line.py +0 -108
  60. package/flowquery-py/src/parsing/__init__.py +0 -17
  61. package/flowquery-py/src/parsing/alias.py +0 -20
  62. package/flowquery-py/src/parsing/alias_option.py +0 -11
  63. package/flowquery-py/src/parsing/ast_node.py +0 -147
  64. package/flowquery-py/src/parsing/base_parser.py +0 -84
  65. package/flowquery-py/src/parsing/components/__init__.py +0 -19
  66. package/flowquery-py/src/parsing/components/csv.py +0 -8
  67. package/flowquery-py/src/parsing/components/from_.py +0 -12
  68. package/flowquery-py/src/parsing/components/headers.py +0 -12
  69. package/flowquery-py/src/parsing/components/json.py +0 -8
  70. package/flowquery-py/src/parsing/components/null.py +0 -10
  71. package/flowquery-py/src/parsing/components/post.py +0 -8
  72. package/flowquery-py/src/parsing/components/text.py +0 -8
  73. package/flowquery-py/src/parsing/context.py +0 -50
  74. package/flowquery-py/src/parsing/data_structures/__init__.py +0 -15
  75. package/flowquery-py/src/parsing/data_structures/associative_array.py +0 -41
  76. package/flowquery-py/src/parsing/data_structures/json_array.py +0 -30
  77. package/flowquery-py/src/parsing/data_structures/key_value_pair.py +0 -38
  78. package/flowquery-py/src/parsing/data_structures/lookup.py +0 -51
  79. package/flowquery-py/src/parsing/data_structures/range_lookup.py +0 -42
  80. package/flowquery-py/src/parsing/expressions/__init__.py +0 -61
  81. package/flowquery-py/src/parsing/expressions/boolean.py +0 -20
  82. package/flowquery-py/src/parsing/expressions/expression.py +0 -141
  83. package/flowquery-py/src/parsing/expressions/expression_map.py +0 -26
  84. package/flowquery-py/src/parsing/expressions/f_string.py +0 -27
  85. package/flowquery-py/src/parsing/expressions/identifier.py +0 -21
  86. package/flowquery-py/src/parsing/expressions/number.py +0 -32
  87. package/flowquery-py/src/parsing/expressions/operator.py +0 -271
  88. package/flowquery-py/src/parsing/expressions/reference.py +0 -47
  89. package/flowquery-py/src/parsing/expressions/string.py +0 -27
  90. package/flowquery-py/src/parsing/functions/__init__.py +0 -127
  91. package/flowquery-py/src/parsing/functions/aggregate_function.py +0 -60
  92. package/flowquery-py/src/parsing/functions/async_function.py +0 -65
  93. package/flowquery-py/src/parsing/functions/avg.py +0 -55
  94. package/flowquery-py/src/parsing/functions/coalesce.py +0 -43
  95. package/flowquery-py/src/parsing/functions/collect.py +0 -75
  96. package/flowquery-py/src/parsing/functions/count.py +0 -79
  97. package/flowquery-py/src/parsing/functions/date_.py +0 -61
  98. package/flowquery-py/src/parsing/functions/datetime_.py +0 -62
  99. package/flowquery-py/src/parsing/functions/duration.py +0 -159
  100. package/flowquery-py/src/parsing/functions/element_id.py +0 -50
  101. package/flowquery-py/src/parsing/functions/function.py +0 -68
  102. package/flowquery-py/src/parsing/functions/function_factory.py +0 -170
  103. package/flowquery-py/src/parsing/functions/function_metadata.py +0 -148
  104. package/flowquery-py/src/parsing/functions/functions.py +0 -67
  105. package/flowquery-py/src/parsing/functions/head.py +0 -39
  106. package/flowquery-py/src/parsing/functions/id_.py +0 -49
  107. package/flowquery-py/src/parsing/functions/join.py +0 -49
  108. package/flowquery-py/src/parsing/functions/keys.py +0 -34
  109. package/flowquery-py/src/parsing/functions/last.py +0 -39
  110. package/flowquery-py/src/parsing/functions/localdatetime.py +0 -60
  111. package/flowquery-py/src/parsing/functions/localtime.py +0 -57
  112. package/flowquery-py/src/parsing/functions/max_.py +0 -49
  113. package/flowquery-py/src/parsing/functions/min_.py +0 -49
  114. package/flowquery-py/src/parsing/functions/nodes.py +0 -48
  115. package/flowquery-py/src/parsing/functions/predicate_function.py +0 -47
  116. package/flowquery-py/src/parsing/functions/predicate_sum.py +0 -49
  117. package/flowquery-py/src/parsing/functions/properties.py +0 -50
  118. package/flowquery-py/src/parsing/functions/rand.py +0 -28
  119. package/flowquery-py/src/parsing/functions/range_.py +0 -41
  120. package/flowquery-py/src/parsing/functions/reducer_element.py +0 -15
  121. package/flowquery-py/src/parsing/functions/relationships.py +0 -46
  122. package/flowquery-py/src/parsing/functions/replace.py +0 -39
  123. package/flowquery-py/src/parsing/functions/round_.py +0 -34
  124. package/flowquery-py/src/parsing/functions/schema.py +0 -40
  125. package/flowquery-py/src/parsing/functions/size.py +0 -34
  126. package/flowquery-py/src/parsing/functions/split.py +0 -54
  127. package/flowquery-py/src/parsing/functions/string_distance.py +0 -92
  128. package/flowquery-py/src/parsing/functions/stringify.py +0 -49
  129. package/flowquery-py/src/parsing/functions/substring.py +0 -76
  130. package/flowquery-py/src/parsing/functions/sum.py +0 -51
  131. package/flowquery-py/src/parsing/functions/tail.py +0 -37
  132. package/flowquery-py/src/parsing/functions/temporal_utils.py +0 -186
  133. package/flowquery-py/src/parsing/functions/time_.py +0 -57
  134. package/flowquery-py/src/parsing/functions/timestamp.py +0 -37
  135. package/flowquery-py/src/parsing/functions/to_float.py +0 -46
  136. package/flowquery-py/src/parsing/functions/to_integer.py +0 -46
  137. package/flowquery-py/src/parsing/functions/to_json.py +0 -35
  138. package/flowquery-py/src/parsing/functions/to_lower.py +0 -37
  139. package/flowquery-py/src/parsing/functions/to_string.py +0 -41
  140. package/flowquery-py/src/parsing/functions/trim.py +0 -37
  141. package/flowquery-py/src/parsing/functions/type_.py +0 -47
  142. package/flowquery-py/src/parsing/functions/value_holder.py +0 -24
  143. package/flowquery-py/src/parsing/logic/__init__.py +0 -15
  144. package/flowquery-py/src/parsing/logic/case.py +0 -28
  145. package/flowquery-py/src/parsing/logic/else_.py +0 -12
  146. package/flowquery-py/src/parsing/logic/end.py +0 -8
  147. package/flowquery-py/src/parsing/logic/then.py +0 -12
  148. package/flowquery-py/src/parsing/logic/when.py +0 -12
  149. package/flowquery-py/src/parsing/operations/__init__.py +0 -46
  150. package/flowquery-py/src/parsing/operations/aggregated_return.py +0 -25
  151. package/flowquery-py/src/parsing/operations/aggregated_with.py +0 -22
  152. package/flowquery-py/src/parsing/operations/call.py +0 -73
  153. package/flowquery-py/src/parsing/operations/create_node.py +0 -35
  154. package/flowquery-py/src/parsing/operations/create_relationship.py +0 -35
  155. package/flowquery-py/src/parsing/operations/delete_node.py +0 -29
  156. package/flowquery-py/src/parsing/operations/delete_relationship.py +0 -29
  157. package/flowquery-py/src/parsing/operations/group_by.py +0 -148
  158. package/flowquery-py/src/parsing/operations/limit.py +0 -33
  159. package/flowquery-py/src/parsing/operations/load.py +0 -148
  160. package/flowquery-py/src/parsing/operations/match.py +0 -52
  161. package/flowquery-py/src/parsing/operations/operation.py +0 -69
  162. package/flowquery-py/src/parsing/operations/order_by.py +0 -114
  163. package/flowquery-py/src/parsing/operations/projection.py +0 -21
  164. package/flowquery-py/src/parsing/operations/return_op.py +0 -88
  165. package/flowquery-py/src/parsing/operations/union.py +0 -115
  166. package/flowquery-py/src/parsing/operations/union_all.py +0 -17
  167. package/flowquery-py/src/parsing/operations/unwind.py +0 -42
  168. package/flowquery-py/src/parsing/operations/where.py +0 -43
  169. package/flowquery-py/src/parsing/operations/with_op.py +0 -18
  170. package/flowquery-py/src/parsing/parser.py +0 -1384
  171. package/flowquery-py/src/parsing/parser_state.py +0 -26
  172. package/flowquery-py/src/parsing/token_to_node.py +0 -109
  173. package/flowquery-py/src/tokenization/__init__.py +0 -23
  174. package/flowquery-py/src/tokenization/keyword.py +0 -54
  175. package/flowquery-py/src/tokenization/operator.py +0 -29
  176. package/flowquery-py/src/tokenization/string_walker.py +0 -158
  177. package/flowquery-py/src/tokenization/symbol.py +0 -19
  178. package/flowquery-py/src/tokenization/token.py +0 -693
  179. package/flowquery-py/src/tokenization/token_mapper.py +0 -53
  180. package/flowquery-py/src/tokenization/token_type.py +0 -21
  181. package/flowquery-py/src/tokenization/tokenizer.py +0 -214
  182. package/flowquery-py/src/tokenization/trie.py +0 -125
  183. package/flowquery-py/src/utils/__init__.py +0 -6
  184. package/flowquery-py/src/utils/object_utils.py +0 -20
  185. package/flowquery-py/src/utils/string_utils.py +0 -113
  186. package/flowquery-py/tests/__init__.py +0 -1
  187. package/flowquery-py/tests/compute/__init__.py +0 -1
  188. package/flowquery-py/tests/compute/test_runner.py +0 -4902
  189. package/flowquery-py/tests/graph/__init__.py +0 -1
  190. package/flowquery-py/tests/graph/test_create.py +0 -56
  191. package/flowquery-py/tests/graph/test_data.py +0 -73
  192. package/flowquery-py/tests/graph/test_match.py +0 -40
  193. package/flowquery-py/tests/parsing/__init__.py +0 -1
  194. package/flowquery-py/tests/parsing/test_context.py +0 -34
  195. package/flowquery-py/tests/parsing/test_expression.py +0 -248
  196. package/flowquery-py/tests/parsing/test_parser.py +0 -1237
  197. package/flowquery-py/tests/test_extensibility.py +0 -611
  198. package/flowquery-py/tests/tokenization/__init__.py +0 -1
  199. package/flowquery-py/tests/tokenization/test_token_mapper.py +0 -60
  200. package/flowquery-py/tests/tokenization/test_tokenizer.py +0 -198
  201. package/flowquery-py/tests/tokenization/test_trie.py +0 -30
  202. package/flowquery-vscode/.vscode-test.mjs +0 -5
  203. package/flowquery-vscode/.vscodeignore +0 -13
  204. package/flowquery-vscode/LICENSE +0 -21
  205. package/flowquery-vscode/README.md +0 -11
  206. package/flowquery-vscode/demo/FlowQueryVSCodeDemo.gif +0 -0
  207. package/flowquery-vscode/eslint.config.mjs +0 -25
  208. package/flowquery-vscode/extension.js +0 -508
  209. package/flowquery-vscode/flowQueryEngine/flowquery.min.js +0 -1
  210. package/flowquery-vscode/flowquery-worker.js +0 -66
  211. package/flowquery-vscode/images/FlowQueryLogoIcon.png +0 -0
  212. package/flowquery-vscode/jsconfig.json +0 -13
  213. package/flowquery-vscode/libs/page.css +0 -53
  214. package/flowquery-vscode/libs/table.css +0 -13
  215. package/flowquery-vscode/libs/tabs.css +0 -66
  216. package/flowquery-vscode/package-lock.json +0 -2917
  217. package/flowquery-vscode/package.json +0 -51
  218. package/flowquery-vscode/test/extension.test.js +0 -196
  219. package/flowquery-vscode/test/worker.test.js +0 -25
  220. package/flowquery-vscode/vsc-extension-quickstart.md +0 -42
  221. package/jest.config.js +0 -14
  222. package/misc/apps/RAG/README.md +0 -29
  223. package/misc/apps/RAG/data/chats.json +0 -302
  224. package/misc/apps/RAG/data/emails.json +0 -182
  225. package/misc/apps/RAG/data/events.json +0 -226
  226. package/misc/apps/RAG/data/files.json +0 -172
  227. package/misc/apps/RAG/data/users.json +0 -158
  228. package/misc/apps/RAG/jest.config.js +0 -21
  229. package/misc/apps/RAG/package.json +0 -48
  230. package/misc/apps/RAG/public/index.html +0 -18
  231. package/misc/apps/RAG/src/App.css +0 -42
  232. package/misc/apps/RAG/src/App.tsx +0 -50
  233. package/misc/apps/RAG/src/components/AdaptiveCardRenderer.css +0 -172
  234. package/misc/apps/RAG/src/components/AdaptiveCardRenderer.tsx +0 -380
  235. package/misc/apps/RAG/src/components/ApiKeySettings.tsx +0 -245
  236. package/misc/apps/RAG/src/components/ChatContainer.css +0 -67
  237. package/misc/apps/RAG/src/components/ChatContainer.tsx +0 -242
  238. package/misc/apps/RAG/src/components/ChatInput.css +0 -23
  239. package/misc/apps/RAG/src/components/ChatInput.tsx +0 -76
  240. package/misc/apps/RAG/src/components/ChatMessage.css +0 -160
  241. package/misc/apps/RAG/src/components/ChatMessage.tsx +0 -286
  242. package/misc/apps/RAG/src/components/FlowQueryAgent.ts +0 -708
  243. package/misc/apps/RAG/src/components/FlowQueryRunner.css +0 -113
  244. package/misc/apps/RAG/src/components/FlowQueryRunner.tsx +0 -371
  245. package/misc/apps/RAG/src/components/index.ts +0 -28
  246. package/misc/apps/RAG/src/graph/index.ts +0 -19
  247. package/misc/apps/RAG/src/graph/initializeGraph.ts +0 -254
  248. package/misc/apps/RAG/src/index.tsx +0 -29
  249. package/misc/apps/RAG/src/prompts/FlowQuerySystemPrompt.ts +0 -327
  250. package/misc/apps/RAG/src/prompts/index.ts +0 -10
  251. package/misc/apps/RAG/src/tests/graph.test.ts +0 -35
  252. package/misc/apps/RAG/src/utils/FlowQueryExecutor.ts +0 -130
  253. package/misc/apps/RAG/src/utils/FlowQueryExtractor.ts +0 -208
  254. package/misc/apps/RAG/src/utils/Llm.ts +0 -248
  255. package/misc/apps/RAG/src/utils/index.ts +0 -12
  256. package/misc/apps/RAG/tsconfig.json +0 -22
  257. package/misc/apps/RAG/webpack.config.js +0 -43
  258. package/misc/apps/README.md +0 -1
  259. package/misc/queries/analyze_catfacts.cql +0 -75
  260. package/misc/queries/azure_openai_completions.cql +0 -13
  261. package/misc/queries/azure_openai_models.cql +0 -9
  262. package/misc/queries/mock_pipeline.cql +0 -84
  263. package/misc/queries/openai_completions.cql +0 -15
  264. package/misc/queries/openai_models.cql +0 -13
  265. package/misc/queries/test.cql +0 -6
  266. package/misc/queries/tool_inference.cql +0 -24
  267. package/misc/queries/wisdom.cql +0 -6
  268. package/misc/queries/wisdom_letter_histogram.cql +0 -8
  269. package/src/compute/flowquery.ts +0 -46
  270. package/src/compute/runner.ts +0 -66
  271. package/src/extensibility.ts +0 -45
  272. package/src/graph/data.ts +0 -130
  273. package/src/graph/database.ts +0 -143
  274. package/src/graph/hops.ts +0 -22
  275. package/src/graph/node.ts +0 -122
  276. package/src/graph/node_data.ts +0 -18
  277. package/src/graph/node_reference.ts +0 -38
  278. package/src/graph/pattern.ts +0 -110
  279. package/src/graph/pattern_expression.ts +0 -48
  280. package/src/graph/patterns.ts +0 -36
  281. package/src/graph/physical_node.ts +0 -23
  282. package/src/graph/physical_relationship.ts +0 -23
  283. package/src/graph/relationship.ts +0 -167
  284. package/src/graph/relationship_data.ts +0 -31
  285. package/src/graph/relationship_match_collector.ts +0 -64
  286. package/src/graph/relationship_reference.ts +0 -25
  287. package/src/index.browser.ts +0 -46
  288. package/src/index.node.ts +0 -55
  289. package/src/index.ts +0 -12
  290. package/src/io/command_line.ts +0 -74
  291. package/src/parsing/alias.ts +0 -23
  292. package/src/parsing/alias_option.ts +0 -5
  293. package/src/parsing/ast_node.ts +0 -153
  294. package/src/parsing/base_parser.ts +0 -98
  295. package/src/parsing/components/csv.ts +0 -9
  296. package/src/parsing/components/from.ts +0 -12
  297. package/src/parsing/components/headers.ts +0 -12
  298. package/src/parsing/components/json.ts +0 -9
  299. package/src/parsing/components/null.ts +0 -9
  300. package/src/parsing/components/post.ts +0 -9
  301. package/src/parsing/components/text.ts +0 -9
  302. package/src/parsing/context.ts +0 -54
  303. package/src/parsing/data_structures/associative_array.ts +0 -43
  304. package/src/parsing/data_structures/json_array.ts +0 -31
  305. package/src/parsing/data_structures/key_value_pair.ts +0 -37
  306. package/src/parsing/data_structures/lookup.ts +0 -44
  307. package/src/parsing/data_structures/range_lookup.ts +0 -36
  308. package/src/parsing/expressions/boolean.ts +0 -21
  309. package/src/parsing/expressions/expression.ts +0 -150
  310. package/src/parsing/expressions/expression_map.ts +0 -22
  311. package/src/parsing/expressions/f_string.ts +0 -26
  312. package/src/parsing/expressions/identifier.ts +0 -22
  313. package/src/parsing/expressions/number.ts +0 -40
  314. package/src/parsing/expressions/operator.ts +0 -354
  315. package/src/parsing/expressions/reference.ts +0 -45
  316. package/src/parsing/expressions/string.ts +0 -34
  317. package/src/parsing/functions/aggregate_function.ts +0 -58
  318. package/src/parsing/functions/async_function.ts +0 -64
  319. package/src/parsing/functions/avg.ts +0 -47
  320. package/src/parsing/functions/coalesce.ts +0 -49
  321. package/src/parsing/functions/collect.ts +0 -54
  322. package/src/parsing/functions/count.ts +0 -54
  323. package/src/parsing/functions/date.ts +0 -63
  324. package/src/parsing/functions/datetime.ts +0 -63
  325. package/src/parsing/functions/duration.ts +0 -143
  326. package/src/parsing/functions/element_id.ts +0 -51
  327. package/src/parsing/functions/function.ts +0 -60
  328. package/src/parsing/functions/function_factory.ts +0 -195
  329. package/src/parsing/functions/function_metadata.ts +0 -217
  330. package/src/parsing/functions/functions.ts +0 -70
  331. package/src/parsing/functions/head.ts +0 -42
  332. package/src/parsing/functions/id.ts +0 -51
  333. package/src/parsing/functions/join.ts +0 -40
  334. package/src/parsing/functions/keys.ts +0 -29
  335. package/src/parsing/functions/last.ts +0 -42
  336. package/src/parsing/functions/localdatetime.ts +0 -63
  337. package/src/parsing/functions/localtime.ts +0 -58
  338. package/src/parsing/functions/max.ts +0 -37
  339. package/src/parsing/functions/min.ts +0 -37
  340. package/src/parsing/functions/nodes.ts +0 -54
  341. package/src/parsing/functions/predicate_function.ts +0 -48
  342. package/src/parsing/functions/predicate_sum.ts +0 -47
  343. package/src/parsing/functions/properties.ts +0 -56
  344. package/src/parsing/functions/rand.ts +0 -21
  345. package/src/parsing/functions/range.ts +0 -37
  346. package/src/parsing/functions/reducer_element.ts +0 -10
  347. package/src/parsing/functions/relationships.ts +0 -52
  348. package/src/parsing/functions/replace.ts +0 -38
  349. package/src/parsing/functions/round.ts +0 -28
  350. package/src/parsing/functions/schema.ts +0 -39
  351. package/src/parsing/functions/size.ts +0 -28
  352. package/src/parsing/functions/split.ts +0 -45
  353. package/src/parsing/functions/string_distance.ts +0 -83
  354. package/src/parsing/functions/stringify.ts +0 -37
  355. package/src/parsing/functions/substring.ts +0 -68
  356. package/src/parsing/functions/sum.ts +0 -41
  357. package/src/parsing/functions/tail.ts +0 -39
  358. package/src/parsing/functions/temporal_utils.ts +0 -180
  359. package/src/parsing/functions/time.ts +0 -58
  360. package/src/parsing/functions/timestamp.ts +0 -37
  361. package/src/parsing/functions/to_float.ts +0 -50
  362. package/src/parsing/functions/to_integer.ts +0 -50
  363. package/src/parsing/functions/to_json.ts +0 -28
  364. package/src/parsing/functions/to_lower.ts +0 -28
  365. package/src/parsing/functions/to_string.ts +0 -32
  366. package/src/parsing/functions/trim.ts +0 -28
  367. package/src/parsing/functions/type.ts +0 -39
  368. package/src/parsing/functions/value_holder.ts +0 -13
  369. package/src/parsing/logic/case.ts +0 -26
  370. package/src/parsing/logic/else.ts +0 -12
  371. package/src/parsing/logic/end.ts +0 -9
  372. package/src/parsing/logic/then.ts +0 -12
  373. package/src/parsing/logic/when.ts +0 -12
  374. package/src/parsing/operations/aggregated_return.ts +0 -22
  375. package/src/parsing/operations/aggregated_with.ts +0 -18
  376. package/src/parsing/operations/call.ts +0 -69
  377. package/src/parsing/operations/create_node.ts +0 -39
  378. package/src/parsing/operations/create_relationship.ts +0 -38
  379. package/src/parsing/operations/delete_node.ts +0 -33
  380. package/src/parsing/operations/delete_relationship.ts +0 -32
  381. package/src/parsing/operations/group_by.ts +0 -137
  382. package/src/parsing/operations/limit.ts +0 -31
  383. package/src/parsing/operations/load.ts +0 -146
  384. package/src/parsing/operations/match.ts +0 -54
  385. package/src/parsing/operations/operation.ts +0 -69
  386. package/src/parsing/operations/order_by.ts +0 -126
  387. package/src/parsing/operations/projection.ts +0 -18
  388. package/src/parsing/operations/return.ts +0 -76
  389. package/src/parsing/operations/union.ts +0 -114
  390. package/src/parsing/operations/union_all.ts +0 -16
  391. package/src/parsing/operations/unwind.ts +0 -36
  392. package/src/parsing/operations/where.ts +0 -42
  393. package/src/parsing/operations/with.ts +0 -20
  394. package/src/parsing/parser.ts +0 -1641
  395. package/src/parsing/parser_state.ts +0 -25
  396. package/src/parsing/token_to_node.ts +0 -114
  397. package/src/tokenization/keyword.ts +0 -50
  398. package/src/tokenization/operator.ts +0 -25
  399. package/src/tokenization/string_walker.ts +0 -197
  400. package/src/tokenization/symbol.ts +0 -15
  401. package/src/tokenization/token.ts +0 -764
  402. package/src/tokenization/token_mapper.ts +0 -53
  403. package/src/tokenization/token_type.ts +0 -16
  404. package/src/tokenization/tokenizer.ts +0 -250
  405. package/src/tokenization/trie.ts +0 -117
  406. package/src/utils/object_utils.ts +0 -17
  407. package/src/utils/string_utils.ts +0 -114
  408. package/tests/compute/runner.test.ts +0 -4559
  409. package/tests/extensibility.test.ts +0 -643
  410. package/tests/graph/create.test.ts +0 -36
  411. package/tests/graph/data.test.ts +0 -58
  412. package/tests/graph/match.test.ts +0 -29
  413. package/tests/parsing/context.test.ts +0 -27
  414. package/tests/parsing/expression.test.ts +0 -303
  415. package/tests/parsing/parser.test.ts +0 -1327
  416. package/tests/tokenization/token_mapper.test.ts +0 -47
  417. package/tests/tokenization/tokenizer.test.ts +0 -191
  418. package/tests/tokenization/trie.test.ts +0 -20
  419. package/tsconfig.json +0 -19
  420. package/typedoc.json +0 -16
  421. package/vscode-settings.json.recommended +0 -16
  422. package/webpack.config.js +0 -26
@@ -1,57 +0,0 @@
1
- """Local time function."""
2
-
3
- from datetime import datetime
4
- from typing import Any
5
-
6
- from .function import Function
7
- from .function_metadata import FunctionDef
8
- from .temporal_utils import build_time_object, parse_temporal_arg
9
-
10
-
11
- @FunctionDef({
12
- "description": (
13
- "Returns a local time value (no timezone). With no arguments returns the current local time. "
14
- "Accepts an ISO 8601 time string or a map of components."
15
- ),
16
- "category": "scalar",
17
- "parameters": [
18
- {
19
- "name": "input",
20
- "description": "Optional. An ISO 8601 time string (HH:MM:SS) or a map of components.",
21
- "type": "string",
22
- "required": False,
23
- },
24
- ],
25
- "output": {
26
- "description": "A time object with properties: hour, minute, second, millisecond, formatted",
27
- "type": "object",
28
- },
29
- "examples": [
30
- "RETURN localtime() AS now",
31
- "RETURN localtime('14:30:00') AS t",
32
- "WITH localtime() AS t RETURN t.hour, t.minute",
33
- ],
34
- })
35
- class LocalTime(Function):
36
- """Local time function.
37
-
38
- Returns a local time value (no timezone offset).
39
- When called with no arguments, returns the current local time.
40
- When called with a string argument, parses it.
41
- """
42
-
43
- def __init__(self) -> None:
44
- super().__init__("localtime")
45
- self._expected_parameter_count = None
46
-
47
- def value(self) -> Any:
48
- children = self.get_children()
49
- if len(children) > 1:
50
- raise ValueError("localtime() accepts at most one argument")
51
-
52
- if len(children) == 1:
53
- d = parse_temporal_arg(children[0].value(), "localtime")
54
- else:
55
- d = datetime.now()
56
-
57
- return build_time_object(d, utc=False)
@@ -1,49 +0,0 @@
1
- """Max aggregate function."""
2
-
3
- from typing import Any
4
-
5
- from .aggregate_function import AggregateFunction
6
- from .function_metadata import FunctionDef
7
- from .reducer_element import ReducerElement
8
-
9
-
10
- class MaxReducerElement(ReducerElement):
11
- """Reducer element for Max aggregate function."""
12
-
13
- def __init__(self) -> None:
14
- self._value: Any = None
15
-
16
- @property
17
- def value(self) -> Any:
18
- return self._value
19
-
20
- @value.setter
21
- def value(self, val: Any) -> None:
22
- if self._value is None or val > self._value:
23
- self._value = val
24
-
25
-
26
- @FunctionDef({
27
- "description": "Returns the maximum value across grouped rows",
28
- "category": "aggregate",
29
- "parameters": [
30
- {"name": "value", "description": "Value to compare", "type": "number"}
31
- ],
32
- "output": {"description": "Maximum value", "type": "number", "example": 10},
33
- "examples": ["WITH [3, 1, 2] AS nums UNWIND nums AS n RETURN max(n)"]
34
- })
35
- class Max(AggregateFunction):
36
- """Max aggregate function.
37
-
38
- Returns the maximum value across grouped rows.
39
- """
40
-
41
- def __init__(self) -> None:
42
- super().__init__("max")
43
- self._expected_parameter_count = 1
44
-
45
- def reduce(self, element: MaxReducerElement) -> None:
46
- element.value = self.first_child().value()
47
-
48
- def element(self) -> MaxReducerElement:
49
- return MaxReducerElement()
@@ -1,49 +0,0 @@
1
- """Min aggregate function."""
2
-
3
- from typing import Any
4
-
5
- from .aggregate_function import AggregateFunction
6
- from .function_metadata import FunctionDef
7
- from .reducer_element import ReducerElement
8
-
9
-
10
- class MinReducerElement(ReducerElement):
11
- """Reducer element for Min aggregate function."""
12
-
13
- def __init__(self) -> None:
14
- self._value: Any = None
15
-
16
- @property
17
- def value(self) -> Any:
18
- return self._value
19
-
20
- @value.setter
21
- def value(self, val: Any) -> None:
22
- if self._value is None or val < self._value:
23
- self._value = val
24
-
25
-
26
- @FunctionDef({
27
- "description": "Returns the minimum value across grouped rows",
28
- "category": "aggregate",
29
- "parameters": [
30
- {"name": "value", "description": "Value to compare", "type": "number"}
31
- ],
32
- "output": {"description": "Minimum value", "type": "number", "example": 1},
33
- "examples": ["WITH [3, 1, 2] AS nums UNWIND nums AS n RETURN min(n)"]
34
- })
35
- class Min(AggregateFunction):
36
- """Min aggregate function.
37
-
38
- Returns the minimum value across grouped rows.
39
- """
40
-
41
- def __init__(self) -> None:
42
- super().__init__("min")
43
- self._expected_parameter_count = 1
44
-
45
- def reduce(self, element: MinReducerElement) -> None:
46
- element.value = self.first_child().value()
47
-
48
- def element(self) -> MinReducerElement:
49
- return MinReducerElement()
@@ -1,48 +0,0 @@
1
- """Nodes function."""
2
-
3
- from typing import Any, List
4
-
5
- from .function import Function
6
- from .function_metadata import FunctionDef
7
-
8
-
9
- @FunctionDef({
10
- "description": "Returns all nodes in a path as an array",
11
- "category": "scalar",
12
- "parameters": [
13
- {"name": "path", "description": "A path value returned from a graph pattern match", "type": "array"}
14
- ],
15
- "output": {
16
- "description": "Array of node records", "type": "array",
17
- "example": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
18
- },
19
- "examples": ["MATCH p=(:Person)-[:KNOWS]-(:Person) RETURN nodes(p)"]
20
- })
21
- class Nodes(Function):
22
- """Nodes function.
23
-
24
- Returns all nodes in a path as an array.
25
- """
26
-
27
- def __init__(self) -> None:
28
- super().__init__("nodes")
29
- self._expected_parameter_count = 1
30
-
31
- def value(self) -> Any:
32
- path = self.get_children()[0].value()
33
- if path is None:
34
- return []
35
- if not isinstance(path, list):
36
- raise ValueError("nodes() expects a path (array)")
37
- # A path is an array of alternating node and relationship objects:
38
- # [node, rel, node, rel, node, ...]
39
- # Nodes are plain dicts (have 'id' but not all of 'type'/'startNode'/'endNode'/'properties')
40
- # Relationships are RelationshipMatchRecords (have 'type', 'startNode', 'endNode', 'properties')
41
- result: List[Any] = []
42
- for element in path:
43
- if element is None or not isinstance(element, dict):
44
- continue
45
- # A RelationshipMatchRecord has type, startNode, endNode, properties
46
- if not all(k in element for k in ("type", "startNode", "endNode", "properties")):
47
- result.append(element)
48
- return result
@@ -1,47 +0,0 @@
1
- """Base class for predicate functions in FlowQuery."""
2
-
3
- from typing import TYPE_CHECKING, Any, Optional
4
-
5
- from ..ast_node import ASTNode
6
- from .value_holder import ValueHolder
7
-
8
- if TYPE_CHECKING:
9
- pass
10
-
11
-
12
- class PredicateFunction(ASTNode):
13
- """Base class for predicate functions."""
14
-
15
- def __init__(self, name: Optional[str] = None):
16
- super().__init__()
17
- self._name = name or self.__class__.__name__
18
- self._value_holder = ValueHolder()
19
-
20
- @property
21
- def name(self) -> str:
22
- return self._name
23
-
24
- @property
25
- def reference(self) -> ASTNode:
26
- return self.first_child()
27
-
28
- @property
29
- def array(self) -> ASTNode:
30
- return self.get_children()[1].first_child()
31
-
32
- @property
33
- def _return(self) -> ASTNode:
34
- return self.get_children()[2]
35
-
36
- @property
37
- def where(self) -> Optional[ASTNode]:
38
- # Import at runtime to avoid circular dependency
39
- if len(self.get_children()) == 4:
40
- return self.get_children()[3]
41
- return None
42
-
43
- def value(self) -> Any:
44
- raise NotImplementedError("Method not implemented.")
45
-
46
- def __str__(self) -> str:
47
- return f"PredicateFunction ({self._name})"
@@ -1,49 +0,0 @@
1
- """PredicateSum function."""
2
-
3
- from typing import Any
4
-
5
- from .function_metadata import FunctionDef
6
- from .predicate_function import PredicateFunction
7
-
8
-
9
- @FunctionDef({
10
- "description": (
11
- "Calculates the sum of values in an array with optional filtering. "
12
- "Uses list comprehension syntax: sum(variable IN array [WHERE condition] | expression)"
13
- ),
14
- "category": "predicate",
15
- "parameters": [
16
- {"name": "variable", "description": "Variable name to bind each element", "type": "string"},
17
- {"name": "array", "description": "Array to iterate over", "type": "array"},
18
- {"name": "expression", "description": "Expression to sum for each element", "type": "any"},
19
- {"name": "where", "description": "Optional filter condition", "type": "boolean", "required": False}
20
- ],
21
- "output": {"description": "Sum of the evaluated expressions", "type": "number", "example": 6},
22
- "examples": [
23
- "WITH [1, 2, 3] AS nums RETURN sum(n IN nums | n)",
24
- "WITH [1, 2, 3, 4] AS nums RETURN sum(n IN nums WHERE n > 1 | n * 2)"
25
- ]
26
- })
27
- class PredicateSum(PredicateFunction):
28
- """PredicateSum function.
29
-
30
- Calculates the sum of values in an array with optional filtering.
31
- """
32
-
33
- def __init__(self) -> None:
34
- super().__init__("sum")
35
-
36
- def value(self) -> Any:
37
- ref = self.reference
38
- if hasattr(ref, 'referred'):
39
- ref.referred = self._value_holder
40
- array = self.array.value()
41
- if array is None or not isinstance(array, list):
42
- raise ValueError("Invalid array for sum function")
43
-
44
- _sum: int = 0
45
- for item in array:
46
- self._value_holder.holder = item
47
- if self.where is None or self.where.value():
48
- _sum += self._return.value()
49
- return _sum
@@ -1,50 +0,0 @@
1
- """Properties function."""
2
-
3
- from typing import Any
4
-
5
- from .function import Function
6
- from .function_metadata import FunctionDef
7
-
8
-
9
- @FunctionDef({
10
- "description": (
11
- "Returns a map containing all the properties of a node, relationship, or map. "
12
- "For nodes and relationships, internal identifiers are excluded."
13
- ),
14
- "category": "scalar",
15
- "parameters": [
16
- {"name": "entity", "description": "A node, relationship, or map to extract properties from", "type": "object"}
17
- ],
18
- "output": {"description": "Map of properties", "type": "object", "example": {"name": "Alice", "age": 30}},
19
- "examples": [
20
- "MATCH (n:Person) RETURN properties(n)",
21
- "WITH { name: 'Alice', age: 30 } AS obj RETURN properties(obj)"
22
- ]
23
- })
24
- class Properties(Function):
25
- """Properties function.
26
-
27
- Returns a map containing all the properties of a node, relationship, or map.
28
- """
29
-
30
- def __init__(self) -> None:
31
- super().__init__("properties")
32
- self._expected_parameter_count = 1
33
-
34
- def value(self) -> Any:
35
- obj = self.get_children()[0].value()
36
- if obj is None:
37
- return None
38
- if not isinstance(obj, dict):
39
- raise ValueError("properties() expects a node, relationship, or map")
40
-
41
- # If it's a RelationshipMatchRecord (has type, startNode, endNode, properties)
42
- if all(k in obj for k in ("type", "startNode", "endNode", "properties")):
43
- return obj["properties"]
44
-
45
- # If it's a node record (has id field), exclude id
46
- if "id" in obj:
47
- return {k: v for k, v in obj.items() if k != "id"}
48
-
49
- # Otherwise, treat as a plain map and return a copy
50
- return dict(obj)
@@ -1,28 +0,0 @@
1
- """Rand function."""
2
-
3
- import random
4
- from typing import Any
5
-
6
- from .function import Function
7
- from .function_metadata import FunctionDef
8
-
9
-
10
- @FunctionDef({
11
- "description": "Generates a random number between 0 and 1",
12
- "category": "scalar",
13
- "parameters": [],
14
- "output": {"description": "Random number between 0 and 1", "type": "number", "example": 0.7234},
15
- "examples": ["WITH rand() AS r RETURN r"]
16
- })
17
- class Rand(Function):
18
- """Rand function.
19
-
20
- Generates a random number between 0 and 1.
21
- """
22
-
23
- def __init__(self) -> None:
24
- super().__init__("rand")
25
- self._expected_parameter_count = 0
26
-
27
- def value(self) -> Any:
28
- return random.random()
@@ -1,41 +0,0 @@
1
- """Range function."""
2
-
3
- from typing import Any
4
-
5
- from .function import Function
6
- from .function_metadata import FunctionDef
7
-
8
-
9
- @FunctionDef({
10
- "description": "Generates an array of sequential integers",
11
- "category": "scalar",
12
- "parameters": [
13
- {"name": "start", "description": "Starting number (inclusive)", "type": "number"},
14
- {"name": "end", "description": "Ending number (inclusive)", "type": "number"}
15
- ],
16
- "output": {
17
- "description": "Array of integers from start to end",
18
- "type": "array",
19
- "items": {"type": "number"},
20
- "example": [1, 2, 3, 4, 5]
21
- },
22
- "examples": ["WITH range(1, 5) AS nums RETURN nums"]
23
- })
24
- class Range(Function):
25
- """Range function.
26
-
27
- Generates an array of sequential integers.
28
- """
29
-
30
- def __init__(self) -> None:
31
- super().__init__("range")
32
- self._expected_parameter_count = 2
33
-
34
- def value(self) -> Any:
35
- start = self.get_children()[0].value()
36
- end = self.get_children()[1].value()
37
- if start is None or end is None:
38
- return None
39
- if not isinstance(start, (int, float)) or not isinstance(end, (int, float)):
40
- raise ValueError("Invalid arguments for range function")
41
- return list(range(int(start), int(end) + 1))
@@ -1,15 +0,0 @@
1
- """Reducer element for aggregate functions."""
2
-
3
- from typing import Any
4
-
5
-
6
- class ReducerElement:
7
- """Base class for reducer elements used in aggregate functions."""
8
-
9
- @property
10
- def value(self) -> Any:
11
- raise NotImplementedError("Method not implemented.")
12
-
13
- @value.setter
14
- def value(self, val: Any) -> None:
15
- raise NotImplementedError("Method not implemented.")
@@ -1,46 +0,0 @@
1
- """Relationships function."""
2
-
3
- from typing import Any, List
4
-
5
- from .function import Function
6
- from .function_metadata import FunctionDef
7
-
8
-
9
- @FunctionDef({
10
- "description": "Returns all relationships in a path as an array",
11
- "category": "scalar",
12
- "parameters": [
13
- {"name": "path", "description": "A path value returned from a graph pattern match", "type": "array"}
14
- ],
15
- "output": {
16
- "description": "Array of relationship records", "type": "array",
17
- "example": [{"type": "KNOWS", "properties": {"since": "2020"}}]
18
- },
19
- "examples": ["MATCH p=(:Person)-[:KNOWS]-(:Person) RETURN relationships(p)"]
20
- })
21
- class Relationships(Function):
22
- """Relationships function.
23
-
24
- Returns all relationships in a path as an array.
25
- """
26
-
27
- def __init__(self) -> None:
28
- super().__init__("relationships")
29
- self._expected_parameter_count = 1
30
-
31
- def value(self) -> Any:
32
- path = self.get_children()[0].value()
33
- if path is None:
34
- return []
35
- if not isinstance(path, list):
36
- raise ValueError("relationships() expects a path (array)")
37
- # A path is an array of alternating node and relationship objects:
38
- # [node, rel, node, rel, node, ...]
39
- # Relationships are RelationshipMatchRecords (have 'type', 'startNode', 'endNode', 'properties')
40
- result: List[Any] = []
41
- for element in path:
42
- if element is None or not isinstance(element, dict):
43
- continue
44
- if all(k in element for k in ("type", "startNode", "endNode", "properties")):
45
- result.append(element)
46
- return result
@@ -1,39 +0,0 @@
1
- """Replace function."""
2
-
3
- import re
4
- from typing import Any
5
-
6
- from .function import Function
7
- from .function_metadata import FunctionDef
8
-
9
-
10
- @FunctionDef({
11
- "description": "Replaces occurrences of a pattern in a string",
12
- "category": "scalar",
13
- "parameters": [
14
- {"name": "text", "description": "Source string", "type": "string"},
15
- {"name": "pattern", "description": "Pattern to find", "type": "string"},
16
- {"name": "replacement", "description": "Replacement string", "type": "string"}
17
- ],
18
- "output": {"description": "String with replacements", "type": "string", "example": "hello world"},
19
- "examples": ["WITH 'hello there' AS s RETURN replace(s, 'there', 'world')"]
20
- })
21
- class Replace(Function):
22
- """Replace function.
23
-
24
- Replaces occurrences of a pattern in a string.
25
- """
26
-
27
- def __init__(self) -> None:
28
- super().__init__("replace")
29
- self._expected_parameter_count = 3
30
-
31
- def value(self) -> Any:
32
- text = self.get_children()[0].value()
33
- pattern = self.get_children()[1].value()
34
- replacement = self.get_children()[2].value()
35
- if text is None:
36
- return None
37
- if not isinstance(text, str) or not isinstance(pattern, str) or not isinstance(replacement, str):
38
- raise ValueError("Invalid arguments for replace function")
39
- return re.sub(re.escape(pattern), replacement, text)
@@ -1,34 +0,0 @@
1
- """Round function."""
2
-
3
- from typing import Any
4
-
5
- from .function import Function
6
- from .function_metadata import FunctionDef
7
-
8
-
9
- @FunctionDef({
10
- "description": "Rounds a number to the nearest integer",
11
- "category": "scalar",
12
- "parameters": [
13
- {"name": "value", "description": "Number to round", "type": "number"}
14
- ],
15
- "output": {"description": "Rounded integer", "type": "number", "example": 4},
16
- "examples": ["WITH 3.7 AS n RETURN round(n)"]
17
- })
18
- class Round(Function):
19
- """Round function.
20
-
21
- Rounds a number to the nearest integer.
22
- """
23
-
24
- def __init__(self) -> None:
25
- super().__init__("round")
26
- self._expected_parameter_count = 1
27
-
28
- def value(self) -> Any:
29
- val = self.get_children()[0].value()
30
- if val is None:
31
- return None
32
- if not isinstance(val, (int, float)):
33
- raise ValueError("Invalid argument for round function")
34
- return round(val)
@@ -1,40 +0,0 @@
1
- """Schema introspection function."""
2
-
3
- from typing import Any, AsyncGenerator
4
-
5
- from .async_function import AsyncFunction
6
- from .function_metadata import FunctionDef
7
-
8
-
9
- @FunctionDef({
10
- "description": (
11
- "Returns the graph schema listing all nodes and relationships "
12
- "with their properties and a sample of their data."
13
- ),
14
- "category": "async",
15
- "parameters": [],
16
- "output": {
17
- "description": "Schema entry with label/type, properties, and optional sample data",
18
- "type": "object",
19
- },
20
- "examples": [
21
- "CALL schema() YIELD label, type, from_label, to_label, properties, sample "
22
- "RETURN label, type, from_label, to_label, properties, sample",
23
- ],
24
- })
25
- class Schema(AsyncFunction):
26
- """Returns the graph schema of the database.
27
-
28
- Lists all nodes and relationships with their labels/types, properties,
29
- and a sample of their data (excluding id from nodes, left_id and right_id from relationships).
30
-
31
- Nodes: {label, properties, sample}
32
- Relationships: {type, from_label, to_label, properties, sample}
33
- """
34
-
35
- async def generate(self) -> AsyncGenerator[Any, None]:
36
- # Import at runtime to avoid circular dependency
37
- from ...graph.database import Database
38
- entries = await Database.get_instance().schema()
39
- for entry in entries:
40
- yield entry
@@ -1,34 +0,0 @@
1
- """Size function."""
2
-
3
- from typing import Any
4
-
5
- from .function import Function
6
- from .function_metadata import FunctionDef
7
-
8
-
9
- @FunctionDef({
10
- "description": "Returns the length of an array or string",
11
- "category": "scalar",
12
- "parameters": [
13
- {"name": "value", "description": "Array or string to measure", "type": "array"}
14
- ],
15
- "output": {"description": "Length of the input", "type": "number", "example": 3},
16
- "examples": ["WITH [1, 2, 3] AS arr RETURN size(arr)"]
17
- })
18
- class Size(Function):
19
- """Size function.
20
-
21
- Returns the length of an array or string.
22
- """
23
-
24
- def __init__(self) -> None:
25
- super().__init__("size")
26
- self._expected_parameter_count = 1
27
-
28
- def value(self) -> Any:
29
- val = self.get_children()[0].value()
30
- if val is None:
31
- return None
32
- if not isinstance(val, (list, str)):
33
- raise ValueError("Invalid argument for size function")
34
- return len(val)