graphforge 0.3.8__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.8 → graphforge-0.3.9}/.github/workflows/docs.yml +3 -3
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/publish.yaml +1 -1
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/test.yml +33 -22
- {graphforge-0.3.8 → graphforge-0.3.9}/.gitignore +3 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/CHANGELOG.md +33 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/CLAUDE.md +19 -2
- graphforge-0.3.9/Makefile +180 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/PKG-INFO +20 -18
- {graphforge-0.3.8 → graphforge-0.3.9}/README.md +18 -16
- 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.8 → graphforge-0.3.9}/docs/getting-started/installation.md +1 -1
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/guide/cypher-guide.md +1 -1
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/index.md +2 -2
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-compatibility.md +16 -15
- graphforge-0.3.9/docs/reference/scale-limits.md +139 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/tck-compliance.md +5 -5
- graphforge-0.3.9/docs/releases/roadmap.md +90 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/pyproject.toml +7 -5
- graphforge-0.3.9/scripts/perf_report.py +86 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/scripts/tck_metrics.py +20 -8
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/api.py +167 -52
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/ast/pattern.py +4 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/base.py +1 -1
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/csv.py +59 -61
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/executor/evaluator.py +200 -32
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/executor/executor.py +244 -20
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/predicate_utils.py +37 -14
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/parser/cypher.lark +133 -112
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/parser/parser.py +660 -358
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/planner/planner.py +270 -50
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/storage/memory.py +97 -4
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/storage/sqlite_backend.py +83 -4
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_pattern_comprehension.py +56 -36
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_pattern_predicates.py +116 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_sqlite_persistence.py +80 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_transactions.py +90 -0
- 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.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.8 → graphforge-0.3.9}/tests/unit/datasets/test_registry.py +16 -16
- graphforge-0.3.9/tests/unit/executor/test_element_id.py +95 -0
- 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.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.9/tests/unit/executor/test_property_index_executor.py +294 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_temporal_truncate_arithmetic.py +4 -2
- 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.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.8 → graphforge-0.3.9}/tests/unit/parser/test_pattern_predicates.py +56 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_syntax_error_validation.py +37 -3
- graphforge-0.3.9/tests/unit/procedures/__init__.py +0 -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.8 → graphforge-0.3.9}/uv.lock +24 -24
- graphforge-0.3.8/Makefile +0 -107
- graphforge-0.3.8/docs/releases/roadmap.md +0 -685
- {graphforge-0.3.8 → graphforge-0.3.9}/.codecov.yml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.coderabbit.yaml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.editorconfig +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/CODEOWNERS +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_WORKFLOW.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/SECURITY.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/dependabot.yml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/pull_request_template.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/README.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/changelog-check.yml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/pr-labeler.yml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/release-tracking.yml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/.pre-commit-config.yaml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/CHANGELOG_v0.3.0.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/CODE_OF_CONDUCT.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/CONTRIBUTING.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/IMPLEMENTATION_PLAN.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/LICENSE +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/RELEASING.md +0 -0
- /graphforge-0.3.8/tests/unit/procedures/__init__.py → /graphforge-0.3.9/benchmarks/.gitkeep +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/coverage.json +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/architecture/ast-and-planning.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/architecture/execution-model.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/architecture/overview.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/architecture/storage-analysis.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/architecture/storage.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/community/code-of-conduct.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/community/security.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/cypher-guide.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/cypher-script-loading.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/ldbc.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/neo4j-examples.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/networkrepository.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/overview.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/snap.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/QUICKSTART_V0.2.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/codecov-integration.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/contributing.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/documentation-update-summary.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/parser-performance-analysis.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/phase-1a-completion-report.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/release-process.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/release-strategy.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/requirements.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-cicd-infrastructure.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-documentation.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-regression-fix.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-with-clause.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-02-01-codecov-setup.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-02-01-column-naming-investigation.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-summary.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/tck-session-2026-01-31-final.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/tck-session-2026-01-31.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/tck_baseline_analysis_v0.3.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/testing-setup-complete.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/testing.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/v0.2-plan-summary.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/v0.4-revised-plan.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/workflow.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/getting-started/quickstart.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/getting-started/tutorial.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/guide/graph-construction.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/guide/overview.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/INCOMPLETE_FEATURES_ISSUES.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/README.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/RELEASE_TRACKING.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/VALIDATION_REPORT.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/api.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/changelog.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/column-naming-behavior.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-aggregation-functions.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-graph-queries.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-graph-schema.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-mapping/clause-to-tck.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-mapping/function-to-tck.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-order-by.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-return-aliasing.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/implementation-status/clauses.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/implementation-status/functions.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/implementation-status/operators.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/implementation-status/patterns.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-compatibility-matrix.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-features/01-clauses.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-features/02-functions.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-features/03-operators.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-features/04-patterns.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-features/05-data-types.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/tck-inventory.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/releases/implementation-summary.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/releases/next-steps.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/releases/phase-1-complete.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/releases/phase-2-complete.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/releases/phase-3-complete.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/stylesheets/extra.css +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/use-cases/agent-grounding.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/use-cases/agent-tool-recall.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/use-cases/knowledge-graph-construction.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/use-cases/llm-workflows.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/docs/use-cases/network-analysis.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/examples/01_social_network.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/examples/02_knowledge_graph.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/examples/03_data_lineage.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/examples/04_citation_network.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/examples/05_migration_from_networkx.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/examples/agent_grounding/ecommerce_agent.ipynb +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/examples/basic_graph.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/examples/basic_usage.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/mkdocs.yml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/scripts/build_feature_graph.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/scripts/bump_version.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/scripts/check_release_needed.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/scripts/inventory_tck.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/scripts/pre-push-check.sh +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/scripts/tck_perf_report.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/scripts/validate_datasets.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/ast/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/ast/clause.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/ast/expression.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/ast/query.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/data/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/data/networkrepository.json +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/data/snap.json +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/exporters/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/exporters/json_graph.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/formats/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/formats/json_graph.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/compression.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/cypher.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/graphml.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/json_graph.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/ldbc.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/ldbc_schema.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/registry.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/graphml.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/json_graph.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/ldbc.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/networkrepository.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/snap.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/executor/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/cost_model.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/join_reorder.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/optimizer.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/statistics.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/parser/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/planner/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/planner/operators.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/planner/types.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/procedures/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/procedures/registry.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/storage/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/storage/pydantic_serialization.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/storage/serialization.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/types/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/types/graph.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/types/values.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/README.md +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/conftest.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/conftest.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_compression.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_cypher_loader_docs.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_end_to_end_workflows.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_roundtrip.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_ldbc_loader.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_networkrepository_loader.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/executor/test_graph_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_aggregation_edge_cases.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_aggregation_functions_advanced.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_anonymous_relationships.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_arithmetic.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_builder_api.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_call_procedures.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_call_subqueries.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_case_expressions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_collect.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_column_naming.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_compact_iso8601.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_complex_merge_patterns.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_complex_where_predicates.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_create_clause.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_create_edge_cases.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_delete_null.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_detach_delete.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_distinct_clause.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_e2e_queries.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_executor_edge_cases.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_exists_is_empty.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_graph_element_comparison.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_hex_octal_literals.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_iana_timezones.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_id_function.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_issues_271_274.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_label_disjunction.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_label_predicate.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_comprehension.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_concatenation.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_operations.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_path_overloading.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_subscript.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_logical_operators.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_map_subscript.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_match_create.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_math_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_math_functions_extended.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_math_functions_new.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_merge_edge_cases.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_merge_on_create_real.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_merge_on_match_real.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_mixed_type_sort.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_nan_handling.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_null_handling.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_operator_precedence.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_optimizer_aggregate_pushdown.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_optimizer_integration.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_optimizer_redundant_elimination.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_optional_match.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_optional_match_delete.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_path_binding.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_path_binding_variable_length.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_path_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_persistence.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_power_operator.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_predicate_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_properties_keys_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_relationship_directions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_relationship_uniqueness.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_remove_clause.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_set_delete_merge.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_size_function.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_skip_limit_expressions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_snap_dataset_loading.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_sort_after_aggregation.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_spatial_api.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_startnode_endnode_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_string_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_string_functions_new.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_string_matching.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_subquery_expressions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_temporal_map_constructors.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_temporal_queries.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_temporal_select_into.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_type_conversion_fixes.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_type_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_union.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_unwind.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_variable_length_paths.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_wildcard_execution.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_with_aggregation_real.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_with_clause.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_with_clause_modifiers.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_with_clause_positions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_with_distinct_skip_limit.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_xor_operator.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/property/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/property/strategies.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/conftest.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/coverage_matrix.json +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/download_tck.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/Aggregation1_BasicAggregation.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/Match1_SimpleMatches.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match8.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match9.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge8.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge9.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return8.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/unwind/Unwind1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation8.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/conditional/Conditional1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/conditional/Conditional2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph8.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph9.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List10.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List11.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List12.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List8.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List9.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals8.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical10.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical11.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical12.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical13.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical14.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical15.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical16.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical17.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical8.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical9.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/pattern/Pattern1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/pattern/Pattern2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier10.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier11.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier12.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier8.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier9.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String10.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String11.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String12.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String13.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String14.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String8.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String9.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal10.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal7.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal8.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal9.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion2.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion3.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion4.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion5.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion6.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/useCases/triadicSelection/TriadicSelection1.feature +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-1/binary-tree-1.cypher +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-1/binary-tree-1.json +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-2/binary-tree-2.cypher +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-2/binary-tree-2.json +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/graphs/named-graphs.adoc +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/tck_config.yaml +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/tck_markers.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/test_features.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/test_tck_compliance.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/api/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/api/test_clear.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/api/test_clone.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/api/test_cypher_value_conversion.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/ast/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/ast/test_ast_nodes.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_csv_loader.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_cypher_loader.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_format.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_ldbc_schema.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_networkrepository.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_snap_datasets.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_sources_registration.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_aggregation_errors.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_aggregation_functions_advanced.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_arithmetic_evaluator.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_evaluator.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_evaluator_additional_coverage.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_evaluator_error_paths.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_executor_error_paths.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_expression_matching.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_expressions_match.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_graph_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_id_function.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_in_operator.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_list_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_list_functions_errors.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_map_property_access.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_merge_on_create.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_merge_on_match.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_multihop_create.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_optional_expand_bound_dst.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_optional_scan_coverage.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_parenthesized_expr_coverage.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_path_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_procedure_call_executor.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_properties_keys_errors.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_set_extensions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_sort_edge_cases.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_spatial_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_startnode_endnode_errors.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_string_functions_new.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_string_matching_evaluator.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_subquery_planner_check.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_temporal_functions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_three_valued_logic.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_type_conversion_complex.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_undirected_relationship_bugs.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_with_aggregation.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_aggregate_pushdown.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_cost_model.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_filter_pushdown.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_join_reorder.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_optimizer_reuse.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_predicate_reorder.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_predicate_utils.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_redundant_elimination.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_statistics.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_arithmetic_parser.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_call_procedure_parser.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_case_parser.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_collect_parser.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_delete_parser.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_float_literals.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_grammar.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_hex_octal_literals.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_label_predicate_parser.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_merge_on_create.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_merge_on_match.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_optional_match_delete.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_order_by_direction.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_parser.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_parser_caching.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_path_binding.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_remove_parser.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_string_matching_parser.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_wildcard_parsing.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_with_at_query_start.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_with_clause_positions.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_call_procedure_planner.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_expand_multi_hop_operator.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_operator_validation.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_operators.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_planner_branch_coverage.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_planner_comprehensive.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_planner_edge_cases.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_remove_planner.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_type_tracking.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_with_validation.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/procedures/test_registry.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/__init__.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_graph_edge_cases.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_memory_store.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_pydantic_serialization.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_serialization_edge_cases.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_spatial_serialization.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_sqlite_backend_adjacency.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_temporal_serialization.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/test_graph_elements.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/test_iana_timezone_construction.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/test_values.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_cypher_values_deep_equality.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_cypher_values_edge_cases.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_extreme_temporal_values.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_graph_element_edge_cases.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_path_values.py +0 -0
- {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_spatial_values.py +0 -0
- {graphforge-0.3.8 → 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
|
|
@@ -24,7 +24,7 @@ jobs:
|
|
|
24
24
|
uses: actions/checkout@v6
|
|
25
25
|
|
|
26
26
|
- name: Install uv
|
|
27
|
-
uses: astral-sh/setup-uv@
|
|
27
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
28
28
|
with:
|
|
29
29
|
enable-cache: true
|
|
30
30
|
|
|
@@ -49,7 +49,7 @@ jobs:
|
|
|
49
49
|
run: uv run pytest tests/integration -n auto -m "not snap" --junitxml=test-results-integration.xml
|
|
50
50
|
|
|
51
51
|
- name: Upload test results to Codecov
|
|
52
|
-
uses: codecov/codecov-action@
|
|
52
|
+
uses: codecov/codecov-action@v6
|
|
53
53
|
if: always()
|
|
54
54
|
with:
|
|
55
55
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -67,7 +67,7 @@ jobs:
|
|
|
67
67
|
uses: actions/checkout@v6
|
|
68
68
|
|
|
69
69
|
- name: Install uv
|
|
70
|
-
uses: astral-sh/setup-uv@
|
|
70
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
71
71
|
|
|
72
72
|
- name: Set up Python
|
|
73
73
|
uses: actions/setup-python@v6
|
|
@@ -92,7 +92,7 @@ jobs:
|
|
|
92
92
|
uses: actions/checkout@v6
|
|
93
93
|
|
|
94
94
|
- name: Install uv
|
|
95
|
-
uses: astral-sh/setup-uv@
|
|
95
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
96
96
|
|
|
97
97
|
- name: Set up Python
|
|
98
98
|
uses: actions/setup-python@v6
|
|
@@ -114,7 +114,7 @@ jobs:
|
|
|
114
114
|
uses: actions/checkout@v6
|
|
115
115
|
|
|
116
116
|
- name: Install uv
|
|
117
|
-
uses: astral-sh/setup-uv@
|
|
117
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
118
118
|
|
|
119
119
|
- name: Set up Python
|
|
120
120
|
uses: actions/setup-python@v6
|
|
@@ -140,7 +140,7 @@ jobs:
|
|
|
140
140
|
uses: actions/checkout@v6
|
|
141
141
|
|
|
142
142
|
- name: Install uv
|
|
143
|
-
uses: astral-sh/setup-uv@
|
|
143
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
144
144
|
|
|
145
145
|
- name: Set up Python
|
|
146
146
|
uses: actions/setup-python@v6
|
|
@@ -151,7 +151,7 @@ jobs:
|
|
|
151
151
|
run: uv sync --all-extras
|
|
152
152
|
|
|
153
153
|
- name: Restore test durations cache
|
|
154
|
-
uses: actions/cache/restore@
|
|
154
|
+
uses: actions/cache/restore@v5
|
|
155
155
|
with:
|
|
156
156
|
path: .test_durations
|
|
157
157
|
key: tck-durations-${{ github.ref }}
|
|
@@ -168,7 +168,7 @@ jobs:
|
|
|
168
168
|
--junitxml=test-results-tck-${{ matrix.group }}.xml
|
|
169
169
|
|
|
170
170
|
- name: Upload shard results artifact
|
|
171
|
-
uses: actions/upload-artifact@
|
|
171
|
+
uses: actions/upload-artifact@v7
|
|
172
172
|
if: always()
|
|
173
173
|
with:
|
|
174
174
|
name: tck-shard-${{ matrix.group }}
|
|
@@ -190,7 +190,7 @@ jobs:
|
|
|
190
190
|
uses: actions/checkout@v6
|
|
191
191
|
|
|
192
192
|
- name: Install uv
|
|
193
|
-
uses: astral-sh/setup-uv@
|
|
193
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
194
194
|
|
|
195
195
|
- name: Set up Python
|
|
196
196
|
uses: actions/setup-python@v6
|
|
@@ -201,9 +201,10 @@ jobs:
|
|
|
201
201
|
run: uv sync --all-extras
|
|
202
202
|
|
|
203
203
|
- name: Download all shard results
|
|
204
|
-
uses: actions/download-artifact@
|
|
204
|
+
uses: actions/download-artifact@v8
|
|
205
205
|
with:
|
|
206
206
|
pattern: tck-shard-*
|
|
207
|
+
run-id: ${{ github.run_id }}
|
|
207
208
|
merge-multiple: true
|
|
208
209
|
path: tck-results/
|
|
209
210
|
|
|
@@ -253,7 +254,7 @@ jobs:
|
|
|
253
254
|
" || echo "No duration files found, skipping merge"
|
|
254
255
|
|
|
255
256
|
- name: Save test durations cache
|
|
256
|
-
uses: actions/cache/save@
|
|
257
|
+
uses: actions/cache/save@v5
|
|
257
258
|
if: always()
|
|
258
259
|
with:
|
|
259
260
|
path: .test_durations
|
|
@@ -268,7 +269,7 @@ jobs:
|
|
|
268
269
|
run: uv run python3 scripts/tck_perf_report.py test-results-tck.xml --threshold 5
|
|
269
270
|
|
|
270
271
|
- name: Upload TCK results to Codecov
|
|
271
|
-
uses: codecov/codecov-action@
|
|
272
|
+
uses: codecov/codecov-action@v6
|
|
272
273
|
if: always()
|
|
273
274
|
with:
|
|
274
275
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -278,7 +279,7 @@ jobs:
|
|
|
278
279
|
fail_ci_if_error: false
|
|
279
280
|
|
|
280
281
|
- name: Upload merged TCK results artifact
|
|
281
|
-
uses: actions/upload-artifact@
|
|
282
|
+
uses: actions/upload-artifact@v7
|
|
282
283
|
if: always()
|
|
283
284
|
with:
|
|
284
285
|
name: tck-test-results
|
|
@@ -297,7 +298,7 @@ jobs:
|
|
|
297
298
|
uses: actions/checkout@v6
|
|
298
299
|
|
|
299
300
|
- name: Install uv
|
|
300
|
-
uses: astral-sh/setup-uv@
|
|
301
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
301
302
|
|
|
302
303
|
- name: Set up Python
|
|
303
304
|
uses: actions/setup-python@v6
|
|
@@ -325,7 +326,7 @@ jobs:
|
|
|
325
326
|
--junitxml=test-results-cov-${{ matrix.group }}.xml
|
|
326
327
|
|
|
327
328
|
- name: Upload coverage shard artifact
|
|
328
|
-
uses: actions/upload-artifact@
|
|
329
|
+
uses: actions/upload-artifact@v7
|
|
329
330
|
if: always()
|
|
330
331
|
with:
|
|
331
332
|
name: coverage-shard-${{ matrix.group }}
|
|
@@ -344,7 +345,7 @@ jobs:
|
|
|
344
345
|
uses: actions/checkout@v6
|
|
345
346
|
|
|
346
347
|
- name: Install uv
|
|
347
|
-
uses: astral-sh/setup-uv@
|
|
348
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
348
349
|
|
|
349
350
|
- name: Set up Python
|
|
350
351
|
uses: actions/setup-python@v6
|
|
@@ -355,9 +356,10 @@ jobs:
|
|
|
355
356
|
run: uv sync --all-extras
|
|
356
357
|
|
|
357
358
|
- name: Download all coverage shards
|
|
358
|
-
uses: actions/download-artifact@
|
|
359
|
+
uses: actions/download-artifact@v8
|
|
359
360
|
with:
|
|
360
361
|
pattern: coverage-shard-*
|
|
362
|
+
run-id: ${{ github.run_id }}
|
|
361
363
|
merge-multiple: true
|
|
362
364
|
path: cov-results/
|
|
363
365
|
|
|
@@ -387,11 +389,20 @@ jobs:
|
|
|
387
389
|
|
|
388
390
|
- name: Check coverage threshold
|
|
389
391
|
run: |
|
|
390
|
-
uv run
|
|
391
|
-
|
|
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"
|
|
392
403
|
|
|
393
404
|
- name: Upload coverage to Codecov
|
|
394
|
-
uses: codecov/codecov-action@
|
|
405
|
+
uses: codecov/codecov-action@v6
|
|
395
406
|
with:
|
|
396
407
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
397
408
|
files: ./coverage.xml
|
|
@@ -400,7 +411,7 @@ jobs:
|
|
|
400
411
|
fail_ci_if_error: false
|
|
401
412
|
|
|
402
413
|
- name: Upload test results to Codecov
|
|
403
|
-
uses: codecov/codecov-action@
|
|
414
|
+
uses: codecov/codecov-action@v6
|
|
404
415
|
if: always()
|
|
405
416
|
with:
|
|
406
417
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -410,7 +421,7 @@ jobs:
|
|
|
410
421
|
fail_ci_if_error: false
|
|
411
422
|
|
|
412
423
|
- name: Upload coverage artifacts
|
|
413
|
-
uses: actions/upload-artifact@
|
|
424
|
+
uses: actions/upload-artifact@v7
|
|
414
425
|
with:
|
|
415
426
|
name: coverage-report
|
|
416
427
|
path: coverage.xml
|
|
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
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
|
+
|
|
10
43
|
## [0.3.8] - 2026-05-02
|
|
11
44
|
|
|
12
45
|
### Fixed - TCK Feature Completeness (3885/3885 passing)
|
|
@@ -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
|
```
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
.PHONY: help lint format type-check security test pre-push pre-push-fast clean test-tck docstring-coverage test-network test-perf test-perf-xs test-perf-slow test-perf-large coverage coverage-quick coverage-report coverage-diff coverage-strict check-coverage check-patch-coverage test-durations test-analytics
|
|
2
|
+
|
|
3
|
+
help: ## Show this help message
|
|
4
|
+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
|
5
|
+
|
|
6
|
+
lint: ## Run ruff linter
|
|
7
|
+
uv run ruff check .
|
|
8
|
+
|
|
9
|
+
format: ## Format code with ruff
|
|
10
|
+
uv run ruff format .
|
|
11
|
+
|
|
12
|
+
format-check: ## Check code formatting
|
|
13
|
+
uv run ruff format --check .
|
|
14
|
+
|
|
15
|
+
type-check: ## Run mypy type checker
|
|
16
|
+
uv run mypy src/graphforge --strict-optional --show-error-codes
|
|
17
|
+
|
|
18
|
+
security: ## Run Bandit security scanner
|
|
19
|
+
uv run bandit -c pyproject.toml -r src/
|
|
20
|
+
|
|
21
|
+
docstring-coverage: ## Check docstring coverage (90% minimum)
|
|
22
|
+
uv run interrogate src/graphforge --fail-under 90 --quiet
|
|
23
|
+
|
|
24
|
+
test: ## Run all tests in parallel (excludes snap/network downloads)
|
|
25
|
+
uv run pytest tests/ -n $${PYTEST_WORKERS:-4} -m "not snap"
|
|
26
|
+
|
|
27
|
+
test-unit: ## Run unit tests in parallel
|
|
28
|
+
uv run pytest tests/unit -n $${PYTEST_WORKERS:-4}
|
|
29
|
+
|
|
30
|
+
test-integration: ## Run integration tests in parallel (excludes snap/network downloads)
|
|
31
|
+
uv run pytest tests/integration -n $${PYTEST_WORKERS:-4} -m "not snap"
|
|
32
|
+
|
|
33
|
+
test-network: ## Run external network/download tests (snap datasets; requires internet)
|
|
34
|
+
uv run pytest tests/ -m "snap" -v
|
|
35
|
+
|
|
36
|
+
test-perf-xs: ## Run perf QA for XS/S datasets only (karate + ego-facebook, ~3 MB total)
|
|
37
|
+
uv run pytest tests/perf/ -m "perf and not perf_large and not perf_slow" -k "xs or s_face" -v -s
|
|
38
|
+
|
|
39
|
+
test-perf: ## Run perf QA through M-tier (Amazon 334k nodes, ~15 MB); writes baseline JSON
|
|
40
|
+
uv run pytest tests/perf/ -m "perf and not perf_large and not perf_slow" -v -s
|
|
41
|
+
@echo ""
|
|
42
|
+
@echo "Baseline written to benchmarks/real_dataset_baseline_v0.3.9.json"
|
|
43
|
+
|
|
44
|
+
test-perf-slow: ## Run slow two-hop full-expansion benchmarks (opt-in; minutes on S/M, hours on L)
|
|
45
|
+
uv run pytest tests/perf/ -m "perf_slow" -v -s
|
|
46
|
+
|
|
47
|
+
test-perf-large: ## Run L/XL tiers (livejournal 500 MB, cit-patents 270 MB, orkut 1.7 GB); needs 16 GB RAM
|
|
48
|
+
uv run pytest tests/perf/ -m "perf and perf_large" -v -s --timeout=3600
|
|
49
|
+
|
|
50
|
+
test-tck: ## Run TCK compliance tests in parallel
|
|
51
|
+
uv run pytest tests/tck/ -n $${PYTEST_WORKERS:-4} -v
|
|
52
|
+
|
|
53
|
+
coverage: ## Run tests with coverage and validate thresholds (sharded to avoid OOM)
|
|
54
|
+
@echo "━━━ Coverage shard 1/2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
55
|
+
uv run coverage erase
|
|
56
|
+
uv run pytest tests/unit tests/integration -m "not snap" \
|
|
57
|
+
--splits 2 --group 1 \
|
|
58
|
+
-n $${PYTEST_WORKERS:-4} \
|
|
59
|
+
--cov=src --cov-branch \
|
|
60
|
+
--cov-report= \
|
|
61
|
+
--cov-append
|
|
62
|
+
@echo "━━━ Coverage shard 2/2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
63
|
+
uv run pytest tests/unit tests/integration -m "not snap" \
|
|
64
|
+
--splits 2 --group 2 \
|
|
65
|
+
-n $${PYTEST_WORKERS:-4} \
|
|
66
|
+
--cov=src --cov-branch \
|
|
67
|
+
--cov-report=term-missing \
|
|
68
|
+
--cov-report=xml \
|
|
69
|
+
--cov-append
|
|
70
|
+
@echo "━━━ Threshold checks ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
71
|
+
@uv run coverage report --fail-under=85 || \
|
|
72
|
+
(echo "❌ Total coverage below 85% threshold" && exit 1)
|
|
73
|
+
@echo "✅ Total coverage ≥ 85%"
|
|
74
|
+
@DIFF_OUT=$$(git diff --name-only origin/main... 2>&1) || \
|
|
75
|
+
{ echo "❌ git diff failed — check that origin/main is accessible"; exit 1; }; \
|
|
76
|
+
CHANGED_FILES=$$(printf '%s\n' "$$DIFF_OUT" | grep '^src/.*\.py$$' || true); \
|
|
77
|
+
if [ -z "$$CHANGED_FILES" ]; then \
|
|
78
|
+
echo "ℹ️ No source files changed — skipping patch coverage check"; \
|
|
79
|
+
else \
|
|
80
|
+
echo "Changed files:"; \
|
|
81
|
+
echo "$$CHANGED_FILES" | sed 's/^/ - /'; \
|
|
82
|
+
INCLUDE_PATTERN=$$(echo "$$CHANGED_FILES" | tr '\n' ',' | sed 's/,$$//'); \
|
|
83
|
+
uv run coverage report --include="$$INCLUDE_PATTERN" --fail-under=90 || \
|
|
84
|
+
(echo "❌ Patch coverage below 90% for changed files" && \
|
|
85
|
+
echo " Run 'make coverage-report' to see detailed coverage" && \
|
|
86
|
+
exit 1); \
|
|
87
|
+
echo "✅ Patch coverage ≥ 90%"; \
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
coverage-quick: ## Quick coverage on unit tests only (for iterative development)
|
|
91
|
+
@echo "Running unit tests with coverage..."
|
|
92
|
+
uv run pytest tests/unit \
|
|
93
|
+
-n $${PYTEST_WORKERS:-4} \
|
|
94
|
+
--cov=src --cov-branch \
|
|
95
|
+
--cov-report=term-missing \
|
|
96
|
+
--cov-report=xml
|
|
97
|
+
|
|
98
|
+
test-durations: ## Generate .test_durations for pytest-split shard balancing
|
|
99
|
+
uv run pytest tests/unit tests/integration -m "not snap" \
|
|
100
|
+
--store-durations --durations-path=.test_durations -q
|
|
101
|
+
|
|
102
|
+
test-analytics: ## Run tests with analytics output (JUnit XML)
|
|
103
|
+
@echo "Running tests with analytics output..."
|
|
104
|
+
uv run pytest tests/unit tests/integration \
|
|
105
|
+
--junitxml=test-results-local.xml \
|
|
106
|
+
-v
|
|
107
|
+
|
|
108
|
+
check-coverage: ## Validate total coverage meets 85% threshold (uses existing .coverage data)
|
|
109
|
+
@echo "Checking coverage thresholds..."
|
|
110
|
+
@uv run coverage report --fail-under=85 || \
|
|
111
|
+
(echo "❌ Coverage below 85% threshold" && exit 1)
|
|
112
|
+
@echo "✅ Coverage meets threshold"
|
|
113
|
+
|
|
114
|
+
coverage-strict: ## Strict 90% coverage check for new features
|
|
115
|
+
@echo "Checking strict coverage (90%)..."
|
|
116
|
+
@uv run coverage report --fail-under=90 || \
|
|
117
|
+
(echo "❌ Coverage below 90% - consider adding more tests" && exit 1)
|
|
118
|
+
@echo "✅ Coverage meets strict threshold"
|
|
119
|
+
|
|
120
|
+
coverage-report: ## Generate HTML coverage report and open in browser
|
|
121
|
+
@echo "Generating HTML coverage report..."
|
|
122
|
+
uv run coverage html
|
|
123
|
+
@echo "Opening coverage report in browser..."
|
|
124
|
+
@open htmlcov/index.html || xdg-open htmlcov/index.html || \
|
|
125
|
+
echo "Coverage report generated at htmlcov/index.html"
|
|
126
|
+
|
|
127
|
+
coverage-diff: ## Show coverage for changed files only
|
|
128
|
+
@echo "Showing coverage for changed files..."
|
|
129
|
+
@CHANGED_FILES=$$(git diff --name-only origin/main... | grep '\.py$$' || true); \
|
|
130
|
+
if [ -z "$$CHANGED_FILES" ]; then \
|
|
131
|
+
echo "ℹ️ No Python files changed"; \
|
|
132
|
+
else \
|
|
133
|
+
INCLUDE_PATTERN=$$(echo "$$CHANGED_FILES" | tr '\n' ',' | sed 's/,$$//'); \
|
|
134
|
+
uv run coverage report --include="$$INCLUDE_PATTERN"; \
|
|
135
|
+
fi
|
|
136
|
+
|
|
137
|
+
check-patch-coverage: ## Validate patch coverage for changed files (90% threshold, uses existing .coverage data)
|
|
138
|
+
@echo "Checking patch coverage for changed files..."
|
|
139
|
+
@DIFF_OUT=$$(git diff --name-only origin/main... 2>&1) || \
|
|
140
|
+
{ echo "❌ git diff failed — check that origin/main is accessible"; exit 1; }; \
|
|
141
|
+
CHANGED_FILES=$$(printf '%s\n' "$$DIFF_OUT" | grep '^src/.*\.py$$' || true); \
|
|
142
|
+
if [ -z "$$CHANGED_FILES" ]; then \
|
|
143
|
+
echo "ℹ️ No source files changed - skipping patch coverage check"; \
|
|
144
|
+
else \
|
|
145
|
+
echo "Changed files:"; \
|
|
146
|
+
echo "$$CHANGED_FILES" | sed 's/^/ - /'; \
|
|
147
|
+
INCLUDE_PATTERN=$$(echo "$$CHANGED_FILES" | tr '\n' ',' | sed 's/,$$//'); \
|
|
148
|
+
uv run coverage report --include="$$INCLUDE_PATTERN" --fail-under=90 || \
|
|
149
|
+
(echo "❌ Patch coverage below 90% for changed files" && \
|
|
150
|
+
echo " Run 'make coverage-report' to see detailed coverage" && \
|
|
151
|
+
exit 1); \
|
|
152
|
+
echo "✅ Patch coverage meets 90% threshold"; \
|
|
153
|
+
fi
|
|
154
|
+
|
|
155
|
+
pre-push-fast: ## Run fast checks only — format, lint, type, security, docstrings (no coverage, ~30s)
|
|
156
|
+
@echo "━━━ Format check ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
157
|
+
@$(MAKE) format-check
|
|
158
|
+
@echo "━━━ Lint ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
159
|
+
@$(MAKE) lint
|
|
160
|
+
@echo "━━━ Type check ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
161
|
+
@$(MAKE) type-check
|
|
162
|
+
@echo "━━━ Security ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
163
|
+
@$(MAKE) security
|
|
164
|
+
@echo "━━━ Docstring coverage ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
165
|
+
@$(MAKE) docstring-coverage
|
|
166
|
+
@echo "✅ Fast checks passed! Run 'make pre-push' to include coverage."
|
|
167
|
+
|
|
168
|
+
pre-push: ## Run all pre-push checks — fast checks + coverage with thresholds (mirrors CI)
|
|
169
|
+
@$(MAKE) pre-push-fast
|
|
170
|
+
@echo "━━━ Coverage + thresholds ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
171
|
+
@$(MAKE) coverage
|
|
172
|
+
@echo "✅ All pre-push checks passed!"
|
|
173
|
+
|
|
174
|
+
clean: ## Clean up cache files
|
|
175
|
+
find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
|
|
176
|
+
find . -type d -name .pytest_cache -exec rm -rf {} + 2>/dev/null || true
|
|
177
|
+
find . -type d -name .mypy_cache -exec rm -rf {} + 2>/dev/null || true
|
|
178
|
+
find . -type f -name "*.pyc" -delete 2>/dev/null || true
|
|
179
|
+
rm -f test-results*.xml coverage.xml 2>/dev/null || true
|
|
180
|
+
rm -rf htmlcov/ 2>/dev/null || true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: graphforge
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.9
|
|
4
4
|
Summary: Composable graph tooling for analysis, construction, and refinement
|
|
5
5
|
Project-URL: Homepage, https://github.com/DecisionNerd/graphforge
|
|
6
6
|
Project-URL: Repository, https://github.com/DecisionNerd/graphforge
|
|
@@ -38,7 +38,7 @@ Requires-Dist: pytest-split>=0.9.0; extra == 'dev'
|
|
|
38
38
|
Requires-Dist: pytest-timeout>=2.0; extra == 'dev'
|
|
39
39
|
Requires-Dist: pytest-xdist>=3.0; extra == 'dev'
|
|
40
40
|
Requires-Dist: pytest>=9.0.3; extra == 'dev'
|
|
41
|
-
Requires-Dist: ruff==0.15.
|
|
41
|
+
Requires-Dist: ruff==0.15.12; extra == 'dev'
|
|
42
42
|
Provides-Extra: docs
|
|
43
43
|
Requires-Dist: mkdocs-autorefs>=1.0.0; extra == 'docs'
|
|
44
44
|
Requires-Dist: mkdocs-material>=9.5.0; extra == 'docs'
|
|
@@ -84,6 +84,9 @@ Description-Content-Type: text/markdown
|
|
|
84
84
|
|
|
85
85
|
## Why GraphForge?
|
|
86
86
|
|
|
87
|
+
> *We are not building a database for applications.*
|
|
88
|
+
> *We are building a graph execution environment for thinking.*
|
|
89
|
+
|
|
87
90
|
Modern data science and ML workflows increasingly produce graph-shaped data — entity relationships extracted by LLMs, citation networks, dependency graphs, social connections, knowledge bases. Working with this data shouldn't require running a database server. GraphForge brings the full expressiveness of the openCypher query language to the Python notebook and script environment: zero configuration, single-file persistence, and first-class Python integration.
|
|
88
91
|
|
|
89
92
|
| | NetworkX | **GraphForge** | Neo4j / Memgraph |
|
|
@@ -92,19 +95,20 @@ Modern data science and ML workflows increasingly produce graph-shaped data —
|
|
|
92
95
|
| **Query language** | Python API | **Full openCypher** | Full Cypher |
|
|
93
96
|
| **Persistence** | Manual | **SQLite (automatic)** | Native |
|
|
94
97
|
| **Notebook-friendly** | ✓ | ✓ | Requires connection |
|
|
95
|
-
| **Graph size** | Millions |
|
|
98
|
+
| **Graph size** | Millions | up to ~20M edges† | Billions |
|
|
96
99
|
| **TCK compliance** | N/A | **100% (3,885/3,885)** | ~100% |
|
|
97
100
|
|
|
98
101
|
**Use GraphForge for:** knowledge graphs, citation networks, research workflows, LLM output storage, social network analysis in notebooks.
|
|
99
102
|
|
|
100
|
-
**Use a production database for:** high throughput, multi-user access, graphs
|
|
103
|
+
**Use a production database for:** high throughput, multi-user access, or graphs beyond the limits in [Scale Limits](docs/reference/scale-limits.md).
|
|
101
104
|
|
|
102
|
-
|
|
103
|
-
|
|
105
|
+
† *Traversal queries with LIMIT scale to ~20M edges; full-scan aggregations are practical up to ~1M edges.*
|
|
106
|
+
|
|
107
|
+
### v0.3.9 — Performance Release
|
|
104
108
|
|
|
105
|
-
|
|
109
|
+
v0.3.9 delivers substantial performance improvements over v0.3.8: LALR(1) linear-time parsing, O(1) property equality index, LIMIT short-circuit for traversal and UNWIND, bulk ingestion API, SQLite PRAGMA tuning, and `elementId()`. TCK compliance is maintained at **3,885/3,885 (100%)**.
|
|
106
110
|
|
|
107
|
-
|
|
111
|
+
See [CHANGELOG.md](CHANGELOG.md) for the full list of changes.
|
|
108
112
|
|
|
109
113
|
---
|
|
110
114
|
|
|
@@ -282,9 +286,6 @@ load_dataset(db, "snap-ego-facebook") # Facebook ego networks (SNAP)
|
|
|
282
286
|
load_dataset(db, "ldbc-snb-sf0.1") # Social network benchmark (LDBC)
|
|
283
287
|
load_dataset(db, "netrepo-karate") # Karate club (NetworkRepository)
|
|
284
288
|
|
|
285
|
-
# Load from URL directly
|
|
286
|
-
load_dataset(db, "https://nrvis.com/download/data/labeled/karate.zip")
|
|
287
|
-
|
|
288
289
|
# Browse available datasets
|
|
289
290
|
for ds in list_datasets(source="snap")[:3]:
|
|
290
291
|
print(f"{ds.name}: {ds.nodes:,} nodes, {ds.edges:,} edges")
|
|
@@ -300,7 +301,7 @@ results = db.execute("""
|
|
|
300
301
|
**Available sources:**
|
|
301
302
|
- **SNAP** (Stanford): 95 social, web, email, citation, and collaboration networks
|
|
302
303
|
- **LDBC**: 10 social network benchmark datasets with temporal data
|
|
303
|
-
- **NetworkRepository**: 10 pre-registered
|
|
304
|
+
- **NetworkRepository**: 10 pre-registered datasets
|
|
304
305
|
|
|
305
306
|
---
|
|
306
307
|
|
|
@@ -329,13 +330,13 @@ GraphForge is built in four independent layers:
|
|
|
329
330
|
|
|
330
331
|
```
|
|
331
332
|
┌─────────────────────────────────────────────────┐
|
|
332
|
-
│ Parser cypher.lark + parser.py
|
|
333
|
+
│ Parser cypher.lark + parser.py │ Cypher → AST
|
|
333
334
|
├─────────────────────────────────────────────────┤
|
|
334
|
-
│ Planner planner.py + operators.py
|
|
335
|
+
│ Planner planner.py + operators.py │ AST → Logical plan
|
|
335
336
|
├─────────────────────────────────────────────────┤
|
|
336
|
-
│ Executor executor.py + evaluator.py
|
|
337
|
+
│ Executor executor.py + evaluator.py │ Plan → Results
|
|
337
338
|
├─────────────────────────────────────────────────┤
|
|
338
|
-
│ Storage memory.py + sqlite_backend.py
|
|
339
|
+
│ Storage memory.py + sqlite_backend.py │ In-memory + SQLite
|
|
339
340
|
└─────────────────────────────────────────────────┘
|
|
340
341
|
```
|
|
341
342
|
|
|
@@ -367,8 +368,9 @@ make coverage
|
|
|
367
368
|
| Version | Focus | Status |
|
|
368
369
|
|---------|-------|--------|
|
|
369
370
|
| v0.3.8 | Full TCK compliance (3,885/3,885) | **Released** |
|
|
370
|
-
| v0.3.9 | Performance: LALR parser, property indexes, SQLite tuning |
|
|
371
|
-
| v0.
|
|
371
|
+
| v0.3.9 | Performance: LALR parser, property indexes, bulk ingest, SQLite tuning, LIMIT short-circuit | **Released** |
|
|
372
|
+
| v0.3.10 | Analytics integration: NetworkX/igraph export, parse/plan cache | Planned |
|
|
373
|
+
| v0.4.0 | Native SNA algorithms: PageRank, betweenness, WCC, shortest path via `CALL gf.algo.*` | Planned |
|
|
372
374
|
| v1.0 | Production-ready: thread safety, large graph support | Future |
|
|
373
375
|
|
|
374
376
|
See [CHANGELOG.md](CHANGELOG.md) for full release history.
|