graphforge 0.3.6__tar.gz → 0.3.8__tar.gz
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.
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/workflows/changelog-check.yml +4 -0
- graphforge-0.3.8/.github/workflows/test.yml +416 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/CHANGELOG.md +74 -0
- graphforge-0.3.8/PKG-INFO +382 -0
- graphforge-0.3.8/README.md +334 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/datasets/snap.md +1 -1
- graphforge-0.3.8/docs/development/parser-performance-analysis.md +139 -0
- graphforge-0.3.8/docs/getting-started/installation.md +43 -0
- graphforge-0.3.8/docs/getting-started/quickstart.md +112 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/getting-started/tutorial.md +3 -3
- graphforge-0.3.8/docs/guide/cypher-guide.md +840 -0
- graphforge-0.3.8/docs/index.md +83 -0
- graphforge-0.3.8/docs/reference/RELEASE_TRACKING.md +61 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/implementation-status/clauses.md +2 -0
- graphforge-0.3.8/docs/reference/implementation-status/functions.md +347 -0
- graphforge-0.3.8/docs/reference/opencypher-compatibility-matrix.md +469 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/opencypher-compatibility.md +69 -161
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/opencypher-features/01-clauses.md +1 -1
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/opencypher-features/05-data-types.md +2 -2
- graphforge-0.3.8/docs/reference/tck-compliance.md +58 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/tck-inventory.md +1 -1
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/use-cases/agent-grounding.md +2 -1
- graphforge-0.3.8/docs/use-cases/agent-tool-recall.md +467 -0
- graphforge-0.3.8/docs/use-cases/knowledge-graph-construction.md +524 -0
- graphforge-0.3.8/docs/use-cases/llm-workflows.md +589 -0
- graphforge-0.3.8/docs/use-cases/network-analysis.md +619 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/mkdocs.yml +6 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/pyproject.toml +15 -3
- graphforge-0.3.8/scripts/tck_perf_report.py +179 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/api.py +65 -11
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/ast/__init__.py +2 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/ast/clause.py +40 -24
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/ast/expression.py +46 -7
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/executor/evaluator.py +1477 -202
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/executor/executor.py +1452 -444
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/optimizer/join_reorder.py +22 -10
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/optimizer/predicate_utils.py +82 -1
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/parser/cypher.lark +89 -42
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/parser/parser.py +482 -83
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/planner/operators.py +107 -14
- graphforge-0.3.8/src/graphforge/planner/planner.py +3267 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/planner/types.py +32 -1
- graphforge-0.3.8/src/graphforge/procedures/__init__.py +5 -0
- graphforge-0.3.8/src/graphforge/procedures/registry.py +142 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/storage/memory.py +114 -112
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/storage/serialization.py +22 -6
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/types/graph.py +68 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/types/values.py +422 -71
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/datasets/test_end_to_end_workflows.py +2 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/executor/test_graph_functions.py +6 -6
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_aggregation_edge_cases.py +110 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_arithmetic.py +7 -6
- graphforge-0.3.8/tests/integration/test_call_procedures.py +140 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_column_naming.py +6 -6
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_complex_merge_patterns.py +6 -22
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_create_edge_cases.py +10 -13
- graphforge-0.3.8/tests/integration/test_graph_element_comparison.py +123 -0
- graphforge-0.3.8/tests/integration/test_list_concatenation.py +110 -0
- graphforge-0.3.8/tests/integration/test_map_subscript.py +89 -0
- graphforge-0.3.8/tests/integration/test_math_functions_new.py +248 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_merge_edge_cases.py +34 -114
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_merge_on_create_real.py +7 -15
- graphforge-0.3.8/tests/integration/test_mixed_type_sort.py +110 -0
- graphforge-0.3.8/tests/integration/test_nan_handling.py +194 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_null_handling.py +56 -10
- graphforge-0.3.8/tests/integration/test_operator_precedence.py +260 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_optional_match.py +9 -3
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_path_binding_variable_length.py +8 -7
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_pattern_predicates.py +2 -2
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_power_operator.py +24 -24
- graphforge-0.3.8/tests/integration/test_properties_keys_functions.py +136 -0
- graphforge-0.3.8/tests/integration/test_relationship_uniqueness.py +147 -0
- graphforge-0.3.8/tests/integration/test_skip_limit_expressions.py +76 -0
- graphforge-0.3.8/tests/integration/test_startnode_endnode_functions.py +57 -0
- graphforge-0.3.8/tests/integration/test_temporal_select_into.py +392 -0
- graphforge-0.3.8/tests/integration/test_type_conversion_fixes.py +185 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_type_functions.py +30 -29
- graphforge-0.3.8/tests/integration/test_with_clause_positions.py +108 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/conftest.py +479 -94
- graphforge-0.3.8/tests/tck/tck_config.yaml +264 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/test_snap_datasets.py +5 -1
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_arithmetic_evaluator.py +20 -9
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_evaluator.py +51 -52
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_executor_error_paths.py +5 -5
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_expressions_match.py +31 -1
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_graph_functions.py +6 -6
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_map_property_access.py +13 -8
- graphforge-0.3.8/tests/unit/executor/test_optional_expand_bound_dst.py +188 -0
- graphforge-0.3.8/tests/unit/executor/test_parenthesized_expr_coverage.py +121 -0
- graphforge-0.3.8/tests/unit/executor/test_procedure_call_executor.py +143 -0
- graphforge-0.3.8/tests/unit/executor/test_properties_keys_errors.py +36 -0
- graphforge-0.3.8/tests/unit/executor/test_set_extensions.py +143 -0
- graphforge-0.3.8/tests/unit/executor/test_startnode_endnode_errors.py +53 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_string_matching_evaluator.py +22 -40
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_temporal_truncate_arithmetic.py +1 -1
- graphforge-0.3.8/tests/unit/executor/test_type_conversion_complex.py +110 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/optimizer/test_statistics.py +3 -3
- graphforge-0.3.8/tests/unit/parser/test_call_procedure_parser.py +84 -0
- graphforge-0.3.8/tests/unit/parser/test_float_literals.py +150 -0
- graphforge-0.3.8/tests/unit/parser/test_order_by_direction.py +62 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_parser.py +10 -6
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_parser_caching.py +14 -4
- graphforge-0.3.8/tests/unit/parser/test_with_clause_positions.py +41 -0
- graphforge-0.3.8/tests/unit/planner/test_call_procedure_planner.py +101 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/planner/test_operator_validation.py +8 -6
- graphforge-0.3.8/tests/unit/planner/test_planner_branch_coverage.py +682 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/planner/test_planner_edge_cases.py +13 -9
- graphforge-0.3.8/tests/unit/planner/test_syntax_error_validation.py +252 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/planner/test_type_tracking.py +7 -2
- graphforge-0.3.8/tests/unit/procedures/__init__.py +0 -0
- graphforge-0.3.8/tests/unit/procedures/test_registry.py +138 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/types/test_cypher_values_deep_equality.py +3 -4
- graphforge-0.3.8/tests/unit/types/test_extreme_temporal_values.py +554 -0
- graphforge-0.3.8/tests/unit/types/test_graph_element_edge_cases.py +257 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/types/test_temporal_values.py +2 -2
- {graphforge-0.3.6 → graphforge-0.3.8}/uv.lock +39 -15
- graphforge-0.3.6/.github/workflows/test.yml +0 -227
- graphforge-0.3.6/PKG-INFO +0 -1645
- graphforge-0.3.6/README.md +0 -1599
- graphforge-0.3.6/docs/getting-started/installation.md +0 -44
- graphforge-0.3.6/docs/getting-started/quickstart.md +0 -112
- graphforge-0.3.6/docs/guide/cypher-guide.md +0 -811
- graphforge-0.3.6/docs/index.md +0 -109
- graphforge-0.3.6/docs/reference/RELEASE_TRACKING.md +0 -279
- graphforge-0.3.6/docs/reference/implementation-status/functions.md +0 -451
- graphforge-0.3.6/docs/reference/opencypher-compatibility-matrix.md +0 -539
- graphforge-0.3.6/docs/reference/tck-compliance.md +0 -272
- graphforge-0.3.6/src/graphforge/planner/planner.py +0 -1092
- graphforge-0.3.6/tests/tck/tck_config.yaml +0 -137
- graphforge-0.3.6/tests/unit/executor/test_type_conversion_complex.py +0 -423
- graphforge-0.3.6/tests/unit/planner/test_planner_branch_coverage.py +0 -401
- graphforge-0.3.6/tests/unit/types/test_graph_element_edge_cases.py +0 -95
- {graphforge-0.3.6 → graphforge-0.3.8}/.codecov.yml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.coderabbit.yaml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.editorconfig +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/CODEOWNERS +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/ISSUE_WORKFLOW.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/SECURITY.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/dependabot.yml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/pull_request_template.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/workflows/README.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/workflows/docs.yml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/workflows/pr-labeler.yml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/workflows/publish.yaml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.github/workflows/release-tracking.yml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.gitignore +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/.pre-commit-config.yaml +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/CHANGELOG_v0.3.0.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/CLAUDE.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/CODE_OF_CONDUCT.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/CONTRIBUTING.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/IMPLEMENTATION_PLAN.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/LICENSE +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/Makefile +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/RELEASING.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/coverage.json +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/architecture/ast-and-planning.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/architecture/execution-model.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/architecture/overview.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/architecture/storage-analysis.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/architecture/storage.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/community/code-of-conduct.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/community/security.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/cypher-guide.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/datasets/cypher-script-loading.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/datasets/ldbc.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/datasets/neo4j-examples.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/datasets/networkrepository.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/datasets/overview.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/QUICKSTART_V0.2.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/codecov-integration.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/contributing.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/documentation-update-summary.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/phase-1a-completion-report.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/release-process.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/release-strategy.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/requirements.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/sessions/session-2026-01-31-cicd-infrastructure.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/sessions/session-2026-01-31-documentation.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/sessions/session-2026-01-31-regression-fix.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/sessions/session-2026-01-31-with-clause.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/sessions/session-2026-02-01-codecov-setup.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/sessions/session-2026-02-01-column-naming-investigation.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/sessions/session-summary.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/sessions/tck-session-2026-01-31-final.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/sessions/tck-session-2026-01-31.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/tck_baseline_analysis_v0.3.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/testing-setup-complete.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/testing.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/v0.2-plan-summary.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/v0.4-revised-plan.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/development/workflow.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/guide/graph-construction.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/guide/overview.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/INCOMPLETE_FEATURES_ISSUES.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/README.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/VALIDATION_REPORT.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/api.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/changelog.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/column-naming-behavior.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/feature-aggregation-functions.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/feature-graph-queries.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/feature-graph-schema.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/feature-mapping/clause-to-tck.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/feature-mapping/function-to-tck.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/feature-order-by.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/feature-return-aliasing.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/implementation-status/operators.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/implementation-status/patterns.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/opencypher-features/02-functions.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/opencypher-features/03-operators.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/reference/opencypher-features/04-patterns.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/releases/implementation-summary.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/releases/next-steps.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/releases/phase-1-complete.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/releases/phase-2-complete.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/releases/phase-3-complete.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/releases/roadmap.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/docs/stylesheets/extra.css +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/examples/01_social_network.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/examples/02_knowledge_graph.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/examples/03_data_lineage.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/examples/04_citation_network.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/examples/05_migration_from_networkx.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/examples/agent_grounding/ecommerce_agent.ipynb +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/examples/basic_graph.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/examples/basic_usage.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/scripts/build_feature_graph.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/scripts/bump_version.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/scripts/check_release_needed.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/scripts/inventory_tck.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/scripts/pre-push-check.sh +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/scripts/tck_metrics.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/scripts/validate_datasets.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/ast/pattern.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/ast/query.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/base.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/data/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/data/networkrepository.json +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/data/snap.json +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/exporters/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/exporters/json_graph.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/formats/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/formats/json_graph.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/loaders/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/loaders/compression.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/loaders/csv.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/loaders/cypher.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/loaders/graphml.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/loaders/json_graph.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/loaders/ldbc.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/loaders/ldbc_schema.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/registry.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/sources/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/sources/graphml.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/sources/json_graph.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/sources/ldbc.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/sources/networkrepository.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/datasets/sources/snap.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/executor/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/optimizer/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/optimizer/cost_model.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/optimizer/optimizer.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/optimizer/statistics.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/parser/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/planner/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/storage/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/storage/pydantic_serialization.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/storage/sqlite_backend.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/src/graphforge/types/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/README.md +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/conftest.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/conftest.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/datasets/test_compression.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/datasets/test_cypher_loader_docs.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/datasets/test_json_graph_roundtrip.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/datasets/test_ldbc_loader.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/datasets/test_networkrepository_loader.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_aggregation_functions_advanced.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_anonymous_relationships.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_builder_api.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_call_subqueries.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_case_expressions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_collect.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_compact_iso8601.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_complex_where_predicates.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_create_clause.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_delete_null.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_detach_delete.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_distinct_clause.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_e2e_queries.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_executor_edge_cases.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_exists_is_empty.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_hex_octal_literals.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_iana_timezones.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_id_function.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_issues_271_274.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_label_disjunction.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_label_predicate.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_list_comprehension.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_list_functions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_list_operations.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_list_path_overloading.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_list_subscript.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_logical_operators.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_match_create.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_math_functions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_math_functions_extended.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_merge_on_match_real.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_optimizer_aggregate_pushdown.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_optimizer_integration.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_optimizer_redundant_elimination.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_optional_match_delete.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_path_binding.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_path_functions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_pattern_comprehension.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_persistence.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_predicate_functions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_relationship_directions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_remove_clause.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_set_delete_merge.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_size_function.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_snap_dataset_loading.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_sort_after_aggregation.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_spatial_api.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_sqlite_persistence.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_string_functions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_string_functions_new.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_string_matching.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_subquery_expressions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_temporal_map_constructors.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_temporal_queries.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_transactions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_union.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_unwind.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_variable_length_paths.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_wildcard_execution.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_with_aggregation_real.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_with_clause.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_with_clause_modifiers.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_with_distinct_skip_limit.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/integration/test_xor_operator.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/property/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/property/strategies.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/coverage_matrix.json +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/download_tck.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/Aggregation1_BasicAggregation.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/Match1_SimpleMatches.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/call/Call1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/call/Call2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/call/Call3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/call/Call4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/call/Call5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/call/Call6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/create/Create1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/create/Create2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/create/Create3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/create/Create4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/create/Create5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/create/Create6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/delete/Delete1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/delete/Delete2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/delete/Delete3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/delete/Delete4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/delete/Delete5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/delete/Delete6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match/Match1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match/Match2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match/Match3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match/Match4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match/Match5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match/Match6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match/Match7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match/Match8.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match/Match9.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match-where/MatchWhere1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match-where/MatchWhere2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match-where/MatchWhere3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match-where/MatchWhere4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match-where/MatchWhere5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/match-where/MatchWhere6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/merge/Merge1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/merge/Merge2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/merge/Merge3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/merge/Merge4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/merge/Merge5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/merge/Merge6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/merge/Merge7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/merge/Merge8.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/merge/Merge9.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/remove/Remove1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/remove/Remove2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/remove/Remove3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return/Return1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return/Return2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return/Return3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return/Return4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return/Return5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return/Return6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return/Return7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return/Return8.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/set/Set1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/set/Set2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/set/Set3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/set/Set4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/set/Set5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/set/Set6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/union/Union1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/union/Union2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/union/Union3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/unwind/Unwind1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with/With1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with/With2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with/With3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with/With4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with/With5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with/With6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with/With7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-where/WithWhere1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-where/WithWhere2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-where/WithWhere3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-where/WithWhere4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-where/WithWhere5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-where/WithWhere6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/clauses/with-where/WithWhere7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/aggregation/Aggregation1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/aggregation/Aggregation2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/aggregation/Aggregation3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/aggregation/Aggregation4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/aggregation/Aggregation5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/aggregation/Aggregation6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/aggregation/Aggregation7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/aggregation/Aggregation8.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/boolean/Boolean1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/boolean/Boolean2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/boolean/Boolean3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/boolean/Boolean4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/boolean/Boolean5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/comparison/Comparison1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/comparison/Comparison2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/comparison/Comparison3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/comparison/Comparison4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/conditional/Conditional1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/conditional/Conditional2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/graph/Graph1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/graph/Graph2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/graph/Graph3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/graph/Graph4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/graph/Graph5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/graph/Graph6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/graph/Graph7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/graph/Graph8.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/graph/Graph9.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List10.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List11.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List12.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List8.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/list/List9.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/literals/Literals1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/literals/Literals2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/literals/Literals3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/literals/Literals4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/literals/Literals5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/literals/Literals6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/literals/Literals7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/literals/Literals8.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/map/Map1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/map/Map2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/map/Map3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical10.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical11.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical12.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical13.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical14.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical15.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical16.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical17.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical8.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/mathematical/Mathematical9.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/null/Null1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/null/Null2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/null/Null3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/path/Path1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/path/Path2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/path/Path3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/pattern/Pattern1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/pattern/Pattern2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/precedence/Precedence1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/precedence/Precedence2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/precedence/Precedence3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/precedence/Precedence4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier10.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier11.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier12.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier8.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/quantifier/Quantifier9.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String10.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String11.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String12.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String13.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String14.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String8.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/string/String9.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/temporal/Temporal1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/temporal/Temporal10.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/temporal/Temporal2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/temporal/Temporal3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/temporal/Temporal4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/temporal/Temporal5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/temporal/Temporal6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/temporal/Temporal7.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/temporal/Temporal8.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/temporal/Temporal9.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/typeConversion/TypeConversion1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/typeConversion/TypeConversion2.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/typeConversion/TypeConversion3.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/typeConversion/TypeConversion4.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/typeConversion/TypeConversion5.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/expressions/typeConversion/TypeConversion6.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/features/official/useCases/triadicSelection/TriadicSelection1.feature +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/graphs/binary-tree-1/binary-tree-1.cypher +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/graphs/binary-tree-1/binary-tree-1.json +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/graphs/binary-tree-2/binary-tree-2.cypher +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/graphs/binary-tree-2/binary-tree-2.json +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/graphs/named-graphs.adoc +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/tck_markers.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/test_features.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/tck/test_tck_compliance.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/api/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/api/test_clear.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/api/test_clone.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/api/test_cypher_value_conversion.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/ast/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/ast/test_ast_nodes.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/test_csv_loader.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/test_cypher_loader.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/test_json_graph_format.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/test_ldbc_schema.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/test_networkrepository.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/test_registry.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/datasets/test_sources_registration.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_aggregation_errors.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_aggregation_functions_advanced.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_evaluator_additional_coverage.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_evaluator_error_paths.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_expression_matching.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_id_function.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_in_operator.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_list_functions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_list_functions_errors.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_merge_on_create.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_merge_on_match.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_multihop_create.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_optional_scan_coverage.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_path_functions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_sort_edge_cases.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_spatial_functions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_string_functions_new.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_subquery_planner_check.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_temporal_functions.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_three_valued_logic.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_undirected_relationship_bugs.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/executor/test_with_aggregation.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/optimizer/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/optimizer/test_aggregate_pushdown.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/optimizer/test_cost_model.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/optimizer/test_filter_pushdown.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/optimizer/test_join_reorder.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/optimizer/test_optimizer_reuse.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/optimizer/test_predicate_reorder.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/optimizer/test_predicate_utils.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/optimizer/test_redundant_elimination.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_arithmetic_parser.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_case_parser.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_collect_parser.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_delete_parser.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_grammar.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_hex_octal_literals.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_label_predicate_parser.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_merge_on_create.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_merge_on_match.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_optional_match_delete.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_path_binding.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_pattern_predicates.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_remove_parser.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_string_matching_parser.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_wildcard_parsing.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/parser/test_with_at_query_start.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/planner/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/planner/test_expand_multi_hop_operator.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/planner/test_operators.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/planner/test_planner_comprehensive.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/planner/test_remove_planner.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/planner/test_with_validation.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/storage/__init__.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/storage/test_graph_edge_cases.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/storage/test_memory_store.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/storage/test_pydantic_serialization.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/storage/test_serialization_edge_cases.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/storage/test_spatial_serialization.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/storage/test_sqlite_backend_adjacency.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/storage/test_temporal_serialization.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/test_graph_elements.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/test_iana_timezone_construction.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/test_values.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/types/test_cypher_values_edge_cases.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/types/test_path_values.py +0 -0
- {graphforge-0.3.6 → graphforge-0.3.8}/tests/unit/types/test_spatial_values.py +0 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
name: Test Suite
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main", "develop"]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: ["main"]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
test:
|
|
14
|
+
name: Test Python ${{ matrix.python-version }} on ${{ matrix.os }}
|
|
15
|
+
runs-on: ${{ matrix.os }}
|
|
16
|
+
strategy:
|
|
17
|
+
fail-fast: false
|
|
18
|
+
matrix:
|
|
19
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
20
|
+
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
|
|
21
|
+
|
|
22
|
+
steps:
|
|
23
|
+
- name: Checkout code
|
|
24
|
+
uses: actions/checkout@v6
|
|
25
|
+
|
|
26
|
+
- name: Install uv
|
|
27
|
+
uses: astral-sh/setup-uv@v7
|
|
28
|
+
with:
|
|
29
|
+
enable-cache: true
|
|
30
|
+
|
|
31
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
32
|
+
uses: actions/setup-python@v6
|
|
33
|
+
with:
|
|
34
|
+
python-version: ${{ matrix.python-version }}
|
|
35
|
+
|
|
36
|
+
- name: Install dependencies
|
|
37
|
+
run: uv sync --all-extras
|
|
38
|
+
|
|
39
|
+
- name: Download SNAP ego-facebook dataset
|
|
40
|
+
run: |
|
|
41
|
+
mkdir -p ~/.graphforge/datasets
|
|
42
|
+
curl -L -o ~/.graphforge/datasets/snap-ego-facebook.txt.gz https://snap.stanford.edu/data/facebook_combined.txt.gz
|
|
43
|
+
shell: bash
|
|
44
|
+
|
|
45
|
+
- name: Run unit tests
|
|
46
|
+
run: uv run pytest tests/unit -n auto --junitxml=test-results-unit.xml
|
|
47
|
+
|
|
48
|
+
- name: Run integration tests
|
|
49
|
+
run: uv run pytest tests/integration -n auto -m "not snap" --junitxml=test-results-integration.xml
|
|
50
|
+
|
|
51
|
+
- name: Upload test results to Codecov
|
|
52
|
+
uses: codecov/codecov-action@v5
|
|
53
|
+
if: always()
|
|
54
|
+
with:
|
|
55
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
56
|
+
files: test-results-unit.xml,test-results-integration.xml
|
|
57
|
+
flags: ${{ matrix.os }}-py${{ matrix.python-version }}
|
|
58
|
+
report_type: test_results
|
|
59
|
+
fail_ci_if_error: false
|
|
60
|
+
|
|
61
|
+
lint:
|
|
62
|
+
name: Lint and Format Check
|
|
63
|
+
runs-on: ubuntu-latest
|
|
64
|
+
|
|
65
|
+
steps:
|
|
66
|
+
- name: Checkout code
|
|
67
|
+
uses: actions/checkout@v6
|
|
68
|
+
|
|
69
|
+
- name: Install uv
|
|
70
|
+
uses: astral-sh/setup-uv@v7
|
|
71
|
+
|
|
72
|
+
- name: Set up Python
|
|
73
|
+
uses: actions/setup-python@v6
|
|
74
|
+
with:
|
|
75
|
+
python-version: "3.12"
|
|
76
|
+
|
|
77
|
+
- name: Install dependencies
|
|
78
|
+
run: uv sync --all-extras
|
|
79
|
+
|
|
80
|
+
- name: Check code formatting
|
|
81
|
+
run: uv run ruff format --check .
|
|
82
|
+
|
|
83
|
+
- name: Lint code
|
|
84
|
+
run: uv run ruff check .
|
|
85
|
+
|
|
86
|
+
type-check:
|
|
87
|
+
name: Type Checking (mypy)
|
|
88
|
+
runs-on: ubuntu-latest
|
|
89
|
+
|
|
90
|
+
steps:
|
|
91
|
+
- name: Checkout code
|
|
92
|
+
uses: actions/checkout@v6
|
|
93
|
+
|
|
94
|
+
- name: Install uv
|
|
95
|
+
uses: astral-sh/setup-uv@v7
|
|
96
|
+
|
|
97
|
+
- name: Set up Python
|
|
98
|
+
uses: actions/setup-python@v6
|
|
99
|
+
with:
|
|
100
|
+
python-version: "3.12"
|
|
101
|
+
|
|
102
|
+
- name: Install dependencies
|
|
103
|
+
run: uv sync --all-extras
|
|
104
|
+
|
|
105
|
+
- name: Run mypy type checker
|
|
106
|
+
run: uv run mypy src/graphforge --strict-optional --show-error-codes
|
|
107
|
+
|
|
108
|
+
security:
|
|
109
|
+
name: Security Scanning
|
|
110
|
+
runs-on: ubuntu-latest
|
|
111
|
+
|
|
112
|
+
steps:
|
|
113
|
+
- name: Checkout code
|
|
114
|
+
uses: actions/checkout@v6
|
|
115
|
+
|
|
116
|
+
- name: Install uv
|
|
117
|
+
uses: astral-sh/setup-uv@v7
|
|
118
|
+
|
|
119
|
+
- name: Set up Python
|
|
120
|
+
uses: actions/setup-python@v6
|
|
121
|
+
with:
|
|
122
|
+
python-version: "3.12"
|
|
123
|
+
|
|
124
|
+
- name: Install dependencies
|
|
125
|
+
run: uv sync --all-extras
|
|
126
|
+
|
|
127
|
+
- name: Run bandit security scanner
|
|
128
|
+
run: uv run bandit -c pyproject.toml -r src/
|
|
129
|
+
|
|
130
|
+
tck-regression:
|
|
131
|
+
name: TCK Shard ${{ matrix.group }}/4
|
|
132
|
+
runs-on: ubuntu-latest
|
|
133
|
+
strategy:
|
|
134
|
+
fail-fast: false
|
|
135
|
+
matrix:
|
|
136
|
+
group: [1, 2, 3, 4]
|
|
137
|
+
|
|
138
|
+
steps:
|
|
139
|
+
- name: Checkout code
|
|
140
|
+
uses: actions/checkout@v6
|
|
141
|
+
|
|
142
|
+
- name: Install uv
|
|
143
|
+
uses: astral-sh/setup-uv@v7
|
|
144
|
+
|
|
145
|
+
- name: Set up Python
|
|
146
|
+
uses: actions/setup-python@v6
|
|
147
|
+
with:
|
|
148
|
+
python-version: "3.12"
|
|
149
|
+
|
|
150
|
+
- name: Install dependencies
|
|
151
|
+
run: uv sync --all-extras
|
|
152
|
+
|
|
153
|
+
- name: Restore test durations cache
|
|
154
|
+
uses: actions/cache/restore@v4
|
|
155
|
+
with:
|
|
156
|
+
path: .test_durations
|
|
157
|
+
key: tck-durations-${{ github.ref }}
|
|
158
|
+
restore-keys: tck-durations-
|
|
159
|
+
|
|
160
|
+
- name: Run TCK shard ${{ matrix.group }}/4
|
|
161
|
+
id: tck_tests
|
|
162
|
+
continue-on-error: true
|
|
163
|
+
run: |
|
|
164
|
+
uv run pytest tests/tck/ -n auto \
|
|
165
|
+
--splits 4 --group ${{ matrix.group }} \
|
|
166
|
+
--splitting-algorithm duration_based_chunks \
|
|
167
|
+
--store-durations --durations-path=.test_durations_${{ matrix.group }} \
|
|
168
|
+
--junitxml=test-results-tck-${{ matrix.group }}.xml
|
|
169
|
+
|
|
170
|
+
- name: Upload shard results artifact
|
|
171
|
+
uses: actions/upload-artifact@v4
|
|
172
|
+
if: always()
|
|
173
|
+
with:
|
|
174
|
+
name: tck-shard-${{ matrix.group }}
|
|
175
|
+
path: |
|
|
176
|
+
test-results-tck-${{ matrix.group }}.xml
|
|
177
|
+
.test_durations_${{ matrix.group }}
|
|
178
|
+
|
|
179
|
+
tck-report:
|
|
180
|
+
name: TCK OpenCypher Compliance
|
|
181
|
+
runs-on: ubuntu-latest
|
|
182
|
+
needs: tck-regression
|
|
183
|
+
if: always()
|
|
184
|
+
permissions:
|
|
185
|
+
contents: read
|
|
186
|
+
actions: write
|
|
187
|
+
|
|
188
|
+
steps:
|
|
189
|
+
- name: Checkout code
|
|
190
|
+
uses: actions/checkout@v6
|
|
191
|
+
|
|
192
|
+
- name: Install uv
|
|
193
|
+
uses: astral-sh/setup-uv@v7
|
|
194
|
+
|
|
195
|
+
- name: Set up Python
|
|
196
|
+
uses: actions/setup-python@v6
|
|
197
|
+
with:
|
|
198
|
+
python-version: "3.12"
|
|
199
|
+
|
|
200
|
+
- name: Install dependencies
|
|
201
|
+
run: uv sync --all-extras
|
|
202
|
+
|
|
203
|
+
- name: Download all shard results
|
|
204
|
+
uses: actions/download-artifact@v4
|
|
205
|
+
with:
|
|
206
|
+
pattern: tck-shard-*
|
|
207
|
+
merge-multiple: true
|
|
208
|
+
path: tck-results/
|
|
209
|
+
|
|
210
|
+
- name: Merge JUnit XML results
|
|
211
|
+
run: |
|
|
212
|
+
uv run python3 -c "
|
|
213
|
+
import glob, sys
|
|
214
|
+
from xml.etree import ElementTree as ET
|
|
215
|
+
|
|
216
|
+
files = sorted(glob.glob('tck-results/test-results-tck-*.xml'))
|
|
217
|
+
if not files:
|
|
218
|
+
print('No shard result files found')
|
|
219
|
+
sys.exit(1)
|
|
220
|
+
|
|
221
|
+
root = ET.parse(files[0]).getroot()
|
|
222
|
+
suite = root if root.tag == 'testsuite' else root.find('testsuite')
|
|
223
|
+
|
|
224
|
+
for f in files[1:]:
|
|
225
|
+
tree = ET.parse(f).getroot()
|
|
226
|
+
src = tree if tree.tag == 'testsuite' else tree.find('testsuite')
|
|
227
|
+
for tc in src.findall('testcase'):
|
|
228
|
+
suite.append(tc)
|
|
229
|
+
|
|
230
|
+
tests = len(suite.findall('testcase'))
|
|
231
|
+
failures = len(suite.findall('.//failure'))
|
|
232
|
+
errors = len(suite.findall('.//error'))
|
|
233
|
+
suite.set('tests', str(tests))
|
|
234
|
+
suite.set('failures', str(failures))
|
|
235
|
+
suite.set('errors', str(errors))
|
|
236
|
+
|
|
237
|
+
ET.ElementTree(root).write('test-results-tck.xml', xml_declaration=True, encoding='utf-8')
|
|
238
|
+
print(f'Merged {len(files)} shards: {tests} tests, {failures} failures')
|
|
239
|
+
"
|
|
240
|
+
|
|
241
|
+
- name: Merge test durations for future balancing
|
|
242
|
+
run: |
|
|
243
|
+
uv run python3 -c "
|
|
244
|
+
import glob, json
|
|
245
|
+
files = glob.glob('tck-results/.test_durations_*')
|
|
246
|
+
merged = {}
|
|
247
|
+
for f in files:
|
|
248
|
+
with open(f) as fh:
|
|
249
|
+
merged.update(json.load(fh))
|
|
250
|
+
with open('.test_durations', 'w') as fh:
|
|
251
|
+
json.dump(merged, fh)
|
|
252
|
+
print(f'Merged durations for {len(merged)} tests from {len(files)} shards')
|
|
253
|
+
" || echo "No duration files found, skipping merge"
|
|
254
|
+
|
|
255
|
+
- name: Save test durations cache
|
|
256
|
+
uses: actions/cache/save@v4
|
|
257
|
+
if: always()
|
|
258
|
+
with:
|
|
259
|
+
path: .test_durations
|
|
260
|
+
key: tck-durations-${{ github.ref }}-${{ github.run_id }}
|
|
261
|
+
|
|
262
|
+
- name: Report TCK compliance metrics
|
|
263
|
+
if: always()
|
|
264
|
+
run: uv run python3 scripts/tck_metrics.py test-results-tck.xml
|
|
265
|
+
|
|
266
|
+
- name: Report TCK performance metrics
|
|
267
|
+
if: always()
|
|
268
|
+
run: uv run python3 scripts/tck_perf_report.py test-results-tck.xml --threshold 5
|
|
269
|
+
|
|
270
|
+
- name: Upload TCK results to Codecov
|
|
271
|
+
uses: codecov/codecov-action@v5
|
|
272
|
+
if: always()
|
|
273
|
+
with:
|
|
274
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
275
|
+
files: test-results-tck.xml
|
|
276
|
+
flags: tck-compliance
|
|
277
|
+
report_type: test_results
|
|
278
|
+
fail_ci_if_error: false
|
|
279
|
+
|
|
280
|
+
- name: Upload merged TCK results artifact
|
|
281
|
+
uses: actions/upload-artifact@v4
|
|
282
|
+
if: always()
|
|
283
|
+
with:
|
|
284
|
+
name: tck-test-results
|
|
285
|
+
path: test-results-tck.xml
|
|
286
|
+
|
|
287
|
+
coverage-shard:
|
|
288
|
+
name: Coverage Shard ${{ matrix.group }}/4
|
|
289
|
+
runs-on: ubuntu-latest
|
|
290
|
+
strategy:
|
|
291
|
+
fail-fast: false
|
|
292
|
+
matrix:
|
|
293
|
+
group: [1, 2, 3, 4]
|
|
294
|
+
|
|
295
|
+
steps:
|
|
296
|
+
- name: Checkout code
|
|
297
|
+
uses: actions/checkout@v6
|
|
298
|
+
|
|
299
|
+
- name: Install uv
|
|
300
|
+
uses: astral-sh/setup-uv@v7
|
|
301
|
+
|
|
302
|
+
- name: Set up Python
|
|
303
|
+
uses: actions/setup-python@v6
|
|
304
|
+
with:
|
|
305
|
+
python-version: "3.12"
|
|
306
|
+
|
|
307
|
+
- name: Install dependencies
|
|
308
|
+
run: uv sync --all-extras
|
|
309
|
+
|
|
310
|
+
- name: Download SNAP ego-facebook dataset
|
|
311
|
+
run: |
|
|
312
|
+
mkdir -p ~/.graphforge/datasets
|
|
313
|
+
curl -L -o ~/.graphforge/datasets/snap-ego-facebook.txt.gz https://snap.stanford.edu/data/facebook_combined.txt.gz
|
|
314
|
+
shell: bash
|
|
315
|
+
|
|
316
|
+
- name: Run tests with coverage (shard ${{ matrix.group }}/4)
|
|
317
|
+
run: |
|
|
318
|
+
uv run pytest tests/unit tests/integration \
|
|
319
|
+
--splits 4 --group ${{ matrix.group }} \
|
|
320
|
+
--splitting-algorithm duration_based_chunks \
|
|
321
|
+
-n auto \
|
|
322
|
+
-m "not snap" \
|
|
323
|
+
--cov=src --cov-branch \
|
|
324
|
+
--cov-report=xml:coverage-${{ matrix.group }}.xml \
|
|
325
|
+
--junitxml=test-results-cov-${{ matrix.group }}.xml
|
|
326
|
+
|
|
327
|
+
- name: Upload coverage shard artifact
|
|
328
|
+
uses: actions/upload-artifact@v4
|
|
329
|
+
if: always()
|
|
330
|
+
with:
|
|
331
|
+
name: coverage-shard-${{ matrix.group }}
|
|
332
|
+
path: |
|
|
333
|
+
coverage-${{ matrix.group }}.xml
|
|
334
|
+
test-results-cov-${{ matrix.group }}.xml
|
|
335
|
+
|
|
336
|
+
coverage:
|
|
337
|
+
name: Coverage Report
|
|
338
|
+
runs-on: ubuntu-latest
|
|
339
|
+
needs: coverage-shard
|
|
340
|
+
if: always()
|
|
341
|
+
|
|
342
|
+
steps:
|
|
343
|
+
- name: Checkout code
|
|
344
|
+
uses: actions/checkout@v6
|
|
345
|
+
|
|
346
|
+
- name: Install uv
|
|
347
|
+
uses: astral-sh/setup-uv@v7
|
|
348
|
+
|
|
349
|
+
- name: Set up Python
|
|
350
|
+
uses: actions/setup-python@v6
|
|
351
|
+
with:
|
|
352
|
+
python-version: "3.12"
|
|
353
|
+
|
|
354
|
+
- name: Install dependencies
|
|
355
|
+
run: uv sync --all-extras
|
|
356
|
+
|
|
357
|
+
- name: Download all coverage shards
|
|
358
|
+
uses: actions/download-artifact@v4
|
|
359
|
+
with:
|
|
360
|
+
pattern: coverage-shard-*
|
|
361
|
+
merge-multiple: true
|
|
362
|
+
path: cov-results/
|
|
363
|
+
|
|
364
|
+
- name: Merge coverage reports
|
|
365
|
+
run: |
|
|
366
|
+
uv run python3 -c "
|
|
367
|
+
import glob, sys
|
|
368
|
+
from xml.etree import ElementTree as ET
|
|
369
|
+
|
|
370
|
+
files = sorted(glob.glob('cov-results/coverage-*.xml'))
|
|
371
|
+
if not files:
|
|
372
|
+
print('No coverage files found')
|
|
373
|
+
sys.exit(1)
|
|
374
|
+
|
|
375
|
+
base = ET.parse(files[0])
|
|
376
|
+
base_root = base.getroot()
|
|
377
|
+
base_packages = base_root.find('packages')
|
|
378
|
+
|
|
379
|
+
for f in files[1:]:
|
|
380
|
+
tree = ET.parse(f).getroot()
|
|
381
|
+
for pkg in tree.findall('.//package'):
|
|
382
|
+
base_packages.append(pkg)
|
|
383
|
+
|
|
384
|
+
base.write('coverage.xml', xml_declaration=True, encoding='utf-8')
|
|
385
|
+
print(f'Merged {len(files)} coverage shards')
|
|
386
|
+
"
|
|
387
|
+
|
|
388
|
+
- name: Check coverage threshold
|
|
389
|
+
run: |
|
|
390
|
+
uv run coverage combine cov-results/.coverage* 2>/dev/null || true
|
|
391
|
+
uv run coverage report --fail-under=85 || echo "Coverage below 85% - expected during initial development"
|
|
392
|
+
|
|
393
|
+
- name: Upload coverage to Codecov
|
|
394
|
+
uses: codecov/codecov-action@v5
|
|
395
|
+
with:
|
|
396
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
397
|
+
files: ./coverage.xml
|
|
398
|
+
flags: full-coverage
|
|
399
|
+
name: codecov-full
|
|
400
|
+
fail_ci_if_error: false
|
|
401
|
+
|
|
402
|
+
- name: Upload test results to Codecov
|
|
403
|
+
uses: codecov/codecov-action@v5
|
|
404
|
+
if: always()
|
|
405
|
+
with:
|
|
406
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
407
|
+
files: cov-results/test-results-cov-*.xml
|
|
408
|
+
flags: full-suite
|
|
409
|
+
report_type: test_results
|
|
410
|
+
fail_ci_if_error: false
|
|
411
|
+
|
|
412
|
+
- name: Upload coverage artifacts
|
|
413
|
+
uses: actions/upload-artifact@v4
|
|
414
|
+
with:
|
|
415
|
+
name: coverage-report
|
|
416
|
+
path: coverage.xml
|
|
@@ -5,6 +5,80 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.3.8] - 2026-05-02
|
|
11
|
+
|
|
12
|
+
### Fixed - TCK Feature Completeness (3885/3885 passing)
|
|
13
|
+
- **Nanosecond precision in temporal types** — `CypherDateTime` and `CypherTime` now store a `_ns_residue` (0–999) for sub-microsecond precision; `_components` tuple extended to 8 elements with nanoseconds; construction, accessors, arithmetic, comparison, and serialization all updated (#224)
|
|
14
|
+
- **Statement clock caching** — `now()`, `datetime()`, `date()`, `time()` (without arguments) now return consistent values within a single query by caching the start time via `time.time_ns()` (#224)
|
|
15
|
+
- **Extreme year support** — dates/datetimes outside Python's 1–9999 range now handled via `_WideDate` / `_WideDateTime` classes; durations too large for `timedelta` use `_BigDuration`; Julian Day Number arithmetic for cross-extreme-year duration computation (#224)
|
|
16
|
+
- **IANA timezone name preservation** — `CypherDateTime` stores the IANA zone name (e.g. `Europe/Stockholm`) separately; `.timezone` accessor returns the zone name rather than the numeric offset; `utcoffset()` now receives a concrete datetime for DST-aware lookup (#224)
|
|
17
|
+
- **Aggregate detection in QuantifierExpression** — `ALL(ok IN collect(...) WHERE ok)` patterns now correctly detected as aggregate-containing; planner emits `Aggregate` instead of `Project` (#224)
|
|
18
|
+
- **OPTIONAL MATCH multi-WHERE placement** — multiple `WHERE` clauses no longer overwrite each other; multi-hop OPTIONAL MATCH WHERE is emitted after all hops so all variables are bound (#224)
|
|
19
|
+
- **`coalesce()` type inference** — return type is inferred from argument types so `MATCH (x)` after `WITH coalesce(a, b) AS x` accepts node-typed variables (#224)
|
|
20
|
+
- **Non-deterministic aggregate arguments** — `count(rand())` and similar expressions now raise `AmbiguousAggregationExpression` per the openCypher spec (#224)
|
|
21
|
+
- **Temporal accessor for extreme-year datetimes** — `year`, `month`, `day`, `hour`, `minute`, `second` accessors work on `_WideDateTime`-backed `CypherDateTime` values (#224)
|
|
22
|
+
- **All 23 xfail markers removed** — previously marked as expected failures; all were fixable (#224)
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
- **75-test unit coverage for extreme temporal classes** — `tests/unit/types/test_extreme_temporal_values.py` covers `_WideDate`, `_WideDateTime`, `_BigDuration`, extreme-year construction/accessors, IANA timezone preservation, and large duration handling
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
- **WITH clause WHERE filtering and variable scoping** (#362) — `WITH n WHERE n.age > 30` now correctly filters post-projection; chained WITH propagates bindings properly
|
|
29
|
+
- **Triadic OPTIONAL MATCH semantics** (#302 partial) — `OPTIONAL MATCH (a)-[r]->(b)` with pre-bound `b` now correctly filters to only edges reaching that specific destination (LEFT JOIN semantics)
|
|
30
|
+
- **Relationship type disjunction without colon prefix** (#363) — `[:KNOWS|FOLLOWS]` (pipe without colon on subsequent types) now parses correctly
|
|
31
|
+
- **Multi-CREATE variable scoping** (#364 partial) — variables created in one CREATE clause are now visible in subsequent CREATE clauses within the same query
|
|
32
|
+
|
|
33
|
+
### Performance
|
|
34
|
+
- **O(n²) → O(1) graph statistics updates** (#366) — `_update_statistics_after_add_edge` no longer scans all edges on every insert; replaced with incremental `_unique_sources_by_type` tracking. Eliminated 2,000+ Pydantic `model_copy()` calls per 1,000-node graph by switching to mutable counters with lazy `GraphStatistics` construction
|
|
35
|
+
- **Parser fast path for long CREATE sequences** (#366) — queries with many consecutive CREATE clauses (e.g. the TCK movie graph with 971 CREATEs) are pre-split into batches of 5 before Earley parsing, reducing wall-clock time from 27 minutes to ~26 seconds. See docs/development/parser-performance-analysis.md for full analysis and the LALR(1) migration plan (issue #365)
|
|
36
|
+
|
|
37
|
+
### CI
|
|
38
|
+
- **TCK sharding across 4 parallel runners** — TCK tests now split using `pytest-split` with duration-based balancing (~4x faster CI)
|
|
39
|
+
- **Coverage sharding** — coverage collection also split across 4 shards and merged in report job
|
|
40
|
+
- **Python 3.14 experimental matrix** — added as non-blocking `continue-on-error` entries
|
|
41
|
+
- **TCK performance reporting** — new `scripts/tck_perf_report.py` runs after each TCK run, reporting tests over 5s and tracking use-case tests (movie graph, school graph) for performance regression detection
|
|
42
|
+
|
|
43
|
+
### TCK Coverage
|
|
44
|
+
- **3,885 / 3,885 passing (100%)** — first release with zero TCK failures and zero expected failures
|
|
45
|
+
|
|
46
|
+
## [0.3.7] - 2026-04-07
|
|
47
|
+
|
|
48
|
+
### Added - Functions
|
|
49
|
+
- **Math functions: e, pi, exp, log, log10, trig, degrees, radians, timestamp** (#326) — full set of mathematical and trigonometric functions per openCypher spec
|
|
50
|
+
- **`startNode()` and `endNode()` graph functions** (#318) — extract the start/end node from a relationship
|
|
51
|
+
- **`properties()` and `keys()` graph functions** (#316) — inspect node/relationship property maps and key sets
|
|
52
|
+
- **List concatenation `+` operator** (#315) — `[1,2] + [3,4]` → `[1,2,3,4]`
|
|
53
|
+
- **Map subscript access `m['key']`** (#314) — dynamic map property lookup
|
|
54
|
+
- **Exponent float notation and leading-dot floats** (#311) — `1.5e3`, `.5` now parsed correctly
|
|
55
|
+
|
|
56
|
+
### Fixed - Sorting & Aggregation
|
|
57
|
+
- **ORDER BY mixed-type sort ordering** (#320) — values of different Cypher types now sort in the correct openCypher type hierarchy order
|
|
58
|
+
- **Aggregation in composite expressions and ORDER BY** (#329) — `count(n) + 1`, `ORDER BY count(n)` and similar patterns now evaluate correctly
|
|
59
|
+
- **Validate ORDER BY aggregation expressions at compile time** (#331) — non-aggregated variables in aggregating ORDER BY now raise a clear error
|
|
60
|
+
- **Detect non-projected ORDER BY aggregates at compile time** (#332) — aggregates in ORDER BY that aren't in the projection are caught early
|
|
61
|
+
|
|
62
|
+
### Fixed - Expression Evaluation
|
|
63
|
+
- **Operator precedence, null propagation, and type coercion** (#321) — `NOT`, `AND`, `OR` precedence; null propagation in arithmetic; integer/float coercion edge cases
|
|
64
|
+
- **Type conversion TypeError/null per openCypher spec** (#327) — `toInteger()`, `toFloat()`, `toString()` now return `null` on unconvertible input per spec
|
|
65
|
+
- **List equality with null uses three-valued logic** (#330) — `[1, null] = [1, null]` now correctly returns `null`
|
|
66
|
+
- **NaN handling in comparisons, arithmetic, and sort** (#323) — NaN propagation and sort position per openCypher spec
|
|
67
|
+
- **SKIP/LIMIT accept expression values** (#319) — `SKIP toInteger(n.offset)` and similar dynamic skip/limit values now work
|
|
68
|
+
|
|
69
|
+
### Fixed - Parser & Clause Gaps
|
|
70
|
+
- **WITH keyword position gaps** (#310) — `WITH` is now accepted after `SET`, `REMOVE`, `DELETE`, and in chained multi-part queries
|
|
71
|
+
- **ASCENDING/DESCENDING keywords** (#312) — `ORDER BY n.name ASCENDING` / `DESCENDING` now parse correctly; removed stale xfail markers (#325)
|
|
72
|
+
- **`NodeRef`/`EdgeRef` comparison methods** (#313) — nodes and relationships are now sortable and comparable by identity
|
|
73
|
+
|
|
74
|
+
### Fixed - Graph Semantics
|
|
75
|
+
- **Relationship uniqueness in MATCH patterns** (#333) — runtime enforcement that the same physical edge cannot fill two relationship variables in one MATCH pattern; extended to anonymous multi-hop rels and path-variable (`ExpandMultiHop`) patterns
|
|
76
|
+
- **Temporal select-into constructors** (#334) — cross-type temporal projection (`date({date: other})`, `localdatetime({datetime: dt})`, etc.) with component overrides; null propagation, hour-overflow normalization, and timezone conversion all correct
|
|
77
|
+
|
|
78
|
+
### TCK Coverage
|
|
79
|
+
- **3,235 / 3,885 passing (83.3%)** (up from ~2,507 at v0.3.6) — +728 net new passing scenarios
|
|
80
|
+
- Theme: ORDER BY correctness, aggregation, operator precedence, graph semantics, temporal completeness
|
|
81
|
+
|
|
8
82
|
## [0.3.6] - 2026-02-28
|
|
9
83
|
|
|
10
84
|
### Fixed - TCK Harness Correctness
|