graphforge 0.3.4__tar.gz → 0.3.6__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.4 → graphforge-0.3.6}/.codecov.yml +3 -1
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/workflows/test.yml +45 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/CHANGELOG.md +58 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/Makefile +22 -13
- {graphforge-0.3.4 → graphforge-0.3.6}/PKG-INFO +12 -11
- {graphforge-0.3.4 → graphforge-0.3.6}/README.md +11 -10
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/contributing.md +2 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/testing.md +68 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/implementation-status/functions.md +36 -26
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/opencypher-compatibility-matrix.md +13 -19
- {graphforge-0.3.4 → graphforge-0.3.6}/pyproject.toml +2 -1
- graphforge-0.3.6/scripts/tck_metrics.py +124 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/api.py +155 -35
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/ast/expression.py +16 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/ast/pattern.py +5 -4
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/executor/evaluator.py +1690 -206
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/executor/executor.py +8 -2
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/optimizer/optimizer.py +11 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/optimizer/predicate_utils.py +3 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/parser/cypher.lark +17 -5
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/parser/parser.py +71 -13
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/storage/memory.py +14 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/types/values.py +339 -10
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_aggregation_functions_advanced.py +3 -3
- graphforge-0.3.6/tests/integration/test_anonymous_relationships.py +75 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_column_naming.py +5 -4
- graphforge-0.3.6/tests/integration/test_compact_iso8601.py +132 -0
- graphforge-0.3.6/tests/integration/test_hex_octal_literals.py +128 -0
- graphforge-0.3.6/tests/integration/test_iana_timezones.py +102 -0
- graphforge-0.3.6/tests/integration/test_issues_271_274.py +123 -0
- graphforge-0.3.6/tests/integration/test_label_predicate.py +106 -0
- graphforge-0.3.6/tests/integration/test_math_functions_extended.py +153 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_temporal_map_constructors.py +75 -10
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_temporal_queries.py +14 -7
- graphforge-0.3.6/tests/tck/conftest.py +1089 -0
- graphforge-0.3.6/tests/unit/api/test_clear.py +254 -0
- graphforge-0.3.6/tests/unit/api/test_clone.py +248 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_aggregation_functions_advanced.py +21 -21
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_temporal_functions.py +57 -8
- graphforge-0.3.6/tests/unit/executor/test_temporal_truncate_arithmetic.py +1241 -0
- graphforge-0.3.6/tests/unit/optimizer/test_optimizer_reuse.py +129 -0
- graphforge-0.3.6/tests/unit/parser/test_hex_octal_literals.py +131 -0
- graphforge-0.3.6/tests/unit/parser/test_label_predicate_parser.py +77 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_parser.py +44 -0
- graphforge-0.3.6/tests/unit/parser/test_parser_caching.py +91 -0
- graphforge-0.3.6/tests/unit/test_iana_timezone_construction.py +35 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/uv.lock +68 -23
- graphforge-0.3.4/tests/tck/conftest.py +0 -433
- graphforge-0.3.4/tests/tck/test_official_tck.py +0 -62
- graphforge-0.3.4/tests/unit/executor/test_temporal_truncate_arithmetic.py +0 -358
- {graphforge-0.3.4 → graphforge-0.3.6}/.coderabbit.yaml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.editorconfig +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/CODEOWNERS +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/ISSUE_WORKFLOW.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/SECURITY.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/dependabot.yml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/pull_request_template.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/workflows/README.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/workflows/changelog-check.yml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/workflows/docs.yml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/workflows/pr-labeler.yml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/workflows/publish.yaml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.github/workflows/release-tracking.yml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.gitignore +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/.pre-commit-config.yaml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/CHANGELOG_v0.3.0.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/CLAUDE.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/CODE_OF_CONDUCT.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/CONTRIBUTING.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/IMPLEMENTATION_PLAN.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/LICENSE +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/RELEASING.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/coverage.json +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/architecture/ast-and-planning.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/architecture/execution-model.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/architecture/overview.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/architecture/storage-analysis.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/architecture/storage.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/community/code-of-conduct.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/community/security.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/cypher-guide.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/datasets/cypher-script-loading.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/datasets/ldbc.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/datasets/neo4j-examples.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/datasets/networkrepository.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/datasets/overview.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/datasets/snap.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/QUICKSTART_V0.2.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/codecov-integration.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/documentation-update-summary.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/phase-1a-completion-report.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/release-process.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/release-strategy.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/requirements.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-cicd-infrastructure.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-documentation.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-regression-fix.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-with-clause.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/sessions/session-2026-02-01-codecov-setup.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/sessions/session-2026-02-01-column-naming-investigation.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/sessions/session-summary.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/sessions/tck-session-2026-01-31-final.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/sessions/tck-session-2026-01-31.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/tck_baseline_analysis_v0.3.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/testing-setup-complete.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/v0.2-plan-summary.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/v0.4-revised-plan.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/development/workflow.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/getting-started/installation.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/getting-started/quickstart.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/getting-started/tutorial.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/guide/cypher-guide.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/guide/graph-construction.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/guide/overview.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/index.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/INCOMPLETE_FEATURES_ISSUES.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/README.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/RELEASE_TRACKING.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/VALIDATION_REPORT.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/api.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/changelog.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/column-naming-behavior.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/feature-aggregation-functions.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/feature-graph-queries.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/feature-graph-schema.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/feature-mapping/clause-to-tck.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/feature-mapping/function-to-tck.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/feature-order-by.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/feature-return-aliasing.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/implementation-status/clauses.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/implementation-status/operators.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/implementation-status/patterns.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/opencypher-compatibility.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/opencypher-features/01-clauses.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/opencypher-features/02-functions.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/opencypher-features/03-operators.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/opencypher-features/04-patterns.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/opencypher-features/05-data-types.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/tck-compliance.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/reference/tck-inventory.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/releases/implementation-summary.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/releases/next-steps.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/releases/phase-1-complete.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/releases/phase-2-complete.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/releases/phase-3-complete.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/releases/roadmap.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/stylesheets/extra.css +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/docs/use-cases/agent-grounding.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/examples/01_social_network.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/examples/02_knowledge_graph.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/examples/03_data_lineage.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/examples/04_citation_network.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/examples/05_migration_from_networkx.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/examples/agent_grounding/ecommerce_agent.ipynb +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/examples/basic_graph.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/examples/basic_usage.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/mkdocs.yml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/scripts/build_feature_graph.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/scripts/bump_version.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/scripts/check_release_needed.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/scripts/inventory_tck.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/scripts/pre-push-check.sh +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/scripts/validate_datasets.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/ast/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/ast/clause.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/ast/query.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/base.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/data/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/data/networkrepository.json +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/data/snap.json +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/exporters/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/exporters/json_graph.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/formats/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/formats/json_graph.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/loaders/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/loaders/compression.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/loaders/csv.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/loaders/cypher.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/loaders/graphml.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/loaders/json_graph.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/loaders/ldbc.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/loaders/ldbc_schema.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/registry.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/sources/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/sources/graphml.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/sources/json_graph.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/sources/ldbc.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/sources/networkrepository.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/datasets/sources/snap.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/executor/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/optimizer/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/optimizer/cost_model.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/optimizer/join_reorder.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/optimizer/statistics.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/parser/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/planner/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/planner/operators.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/planner/planner.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/planner/types.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/storage/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/storage/pydantic_serialization.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/storage/serialization.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/storage/sqlite_backend.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/types/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/src/graphforge/types/graph.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/README.md +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/conftest.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/conftest.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/datasets/test_compression.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/datasets/test_cypher_loader_docs.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/datasets/test_end_to_end_workflows.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/datasets/test_json_graph_roundtrip.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/datasets/test_ldbc_loader.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/datasets/test_networkrepository_loader.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/executor/test_graph_functions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_aggregation_edge_cases.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_arithmetic.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_builder_api.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_call_subqueries.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_case_expressions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_collect.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_complex_merge_patterns.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_complex_where_predicates.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_create_clause.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_create_edge_cases.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_delete_null.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_detach_delete.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_distinct_clause.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_e2e_queries.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_executor_edge_cases.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_exists_is_empty.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_id_function.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_label_disjunction.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_list_comprehension.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_list_functions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_list_operations.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_list_path_overloading.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_list_subscript.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_logical_operators.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_match_create.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_math_functions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_merge_edge_cases.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_merge_on_create_real.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_merge_on_match_real.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_null_handling.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_optimizer_aggregate_pushdown.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_optimizer_integration.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_optimizer_redundant_elimination.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_optional_match.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_optional_match_delete.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_path_binding.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_path_binding_variable_length.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_path_functions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_pattern_comprehension.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_pattern_predicates.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_persistence.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_power_operator.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_predicate_functions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_relationship_directions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_remove_clause.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_set_delete_merge.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_size_function.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_snap_dataset_loading.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_sort_after_aggregation.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_spatial_api.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_sqlite_persistence.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_string_functions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_string_functions_new.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_string_matching.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_subquery_expressions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_transactions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_type_functions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_union.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_unwind.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_variable_length_paths.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_wildcard_execution.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_with_aggregation_real.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_with_clause.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_with_clause_modifiers.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_with_distinct_skip_limit.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/integration/test_xor_operator.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/property/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/property/strategies.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/coverage_matrix.json +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/download_tck.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/Aggregation1_BasicAggregation.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/Match1_SimpleMatches.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match8.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match9.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge8.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge9.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/remove/Remove1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/remove/Remove2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/remove/Remove3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return8.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/union/Union1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/union/Union2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/union/Union3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/unwind/Unwind1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation8.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/conditional/Conditional1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/conditional/Conditional2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph8.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph9.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List10.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List11.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List12.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List8.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List9.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals8.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/map/Map1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/map/Map2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/map/Map3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical10.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical11.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical12.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical13.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical14.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical15.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical16.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical17.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical8.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical9.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/null/Null1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/null/Null2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/null/Null3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/path/Path1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/path/Path2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/path/Path3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/pattern/Pattern1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/pattern/Pattern2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier10.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier11.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier12.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier8.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier9.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String10.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String11.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String12.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String13.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String14.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String8.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String9.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal10.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal7.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal8.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal9.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion2.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion3.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion4.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion5.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion6.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/features/official/useCases/triadicSelection/TriadicSelection1.feature +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-1/binary-tree-1.cypher +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-1/binary-tree-1.json +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-2/binary-tree-2.cypher +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-2/binary-tree-2.json +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/graphs/named-graphs.adoc +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/tck_config.yaml +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/tck_markers.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/test_features.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/tck/test_tck_compliance.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/api/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/api/test_cypher_value_conversion.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/ast/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/ast/test_ast_nodes.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/test_csv_loader.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/test_cypher_loader.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/test_json_graph_format.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/test_ldbc_schema.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/test_networkrepository.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/test_registry.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/test_snap_datasets.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/datasets/test_sources_registration.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_aggregation_errors.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_arithmetic_evaluator.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_evaluator.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_evaluator_additional_coverage.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_evaluator_error_paths.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_executor_error_paths.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_expression_matching.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_expressions_match.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_graph_functions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_id_function.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_in_operator.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_list_functions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_list_functions_errors.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_map_property_access.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_merge_on_create.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_merge_on_match.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_multihop_create.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_optional_scan_coverage.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_path_functions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_sort_edge_cases.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_spatial_functions.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_string_functions_new.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_string_matching_evaluator.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_subquery_planner_check.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_three_valued_logic.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_type_conversion_complex.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_undirected_relationship_bugs.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/executor/test_with_aggregation.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/optimizer/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/optimizer/test_aggregate_pushdown.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/optimizer/test_cost_model.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/optimizer/test_filter_pushdown.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/optimizer/test_join_reorder.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/optimizer/test_predicate_reorder.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/optimizer/test_predicate_utils.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/optimizer/test_redundant_elimination.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/optimizer/test_statistics.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_arithmetic_parser.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_case_parser.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_collect_parser.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_delete_parser.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_grammar.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_merge_on_create.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_merge_on_match.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_optional_match_delete.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_path_binding.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_pattern_predicates.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_remove_parser.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_string_matching_parser.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_wildcard_parsing.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/parser/test_with_at_query_start.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/planner/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/planner/test_expand_multi_hop_operator.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/planner/test_operator_validation.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/planner/test_operators.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/planner/test_planner_branch_coverage.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/planner/test_planner_comprehensive.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/planner/test_planner_edge_cases.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/planner/test_remove_planner.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/planner/test_type_tracking.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/planner/test_with_validation.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/storage/__init__.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/storage/test_graph_edge_cases.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/storage/test_memory_store.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/storage/test_pydantic_serialization.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/storage/test_serialization_edge_cases.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/storage/test_spatial_serialization.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/storage/test_sqlite_backend_adjacency.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/storage/test_temporal_serialization.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/test_graph_elements.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/test_values.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/types/test_cypher_values_deep_equality.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/types/test_cypher_values_edge_cases.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/types/test_graph_element_edge_cases.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/types/test_path_values.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/types/test_spatial_values.py +0 -0
- {graphforge-0.3.4 → graphforge-0.3.6}/tests/unit/types/test_temporal_values.py +0 -0
|
@@ -23,7 +23,7 @@ coverage:
|
|
|
23
23
|
range: "70...95" # Coverage range (red to green)
|
|
24
24
|
|
|
25
25
|
comment:
|
|
26
|
-
layout: "header, diff, flags, components, footer"
|
|
26
|
+
layout: "header, diff, flags, components, footer, tests"
|
|
27
27
|
behavior: default # Comment on every PR
|
|
28
28
|
require_changes: false # Always comment, even if no changes
|
|
29
29
|
|
|
@@ -32,6 +32,8 @@ flags:
|
|
|
32
32
|
paths:
|
|
33
33
|
- src/
|
|
34
34
|
carryforward: true # Use previous coverage if job fails
|
|
35
|
+
tck-compliance:
|
|
36
|
+
carryforward: true # Show previous TCK results if job skipped
|
|
35
37
|
|
|
36
38
|
component_management:
|
|
37
39
|
individual_components:
|
|
@@ -124,6 +124,51 @@ jobs:
|
|
|
124
124
|
- name: Run bandit security scanner
|
|
125
125
|
run: uv run bandit -c pyproject.toml -r src/
|
|
126
126
|
|
|
127
|
+
tck-regression:
|
|
128
|
+
name: TCK OpenCypher Compliance
|
|
129
|
+
runs-on: ubuntu-latest
|
|
130
|
+
|
|
131
|
+
steps:
|
|
132
|
+
- name: Checkout code
|
|
133
|
+
uses: actions/checkout@v6
|
|
134
|
+
|
|
135
|
+
- name: Install uv
|
|
136
|
+
uses: astral-sh/setup-uv@v7
|
|
137
|
+
|
|
138
|
+
- name: Set up Python
|
|
139
|
+
uses: actions/setup-python@v6
|
|
140
|
+
with:
|
|
141
|
+
python-version: "3.12"
|
|
142
|
+
|
|
143
|
+
- name: Install dependencies
|
|
144
|
+
run: uv sync --all-extras
|
|
145
|
+
|
|
146
|
+
- name: Run TCK tests (parallel)
|
|
147
|
+
id: tck_tests
|
|
148
|
+
continue-on-error: true
|
|
149
|
+
run: uv run pytest tests/tck/ -n auto -v --junitxml=test-results-tck.xml
|
|
150
|
+
|
|
151
|
+
- name: Report TCK compliance metrics
|
|
152
|
+
if: always()
|
|
153
|
+
run: uv run python3 scripts/tck_metrics.py test-results-tck.xml
|
|
154
|
+
|
|
155
|
+
- name: Upload TCK results to Codecov
|
|
156
|
+
uses: codecov/codecov-action@v5
|
|
157
|
+
if: always()
|
|
158
|
+
with:
|
|
159
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
160
|
+
files: test-results-tck.xml
|
|
161
|
+
flags: tck-compliance
|
|
162
|
+
report_type: test_results
|
|
163
|
+
fail_ci_if_error: false
|
|
164
|
+
|
|
165
|
+
- name: Upload TCK results artifact
|
|
166
|
+
uses: actions/upload-artifact@v4
|
|
167
|
+
if: always()
|
|
168
|
+
with:
|
|
169
|
+
name: tck-test-results
|
|
170
|
+
path: test-results-tck.xml
|
|
171
|
+
|
|
127
172
|
coverage:
|
|
128
173
|
name: Coverage Report
|
|
129
174
|
runs-on: ubuntu-latest
|
|
@@ -5,6 +5,64 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.3.6] - 2026-02-28
|
|
9
|
+
|
|
10
|
+
### Fixed - TCK Harness Correctness
|
|
11
|
+
- **Integer property comparison** (#252) — TCK harness was comparing integer properties as strings, causing ~423 false failures; now coerced correctly
|
|
12
|
+
- **Map literal value coercion** (#261) — `_parse_map_literal` in conftest now coerces numeric string values, fixing ~30 false failures
|
|
13
|
+
|
|
14
|
+
### Fixed - Temporal Correctness
|
|
15
|
+
- **`date({})` / `datetime({})` / `time({})` map constructors** (#253, #268) — component validation, UTC defaults, and function-as-argument parsing
|
|
16
|
+
- **`UnexpectedEOF` on duration/datetime literals** (#254) — parser now handles all ISO 8601 duration and datetime forms
|
|
17
|
+
- **Timezone offset `+HH:MM` parsing** (#255) — `+HH:MM` and `-HH:MM` offsets now parsed correctly
|
|
18
|
+
- **Date map constructor component validation** (#256) — out-of-range components raise `ValueError`
|
|
19
|
+
- **`datetime(string)` defaults to UTC** (#276) — string datetimes without timezone now default to UTC per spec
|
|
20
|
+
- **Map constructor omitted components default to 1** (#278) — `date({year: 2015})` → `2015-01-01`, not error
|
|
21
|
+
- **`TRUNCATE` units: week, weekYear, quarter, decade, century, millennium** (#269) — all truncation units now return correct values
|
|
22
|
+
- **Week-based and select-form datetime constructors** (#270) — `datetime({week: 30, ...})` and similar forms return correct values
|
|
23
|
+
- **Duration serialization, comparison, multiplication, and fractional arithmetic** (#271) — full duration correctness including `duration.between()`
|
|
24
|
+
- **`datetime(aDatetime)` type coercion** (#274) — coercing datetime subtypes no longer conflicts with `:E` label parser token
|
|
25
|
+
- **Compact ISO 8601 date/datetime string formats** (#273) — ordinal (`YYYY-DDD`, `YYYYDDD`), week date (`YYYY-Www[-D]`), year-month (`YYYY-MM`, `YYYYMM`), and year-only (`YYYY`) all parsed correctly
|
|
26
|
+
- **IANA timezone names** (#272) — `[Region/City]` suffix in datetime strings is parsed; IANA zone is authoritative over explicit offset; historical second-precision offsets (e.g. `+00:53:28`) handled correctly
|
|
27
|
+
|
|
28
|
+
### TCK Coverage
|
|
29
|
+
- **2,507 passing** (up from ~1,694 at v0.3.5) — +813 net new passing scenarios
|
|
30
|
+
- Theme: all temporal TCK scenarios now pass; harness accuracy fully corrected
|
|
31
|
+
|
|
32
|
+
## [0.3.5] - 2026-02-19
|
|
33
|
+
|
|
34
|
+
### Added - Math Functions (#195, #196, #197)
|
|
35
|
+
- **sqrt(x)** - Square root function
|
|
36
|
+
- Returns `CypherFloat`; negative input returns `null`; null propagation
|
|
37
|
+
- Example: `RETURN sqrt(4) AS r` → `2.0`
|
|
38
|
+
- **rand()** - Random float in [0.0, 1.0)
|
|
39
|
+
- Takes no arguments; returns a new `CypherFloat` each call
|
|
40
|
+
- Example: `RETURN rand() * 100 AS r`
|
|
41
|
+
- **pow(base, exponent)** - Exponentiation function
|
|
42
|
+
- Consistent with `^` operator: `pow(2, 3) = 2^3 = 8`
|
|
43
|
+
- Null propagation for both arguments
|
|
44
|
+
- Example: `RETURN pow(2, 10) AS r` → `1024`
|
|
45
|
+
|
|
46
|
+
### Fixed - Aggregation Function Tests (#201, #202, #203, #204)
|
|
47
|
+
- Fixed ~24 syntax bugs (`RETURNfunc(` → `RETURN func(`) in aggregation test files
|
|
48
|
+
- `percentileDisc()`, `percentileCont()`, `stDev()`, `stDevP()` were already implemented; tests now pass
|
|
49
|
+
- Updated docs to reflect all four as COMPLETE
|
|
50
|
+
|
|
51
|
+
### Added - TCK Step Definitions (#237)
|
|
52
|
+
- Added 5 missing pytest-bdd step definitions unblocking ~129 previously failing TCK scenarios:
|
|
53
|
+
- `executing control query:` — alias for `executing query:`
|
|
54
|
+
- `the result should be (ignoring element order for lists):` — row comparison with sorted list values
|
|
55
|
+
- `the result should be, in order (ignoring element order for lists):` — ordered variant
|
|
56
|
+
- `parameters are:` — parses datatable, substitutes `$param` references in queries
|
|
57
|
+
- `there exists a procedure` — marked `xfail` (CALL procedures tracked for v0.3.6 in #190)
|
|
58
|
+
- Extended `_parse_value()` to handle list literals like `['Foo', 'Bar']`
|
|
59
|
+
- Extended `_row_to_comparable()` to handle `CypherList` values
|
|
60
|
+
|
|
61
|
+
### Implementation Status Updates
|
|
62
|
+
- Math functions: `sqrt`, `rand`, `pow` now COMPLETE (was NOT_IMPLEMENTED)
|
|
63
|
+
- Aggregation functions: `percentileDisc`, `percentileCont`, `stDev`, `stDevP` now COMPLETE
|
|
64
|
+
- TCK pass rate: +129 passing scenarios, +50 xfailed (procedure CALL)
|
|
65
|
+
|
|
8
66
|
## [0.3.4] - 2026-02-18
|
|
9
67
|
|
|
10
68
|
### Added - Power Arithmetic Operator (#213)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.PHONY: help lint format type-check security test pre-push clean
|
|
1
|
+
.PHONY: help lint format type-check security test pre-push clean test-tck docstring-coverage test-network
|
|
2
2
|
|
|
3
3
|
help: ## Show this help message
|
|
4
4
|
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
|
@@ -18,24 +18,31 @@ type-check: ## Run mypy type checker
|
|
|
18
18
|
security: ## Run Bandit security scanner
|
|
19
19
|
uv run bandit -c pyproject.toml -r src/
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
uv run
|
|
21
|
+
docstring-coverage: ## Check docstring coverage (90% minimum)
|
|
22
|
+
uv run interrogate src/graphforge --fail-under 90 --quiet
|
|
23
23
|
|
|
24
|
-
test
|
|
25
|
-
uv run pytest tests/
|
|
24
|
+
test: ## Run all tests in parallel (excludes snap/network downloads)
|
|
25
|
+
uv run pytest tests/ -n auto -m "not snap"
|
|
26
26
|
|
|
27
|
-
test-
|
|
28
|
-
uv run pytest tests/
|
|
27
|
+
test-unit: ## Run unit tests in parallel
|
|
28
|
+
uv run pytest tests/unit -n auto
|
|
29
|
+
|
|
30
|
+
test-integration: ## Run integration tests in parallel (excludes snap/network downloads)
|
|
31
|
+
uv run pytest tests/integration -n auto -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-tck: ## Run TCK compliance tests in parallel
|
|
37
|
+
uv run pytest tests/tck/ -n auto -v
|
|
29
38
|
|
|
30
39
|
coverage: ## Run tests with coverage measurement
|
|
31
40
|
@echo "Running tests with coverage..."
|
|
32
|
-
uv run pytest tests/unit tests/integration \
|
|
41
|
+
uv run pytest tests/unit tests/integration -m "not snap" \
|
|
33
42
|
--cov=src \
|
|
34
43
|
--cov-branch \
|
|
35
44
|
--cov-report=term-missing \
|
|
36
|
-
--cov-report=xml
|
|
37
|
-
--cov-report=html \
|
|
38
|
-
-n auto
|
|
45
|
+
--cov-report=xml
|
|
39
46
|
|
|
40
47
|
test-analytics: ## Run tests with analytics output (JUnit XML)
|
|
41
48
|
@echo "Running tests with analytics output..."
|
|
@@ -55,7 +62,9 @@ coverage-strict: ## Strict 90% coverage check for new features
|
|
|
55
62
|
(echo "❌ Coverage below 90% - consider adding more tests" && exit 1)
|
|
56
63
|
@echo "✅ Coverage meets strict threshold"
|
|
57
64
|
|
|
58
|
-
coverage-report: ##
|
|
65
|
+
coverage-report: ## Generate HTML coverage report and open in browser
|
|
66
|
+
@echo "Generating HTML coverage report..."
|
|
67
|
+
uv run coverage html
|
|
59
68
|
@echo "Opening coverage report in browser..."
|
|
60
69
|
@open htmlcov/index.html || xdg-open htmlcov/index.html || \
|
|
61
70
|
echo "Coverage report generated at htmlcov/index.html"
|
|
@@ -86,7 +95,7 @@ check-patch-coverage: ## Validate patch coverage for changed files (90% thresho
|
|
|
86
95
|
echo "✅ Patch coverage meets 90% threshold"; \
|
|
87
96
|
fi
|
|
88
97
|
|
|
89
|
-
pre-push: format-check lint type-check security coverage check-coverage check-patch-coverage ## Run all pre-push checks (mirrors CI)
|
|
98
|
+
pre-push: format-check lint type-check security docstring-coverage coverage check-coverage check-patch-coverage ## Run all pre-push checks (mirrors CI)
|
|
90
99
|
@echo "✅ All pre-push checks passed!"
|
|
91
100
|
|
|
92
101
|
clean: ## Clean up cache files
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: graphforge
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
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
|
|
@@ -98,25 +98,23 @@ Modern data science and ML workflows increasingly produce **graph-shaped data**
|
|
|
98
98
|
> *We are not building a database for applications.*
|
|
99
99
|
> *We are building a graph execution environment for thinking.*
|
|
100
100
|
|
|
101
|
-
### Latest Release: v0.3.
|
|
101
|
+
### Latest Release: v0.3.6
|
|
102
102
|
|
|
103
|
-
Version 0.3.
|
|
103
|
+
Version 0.3.6 is a correctness release — all temporal TCK scenarios now pass and the TCK harness is fully accurate:
|
|
104
104
|
|
|
105
|
-
- **
|
|
106
|
-
- **
|
|
107
|
-
-
|
|
108
|
-
- **List operations**: List slicing `[start..end]` and negative indexing `list[-1]` (already implemented, now documented)
|
|
109
|
-
- **Comprehensive testing**: 79 new integration tests (18 string, 22 XOR, 39 power)
|
|
110
|
-
- **Operator completion**: List operators 100% (5/5), Overall operators 94% (32/34, up from 88%)
|
|
111
|
-
- **Function progress**: 56/72 functions (78%, up from 76%)
|
|
105
|
+
- **Temporal correctness**: compact ISO 8601 formats, IANA timezone names, `TRUNCATE` units, duration arithmetic, map constructors — all fixed
|
|
106
|
+
- **TCK harness**: integer/map literal coercion bugs fixed, eliminating ~450 false failures
|
|
107
|
+
- **+813 net new passing TCK scenarios**: 2,507 passing (up from 1,694 at v0.3.5)
|
|
112
108
|
|
|
113
109
|
**Previous Releases**:
|
|
110
|
+
- **v0.3.5**: `sqrt()`, `rand()`, `pow()`, aggregation function fixes, 5 TCK step definitions (+129 scenarios)
|
|
111
|
+
- **v0.3.4**: `toUpper()`/`toLower()` aliases, `XOR` operator, `^` power operator, list slicing docs
|
|
114
112
|
- **v0.3.3**: Pattern comprehensions, CALL subqueries, Pattern predicates
|
|
115
113
|
- **v0.3.2**: List operations (`filter()`, `extract()`, `reduce()`)
|
|
116
114
|
- **v0.3.1**: Quantifier functions (`all()`, `any()`, `none()`, `single()`), `exists()`, `isEmpty()`
|
|
117
115
|
- **v0.3.0**: OPTIONAL MATCH, UNION, List comprehensions, EXISTS/COUNT subqueries, Variable-length paths, 109+ datasets
|
|
118
116
|
|
|
119
|
-
**TCK Coverage**: ~
|
|
117
|
+
**TCK Coverage**: ~64% of collected scenarios passing (2,507 / 3,885)
|
|
120
118
|
|
|
121
119
|
See [CHANGELOG.md](CHANGELOG.md) for complete release notes.
|
|
122
120
|
|
|
@@ -1415,7 +1413,9 @@ GraphForge implements a **practical subset of OpenCypher** focused on common gra
|
|
|
1415
1413
|
|
|
1416
1414
|
**Functions:**
|
|
1417
1415
|
- String: length, substring, toUpper/toLower (both camelCase and UPPERCASE variants), trim, reverse, split, replace, left, right, ltrim, rtrim
|
|
1416
|
+
- Math: abs, ceil, floor, round, sign, sqrt, rand, pow
|
|
1418
1417
|
- Type conversion: toInteger, toFloat, toString, toBoolean
|
|
1418
|
+
- Aggregation: count, sum, avg, min, max, collect, percentileDisc, percentileCont, stDev, stDevP
|
|
1419
1419
|
- Spatial: point, distance
|
|
1420
1420
|
- Temporal: date, datetime, time, duration
|
|
1421
1421
|
- Graph: id, labels, type
|
|
@@ -1460,6 +1460,7 @@ GraphForge tracks compliance using the openCypher Technology Compatibility Kit (
|
|
|
1460
1460
|
| v0.1.4 | 1,277/7,722 | 16.5% |
|
|
1461
1461
|
| v0.2.0 | ~1,900/7,722 | ~25% |
|
|
1462
1462
|
| v0.3.0 | ~3,000/7,722 | ~39% |
|
|
1463
|
+
| v0.3.5 | 1,694/3,885 collected | ~44% collected |
|
|
1463
1464
|
| v0.4.0 (target) | ~4,250/7,722 | ~55% |
|
|
1464
1465
|
| v0.5.0 (target) | ~5,400/7,722 | ~70% |
|
|
1465
1466
|
| v0.6.0 (target) | ~6,300/7,722 | ~82% |
|
|
@@ -52,25 +52,23 @@ Modern data science and ML workflows increasingly produce **graph-shaped data**
|
|
|
52
52
|
> *We are not building a database for applications.*
|
|
53
53
|
> *We are building a graph execution environment for thinking.*
|
|
54
54
|
|
|
55
|
-
### Latest Release: v0.3.
|
|
55
|
+
### Latest Release: v0.3.6
|
|
56
56
|
|
|
57
|
-
Version 0.3.
|
|
57
|
+
Version 0.3.6 is a correctness release — all temporal TCK scenarios now pass and the TCK harness is fully accurate:
|
|
58
58
|
|
|
59
|
-
- **
|
|
60
|
-
- **
|
|
61
|
-
-
|
|
62
|
-
- **List operations**: List slicing `[start..end]` and negative indexing `list[-1]` (already implemented, now documented)
|
|
63
|
-
- **Comprehensive testing**: 79 new integration tests (18 string, 22 XOR, 39 power)
|
|
64
|
-
- **Operator completion**: List operators 100% (5/5), Overall operators 94% (32/34, up from 88%)
|
|
65
|
-
- **Function progress**: 56/72 functions (78%, up from 76%)
|
|
59
|
+
- **Temporal correctness**: compact ISO 8601 formats, IANA timezone names, `TRUNCATE` units, duration arithmetic, map constructors — all fixed
|
|
60
|
+
- **TCK harness**: integer/map literal coercion bugs fixed, eliminating ~450 false failures
|
|
61
|
+
- **+813 net new passing TCK scenarios**: 2,507 passing (up from 1,694 at v0.3.5)
|
|
66
62
|
|
|
67
63
|
**Previous Releases**:
|
|
64
|
+
- **v0.3.5**: `sqrt()`, `rand()`, `pow()`, aggregation function fixes, 5 TCK step definitions (+129 scenarios)
|
|
65
|
+
- **v0.3.4**: `toUpper()`/`toLower()` aliases, `XOR` operator, `^` power operator, list slicing docs
|
|
68
66
|
- **v0.3.3**: Pattern comprehensions, CALL subqueries, Pattern predicates
|
|
69
67
|
- **v0.3.2**: List operations (`filter()`, `extract()`, `reduce()`)
|
|
70
68
|
- **v0.3.1**: Quantifier functions (`all()`, `any()`, `none()`, `single()`), `exists()`, `isEmpty()`
|
|
71
69
|
- **v0.3.0**: OPTIONAL MATCH, UNION, List comprehensions, EXISTS/COUNT subqueries, Variable-length paths, 109+ datasets
|
|
72
70
|
|
|
73
|
-
**TCK Coverage**: ~
|
|
71
|
+
**TCK Coverage**: ~64% of collected scenarios passing (2,507 / 3,885)
|
|
74
72
|
|
|
75
73
|
See [CHANGELOG.md](CHANGELOG.md) for complete release notes.
|
|
76
74
|
|
|
@@ -1369,7 +1367,9 @@ GraphForge implements a **practical subset of OpenCypher** focused on common gra
|
|
|
1369
1367
|
|
|
1370
1368
|
**Functions:**
|
|
1371
1369
|
- String: length, substring, toUpper/toLower (both camelCase and UPPERCASE variants), trim, reverse, split, replace, left, right, ltrim, rtrim
|
|
1370
|
+
- Math: abs, ceil, floor, round, sign, sqrt, rand, pow
|
|
1372
1371
|
- Type conversion: toInteger, toFloat, toString, toBoolean
|
|
1372
|
+
- Aggregation: count, sum, avg, min, max, collect, percentileDisc, percentileCont, stDev, stDevP
|
|
1373
1373
|
- Spatial: point, distance
|
|
1374
1374
|
- Temporal: date, datetime, time, duration
|
|
1375
1375
|
- Graph: id, labels, type
|
|
@@ -1414,6 +1414,7 @@ GraphForge tracks compliance using the openCypher Technology Compatibility Kit (
|
|
|
1414
1414
|
| v0.1.4 | 1,277/7,722 | 16.5% |
|
|
1415
1415
|
| v0.2.0 | ~1,900/7,722 | ~25% |
|
|
1416
1416
|
| v0.3.0 | ~3,000/7,722 | ~39% |
|
|
1417
|
+
| v0.3.5 | 1,694/3,885 collected | ~44% collected |
|
|
1417
1418
|
| v0.4.0 (target) | ~4,250/7,722 | ~55% |
|
|
1418
1419
|
| v0.5.0 (target) | ~5,400/7,722 | ~70% |
|
|
1419
1420
|
| v0.6.0 (target) | ~6,300/7,722 | ~82% |
|
|
@@ -59,6 +59,8 @@ make test
|
|
|
59
59
|
# Run specific categories
|
|
60
60
|
make test-unit # Fast unit tests only
|
|
61
61
|
make test-integration # Integration tests only
|
|
62
|
+
make test-tck # TCK compliance tests
|
|
63
|
+
make test-tck-parallel # TCK tests in parallel (faster, uses all CPU cores)
|
|
62
64
|
|
|
63
65
|
# Run with coverage reporting
|
|
64
66
|
make coverage # Run tests + generate coverage reports
|
|
@@ -346,6 +346,9 @@ pytest tests/unit/test_data_model.py::test_node_ref_equality
|
|
|
346
346
|
# Run in parallel (with pytest-xdist)
|
|
347
347
|
pytest -n auto
|
|
348
348
|
|
|
349
|
+
# Run TCK tests in parallel (recommended for large TCK suite)
|
|
350
|
+
make test-tck-parallel # or: pytest tests/tck/ -n auto
|
|
351
|
+
|
|
349
352
|
# Run with verbose output
|
|
350
353
|
pytest -vv
|
|
351
354
|
|
|
@@ -621,6 +624,71 @@ pip install -e ".[dev]"
|
|
|
621
624
|
|
|
622
625
|
---
|
|
623
626
|
|
|
627
|
+
## Known Issues & Investigated Solutions
|
|
628
|
+
|
|
629
|
+
### pytest-xdist + pytest-cov deadlock on macOS / Python 3.13
|
|
630
|
+
|
|
631
|
+
**Symptom:** `make pre-push` (or any `pytest -n auto --cov=...` invocation) hangs
|
|
632
|
+
indefinitely at the very end of the test run. Progress reaches ~100% then freezes.
|
|
633
|
+
CPU drops to 0%. Only `kill` escapes it.
|
|
634
|
+
|
|
635
|
+
**Root cause:** `pytest-cov` collects coverage data from xdist workers via IPC
|
|
636
|
+
(inter-process communication sockets). When workers finish and close their sockets,
|
|
637
|
+
a coverage data-collection thread in the main process is still blocked on `read()`.
|
|
638
|
+
The main thread waits for that lock → deadlock. Confirmed via `sample <PID>`:
|
|
639
|
+
```
|
|
640
|
+
main thread: lock_PyThread_acquire_lock → _PyMutex_LockTimed → _PySemaphore_Wait
|
|
641
|
+
worker thread: read() (44020 calls pending)
|
|
642
|
+
```
|
|
643
|
+
Reproduced consistently on macOS (Darwin 25.x) + Python 3.13.7 + pytest-cov 7.0.0 +
|
|
644
|
+
pytest-xdist 3.x. Not observed on Linux CI.
|
|
645
|
+
|
|
646
|
+
**What does NOT work:**
|
|
647
|
+
|
|
648
|
+
| Attempted fix | Result |
|
|
649
|
+
|---|---|
|
|
650
|
+
| `--cov-report=html` alone | Still deadlocks; HTML is slow but not the cause |
|
|
651
|
+
| `[tool.coverage.run] parallel = true` + `-n auto` | No deadlock but **2× slower** (3:54 vs 1:30) — per-process `.coverage.PID` file I/O overwhelms the speedup from parallelism |
|
|
652
|
+
| `concurrency = ["multiprocessing", "thread"]` + `parallel = true` | Same outcome as above; requires `coverage combine` step which adds no benefit |
|
|
653
|
+
|
|
654
|
+
**Solution (current `Makefile`):** Run coverage serially (no `-n auto`) and exclude
|
|
655
|
+
the two other causes of slowdown:
|
|
656
|
+
|
|
657
|
+
```makefile
|
|
658
|
+
coverage:
|
|
659
|
+
uv run pytest tests/unit tests/integration -m "not snap" \
|
|
660
|
+
--cov=src \
|
|
661
|
+
--cov-branch \
|
|
662
|
+
--cov-report=term-missing \
|
|
663
|
+
--cov-report=xml
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
Key flags:
|
|
667
|
+
- **No `-n auto`** — eliminates the IPC deadlock entirely.
|
|
668
|
+
- **`-m "not snap"`** — skips SNAP network-dataset tests (they download files, run
|
|
669
|
+
alphabetically last, and are already skipped in CI per their marker description).
|
|
670
|
+
- **No `--cov-report=html`** — HTML generation over ~13 k lines of source is slow;
|
|
671
|
+
use `make coverage-report` on demand instead.
|
|
672
|
+
|
|
673
|
+
**Timing (Apple Silicon, Python 3.13, ~3 450 tests):**
|
|
674
|
+
|
|
675
|
+
| Approach | Wall time |
|
|
676
|
+
|---|---|
|
|
677
|
+
| `-n auto`, no coverage (baseline) | ~91 s |
|
|
678
|
+
| `-n auto` + `--cov` (original, pre-fix) | ∞ (deadlock) |
|
|
679
|
+
| `-n auto` + `--cov` + `parallel=true` | ~234 s |
|
|
680
|
+
| Serial `--cov`, `-m "not snap"`, no HTML (current) | ~150 s |
|
|
681
|
+
|
|
682
|
+
The serial run is only ~60 s slower than the parallel baseline because coverage
|
|
683
|
+
overhead is modest (~38 s) and `parallel=true` file-I/O costs more than it saves.
|
|
684
|
+
|
|
685
|
+
**If this is re-investigated in the future:** the deadlock is a known upstream issue
|
|
686
|
+
between pytest-cov and pytest-xdist on Python 3.13's stricter GIL/semaphore
|
|
687
|
+
behaviour. Check the [pytest-cov changelog](https://pytest-cov.readthedocs.io/) for
|
|
688
|
+
a fix before attempting another workaround.
|
|
689
|
+
|
|
690
|
+
---
|
|
691
|
+
|
|
624
692
|
## Success Metrics
|
|
625
693
|
|
|
626
694
|
The testing infrastructure is successful when:
|
|
@@ -14,15 +14,15 @@ Implementation status of OpenCypher built-in functions in GraphForge.
|
|
|
14
14
|
| Category | Total Functions | Complete | Partial | Not Implemented |
|
|
15
15
|
|----------|----------------|----------|---------|-----------------|
|
|
16
16
|
| String | 13 | 13 (100%) | 0 (0%) | 0 (0%) |
|
|
17
|
-
| Numeric | 10 |
|
|
17
|
+
| Numeric | 10 | 10 (100%) | 0 (0%) | 0 (0%) |
|
|
18
18
|
| List | 8 | 7 (88%) | 0 (0%) | 1 (12%) |
|
|
19
|
-
| Aggregation | 10 |
|
|
19
|
+
| Aggregation | 10 | 9 (90%) | 0 (0%) | 1 (10%) |
|
|
20
20
|
| Predicate | 6 | 6 (100%) | 0 (0%) | 0 (0%) |
|
|
21
21
|
| Scalar | 9 | 8 (89%) | 0 (0%) | 1 (11%) |
|
|
22
22
|
| Temporal | 11 | 11 (100%) | 0 (0%) | 0 (0%) |
|
|
23
23
|
| Spatial | 2 | 2 (100%) | 0 (0%) | 0 (0%) |
|
|
24
24
|
| Path | 3 | 3 (100%) | 0 (0%) | 0 (0%) |
|
|
25
|
-
| **TOTAL** | **72** | **
|
|
25
|
+
| **TOTAL** | **72** | **65 (90%)** | **0 (0%)** | **7 (10%)** |
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
@@ -119,17 +119,26 @@ Implementation status of OpenCypher built-in functions in GraphForge.
|
|
|
119
119
|
**Signatures:** `toInteger(value)`, `toFloat(value)`
|
|
120
120
|
**Tests:** Type conversion scenarios
|
|
121
121
|
|
|
122
|
-
### sqrt()
|
|
123
|
-
**Status:**
|
|
124
|
-
**
|
|
122
|
+
### sqrt() ✅
|
|
123
|
+
**Status:** COMPLETE
|
|
124
|
+
**File:** `evaluator.py:1672`
|
|
125
|
+
**Signature:** `sqrt(number)`
|
|
126
|
+
**Tests:** tests/integration/test_math_functions_extended.py (TestSqrtFunction)
|
|
127
|
+
**Notes:** Returns CypherFloat. Negative input returns null.
|
|
125
128
|
|
|
126
|
-
### rand()
|
|
127
|
-
**Status:**
|
|
128
|
-
**
|
|
129
|
+
### rand() ✅
|
|
130
|
+
**Status:** COMPLETE
|
|
131
|
+
**File:** `evaluator.py:1683`
|
|
132
|
+
**Signature:** `rand()`
|
|
133
|
+
**Tests:** tests/integration/test_math_functions_extended.py (TestRandFunction)
|
|
134
|
+
**Notes:** Returns random CypherFloat in [0.0, 1.0).
|
|
129
135
|
|
|
130
|
-
### pow()
|
|
131
|
-
**Status:**
|
|
132
|
-
**
|
|
136
|
+
### pow() ✅
|
|
137
|
+
**Status:** COMPLETE
|
|
138
|
+
**File:** `evaluator.py:1690`
|
|
139
|
+
**Signature:** `pow(base, exponent)`
|
|
140
|
+
**Tests:** tests/integration/test_math_functions_extended.py (TestPowFunction)
|
|
141
|
+
**Notes:** Exponentiation function, consistent with ^ operator. Returns CypherInt for int^int with non-negative exponent when result is whole.
|
|
133
142
|
|
|
134
143
|
---
|
|
135
144
|
|
|
@@ -211,13 +220,19 @@ Implementation status of OpenCypher built-in functions in GraphForge.
|
|
|
211
220
|
**Signature:** `collect(expression)`
|
|
212
221
|
**Tests:** Aggregation scenarios
|
|
213
222
|
|
|
214
|
-
### percentileDisc(), percentileCont()
|
|
215
|
-
**Status:**
|
|
216
|
-
**
|
|
223
|
+
### percentileDisc(), percentileCont() ✅
|
|
224
|
+
**Status:** COMPLETE
|
|
225
|
+
**File:** `src/graphforge/executor/executor.py` (aggregation logic)
|
|
226
|
+
**Signatures:** `percentileDisc(expression, percentile)`, `percentileCont(expression, percentile)`
|
|
227
|
+
**Tests:** tests/unit/executor/test_aggregation_functions_advanced.py, tests/integration/test_aggregation_functions_advanced.py
|
|
228
|
+
**Notes:** Discrete and continuous percentile calculations. NULL values ignored. Percentile must be between 0.0 and 1.0.
|
|
217
229
|
|
|
218
|
-
### stDev(), stDevP()
|
|
219
|
-
**Status:**
|
|
220
|
-
**
|
|
230
|
+
### stDev(), stDevP() ✅
|
|
231
|
+
**Status:** COMPLETE
|
|
232
|
+
**File:** `src/graphforge/executor/executor.py` (aggregation logic)
|
|
233
|
+
**Signatures:** `stDev(expression)`, `stDevP(expression)`
|
|
234
|
+
**Tests:** tests/unit/executor/test_aggregation_functions_advanced.py, tests/integration/test_aggregation_functions_advanced.py
|
|
235
|
+
**Notes:** Sample (stDev) and population (stDevP) standard deviation. NULL values ignored. stDev returns NULL for single value, stDevP returns 0.
|
|
221
236
|
|
|
222
237
|
---
|
|
223
238
|
|
|
@@ -408,20 +423,15 @@ All temporal functions are ✅ COMPLETE with comprehensive support added in v0.3
|
|
|
408
423
|
3. **Core string/numeric/list functions**: Most commonly used functions implemented
|
|
409
424
|
4. **Type conversions**: Complete conversion functions (toString, toInteger, toFloat, toBoolean)
|
|
410
425
|
5. **Aggregations**: Essential aggregations (count, sum, avg, min, max, collect)
|
|
426
|
+
6. **Statistical aggregations**: percentileDisc, percentileCont, stDev, stDevP (v0.3.5)
|
|
411
427
|
|
|
412
428
|
### Limitations
|
|
413
429
|
|
|
414
|
-
1. **
|
|
415
|
-
2. **List operations**: extract(), filter(), reduce() not implemented
|
|
416
|
-
3. **Mathematical functions**: sqrt(), rand(), pow() missing
|
|
430
|
+
1. **List operations**: extract(), filter(), reduce() not implemented
|
|
417
431
|
|
|
418
432
|
### Recommended Priority for v0.4.0+
|
|
419
433
|
|
|
420
|
-
1. **
|
|
421
|
-
2. **Medium**: Statistical aggregations (percentileDisc, percentileCont, stDev)
|
|
422
|
-
3. **Medium**: List operations (extract, filter, reduce)
|
|
423
|
-
4. **Low**: rand() - useful but low priority
|
|
424
|
-
5. **Low**: pow() - can use alternative approaches
|
|
434
|
+
1. **Medium**: List operations (extract, filter, reduce)
|
|
425
435
|
|
|
426
436
|
---
|
|
427
437
|
|
|
@@ -14,18 +14,18 @@ Comprehensive status matrix for GraphForge's OpenCypher implementation, showing
|
|
|
14
14
|
| Category | Total Features | Complete | Partial | Not Implemented | TCK Scenarios | Coverage |
|
|
15
15
|
|----------|---------------|----------|---------|-----------------|---------------|----------|
|
|
16
16
|
| **Clauses** | 20 | 16 (80%) | 1 (5%) | 3 (15%) | ~1,180 | Good |
|
|
17
|
-
| **Functions** | 72 |
|
|
17
|
+
| **Functions** | 72 | 60 (83%) | 0 (0%) | 12 (17%) | ~380 | Good |
|
|
18
18
|
| **Operators** | 34 | 30 (88%) | 0 (0%) | 4 (12%) | ~300 | Good |
|
|
19
19
|
| **Patterns** | 8 | 6 (75%) | 1 (12%) | 1 (13%) | ~200 | Good |
|
|
20
|
-
| **TOTAL** | **134** | **
|
|
20
|
+
| **TOTAL** | **134** | **112 (84%)** | **2 (2%)** | **20 (15%)** | **~2,060** | **Good** |
|
|
21
21
|
|
|
22
|
-
### Overall Compliance: **~
|
|
22
|
+
### Overall Compliance: **~84% Feature Complete**
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
26
26
|
## Quick Reference
|
|
27
27
|
|
|
28
|
-
### ✅ Fully Supported (
|
|
28
|
+
### ✅ Fully Supported (112 features)
|
|
29
29
|
- Core querying: MATCH, RETURN, WHERE, ORDER BY, LIMIT, SKIP
|
|
30
30
|
- Query chaining: WITH (full spec compliance)
|
|
31
31
|
- Writing: CREATE, MERGE, SET, REMOVE, DELETE, DETACH DELETE
|
|
@@ -38,13 +38,11 @@ Comprehensive status matrix for GraphForge's OpenCypher implementation, showing
|
|
|
38
38
|
- CALL { } subqueries (EXISTS/COUNT only, general syntax missing)
|
|
39
39
|
- Pattern predicates (basic WHERE in patterns, needs completion)
|
|
40
40
|
|
|
41
|
-
### ❌ Not Supported (
|
|
41
|
+
### ❌ Not Supported (20 features)
|
|
42
42
|
- CALL procedures (no procedure system)
|
|
43
43
|
- Predicate functions (all, any, none, single, isEmpty)
|
|
44
44
|
- List operations (extract, filter, reduce)
|
|
45
45
|
- Pattern comprehension
|
|
46
|
-
- Some math functions (sqrt, rand, pow)
|
|
47
|
-
- Statistical aggregations (percentile, stdev)
|
|
48
46
|
|
|
49
47
|
---
|
|
50
48
|
|
|
@@ -77,7 +75,7 @@ Comprehensive status matrix for GraphForge's OpenCypher implementation, showing
|
|
|
77
75
|
|
|
78
76
|
---
|
|
79
77
|
|
|
80
|
-
### Functions (72 total:
|
|
78
|
+
### Functions (72 total: 60 complete, 0 partial, 12 not implemented)
|
|
81
79
|
|
|
82
80
|
#### String Functions (13 total: 11 complete, 2 not implemented)
|
|
83
81
|
|
|
@@ -94,7 +92,7 @@ Comprehensive status matrix for GraphForge's OpenCypher implementation, showing
|
|
|
94
92
|
| length() | ❌ Not Implemented | 1 | N/A | Conflicts with path length() |
|
|
95
93
|
| toUpper/toLower (camelCase) | ❌ Not Implemented | 2 | N/A | Only UPPER/LOWER aliases |
|
|
96
94
|
|
|
97
|
-
#### Numeric Functions (10 total:
|
|
95
|
+
#### Numeric Functions (10 total: 10 complete) ✅ COMPLETE CATEGORY
|
|
98
96
|
|
|
99
97
|
| Function | Status | TCK Scenarios | File | Notes |
|
|
100
98
|
|----------|--------|---------------|------|-------|
|
|
@@ -103,9 +101,9 @@ Comprehensive status matrix for GraphForge's OpenCypher implementation, showing
|
|
|
103
101
|
| round() | ✅ Complete | 1 | evaluator.py:1369 | With precision |
|
|
104
102
|
| sign() | ✅ Complete | 1 | evaluator.py:1409 | Sign of number |
|
|
105
103
|
| toInteger(), toFloat() | ✅ Complete | 2 | evaluator.py:1556, 1600 | Type conversion |
|
|
106
|
-
| sqrt() |
|
|
107
|
-
| rand() |
|
|
108
|
-
| pow()
|
|
104
|
+
| sqrt() | ✅ Complete | 7 | evaluator.py:1672 | Square root (v0.3.5) |
|
|
105
|
+
| rand() | ✅ Complete | 4 | evaluator.py:1683 | Random number (v0.3.5) |
|
|
106
|
+
| pow() | ✅ Complete | 9 | evaluator.py:1690 | Power function (v0.3.5) |
|
|
109
107
|
|
|
110
108
|
#### List Functions (8 total: 6 complete, 2 not implemented)
|
|
111
109
|
|
|
@@ -120,7 +118,7 @@ Comprehensive status matrix for GraphForge's OpenCypher implementation, showing
|
|
|
120
118
|
| filter() | ❌ Not Implemented | 10 | N/A | List filtering |
|
|
121
119
|
| reduce() | ❌ Not Implemented | 5 | N/A | List reduction |
|
|
122
120
|
|
|
123
|
-
#### Aggregation Functions (10 total:
|
|
121
|
+
#### Aggregation Functions (10 total: 9 complete, 1 not implemented)
|
|
124
122
|
|
|
125
123
|
| Function | Status | TCK Scenarios | File | Notes |
|
|
126
124
|
|----------|--------|---------------|------|-------|
|
|
@@ -129,8 +127,8 @@ Comprehensive status matrix for GraphForge's OpenCypher implementation, showing
|
|
|
129
127
|
| avg() | ✅ Complete | 3 | executor.py | Average |
|
|
130
128
|
| min(), max() | ✅ Complete | 5 | executor.py | Min/max values |
|
|
131
129
|
| collect() | ✅ Complete | 4 | executor.py | Collect to list |
|
|
132
|
-
| percentileDisc(), percentileCont() |
|
|
133
|
-
| stDev(), stDevP() |
|
|
130
|
+
| percentileDisc(), percentileCont() | ✅ Complete | 2 | executor.py | Percentiles (v0.3.5) |
|
|
131
|
+
| stDev(), stDevP() | ✅ Complete | 1 | executor.py | Standard deviation (v0.3.5) |
|
|
134
132
|
|
|
135
133
|
#### Predicate Functions (6 total: 0 complete, 6 not implemented) ⚠️ HIGH PRIORITY
|
|
136
134
|
|
|
@@ -491,10 +489,6 @@ Comprehensive status matrix for GraphForge's OpenCypher implementation, showing
|
|
|
491
489
|
- Complex feature
|
|
492
490
|
- 15 TCK scenarios failing
|
|
493
491
|
|
|
494
|
-
5. **Some mathematical functions missing**
|
|
495
|
-
- sqrt(), rand(), pow()
|
|
496
|
-
- Minimal TCK impact
|
|
497
|
-
|
|
498
492
|
---
|
|
499
493
|
|
|
500
494
|
## How to Use This Matrix
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "graphforge"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.6"
|
|
4
4
|
description = "Composable graph tooling for analysis, construction, and refinement"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -270,4 +270,5 @@ dev = [
|
|
|
270
270
|
"bandit[toml]>=1.7.0",
|
|
271
271
|
"pre-commit>=3.6.0",
|
|
272
272
|
"types-defusedxml>=0.7.0.20250822",
|
|
273
|
+
"interrogate>=1.7.0",
|
|
273
274
|
]
|