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.
- package/dist/flowquery.min.js +1 -1
- 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/dist/parsing/data_structures/list_comprehension.d.ts +56 -0
- package/dist/parsing/data_structures/list_comprehension.d.ts.map +1 -0
- package/dist/parsing/data_structures/list_comprehension.js +102 -0
- package/dist/parsing/data_structures/list_comprehension.js.map +1 -0
- package/dist/parsing/parser.d.ts +18 -0
- package/dist/parsing/parser.d.ts.map +1 -1
- package/dist/parsing/parser.js +92 -0
- package/dist/parsing/parser.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,143 +0,0 @@
|
|
|
1
|
-
"""Graph node representation for FlowQuery."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, Optional, Union
|
|
6
|
-
|
|
7
|
-
from ..parsing.ast_node import ASTNode
|
|
8
|
-
from ..parsing.expressions.expression import Expression
|
|
9
|
-
from .node_data import NodeData, NodeRecord
|
|
10
|
-
|
|
11
|
-
if TYPE_CHECKING:
|
|
12
|
-
from .relationship import Relationship
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class Node(ASTNode):
|
|
16
|
-
"""Represents a node in a graph pattern."""
|
|
17
|
-
|
|
18
|
-
def __init__(
|
|
19
|
-
self,
|
|
20
|
-
identifier: Optional[str] = None,
|
|
21
|
-
label: Optional[str] = None
|
|
22
|
-
):
|
|
23
|
-
super().__init__()
|
|
24
|
-
self._identifier = identifier
|
|
25
|
-
self._label = label
|
|
26
|
-
self._properties: Dict[str, Expression] = {}
|
|
27
|
-
self._value: Optional['NodeRecord'] = None
|
|
28
|
-
self._incoming: Optional['Relationship'] = None
|
|
29
|
-
self._outgoing: Optional['Relationship'] = None
|
|
30
|
-
self._data: Optional['NodeData'] = None
|
|
31
|
-
self._todo_next: Optional[Callable[[], Union[None, Awaitable[None]]]] = None
|
|
32
|
-
|
|
33
|
-
@property
|
|
34
|
-
def identifier(self) -> Optional[str]:
|
|
35
|
-
return self._identifier
|
|
36
|
-
|
|
37
|
-
@identifier.setter
|
|
38
|
-
def identifier(self, value: str) -> None:
|
|
39
|
-
self._identifier = value
|
|
40
|
-
|
|
41
|
-
@property
|
|
42
|
-
def label(self) -> Optional[str]:
|
|
43
|
-
return self._label
|
|
44
|
-
|
|
45
|
-
@label.setter
|
|
46
|
-
def label(self, value: Optional[str]) -> None:
|
|
47
|
-
self._label = value
|
|
48
|
-
|
|
49
|
-
@property
|
|
50
|
-
def properties(self) -> Dict[str, Expression]:
|
|
51
|
-
return self._properties
|
|
52
|
-
|
|
53
|
-
@properties.setter
|
|
54
|
-
def properties(self, value: Dict[str, Expression]) -> None:
|
|
55
|
-
self._properties = value
|
|
56
|
-
|
|
57
|
-
def set_property(self, key: str, value: Expression) -> None:
|
|
58
|
-
self._properties[key] = value
|
|
59
|
-
|
|
60
|
-
def get_property(self, key: str) -> Optional[Expression]:
|
|
61
|
-
return self._properties.get(key)
|
|
62
|
-
|
|
63
|
-
def _matches_properties(self, hop: int = 0) -> bool:
|
|
64
|
-
"""Check if current record matches all constraint properties."""
|
|
65
|
-
if not self._properties:
|
|
66
|
-
return True
|
|
67
|
-
if self._data is None:
|
|
68
|
-
return True
|
|
69
|
-
for key, expression in self._properties.items():
|
|
70
|
-
record = self._data.current(hop)
|
|
71
|
-
if record is None:
|
|
72
|
-
raise ValueError("No current node data available")
|
|
73
|
-
if key not in record:
|
|
74
|
-
raise ValueError("Node does not have property")
|
|
75
|
-
return bool(record[key] == expression.value())
|
|
76
|
-
return True
|
|
77
|
-
|
|
78
|
-
def set_value(self, value: Optional[Dict[str, Any]]) -> None:
|
|
79
|
-
self._value = value # type: ignore[assignment]
|
|
80
|
-
|
|
81
|
-
def value(self) -> Optional['NodeRecord']:
|
|
82
|
-
return self._value
|
|
83
|
-
|
|
84
|
-
@property
|
|
85
|
-
def outgoing(self) -> Optional['Relationship']:
|
|
86
|
-
return self._outgoing
|
|
87
|
-
|
|
88
|
-
@outgoing.setter
|
|
89
|
-
def outgoing(self, relationship: Optional['Relationship']) -> None:
|
|
90
|
-
self._outgoing = relationship
|
|
91
|
-
|
|
92
|
-
@property
|
|
93
|
-
def incoming(self) -> Optional['Relationship']:
|
|
94
|
-
return self._incoming
|
|
95
|
-
|
|
96
|
-
@incoming.setter
|
|
97
|
-
def incoming(self, relationship: Optional['Relationship']) -> None:
|
|
98
|
-
self._incoming = relationship
|
|
99
|
-
|
|
100
|
-
def set_data(self, data: Optional['NodeData']) -> None:
|
|
101
|
-
self._data = data
|
|
102
|
-
|
|
103
|
-
async def next(self) -> None:
|
|
104
|
-
if self._data:
|
|
105
|
-
self._data.reset()
|
|
106
|
-
while self._data.next():
|
|
107
|
-
current = self._data.current()
|
|
108
|
-
if current is not None:
|
|
109
|
-
self.set_value(current)
|
|
110
|
-
if not self._matches_properties():
|
|
111
|
-
continue
|
|
112
|
-
if self._outgoing and self._value:
|
|
113
|
-
await self._outgoing.find(self._value['id'])
|
|
114
|
-
await self.run_todo_next()
|
|
115
|
-
|
|
116
|
-
async def find(self, id_: str, hop: int = 0) -> None:
|
|
117
|
-
if self._data:
|
|
118
|
-
self._data.reset()
|
|
119
|
-
while self._data.find(id_, hop):
|
|
120
|
-
current = self._data.current(hop)
|
|
121
|
-
if current is not None:
|
|
122
|
-
self.set_value(current)
|
|
123
|
-
if not self._matches_properties(hop):
|
|
124
|
-
continue
|
|
125
|
-
if self._incoming:
|
|
126
|
-
self._incoming.set_end_node(self)
|
|
127
|
-
if self._outgoing and self._value:
|
|
128
|
-
await self._outgoing.find(self._value['id'], hop)
|
|
129
|
-
await self.run_todo_next()
|
|
130
|
-
|
|
131
|
-
@property
|
|
132
|
-
def todo_next(self) -> Optional[Callable[[], Union[None, Awaitable[None]]]]:
|
|
133
|
-
return self._todo_next
|
|
134
|
-
|
|
135
|
-
@todo_next.setter
|
|
136
|
-
def todo_next(self, func: Optional[Callable[[], Union[None, Awaitable[None]]]]) -> None:
|
|
137
|
-
self._todo_next = func
|
|
138
|
-
|
|
139
|
-
async def run_todo_next(self) -> None:
|
|
140
|
-
if self._todo_next:
|
|
141
|
-
result = self._todo_next()
|
|
142
|
-
if result is not None:
|
|
143
|
-
await result
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"""Node data class for FlowQuery."""
|
|
2
|
-
|
|
3
|
-
from typing import Any, Dict, List, Optional, TypedDict
|
|
4
|
-
|
|
5
|
-
from .data import Data
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class NodeRecord(TypedDict, total=False):
|
|
9
|
-
"""Represents a node record from the database."""
|
|
10
|
-
id: str
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class NodeData(Data):
|
|
14
|
-
"""Node data class extending Data with ID-based indexing."""
|
|
15
|
-
|
|
16
|
-
def __init__(self, records: Optional[List[Dict[str, Any]]] = None):
|
|
17
|
-
super().__init__(records)
|
|
18
|
-
self._build_index("id")
|
|
19
|
-
|
|
20
|
-
def find(self, id_: str, hop: int = 0) -> bool:
|
|
21
|
-
"""Find a record by ID."""
|
|
22
|
-
return self._find(id_, hop, "id")
|
|
23
|
-
|
|
24
|
-
def current(self, hop: int = 0) -> Optional[Dict[str, Any]]:
|
|
25
|
-
"""Get the current record."""
|
|
26
|
-
return super().current(hop)
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import Any, Optional
|
|
4
|
-
|
|
5
|
-
from ..parsing.ast_node import ASTNode
|
|
6
|
-
from .node import Node
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class NodeReference(Node):
|
|
10
|
-
"""Represents a reference to an existing node variable."""
|
|
11
|
-
|
|
12
|
-
def __init__(self, base: Node, reference: ASTNode) -> None:
|
|
13
|
-
super().__init__(base.identifier, base.label)
|
|
14
|
-
self._reference: ASTNode = reference
|
|
15
|
-
# Copy properties from base
|
|
16
|
-
self._properties = base._properties
|
|
17
|
-
self._outgoing = base.outgoing
|
|
18
|
-
self._incoming = base.incoming
|
|
19
|
-
|
|
20
|
-
@property
|
|
21
|
-
def reference(self) -> ASTNode:
|
|
22
|
-
return self._reference
|
|
23
|
-
|
|
24
|
-
# Keep referred as alias for backward compatibility
|
|
25
|
-
@property
|
|
26
|
-
def referred(self) -> ASTNode:
|
|
27
|
-
return self._reference
|
|
28
|
-
|
|
29
|
-
def value(self) -> Optional[Any]:
|
|
30
|
-
return self._reference.value() if self._reference else None
|
|
31
|
-
|
|
32
|
-
async def next(self) -> None:
|
|
33
|
-
"""Process next using the referenced node's value."""
|
|
34
|
-
ref_value = self._reference.value()
|
|
35
|
-
if ref_value is None:
|
|
36
|
-
return
|
|
37
|
-
self.set_value(dict(ref_value))
|
|
38
|
-
if self._outgoing and self._value:
|
|
39
|
-
await self._outgoing.find(self._value['id'])
|
|
40
|
-
await self.run_todo_next()
|
|
41
|
-
|
|
42
|
-
async def find(self, id_: str, hop: int = 0) -> None:
|
|
43
|
-
"""Find by ID, only matching if it equals the referenced node's ID."""
|
|
44
|
-
referenced = self._reference.value()
|
|
45
|
-
if referenced is None or id_ != referenced.get('id'):
|
|
46
|
-
return
|
|
47
|
-
self.set_value(dict(referenced))
|
|
48
|
-
if self._outgoing and self._value:
|
|
49
|
-
await self._outgoing.find(self._value['id'], hop)
|
|
50
|
-
await self.run_todo_next()
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
"""Graph pattern representation for FlowQuery."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from typing import Any, Generator, List, Optional, Sequence, Union
|
|
6
|
-
|
|
7
|
-
from ..parsing.ast_node import ASTNode
|
|
8
|
-
from .database import Database
|
|
9
|
-
from .node import Node
|
|
10
|
-
from .node_data import NodeData
|
|
11
|
-
from .relationship import Relationship
|
|
12
|
-
from .relationship_data import RelationshipData
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class Pattern(ASTNode):
|
|
16
|
-
"""Represents a graph pattern for matching."""
|
|
17
|
-
|
|
18
|
-
def __init__(self) -> None:
|
|
19
|
-
super().__init__()
|
|
20
|
-
self._identifier: Optional[str] = None
|
|
21
|
-
self._chain: List[Union['Node', 'Relationship']] = []
|
|
22
|
-
|
|
23
|
-
@property
|
|
24
|
-
def identifier(self) -> Optional[str]:
|
|
25
|
-
return self._identifier
|
|
26
|
-
|
|
27
|
-
@identifier.setter
|
|
28
|
-
def identifier(self, value: str) -> None:
|
|
29
|
-
self._identifier = value
|
|
30
|
-
|
|
31
|
-
@property
|
|
32
|
-
def chain(self) -> List[Union['Node', 'Relationship']]:
|
|
33
|
-
return self._chain
|
|
34
|
-
|
|
35
|
-
@property
|
|
36
|
-
def elements(self) -> Sequence[ASTNode]:
|
|
37
|
-
return self._chain
|
|
38
|
-
|
|
39
|
-
def add_element(self, element: Union['Node', 'Relationship']) -> None:
|
|
40
|
-
if (len(self._chain) > 0 and
|
|
41
|
-
type(self._chain[-1]) is type(element)):
|
|
42
|
-
raise ValueError("Cannot add two consecutive elements of the same type to the graph pattern")
|
|
43
|
-
|
|
44
|
-
if len(self._chain) > 0:
|
|
45
|
-
last = self._chain[-1]
|
|
46
|
-
if isinstance(last, Node) and isinstance(element, Relationship):
|
|
47
|
-
last.outgoing = element
|
|
48
|
-
element.source = last
|
|
49
|
-
if isinstance(last, Relationship) and isinstance(element, Node):
|
|
50
|
-
last.target = element
|
|
51
|
-
element.incoming = last
|
|
52
|
-
|
|
53
|
-
self._chain.append(element)
|
|
54
|
-
self.add_child(element)
|
|
55
|
-
|
|
56
|
-
@property
|
|
57
|
-
def start_node(self) -> 'Node':
|
|
58
|
-
if len(self._chain) == 0:
|
|
59
|
-
raise ValueError("Pattern is empty")
|
|
60
|
-
first = self._chain[0]
|
|
61
|
-
if isinstance(first, Node):
|
|
62
|
-
return first
|
|
63
|
-
raise ValueError("Pattern does not start with a node")
|
|
64
|
-
|
|
65
|
-
@property
|
|
66
|
-
def end_node(self) -> 'Node':
|
|
67
|
-
if len(self._chain) == 0:
|
|
68
|
-
raise ValueError("Pattern is empty")
|
|
69
|
-
last = self._chain[-1]
|
|
70
|
-
if isinstance(last, Node):
|
|
71
|
-
return last
|
|
72
|
-
raise ValueError("Pattern does not end with a node")
|
|
73
|
-
|
|
74
|
-
def first_node(self) -> Optional[Union['Node', 'Relationship']]:
|
|
75
|
-
if len(self._chain) > 0:
|
|
76
|
-
return self._chain[0]
|
|
77
|
-
return None
|
|
78
|
-
|
|
79
|
-
def value(self) -> List[Any]:
|
|
80
|
-
return list(self.values())
|
|
81
|
-
|
|
82
|
-
def values(self) -> Generator[Any, None, None]:
|
|
83
|
-
for i, element in enumerate(self._chain):
|
|
84
|
-
if isinstance(element, Node):
|
|
85
|
-
# Skip node if previous element was a zero-hop relationship (no matches)
|
|
86
|
-
prev = self._chain[i-1] if i > 0 else None
|
|
87
|
-
if isinstance(prev, Relationship) and len(prev.matches) == 0:
|
|
88
|
-
continue
|
|
89
|
-
yield element.value()
|
|
90
|
-
elif isinstance(element, Relationship):
|
|
91
|
-
for j, match in enumerate(element.matches):
|
|
92
|
-
yield match
|
|
93
|
-
if j < len(element.matches) - 1:
|
|
94
|
-
yield match["endNode"]
|
|
95
|
-
|
|
96
|
-
async def fetch_data(self) -> None:
|
|
97
|
-
"""Loads data from the database for all elements."""
|
|
98
|
-
db = Database.get_instance()
|
|
99
|
-
for element in self._chain:
|
|
100
|
-
# Use type name comparison to avoid issues with module double-loading
|
|
101
|
-
if type(element).__name__ in ('NodeReference', 'RelationshipReference'):
|
|
102
|
-
continue
|
|
103
|
-
data = await db.get_data(element)
|
|
104
|
-
if isinstance(element, Node) and isinstance(data, NodeData):
|
|
105
|
-
element.set_data(data)
|
|
106
|
-
elif isinstance(element, Relationship) and isinstance(data, RelationshipData):
|
|
107
|
-
element.set_data(data)
|
|
108
|
-
|
|
109
|
-
async def initialize(self) -> None:
|
|
110
|
-
await self.fetch_data()
|
|
111
|
-
|
|
112
|
-
async def traverse(self) -> None:
|
|
113
|
-
first = self.first_node()
|
|
114
|
-
if first and isinstance(first, Node):
|
|
115
|
-
await first.next()
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"""Pattern expression for FlowQuery."""
|
|
2
|
-
|
|
3
|
-
from typing import Any, Union
|
|
4
|
-
|
|
5
|
-
from ..parsing.ast_node import ASTNode
|
|
6
|
-
from .node import Node
|
|
7
|
-
from .node_reference import NodeReference
|
|
8
|
-
from .pattern import Pattern
|
|
9
|
-
from .relationship import Relationship
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class PatternExpression(Pattern):
|
|
13
|
-
"""Represents a pattern expression that can be evaluated.
|
|
14
|
-
|
|
15
|
-
PatternExpression is used in WHERE clauses to test whether a graph pattern
|
|
16
|
-
exists. It evaluates to True if the pattern is matched, False otherwise.
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
def __init__(self) -> None:
|
|
20
|
-
super().__init__()
|
|
21
|
-
self._fetched: bool = False
|
|
22
|
-
self._evaluation: bool = False
|
|
23
|
-
|
|
24
|
-
def add_element(self, element: Union[Node, Relationship]) -> None:
|
|
25
|
-
super().add_element(element)
|
|
26
|
-
|
|
27
|
-
def verify(self) -> None:
|
|
28
|
-
if(len(self._chain) == 0):
|
|
29
|
-
raise ValueError("PatternExpression cannot be empty")
|
|
30
|
-
if not(any(isinstance(el, NodeReference) for el in self._chain if isinstance(el, ASTNode))):
|
|
31
|
-
raise ValueError("PatternExpression must contain at least one NodeReference")
|
|
32
|
-
|
|
33
|
-
@property
|
|
34
|
-
def identifier(self) -> None:
|
|
35
|
-
return None
|
|
36
|
-
|
|
37
|
-
@identifier.setter
|
|
38
|
-
def identifier(self, value: str) -> None:
|
|
39
|
-
raise ValueError("Cannot set identifier on PatternExpression")
|
|
40
|
-
|
|
41
|
-
async def fetch_data(self) -> None:
|
|
42
|
-
"""Fetches data for the pattern expression with caching."""
|
|
43
|
-
if self._fetched:
|
|
44
|
-
return
|
|
45
|
-
await super().fetch_data()
|
|
46
|
-
self._fetched = True
|
|
47
|
-
|
|
48
|
-
async def evaluate(self) -> None:
|
|
49
|
-
"""Evaluates the pattern expression by traversing the graph.
|
|
50
|
-
|
|
51
|
-
Sets _evaluation to True if the pattern is matched, False otherwise.
|
|
52
|
-
"""
|
|
53
|
-
self._evaluation = False
|
|
54
|
-
|
|
55
|
-
async def set_evaluation_true() -> None:
|
|
56
|
-
self._evaluation = True
|
|
57
|
-
|
|
58
|
-
self.end_node.todo_next = set_evaluation_true
|
|
59
|
-
await self.start_node.next()
|
|
60
|
-
|
|
61
|
-
def value(self) -> Any:
|
|
62
|
-
"""Returns the result of the pattern evaluation."""
|
|
63
|
-
return self._evaluation
|
|
64
|
-
|
|
65
|
-
def is_operand(self) -> bool:
|
|
66
|
-
"""PatternExpression is an operand in expressions."""
|
|
67
|
-
return True
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"""Collection of graph patterns for FlowQuery."""
|
|
2
|
-
|
|
3
|
-
from typing import Awaitable, Callable, List, Optional
|
|
4
|
-
|
|
5
|
-
from .pattern import Pattern
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class Patterns:
|
|
9
|
-
"""Manages a collection of graph patterns."""
|
|
10
|
-
|
|
11
|
-
def __init__(self, patterns: Optional[List[Pattern]] = None) -> None:
|
|
12
|
-
self._patterns = patterns or []
|
|
13
|
-
self._to_do_next: Optional[Callable[[], Awaitable[None]]] = None
|
|
14
|
-
|
|
15
|
-
@property
|
|
16
|
-
def patterns(self) -> List[Pattern]:
|
|
17
|
-
return self._patterns
|
|
18
|
-
|
|
19
|
-
@property
|
|
20
|
-
def to_do_next(self) -> Optional[Callable[[], Awaitable[None]]]:
|
|
21
|
-
return self._to_do_next
|
|
22
|
-
|
|
23
|
-
@to_do_next.setter
|
|
24
|
-
def to_do_next(self, func: Optional[Callable[[], Awaitable[None]]]) -> None:
|
|
25
|
-
self._to_do_next = func
|
|
26
|
-
if self._patterns:
|
|
27
|
-
self._patterns[-1].end_node.todo_next = func
|
|
28
|
-
|
|
29
|
-
async def initialize(self) -> None:
|
|
30
|
-
previous: Optional[Pattern] = None
|
|
31
|
-
for pattern in self._patterns:
|
|
32
|
-
await pattern.fetch_data() # Ensure data is loaded
|
|
33
|
-
if previous is not None:
|
|
34
|
-
# Chain the patterns together
|
|
35
|
-
async def next_pattern_start(p: Pattern = pattern) -> None:
|
|
36
|
-
await p.start_node.next()
|
|
37
|
-
previous.end_node.todo_next = next_pattern_start
|
|
38
|
-
previous = pattern
|
|
39
|
-
|
|
40
|
-
async def traverse(self) -> None:
|
|
41
|
-
if self._patterns:
|
|
42
|
-
await self._patterns[0].start_node.next()
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
"""Physical node representation for FlowQuery."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from typing import Any, Dict, List, Optional
|
|
6
|
-
|
|
7
|
-
from ..parsing.ast_node import ASTNode
|
|
8
|
-
from .node import Node
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class PhysicalNode(Node):
|
|
12
|
-
"""Represents a physical node in the graph database."""
|
|
13
|
-
|
|
14
|
-
def __init__(self, id_: Optional[str], label: str, properties: Optional[Dict[str, Any]] = None):
|
|
15
|
-
super().__init__(id_, label)
|
|
16
|
-
# Store additional physical properties in a separate dict
|
|
17
|
-
# (Node.properties is for Expression-based pattern properties)
|
|
18
|
-
self._physical_properties = properties or {}
|
|
19
|
-
self._statement: Optional["ASTNode"] = None
|
|
20
|
-
|
|
21
|
-
@property
|
|
22
|
-
def physical_properties(self) -> Dict[str, Any]:
|
|
23
|
-
"""Get the physical properties (values, not expressions)."""
|
|
24
|
-
return self._physical_properties
|
|
25
|
-
|
|
26
|
-
@property
|
|
27
|
-
def statement(self) -> Optional["ASTNode"]:
|
|
28
|
-
return self._statement
|
|
29
|
-
|
|
30
|
-
@statement.setter
|
|
31
|
-
def statement(self, value: Optional["ASTNode"]) -> None:
|
|
32
|
-
self._statement = value
|
|
33
|
-
|
|
34
|
-
async def data(self) -> List[Dict[str, Any]]:
|
|
35
|
-
if self._statement is None:
|
|
36
|
-
raise ValueError("Statement is null")
|
|
37
|
-
# Import at runtime to avoid circular dependency
|
|
38
|
-
from ..compute.runner import Runner
|
|
39
|
-
runner = Runner(ast=self._statement)
|
|
40
|
-
await runner.run()
|
|
41
|
-
return runner.results
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"""Physical relationship representation for FlowQuery."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from typing import Any, Dict, List, Optional
|
|
6
|
-
|
|
7
|
-
from ..parsing.ast_node import ASTNode
|
|
8
|
-
from .relationship import Relationship
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class PhysicalRelationship(Relationship):
|
|
12
|
-
"""Represents a physical relationship in the graph database."""
|
|
13
|
-
|
|
14
|
-
def __init__(self) -> None:
|
|
15
|
-
super().__init__()
|
|
16
|
-
self._statement: Optional[ASTNode] = None
|
|
17
|
-
|
|
18
|
-
@property
|
|
19
|
-
def statement(self) -> Optional[ASTNode]:
|
|
20
|
-
"""Get the statement for this relationship."""
|
|
21
|
-
return self._statement
|
|
22
|
-
|
|
23
|
-
@statement.setter
|
|
24
|
-
def statement(self, value: Optional[ASTNode]) -> None:
|
|
25
|
-
"""Set the statement for this relationship."""
|
|
26
|
-
self._statement = value
|
|
27
|
-
|
|
28
|
-
async def data(self) -> List[Dict[str, Any]]:
|
|
29
|
-
"""Execute the statement and return results."""
|
|
30
|
-
if self._statement is None:
|
|
31
|
-
raise ValueError("Statement is null")
|
|
32
|
-
# Import at runtime to avoid circular dependency
|
|
33
|
-
from ..compute.runner import Runner
|
|
34
|
-
runner = Runner(None, self._statement)
|
|
35
|
-
await runner.run()
|
|
36
|
-
return runner.results
|