flowquery 1.0.16 → 1.0.17
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/.github/workflows/python-publish.yml +97 -0
- package/dist/compute/runner.d.ts +3 -2
- package/dist/compute/runner.d.ts.map +1 -1
- package/dist/compute/runner.js +7 -7
- package/dist/compute/runner.js.map +1 -1
- package/dist/flowquery.min.js +1 -1
- package/dist/graph/data.d.ts +31 -0
- package/dist/graph/data.d.ts.map +1 -0
- package/dist/graph/data.js +110 -0
- package/dist/graph/data.js.map +1 -0
- package/dist/graph/database.d.ts +20 -0
- package/dist/graph/database.d.ts.map +1 -0
- package/dist/graph/database.js +77 -0
- package/dist/graph/database.js.map +1 -0
- package/dist/graph/hops.d.ts +11 -0
- package/dist/graph/hops.d.ts.map +1 -0
- package/dist/graph/hops.js +25 -0
- package/dist/graph/hops.js.map +1 -0
- package/dist/graph/node.d.ts +35 -0
- package/dist/graph/node.d.ts.map +1 -0
- package/dist/graph/node.js +113 -0
- package/dist/graph/node.js.map +1 -0
- package/dist/graph/node_data.d.ts +11 -0
- package/dist/graph/node_data.d.ts.map +1 -0
- package/dist/graph/node_data.js +20 -0
- package/dist/graph/node_data.js.map +1 -0
- package/dist/graph/node_reference.d.ts +10 -0
- package/dist/graph/node_reference.d.ts.map +1 -0
- package/dist/graph/node_reference.js +52 -0
- package/dist/graph/node_reference.js.map +1 -0
- package/dist/graph/pattern.d.ts +18 -0
- package/dist/graph/pattern.d.ts.map +1 -0
- package/dist/graph/pattern.js +114 -0
- package/dist/graph/pattern.js.map +1 -0
- package/dist/graph/pattern_expression.d.ts +14 -0
- package/dist/graph/pattern_expression.d.ts.map +1 -0
- package/dist/graph/pattern_expression.js +58 -0
- package/dist/graph/pattern_expression.js.map +1 -0
- package/dist/graph/patterns.d.ts +11 -0
- package/dist/graph/patterns.d.ts.map +1 -0
- package/dist/graph/patterns.js +49 -0
- package/dist/graph/patterns.js.map +1 -0
- package/dist/graph/physical_node.d.ts +10 -0
- package/dist/graph/physical_node.d.ts.map +1 -0
- package/dist/graph/physical_node.js +40 -0
- package/dist/graph/physical_node.js.map +1 -0
- package/dist/graph/physical_relationship.d.ts +10 -0
- package/dist/graph/physical_relationship.d.ts.map +1 -0
- package/dist/graph/physical_relationship.js +40 -0
- package/dist/graph/physical_relationship.js.map +1 -0
- package/dist/graph/relationship.d.ts +40 -0
- package/dist/graph/relationship.d.ts.map +1 -0
- package/dist/graph/relationship.js +124 -0
- package/dist/graph/relationship.js.map +1 -0
- package/dist/graph/relationship_data.d.ts +12 -0
- package/dist/graph/relationship_data.d.ts.map +1 -0
- package/dist/graph/relationship_data.js +40 -0
- package/dist/graph/relationship_data.js.map +1 -0
- package/dist/graph/relationship_match_collector.d.ts +19 -0
- package/dist/graph/relationship_match_collector.d.ts.map +1 -0
- package/dist/graph/relationship_match_collector.js +55 -0
- package/dist/graph/relationship_match_collector.js.map +1 -0
- package/dist/graph/relationship_reference.d.ts +8 -0
- package/dist/graph/relationship_reference.d.ts.map +1 -0
- package/dist/graph/relationship_reference.js +37 -0
- package/dist/graph/relationship_reference.js.map +1 -0
- package/dist/parsing/base_parser.d.ts +1 -0
- package/dist/parsing/base_parser.d.ts.map +1 -1
- package/dist/parsing/base_parser.js +4 -1
- package/dist/parsing/base_parser.js.map +1 -1
- package/dist/parsing/context.d.ts +2 -2
- package/dist/parsing/context.js +5 -5
- package/dist/parsing/expressions/boolean.d.ts +8 -0
- package/dist/parsing/expressions/boolean.d.ts.map +1 -0
- package/dist/parsing/expressions/boolean.js +26 -0
- package/dist/parsing/expressions/boolean.js.map +1 -0
- package/dist/parsing/expressions/expression.d.ts +4 -1
- package/dist/parsing/expressions/expression.d.ts.map +1 -1
- package/dist/parsing/expressions/expression.js +15 -8
- package/dist/parsing/expressions/expression.js.map +1 -1
- package/dist/parsing/expressions/operator.d.ts +1 -1
- package/dist/parsing/expressions/operator.d.ts.map +1 -1
- package/dist/parsing/expressions/operator.js.map +1 -1
- package/dist/parsing/functions/function_factory.d.ts +13 -13
- package/dist/parsing/functions/function_factory.d.ts.map +1 -1
- package/dist/parsing/functions/function_factory.js +20 -18
- package/dist/parsing/functions/function_factory.js.map +1 -1
- package/dist/parsing/operations/create_node.d.ts +14 -0
- package/dist/parsing/operations/create_node.d.ts.map +1 -0
- package/dist/parsing/operations/create_node.js +51 -0
- package/dist/parsing/operations/create_node.js.map +1 -0
- package/dist/parsing/operations/create_relationship.d.ts +14 -0
- package/dist/parsing/operations/create_relationship.d.ts.map +1 -0
- package/dist/parsing/operations/create_relationship.js +51 -0
- package/dist/parsing/operations/create_relationship.js.map +1 -0
- package/dist/parsing/operations/match.d.ts +15 -0
- package/dist/parsing/operations/match.d.ts.map +1 -0
- package/dist/parsing/operations/match.js +45 -0
- package/dist/parsing/operations/match.js.map +1 -0
- package/dist/parsing/operations/operation.d.ts +1 -0
- package/dist/parsing/operations/operation.d.ts.map +1 -1
- package/dist/parsing/operations/operation.js +6 -0
- package/dist/parsing/operations/operation.js.map +1 -1
- package/dist/parsing/operations/return.d.ts +1 -0
- package/dist/parsing/operations/return.d.ts.map +1 -1
- package/dist/parsing/operations/return.js +7 -1
- package/dist/parsing/operations/return.js.map +1 -1
- package/dist/parsing/operations/where.d.ts +1 -1
- package/dist/parsing/operations/where.d.ts.map +1 -1
- package/dist/parsing/operations/where.js +4 -0
- package/dist/parsing/operations/where.js.map +1 -1
- package/dist/parsing/parser.d.ts +10 -0
- package/dist/parsing/parser.d.ts.map +1 -1
- package/dist/parsing/parser.js +344 -5
- package/dist/parsing/parser.js.map +1 -1
- package/dist/parsing/token_to_node.d.ts.map +1 -1
- package/dist/parsing/token_to_node.js +7 -0
- package/dist/parsing/token_to_node.js.map +1 -1
- package/dist/tokenization/keyword.d.ts +1 -0
- package/dist/tokenization/keyword.d.ts.map +1 -1
- package/dist/tokenization/keyword.js +1 -0
- package/dist/tokenization/keyword.js.map +1 -1
- package/dist/tokenization/token.d.ts +4 -0
- package/dist/tokenization/token.d.ts.map +1 -1
- package/dist/tokenization/token.js +14 -1
- package/dist/tokenization/token.js.map +1 -1
- package/dist/tokenization/token_type.d.ts +1 -0
- package/dist/tokenization/token_type.d.ts.map +1 -1
- package/dist/tokenization/token_type.js +1 -0
- package/dist/tokenization/token_type.js.map +1 -1
- package/dist/tokenization/tokenizer.d.ts +2 -1
- package/dist/tokenization/tokenizer.d.ts.map +1 -1
- package/dist/tokenization/tokenizer.js +25 -12
- package/dist/tokenization/tokenizer.js.map +1 -1
- package/docs/flowquery.min.js +1 -1
- package/flowquery-py/README.md +166 -0
- package/flowquery-py/pyproject.toml +75 -0
- package/flowquery-py/setup_env.ps1 +92 -0
- package/flowquery-py/setup_env.sh +87 -0
- package/flowquery-py/src/__init__.py +34 -0
- package/flowquery-py/src/__main__.py +10 -0
- package/flowquery-py/src/compute/__init__.py +5 -0
- package/flowquery-py/src/compute/runner.py +60 -0
- package/flowquery-py/src/extensibility.py +52 -0
- package/flowquery-py/src/graph/__init__.py +31 -0
- package/flowquery-py/src/graph/data.py +118 -0
- package/flowquery-py/src/graph/database.py +82 -0
- package/flowquery-py/src/graph/hops.py +43 -0
- package/flowquery-py/src/graph/node.py +112 -0
- package/flowquery-py/src/graph/node_data.py +26 -0
- package/flowquery-py/src/graph/node_reference.py +49 -0
- package/flowquery-py/src/graph/pattern.py +125 -0
- package/flowquery-py/src/graph/pattern_expression.py +62 -0
- package/flowquery-py/src/graph/patterns.py +42 -0
- package/flowquery-py/src/graph/physical_node.py +40 -0
- package/flowquery-py/src/graph/physical_relationship.py +36 -0
- package/flowquery-py/src/graph/relationship.py +135 -0
- package/flowquery-py/src/graph/relationship_data.py +33 -0
- package/flowquery-py/src/graph/relationship_match_collector.py +77 -0
- package/flowquery-py/src/graph/relationship_reference.py +21 -0
- package/flowquery-py/src/io/__init__.py +5 -0
- package/flowquery-py/src/io/command_line.py +67 -0
- package/flowquery-py/src/parsing/__init__.py +17 -0
- package/flowquery-py/src/parsing/alias.py +20 -0
- package/flowquery-py/src/parsing/alias_option.py +11 -0
- package/flowquery-py/src/parsing/ast_node.py +146 -0
- package/flowquery-py/src/parsing/base_parser.py +84 -0
- package/flowquery-py/src/parsing/components/__init__.py +19 -0
- package/flowquery-py/src/parsing/components/csv.py +8 -0
- package/flowquery-py/src/parsing/components/from_.py +10 -0
- package/flowquery-py/src/parsing/components/headers.py +12 -0
- package/flowquery-py/src/parsing/components/json.py +8 -0
- package/flowquery-py/src/parsing/components/null.py +10 -0
- package/flowquery-py/src/parsing/components/post.py +8 -0
- package/flowquery-py/src/parsing/components/text.py +8 -0
- package/flowquery-py/src/parsing/context.py +50 -0
- package/flowquery-py/src/parsing/data_structures/__init__.py +15 -0
- package/flowquery-py/src/parsing/data_structures/associative_array.py +41 -0
- package/flowquery-py/src/parsing/data_structures/json_array.py +30 -0
- package/flowquery-py/src/parsing/data_structures/key_value_pair.py +38 -0
- package/flowquery-py/src/parsing/data_structures/lookup.py +49 -0
- package/flowquery-py/src/parsing/data_structures/range_lookup.py +42 -0
- package/flowquery-py/src/parsing/expressions/__init__.py +57 -0
- package/flowquery-py/src/parsing/expressions/boolean.py +20 -0
- package/flowquery-py/src/parsing/expressions/expression.py +138 -0
- package/flowquery-py/src/parsing/expressions/expression_map.py +26 -0
- package/flowquery-py/src/parsing/expressions/f_string.py +27 -0
- package/flowquery-py/src/parsing/expressions/identifier.py +20 -0
- package/flowquery-py/src/parsing/expressions/number.py +32 -0
- package/flowquery-py/src/parsing/expressions/operator.py +169 -0
- package/flowquery-py/src/parsing/expressions/reference.py +47 -0
- package/flowquery-py/src/parsing/expressions/string.py +27 -0
- package/flowquery-py/src/parsing/functions/__init__.py +75 -0
- package/flowquery-py/src/parsing/functions/aggregate_function.py +60 -0
- package/flowquery-py/src/parsing/functions/async_function.py +62 -0
- package/flowquery-py/src/parsing/functions/avg.py +55 -0
- package/flowquery-py/src/parsing/functions/collect.py +75 -0
- package/flowquery-py/src/parsing/functions/function.py +68 -0
- package/flowquery-py/src/parsing/functions/function_factory.py +173 -0
- package/flowquery-py/src/parsing/functions/function_metadata.py +149 -0
- package/flowquery-py/src/parsing/functions/functions.py +59 -0
- package/flowquery-py/src/parsing/functions/join.py +47 -0
- package/flowquery-py/src/parsing/functions/keys.py +34 -0
- package/flowquery-py/src/parsing/functions/predicate_function.py +46 -0
- package/flowquery-py/src/parsing/functions/predicate_sum.py +47 -0
- package/flowquery-py/src/parsing/functions/rand.py +28 -0
- package/flowquery-py/src/parsing/functions/range_.py +34 -0
- package/flowquery-py/src/parsing/functions/reducer_element.py +15 -0
- package/flowquery-py/src/parsing/functions/replace.py +37 -0
- package/flowquery-py/src/parsing/functions/round_.py +32 -0
- package/flowquery-py/src/parsing/functions/size.py +32 -0
- package/flowquery-py/src/parsing/functions/split.py +47 -0
- package/flowquery-py/src/parsing/functions/stringify.py +47 -0
- package/flowquery-py/src/parsing/functions/sum.py +51 -0
- package/flowquery-py/src/parsing/functions/to_json.py +33 -0
- package/flowquery-py/src/parsing/functions/type_.py +47 -0
- package/flowquery-py/src/parsing/functions/value_holder.py +24 -0
- package/flowquery-py/src/parsing/logic/__init__.py +15 -0
- package/flowquery-py/src/parsing/logic/case.py +29 -0
- package/flowquery-py/src/parsing/logic/else_.py +12 -0
- package/flowquery-py/src/parsing/logic/end.py +8 -0
- package/flowquery-py/src/parsing/logic/then.py +12 -0
- package/flowquery-py/src/parsing/logic/when.py +10 -0
- package/flowquery-py/src/parsing/operations/__init__.py +35 -0
- package/flowquery-py/src/parsing/operations/aggregated_return.py +24 -0
- package/flowquery-py/src/parsing/operations/aggregated_with.py +22 -0
- package/flowquery-py/src/parsing/operations/call.py +74 -0
- package/flowquery-py/src/parsing/operations/create_node.py +34 -0
- package/flowquery-py/src/parsing/operations/create_relationship.py +34 -0
- package/flowquery-py/src/parsing/operations/group_by.py +130 -0
- package/flowquery-py/src/parsing/operations/limit.py +22 -0
- package/flowquery-py/src/parsing/operations/load.py +140 -0
- package/flowquery-py/src/parsing/operations/match.py +29 -0
- package/flowquery-py/src/parsing/operations/operation.py +69 -0
- package/flowquery-py/src/parsing/operations/projection.py +21 -0
- package/flowquery-py/src/parsing/operations/return_op.py +50 -0
- package/flowquery-py/src/parsing/operations/unwind.py +37 -0
- package/flowquery-py/src/parsing/operations/where.py +41 -0
- package/flowquery-py/src/parsing/operations/with_op.py +18 -0
- package/flowquery-py/src/parsing/parser.py +1011 -0
- package/flowquery-py/src/parsing/token_to_node.py +109 -0
- package/flowquery-py/src/tokenization/__init__.py +23 -0
- package/flowquery-py/src/tokenization/keyword.py +48 -0
- package/flowquery-py/src/tokenization/operator.py +29 -0
- package/flowquery-py/src/tokenization/string_walker.py +158 -0
- package/flowquery-py/src/tokenization/symbol.py +19 -0
- package/flowquery-py/src/tokenization/token.py +659 -0
- package/flowquery-py/src/tokenization/token_mapper.py +52 -0
- package/flowquery-py/src/tokenization/token_type.py +21 -0
- package/flowquery-py/src/tokenization/tokenizer.py +214 -0
- package/flowquery-py/src/tokenization/trie.py +124 -0
- package/flowquery-py/src/utils/__init__.py +6 -0
- package/flowquery-py/src/utils/object_utils.py +20 -0
- package/flowquery-py/src/utils/string_utils.py +113 -0
- package/flowquery-py/tests/__init__.py +1 -0
- package/flowquery-py/tests/compute/__init__.py +1 -0
- package/flowquery-py/tests/compute/test_runner.py +1335 -0
- package/flowquery-py/tests/graph/__init__.py +1 -0
- package/flowquery-py/tests/graph/test_create.py +56 -0
- package/flowquery-py/tests/graph/test_data.py +73 -0
- package/flowquery-py/tests/graph/test_match.py +40 -0
- package/flowquery-py/tests/parsing/__init__.py +1 -0
- package/flowquery-py/tests/parsing/test_context.py +34 -0
- package/flowquery-py/tests/parsing/test_expression.py +49 -0
- package/flowquery-py/tests/parsing/test_parser.py +674 -0
- package/flowquery-py/tests/test_extensibility.py +611 -0
- package/flowquery-py/tests/tokenization/__init__.py +1 -0
- package/flowquery-py/tests/tokenization/test_token_mapper.py +60 -0
- package/flowquery-py/tests/tokenization/test_tokenizer.py +164 -0
- package/flowquery-py/tests/tokenization/test_trie.py +30 -0
- package/flowquery-vscode/flowQueryEngine/flowquery.min.js +1 -1
- package/misc/apps/RAG/package.json +1 -1
- package/misc/apps/RAG/src/components/AdaptiveCardRenderer.tsx +76 -8
- package/misc/apps/RAG/src/components/index.ts +19 -10
- package/misc/apps/RAG/src/plugins/loaders/MockData.ts +70 -140
- package/misc/apps/RAG/src/prompts/FlowQuerySystemPrompt.ts +12 -0
- package/package.json +1 -1
- package/src/compute/runner.ts +24 -19
- package/src/graph/data.ts +112 -0
- package/src/graph/database.ts +63 -0
- package/src/graph/hops.ts +22 -0
- package/src/graph/node.ts +99 -0
- package/src/graph/node_data.ts +18 -0
- package/src/graph/node_reference.ts +33 -0
- package/src/graph/pattern.ts +101 -0
- package/src/graph/pattern_expression.ts +37 -0
- package/src/graph/patterns.ts +36 -0
- package/src/graph/physical_node.ts +23 -0
- package/src/graph/physical_relationship.ts +23 -0
- package/src/graph/relationship.ts +116 -0
- package/src/graph/relationship_data.ts +27 -0
- package/src/graph/relationship_match_collector.ts +58 -0
- package/src/graph/relationship_reference.ts +24 -0
- package/src/parsing/base_parser.ts +20 -14
- package/src/parsing/context.ts +14 -14
- package/src/parsing/expressions/boolean.ts +21 -0
- package/src/parsing/expressions/expression.ts +34 -26
- package/src/parsing/expressions/operator.ts +19 -1
- package/src/parsing/functions/function_factory.ts +45 -45
- package/src/parsing/operations/create_node.ts +39 -0
- package/src/parsing/operations/create_relationship.ts +38 -0
- package/src/parsing/operations/match.ts +31 -0
- package/src/parsing/operations/operation.ts +3 -0
- package/src/parsing/operations/return.ts +11 -7
- package/src/parsing/operations/where.ts +10 -6
- package/src/parsing/parser.ts +346 -8
- package/src/parsing/token_to_node.ts +6 -0
- package/src/tokenization/keyword.ts +41 -40
- package/src/tokenization/token.ts +21 -1
- package/src/tokenization/token_type.ts +2 -1
- package/src/tokenization/tokenizer.ts +52 -31
- package/tests/compute/runner.test.ts +654 -0
- package/tests/extensibility.test.ts +97 -93
- package/tests/graph/create.test.ts +36 -0
- package/tests/graph/data.test.ts +58 -0
- package/tests/graph/match.test.ts +29 -0
- package/tests/parsing/parser.test.ts +273 -2
- package/tests/tokenization/tokenizer.test.ts +90 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""Tests for the FlowQuery tokenizer."""
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from flowquery.tokenization.tokenizer import Tokenizer
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TestTokenizer:
|
|
8
|
+
"""Test cases for the Tokenizer class."""
|
|
9
|
+
|
|
10
|
+
def test_tokenize_returns_array_of_tokens(self):
|
|
11
|
+
"""Tokenizer.tokenize() should return an array of tokens."""
|
|
12
|
+
tokenizer = Tokenizer("MATCH (n:Person) RETURN n")
|
|
13
|
+
tokens = tokenizer.tokenize()
|
|
14
|
+
assert tokens is not None
|
|
15
|
+
assert len(tokens) > 0
|
|
16
|
+
|
|
17
|
+
def test_tokenize_handles_escaped_quotes(self):
|
|
18
|
+
"""Tokenizer.tokenize() should handle escaped quotes."""
|
|
19
|
+
tokenizer = Tokenizer('return "hello \\"world"')
|
|
20
|
+
tokens = tokenizer.tokenize()
|
|
21
|
+
assert tokens is not None
|
|
22
|
+
assert len(tokens) > 0
|
|
23
|
+
|
|
24
|
+
def test_predicate_function(self):
|
|
25
|
+
"""Test predicate function tokenization."""
|
|
26
|
+
tokenizer = Tokenizer("RETURN sum(n in [1, 2, 3] | n where n > 1)")
|
|
27
|
+
tokens = tokenizer.tokenize()
|
|
28
|
+
assert tokens is not None
|
|
29
|
+
assert len(tokens) > 0
|
|
30
|
+
|
|
31
|
+
def test_f_string(self):
|
|
32
|
+
"""Test f-string tokenization."""
|
|
33
|
+
tokenizer = Tokenizer('RETURN f"hello {world}"')
|
|
34
|
+
tokens = tokenizer.tokenize()
|
|
35
|
+
assert tokens is not None
|
|
36
|
+
assert len(tokens) > 0
|
|
37
|
+
|
|
38
|
+
def test_another_f_string(self):
|
|
39
|
+
"""Test another f-string tokenization."""
|
|
40
|
+
tokenizer = Tokenizer("RETURN f`Value is: {value}`")
|
|
41
|
+
tokens = tokenizer.tokenize()
|
|
42
|
+
assert tokens is not None
|
|
43
|
+
assert len(tokens) > 0
|
|
44
|
+
|
|
45
|
+
def test_basic(self):
|
|
46
|
+
"""Test basic tokenization."""
|
|
47
|
+
tokenizer = Tokenizer("WITH 1 AS n RETURN n")
|
|
48
|
+
tokens = tokenizer.tokenize()
|
|
49
|
+
assert tokens is not None
|
|
50
|
+
assert len(tokens) > 0
|
|
51
|
+
|
|
52
|
+
def test_associative_array_with_backtick_string(self):
|
|
53
|
+
"""Test associative array with backtick string."""
|
|
54
|
+
tokenizer = Tokenizer("RETURN {`key`: `value`}")
|
|
55
|
+
tokens = tokenizer.tokenize()
|
|
56
|
+
assert tokens is not None
|
|
57
|
+
assert len(tokens) > 0
|
|
58
|
+
|
|
59
|
+
def test_limit(self):
|
|
60
|
+
"""Test limit keyword."""
|
|
61
|
+
tokenizer = Tokenizer("unwind range(1, 10) as n limit 5 return n")
|
|
62
|
+
tokens = tokenizer.tokenize()
|
|
63
|
+
assert tokens is not None
|
|
64
|
+
assert len(tokens) > 0
|
|
65
|
+
|
|
66
|
+
def test_return_negative_number(self):
|
|
67
|
+
"""Test return with negative number."""
|
|
68
|
+
tokenizer = Tokenizer("return [:-2], -2")
|
|
69
|
+
tokens = tokenizer.tokenize()
|
|
70
|
+
assert tokens is not None
|
|
71
|
+
assert len(tokens) > 0
|
|
72
|
+
|
|
73
|
+
def test_range_with_function(self):
|
|
74
|
+
"""Test range with function."""
|
|
75
|
+
tokenizer = Tokenizer("""
|
|
76
|
+
with range(1,10) as data
|
|
77
|
+
return range(0, size(data)-1) as indices
|
|
78
|
+
""")
|
|
79
|
+
tokens = tokenizer.tokenize()
|
|
80
|
+
assert tokens is not None
|
|
81
|
+
assert len(tokens) > 0
|
|
82
|
+
|
|
83
|
+
def test_create_virtual_node(self):
|
|
84
|
+
"""Test CREATE VIRTUAL node tokenization."""
|
|
85
|
+
tokenizer = Tokenizer("""
|
|
86
|
+
CREATE VIRTUAL (:Person) AS {
|
|
87
|
+
call users() YIELD id, name
|
|
88
|
+
}
|
|
89
|
+
""")
|
|
90
|
+
tokens = tokenizer.tokenize()
|
|
91
|
+
assert tokens is not None
|
|
92
|
+
assert len(tokens) > 0
|
|
93
|
+
|
|
94
|
+
def test_create_virtual_relationship(self):
|
|
95
|
+
"""Test CREATE VIRTUAL relationship tokenization."""
|
|
96
|
+
tokenizer = Tokenizer("""
|
|
97
|
+
CREATE VIRTUAL (:Person)-[:KNOWS]->(:Person) AS {
|
|
98
|
+
call friendships() YIELD user1_id, user2_id
|
|
99
|
+
}
|
|
100
|
+
""")
|
|
101
|
+
tokens = tokenizer.tokenize()
|
|
102
|
+
assert tokens is not None
|
|
103
|
+
assert len(tokens) > 0
|
|
104
|
+
|
|
105
|
+
def test_match_based_on_virtual_node(self):
|
|
106
|
+
"""Test match based on virtual node."""
|
|
107
|
+
tokenizer = Tokenizer("""
|
|
108
|
+
MATCH (a:Person)
|
|
109
|
+
RETURN a.name
|
|
110
|
+
""")
|
|
111
|
+
tokens = tokenizer.tokenize()
|
|
112
|
+
assert tokens is not None
|
|
113
|
+
assert len(tokens) > 0
|
|
114
|
+
|
|
115
|
+
def test_match_based_on_virtual_nodes_and_relationships(self):
|
|
116
|
+
"""Test match based on virtual nodes and relationships."""
|
|
117
|
+
tokenizer = Tokenizer("""
|
|
118
|
+
MATCH (a:Person)-[r:KNOWS]->(b:Person)
|
|
119
|
+
RETURN a.name, b.name
|
|
120
|
+
""")
|
|
121
|
+
tokens = tokenizer.tokenize()
|
|
122
|
+
assert tokens is not None
|
|
123
|
+
assert len(tokens) > 0
|
|
124
|
+
|
|
125
|
+
def test_not_equal_operator(self):
|
|
126
|
+
"""Test not equal operator."""
|
|
127
|
+
tokenizer = Tokenizer("""
|
|
128
|
+
MATCH (n:Person)
|
|
129
|
+
WHERE n.age <> 30
|
|
130
|
+
RETURN n.name AS name, n.age AS age
|
|
131
|
+
""")
|
|
132
|
+
tokens = tokenizer.tokenize()
|
|
133
|
+
assert tokens is not None
|
|
134
|
+
assert len(tokens) > 0
|
|
135
|
+
|
|
136
|
+
def test_equal_operator(self):
|
|
137
|
+
"""Test equal operator."""
|
|
138
|
+
tokenizer = Tokenizer("""
|
|
139
|
+
MATCH (n:Person)
|
|
140
|
+
WHERE n.age = 30
|
|
141
|
+
RETURN n.name AS name, n.age AS age
|
|
142
|
+
""")
|
|
143
|
+
tokens = tokenizer.tokenize()
|
|
144
|
+
assert tokens is not None
|
|
145
|
+
assert len(tokens) > 0
|
|
146
|
+
|
|
147
|
+
def test_boolean_operators(self):
|
|
148
|
+
"""Test boolean operators."""
|
|
149
|
+
tokenizer = Tokenizer("""
|
|
150
|
+
return true AND false OR true NOT false
|
|
151
|
+
""")
|
|
152
|
+
tokens = tokenizer.tokenize()
|
|
153
|
+
assert tokens is not None
|
|
154
|
+
assert len(tokens) > 0
|
|
155
|
+
|
|
156
|
+
def test_relationship_with_hops(self):
|
|
157
|
+
"""Test relationship with hops."""
|
|
158
|
+
tokenizer = Tokenizer("""
|
|
159
|
+
MATCH (a:Person)-[r:KNOWS*1..3]->(b:Person)
|
|
160
|
+
RETURN a.name, b.name
|
|
161
|
+
""")
|
|
162
|
+
tokens = tokenizer.tokenize()
|
|
163
|
+
assert tokens is not None
|
|
164
|
+
assert len(tokens) > 0
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""Tests for the Trie data structure."""
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from flowquery.tokenization.trie import Trie
|
|
5
|
+
from flowquery.tokenization.token import Token
|
|
6
|
+
from flowquery.tokenization.keyword import Keyword
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TestTrie:
|
|
10
|
+
"""Test cases for the Trie class."""
|
|
11
|
+
|
|
12
|
+
def test_trie_insert_and_find(self):
|
|
13
|
+
"""Test Trie insert and find operations."""
|
|
14
|
+
trie = Trie()
|
|
15
|
+
|
|
16
|
+
# Insert all keywords
|
|
17
|
+
for keyword in Keyword:
|
|
18
|
+
token = Token.method(keyword.value)
|
|
19
|
+
if token is not None and token.value is not None:
|
|
20
|
+
trie.insert(token)
|
|
21
|
+
found = trie.find(keyword.value)
|
|
22
|
+
assert found is not None
|
|
23
|
+
|
|
24
|
+
# Test for non-existent values
|
|
25
|
+
assert trie.find("not_a_keyword") is None
|
|
26
|
+
assert trie.find("not_an_operator") is None
|
|
27
|
+
assert trie.find("not_a_keyword_or_operator") is None
|
|
28
|
+
assert trie.find("") is None
|
|
29
|
+
assert trie.find(" ") is None
|
|
30
|
+
assert trie.find("a") is None
|