flowquery 1.0.46 → 1.0.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/package.json +4 -1
- package/.editorconfig +0 -21
- package/.gitattributes +0 -3
- package/.github/workflows/npm-publish.yml +0 -32
- package/.github/workflows/python-publish.yml +0 -143
- package/.github/workflows/release.yml +0 -107
- package/.husky/pre-commit +0 -28
- package/.prettierrc +0 -22
- package/CODE_OF_CONDUCT.md +0 -10
- package/FlowQueryLogoIcon.png +0 -0
- package/SECURITY.md +0 -14
- package/SUPPORT.md +0 -13
- package/docs/flowquery.min.js +0 -1
- package/docs/index.html +0 -105
- package/flowquery-py/CONTRIBUTING.md +0 -127
- package/flowquery-py/README.md +0 -67
- package/flowquery-py/misc/data/test.json +0 -10
- package/flowquery-py/misc/data/users.json +0 -242
- package/flowquery-py/notebooks/TestFlowQuery.ipynb +0 -440
- package/flowquery-py/pyproject.toml +0 -121
- package/flowquery-py/setup_env.ps1 +0 -92
- package/flowquery-py/setup_env.sh +0 -87
- package/flowquery-py/src/__init__.py +0 -38
- package/flowquery-py/src/__main__.py +0 -10
- package/flowquery-py/src/compute/__init__.py +0 -6
- package/flowquery-py/src/compute/flowquery.py +0 -68
- package/flowquery-py/src/compute/runner.py +0 -64
- package/flowquery-py/src/extensibility.py +0 -52
- package/flowquery-py/src/graph/__init__.py +0 -31
- package/flowquery-py/src/graph/data.py +0 -136
- package/flowquery-py/src/graph/database.py +0 -141
- package/flowquery-py/src/graph/hops.py +0 -43
- package/flowquery-py/src/graph/node.py +0 -143
- package/flowquery-py/src/graph/node_data.py +0 -26
- package/flowquery-py/src/graph/node_reference.py +0 -50
- package/flowquery-py/src/graph/pattern.py +0 -115
- package/flowquery-py/src/graph/pattern_expression.py +0 -67
- package/flowquery-py/src/graph/patterns.py +0 -42
- package/flowquery-py/src/graph/physical_node.py +0 -41
- package/flowquery-py/src/graph/physical_relationship.py +0 -36
- package/flowquery-py/src/graph/relationship.py +0 -193
- package/flowquery-py/src/graph/relationship_data.py +0 -36
- package/flowquery-py/src/graph/relationship_match_collector.py +0 -85
- package/flowquery-py/src/graph/relationship_reference.py +0 -21
- package/flowquery-py/src/io/__init__.py +0 -5
- package/flowquery-py/src/io/command_line.py +0 -108
- package/flowquery-py/src/parsing/__init__.py +0 -17
- package/flowquery-py/src/parsing/alias.py +0 -20
- package/flowquery-py/src/parsing/alias_option.py +0 -11
- package/flowquery-py/src/parsing/ast_node.py +0 -147
- package/flowquery-py/src/parsing/base_parser.py +0 -84
- package/flowquery-py/src/parsing/components/__init__.py +0 -19
- package/flowquery-py/src/parsing/components/csv.py +0 -8
- package/flowquery-py/src/parsing/components/from_.py +0 -12
- package/flowquery-py/src/parsing/components/headers.py +0 -12
- package/flowquery-py/src/parsing/components/json.py +0 -8
- package/flowquery-py/src/parsing/components/null.py +0 -10
- package/flowquery-py/src/parsing/components/post.py +0 -8
- package/flowquery-py/src/parsing/components/text.py +0 -8
- package/flowquery-py/src/parsing/context.py +0 -50
- package/flowquery-py/src/parsing/data_structures/__init__.py +0 -15
- package/flowquery-py/src/parsing/data_structures/associative_array.py +0 -41
- package/flowquery-py/src/parsing/data_structures/json_array.py +0 -30
- package/flowquery-py/src/parsing/data_structures/key_value_pair.py +0 -38
- package/flowquery-py/src/parsing/data_structures/lookup.py +0 -51
- package/flowquery-py/src/parsing/data_structures/range_lookup.py +0 -42
- package/flowquery-py/src/parsing/expressions/__init__.py +0 -61
- package/flowquery-py/src/parsing/expressions/boolean.py +0 -20
- package/flowquery-py/src/parsing/expressions/expression.py +0 -141
- package/flowquery-py/src/parsing/expressions/expression_map.py +0 -26
- package/flowquery-py/src/parsing/expressions/f_string.py +0 -27
- package/flowquery-py/src/parsing/expressions/identifier.py +0 -21
- package/flowquery-py/src/parsing/expressions/number.py +0 -32
- package/flowquery-py/src/parsing/expressions/operator.py +0 -271
- package/flowquery-py/src/parsing/expressions/reference.py +0 -47
- package/flowquery-py/src/parsing/expressions/string.py +0 -27
- package/flowquery-py/src/parsing/functions/__init__.py +0 -127
- package/flowquery-py/src/parsing/functions/aggregate_function.py +0 -60
- package/flowquery-py/src/parsing/functions/async_function.py +0 -65
- package/flowquery-py/src/parsing/functions/avg.py +0 -55
- package/flowquery-py/src/parsing/functions/coalesce.py +0 -43
- package/flowquery-py/src/parsing/functions/collect.py +0 -75
- package/flowquery-py/src/parsing/functions/count.py +0 -79
- package/flowquery-py/src/parsing/functions/date_.py +0 -61
- package/flowquery-py/src/parsing/functions/datetime_.py +0 -62
- package/flowquery-py/src/parsing/functions/duration.py +0 -159
- package/flowquery-py/src/parsing/functions/element_id.py +0 -50
- package/flowquery-py/src/parsing/functions/function.py +0 -68
- package/flowquery-py/src/parsing/functions/function_factory.py +0 -170
- package/flowquery-py/src/parsing/functions/function_metadata.py +0 -148
- package/flowquery-py/src/parsing/functions/functions.py +0 -67
- package/flowquery-py/src/parsing/functions/head.py +0 -39
- package/flowquery-py/src/parsing/functions/id_.py +0 -49
- package/flowquery-py/src/parsing/functions/join.py +0 -49
- package/flowquery-py/src/parsing/functions/keys.py +0 -34
- package/flowquery-py/src/parsing/functions/last.py +0 -39
- package/flowquery-py/src/parsing/functions/localdatetime.py +0 -60
- package/flowquery-py/src/parsing/functions/localtime.py +0 -57
- package/flowquery-py/src/parsing/functions/max_.py +0 -49
- package/flowquery-py/src/parsing/functions/min_.py +0 -49
- package/flowquery-py/src/parsing/functions/nodes.py +0 -48
- package/flowquery-py/src/parsing/functions/predicate_function.py +0 -47
- package/flowquery-py/src/parsing/functions/predicate_sum.py +0 -49
- package/flowquery-py/src/parsing/functions/properties.py +0 -50
- package/flowquery-py/src/parsing/functions/rand.py +0 -28
- package/flowquery-py/src/parsing/functions/range_.py +0 -41
- package/flowquery-py/src/parsing/functions/reducer_element.py +0 -15
- package/flowquery-py/src/parsing/functions/relationships.py +0 -46
- package/flowquery-py/src/parsing/functions/replace.py +0 -39
- package/flowquery-py/src/parsing/functions/round_.py +0 -34
- package/flowquery-py/src/parsing/functions/schema.py +0 -40
- package/flowquery-py/src/parsing/functions/size.py +0 -34
- package/flowquery-py/src/parsing/functions/split.py +0 -54
- package/flowquery-py/src/parsing/functions/string_distance.py +0 -92
- package/flowquery-py/src/parsing/functions/stringify.py +0 -49
- package/flowquery-py/src/parsing/functions/substring.py +0 -76
- package/flowquery-py/src/parsing/functions/sum.py +0 -51
- package/flowquery-py/src/parsing/functions/tail.py +0 -37
- package/flowquery-py/src/parsing/functions/temporal_utils.py +0 -186
- package/flowquery-py/src/parsing/functions/time_.py +0 -57
- package/flowquery-py/src/parsing/functions/timestamp.py +0 -37
- package/flowquery-py/src/parsing/functions/to_float.py +0 -46
- package/flowquery-py/src/parsing/functions/to_integer.py +0 -46
- package/flowquery-py/src/parsing/functions/to_json.py +0 -35
- package/flowquery-py/src/parsing/functions/to_lower.py +0 -37
- package/flowquery-py/src/parsing/functions/to_string.py +0 -41
- package/flowquery-py/src/parsing/functions/trim.py +0 -37
- package/flowquery-py/src/parsing/functions/type_.py +0 -47
- package/flowquery-py/src/parsing/functions/value_holder.py +0 -24
- package/flowquery-py/src/parsing/logic/__init__.py +0 -15
- package/flowquery-py/src/parsing/logic/case.py +0 -28
- package/flowquery-py/src/parsing/logic/else_.py +0 -12
- package/flowquery-py/src/parsing/logic/end.py +0 -8
- package/flowquery-py/src/parsing/logic/then.py +0 -12
- package/flowquery-py/src/parsing/logic/when.py +0 -12
- package/flowquery-py/src/parsing/operations/__init__.py +0 -46
- package/flowquery-py/src/parsing/operations/aggregated_return.py +0 -25
- package/flowquery-py/src/parsing/operations/aggregated_with.py +0 -22
- package/flowquery-py/src/parsing/operations/call.py +0 -73
- package/flowquery-py/src/parsing/operations/create_node.py +0 -35
- package/flowquery-py/src/parsing/operations/create_relationship.py +0 -35
- package/flowquery-py/src/parsing/operations/delete_node.py +0 -29
- package/flowquery-py/src/parsing/operations/delete_relationship.py +0 -29
- package/flowquery-py/src/parsing/operations/group_by.py +0 -148
- package/flowquery-py/src/parsing/operations/limit.py +0 -33
- package/flowquery-py/src/parsing/operations/load.py +0 -148
- package/flowquery-py/src/parsing/operations/match.py +0 -52
- package/flowquery-py/src/parsing/operations/operation.py +0 -69
- package/flowquery-py/src/parsing/operations/order_by.py +0 -114
- package/flowquery-py/src/parsing/operations/projection.py +0 -21
- package/flowquery-py/src/parsing/operations/return_op.py +0 -88
- package/flowquery-py/src/parsing/operations/union.py +0 -115
- package/flowquery-py/src/parsing/operations/union_all.py +0 -17
- package/flowquery-py/src/parsing/operations/unwind.py +0 -42
- package/flowquery-py/src/parsing/operations/where.py +0 -43
- package/flowquery-py/src/parsing/operations/with_op.py +0 -18
- package/flowquery-py/src/parsing/parser.py +0 -1384
- package/flowquery-py/src/parsing/parser_state.py +0 -26
- package/flowquery-py/src/parsing/token_to_node.py +0 -109
- package/flowquery-py/src/tokenization/__init__.py +0 -23
- package/flowquery-py/src/tokenization/keyword.py +0 -54
- package/flowquery-py/src/tokenization/operator.py +0 -29
- package/flowquery-py/src/tokenization/string_walker.py +0 -158
- package/flowquery-py/src/tokenization/symbol.py +0 -19
- package/flowquery-py/src/tokenization/token.py +0 -693
- package/flowquery-py/src/tokenization/token_mapper.py +0 -53
- package/flowquery-py/src/tokenization/token_type.py +0 -21
- package/flowquery-py/src/tokenization/tokenizer.py +0 -214
- package/flowquery-py/src/tokenization/trie.py +0 -125
- package/flowquery-py/src/utils/__init__.py +0 -6
- package/flowquery-py/src/utils/object_utils.py +0 -20
- package/flowquery-py/src/utils/string_utils.py +0 -113
- package/flowquery-py/tests/__init__.py +0 -1
- package/flowquery-py/tests/compute/__init__.py +0 -1
- package/flowquery-py/tests/compute/test_runner.py +0 -4902
- package/flowquery-py/tests/graph/__init__.py +0 -1
- package/flowquery-py/tests/graph/test_create.py +0 -56
- package/flowquery-py/tests/graph/test_data.py +0 -73
- package/flowquery-py/tests/graph/test_match.py +0 -40
- package/flowquery-py/tests/parsing/__init__.py +0 -1
- package/flowquery-py/tests/parsing/test_context.py +0 -34
- package/flowquery-py/tests/parsing/test_expression.py +0 -248
- package/flowquery-py/tests/parsing/test_parser.py +0 -1237
- package/flowquery-py/tests/test_extensibility.py +0 -611
- package/flowquery-py/tests/tokenization/__init__.py +0 -1
- package/flowquery-py/tests/tokenization/test_token_mapper.py +0 -60
- package/flowquery-py/tests/tokenization/test_tokenizer.py +0 -198
- package/flowquery-py/tests/tokenization/test_trie.py +0 -30
- package/flowquery-vscode/.vscode-test.mjs +0 -5
- package/flowquery-vscode/.vscodeignore +0 -13
- package/flowquery-vscode/LICENSE +0 -21
- package/flowquery-vscode/README.md +0 -11
- package/flowquery-vscode/demo/FlowQueryVSCodeDemo.gif +0 -0
- package/flowquery-vscode/eslint.config.mjs +0 -25
- package/flowquery-vscode/extension.js +0 -508
- package/flowquery-vscode/flowQueryEngine/flowquery.min.js +0 -1
- package/flowquery-vscode/flowquery-worker.js +0 -66
- package/flowquery-vscode/images/FlowQueryLogoIcon.png +0 -0
- package/flowquery-vscode/jsconfig.json +0 -13
- package/flowquery-vscode/libs/page.css +0 -53
- package/flowquery-vscode/libs/table.css +0 -13
- package/flowquery-vscode/libs/tabs.css +0 -66
- package/flowquery-vscode/package-lock.json +0 -2917
- package/flowquery-vscode/package.json +0 -51
- package/flowquery-vscode/test/extension.test.js +0 -196
- package/flowquery-vscode/test/worker.test.js +0 -25
- package/flowquery-vscode/vsc-extension-quickstart.md +0 -42
- package/jest.config.js +0 -14
- package/misc/apps/RAG/README.md +0 -29
- package/misc/apps/RAG/data/chats.json +0 -302
- package/misc/apps/RAG/data/emails.json +0 -182
- package/misc/apps/RAG/data/events.json +0 -226
- package/misc/apps/RAG/data/files.json +0 -172
- package/misc/apps/RAG/data/users.json +0 -158
- package/misc/apps/RAG/jest.config.js +0 -21
- package/misc/apps/RAG/package.json +0 -48
- package/misc/apps/RAG/public/index.html +0 -18
- package/misc/apps/RAG/src/App.css +0 -42
- package/misc/apps/RAG/src/App.tsx +0 -50
- package/misc/apps/RAG/src/components/AdaptiveCardRenderer.css +0 -172
- package/misc/apps/RAG/src/components/AdaptiveCardRenderer.tsx +0 -380
- package/misc/apps/RAG/src/components/ApiKeySettings.tsx +0 -245
- package/misc/apps/RAG/src/components/ChatContainer.css +0 -67
- package/misc/apps/RAG/src/components/ChatContainer.tsx +0 -242
- package/misc/apps/RAG/src/components/ChatInput.css +0 -23
- package/misc/apps/RAG/src/components/ChatInput.tsx +0 -76
- package/misc/apps/RAG/src/components/ChatMessage.css +0 -160
- package/misc/apps/RAG/src/components/ChatMessage.tsx +0 -286
- package/misc/apps/RAG/src/components/FlowQueryAgent.ts +0 -708
- package/misc/apps/RAG/src/components/FlowQueryRunner.css +0 -113
- package/misc/apps/RAG/src/components/FlowQueryRunner.tsx +0 -371
- package/misc/apps/RAG/src/components/index.ts +0 -28
- package/misc/apps/RAG/src/graph/index.ts +0 -19
- package/misc/apps/RAG/src/graph/initializeGraph.ts +0 -254
- package/misc/apps/RAG/src/index.tsx +0 -29
- package/misc/apps/RAG/src/prompts/FlowQuerySystemPrompt.ts +0 -327
- package/misc/apps/RAG/src/prompts/index.ts +0 -10
- package/misc/apps/RAG/src/tests/graph.test.ts +0 -35
- package/misc/apps/RAG/src/utils/FlowQueryExecutor.ts +0 -130
- package/misc/apps/RAG/src/utils/FlowQueryExtractor.ts +0 -208
- package/misc/apps/RAG/src/utils/Llm.ts +0 -248
- package/misc/apps/RAG/src/utils/index.ts +0 -12
- package/misc/apps/RAG/tsconfig.json +0 -22
- package/misc/apps/RAG/webpack.config.js +0 -43
- package/misc/apps/README.md +0 -1
- package/misc/queries/analyze_catfacts.cql +0 -75
- package/misc/queries/azure_openai_completions.cql +0 -13
- package/misc/queries/azure_openai_models.cql +0 -9
- package/misc/queries/mock_pipeline.cql +0 -84
- package/misc/queries/openai_completions.cql +0 -15
- package/misc/queries/openai_models.cql +0 -13
- package/misc/queries/test.cql +0 -6
- package/misc/queries/tool_inference.cql +0 -24
- package/misc/queries/wisdom.cql +0 -6
- package/misc/queries/wisdom_letter_histogram.cql +0 -8
- package/src/compute/flowquery.ts +0 -46
- package/src/compute/runner.ts +0 -66
- package/src/extensibility.ts +0 -45
- package/src/graph/data.ts +0 -130
- package/src/graph/database.ts +0 -143
- package/src/graph/hops.ts +0 -22
- package/src/graph/node.ts +0 -122
- package/src/graph/node_data.ts +0 -18
- package/src/graph/node_reference.ts +0 -38
- package/src/graph/pattern.ts +0 -110
- package/src/graph/pattern_expression.ts +0 -48
- package/src/graph/patterns.ts +0 -36
- package/src/graph/physical_node.ts +0 -23
- package/src/graph/physical_relationship.ts +0 -23
- package/src/graph/relationship.ts +0 -167
- package/src/graph/relationship_data.ts +0 -31
- package/src/graph/relationship_match_collector.ts +0 -64
- package/src/graph/relationship_reference.ts +0 -25
- package/src/index.browser.ts +0 -46
- package/src/index.node.ts +0 -55
- package/src/index.ts +0 -12
- package/src/io/command_line.ts +0 -74
- package/src/parsing/alias.ts +0 -23
- package/src/parsing/alias_option.ts +0 -5
- package/src/parsing/ast_node.ts +0 -153
- package/src/parsing/base_parser.ts +0 -98
- package/src/parsing/components/csv.ts +0 -9
- package/src/parsing/components/from.ts +0 -12
- package/src/parsing/components/headers.ts +0 -12
- package/src/parsing/components/json.ts +0 -9
- package/src/parsing/components/null.ts +0 -9
- package/src/parsing/components/post.ts +0 -9
- package/src/parsing/components/text.ts +0 -9
- package/src/parsing/context.ts +0 -54
- package/src/parsing/data_structures/associative_array.ts +0 -43
- package/src/parsing/data_structures/json_array.ts +0 -31
- package/src/parsing/data_structures/key_value_pair.ts +0 -37
- package/src/parsing/data_structures/lookup.ts +0 -44
- package/src/parsing/data_structures/range_lookup.ts +0 -36
- package/src/parsing/expressions/boolean.ts +0 -21
- package/src/parsing/expressions/expression.ts +0 -150
- package/src/parsing/expressions/expression_map.ts +0 -22
- package/src/parsing/expressions/f_string.ts +0 -26
- package/src/parsing/expressions/identifier.ts +0 -22
- package/src/parsing/expressions/number.ts +0 -40
- package/src/parsing/expressions/operator.ts +0 -354
- package/src/parsing/expressions/reference.ts +0 -45
- package/src/parsing/expressions/string.ts +0 -34
- package/src/parsing/functions/aggregate_function.ts +0 -58
- package/src/parsing/functions/async_function.ts +0 -64
- package/src/parsing/functions/avg.ts +0 -47
- package/src/parsing/functions/coalesce.ts +0 -49
- package/src/parsing/functions/collect.ts +0 -54
- package/src/parsing/functions/count.ts +0 -54
- package/src/parsing/functions/date.ts +0 -63
- package/src/parsing/functions/datetime.ts +0 -63
- package/src/parsing/functions/duration.ts +0 -143
- package/src/parsing/functions/element_id.ts +0 -51
- package/src/parsing/functions/function.ts +0 -60
- package/src/parsing/functions/function_factory.ts +0 -195
- package/src/parsing/functions/function_metadata.ts +0 -217
- package/src/parsing/functions/functions.ts +0 -70
- package/src/parsing/functions/head.ts +0 -42
- package/src/parsing/functions/id.ts +0 -51
- package/src/parsing/functions/join.ts +0 -40
- package/src/parsing/functions/keys.ts +0 -29
- package/src/parsing/functions/last.ts +0 -42
- package/src/parsing/functions/localdatetime.ts +0 -63
- package/src/parsing/functions/localtime.ts +0 -58
- package/src/parsing/functions/max.ts +0 -37
- package/src/parsing/functions/min.ts +0 -37
- package/src/parsing/functions/nodes.ts +0 -54
- package/src/parsing/functions/predicate_function.ts +0 -48
- package/src/parsing/functions/predicate_sum.ts +0 -47
- package/src/parsing/functions/properties.ts +0 -56
- package/src/parsing/functions/rand.ts +0 -21
- package/src/parsing/functions/range.ts +0 -37
- package/src/parsing/functions/reducer_element.ts +0 -10
- package/src/parsing/functions/relationships.ts +0 -52
- package/src/parsing/functions/replace.ts +0 -38
- package/src/parsing/functions/round.ts +0 -28
- package/src/parsing/functions/schema.ts +0 -39
- package/src/parsing/functions/size.ts +0 -28
- package/src/parsing/functions/split.ts +0 -45
- package/src/parsing/functions/string_distance.ts +0 -83
- package/src/parsing/functions/stringify.ts +0 -37
- package/src/parsing/functions/substring.ts +0 -68
- package/src/parsing/functions/sum.ts +0 -41
- package/src/parsing/functions/tail.ts +0 -39
- package/src/parsing/functions/temporal_utils.ts +0 -180
- package/src/parsing/functions/time.ts +0 -58
- package/src/parsing/functions/timestamp.ts +0 -37
- package/src/parsing/functions/to_float.ts +0 -50
- package/src/parsing/functions/to_integer.ts +0 -50
- package/src/parsing/functions/to_json.ts +0 -28
- package/src/parsing/functions/to_lower.ts +0 -28
- package/src/parsing/functions/to_string.ts +0 -32
- package/src/parsing/functions/trim.ts +0 -28
- package/src/parsing/functions/type.ts +0 -39
- package/src/parsing/functions/value_holder.ts +0 -13
- package/src/parsing/logic/case.ts +0 -26
- package/src/parsing/logic/else.ts +0 -12
- package/src/parsing/logic/end.ts +0 -9
- package/src/parsing/logic/then.ts +0 -12
- package/src/parsing/logic/when.ts +0 -12
- package/src/parsing/operations/aggregated_return.ts +0 -22
- package/src/parsing/operations/aggregated_with.ts +0 -18
- package/src/parsing/operations/call.ts +0 -69
- package/src/parsing/operations/create_node.ts +0 -39
- package/src/parsing/operations/create_relationship.ts +0 -38
- package/src/parsing/operations/delete_node.ts +0 -33
- package/src/parsing/operations/delete_relationship.ts +0 -32
- package/src/parsing/operations/group_by.ts +0 -137
- package/src/parsing/operations/limit.ts +0 -31
- package/src/parsing/operations/load.ts +0 -146
- package/src/parsing/operations/match.ts +0 -54
- package/src/parsing/operations/operation.ts +0 -69
- package/src/parsing/operations/order_by.ts +0 -126
- package/src/parsing/operations/projection.ts +0 -18
- package/src/parsing/operations/return.ts +0 -76
- package/src/parsing/operations/union.ts +0 -114
- package/src/parsing/operations/union_all.ts +0 -16
- package/src/parsing/operations/unwind.ts +0 -36
- package/src/parsing/operations/where.ts +0 -42
- package/src/parsing/operations/with.ts +0 -20
- package/src/parsing/parser.ts +0 -1641
- package/src/parsing/parser_state.ts +0 -25
- package/src/parsing/token_to_node.ts +0 -114
- package/src/tokenization/keyword.ts +0 -50
- package/src/tokenization/operator.ts +0 -25
- package/src/tokenization/string_walker.ts +0 -197
- package/src/tokenization/symbol.ts +0 -15
- package/src/tokenization/token.ts +0 -764
- package/src/tokenization/token_mapper.ts +0 -53
- package/src/tokenization/token_type.ts +0 -16
- package/src/tokenization/tokenizer.ts +0 -250
- package/src/tokenization/trie.ts +0 -117
- package/src/utils/object_utils.ts +0 -17
- package/src/utils/string_utils.ts +0 -114
- package/tests/compute/runner.test.ts +0 -4559
- package/tests/extensibility.test.ts +0 -643
- package/tests/graph/create.test.ts +0 -36
- package/tests/graph/data.test.ts +0 -58
- package/tests/graph/match.test.ts +0 -29
- package/tests/parsing/context.test.ts +0 -27
- package/tests/parsing/expression.test.ts +0 -303
- package/tests/parsing/parser.test.ts +0 -1327
- package/tests/tokenization/token_mapper.test.ts +0 -47
- package/tests/tokenization/tokenizer.test.ts +0 -191
- package/tests/tokenization/trie.test.ts +0 -20
- package/tsconfig.json +0 -19
- package/typedoc.json +0 -16
- package/vscode-settings.json.recommended +0 -16
- package/webpack.config.js +0 -26
|
@@ -1,643 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AggregateFunction,
|
|
3
|
-
AsyncFunction,
|
|
4
|
-
Function,
|
|
5
|
-
FunctionCategory,
|
|
6
|
-
FunctionDef,
|
|
7
|
-
FunctionDefOptions,
|
|
8
|
-
FunctionMetadata,
|
|
9
|
-
OutputSchema,
|
|
10
|
-
ParameterSchema,
|
|
11
|
-
PredicateFunction,
|
|
12
|
-
ReducerElement,
|
|
13
|
-
} from "../src/extensibility";
|
|
14
|
-
import {
|
|
15
|
-
getFunctionMetadata,
|
|
16
|
-
getRegisteredFunctionFactory,
|
|
17
|
-
} from "../src/parsing/functions/function_metadata";
|
|
18
|
-
|
|
19
|
-
describe("Extensibility API Exports", () => {
|
|
20
|
-
test("Function class is exported and can be extended", () => {
|
|
21
|
-
class CustomFunction extends Function {
|
|
22
|
-
constructor() {
|
|
23
|
-
super("customFunc");
|
|
24
|
-
this._expectedParameterCount = 1;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public value(): string {
|
|
28
|
-
return "custom value";
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const func = new CustomFunction();
|
|
33
|
-
expect(func.name).toBe("customFunc");
|
|
34
|
-
expect(func.toString()).toBe("Function (customFunc)");
|
|
35
|
-
expect(func.value()).toBe("custom value");
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test("Function validates parameter count when set", () => {
|
|
39
|
-
class TwoParamFunction extends Function {
|
|
40
|
-
constructor() {
|
|
41
|
-
super("twoParam");
|
|
42
|
-
this._expectedParameterCount = 2;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const func = new TwoParamFunction();
|
|
47
|
-
|
|
48
|
-
// Should throw when wrong number of parameters
|
|
49
|
-
expect(() => {
|
|
50
|
-
func.parameters = [];
|
|
51
|
-
}).toThrow("Function twoParam expected 2 parameters, but got 0");
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
test("Function without expected parameter count accepts any number", () => {
|
|
55
|
-
class FlexibleFunction extends Function {
|
|
56
|
-
constructor() {
|
|
57
|
-
super("flexible");
|
|
58
|
-
// _expectedParameterCount is null by default
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const func = new FlexibleFunction();
|
|
63
|
-
// Should not throw
|
|
64
|
-
func.parameters = [];
|
|
65
|
-
expect(func.getChildren().length).toBe(0);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test("AggregateFunction class is exported and can be extended", () => {
|
|
69
|
-
class SumElement extends ReducerElement {
|
|
70
|
-
private _value: number = 0;
|
|
71
|
-
public get value(): number {
|
|
72
|
-
return this._value;
|
|
73
|
-
}
|
|
74
|
-
public set value(v: number) {
|
|
75
|
-
this._value = v;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
class CustomSum extends AggregateFunction {
|
|
80
|
-
private _total: number = 0;
|
|
81
|
-
|
|
82
|
-
constructor() {
|
|
83
|
-
super("customSum");
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
public reduce(element: ReducerElement): void {
|
|
87
|
-
this._total += element.value;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
public element(): ReducerElement {
|
|
91
|
-
const el = new SumElement();
|
|
92
|
-
el.value = this._total;
|
|
93
|
-
return el;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
public value(): number {
|
|
97
|
-
return this._total;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const agg = new CustomSum();
|
|
102
|
-
expect(agg.name).toBe("customSum");
|
|
103
|
-
|
|
104
|
-
const elem = new SumElement();
|
|
105
|
-
elem.value = 5;
|
|
106
|
-
agg.reduce(elem);
|
|
107
|
-
expect(agg.value()).toBe(5);
|
|
108
|
-
|
|
109
|
-
const elem2 = new SumElement();
|
|
110
|
-
elem2.value = 3;
|
|
111
|
-
agg.reduce(elem2);
|
|
112
|
-
expect(agg.value()).toBe(8);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
test("PredicateFunction class is exported and can be extended", () => {
|
|
116
|
-
class CustomPredicate extends PredicateFunction {
|
|
117
|
-
constructor() {
|
|
118
|
-
super("customPredicate");
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
public value(): boolean {
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const pred = new CustomPredicate();
|
|
127
|
-
expect(pred.name).toBe("customPredicate");
|
|
128
|
-
expect(pred.toString()).toBe("PredicateFunction (customPredicate)");
|
|
129
|
-
expect(pred.value()).toBe(true);
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
test("AsyncFunction class is exported and can be instantiated", () => {
|
|
133
|
-
const asyncFunc = new AsyncFunction("testAsync");
|
|
134
|
-
expect(asyncFunc.name).toBe("testAsync");
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
test("ReducerElement class is exported and can be extended", () => {
|
|
138
|
-
class NumberElement extends ReducerElement {
|
|
139
|
-
private _num: number = 0;
|
|
140
|
-
|
|
141
|
-
public get value(): number {
|
|
142
|
-
return this._num;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
public set value(v: number) {
|
|
146
|
-
this._num = v;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const elem = new NumberElement();
|
|
151
|
-
elem.value = 42;
|
|
152
|
-
expect(elem.value).toBe(42);
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
describe("FunctionDef Decorator", () => {
|
|
157
|
-
test("FunctionDef decorator can be applied to a scalar function", () => {
|
|
158
|
-
@FunctionDef({
|
|
159
|
-
description: "Test function for extensibility",
|
|
160
|
-
category: "scalar",
|
|
161
|
-
parameters: [{ name: "input", description: "Input value", type: "string" }],
|
|
162
|
-
output: { description: "Output value", type: "string" },
|
|
163
|
-
examples: ["RETURN testExtFunc('hello')"],
|
|
164
|
-
})
|
|
165
|
-
class TestExtFunc extends Function {
|
|
166
|
-
constructor() {
|
|
167
|
-
super("testExtFunc");
|
|
168
|
-
this._expectedParameterCount = 1;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
public value(): string {
|
|
172
|
-
return "test result";
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Verify the decorated class still works correctly
|
|
177
|
-
const instance = new TestExtFunc();
|
|
178
|
-
expect(instance.name).toBe("testExtFunc");
|
|
179
|
-
expect(instance.value()).toBe("test result");
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
test("FunctionDef decorator can be applied to an aggregate function", () => {
|
|
183
|
-
@FunctionDef({
|
|
184
|
-
description: "Test aggregate function",
|
|
185
|
-
category: "aggregate",
|
|
186
|
-
parameters: [{ name: "value", description: "Numeric value", type: "number" }],
|
|
187
|
-
output: { description: "Aggregated result", type: "number" },
|
|
188
|
-
})
|
|
189
|
-
class TestAggExt extends AggregateFunction {
|
|
190
|
-
private _sum: number = 0;
|
|
191
|
-
|
|
192
|
-
constructor() {
|
|
193
|
-
super("testAggExt");
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
public value(): number {
|
|
197
|
-
return this._sum;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
const instance = new TestAggExt();
|
|
202
|
-
expect(instance.name).toBe("testAggExt");
|
|
203
|
-
expect(instance.value()).toBe(0);
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
test("FunctionDef decorator can be applied to an async provider", async () => {
|
|
207
|
-
@FunctionDef({
|
|
208
|
-
description: "Test async provider for extensibility",
|
|
209
|
-
category: "async",
|
|
210
|
-
parameters: [
|
|
211
|
-
{
|
|
212
|
-
name: "count",
|
|
213
|
-
description: "Number of items",
|
|
214
|
-
type: "number",
|
|
215
|
-
required: false,
|
|
216
|
-
default: 1,
|
|
217
|
-
},
|
|
218
|
-
],
|
|
219
|
-
output: { description: "Data object", type: "object" },
|
|
220
|
-
})
|
|
221
|
-
class Simple extends AsyncFunction {
|
|
222
|
-
public async *generate(count: number = 1): AsyncGenerator<any> {
|
|
223
|
-
for (let i = 0; i < count; i++) {
|
|
224
|
-
yield { id: i, data: `item${i}` };
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Verify the decorated class still works correctly
|
|
230
|
-
const loader = new Simple("simple");
|
|
231
|
-
const results: any[] = [];
|
|
232
|
-
for await (const item of loader.generate(2)) {
|
|
233
|
-
results.push(item);
|
|
234
|
-
}
|
|
235
|
-
expect(results.length).toBe(2);
|
|
236
|
-
expect(results[0]).toEqual({ id: 0, data: "item0" });
|
|
237
|
-
expect(results[1]).toEqual({ id: 1, data: "item1" });
|
|
238
|
-
|
|
239
|
-
// Verify the async provider was registered
|
|
240
|
-
const provider = getRegisteredFunctionFactory("simple", "async");
|
|
241
|
-
expect(provider).toBeDefined();
|
|
242
|
-
expect(typeof provider).toBe("function");
|
|
243
|
-
|
|
244
|
-
// Verify the metadata was registered
|
|
245
|
-
const metadata = getFunctionMetadata("simple", "async");
|
|
246
|
-
expect(metadata).toBeDefined();
|
|
247
|
-
expect(metadata?.name).toBe("simple");
|
|
248
|
-
expect(metadata?.category).toBe("async");
|
|
249
|
-
expect(metadata?.description).toBe("Test async provider for extensibility");
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
test("FunctionDef decorator can be applied to a predicate function", () => {
|
|
253
|
-
@FunctionDef({
|
|
254
|
-
description: "Test predicate function",
|
|
255
|
-
category: "predicate",
|
|
256
|
-
parameters: [{ name: "list", description: "List to check", type: "array" }],
|
|
257
|
-
output: { description: "Boolean result", type: "boolean" },
|
|
258
|
-
})
|
|
259
|
-
class TestPredExt extends PredicateFunction {
|
|
260
|
-
constructor() {
|
|
261
|
-
super("testPredExt");
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
public value(): boolean {
|
|
265
|
-
return true;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
const instance = new TestPredExt();
|
|
270
|
-
expect(instance.name).toBe("testPredExt");
|
|
271
|
-
expect(instance.value()).toBe(true);
|
|
272
|
-
});
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
describe("Type Exports", () => {
|
|
276
|
-
test("FunctionMetadata type can be used", () => {
|
|
277
|
-
const meta: FunctionMetadata = {
|
|
278
|
-
name: "typeTest",
|
|
279
|
-
description: "Testing type exports",
|
|
280
|
-
category: "scalar",
|
|
281
|
-
parameters: [],
|
|
282
|
-
output: { description: "Output", type: "string" },
|
|
283
|
-
};
|
|
284
|
-
|
|
285
|
-
expect(meta.name).toBe("typeTest");
|
|
286
|
-
expect(meta.description).toBe("Testing type exports");
|
|
287
|
-
});
|
|
288
|
-
|
|
289
|
-
test("ParameterSchema type can be used", () => {
|
|
290
|
-
const param: ParameterSchema = {
|
|
291
|
-
name: "testParam",
|
|
292
|
-
description: "A test parameter",
|
|
293
|
-
type: "string",
|
|
294
|
-
required: true,
|
|
295
|
-
default: "default value",
|
|
296
|
-
example: "example value",
|
|
297
|
-
};
|
|
298
|
-
|
|
299
|
-
expect(param.name).toBe("testParam");
|
|
300
|
-
expect(param.required).toBe(true);
|
|
301
|
-
});
|
|
302
|
-
|
|
303
|
-
test("ParameterSchema with nested types", () => {
|
|
304
|
-
const arrayParam: ParameterSchema = {
|
|
305
|
-
name: "items",
|
|
306
|
-
description: "Array of items",
|
|
307
|
-
type: "array",
|
|
308
|
-
items: {
|
|
309
|
-
description: "Item in array",
|
|
310
|
-
type: "string",
|
|
311
|
-
},
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
const objectParam: ParameterSchema = {
|
|
315
|
-
name: "config",
|
|
316
|
-
description: "Configuration object",
|
|
317
|
-
type: "object",
|
|
318
|
-
properties: {
|
|
319
|
-
enabled: { description: "Is enabled", type: "boolean" },
|
|
320
|
-
value: { description: "Value", type: "number" },
|
|
321
|
-
},
|
|
322
|
-
};
|
|
323
|
-
|
|
324
|
-
expect(arrayParam.items?.type).toBe("string");
|
|
325
|
-
expect(objectParam.properties?.enabled.type).toBe("boolean");
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
test("OutputSchema type can be used", () => {
|
|
329
|
-
const output: OutputSchema = {
|
|
330
|
-
description: "Result output",
|
|
331
|
-
type: "object",
|
|
332
|
-
properties: {
|
|
333
|
-
success: { description: "Success flag", type: "boolean" },
|
|
334
|
-
data: { description: "Result data", type: "array" },
|
|
335
|
-
},
|
|
336
|
-
example: { success: true, data: [] },
|
|
337
|
-
};
|
|
338
|
-
|
|
339
|
-
expect(output.type).toBe("object");
|
|
340
|
-
expect(output.properties?.success.type).toBe("boolean");
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
test("FunctionCategory type accepts standard and custom categories", () => {
|
|
344
|
-
const scalar: FunctionCategory = "scalar";
|
|
345
|
-
const aggregate: FunctionCategory = "aggregate";
|
|
346
|
-
const predicate: FunctionCategory = "predicate";
|
|
347
|
-
const async: FunctionCategory = "async";
|
|
348
|
-
const custom: FunctionCategory = "myCustomCategory";
|
|
349
|
-
|
|
350
|
-
expect(scalar).toBe("scalar");
|
|
351
|
-
expect(aggregate).toBe("aggregate");
|
|
352
|
-
expect(predicate).toBe("predicate");
|
|
353
|
-
expect(async).toBe("async");
|
|
354
|
-
expect(custom).toBe("myCustomCategory");
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
test("FunctionDefOptions type can be used", () => {
|
|
358
|
-
const options: FunctionDefOptions = {
|
|
359
|
-
description: "Function options test",
|
|
360
|
-
category: "scalar",
|
|
361
|
-
parameters: [],
|
|
362
|
-
output: { description: "Output", type: "string" },
|
|
363
|
-
notes: "Some additional notes",
|
|
364
|
-
};
|
|
365
|
-
|
|
366
|
-
expect(options.description).toBe("Function options test");
|
|
367
|
-
expect(options.notes).toBe("Some additional notes");
|
|
368
|
-
});
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
describe("Plugin Functions Integration with FlowQuery", () => {
|
|
372
|
-
// Import Runner for executing FlowQuery statements
|
|
373
|
-
const Runner = require("../src/compute/runner").default;
|
|
374
|
-
|
|
375
|
-
test("Custom scalar function can be used in a FlowQuery statement", async () => {
|
|
376
|
-
// Define and register a custom function via @FunctionDef decorator
|
|
377
|
-
@FunctionDef({
|
|
378
|
-
description: "Doubles a number",
|
|
379
|
-
category: "scalar",
|
|
380
|
-
parameters: [{ name: "value", description: "Number to double", type: "number" }],
|
|
381
|
-
output: { description: "Doubled value", type: "number" },
|
|
382
|
-
})
|
|
383
|
-
class Double extends Function {
|
|
384
|
-
constructor() {
|
|
385
|
-
super("double");
|
|
386
|
-
this._expectedParameterCount = 1;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
public value(): number {
|
|
390
|
-
return this.getChildren()[0].value() * 2;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// Execute a FlowQuery statement that uses the custom function
|
|
395
|
-
const runner = new Runner("WITH 5 AS num RETURN double(num) AS result");
|
|
396
|
-
await runner.run();
|
|
397
|
-
|
|
398
|
-
expect(runner.results.length).toBe(1);
|
|
399
|
-
expect(runner.results[0]).toEqual({ result: 10 });
|
|
400
|
-
});
|
|
401
|
-
|
|
402
|
-
test("Custom string function can be used in a FlowQuery statement", async () => {
|
|
403
|
-
@FunctionDef({
|
|
404
|
-
description: "Reverses a string",
|
|
405
|
-
category: "scalar",
|
|
406
|
-
parameters: [{ name: "text", description: "String to reverse", type: "string" }],
|
|
407
|
-
output: { description: "Reversed string", type: "string" },
|
|
408
|
-
})
|
|
409
|
-
class StrReverse extends Function {
|
|
410
|
-
constructor() {
|
|
411
|
-
super("strreverse");
|
|
412
|
-
this._expectedParameterCount = 1;
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
public value(): string {
|
|
416
|
-
const input = String(this.getChildren()[0].value());
|
|
417
|
-
return input.split("").reverse().join("");
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
const runner = new Runner("WITH 'hello' AS s RETURN strreverse(s) AS reversed");
|
|
422
|
-
await runner.run();
|
|
423
|
-
|
|
424
|
-
expect(runner.results.length).toBe(1);
|
|
425
|
-
expect(runner.results[0]).toEqual({ reversed: "olleh" });
|
|
426
|
-
});
|
|
427
|
-
|
|
428
|
-
test("Custom aggregate function can be used in a FlowQuery statement", async () => {
|
|
429
|
-
// Create a custom reducer element for the aggregate
|
|
430
|
-
class ProductElement extends ReducerElement {
|
|
431
|
-
private _value: number = 1;
|
|
432
|
-
public get value(): number {
|
|
433
|
-
return this._value;
|
|
434
|
-
}
|
|
435
|
-
public set value(v: number) {
|
|
436
|
-
this._value *= v;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
@FunctionDef({
|
|
441
|
-
description: "Calculates the product of values",
|
|
442
|
-
category: "aggregate",
|
|
443
|
-
parameters: [{ name: "value", description: "Number to multiply", type: "number" }],
|
|
444
|
-
output: { description: "Product of all values", type: "number" },
|
|
445
|
-
})
|
|
446
|
-
class Product extends AggregateFunction {
|
|
447
|
-
constructor() {
|
|
448
|
-
super("product");
|
|
449
|
-
this._expectedParameterCount = 1;
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
public reduce(element: ReducerElement): void {
|
|
453
|
-
element.value = this.firstChild().value();
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
public element(): ReducerElement {
|
|
457
|
-
return new ProductElement();
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
const runner = new Runner("UNWIND [2, 3, 4] AS num RETURN product(num) AS result");
|
|
462
|
-
await runner.run();
|
|
463
|
-
|
|
464
|
-
expect(runner.results.length).toBe(1);
|
|
465
|
-
expect(runner.results[0]).toEqual({ result: 24 });
|
|
466
|
-
});
|
|
467
|
-
|
|
468
|
-
test("Custom function works with expressions and other functions", async () => {
|
|
469
|
-
@FunctionDef({
|
|
470
|
-
description: "Adds 100 to a number",
|
|
471
|
-
category: "scalar",
|
|
472
|
-
parameters: [{ name: "value", description: "Number", type: "number" }],
|
|
473
|
-
output: { description: "Number plus 100", type: "number" },
|
|
474
|
-
})
|
|
475
|
-
class AddHundred extends Function {
|
|
476
|
-
constructor() {
|
|
477
|
-
super("addhundred");
|
|
478
|
-
this._expectedParameterCount = 1;
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
public value(): number {
|
|
482
|
-
return this.getChildren()[0].value() + 100;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
// Use the custom function with expressions
|
|
487
|
-
const runner = new Runner("WITH 5 * 3 AS num RETURN addhundred(num) + 1 AS result");
|
|
488
|
-
await runner.run();
|
|
489
|
-
|
|
490
|
-
expect(runner.results.length).toBe(1);
|
|
491
|
-
expect(runner.results[0]).toEqual({ result: 116 }); // (5*3) + 100 + 1 = 116
|
|
492
|
-
});
|
|
493
|
-
|
|
494
|
-
test("Multiple custom functions can be used together", async () => {
|
|
495
|
-
@FunctionDef({
|
|
496
|
-
description: "Triples a number",
|
|
497
|
-
category: "scalar",
|
|
498
|
-
parameters: [{ name: "value", description: "Number to triple", type: "number" }],
|
|
499
|
-
output: { description: "Tripled value", type: "number" },
|
|
500
|
-
})
|
|
501
|
-
class Triple extends Function {
|
|
502
|
-
constructor() {
|
|
503
|
-
super("triple");
|
|
504
|
-
this._expectedParameterCount = 1;
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
public value(): number {
|
|
508
|
-
return this.getChildren()[0].value() * 3;
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
@FunctionDef({
|
|
513
|
-
description: "Squares a number",
|
|
514
|
-
category: "scalar",
|
|
515
|
-
parameters: [{ name: "value", description: "Number to square", type: "number" }],
|
|
516
|
-
output: { description: "Squared value", type: "number" },
|
|
517
|
-
})
|
|
518
|
-
class Square extends Function {
|
|
519
|
-
constructor() {
|
|
520
|
-
super("square");
|
|
521
|
-
this._expectedParameterCount = 1;
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
public value(): number {
|
|
525
|
-
const v = this.getChildren()[0].value();
|
|
526
|
-
return v * v;
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
// Use both custom functions in a query
|
|
531
|
-
const runner = new Runner(
|
|
532
|
-
"WITH 2 AS num RETURN triple(num) AS tripled, square(num) AS squared"
|
|
533
|
-
);
|
|
534
|
-
await runner.run();
|
|
535
|
-
|
|
536
|
-
expect(runner.results.length).toBe(1);
|
|
537
|
-
expect(runner.results[0]).toEqual({ tripled: 6, squared: 4 });
|
|
538
|
-
});
|
|
539
|
-
|
|
540
|
-
test("Custom async provider can be used in LOAD JSON FROM statement", async () => {
|
|
541
|
-
@FunctionDef({
|
|
542
|
-
description: "Provides example data for testing",
|
|
543
|
-
category: "async",
|
|
544
|
-
parameters: [],
|
|
545
|
-
output: { description: "Example data o.bject", type: "object" },
|
|
546
|
-
})
|
|
547
|
-
class GetExampleData extends AsyncFunction {
|
|
548
|
-
public async *generate(): AsyncGenerator<any> {
|
|
549
|
-
yield { id: 1, name: "Alice" };
|
|
550
|
-
yield { id: 2, name: "Bob" };
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
// Verify registration worked
|
|
555
|
-
expect(getRegisteredFunctionFactory("getExampleData", "async")).toBeDefined();
|
|
556
|
-
|
|
557
|
-
// Use the async provider in a FlowQuery statement
|
|
558
|
-
const runner = new Runner(
|
|
559
|
-
"LOAD JSON FROM getExampleData() AS data RETURN data.id AS id, data.name AS name"
|
|
560
|
-
);
|
|
561
|
-
await runner.run();
|
|
562
|
-
|
|
563
|
-
expect(runner.results.length).toBe(2);
|
|
564
|
-
expect(runner.results[0]).toEqual({ id: 1, name: "Alice" });
|
|
565
|
-
expect(runner.results[1]).toEqual({ id: 2, name: "Bob" });
|
|
566
|
-
});
|
|
567
|
-
|
|
568
|
-
test("Function names are case-insensitive", async () => {
|
|
569
|
-
@FunctionDef({
|
|
570
|
-
description: "Test function for case insensitivity",
|
|
571
|
-
category: "async",
|
|
572
|
-
parameters: [],
|
|
573
|
-
output: { description: "Test data", type: "object" },
|
|
574
|
-
})
|
|
575
|
-
class MixedCaseFunc extends AsyncFunction {
|
|
576
|
-
public async *generate(): AsyncGenerator<any> {
|
|
577
|
-
yield { value: 42 };
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
// Verify registration works with different casings
|
|
582
|
-
expect(getRegisteredFunctionFactory("MixedCaseFunc", "async")).toBeDefined();
|
|
583
|
-
expect(getRegisteredFunctionFactory("mixedcasefunc", "async")).toBeDefined();
|
|
584
|
-
expect(getRegisteredFunctionFactory("MIXEDCASEFUNC", "async")).toBeDefined();
|
|
585
|
-
expect(getRegisteredFunctionFactory("mIxEdCaSeFuNc", "async")).toBeDefined();
|
|
586
|
-
|
|
587
|
-
// Verify metadata lookup is case-insensitive
|
|
588
|
-
expect(getFunctionMetadata("MixedCaseFunc", "async")).toBeDefined();
|
|
589
|
-
expect(getFunctionMetadata("mixedcasefunc", "async")).toBeDefined();
|
|
590
|
-
expect(getFunctionMetadata("MIXEDCASEFUNC", "async")).toBeDefined();
|
|
591
|
-
|
|
592
|
-
// Test using different casings in FlowQuery statements
|
|
593
|
-
const runner1 = new Runner("LOAD JSON FROM mixedcasefunc() AS d RETURN d.value AS v");
|
|
594
|
-
await runner1.run();
|
|
595
|
-
expect(runner1.results[0]).toEqual({ v: 42 });
|
|
596
|
-
|
|
597
|
-
const runner2 = new Runner("LOAD JSON FROM MIXEDCASEFUNC() AS d RETURN d.value AS v");
|
|
598
|
-
await runner2.run();
|
|
599
|
-
expect(runner2.results[0]).toEqual({ v: 42 });
|
|
600
|
-
|
|
601
|
-
const runner3 = new Runner("LOAD JSON FROM MixedCaseFunc() AS d RETURN d.value AS v");
|
|
602
|
-
await runner3.run();
|
|
603
|
-
expect(runner3.results[0]).toEqual({ v: 42 });
|
|
604
|
-
});
|
|
605
|
-
|
|
606
|
-
test("Custom function can be retrieved via functions() in a FlowQuery statement", async () => {
|
|
607
|
-
@FunctionDef({
|
|
608
|
-
description: "A unique test function for introspection",
|
|
609
|
-
category: "scalar",
|
|
610
|
-
parameters: [{ name: "x", description: "Input value", type: "number" }],
|
|
611
|
-
output: { description: "Output value", type: "number" },
|
|
612
|
-
})
|
|
613
|
-
class IntrospectTestFunc extends Function {
|
|
614
|
-
constructor() {
|
|
615
|
-
super("introspectTestFunc");
|
|
616
|
-
this._expectedParameterCount = 1;
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
public value(): number {
|
|
620
|
-
return this.getChildren()[0].value() + 42;
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
// First verify the function is registered
|
|
625
|
-
const metadata = getFunctionMetadata("introspectTestFunc");
|
|
626
|
-
expect(metadata).toBeDefined();
|
|
627
|
-
expect(metadata?.name).toBe("introspecttestfunc");
|
|
628
|
-
|
|
629
|
-
// Use functions() with UNWIND to find the registered function
|
|
630
|
-
const runner = new Runner(`
|
|
631
|
-
WITH functions() AS funcs
|
|
632
|
-
UNWIND funcs AS f
|
|
633
|
-
WITH f WHERE f.name = 'introspecttestfunc'
|
|
634
|
-
RETURN f.name AS name, f.description AS description, f.category AS category
|
|
635
|
-
`);
|
|
636
|
-
await runner.run();
|
|
637
|
-
|
|
638
|
-
expect(runner.results.length).toBe(1);
|
|
639
|
-
expect(runner.results[0].name).toBe("introspecttestfunc");
|
|
640
|
-
expect(runner.results[0].description).toBe("A unique test function for introspection");
|
|
641
|
-
expect(runner.results[0].category).toBe("scalar");
|
|
642
|
-
});
|
|
643
|
-
});
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import Database from "../../src/graph/database";
|
|
2
|
-
import PhysicalNode from "../../src/graph/physical_node";
|
|
3
|
-
import PhysicalRelationship from "../../src/graph/physical_relationship";
|
|
4
|
-
import CreateNode from "../../src/parsing/operations/create_node";
|
|
5
|
-
import CreateRelationship from "../../src/parsing/operations/create_relationship";
|
|
6
|
-
import Parser from "../../src/parsing/parser";
|
|
7
|
-
|
|
8
|
-
test("Test CreateNode operation", async () => {
|
|
9
|
-
const node = new PhysicalNode(null, "Person");
|
|
10
|
-
expect(node.label).toBe("Person");
|
|
11
|
-
expect(node.statement).toBeNull();
|
|
12
|
-
const parser = new Parser();
|
|
13
|
-
const statement = parser.parse("WITH 1 as x RETURN x");
|
|
14
|
-
const op = new CreateNode(node, statement);
|
|
15
|
-
await op.run();
|
|
16
|
-
const db = Database.getInstance();
|
|
17
|
-
const found = db.getNode(node);
|
|
18
|
-
expect(found!.label).toBe(node.label);
|
|
19
|
-
const data = await found!.data();
|
|
20
|
-
expect(data).toEqual([{ x: 1 }]);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test("Test CreateRelationship operation", async () => {
|
|
24
|
-
const relationship = new PhysicalRelationship();
|
|
25
|
-
relationship.type = "KNOWS";
|
|
26
|
-
expect(relationship.type).toBe("KNOWS");
|
|
27
|
-
expect(relationship.statement).toBeNull();
|
|
28
|
-
const parser = new Parser();
|
|
29
|
-
const statement = parser.parse("WITH 1 as x RETURN x");
|
|
30
|
-
const op = new CreateRelationship(relationship, statement);
|
|
31
|
-
await op.run();
|
|
32
|
-
const db = Database.getInstance();
|
|
33
|
-
const found = db.getRelationship(relationship);
|
|
34
|
-
const data = await found!.data();
|
|
35
|
-
expect(data).toEqual([{ x: 1 }]);
|
|
36
|
-
});
|