graphforge 0.3.7__tar.gz → 0.3.9__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.7 → graphforge-0.3.9}/.github/workflows/changelog-check.yml +4 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/workflows/docs.yml +3 -3
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/workflows/publish.yaml +1 -1
- graphforge-0.3.9/.github/workflows/test.yml +427 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.gitignore +3 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/CHANGELOG.md +72 -1
- {graphforge-0.3.7 → graphforge-0.3.9}/CLAUDE.md +19 -2
- graphforge-0.3.9/Makefile +180 -0
- graphforge-0.3.9/PKG-INFO +384 -0
- graphforge-0.3.9/README.md +336 -0
- graphforge-0.3.9/benchmarks/.gitkeep +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/snap.md +1 -1
- graphforge-0.3.9/docs/development/parser-performance-analysis.md +139 -0
- graphforge-0.3.9/docs/development/perf-baseline-findings-v0.3.9.md +104 -0
- graphforge-0.3.9/docs/development/perf-v038-to-v039-delta.md +297 -0
- graphforge-0.3.9/docs/getting-started/installation.md +43 -0
- graphforge-0.3.9/docs/getting-started/quickstart.md +112 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/getting-started/tutorial.md +3 -3
- graphforge-0.3.9/docs/guide/cypher-guide.md +840 -0
- graphforge-0.3.9/docs/index.md +83 -0
- graphforge-0.3.9/docs/reference/RELEASE_TRACKING.md +61 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/implementation-status/clauses.md +2 -0
- graphforge-0.3.9/docs/reference/implementation-status/functions.md +347 -0
- graphforge-0.3.9/docs/reference/opencypher-compatibility-matrix.md +469 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-compatibility.md +70 -163
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-features/01-clauses.md +1 -1
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-features/05-data-types.md +2 -2
- graphforge-0.3.9/docs/reference/scale-limits.md +139 -0
- graphforge-0.3.9/docs/reference/tck-compliance.md +58 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/tck-inventory.md +1 -1
- graphforge-0.3.9/docs/releases/roadmap.md +90 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/use-cases/agent-grounding.md +2 -1
- graphforge-0.3.9/docs/use-cases/agent-tool-recall.md +467 -0
- graphforge-0.3.9/docs/use-cases/knowledge-graph-construction.md +524 -0
- graphforge-0.3.9/docs/use-cases/llm-workflows.md +589 -0
- graphforge-0.3.9/docs/use-cases/network-analysis.md +619 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/mkdocs.yml +6 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/pyproject.toml +19 -5
- graphforge-0.3.9/scripts/perf_report.py +86 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/scripts/tck_metrics.py +20 -8
- graphforge-0.3.9/scripts/tck_perf_report.py +179 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/api.py +229 -60
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/ast/__init__.py +2 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/ast/clause.py +34 -18
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/ast/expression.py +46 -7
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/ast/pattern.py +4 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/base.py +1 -1
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/csv.py +59 -61
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/executor/evaluator.py +1100 -93
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/executor/executor.py +1495 -331
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/optimizer/join_reorder.py +16 -9
- graphforge-0.3.9/src/graphforge/optimizer/predicate_utils.py +288 -0
- graphforge-0.3.9/src/graphforge/parser/cypher.lark +374 -0
- graphforge-0.3.9/src/graphforge/parser/parser.py +1922 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/planner/operators.py +92 -7
- graphforge-0.3.9/src/graphforge/planner/planner.py +3487 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/planner/types.py +32 -1
- graphforge-0.3.9/src/graphforge/procedures/__init__.py +5 -0
- graphforge-0.3.9/src/graphforge/procedures/registry.py +142 -0
- graphforge-0.3.9/src/graphforge/storage/memory.py +530 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/storage/serialization.py +22 -6
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/storage/sqlite_backend.py +83 -4
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/types/values.py +401 -60
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_end_to_end_workflows.py +2 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/executor/test_graph_functions.py +6 -6
- graphforge-0.3.9/tests/integration/test_call_procedures.py +140 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_column_naming.py +6 -6
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_complex_merge_patterns.py +6 -22
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_create_edge_cases.py +10 -13
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_merge_edge_cases.py +34 -114
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_merge_on_create_real.py +7 -15
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_mixed_type_sort.py +20 -17
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_optional_match.py +9 -3
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_path_binding_variable_length.py +8 -7
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_pattern_comprehension.py +56 -36
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_pattern_predicates.py +118 -2
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_sqlite_persistence.py +80 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_transactions.py +90 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_type_functions.py +16 -17
- graphforge-0.3.9/tests/integration/test_varlen_predicate_and_uniqueness.py +142 -0
- graphforge-0.3.9/tests/perf/__init__.py +0 -0
- graphforge-0.3.9/tests/perf/conftest.py +90 -0
- graphforge-0.3.9/tests/perf/test_real_datasets.py +262 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/conftest.py +433 -82
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/tck_config.yaml +1 -26
- graphforge-0.3.9/tests/unit/api/test_api_coverage.py +268 -0
- graphforge-0.3.9/tests/unit/api/test_bulk_ingest.py +138 -0
- graphforge-0.3.9/tests/unit/ast/test_expression_coverage.py +253 -0
- graphforge-0.3.9/tests/unit/datasets/test_compression_coverage.py +866 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_registry.py +16 -16
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_snap_datasets.py +5 -1
- graphforge-0.3.9/tests/unit/executor/test_element_id.py +95 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_evaluator.py +11 -18
- graphforge-0.3.9/tests/unit/executor/test_evaluator_coverage_boost.py +1345 -0
- graphforge-0.3.9/tests/unit/executor/test_executor_coverage_boost.py +1318 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_executor_error_paths.py +5 -5
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_expressions_match.py +31 -1
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_graph_functions.py +6 -6
- graphforge-0.3.9/tests/unit/executor/test_infer_rel_var.py +84 -0
- graphforge-0.3.9/tests/unit/executor/test_limit_short_circuit.py +210 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_map_property_access.py +13 -8
- graphforge-0.3.9/tests/unit/executor/test_optional_expand_bound_dst.py +188 -0
- graphforge-0.3.9/tests/unit/executor/test_parenthesized_expr_coverage.py +121 -0
- graphforge-0.3.9/tests/unit/executor/test_procedure_call_executor.py +143 -0
- graphforge-0.3.9/tests/unit/executor/test_property_index_executor.py +294 -0
- graphforge-0.3.9/tests/unit/executor/test_set_extensions.py +143 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_temporal_truncate_arithmetic.py +5 -3
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_type_conversion_complex.py +11 -11
- graphforge-0.3.9/tests/unit/executor/test_unwind_limit_short_circuit.py +95 -0
- graphforge-0.3.9/tests/unit/optimizer/test_join_reorder_coverage.py +362 -0
- graphforge-0.3.9/tests/unit/optimizer/test_optimizer_coverage.py +232 -0
- graphforge-0.3.9/tests/unit/optimizer/test_predicate_utils_coverage.py +286 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_statistics.py +3 -3
- graphforge-0.3.9/tests/unit/parser/test_call_procedure_parser.py +84 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_parser_caching.py +14 -4
- graphforge-0.3.9/tests/unit/parser/test_parser_coverage_boost.py +869 -0
- graphforge-0.3.9/tests/unit/parser/test_pattern_comprehension_binding.py +108 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_pattern_predicates.py +56 -0
- graphforge-0.3.9/tests/unit/planner/test_call_procedure_planner.py +101 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_planner_branch_coverage.py +8 -4
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_planner_edge_cases.py +9 -7
- graphforge-0.3.9/tests/unit/planner/test_syntax_error_validation.py +286 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_type_tracking.py +7 -2
- graphforge-0.3.9/tests/unit/procedures/__init__.py +0 -0
- graphforge-0.3.9/tests/unit/procedures/test_registry.py +138 -0
- graphforge-0.3.9/tests/unit/storage/test_property_index.py +185 -0
- graphforge-0.3.9/tests/unit/storage/test_sqlite_backend_delete_bulk.py +194 -0
- graphforge-0.3.9/tests/unit/storage/test_storage_coverage.py +217 -0
- graphforge-0.3.9/tests/unit/test_procedure_registry_coverage.py +191 -0
- graphforge-0.3.9/tests/unit/types/test_extreme_temporal_values.py +554 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/uv.lock +60 -36
- graphforge-0.3.7/.github/workflows/test.yml +0 -227
- graphforge-0.3.7/Makefile +0 -107
- graphforge-0.3.7/PKG-INFO +0 -1645
- graphforge-0.3.7/README.md +0 -1599
- graphforge-0.3.7/docs/getting-started/installation.md +0 -44
- graphforge-0.3.7/docs/getting-started/quickstart.md +0 -112
- graphforge-0.3.7/docs/guide/cypher-guide.md +0 -811
- graphforge-0.3.7/docs/index.md +0 -109
- graphforge-0.3.7/docs/reference/RELEASE_TRACKING.md +0 -279
- graphforge-0.3.7/docs/reference/implementation-status/functions.md +0 -451
- graphforge-0.3.7/docs/reference/opencypher-compatibility-matrix.md +0 -539
- graphforge-0.3.7/docs/reference/tck-compliance.md +0 -272
- graphforge-0.3.7/docs/releases/roadmap.md +0 -685
- graphforge-0.3.7/src/graphforge/optimizer/predicate_utils.py +0 -184
- graphforge-0.3.7/src/graphforge/parser/cypher.lark +0 -313
- graphforge-0.3.7/src/graphforge/parser/parser.py +0 -1255
- graphforge-0.3.7/src/graphforge/planner/planner.py +0 -1478
- graphforge-0.3.7/src/graphforge/storage/memory.py +0 -435
- {graphforge-0.3.7 → graphforge-0.3.9}/.codecov.yml +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.coderabbit.yaml +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.editorconfig +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/CODEOWNERS +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_WORKFLOW.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/SECURITY.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/dependabot.yml +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/pull_request_template.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/workflows/README.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/workflows/pr-labeler.yml +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.github/workflows/release-tracking.yml +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/.pre-commit-config.yaml +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/CHANGELOG_v0.3.0.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/CODE_OF_CONDUCT.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/CONTRIBUTING.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/IMPLEMENTATION_PLAN.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/LICENSE +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/RELEASING.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/coverage.json +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/architecture/ast-and-planning.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/architecture/execution-model.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/architecture/overview.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/architecture/storage-analysis.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/architecture/storage.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/community/code-of-conduct.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/community/security.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/cypher-guide.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/cypher-script-loading.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/ldbc.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/neo4j-examples.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/networkrepository.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/overview.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/QUICKSTART_V0.2.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/codecov-integration.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/contributing.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/documentation-update-summary.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/phase-1a-completion-report.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/release-process.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/release-strategy.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/requirements.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-cicd-infrastructure.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-documentation.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-regression-fix.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-with-clause.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-02-01-codecov-setup.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-02-01-column-naming-investigation.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-summary.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/tck-session-2026-01-31-final.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/tck-session-2026-01-31.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/tck_baseline_analysis_v0.3.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/testing-setup-complete.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/testing.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/v0.2-plan-summary.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/v0.4-revised-plan.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/workflow.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/guide/graph-construction.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/guide/overview.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/INCOMPLETE_FEATURES_ISSUES.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/README.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/VALIDATION_REPORT.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/api.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/changelog.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/column-naming-behavior.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-aggregation-functions.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-graph-queries.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-graph-schema.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-mapping/clause-to-tck.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-mapping/function-to-tck.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-order-by.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-return-aliasing.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/implementation-status/operators.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/implementation-status/patterns.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-features/02-functions.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-features/03-operators.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-features/04-patterns.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/releases/implementation-summary.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/releases/next-steps.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/releases/phase-1-complete.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/releases/phase-2-complete.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/releases/phase-3-complete.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/docs/stylesheets/extra.css +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/examples/01_social_network.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/examples/02_knowledge_graph.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/examples/03_data_lineage.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/examples/04_citation_network.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/examples/05_migration_from_networkx.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/examples/agent_grounding/ecommerce_agent.ipynb +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/examples/basic_graph.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/examples/basic_usage.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/scripts/build_feature_graph.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/scripts/bump_version.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/scripts/check_release_needed.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/scripts/inventory_tck.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/scripts/pre-push-check.sh +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/scripts/validate_datasets.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/ast/query.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/data/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/data/networkrepository.json +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/data/snap.json +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/exporters/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/exporters/json_graph.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/formats/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/formats/json_graph.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/compression.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/cypher.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/graphml.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/json_graph.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/ldbc.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/ldbc_schema.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/registry.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/graphml.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/json_graph.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/ldbc.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/networkrepository.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/snap.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/executor/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/optimizer/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/optimizer/cost_model.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/optimizer/optimizer.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/optimizer/statistics.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/parser/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/planner/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/storage/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/storage/pydantic_serialization.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/types/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/types/graph.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/README.md +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/conftest.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/conftest.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_compression.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_cypher_loader_docs.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_roundtrip.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_ldbc_loader.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_networkrepository_loader.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_aggregation_edge_cases.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_aggregation_functions_advanced.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_anonymous_relationships.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_arithmetic.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_builder_api.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_call_subqueries.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_case_expressions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_collect.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_compact_iso8601.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_complex_where_predicates.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_create_clause.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_delete_null.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_detach_delete.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_distinct_clause.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_e2e_queries.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_executor_edge_cases.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_exists_is_empty.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_graph_element_comparison.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_hex_octal_literals.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_iana_timezones.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_id_function.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_issues_271_274.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_label_disjunction.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_label_predicate.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_comprehension.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_concatenation.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_functions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_operations.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_path_overloading.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_subscript.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_logical_operators.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_map_subscript.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_match_create.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_math_functions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_math_functions_extended.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_math_functions_new.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_merge_on_match_real.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_nan_handling.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_null_handling.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_operator_precedence.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_optimizer_aggregate_pushdown.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_optimizer_integration.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_optimizer_redundant_elimination.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_optional_match_delete.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_path_binding.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_path_functions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_persistence.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_power_operator.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_predicate_functions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_properties_keys_functions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_relationship_directions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_relationship_uniqueness.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_remove_clause.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_set_delete_merge.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_size_function.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_skip_limit_expressions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_snap_dataset_loading.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_sort_after_aggregation.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_spatial_api.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_startnode_endnode_functions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_string_functions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_string_functions_new.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_string_matching.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_subquery_expressions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_temporal_map_constructors.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_temporal_queries.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_temporal_select_into.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_type_conversion_fixes.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_union.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_unwind.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_variable_length_paths.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_wildcard_execution.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_with_aggregation_real.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_with_clause.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_with_clause_modifiers.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_with_clause_positions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_with_distinct_skip_limit.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_xor_operator.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/property/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/property/strategies.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/coverage_matrix.json +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/download_tck.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/Aggregation1_BasicAggregation.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/Match1_SimpleMatches.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match8.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match9.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge8.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge9.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return8.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/unwind/Unwind1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation8.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/conditional/Conditional1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/conditional/Conditional2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph8.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph9.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List10.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List11.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List12.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List8.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List9.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals8.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical10.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical11.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical12.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical13.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical14.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical15.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical16.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical17.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical8.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical9.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/pattern/Pattern1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/pattern/Pattern2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier10.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier11.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier12.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier8.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier9.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String10.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String11.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String12.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String13.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String14.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String8.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String9.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal10.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal7.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal8.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal9.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion2.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion3.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion4.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion5.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion6.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/useCases/triadicSelection/TriadicSelection1.feature +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-1/binary-tree-1.cypher +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-1/binary-tree-1.json +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-2/binary-tree-2.cypher +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-2/binary-tree-2.json +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/graphs/named-graphs.adoc +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/tck_markers.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/test_features.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/test_tck_compliance.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/api/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/api/test_clear.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/api/test_clone.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/api/test_cypher_value_conversion.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/ast/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/ast/test_ast_nodes.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_csv_loader.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_cypher_loader.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_format.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_ldbc_schema.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_networkrepository.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_sources_registration.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_aggregation_errors.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_aggregation_functions_advanced.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_arithmetic_evaluator.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_evaluator_additional_coverage.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_evaluator_error_paths.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_expression_matching.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_id_function.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_in_operator.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_list_functions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_list_functions_errors.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_merge_on_create.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_merge_on_match.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_multihop_create.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_optional_scan_coverage.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_path_functions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_properties_keys_errors.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_sort_edge_cases.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_spatial_functions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_startnode_endnode_errors.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_string_functions_new.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_string_matching_evaluator.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_subquery_planner_check.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_temporal_functions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_three_valued_logic.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_undirected_relationship_bugs.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_with_aggregation.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_aggregate_pushdown.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_cost_model.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_filter_pushdown.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_join_reorder.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_optimizer_reuse.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_predicate_reorder.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_predicate_utils.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_redundant_elimination.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_arithmetic_parser.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_case_parser.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_collect_parser.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_delete_parser.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_float_literals.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_grammar.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_hex_octal_literals.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_label_predicate_parser.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_merge_on_create.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_merge_on_match.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_optional_match_delete.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_order_by_direction.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_parser.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_path_binding.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_remove_parser.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_string_matching_parser.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_wildcard_parsing.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_with_at_query_start.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_with_clause_positions.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_expand_multi_hop_operator.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_operator_validation.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_operators.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_planner_comprehensive.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_remove_planner.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_with_validation.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/__init__.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_graph_edge_cases.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_memory_store.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_pydantic_serialization.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_serialization_edge_cases.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_spatial_serialization.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_sqlite_backend_adjacency.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_temporal_serialization.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/test_graph_elements.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/test_iana_timezone_construction.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/test_values.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_cypher_values_deep_equality.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_cypher_values_edge_cases.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_graph_element_edge_cases.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_path_values.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_spatial_values.py +0 -0
- {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_temporal_values.py +0 -0
|
@@ -36,7 +36,7 @@ jobs:
|
|
|
36
36
|
fetch-depth: 0 # Fetch all history for git info
|
|
37
37
|
|
|
38
38
|
- name: Install uv
|
|
39
|
-
uses: astral-sh/setup-uv@
|
|
39
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
40
40
|
|
|
41
41
|
- name: Set up Python
|
|
42
42
|
uses: actions/setup-python@v6
|
|
@@ -52,7 +52,7 @@ jobs:
|
|
|
52
52
|
|
|
53
53
|
- name: Upload Pages artifact
|
|
54
54
|
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main'
|
|
55
|
-
uses: actions/upload-pages-artifact@
|
|
55
|
+
uses: actions/upload-pages-artifact@v5
|
|
56
56
|
with:
|
|
57
57
|
path: site/
|
|
58
58
|
|
|
@@ -69,4 +69,4 @@ jobs:
|
|
|
69
69
|
steps:
|
|
70
70
|
- name: Deploy to GitHub Pages
|
|
71
71
|
id: deployment
|
|
72
|
-
uses: actions/deploy-pages@
|
|
72
|
+
uses: actions/deploy-pages@v5
|
|
@@ -0,0 +1,427 @@
|
|
|
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@v8.1.0
|
|
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@v6
|
|
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@v8.1.0
|
|
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@v8.1.0
|
|
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@v8.1.0
|
|
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@v8.1.0
|
|
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@v5
|
|
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@v7
|
|
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@v8.1.0
|
|
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@v8
|
|
205
|
+
with:
|
|
206
|
+
pattern: tck-shard-*
|
|
207
|
+
run-id: ${{ github.run_id }}
|
|
208
|
+
merge-multiple: true
|
|
209
|
+
path: tck-results/
|
|
210
|
+
|
|
211
|
+
- name: Merge JUnit XML results
|
|
212
|
+
run: |
|
|
213
|
+
uv run python3 -c "
|
|
214
|
+
import glob, sys
|
|
215
|
+
from xml.etree import ElementTree as ET
|
|
216
|
+
|
|
217
|
+
files = sorted(glob.glob('tck-results/test-results-tck-*.xml'))
|
|
218
|
+
if not files:
|
|
219
|
+
print('No shard result files found')
|
|
220
|
+
sys.exit(1)
|
|
221
|
+
|
|
222
|
+
root = ET.parse(files[0]).getroot()
|
|
223
|
+
suite = root if root.tag == 'testsuite' else root.find('testsuite')
|
|
224
|
+
|
|
225
|
+
for f in files[1:]:
|
|
226
|
+
tree = ET.parse(f).getroot()
|
|
227
|
+
src = tree if tree.tag == 'testsuite' else tree.find('testsuite')
|
|
228
|
+
for tc in src.findall('testcase'):
|
|
229
|
+
suite.append(tc)
|
|
230
|
+
|
|
231
|
+
tests = len(suite.findall('testcase'))
|
|
232
|
+
failures = len(suite.findall('.//failure'))
|
|
233
|
+
errors = len(suite.findall('.//error'))
|
|
234
|
+
suite.set('tests', str(tests))
|
|
235
|
+
suite.set('failures', str(failures))
|
|
236
|
+
suite.set('errors', str(errors))
|
|
237
|
+
|
|
238
|
+
ET.ElementTree(root).write('test-results-tck.xml', xml_declaration=True, encoding='utf-8')
|
|
239
|
+
print(f'Merged {len(files)} shards: {tests} tests, {failures} failures')
|
|
240
|
+
"
|
|
241
|
+
|
|
242
|
+
- name: Merge test durations for future balancing
|
|
243
|
+
run: |
|
|
244
|
+
uv run python3 -c "
|
|
245
|
+
import glob, json
|
|
246
|
+
files = glob.glob('tck-results/.test_durations_*')
|
|
247
|
+
merged = {}
|
|
248
|
+
for f in files:
|
|
249
|
+
with open(f) as fh:
|
|
250
|
+
merged.update(json.load(fh))
|
|
251
|
+
with open('.test_durations', 'w') as fh:
|
|
252
|
+
json.dump(merged, fh)
|
|
253
|
+
print(f'Merged durations for {len(merged)} tests from {len(files)} shards')
|
|
254
|
+
" || echo "No duration files found, skipping merge"
|
|
255
|
+
|
|
256
|
+
- name: Save test durations cache
|
|
257
|
+
uses: actions/cache/save@v5
|
|
258
|
+
if: always()
|
|
259
|
+
with:
|
|
260
|
+
path: .test_durations
|
|
261
|
+
key: tck-durations-${{ github.ref }}-${{ github.run_id }}
|
|
262
|
+
|
|
263
|
+
- name: Report TCK compliance metrics
|
|
264
|
+
if: always()
|
|
265
|
+
run: uv run python3 scripts/tck_metrics.py test-results-tck.xml
|
|
266
|
+
|
|
267
|
+
- name: Report TCK performance metrics
|
|
268
|
+
if: always()
|
|
269
|
+
run: uv run python3 scripts/tck_perf_report.py test-results-tck.xml --threshold 5
|
|
270
|
+
|
|
271
|
+
- name: Upload TCK results to Codecov
|
|
272
|
+
uses: codecov/codecov-action@v6
|
|
273
|
+
if: always()
|
|
274
|
+
with:
|
|
275
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
276
|
+
files: test-results-tck.xml
|
|
277
|
+
flags: tck-compliance
|
|
278
|
+
report_type: test_results
|
|
279
|
+
fail_ci_if_error: false
|
|
280
|
+
|
|
281
|
+
- name: Upload merged TCK results artifact
|
|
282
|
+
uses: actions/upload-artifact@v7
|
|
283
|
+
if: always()
|
|
284
|
+
with:
|
|
285
|
+
name: tck-test-results
|
|
286
|
+
path: test-results-tck.xml
|
|
287
|
+
|
|
288
|
+
coverage-shard:
|
|
289
|
+
name: Coverage Shard ${{ matrix.group }}/4
|
|
290
|
+
runs-on: ubuntu-latest
|
|
291
|
+
strategy:
|
|
292
|
+
fail-fast: false
|
|
293
|
+
matrix:
|
|
294
|
+
group: [1, 2, 3, 4]
|
|
295
|
+
|
|
296
|
+
steps:
|
|
297
|
+
- name: Checkout code
|
|
298
|
+
uses: actions/checkout@v6
|
|
299
|
+
|
|
300
|
+
- name: Install uv
|
|
301
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
302
|
+
|
|
303
|
+
- name: Set up Python
|
|
304
|
+
uses: actions/setup-python@v6
|
|
305
|
+
with:
|
|
306
|
+
python-version: "3.12"
|
|
307
|
+
|
|
308
|
+
- name: Install dependencies
|
|
309
|
+
run: uv sync --all-extras
|
|
310
|
+
|
|
311
|
+
- name: Download SNAP ego-facebook dataset
|
|
312
|
+
run: |
|
|
313
|
+
mkdir -p ~/.graphforge/datasets
|
|
314
|
+
curl -L -o ~/.graphforge/datasets/snap-ego-facebook.txt.gz https://snap.stanford.edu/data/facebook_combined.txt.gz
|
|
315
|
+
shell: bash
|
|
316
|
+
|
|
317
|
+
- name: Run tests with coverage (shard ${{ matrix.group }}/4)
|
|
318
|
+
run: |
|
|
319
|
+
uv run pytest tests/unit tests/integration \
|
|
320
|
+
--splits 4 --group ${{ matrix.group }} \
|
|
321
|
+
--splitting-algorithm duration_based_chunks \
|
|
322
|
+
-n auto \
|
|
323
|
+
-m "not snap" \
|
|
324
|
+
--cov=src --cov-branch \
|
|
325
|
+
--cov-report=xml:coverage-${{ matrix.group }}.xml \
|
|
326
|
+
--junitxml=test-results-cov-${{ matrix.group }}.xml
|
|
327
|
+
|
|
328
|
+
- name: Upload coverage shard artifact
|
|
329
|
+
uses: actions/upload-artifact@v7
|
|
330
|
+
if: always()
|
|
331
|
+
with:
|
|
332
|
+
name: coverage-shard-${{ matrix.group }}
|
|
333
|
+
path: |
|
|
334
|
+
coverage-${{ matrix.group }}.xml
|
|
335
|
+
test-results-cov-${{ matrix.group }}.xml
|
|
336
|
+
|
|
337
|
+
coverage:
|
|
338
|
+
name: Coverage Report
|
|
339
|
+
runs-on: ubuntu-latest
|
|
340
|
+
needs: coverage-shard
|
|
341
|
+
if: always()
|
|
342
|
+
|
|
343
|
+
steps:
|
|
344
|
+
- name: Checkout code
|
|
345
|
+
uses: actions/checkout@v6
|
|
346
|
+
|
|
347
|
+
- name: Install uv
|
|
348
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
349
|
+
|
|
350
|
+
- name: Set up Python
|
|
351
|
+
uses: actions/setup-python@v6
|
|
352
|
+
with:
|
|
353
|
+
python-version: "3.12"
|
|
354
|
+
|
|
355
|
+
- name: Install dependencies
|
|
356
|
+
run: uv sync --all-extras
|
|
357
|
+
|
|
358
|
+
- name: Download all coverage shards
|
|
359
|
+
uses: actions/download-artifact@v8
|
|
360
|
+
with:
|
|
361
|
+
pattern: coverage-shard-*
|
|
362
|
+
run-id: ${{ github.run_id }}
|
|
363
|
+
merge-multiple: true
|
|
364
|
+
path: cov-results/
|
|
365
|
+
|
|
366
|
+
- name: Merge coverage reports
|
|
367
|
+
run: |
|
|
368
|
+
uv run python3 -c "
|
|
369
|
+
import glob, sys
|
|
370
|
+
from xml.etree import ElementTree as ET
|
|
371
|
+
|
|
372
|
+
files = sorted(glob.glob('cov-results/coverage-*.xml'))
|
|
373
|
+
if not files:
|
|
374
|
+
print('No coverage files found')
|
|
375
|
+
sys.exit(1)
|
|
376
|
+
|
|
377
|
+
base = ET.parse(files[0])
|
|
378
|
+
base_root = base.getroot()
|
|
379
|
+
base_packages = base_root.find('packages')
|
|
380
|
+
|
|
381
|
+
for f in files[1:]:
|
|
382
|
+
tree = ET.parse(f).getroot()
|
|
383
|
+
for pkg in tree.findall('.//package'):
|
|
384
|
+
base_packages.append(pkg)
|
|
385
|
+
|
|
386
|
+
base.write('coverage.xml', xml_declaration=True, encoding='utf-8')
|
|
387
|
+
print(f'Merged {len(files)} coverage shards')
|
|
388
|
+
"
|
|
389
|
+
|
|
390
|
+
- name: Check coverage threshold
|
|
391
|
+
run: |
|
|
392
|
+
uv run python3 -c "
|
|
393
|
+
import xml.etree.ElementTree as ET, sys
|
|
394
|
+
tree = ET.parse('coverage.xml')
|
|
395
|
+
line_rate = float(tree.getroot().get('line-rate', 0))
|
|
396
|
+
pct = round(line_rate * 100, 1)
|
|
397
|
+
print(f'Coverage: {pct}%')
|
|
398
|
+
if pct < 85:
|
|
399
|
+
print(f'Coverage {pct}% is below 85% threshold')
|
|
400
|
+
sys.exit(1)
|
|
401
|
+
print('Coverage meets 85% threshold')
|
|
402
|
+
" || echo "Coverage check failed - see above for details"
|
|
403
|
+
|
|
404
|
+
- name: Upload coverage to Codecov
|
|
405
|
+
uses: codecov/codecov-action@v6
|
|
406
|
+
with:
|
|
407
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
408
|
+
files: ./coverage.xml
|
|
409
|
+
flags: full-coverage
|
|
410
|
+
name: codecov-full
|
|
411
|
+
fail_ci_if_error: false
|
|
412
|
+
|
|
413
|
+
- name: Upload test results to Codecov
|
|
414
|
+
uses: codecov/codecov-action@v6
|
|
415
|
+
if: always()
|
|
416
|
+
with:
|
|
417
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
418
|
+
files: cov-results/test-results-cov-*.xml
|
|
419
|
+
flags: full-suite
|
|
420
|
+
report_type: test_results
|
|
421
|
+
fail_ci_if_error: false
|
|
422
|
+
|
|
423
|
+
- name: Upload coverage artifacts
|
|
424
|
+
uses: actions/upload-artifact@v7
|
|
425
|
+
with:
|
|
426
|
+
name: coverage-report
|
|
427
|
+
path: coverage.xml
|
|
@@ -5,6 +5,77 @@ 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.9] - 2026-05-04
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **LALR(1) parser migration** (#365, #430) — grammar refactored to LALR(1); linear-time parsing replaces Earley; unknown function names now detected at parse time; 586 new parser tests; OOM-safe local coverage via sharded `make coverage`
|
|
14
|
+
- **Property equality index for O(1) node lookup** (#390, #427) — in-memory `_prop_index` (prop → value → {node\_id}) on `Graph`; `get_nodes_by_property` and `get_nodes_by_label_and_property` methods; executor `_extract_equality_hints` replaces full scan with index lookup when a `ScanNodes` is followed by a simple equality `Filter`; index maintained on `SET`/`REMOVE`/`DELETE`
|
|
15
|
+
- **Bulk ingestion API** (#389, #444) — `create_node_bulk`, `create_relationship_bulk` (skip per-call Pydantic validation); `bulk_ingest()` context manager defers statistics rebuilds until exit via `_flush_deferred_stats()`; CSV loader uses bulk path; significant throughput improvement for dataset loading
|
|
16
|
+
- **Real-dataset QA and performance profiling suite** (#417, #419) — 5-tier perf suite (karate 34n, ego-facebook 4k, amazon 334k, livejournal 4M, orkut 117M edges); `scripts/perf_report.py` renders baseline/delta Markdown tables; `make test-perf`, `make test-perf-xs`, `make test-perf-large`, `make test-perf-slow` targets; L/XL tier benchmarks added; `perf_slow` marker applied consistently (#440, #441)
|
|
17
|
+
- **`elementId()` scalar function** (#211, #447) — GQL-spec `elementId(node|rel)` returns the element id as `CypherString`; `id()` continues to return `CypherInt`; NULL-safe; arity-checked
|
|
18
|
+
- **Scale limits documentation** — `docs/reference/scale-limits.md` explains LIMIT-respecting (~20M edges) vs full-scan (~1M edges) performance ceilings; README graph-size claim updated to reflect edge-count as binding constraint (#443)
|
|
19
|
+
- **`make pre-push-fast`** (#429, #437) — fast-fail pre-push shortcut (format, lint, type, security, docstrings; no coverage); inline coverage thresholds (85% total, 90% patch)
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- **Fixed-length hop ignores rel predicate** (#431, #439) — fixed-length traversal now evaluates `rel_pattern.predicate` inline; parser predicate whitelist replaced with open accept
|
|
23
|
+
- **var-length relationship predicates** (#381, #425) — `_var_length_reachable` now evaluates inline relationship predicates (e.g. `[*1..3 {weight: 1}]`) at each hop instead of ignoring them
|
|
24
|
+
- **Cross-hop edge uniqueness in multi-segment patterns** (#382, #425) — `initial_used_edge_ids` seeds the visited-edge set from prior hops, preventing the same edge being traversed twice across pattern segments
|
|
25
|
+
- **SQLite delete persistence** (#409, #421) — deleted nodes and edges now removed from SQLite backend; previously they resurrected on reload
|
|
26
|
+
- **SQLite bulk I/O** (#392, #421) — `save_nodes_bulk` / `save_edges_bulk` use `executemany`; `_save_graph_to_backend` wrapped in rollback; resolves >20s hang on M-tier reload
|
|
27
|
+
- **`sys.setrecursionlimit` thread safety** (#433, #445) — limit set once in `CypherParser.__init__` instead of per-request get/set/restore, eliminating races in concurrent parser use
|
|
28
|
+
- **Transaction rollback restores ID counters** (#412) — `rollback()` restores `_next_node_id` and `_next_edge_id`, preventing ID gaps after aborted transactions
|
|
29
|
+
- **Closed-instance guard** (#411) — `execute()` and mutation methods raise `RuntimeError` after `close()`
|
|
30
|
+
- **`DatasetInfo` rejects `ftp://` URLs** (#414)
|
|
31
|
+
- **TCK metrics CI gate** (#410) — `tck_metrics.py` exits non-zero on TCK failures
|
|
32
|
+
|
|
33
|
+
### Performance
|
|
34
|
+
- **UNWIND + WITH LIMIT short-circuit** (#393, #443) — `_pipeline_limit` reverse-scan treats pass-through `With(limit_count=N, no sort, no filter)` as transparent; `_execute_unwind` respects `row_limit` and exits early; `UNWIND range(1M, 2M) AS i WITH i LIMIT 3000 RETURN sum(i)` drops from ~4.5s to <10ms
|
|
35
|
+
- **LIMIT short-circuit for scan and expand operators** (#422, #423) — `_pipeline_limit` look-ahead stops scan/expand at row budget; write operators and Filter block short-circuit to preserve correctness
|
|
36
|
+
- **SQLite PRAGMA tuning** (#392, #446) — `synchronous=NORMAL` (eliminates `fdatasync` per commit), 64 MB page cache (`cache_size=-65536`), `temp_store=MEMORY`; safe with WAL mode for analytical workloads
|
|
37
|
+
- **Lazy statistics timestamp** — `_stats_last_updated` stamped at read time in `get_statistics()` rather than on every add; `_defer_stats` flag eliminates per-edge stat overhead during bulk ingest
|
|
38
|
+
|
|
39
|
+
### CI / Tooling
|
|
40
|
+
- **Test suite zero-base renovation** (#428, #438) — fixture strategy audit, duplication removal, marker consistency, parametrization improvements across unit and integration suites
|
|
41
|
+
- **GHA actions updated** — `actions/upload-artifact` v7, `actions/download-artifact` v8, `codecov/codecov-action` v6, `actions/upload-pages-artifact` v5, `astral-sh/setup-uv` v8.1.0
|
|
42
|
+
|
|
43
|
+
## [0.3.8] - 2026-05-02
|
|
44
|
+
|
|
45
|
+
### Fixed - TCK Feature Completeness (3885/3885 passing)
|
|
46
|
+
- **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)
|
|
47
|
+
- **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)
|
|
48
|
+
- **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)
|
|
49
|
+
- **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)
|
|
50
|
+
- **Aggregate detection in QuantifierExpression** — `ALL(ok IN collect(...) WHERE ok)` patterns now correctly detected as aggregate-containing; planner emits `Aggregate` instead of `Project` (#224)
|
|
51
|
+
- **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)
|
|
52
|
+
- **`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)
|
|
53
|
+
- **Non-deterministic aggregate arguments** — `count(rand())` and similar expressions now raise `AmbiguousAggregationExpression` per the openCypher spec (#224)
|
|
54
|
+
- **Temporal accessor for extreme-year datetimes** — `year`, `month`, `day`, `hour`, `minute`, `second` accessors work on `_WideDateTime`-backed `CypherDateTime` values (#224)
|
|
55
|
+
- **All 23 xfail markers removed** — previously marked as expected failures; all were fixable (#224)
|
|
56
|
+
|
|
57
|
+
### Added
|
|
58
|
+
- **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
|
|
59
|
+
|
|
60
|
+
### Fixed
|
|
61
|
+
- **WITH clause WHERE filtering and variable scoping** (#362) — `WITH n WHERE n.age > 30` now correctly filters post-projection; chained WITH propagates bindings properly
|
|
62
|
+
- **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)
|
|
63
|
+
- **Relationship type disjunction without colon prefix** (#363) — `[:KNOWS|FOLLOWS]` (pipe without colon on subsequent types) now parses correctly
|
|
64
|
+
- **Multi-CREATE variable scoping** (#364 partial) — variables created in one CREATE clause are now visible in subsequent CREATE clauses within the same query
|
|
65
|
+
|
|
66
|
+
### Performance
|
|
67
|
+
- **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
|
|
68
|
+
- **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)
|
|
69
|
+
|
|
70
|
+
### CI
|
|
71
|
+
- **TCK sharding across 4 parallel runners** — TCK tests now split using `pytest-split` with duration-based balancing (~4x faster CI)
|
|
72
|
+
- **Coverage sharding** — coverage collection also split across 4 shards and merged in report job
|
|
73
|
+
- **Python 3.14 experimental matrix** — added as non-blocking `continue-on-error` entries
|
|
74
|
+
- **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
|
|
75
|
+
|
|
76
|
+
### TCK Coverage
|
|
77
|
+
- **3,885 / 3,885 passing (100%)** — first release with zero TCK failures and zero expected failures
|
|
78
|
+
|
|
8
79
|
## [0.3.7] - 2026-04-07
|
|
9
80
|
|
|
10
81
|
### Added - Functions
|
|
@@ -38,7 +109,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
38
109
|
- **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
|
|
39
110
|
|
|
40
111
|
### TCK Coverage
|
|
41
|
-
-
|
|
112
|
+
- **3,235 / 3,885 passing (83.3%)** (up from ~2,507 at v0.3.6) — +728 net new passing scenarios
|
|
42
113
|
- Theme: ORDER BY correctness, aggregation, operator precedence, graph semantics, temporal completeness
|
|
43
114
|
|
|
44
115
|
## [0.3.6] - 2026-02-28
|
|
@@ -51,6 +51,16 @@ make pre-push
|
|
|
51
51
|
|
|
52
52
|
Runs: format-check, lint, type-check, coverage (85% total, 90% patch).
|
|
53
53
|
|
|
54
|
+
**Before running tests locally during planning:** If the branch has no committed changes yet (i.e., you're still in the planning phase), check the last CI run instead of running the full test suite locally. This avoids OOM errors from running all tests unnecessarily.
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# Check last CI run status and test results
|
|
58
|
+
gh run list --branch main --limit 5
|
|
59
|
+
gh run view <run-id> --log-failed # see only failed tests
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Only run tests locally once you have actual code changes to validate.
|
|
63
|
+
|
|
54
64
|
### 5. Commit with Issue Number
|
|
55
65
|
|
|
56
66
|
```bash
|
|
@@ -77,16 +87,21 @@ GitHub automatically closes the issue when PR merges.
|
|
|
77
87
|
## Development Commands
|
|
78
88
|
|
|
79
89
|
```bash
|
|
80
|
-
make pre-push # Run all checks (mirrors CI)
|
|
90
|
+
make pre-push # Run all checks (mirrors CI): format, lint, type, security, docstrings, coverage + thresholds
|
|
91
|
+
make pre-push-fast # Fast checks only (no coverage, ~30s): format, lint, type, security, docstrings
|
|
81
92
|
make test # All tests
|
|
82
93
|
make test-unit # Unit tests only
|
|
83
94
|
make test-integration # Integration tests only
|
|
84
|
-
make coverage # Run with coverage
|
|
95
|
+
make coverage # Run with coverage + validate thresholds (sharded, includes 85%/90% checks)
|
|
96
|
+
make coverage-quick # Coverage on unit tests only (fast feedback during development)
|
|
85
97
|
make coverage-report # View HTML coverage report
|
|
86
98
|
make coverage-diff # Coverage for changed files only
|
|
87
99
|
|
|
88
100
|
# Run tests in parallel (4x faster for TCK)
|
|
89
101
|
pytest tests/ -n auto
|
|
102
|
+
|
|
103
|
+
# Override worker count (default 4, lower to reduce memory)
|
|
104
|
+
PYTEST_WORKERS=2 make test
|
|
90
105
|
```
|
|
91
106
|
|
|
92
107
|
**Coverage Requirements:**
|
|
@@ -94,6 +109,8 @@ pytest tests/ -n auto
|
|
|
94
109
|
- Patch: 90% minimum for changed files
|
|
95
110
|
- Best practice: Aim for 100% on new code
|
|
96
111
|
|
|
112
|
+
**When to use `pre-push-fast`:** iterating on non-test changes (refactors, docs, config). Always run the full `pre-push` before opening a PR.
|
|
113
|
+
|
|
97
114
|
## Architecture: 4-Layer System
|
|
98
115
|
|
|
99
116
|
```
|