graphforge 0.3.5__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.5 → graphforge-0.3.6}/CHANGELOG.md +24 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/Makefile +19 -16
- {graphforge-0.3.5 → graphforge-0.3.6}/PKG-INFO +12 -11
- {graphforge-0.3.5 → graphforge-0.3.6}/README.md +11 -10
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/testing.md +65 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/pyproject.toml +2 -1
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/api.py +13 -6
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/ast/expression.py +16 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/ast/pattern.py +5 -4
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/executor/evaluator.py +1636 -205
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/executor/executor.py +8 -2
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/predicate_utils.py +3 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/parser/cypher.lark +16 -4
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/parser/parser.py +55 -11
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/types/values.py +339 -10
- graphforge-0.3.6/tests/integration/test_anonymous_relationships.py +75 -0
- {graphforge-0.3.5 → 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.5 → graphforge-0.3.6}/tests/integration/test_temporal_map_constructors.py +75 -10
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_temporal_queries.py +14 -7
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/conftest.py +370 -20
- {graphforge-0.3.5 → 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/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.5 → graphforge-0.3.6}/tests/unit/parser/test_parser.py +44 -0
- graphforge-0.3.6/tests/unit/test_iana_timezone_construction.py +35 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/uv.lock +68 -23
- graphforge-0.3.5/tests/unit/executor/test_temporal_truncate_arithmetic.py +0 -358
- {graphforge-0.3.5 → graphforge-0.3.6}/.codecov.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.coderabbit.yaml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.editorconfig +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/CODEOWNERS +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_WORKFLOW.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/SECURITY.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/dependabot.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/pull_request_template.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/README.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/changelog-check.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/docs.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/pr-labeler.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/publish.yaml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/release-tracking.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/test.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.gitignore +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/.pre-commit-config.yaml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/CHANGELOG_v0.3.0.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/CLAUDE.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/CODE_OF_CONDUCT.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/CONTRIBUTING.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/IMPLEMENTATION_PLAN.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/LICENSE +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/RELEASING.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/coverage.json +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/architecture/ast-and-planning.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/architecture/execution-model.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/architecture/overview.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/architecture/storage-analysis.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/architecture/storage.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/community/code-of-conduct.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/community/security.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/cypher-guide.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/cypher-script-loading.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/ldbc.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/neo4j-examples.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/networkrepository.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/overview.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/snap.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/QUICKSTART_V0.2.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/codecov-integration.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/contributing.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/documentation-update-summary.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/phase-1a-completion-report.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/release-process.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/release-strategy.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/requirements.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-cicd-infrastructure.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-documentation.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-regression-fix.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-with-clause.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-02-01-codecov-setup.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-02-01-column-naming-investigation.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-summary.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/tck-session-2026-01-31-final.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/tck-session-2026-01-31.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/tck_baseline_analysis_v0.3.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/testing-setup-complete.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/v0.2-plan-summary.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/v0.4-revised-plan.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/workflow.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/getting-started/installation.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/getting-started/quickstart.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/getting-started/tutorial.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/guide/cypher-guide.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/guide/graph-construction.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/guide/overview.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/index.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/INCOMPLETE_FEATURES_ISSUES.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/README.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/RELEASE_TRACKING.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/VALIDATION_REPORT.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/api.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/changelog.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/column-naming-behavior.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-aggregation-functions.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-graph-queries.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-graph-schema.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-mapping/clause-to-tck.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-mapping/function-to-tck.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-order-by.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-return-aliasing.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/implementation-status/clauses.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/implementation-status/functions.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/implementation-status/operators.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/implementation-status/patterns.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-compatibility-matrix.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-compatibility.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-features/01-clauses.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-features/02-functions.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-features/03-operators.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-features/04-patterns.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-features/05-data-types.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/tck-compliance.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/tck-inventory.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/implementation-summary.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/next-steps.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/phase-1-complete.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/phase-2-complete.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/phase-3-complete.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/roadmap.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/stylesheets/extra.css +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/docs/use-cases/agent-grounding.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/examples/01_social_network.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/examples/02_knowledge_graph.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/examples/03_data_lineage.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/examples/04_citation_network.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/examples/05_migration_from_networkx.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/examples/agent_grounding/ecommerce_agent.ipynb +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/examples/basic_graph.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/examples/basic_usage.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/mkdocs.yml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/scripts/build_feature_graph.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/scripts/bump_version.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/scripts/check_release_needed.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/scripts/inventory_tck.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/scripts/pre-push-check.sh +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/scripts/tck_metrics.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/scripts/validate_datasets.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/ast/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/ast/clause.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/ast/query.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/base.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/data/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/data/networkrepository.json +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/data/snap.json +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/exporters/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/exporters/json_graph.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/formats/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/formats/json_graph.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/compression.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/csv.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/cypher.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/graphml.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/json_graph.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/ldbc.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/ldbc_schema.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/registry.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/graphml.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/json_graph.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/ldbc.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/networkrepository.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/snap.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/executor/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/cost_model.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/join_reorder.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/optimizer.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/statistics.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/parser/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/planner/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/planner/operators.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/planner/planner.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/planner/types.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/storage/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/storage/memory.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/storage/pydantic_serialization.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/storage/serialization.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/storage/sqlite_backend.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/types/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/types/graph.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/README.md +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/conftest.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/conftest.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_compression.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_cypher_loader_docs.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_end_to_end_workflows.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_json_graph_roundtrip.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_ldbc_loader.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_networkrepository_loader.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/executor/test_graph_functions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_aggregation_edge_cases.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_aggregation_functions_advanced.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_arithmetic.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_builder_api.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_call_subqueries.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_case_expressions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_collect.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_complex_merge_patterns.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_complex_where_predicates.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_create_clause.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_create_edge_cases.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_delete_null.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_detach_delete.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_distinct_clause.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_e2e_queries.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_executor_edge_cases.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_exists_is_empty.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_id_function.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_label_disjunction.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_list_comprehension.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_list_functions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_list_operations.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_list_path_overloading.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_list_subscript.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_logical_operators.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_match_create.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_math_functions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_math_functions_extended.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_merge_edge_cases.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_merge_on_create_real.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_merge_on_match_real.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_null_handling.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_optimizer_aggregate_pushdown.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_optimizer_integration.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_optimizer_redundant_elimination.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_optional_match.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_optional_match_delete.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_path_binding.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_path_binding_variable_length.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_path_functions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_pattern_comprehension.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_pattern_predicates.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_persistence.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_power_operator.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_predicate_functions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_relationship_directions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_remove_clause.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_set_delete_merge.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_size_function.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_snap_dataset_loading.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_sort_after_aggregation.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_spatial_api.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_sqlite_persistence.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_string_functions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_string_functions_new.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_string_matching.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_subquery_expressions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_transactions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_type_functions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_union.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_unwind.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_variable_length_paths.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_wildcard_execution.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_with_aggregation_real.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_with_clause.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_with_clause_modifiers.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_with_distinct_skip_limit.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_xor_operator.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/property/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/property/strategies.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/coverage_matrix.json +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/download_tck.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/Aggregation1_BasicAggregation.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/Match1_SimpleMatches.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match8.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match9.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge8.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge9.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/remove/Remove1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/remove/Remove2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/remove/Remove3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return8.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/union/Union1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/union/Union2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/union/Union3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/unwind/Unwind1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation8.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/conditional/Conditional1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/conditional/Conditional2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph8.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph9.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List10.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List11.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List12.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List8.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List9.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals8.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/map/Map1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/map/Map2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/map/Map3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical10.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical11.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical12.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical13.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical14.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical15.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical16.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical17.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical8.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical9.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/null/Null1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/null/Null2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/null/Null3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/path/Path1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/path/Path2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/path/Path3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/pattern/Pattern1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/pattern/Pattern2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier10.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier11.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier12.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier8.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier9.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String10.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String11.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String12.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String13.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String14.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String8.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String9.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal10.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal7.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal8.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal9.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion2.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion3.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion4.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion5.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion6.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/useCases/triadicSelection/TriadicSelection1.feature +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-1/binary-tree-1.cypher +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-1/binary-tree-1.json +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-2/binary-tree-2.cypher +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-2/binary-tree-2.json +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/graphs/named-graphs.adoc +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/tck_config.yaml +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/tck_markers.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/test_features.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/test_tck_compliance.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/api/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/api/test_clear.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/api/test_clone.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/api/test_cypher_value_conversion.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/ast/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/ast/test_ast_nodes.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_csv_loader.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_cypher_loader.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_json_graph_format.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_ldbc_schema.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_networkrepository.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_registry.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_snap_datasets.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_sources_registration.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_aggregation_errors.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_aggregation_functions_advanced.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_arithmetic_evaluator.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_evaluator.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_evaluator_additional_coverage.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_evaluator_error_paths.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_executor_error_paths.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_expression_matching.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_expressions_match.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_graph_functions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_id_function.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_in_operator.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_list_functions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_list_functions_errors.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_map_property_access.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_merge_on_create.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_merge_on_match.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_multihop_create.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_optional_scan_coverage.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_path_functions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_sort_edge_cases.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_spatial_functions.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_string_functions_new.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_string_matching_evaluator.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_subquery_planner_check.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_three_valued_logic.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_type_conversion_complex.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_undirected_relationship_bugs.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_with_aggregation.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_aggregate_pushdown.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_cost_model.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_filter_pushdown.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_join_reorder.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_optimizer_reuse.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_predicate_reorder.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_predicate_utils.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_redundant_elimination.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_statistics.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_arithmetic_parser.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_case_parser.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_collect_parser.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_delete_parser.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_grammar.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_merge_on_create.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_merge_on_match.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_optional_match_delete.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_parser_caching.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_path_binding.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_pattern_predicates.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_remove_parser.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_string_matching_parser.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_wildcard_parsing.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_with_at_query_start.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_expand_multi_hop_operator.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_operator_validation.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_operators.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_planner_branch_coverage.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_planner_comprehensive.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_planner_edge_cases.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_remove_planner.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_type_tracking.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_with_validation.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/__init__.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_graph_edge_cases.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_memory_store.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_pydantic_serialization.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_serialization_edge_cases.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_spatial_serialization.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_sqlite_backend_adjacency.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_temporal_serialization.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/test_graph_elements.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/test_values.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_cypher_values_deep_equality.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_cypher_values_edge_cases.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_graph_element_edge_cases.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_path_values.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_spatial_values.py +0 -0
- {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_temporal_values.py +0 -0
|
@@ -5,6 +5,30 @@ 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
|
+
|
|
8
32
|
## [0.3.5] - 2026-02-19
|
|
9
33
|
|
|
10
34
|
### Added - Math Functions (#195, #196, #197)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.PHONY: help lint format type-check security test pre-push clean test-tck test-
|
|
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,30 +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
29
|
|
|
30
|
-
test-
|
|
31
|
-
uv run pytest tests/
|
|
30
|
+
test-integration: ## Run integration tests in parallel (excludes snap/network downloads)
|
|
31
|
+
uv run pytest tests/integration -n auto -m "not snap"
|
|
32
32
|
|
|
33
|
-
test-
|
|
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
|
|
34
37
|
uv run pytest tests/tck/ -n auto -v
|
|
35
38
|
|
|
36
39
|
coverage: ## Run tests with coverage measurement
|
|
37
40
|
@echo "Running tests with coverage..."
|
|
38
|
-
uv run pytest tests/unit tests/integration \
|
|
41
|
+
uv run pytest tests/unit tests/integration -m "not snap" \
|
|
39
42
|
--cov=src \
|
|
40
43
|
--cov-branch \
|
|
41
44
|
--cov-report=term-missing \
|
|
42
|
-
--cov-report=xml
|
|
43
|
-
--cov-report=html \
|
|
44
|
-
-n auto
|
|
45
|
+
--cov-report=xml
|
|
45
46
|
|
|
46
47
|
test-analytics: ## Run tests with analytics output (JUnit XML)
|
|
47
48
|
@echo "Running tests with analytics output..."
|
|
@@ -61,7 +62,9 @@ coverage-strict: ## Strict 90% coverage check for new features
|
|
|
61
62
|
(echo "❌ Coverage below 90% - consider adding more tests" && exit 1)
|
|
62
63
|
@echo "✅ Coverage meets strict threshold"
|
|
63
64
|
|
|
64
|
-
coverage-report: ##
|
|
65
|
+
coverage-report: ## Generate HTML coverage report and open in browser
|
|
66
|
+
@echo "Generating HTML coverage report..."
|
|
67
|
+
uv run coverage html
|
|
65
68
|
@echo "Opening coverage report in browser..."
|
|
66
69
|
@open htmlcov/index.html || xdg-open htmlcov/index.html || \
|
|
67
70
|
echo "Coverage report generated at htmlcov/index.html"
|
|
@@ -92,7 +95,7 @@ check-patch-coverage: ## Validate patch coverage for changed files (90% thresho
|
|
|
92
95
|
echo "✅ Patch coverage meets 90% threshold"; \
|
|
93
96
|
fi
|
|
94
97
|
|
|
95
|
-
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)
|
|
96
99
|
@echo "✅ All pre-push checks passed!"
|
|
97
100
|
|
|
98
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% |
|
|
@@ -624,6 +624,71 @@ pip install -e ".[dev]"
|
|
|
624
624
|
|
|
625
625
|
---
|
|
626
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
|
+
|
|
627
692
|
## Success Metrics
|
|
628
693
|
|
|
629
694
|
The testing infrastructure is successful when:
|
|
@@ -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
|
]
|
|
@@ -257,10 +257,20 @@ class GraphForge:
|
|
|
257
257
|
# Validate query input
|
|
258
258
|
QueryInput(query=query)
|
|
259
259
|
|
|
260
|
-
# Parse query
|
|
260
|
+
# Parse query (may return a single CypherQuery or a list for multi-statement scripts)
|
|
261
261
|
ast = self.parser.parse(query)
|
|
262
262
|
|
|
263
|
-
#
|
|
263
|
+
# Multi-statement script: execute each query sequentially, return last result
|
|
264
|
+
if isinstance(ast, list):
|
|
265
|
+
results: list[dict] = []
|
|
266
|
+
for single_ast in ast:
|
|
267
|
+
results = self._execute_single_ast(single_ast)
|
|
268
|
+
return results
|
|
269
|
+
|
|
270
|
+
return self._execute_single_ast(ast)
|
|
271
|
+
|
|
272
|
+
def _execute_single_ast(self, ast: Any) -> list[dict]:
|
|
273
|
+
"""Execute a single parsed AST and return results."""
|
|
264
274
|
from graphforge.ast.query import UnionQuery
|
|
265
275
|
|
|
266
276
|
if isinstance(ast, UnionQuery):
|
|
@@ -290,10 +300,7 @@ class GraphForge:
|
|
|
290
300
|
self.optimizer.update_statistics(self.graph.get_statistics())
|
|
291
301
|
operators = self.optimizer.optimize(operators)
|
|
292
302
|
|
|
293
|
-
|
|
294
|
-
results = self.executor.execute(operators)
|
|
295
|
-
|
|
296
|
-
return results
|
|
303
|
+
return self.executor.execute(operators)
|
|
297
304
|
|
|
298
305
|
def create_node(self, labels: list[str] | None = None, **properties: Any) -> NodeRef:
|
|
299
306
|
"""Create a node with labels and properties.
|
|
@@ -451,3 +451,19 @@ class QuantifierExpression(BaseModel):
|
|
|
451
451
|
return v
|
|
452
452
|
|
|
453
453
|
model_config = {"frozen": True, "arbitrary_types_allowed": True}
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
class LabelPredicate(BaseModel):
|
|
457
|
+
"""Label membership predicate expression.
|
|
458
|
+
|
|
459
|
+
Represents ``n:Person``, ``n:Person:Employee`` (all labels must match), etc.
|
|
460
|
+
|
|
461
|
+
Examples:
|
|
462
|
+
WHERE n:Person -> LabelPredicate(variable="n", labels=["Person"])
|
|
463
|
+
WHERE n:Person:Employee -> LabelPredicate(variable="n", labels=["Person", "Employee"])
|
|
464
|
+
"""
|
|
465
|
+
|
|
466
|
+
variable: str = Field(..., min_length=1, description="Variable name to test")
|
|
467
|
+
labels: list[str] = Field(..., min_length=1, description="Labels that must all be present")
|
|
468
|
+
|
|
469
|
+
model_config = {"frozen": True}
|
|
@@ -57,11 +57,12 @@ class NodePattern(BaseModel):
|
|
|
57
57
|
|
|
58
58
|
@field_validator("labels")
|
|
59
59
|
@classmethod
|
|
60
|
-
def validate_labels(cls, v: list[str]) -> list[str]:
|
|
60
|
+
def validate_labels(cls, v: list[list[str]]) -> list[list[str]]:
|
|
61
61
|
"""Validate label names."""
|
|
62
|
-
for
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
for label_group in v:
|
|
63
|
+
for label in label_group:
|
|
64
|
+
if not label or not label[0].isalpha():
|
|
65
|
+
raise ValueError(f"Label must start with a letter: {label}")
|
|
65
66
|
return v
|
|
66
67
|
|
|
67
68
|
model_config = {"frozen": True, "arbitrary_types_allowed": True}
|