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,54 +0,0 @@
|
|
|
1
|
-
"""Split function."""
|
|
2
|
-
|
|
3
|
-
from typing import Any, List
|
|
4
|
-
|
|
5
|
-
from ..ast_node import ASTNode
|
|
6
|
-
from ..expressions.string import String
|
|
7
|
-
from .function import Function
|
|
8
|
-
from .function_metadata import FunctionDef
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
@FunctionDef({
|
|
12
|
-
"description": "Splits a string into an array by a delimiter",
|
|
13
|
-
"category": "scalar",
|
|
14
|
-
"parameters": [
|
|
15
|
-
{"name": "text", "description": "String to split", "type": "string"},
|
|
16
|
-
{"name": "delimiter", "description": "Delimiter to split by", "type": "string"}
|
|
17
|
-
],
|
|
18
|
-
"output": {
|
|
19
|
-
"description": "Array of string parts",
|
|
20
|
-
"type": "array",
|
|
21
|
-
"items": {"type": "string"},
|
|
22
|
-
"example": ["a", "b", "c"]
|
|
23
|
-
},
|
|
24
|
-
"examples": ["WITH 'a,b,c' AS s RETURN split(s, ',')"]
|
|
25
|
-
})
|
|
26
|
-
class Split(Function):
|
|
27
|
-
"""Split function.
|
|
28
|
-
|
|
29
|
-
Splits a string into an array by a delimiter.
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
def __init__(self) -> None:
|
|
33
|
-
super().__init__("split")
|
|
34
|
-
self._expected_parameter_count = 2
|
|
35
|
-
|
|
36
|
-
@property
|
|
37
|
-
def parameters(self) -> List[ASTNode]:
|
|
38
|
-
return self.get_children()
|
|
39
|
-
|
|
40
|
-
@parameters.setter
|
|
41
|
-
def parameters(self, nodes: List[ASTNode]) -> None:
|
|
42
|
-
if len(nodes) == 1:
|
|
43
|
-
nodes.append(String(""))
|
|
44
|
-
for node in nodes:
|
|
45
|
-
self.add_child(node)
|
|
46
|
-
|
|
47
|
-
def value(self) -> Any:
|
|
48
|
-
text = self.get_children()[0].value()
|
|
49
|
-
delimiter = self.get_children()[1].value()
|
|
50
|
-
if text is None:
|
|
51
|
-
return None
|
|
52
|
-
if not isinstance(text, str) or not isinstance(delimiter, str):
|
|
53
|
-
raise ValueError("Invalid arguments for split function")
|
|
54
|
-
return text.split(delimiter)
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
"""String distance function using Levenshtein distance."""
|
|
2
|
-
|
|
3
|
-
from typing import Optional
|
|
4
|
-
|
|
5
|
-
from .function import Function
|
|
6
|
-
from .function_metadata import FunctionDef
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def _levenshtein_distance(a: str, b: str) -> float:
|
|
10
|
-
"""Compute the normalized Levenshtein distance between two strings.
|
|
11
|
-
|
|
12
|
-
The Levenshtein distance is the minimum number of single-character edits
|
|
13
|
-
(insertions, deletions, or substitutions) required to change one string
|
|
14
|
-
into the other. The result is normalized to [0, 1] by dividing by the
|
|
15
|
-
length of the longer string.
|
|
16
|
-
|
|
17
|
-
Args:
|
|
18
|
-
a: First string
|
|
19
|
-
b: Second string
|
|
20
|
-
|
|
21
|
-
Returns:
|
|
22
|
-
The normalized Levenshtein distance (0 = identical, 1 = completely different)
|
|
23
|
-
"""
|
|
24
|
-
m = len(a)
|
|
25
|
-
n = len(b)
|
|
26
|
-
|
|
27
|
-
# Both empty strings are identical
|
|
28
|
-
if m == 0 and n == 0:
|
|
29
|
-
return 0.0
|
|
30
|
-
|
|
31
|
-
# Create a matrix of size (m+1) x (n+1)
|
|
32
|
-
dp = [[0] * (n + 1) for _ in range(m + 1)]
|
|
33
|
-
|
|
34
|
-
# Base cases: transforming empty string to/from a prefix
|
|
35
|
-
for i in range(m + 1):
|
|
36
|
-
dp[i][0] = i
|
|
37
|
-
for j in range(n + 1):
|
|
38
|
-
dp[0][j] = j
|
|
39
|
-
|
|
40
|
-
# Fill in the rest of the matrix
|
|
41
|
-
for i in range(1, m + 1):
|
|
42
|
-
for j in range(1, n + 1):
|
|
43
|
-
cost = 0 if a[i - 1] == b[j - 1] else 1
|
|
44
|
-
dp[i][j] = min(
|
|
45
|
-
dp[i - 1][j] + 1, # deletion
|
|
46
|
-
dp[i][j - 1] + 1, # insertion
|
|
47
|
-
dp[i - 1][j - 1] + cost # substitution
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
# Normalize by the length of the longer string
|
|
51
|
-
return dp[m][n] / max(m, n)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
@FunctionDef({
|
|
55
|
-
"description": (
|
|
56
|
-
"Computes the normalized Levenshtein distance between two strings. "
|
|
57
|
-
"Returns a value in [0, 1] where 0 means identical and 1 means completely different."
|
|
58
|
-
),
|
|
59
|
-
"category": "scalar",
|
|
60
|
-
"parameters": [
|
|
61
|
-
{"name": "string1", "description": "First string", "type": "string"},
|
|
62
|
-
{"name": "string2", "description": "Second string", "type": "string"}
|
|
63
|
-
],
|
|
64
|
-
"output": {
|
|
65
|
-
"description": "Normalized Levenshtein distance (0 = identical, 1 = completely different)",
|
|
66
|
-
"type": "number",
|
|
67
|
-
"example": 0.43,
|
|
68
|
-
},
|
|
69
|
-
"examples": [
|
|
70
|
-
"RETURN string_distance('kitten', 'sitting')",
|
|
71
|
-
"WITH 'hello' AS a, 'hallo' AS b RETURN string_distance(a, b)"
|
|
72
|
-
]
|
|
73
|
-
})
|
|
74
|
-
class StringDistance(Function):
|
|
75
|
-
"""String distance function.
|
|
76
|
-
|
|
77
|
-
Computes the normalized Levenshtein distance between two strings.
|
|
78
|
-
Returns a value in [0, 1] where 0 means identical and 1 means completely different.
|
|
79
|
-
"""
|
|
80
|
-
|
|
81
|
-
def __init__(self) -> None:
|
|
82
|
-
super().__init__("string_distance")
|
|
83
|
-
self._expected_parameter_count = 2
|
|
84
|
-
|
|
85
|
-
def value(self) -> Optional[float]:
|
|
86
|
-
str1 = self.get_children()[0].value()
|
|
87
|
-
str2 = self.get_children()[1].value()
|
|
88
|
-
if str1 is None or str2 is None:
|
|
89
|
-
return None
|
|
90
|
-
if not isinstance(str1, str) or not isinstance(str2, str):
|
|
91
|
-
raise ValueError("Invalid arguments for string_distance function: both arguments must be strings")
|
|
92
|
-
return _levenshtein_distance(str1, str2)
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"""Stringify function."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
from typing import Any, List
|
|
5
|
-
|
|
6
|
-
from ..ast_node import ASTNode
|
|
7
|
-
from ..expressions.number import Number
|
|
8
|
-
from .function import Function
|
|
9
|
-
from .function_metadata import FunctionDef
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@FunctionDef({
|
|
13
|
-
"description": "Converts a value to its JSON string representation",
|
|
14
|
-
"category": "scalar",
|
|
15
|
-
"parameters": [
|
|
16
|
-
{"name": "value", "description": "Value to stringify", "type": "any"}
|
|
17
|
-
],
|
|
18
|
-
"output": {"description": "JSON string", "type": "string", "example": '{"a":1}'},
|
|
19
|
-
"examples": ["WITH {a: 1} AS obj RETURN stringify(obj)"]
|
|
20
|
-
})
|
|
21
|
-
class Stringify(Function):
|
|
22
|
-
"""Stringify function.
|
|
23
|
-
|
|
24
|
-
Converts a value to its JSON string representation.
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
def __init__(self) -> None:
|
|
28
|
-
super().__init__("stringify")
|
|
29
|
-
self._expected_parameter_count = 2
|
|
30
|
-
|
|
31
|
-
@property
|
|
32
|
-
def parameters(self) -> List[ASTNode]:
|
|
33
|
-
return self.get_children()
|
|
34
|
-
|
|
35
|
-
@parameters.setter
|
|
36
|
-
def parameters(self, nodes: List[ASTNode]) -> None:
|
|
37
|
-
if len(nodes) == 1:
|
|
38
|
-
nodes.append(Number("3")) # Default indent of 3
|
|
39
|
-
for node in nodes:
|
|
40
|
-
self.add_child(node)
|
|
41
|
-
|
|
42
|
-
def value(self) -> Any:
|
|
43
|
-
val = self.get_children()[0].value()
|
|
44
|
-
indent = int(self.get_children()[1].value())
|
|
45
|
-
if val is None:
|
|
46
|
-
return None
|
|
47
|
-
if not isinstance(val, (dict, list)):
|
|
48
|
-
raise ValueError("Invalid argument for stringify function")
|
|
49
|
-
return json.dumps(val, indent=indent, default=str)
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
"""Substring function."""
|
|
2
|
-
|
|
3
|
-
from typing import Any, List
|
|
4
|
-
|
|
5
|
-
from ..ast_node import ASTNode
|
|
6
|
-
from .function import Function
|
|
7
|
-
from .function_metadata import FunctionDef
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@FunctionDef({
|
|
11
|
-
"description": "Returns a substring of a string, starting at a 0-based index with an optional length",
|
|
12
|
-
"category": "scalar",
|
|
13
|
-
"parameters": [
|
|
14
|
-
{"name": "original", "description": "The original string", "type": "string"},
|
|
15
|
-
{"name": "start", "description": "The 0-based start index", "type": "integer"},
|
|
16
|
-
{
|
|
17
|
-
"name": "length",
|
|
18
|
-
"description": "The length of the substring (optional)",
|
|
19
|
-
"type": "integer",
|
|
20
|
-
}
|
|
21
|
-
],
|
|
22
|
-
"output": {"description": "The substring", "type": "string", "example": "llo"},
|
|
23
|
-
"examples": [
|
|
24
|
-
"RETURN substring('hello', 1, 3)",
|
|
25
|
-
"RETURN substring('hello', 2)"
|
|
26
|
-
]
|
|
27
|
-
})
|
|
28
|
-
class Substring(Function):
|
|
29
|
-
"""Substring function.
|
|
30
|
-
|
|
31
|
-
Returns a substring of a string, starting at a 0-based index with an optional length.
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
def __init__(self) -> None:
|
|
35
|
-
super().__init__("substring")
|
|
36
|
-
|
|
37
|
-
@property
|
|
38
|
-
def parameters(self) -> List[ASTNode]:
|
|
39
|
-
return self.get_children()
|
|
40
|
-
|
|
41
|
-
@parameters.setter
|
|
42
|
-
def parameters(self, nodes: List[ASTNode]) -> None:
|
|
43
|
-
if len(nodes) < 2 or len(nodes) > 3:
|
|
44
|
-
raise ValueError(
|
|
45
|
-
f"Function substring expected 2 or 3 parameters, but got {len(nodes)}"
|
|
46
|
-
)
|
|
47
|
-
for node in nodes:
|
|
48
|
-
self.add_child(node)
|
|
49
|
-
|
|
50
|
-
def value(self) -> Any:
|
|
51
|
-
children = self.get_children()
|
|
52
|
-
original = children[0].value()
|
|
53
|
-
start = children[1].value()
|
|
54
|
-
|
|
55
|
-
if original is None:
|
|
56
|
-
return None
|
|
57
|
-
if not isinstance(original, str):
|
|
58
|
-
raise ValueError(
|
|
59
|
-
"Invalid argument for substring function: expected a string as the first argument"
|
|
60
|
-
)
|
|
61
|
-
if not isinstance(start, (int, float)) or (isinstance(start, float) and not start.is_integer()):
|
|
62
|
-
raise ValueError(
|
|
63
|
-
"Invalid argument for substring function: expected an integer as the second argument"
|
|
64
|
-
)
|
|
65
|
-
start = int(start)
|
|
66
|
-
|
|
67
|
-
if len(children) == 3:
|
|
68
|
-
length = children[2].value()
|
|
69
|
-
if not isinstance(length, (int, float)) or (isinstance(length, float) and not length.is_integer()):
|
|
70
|
-
raise ValueError(
|
|
71
|
-
"Invalid argument for substring function: expected an integer as the third argument"
|
|
72
|
-
)
|
|
73
|
-
length = int(length)
|
|
74
|
-
return original[start:start + length]
|
|
75
|
-
|
|
76
|
-
return original[start:]
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"""Sum aggregate function."""
|
|
2
|
-
|
|
3
|
-
from typing import Any
|
|
4
|
-
|
|
5
|
-
from .aggregate_function import AggregateFunction
|
|
6
|
-
from .function_metadata import FunctionDef
|
|
7
|
-
from .reducer_element import ReducerElement
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class SumReducerElement(ReducerElement):
|
|
11
|
-
"""Reducer element for Sum aggregate function."""
|
|
12
|
-
|
|
13
|
-
def __init__(self) -> None:
|
|
14
|
-
self._value: Any = None
|
|
15
|
-
|
|
16
|
-
@property
|
|
17
|
-
def value(self) -> Any:
|
|
18
|
-
return self._value
|
|
19
|
-
|
|
20
|
-
@value.setter
|
|
21
|
-
def value(self, val: Any) -> None:
|
|
22
|
-
if self._value is not None:
|
|
23
|
-
self._value += val
|
|
24
|
-
else:
|
|
25
|
-
self._value = val
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
@FunctionDef({
|
|
29
|
-
"description": "Calculates the sum of numeric values across grouped rows",
|
|
30
|
-
"category": "aggregate",
|
|
31
|
-
"parameters": [
|
|
32
|
-
{"name": "value", "description": "Numeric value to sum", "type": "number"}
|
|
33
|
-
],
|
|
34
|
-
"output": {"description": "Sum of all values", "type": "number", "example": 150},
|
|
35
|
-
"examples": ["WITH [1, 2, 3] AS nums UNWIND nums AS n RETURN sum(n)"]
|
|
36
|
-
})
|
|
37
|
-
class Sum(AggregateFunction):
|
|
38
|
-
"""Sum aggregate function.
|
|
39
|
-
|
|
40
|
-
Calculates the sum of numeric values across grouped rows.
|
|
41
|
-
"""
|
|
42
|
-
|
|
43
|
-
def __init__(self) -> None:
|
|
44
|
-
super().__init__("sum")
|
|
45
|
-
self._expected_parameter_count = 1
|
|
46
|
-
|
|
47
|
-
def reduce(self, element: SumReducerElement) -> None:
|
|
48
|
-
element.value = self.first_child().value()
|
|
49
|
-
|
|
50
|
-
def element(self) -> SumReducerElement:
|
|
51
|
-
return SumReducerElement()
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"""Tail function."""
|
|
2
|
-
|
|
3
|
-
from typing import Any
|
|
4
|
-
|
|
5
|
-
from .function import Function
|
|
6
|
-
from .function_metadata import FunctionDef
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
@FunctionDef({
|
|
10
|
-
"description": "Returns all elements of a list except the first",
|
|
11
|
-
"category": "scalar",
|
|
12
|
-
"parameters": [
|
|
13
|
-
{"name": "list", "description": "The list to get all but the first element from", "type": "array"}
|
|
14
|
-
],
|
|
15
|
-
"output": {"description": "All elements except the first", "type": "array", "example": [2, 3]},
|
|
16
|
-
"examples": [
|
|
17
|
-
"RETURN tail([1, 2, 3])",
|
|
18
|
-
"WITH ['a', 'b', 'c'] AS items RETURN tail(items)"
|
|
19
|
-
]
|
|
20
|
-
})
|
|
21
|
-
class Tail(Function):
|
|
22
|
-
"""Tail function.
|
|
23
|
-
|
|
24
|
-
Returns all elements of a list except the first.
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
def __init__(self) -> None:
|
|
28
|
-
super().__init__("tail")
|
|
29
|
-
self._expected_parameter_count = 1
|
|
30
|
-
|
|
31
|
-
def value(self) -> Any:
|
|
32
|
-
val = self.get_children()[0].value()
|
|
33
|
-
if val is None:
|
|
34
|
-
return None
|
|
35
|
-
if not isinstance(val, list):
|
|
36
|
-
raise ValueError("tail() expects a list")
|
|
37
|
-
return val[1:]
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
"""Shared utility functions for temporal (date/time) operations.
|
|
2
|
-
|
|
3
|
-
These helpers are used by the datetime_, date_, time_, localdatetime,
|
|
4
|
-
localtime, and timestamp functions.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from datetime import date, datetime, timezone
|
|
8
|
-
from typing import Any, Dict
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def iso_day_of_week(d: date) -> int:
|
|
12
|
-
"""Computes the ISO day of the week (1 = Monday, 7 = Sunday)."""
|
|
13
|
-
return d.isoweekday()
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def day_of_year(d: date) -> int:
|
|
17
|
-
"""Computes the day of the year (1-based)."""
|
|
18
|
-
return d.timetuple().tm_yday
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def quarter(month: int) -> int:
|
|
22
|
-
"""Computes the quarter (1-4) from a month (1-12)."""
|
|
23
|
-
return (month - 1) // 3 + 1
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def parse_temporal_arg(arg: Any, fn_name: str) -> datetime:
|
|
27
|
-
"""Parses a temporal argument (string, number, or map) into a datetime object.
|
|
28
|
-
|
|
29
|
-
Args:
|
|
30
|
-
arg: The argument to parse (string, number, or dict with components)
|
|
31
|
-
fn_name: The calling function name for error messages
|
|
32
|
-
|
|
33
|
-
Returns:
|
|
34
|
-
A datetime object
|
|
35
|
-
"""
|
|
36
|
-
if isinstance(arg, str):
|
|
37
|
-
try:
|
|
38
|
-
return datetime.fromisoformat(arg.replace("Z", "+00:00"))
|
|
39
|
-
except ValueError:
|
|
40
|
-
raise ValueError(f"{fn_name}(): Invalid temporal string: '{arg}'")
|
|
41
|
-
|
|
42
|
-
if isinstance(arg, (int, float)):
|
|
43
|
-
# Treat as epoch milliseconds
|
|
44
|
-
return datetime.fromtimestamp(arg / 1000, tz=timezone.utc)
|
|
45
|
-
|
|
46
|
-
if isinstance(arg, dict):
|
|
47
|
-
# Map-style construction: {year, month, day, hour, minute, second, millisecond}
|
|
48
|
-
now = datetime.now()
|
|
49
|
-
year = arg.get("year", now.year)
|
|
50
|
-
month = arg.get("month", 1)
|
|
51
|
-
day = arg.get("day", 1)
|
|
52
|
-
hour = arg.get("hour", 0)
|
|
53
|
-
minute = arg.get("minute", 0)
|
|
54
|
-
second = arg.get("second", 0)
|
|
55
|
-
millisecond = arg.get("millisecond", 0)
|
|
56
|
-
return datetime(year, month, day, hour, minute, second, millisecond * 1000)
|
|
57
|
-
|
|
58
|
-
raise ValueError(
|
|
59
|
-
f"{fn_name}(): Expected a string, number (epoch millis), or map argument, "
|
|
60
|
-
f"got {type(arg).__name__}"
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def build_datetime_object(d: datetime, utc: bool) -> Dict[str, Any]:
|
|
65
|
-
"""Builds a datetime result object with full temporal properties.
|
|
66
|
-
|
|
67
|
-
Args:
|
|
68
|
-
d: The datetime object
|
|
69
|
-
utc: If True, use UTC values; if False, use local values
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
A dict with year, month, day, hour, minute, second, millisecond,
|
|
73
|
-
epochMillis, epochSeconds, dayOfWeek, dayOfYear, quarter, formatted
|
|
74
|
-
"""
|
|
75
|
-
if utc:
|
|
76
|
-
if d.tzinfo is None:
|
|
77
|
-
d = d.replace(tzinfo=timezone.utc)
|
|
78
|
-
d_utc = d.astimezone(timezone.utc)
|
|
79
|
-
year = d_utc.year
|
|
80
|
-
month = d_utc.month
|
|
81
|
-
day = d_utc.day
|
|
82
|
-
hour = d_utc.hour
|
|
83
|
-
minute = d_utc.minute
|
|
84
|
-
second = d_utc.second
|
|
85
|
-
millisecond = d_utc.microsecond // 1000
|
|
86
|
-
formatted = d_utc.strftime("%Y-%m-%dT%H:%M:%S.") + f"{millisecond:03d}Z"
|
|
87
|
-
else:
|
|
88
|
-
if d.tzinfo is not None:
|
|
89
|
-
d = d.astimezone(tz=None).replace(tzinfo=None)
|
|
90
|
-
year = d.year
|
|
91
|
-
month = d.month
|
|
92
|
-
day = d.day
|
|
93
|
-
hour = d.hour
|
|
94
|
-
minute = d.minute
|
|
95
|
-
second = d.second
|
|
96
|
-
millisecond = d.microsecond // 1000
|
|
97
|
-
formatted = d.strftime("%Y-%m-%dT%H:%M:%S.") + f"{millisecond:03d}"
|
|
98
|
-
|
|
99
|
-
date_part = date(year, month, day)
|
|
100
|
-
epoch_millis = int(d.timestamp() * 1000) if d.tzinfo else int(
|
|
101
|
-
datetime(year, month, day, hour, minute, second, millisecond * 1000).timestamp() * 1000
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
return {
|
|
105
|
-
"year": year,
|
|
106
|
-
"month": month,
|
|
107
|
-
"day": day,
|
|
108
|
-
"hour": hour,
|
|
109
|
-
"minute": minute,
|
|
110
|
-
"second": second,
|
|
111
|
-
"millisecond": millisecond,
|
|
112
|
-
"epochMillis": epoch_millis,
|
|
113
|
-
"epochSeconds": epoch_millis // 1000,
|
|
114
|
-
"dayOfWeek": iso_day_of_week(date_part),
|
|
115
|
-
"dayOfYear": day_of_year(date_part),
|
|
116
|
-
"quarter": quarter(month),
|
|
117
|
-
"formatted": formatted,
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
def build_date_object(d: datetime) -> Dict[str, Any]:
|
|
122
|
-
"""Builds a date result object (no time component).
|
|
123
|
-
|
|
124
|
-
Args:
|
|
125
|
-
d: The datetime object
|
|
126
|
-
|
|
127
|
-
Returns:
|
|
128
|
-
A dict with year, month, day, epochMillis, dayOfWeek, dayOfYear, quarter, formatted
|
|
129
|
-
"""
|
|
130
|
-
year = d.year
|
|
131
|
-
month = d.month
|
|
132
|
-
day_val = d.day
|
|
133
|
-
|
|
134
|
-
date_only = datetime(year, month, day_val)
|
|
135
|
-
epoch_millis = int(date_only.timestamp() * 1000)
|
|
136
|
-
|
|
137
|
-
date_part = date(year, month, day_val)
|
|
138
|
-
|
|
139
|
-
return {
|
|
140
|
-
"year": year,
|
|
141
|
-
"month": month,
|
|
142
|
-
"day": day_val,
|
|
143
|
-
"epochMillis": epoch_millis,
|
|
144
|
-
"dayOfWeek": iso_day_of_week(date_part),
|
|
145
|
-
"dayOfYear": day_of_year(date_part),
|
|
146
|
-
"quarter": quarter(month),
|
|
147
|
-
"formatted": f"{year}-{month:02d}-{day_val:02d}",
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
def build_time_object(d: datetime, utc: bool) -> Dict[str, Any]:
|
|
152
|
-
"""Builds a time result object (no date component).
|
|
153
|
-
|
|
154
|
-
Args:
|
|
155
|
-
d: The datetime object
|
|
156
|
-
utc: If True, use UTC values; if False, use local values
|
|
157
|
-
|
|
158
|
-
Returns:
|
|
159
|
-
A dict with hour, minute, second, millisecond, formatted
|
|
160
|
-
"""
|
|
161
|
-
if utc:
|
|
162
|
-
if d.tzinfo is None:
|
|
163
|
-
d = d.replace(tzinfo=timezone.utc)
|
|
164
|
-
d_utc = d.astimezone(timezone.utc)
|
|
165
|
-
hour = d_utc.hour
|
|
166
|
-
minute = d_utc.minute
|
|
167
|
-
second = d_utc.second
|
|
168
|
-
millisecond = d_utc.microsecond // 1000
|
|
169
|
-
else:
|
|
170
|
-
if d.tzinfo is not None:
|
|
171
|
-
d = d.astimezone(tz=None).replace(tzinfo=None)
|
|
172
|
-
hour = d.hour
|
|
173
|
-
minute = d.minute
|
|
174
|
-
second = d.second
|
|
175
|
-
millisecond = d.microsecond // 1000
|
|
176
|
-
|
|
177
|
-
time_part = f"{hour:02d}:{minute:02d}:{second:02d}.{millisecond:03d}"
|
|
178
|
-
formatted = f"{time_part}Z" if utc else time_part
|
|
179
|
-
|
|
180
|
-
return {
|
|
181
|
-
"hour": hour,
|
|
182
|
-
"minute": minute,
|
|
183
|
-
"second": second,
|
|
184
|
-
"millisecond": millisecond,
|
|
185
|
-
"formatted": formatted,
|
|
186
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"""Time function."""
|
|
2
|
-
|
|
3
|
-
from datetime import datetime, timezone
|
|
4
|
-
from typing import Any
|
|
5
|
-
|
|
6
|
-
from .function import Function
|
|
7
|
-
from .function_metadata import FunctionDef
|
|
8
|
-
from .temporal_utils import build_time_object, parse_temporal_arg
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
@FunctionDef({
|
|
12
|
-
"description": (
|
|
13
|
-
"Returns a time value. With no arguments returns the current UTC time. "
|
|
14
|
-
"Accepts an ISO 8601 time string or a map of components (hour, minute, second, millisecond)."
|
|
15
|
-
),
|
|
16
|
-
"category": "scalar",
|
|
17
|
-
"parameters": [
|
|
18
|
-
{
|
|
19
|
-
"name": "input",
|
|
20
|
-
"description": "Optional. An ISO 8601 time string (HH:MM:SS) or a map of components.",
|
|
21
|
-
"type": "string",
|
|
22
|
-
"required": False,
|
|
23
|
-
},
|
|
24
|
-
],
|
|
25
|
-
"output": {
|
|
26
|
-
"description": "A time object with properties: hour, minute, second, millisecond, formatted",
|
|
27
|
-
"type": "object",
|
|
28
|
-
},
|
|
29
|
-
"examples": [
|
|
30
|
-
"RETURN time() AS now",
|
|
31
|
-
"RETURN time('12:30:00') AS t",
|
|
32
|
-
"WITH time() AS t RETURN t.hour, t.minute",
|
|
33
|
-
],
|
|
34
|
-
})
|
|
35
|
-
class Time(Function):
|
|
36
|
-
"""Time function.
|
|
37
|
-
|
|
38
|
-
Returns a time value (with timezone offset awareness).
|
|
39
|
-
When called with no arguments, returns the current UTC time.
|
|
40
|
-
When called with a string argument, parses it.
|
|
41
|
-
"""
|
|
42
|
-
|
|
43
|
-
def __init__(self) -> None:
|
|
44
|
-
super().__init__("time")
|
|
45
|
-
self._expected_parameter_count = None
|
|
46
|
-
|
|
47
|
-
def value(self) -> Any:
|
|
48
|
-
children = self.get_children()
|
|
49
|
-
if len(children) > 1:
|
|
50
|
-
raise ValueError("time() accepts at most one argument")
|
|
51
|
-
|
|
52
|
-
if len(children) == 1:
|
|
53
|
-
d = parse_temporal_arg(children[0].value(), "time")
|
|
54
|
-
else:
|
|
55
|
-
d = datetime.now(timezone.utc)
|
|
56
|
-
|
|
57
|
-
return build_time_object(d, utc=True)
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"""Timestamp function."""
|
|
2
|
-
|
|
3
|
-
import time
|
|
4
|
-
from typing import Any
|
|
5
|
-
|
|
6
|
-
from .function import Function
|
|
7
|
-
from .function_metadata import FunctionDef
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@FunctionDef({
|
|
11
|
-
"description": (
|
|
12
|
-
"Returns the number of milliseconds since the Unix epoch (1970-01-01T00:00:00Z)."
|
|
13
|
-
),
|
|
14
|
-
"category": "scalar",
|
|
15
|
-
"parameters": [],
|
|
16
|
-
"output": {
|
|
17
|
-
"description": "Milliseconds since Unix epoch",
|
|
18
|
-
"type": "number",
|
|
19
|
-
"example": 1718450000000,
|
|
20
|
-
},
|
|
21
|
-
"examples": [
|
|
22
|
-
"RETURN timestamp() AS ts",
|
|
23
|
-
"WITH timestamp() AS before, timestamp() AS after RETURN after - before",
|
|
24
|
-
],
|
|
25
|
-
})
|
|
26
|
-
class Timestamp(Function):
|
|
27
|
-
"""Timestamp function.
|
|
28
|
-
|
|
29
|
-
Returns the number of milliseconds since the Unix epoch (1970-01-01T00:00:00Z).
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
def __init__(self) -> None:
|
|
33
|
-
super().__init__("timestamp")
|
|
34
|
-
self._expected_parameter_count = 0
|
|
35
|
-
|
|
36
|
-
def value(self) -> Any:
|
|
37
|
-
return int(time.time() * 1000)
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"""ToFloat function."""
|
|
2
|
-
|
|
3
|
-
from typing import Any
|
|
4
|
-
|
|
5
|
-
from .function import Function
|
|
6
|
-
from .function_metadata import FunctionDef
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
@FunctionDef({
|
|
10
|
-
"description": "Converts a value to a floating point number",
|
|
11
|
-
"category": "scalar",
|
|
12
|
-
"parameters": [
|
|
13
|
-
{"name": "value", "description": "The value to convert to a float", "type": "any"}
|
|
14
|
-
],
|
|
15
|
-
"output": {"description": "The floating point representation of the value", "type": "number", "example": 3.14},
|
|
16
|
-
"examples": [
|
|
17
|
-
'RETURN toFloat("3.14")',
|
|
18
|
-
"RETURN toFloat(42)",
|
|
19
|
-
"RETURN toFloat(true)"
|
|
20
|
-
]
|
|
21
|
-
})
|
|
22
|
-
class ToFloat(Function):
|
|
23
|
-
"""ToFloat function.
|
|
24
|
-
|
|
25
|
-
Converts a value to a floating point number.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
def __init__(self) -> None:
|
|
29
|
-
super().__init__("tofloat")
|
|
30
|
-
self._expected_parameter_count = 1
|
|
31
|
-
|
|
32
|
-
def value(self) -> Any:
|
|
33
|
-
val = self.get_children()[0].value()
|
|
34
|
-
if val is None:
|
|
35
|
-
return None
|
|
36
|
-
if isinstance(val, bool):
|
|
37
|
-
return 1.0 if val else 0.0
|
|
38
|
-
if isinstance(val, (int, float)):
|
|
39
|
-
return float(val)
|
|
40
|
-
if isinstance(val, str):
|
|
41
|
-
trimmed = val.strip()
|
|
42
|
-
try:
|
|
43
|
-
return float(trimmed)
|
|
44
|
-
except (ValueError, OverflowError):
|
|
45
|
-
raise ValueError(f'Cannot convert string "{val}" to float')
|
|
46
|
-
raise ValueError("toFloat() expects a number, string, or boolean")
|