graphforge 0.3.8__tar.gz → 0.3.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/docs.yml +3 -3
  2. {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/publish.yaml +1 -1
  3. {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/test.yml +33 -22
  4. {graphforge-0.3.8 → graphforge-0.3.9}/.gitignore +3 -0
  5. {graphforge-0.3.8 → graphforge-0.3.9}/CHANGELOG.md +33 -0
  6. {graphforge-0.3.8 → graphforge-0.3.9}/CLAUDE.md +19 -2
  7. graphforge-0.3.9/Makefile +180 -0
  8. {graphforge-0.3.8 → graphforge-0.3.9}/PKG-INFO +20 -18
  9. {graphforge-0.3.8 → graphforge-0.3.9}/README.md +18 -16
  10. graphforge-0.3.9/docs/development/perf-baseline-findings-v0.3.9.md +104 -0
  11. graphforge-0.3.9/docs/development/perf-v038-to-v039-delta.md +297 -0
  12. {graphforge-0.3.8 → graphforge-0.3.9}/docs/getting-started/installation.md +1 -1
  13. {graphforge-0.3.8 → graphforge-0.3.9}/docs/guide/cypher-guide.md +1 -1
  14. {graphforge-0.3.8 → graphforge-0.3.9}/docs/index.md +2 -2
  15. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-compatibility.md +16 -15
  16. graphforge-0.3.9/docs/reference/scale-limits.md +139 -0
  17. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/tck-compliance.md +5 -5
  18. graphforge-0.3.9/docs/releases/roadmap.md +90 -0
  19. {graphforge-0.3.8 → graphforge-0.3.9}/pyproject.toml +7 -5
  20. graphforge-0.3.9/scripts/perf_report.py +86 -0
  21. {graphforge-0.3.8 → graphforge-0.3.9}/scripts/tck_metrics.py +20 -8
  22. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/api.py +167 -52
  23. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/ast/pattern.py +4 -0
  24. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/base.py +1 -1
  25. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/csv.py +59 -61
  26. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/executor/evaluator.py +200 -32
  27. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/executor/executor.py +244 -20
  28. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/predicate_utils.py +37 -14
  29. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/parser/cypher.lark +133 -112
  30. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/parser/parser.py +660 -358
  31. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/planner/planner.py +270 -50
  32. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/storage/memory.py +97 -4
  33. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/storage/sqlite_backend.py +83 -4
  34. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_pattern_comprehension.py +56 -36
  35. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_pattern_predicates.py +116 -0
  36. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_sqlite_persistence.py +80 -0
  37. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_transactions.py +90 -0
  38. graphforge-0.3.9/tests/integration/test_varlen_predicate_and_uniqueness.py +142 -0
  39. graphforge-0.3.9/tests/perf/__init__.py +0 -0
  40. graphforge-0.3.9/tests/perf/conftest.py +90 -0
  41. graphforge-0.3.9/tests/perf/test_real_datasets.py +262 -0
  42. graphforge-0.3.9/tests/unit/api/test_api_coverage.py +268 -0
  43. graphforge-0.3.9/tests/unit/api/test_bulk_ingest.py +138 -0
  44. graphforge-0.3.9/tests/unit/ast/test_expression_coverage.py +253 -0
  45. graphforge-0.3.9/tests/unit/datasets/test_compression_coverage.py +866 -0
  46. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_registry.py +16 -16
  47. graphforge-0.3.9/tests/unit/executor/test_element_id.py +95 -0
  48. graphforge-0.3.9/tests/unit/executor/test_evaluator_coverage_boost.py +1345 -0
  49. graphforge-0.3.9/tests/unit/executor/test_executor_coverage_boost.py +1318 -0
  50. graphforge-0.3.9/tests/unit/executor/test_infer_rel_var.py +84 -0
  51. graphforge-0.3.9/tests/unit/executor/test_limit_short_circuit.py +210 -0
  52. graphforge-0.3.9/tests/unit/executor/test_property_index_executor.py +294 -0
  53. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_temporal_truncate_arithmetic.py +4 -2
  54. graphforge-0.3.9/tests/unit/executor/test_unwind_limit_short_circuit.py +95 -0
  55. graphforge-0.3.9/tests/unit/optimizer/test_join_reorder_coverage.py +362 -0
  56. graphforge-0.3.9/tests/unit/optimizer/test_optimizer_coverage.py +232 -0
  57. graphforge-0.3.9/tests/unit/optimizer/test_predicate_utils_coverage.py +286 -0
  58. graphforge-0.3.9/tests/unit/parser/test_parser_coverage_boost.py +869 -0
  59. graphforge-0.3.9/tests/unit/parser/test_pattern_comprehension_binding.py +108 -0
  60. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_pattern_predicates.py +56 -0
  61. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_syntax_error_validation.py +37 -3
  62. graphforge-0.3.9/tests/unit/procedures/__init__.py +0 -0
  63. graphforge-0.3.9/tests/unit/storage/test_property_index.py +185 -0
  64. graphforge-0.3.9/tests/unit/storage/test_sqlite_backend_delete_bulk.py +194 -0
  65. graphforge-0.3.9/tests/unit/storage/test_storage_coverage.py +217 -0
  66. graphforge-0.3.9/tests/unit/test_procedure_registry_coverage.py +191 -0
  67. {graphforge-0.3.8 → graphforge-0.3.9}/uv.lock +24 -24
  68. graphforge-0.3.8/Makefile +0 -107
  69. graphforge-0.3.8/docs/releases/roadmap.md +0 -685
  70. {graphforge-0.3.8 → graphforge-0.3.9}/.codecov.yml +0 -0
  71. {graphforge-0.3.8 → graphforge-0.3.9}/.coderabbit.yaml +0 -0
  72. {graphforge-0.3.8 → graphforge-0.3.9}/.editorconfig +0 -0
  73. {graphforge-0.3.8 → graphforge-0.3.9}/.github/CODEOWNERS +0 -0
  74. {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  75. {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  76. {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  77. {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  78. {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  79. {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  80. {graphforge-0.3.8 → graphforge-0.3.9}/.github/ISSUE_WORKFLOW.md +0 -0
  81. {graphforge-0.3.8 → graphforge-0.3.9}/.github/SECURITY.md +0 -0
  82. {graphforge-0.3.8 → graphforge-0.3.9}/.github/dependabot.yml +0 -0
  83. {graphforge-0.3.8 → graphforge-0.3.9}/.github/pull_request_template.md +0 -0
  84. {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/README.md +0 -0
  85. {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/changelog-check.yml +0 -0
  86. {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/pr-labeler.yml +0 -0
  87. {graphforge-0.3.8 → graphforge-0.3.9}/.github/workflows/release-tracking.yml +0 -0
  88. {graphforge-0.3.8 → graphforge-0.3.9}/.pre-commit-config.yaml +0 -0
  89. {graphforge-0.3.8 → graphforge-0.3.9}/CHANGELOG_v0.3.0.md +0 -0
  90. {graphforge-0.3.8 → graphforge-0.3.9}/CODE_OF_CONDUCT.md +0 -0
  91. {graphforge-0.3.8 → graphforge-0.3.9}/CONTRIBUTING.md +0 -0
  92. {graphforge-0.3.8 → graphforge-0.3.9}/IMPLEMENTATION_PLAN.md +0 -0
  93. {graphforge-0.3.8 → graphforge-0.3.9}/LICENSE +0 -0
  94. {graphforge-0.3.8 → graphforge-0.3.9}/RELEASING.md +0 -0
  95. /graphforge-0.3.8/tests/unit/procedures/__init__.py → /graphforge-0.3.9/benchmarks/.gitkeep +0 -0
  96. {graphforge-0.3.8 → graphforge-0.3.9}/coverage.json +0 -0
  97. {graphforge-0.3.8 → graphforge-0.3.9}/docs/architecture/ast-and-planning.md +0 -0
  98. {graphforge-0.3.8 → graphforge-0.3.9}/docs/architecture/execution-model.md +0 -0
  99. {graphforge-0.3.8 → graphforge-0.3.9}/docs/architecture/overview.md +0 -0
  100. {graphforge-0.3.8 → graphforge-0.3.9}/docs/architecture/storage-analysis.md +0 -0
  101. {graphforge-0.3.8 → graphforge-0.3.9}/docs/architecture/storage.md +0 -0
  102. {graphforge-0.3.8 → graphforge-0.3.9}/docs/community/code-of-conduct.md +0 -0
  103. {graphforge-0.3.8 → graphforge-0.3.9}/docs/community/security.md +0 -0
  104. {graphforge-0.3.8 → graphforge-0.3.9}/docs/cypher-guide.md +0 -0
  105. {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/cypher-script-loading.md +0 -0
  106. {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/ldbc.md +0 -0
  107. {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/neo4j-examples.md +0 -0
  108. {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/networkrepository.md +0 -0
  109. {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/overview.md +0 -0
  110. {graphforge-0.3.8 → graphforge-0.3.9}/docs/datasets/snap.md +0 -0
  111. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/QUICKSTART_V0.2.md +0 -0
  112. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/codecov-integration.md +0 -0
  113. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/contributing.md +0 -0
  114. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/documentation-update-summary.md +0 -0
  115. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/parser-performance-analysis.md +0 -0
  116. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/phase-1a-completion-report.md +0 -0
  117. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/release-process.md +0 -0
  118. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/release-strategy.md +0 -0
  119. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/requirements.md +0 -0
  120. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-cicd-infrastructure.md +0 -0
  121. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-documentation.md +0 -0
  122. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-regression-fix.md +0 -0
  123. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-with-clause.md +0 -0
  124. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-02-01-codecov-setup.md +0 -0
  125. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-2026-02-01-column-naming-investigation.md +0 -0
  126. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/session-summary.md +0 -0
  127. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/tck-session-2026-01-31-final.md +0 -0
  128. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/sessions/tck-session-2026-01-31.md +0 -0
  129. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/tck_baseline_analysis_v0.3.md +0 -0
  130. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/testing-setup-complete.md +0 -0
  131. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/testing.md +0 -0
  132. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/v0.2-plan-summary.md +0 -0
  133. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/v0.4-revised-plan.md +0 -0
  134. {graphforge-0.3.8 → graphforge-0.3.9}/docs/development/workflow.md +0 -0
  135. {graphforge-0.3.8 → graphforge-0.3.9}/docs/getting-started/quickstart.md +0 -0
  136. {graphforge-0.3.8 → graphforge-0.3.9}/docs/getting-started/tutorial.md +0 -0
  137. {graphforge-0.3.8 → graphforge-0.3.9}/docs/guide/graph-construction.md +0 -0
  138. {graphforge-0.3.8 → graphforge-0.3.9}/docs/guide/overview.md +0 -0
  139. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/INCOMPLETE_FEATURES_ISSUES.md +0 -0
  140. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/README.md +0 -0
  141. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/RELEASE_TRACKING.md +0 -0
  142. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/VALIDATION_REPORT.md +0 -0
  143. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/api.md +0 -0
  144. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/changelog.md +0 -0
  145. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/column-naming-behavior.md +0 -0
  146. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-aggregation-functions.md +0 -0
  147. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-graph-queries.md +0 -0
  148. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-graph-schema.md +0 -0
  149. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-mapping/clause-to-tck.md +0 -0
  150. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-mapping/function-to-tck.md +0 -0
  151. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-order-by.md +0 -0
  152. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/feature-return-aliasing.md +0 -0
  153. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/implementation-status/clauses.md +0 -0
  154. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/implementation-status/functions.md +0 -0
  155. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/implementation-status/operators.md +0 -0
  156. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/implementation-status/patterns.md +0 -0
  157. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-compatibility-matrix.md +0 -0
  158. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-features/01-clauses.md +0 -0
  159. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-features/02-functions.md +0 -0
  160. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-features/03-operators.md +0 -0
  161. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-features/04-patterns.md +0 -0
  162. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/opencypher-features/05-data-types.md +0 -0
  163. {graphforge-0.3.8 → graphforge-0.3.9}/docs/reference/tck-inventory.md +0 -0
  164. {graphforge-0.3.8 → graphforge-0.3.9}/docs/releases/implementation-summary.md +0 -0
  165. {graphforge-0.3.8 → graphforge-0.3.9}/docs/releases/next-steps.md +0 -0
  166. {graphforge-0.3.8 → graphforge-0.3.9}/docs/releases/phase-1-complete.md +0 -0
  167. {graphforge-0.3.8 → graphforge-0.3.9}/docs/releases/phase-2-complete.md +0 -0
  168. {graphforge-0.3.8 → graphforge-0.3.9}/docs/releases/phase-3-complete.md +0 -0
  169. {graphforge-0.3.8 → graphforge-0.3.9}/docs/stylesheets/extra.css +0 -0
  170. {graphforge-0.3.8 → graphforge-0.3.9}/docs/use-cases/agent-grounding.md +0 -0
  171. {graphforge-0.3.8 → graphforge-0.3.9}/docs/use-cases/agent-tool-recall.md +0 -0
  172. {graphforge-0.3.8 → graphforge-0.3.9}/docs/use-cases/knowledge-graph-construction.md +0 -0
  173. {graphforge-0.3.8 → graphforge-0.3.9}/docs/use-cases/llm-workflows.md +0 -0
  174. {graphforge-0.3.8 → graphforge-0.3.9}/docs/use-cases/network-analysis.md +0 -0
  175. {graphforge-0.3.8 → graphforge-0.3.9}/examples/01_social_network.py +0 -0
  176. {graphforge-0.3.8 → graphforge-0.3.9}/examples/02_knowledge_graph.py +0 -0
  177. {graphforge-0.3.8 → graphforge-0.3.9}/examples/03_data_lineage.py +0 -0
  178. {graphforge-0.3.8 → graphforge-0.3.9}/examples/04_citation_network.py +0 -0
  179. {graphforge-0.3.8 → graphforge-0.3.9}/examples/05_migration_from_networkx.py +0 -0
  180. {graphforge-0.3.8 → graphforge-0.3.9}/examples/agent_grounding/ecommerce_agent.ipynb +0 -0
  181. {graphforge-0.3.8 → graphforge-0.3.9}/examples/basic_graph.py +0 -0
  182. {graphforge-0.3.8 → graphforge-0.3.9}/examples/basic_usage.py +0 -0
  183. {graphforge-0.3.8 → graphforge-0.3.9}/mkdocs.yml +0 -0
  184. {graphforge-0.3.8 → graphforge-0.3.9}/scripts/build_feature_graph.py +0 -0
  185. {graphforge-0.3.8 → graphforge-0.3.9}/scripts/bump_version.py +0 -0
  186. {graphforge-0.3.8 → graphforge-0.3.9}/scripts/check_release_needed.py +0 -0
  187. {graphforge-0.3.8 → graphforge-0.3.9}/scripts/inventory_tck.py +0 -0
  188. {graphforge-0.3.8 → graphforge-0.3.9}/scripts/pre-push-check.sh +0 -0
  189. {graphforge-0.3.8 → graphforge-0.3.9}/scripts/tck_perf_report.py +0 -0
  190. {graphforge-0.3.8 → graphforge-0.3.9}/scripts/validate_datasets.py +0 -0
  191. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/__init__.py +0 -0
  192. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/ast/__init__.py +0 -0
  193. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/ast/clause.py +0 -0
  194. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/ast/expression.py +0 -0
  195. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/ast/query.py +0 -0
  196. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/__init__.py +0 -0
  197. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/data/__init__.py +0 -0
  198. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/data/networkrepository.json +0 -0
  199. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/data/snap.json +0 -0
  200. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/exporters/__init__.py +0 -0
  201. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/exporters/json_graph.py +0 -0
  202. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/formats/__init__.py +0 -0
  203. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/formats/json_graph.py +0 -0
  204. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/__init__.py +0 -0
  205. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/compression.py +0 -0
  206. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/cypher.py +0 -0
  207. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/graphml.py +0 -0
  208. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/json_graph.py +0 -0
  209. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/ldbc.py +0 -0
  210. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/loaders/ldbc_schema.py +0 -0
  211. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/registry.py +0 -0
  212. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/__init__.py +0 -0
  213. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/graphml.py +0 -0
  214. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/json_graph.py +0 -0
  215. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/ldbc.py +0 -0
  216. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/networkrepository.py +0 -0
  217. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/datasets/sources/snap.py +0 -0
  218. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/executor/__init__.py +0 -0
  219. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/__init__.py +0 -0
  220. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/cost_model.py +0 -0
  221. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/join_reorder.py +0 -0
  222. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/optimizer.py +0 -0
  223. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/optimizer/statistics.py +0 -0
  224. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/parser/__init__.py +0 -0
  225. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/planner/__init__.py +0 -0
  226. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/planner/operators.py +0 -0
  227. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/planner/types.py +0 -0
  228. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/procedures/__init__.py +0 -0
  229. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/procedures/registry.py +0 -0
  230. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/storage/__init__.py +0 -0
  231. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/storage/pydantic_serialization.py +0 -0
  232. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/storage/serialization.py +0 -0
  233. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/types/__init__.py +0 -0
  234. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/types/graph.py +0 -0
  235. {graphforge-0.3.8 → graphforge-0.3.9}/src/graphforge/types/values.py +0 -0
  236. {graphforge-0.3.8 → graphforge-0.3.9}/tests/README.md +0 -0
  237. {graphforge-0.3.8 → graphforge-0.3.9}/tests/__init__.py +0 -0
  238. {graphforge-0.3.8 → graphforge-0.3.9}/tests/conftest.py +0 -0
  239. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/__init__.py +0 -0
  240. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/conftest.py +0 -0
  241. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_compression.py +0 -0
  242. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_cypher_loader_docs.py +0 -0
  243. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_end_to_end_workflows.py +0 -0
  244. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_graphml_loader.py +0 -0
  245. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_exporter.py +0 -0
  246. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_loader.py +0 -0
  247. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_roundtrip.py +0 -0
  248. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_ldbc_loader.py +0 -0
  249. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/datasets/test_networkrepository_loader.py +0 -0
  250. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/executor/test_graph_functions.py +0 -0
  251. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_aggregation_edge_cases.py +0 -0
  252. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_aggregation_functions_advanced.py +0 -0
  253. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_anonymous_relationships.py +0 -0
  254. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_arithmetic.py +0 -0
  255. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_builder_api.py +0 -0
  256. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_call_procedures.py +0 -0
  257. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_call_subqueries.py +0 -0
  258. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_case_expressions.py +0 -0
  259. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_collect.py +0 -0
  260. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_column_naming.py +0 -0
  261. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_compact_iso8601.py +0 -0
  262. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_complex_merge_patterns.py +0 -0
  263. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_complex_where_predicates.py +0 -0
  264. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_create_clause.py +0 -0
  265. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_create_edge_cases.py +0 -0
  266. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_delete_null.py +0 -0
  267. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_detach_delete.py +0 -0
  268. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_distinct_clause.py +0 -0
  269. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_e2e_queries.py +0 -0
  270. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_executor_edge_cases.py +0 -0
  271. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_exists_is_empty.py +0 -0
  272. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_graph_element_comparison.py +0 -0
  273. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_hex_octal_literals.py +0 -0
  274. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_iana_timezones.py +0 -0
  275. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_id_function.py +0 -0
  276. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_issues_271_274.py +0 -0
  277. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_label_disjunction.py +0 -0
  278. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_label_predicate.py +0 -0
  279. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_comprehension.py +0 -0
  280. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_concatenation.py +0 -0
  281. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_functions.py +0 -0
  282. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_operations.py +0 -0
  283. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_path_overloading.py +0 -0
  284. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_list_subscript.py +0 -0
  285. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_logical_operators.py +0 -0
  286. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_map_subscript.py +0 -0
  287. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_match_create.py +0 -0
  288. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_math_functions.py +0 -0
  289. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_math_functions_extended.py +0 -0
  290. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_math_functions_new.py +0 -0
  291. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_merge_edge_cases.py +0 -0
  292. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_merge_on_create_real.py +0 -0
  293. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_merge_on_match_real.py +0 -0
  294. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_mixed_type_sort.py +0 -0
  295. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_nan_handling.py +0 -0
  296. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_null_handling.py +0 -0
  297. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_operator_precedence.py +0 -0
  298. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_optimizer_aggregate_pushdown.py +0 -0
  299. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_optimizer_integration.py +0 -0
  300. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_optimizer_redundant_elimination.py +0 -0
  301. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_optional_match.py +0 -0
  302. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_optional_match_delete.py +0 -0
  303. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_path_binding.py +0 -0
  304. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_path_binding_variable_length.py +0 -0
  305. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_path_functions.py +0 -0
  306. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_persistence.py +0 -0
  307. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_power_operator.py +0 -0
  308. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_predicate_functions.py +0 -0
  309. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_properties_keys_functions.py +0 -0
  310. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_relationship_directions.py +0 -0
  311. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_relationship_uniqueness.py +0 -0
  312. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_remove_clause.py +0 -0
  313. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_set_delete_merge.py +0 -0
  314. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_size_function.py +0 -0
  315. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_skip_limit_expressions.py +0 -0
  316. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_snap_dataset_loading.py +0 -0
  317. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_sort_after_aggregation.py +0 -0
  318. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_spatial_api.py +0 -0
  319. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_startnode_endnode_functions.py +0 -0
  320. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_string_functions.py +0 -0
  321. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_string_functions_new.py +0 -0
  322. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_string_matching.py +0 -0
  323. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_subquery_expressions.py +0 -0
  324. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_temporal_map_constructors.py +0 -0
  325. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_temporal_queries.py +0 -0
  326. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_temporal_select_into.py +0 -0
  327. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_type_conversion_fixes.py +0 -0
  328. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_type_functions.py +0 -0
  329. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_union.py +0 -0
  330. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_unwind.py +0 -0
  331. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_variable_length_paths.py +0 -0
  332. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_wildcard_execution.py +0 -0
  333. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_with_aggregation_real.py +0 -0
  334. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_with_clause.py +0 -0
  335. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_with_clause_modifiers.py +0 -0
  336. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_with_clause_positions.py +0 -0
  337. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_with_distinct_skip_limit.py +0 -0
  338. {graphforge-0.3.8 → graphforge-0.3.9}/tests/integration/test_xor_operator.py +0 -0
  339. {graphforge-0.3.8 → graphforge-0.3.9}/tests/property/__init__.py +0 -0
  340. {graphforge-0.3.8 → graphforge-0.3.9}/tests/property/strategies.py +0 -0
  341. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/__init__.py +0 -0
  342. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/conftest.py +0 -0
  343. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/coverage_matrix.json +0 -0
  344. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/download_tck.py +0 -0
  345. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/Aggregation1_BasicAggregation.feature +0 -0
  346. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/Match1_SimpleMatches.feature +0 -0
  347. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call1.feature +0 -0
  348. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call2.feature +0 -0
  349. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call3.feature +0 -0
  350. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call4.feature +0 -0
  351. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call5.feature +0 -0
  352. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call6.feature +0 -0
  353. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create1.feature +0 -0
  354. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create2.feature +0 -0
  355. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create3.feature +0 -0
  356. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create4.feature +0 -0
  357. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create5.feature +0 -0
  358. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create6.feature +0 -0
  359. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete1.feature +0 -0
  360. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete2.feature +0 -0
  361. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete3.feature +0 -0
  362. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete4.feature +0 -0
  363. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete5.feature +0 -0
  364. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete6.feature +0 -0
  365. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match1.feature +0 -0
  366. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match2.feature +0 -0
  367. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match3.feature +0 -0
  368. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match4.feature +0 -0
  369. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match5.feature +0 -0
  370. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match6.feature +0 -0
  371. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match7.feature +0 -0
  372. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match8.feature +0 -0
  373. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match9.feature +0 -0
  374. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere1.feature +0 -0
  375. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere2.feature +0 -0
  376. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere3.feature +0 -0
  377. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere4.feature +0 -0
  378. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere5.feature +0 -0
  379. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere6.feature +0 -0
  380. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge1.feature +0 -0
  381. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge2.feature +0 -0
  382. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge3.feature +0 -0
  383. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge4.feature +0 -0
  384. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge5.feature +0 -0
  385. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge6.feature +0 -0
  386. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge7.feature +0 -0
  387. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge8.feature +0 -0
  388. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge9.feature +0 -0
  389. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove1.feature +0 -0
  390. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove2.feature +0 -0
  391. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove3.feature +0 -0
  392. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return1.feature +0 -0
  393. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return2.feature +0 -0
  394. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return3.feature +0 -0
  395. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return4.feature +0 -0
  396. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return5.feature +0 -0
  397. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return6.feature +0 -0
  398. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return7.feature +0 -0
  399. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return8.feature +0 -0
  400. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy1.feature +0 -0
  401. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy2.feature +0 -0
  402. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy3.feature +0 -0
  403. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy4.feature +0 -0
  404. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy5.feature +0 -0
  405. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy6.feature +0 -0
  406. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit1.feature +0 -0
  407. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit2.feature +0 -0
  408. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit3.feature +0 -0
  409. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set1.feature +0 -0
  410. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set2.feature +0 -0
  411. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set3.feature +0 -0
  412. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set4.feature +0 -0
  413. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set5.feature +0 -0
  414. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set6.feature +0 -0
  415. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union1.feature +0 -0
  416. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union2.feature +0 -0
  417. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union3.feature +0 -0
  418. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/unwind/Unwind1.feature +0 -0
  419. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With1.feature +0 -0
  420. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With2.feature +0 -0
  421. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With3.feature +0 -0
  422. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With4.feature +0 -0
  423. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With5.feature +0 -0
  424. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With6.feature +0 -0
  425. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With7.feature +0 -0
  426. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy1.feature +0 -0
  427. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy2.feature +0 -0
  428. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy3.feature +0 -0
  429. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy4.feature +0 -0
  430. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit1.feature +0 -0
  431. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit2.feature +0 -0
  432. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit3.feature +0 -0
  433. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere1.feature +0 -0
  434. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere2.feature +0 -0
  435. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere3.feature +0 -0
  436. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere4.feature +0 -0
  437. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere5.feature +0 -0
  438. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere6.feature +0 -0
  439. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere7.feature +0 -0
  440. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation1.feature +0 -0
  441. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation2.feature +0 -0
  442. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation3.feature +0 -0
  443. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation4.feature +0 -0
  444. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation5.feature +0 -0
  445. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation6.feature +0 -0
  446. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation7.feature +0 -0
  447. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation8.feature +0 -0
  448. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean1.feature +0 -0
  449. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean2.feature +0 -0
  450. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean3.feature +0 -0
  451. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean4.feature +0 -0
  452. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean5.feature +0 -0
  453. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison1.feature +0 -0
  454. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison2.feature +0 -0
  455. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison3.feature +0 -0
  456. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison4.feature +0 -0
  457. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/conditional/Conditional1.feature +0 -0
  458. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/conditional/Conditional2.feature +0 -0
  459. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery1.feature +0 -0
  460. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery2.feature +0 -0
  461. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery3.feature +0 -0
  462. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph1.feature +0 -0
  463. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph2.feature +0 -0
  464. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph3.feature +0 -0
  465. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph4.feature +0 -0
  466. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph5.feature +0 -0
  467. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph6.feature +0 -0
  468. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph7.feature +0 -0
  469. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph8.feature +0 -0
  470. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph9.feature +0 -0
  471. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List1.feature +0 -0
  472. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List10.feature +0 -0
  473. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List11.feature +0 -0
  474. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List12.feature +0 -0
  475. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List2.feature +0 -0
  476. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List3.feature +0 -0
  477. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List4.feature +0 -0
  478. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List5.feature +0 -0
  479. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List6.feature +0 -0
  480. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List7.feature +0 -0
  481. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List8.feature +0 -0
  482. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List9.feature +0 -0
  483. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals1.feature +0 -0
  484. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals2.feature +0 -0
  485. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals3.feature +0 -0
  486. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals4.feature +0 -0
  487. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals5.feature +0 -0
  488. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals6.feature +0 -0
  489. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals7.feature +0 -0
  490. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals8.feature +0 -0
  491. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map1.feature +0 -0
  492. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map2.feature +0 -0
  493. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map3.feature +0 -0
  494. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical1.feature +0 -0
  495. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical10.feature +0 -0
  496. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical11.feature +0 -0
  497. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical12.feature +0 -0
  498. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical13.feature +0 -0
  499. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical14.feature +0 -0
  500. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical15.feature +0 -0
  501. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical16.feature +0 -0
  502. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical17.feature +0 -0
  503. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical2.feature +0 -0
  504. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical3.feature +0 -0
  505. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical4.feature +0 -0
  506. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical5.feature +0 -0
  507. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical6.feature +0 -0
  508. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical7.feature +0 -0
  509. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical8.feature +0 -0
  510. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical9.feature +0 -0
  511. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null1.feature +0 -0
  512. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null2.feature +0 -0
  513. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null3.feature +0 -0
  514. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path1.feature +0 -0
  515. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path2.feature +0 -0
  516. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path3.feature +0 -0
  517. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/pattern/Pattern1.feature +0 -0
  518. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/pattern/Pattern2.feature +0 -0
  519. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence1.feature +0 -0
  520. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence2.feature +0 -0
  521. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence3.feature +0 -0
  522. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence4.feature +0 -0
  523. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier1.feature +0 -0
  524. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier10.feature +0 -0
  525. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier11.feature +0 -0
  526. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier12.feature +0 -0
  527. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier2.feature +0 -0
  528. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier3.feature +0 -0
  529. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier4.feature +0 -0
  530. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier5.feature +0 -0
  531. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier6.feature +0 -0
  532. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier7.feature +0 -0
  533. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier8.feature +0 -0
  534. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier9.feature +0 -0
  535. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String1.feature +0 -0
  536. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String10.feature +0 -0
  537. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String11.feature +0 -0
  538. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String12.feature +0 -0
  539. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String13.feature +0 -0
  540. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String14.feature +0 -0
  541. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String2.feature +0 -0
  542. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String3.feature +0 -0
  543. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String4.feature +0 -0
  544. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String5.feature +0 -0
  545. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String6.feature +0 -0
  546. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String7.feature +0 -0
  547. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String8.feature +0 -0
  548. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String9.feature +0 -0
  549. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal1.feature +0 -0
  550. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal10.feature +0 -0
  551. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal2.feature +0 -0
  552. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal3.feature +0 -0
  553. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal4.feature +0 -0
  554. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal5.feature +0 -0
  555. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal6.feature +0 -0
  556. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal7.feature +0 -0
  557. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal8.feature +0 -0
  558. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal9.feature +0 -0
  559. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion1.feature +0 -0
  560. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion2.feature +0 -0
  561. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion3.feature +0 -0
  562. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion4.feature +0 -0
  563. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion5.feature +0 -0
  564. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion6.feature +0 -0
  565. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature +0 -0
  566. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/features/official/useCases/triadicSelection/TriadicSelection1.feature +0 -0
  567. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-1/binary-tree-1.cypher +0 -0
  568. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-1/binary-tree-1.json +0 -0
  569. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-2/binary-tree-2.cypher +0 -0
  570. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-2/binary-tree-2.json +0 -0
  571. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/graphs/named-graphs.adoc +0 -0
  572. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/tck_config.yaml +0 -0
  573. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/tck_markers.py +0 -0
  574. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/test_features.py +0 -0
  575. {graphforge-0.3.8 → graphforge-0.3.9}/tests/tck/test_tck_compliance.py +0 -0
  576. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/__init__.py +0 -0
  577. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/api/__init__.py +0 -0
  578. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/api/test_clear.py +0 -0
  579. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/api/test_clone.py +0 -0
  580. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/api/test_cypher_value_conversion.py +0 -0
  581. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/ast/__init__.py +0 -0
  582. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/ast/test_ast_nodes.py +0 -0
  583. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/__init__.py +0 -0
  584. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_csv_loader.py +0 -0
  585. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_cypher_loader.py +0 -0
  586. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_graphml_loader.py +0 -0
  587. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_exporter.py +0 -0
  588. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_format.py +0 -0
  589. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_loader.py +0 -0
  590. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_ldbc_schema.py +0 -0
  591. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_networkrepository.py +0 -0
  592. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_snap_datasets.py +0 -0
  593. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/datasets/test_sources_registration.py +0 -0
  594. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/__init__.py +0 -0
  595. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_aggregation_errors.py +0 -0
  596. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_aggregation_functions_advanced.py +0 -0
  597. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_arithmetic_evaluator.py +0 -0
  598. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_evaluator.py +0 -0
  599. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_evaluator_additional_coverage.py +0 -0
  600. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_evaluator_error_paths.py +0 -0
  601. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_executor_error_paths.py +0 -0
  602. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_expression_matching.py +0 -0
  603. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_expressions_match.py +0 -0
  604. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_graph_functions.py +0 -0
  605. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_id_function.py +0 -0
  606. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_in_operator.py +0 -0
  607. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_list_functions.py +0 -0
  608. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_list_functions_errors.py +0 -0
  609. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_map_property_access.py +0 -0
  610. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_merge_on_create.py +0 -0
  611. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_merge_on_match.py +0 -0
  612. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_multihop_create.py +0 -0
  613. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_optional_expand_bound_dst.py +0 -0
  614. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_optional_scan_coverage.py +0 -0
  615. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_parenthesized_expr_coverage.py +0 -0
  616. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_path_functions.py +0 -0
  617. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_procedure_call_executor.py +0 -0
  618. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_properties_keys_errors.py +0 -0
  619. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_set_extensions.py +0 -0
  620. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_sort_edge_cases.py +0 -0
  621. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_spatial_functions.py +0 -0
  622. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_startnode_endnode_errors.py +0 -0
  623. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_string_functions_new.py +0 -0
  624. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_string_matching_evaluator.py +0 -0
  625. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_subquery_planner_check.py +0 -0
  626. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_temporal_functions.py +0 -0
  627. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_three_valued_logic.py +0 -0
  628. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_type_conversion_complex.py +0 -0
  629. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_undirected_relationship_bugs.py +0 -0
  630. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/executor/test_with_aggregation.py +0 -0
  631. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/__init__.py +0 -0
  632. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_aggregate_pushdown.py +0 -0
  633. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_cost_model.py +0 -0
  634. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_filter_pushdown.py +0 -0
  635. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_join_reorder.py +0 -0
  636. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_optimizer_reuse.py +0 -0
  637. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_predicate_reorder.py +0 -0
  638. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_predicate_utils.py +0 -0
  639. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_redundant_elimination.py +0 -0
  640. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/optimizer/test_statistics.py +0 -0
  641. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/__init__.py +0 -0
  642. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_arithmetic_parser.py +0 -0
  643. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_call_procedure_parser.py +0 -0
  644. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_case_parser.py +0 -0
  645. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_collect_parser.py +0 -0
  646. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_delete_parser.py +0 -0
  647. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_float_literals.py +0 -0
  648. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_grammar.py +0 -0
  649. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_hex_octal_literals.py +0 -0
  650. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_label_predicate_parser.py +0 -0
  651. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_merge_on_create.py +0 -0
  652. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_merge_on_match.py +0 -0
  653. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_optional_match_delete.py +0 -0
  654. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_order_by_direction.py +0 -0
  655. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_parser.py +0 -0
  656. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_parser_caching.py +0 -0
  657. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_path_binding.py +0 -0
  658. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_remove_parser.py +0 -0
  659. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_string_matching_parser.py +0 -0
  660. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_wildcard_parsing.py +0 -0
  661. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_with_at_query_start.py +0 -0
  662. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/parser/test_with_clause_positions.py +0 -0
  663. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/__init__.py +0 -0
  664. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_call_procedure_planner.py +0 -0
  665. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_expand_multi_hop_operator.py +0 -0
  666. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_operator_validation.py +0 -0
  667. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_operators.py +0 -0
  668. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_planner_branch_coverage.py +0 -0
  669. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_planner_comprehensive.py +0 -0
  670. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_planner_edge_cases.py +0 -0
  671. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_remove_planner.py +0 -0
  672. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_type_tracking.py +0 -0
  673. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/planner/test_with_validation.py +0 -0
  674. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/procedures/test_registry.py +0 -0
  675. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/__init__.py +0 -0
  676. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_graph_edge_cases.py +0 -0
  677. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_memory_store.py +0 -0
  678. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_pydantic_serialization.py +0 -0
  679. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_serialization_edge_cases.py +0 -0
  680. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_spatial_serialization.py +0 -0
  681. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_sqlite_backend_adjacency.py +0 -0
  682. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/storage/test_temporal_serialization.py +0 -0
  683. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/test_graph_elements.py +0 -0
  684. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/test_iana_timezone_construction.py +0 -0
  685. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/test_values.py +0 -0
  686. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_cypher_values_deep_equality.py +0 -0
  687. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_cypher_values_edge_cases.py +0 -0
  688. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_extreme_temporal_values.py +0 -0
  689. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_graph_element_edge_cases.py +0 -0
  690. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_path_values.py +0 -0
  691. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_spatial_values.py +0 -0
  692. {graphforge-0.3.8 → graphforge-0.3.9}/tests/unit/types/test_temporal_values.py +0 -0
@@ -36,7 +36,7 @@ jobs:
36
36
  fetch-depth: 0 # Fetch all history for git info
37
37
 
38
38
  - name: Install uv
39
- uses: astral-sh/setup-uv@v7
39
+ uses: astral-sh/setup-uv@v8.1.0
40
40
 
41
41
  - name: Set up Python
42
42
  uses: actions/setup-python@v6
@@ -52,7 +52,7 @@ jobs:
52
52
 
53
53
  - name: Upload Pages artifact
54
54
  if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main'
55
- uses: actions/upload-pages-artifact@v3
55
+ uses: actions/upload-pages-artifact@v5
56
56
  with:
57
57
  path: site/
58
58
 
@@ -69,4 +69,4 @@ jobs:
69
69
  steps:
70
70
  - name: Deploy to GitHub Pages
71
71
  id: deployment
72
- uses: actions/deploy-pages@v4
72
+ uses: actions/deploy-pages@v5
@@ -11,6 +11,6 @@ jobs:
11
11
  id-token: write
12
12
  steps:
13
13
  - uses: actions/checkout@v6
14
- - uses: astral-sh/setup-uv@v7
14
+ - uses: astral-sh/setup-uv@v8.1.0
15
15
  - run: uv build
16
16
  - run: uv publish
@@ -24,7 +24,7 @@ jobs:
24
24
  uses: actions/checkout@v6
25
25
 
26
26
  - name: Install uv
27
- uses: astral-sh/setup-uv@v7
27
+ uses: astral-sh/setup-uv@v8.1.0
28
28
  with:
29
29
  enable-cache: true
30
30
 
@@ -49,7 +49,7 @@ jobs:
49
49
  run: uv run pytest tests/integration -n auto -m "not snap" --junitxml=test-results-integration.xml
50
50
 
51
51
  - name: Upload test results to Codecov
52
- uses: codecov/codecov-action@v5
52
+ uses: codecov/codecov-action@v6
53
53
  if: always()
54
54
  with:
55
55
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -67,7 +67,7 @@ jobs:
67
67
  uses: actions/checkout@v6
68
68
 
69
69
  - name: Install uv
70
- uses: astral-sh/setup-uv@v7
70
+ uses: astral-sh/setup-uv@v8.1.0
71
71
 
72
72
  - name: Set up Python
73
73
  uses: actions/setup-python@v6
@@ -92,7 +92,7 @@ jobs:
92
92
  uses: actions/checkout@v6
93
93
 
94
94
  - name: Install uv
95
- uses: astral-sh/setup-uv@v7
95
+ uses: astral-sh/setup-uv@v8.1.0
96
96
 
97
97
  - name: Set up Python
98
98
  uses: actions/setup-python@v6
@@ -114,7 +114,7 @@ jobs:
114
114
  uses: actions/checkout@v6
115
115
 
116
116
  - name: Install uv
117
- uses: astral-sh/setup-uv@v7
117
+ uses: astral-sh/setup-uv@v8.1.0
118
118
 
119
119
  - name: Set up Python
120
120
  uses: actions/setup-python@v6
@@ -140,7 +140,7 @@ jobs:
140
140
  uses: actions/checkout@v6
141
141
 
142
142
  - name: Install uv
143
- uses: astral-sh/setup-uv@v7
143
+ uses: astral-sh/setup-uv@v8.1.0
144
144
 
145
145
  - name: Set up Python
146
146
  uses: actions/setup-python@v6
@@ -151,7 +151,7 @@ jobs:
151
151
  run: uv sync --all-extras
152
152
 
153
153
  - name: Restore test durations cache
154
- uses: actions/cache/restore@v4
154
+ uses: actions/cache/restore@v5
155
155
  with:
156
156
  path: .test_durations
157
157
  key: tck-durations-${{ github.ref }}
@@ -168,7 +168,7 @@ jobs:
168
168
  --junitxml=test-results-tck-${{ matrix.group }}.xml
169
169
 
170
170
  - name: Upload shard results artifact
171
- uses: actions/upload-artifact@v4
171
+ uses: actions/upload-artifact@v7
172
172
  if: always()
173
173
  with:
174
174
  name: tck-shard-${{ matrix.group }}
@@ -190,7 +190,7 @@ jobs:
190
190
  uses: actions/checkout@v6
191
191
 
192
192
  - name: Install uv
193
- uses: astral-sh/setup-uv@v7
193
+ uses: astral-sh/setup-uv@v8.1.0
194
194
 
195
195
  - name: Set up Python
196
196
  uses: actions/setup-python@v6
@@ -201,9 +201,10 @@ jobs:
201
201
  run: uv sync --all-extras
202
202
 
203
203
  - name: Download all shard results
204
- uses: actions/download-artifact@v4
204
+ uses: actions/download-artifact@v8
205
205
  with:
206
206
  pattern: tck-shard-*
207
+ run-id: ${{ github.run_id }}
207
208
  merge-multiple: true
208
209
  path: tck-results/
209
210
 
@@ -253,7 +254,7 @@ jobs:
253
254
  " || echo "No duration files found, skipping merge"
254
255
 
255
256
  - name: Save test durations cache
256
- uses: actions/cache/save@v4
257
+ uses: actions/cache/save@v5
257
258
  if: always()
258
259
  with:
259
260
  path: .test_durations
@@ -268,7 +269,7 @@ jobs:
268
269
  run: uv run python3 scripts/tck_perf_report.py test-results-tck.xml --threshold 5
269
270
 
270
271
  - name: Upload TCK results to Codecov
271
- uses: codecov/codecov-action@v5
272
+ uses: codecov/codecov-action@v6
272
273
  if: always()
273
274
  with:
274
275
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -278,7 +279,7 @@ jobs:
278
279
  fail_ci_if_error: false
279
280
 
280
281
  - name: Upload merged TCK results artifact
281
- uses: actions/upload-artifact@v4
282
+ uses: actions/upload-artifact@v7
282
283
  if: always()
283
284
  with:
284
285
  name: tck-test-results
@@ -297,7 +298,7 @@ jobs:
297
298
  uses: actions/checkout@v6
298
299
 
299
300
  - name: Install uv
300
- uses: astral-sh/setup-uv@v7
301
+ uses: astral-sh/setup-uv@v8.1.0
301
302
 
302
303
  - name: Set up Python
303
304
  uses: actions/setup-python@v6
@@ -325,7 +326,7 @@ jobs:
325
326
  --junitxml=test-results-cov-${{ matrix.group }}.xml
326
327
 
327
328
  - name: Upload coverage shard artifact
328
- uses: actions/upload-artifact@v4
329
+ uses: actions/upload-artifact@v7
329
330
  if: always()
330
331
  with:
331
332
  name: coverage-shard-${{ matrix.group }}
@@ -344,7 +345,7 @@ jobs:
344
345
  uses: actions/checkout@v6
345
346
 
346
347
  - name: Install uv
347
- uses: astral-sh/setup-uv@v7
348
+ uses: astral-sh/setup-uv@v8.1.0
348
349
 
349
350
  - name: Set up Python
350
351
  uses: actions/setup-python@v6
@@ -355,9 +356,10 @@ jobs:
355
356
  run: uv sync --all-extras
356
357
 
357
358
  - name: Download all coverage shards
358
- uses: actions/download-artifact@v4
359
+ uses: actions/download-artifact@v8
359
360
  with:
360
361
  pattern: coverage-shard-*
362
+ run-id: ${{ github.run_id }}
361
363
  merge-multiple: true
362
364
  path: cov-results/
363
365
 
@@ -387,11 +389,20 @@ jobs:
387
389
 
388
390
  - name: Check coverage threshold
389
391
  run: |
390
- uv run coverage combine cov-results/.coverage* 2>/dev/null || true
391
- uv run coverage report --fail-under=85 || echo "Coverage below 85% - expected during initial development"
392
+ uv run python3 -c "
393
+ import xml.etree.ElementTree as ET, sys
394
+ tree = ET.parse('coverage.xml')
395
+ line_rate = float(tree.getroot().get('line-rate', 0))
396
+ pct = round(line_rate * 100, 1)
397
+ print(f'Coverage: {pct}%')
398
+ if pct < 85:
399
+ print(f'Coverage {pct}% is below 85% threshold')
400
+ sys.exit(1)
401
+ print('Coverage meets 85% threshold')
402
+ " || echo "Coverage check failed - see above for details"
392
403
 
393
404
  - name: Upload coverage to Codecov
394
- uses: codecov/codecov-action@v5
405
+ uses: codecov/codecov-action@v6
395
406
  with:
396
407
  token: ${{ secrets.CODECOV_TOKEN }}
397
408
  files: ./coverage.xml
@@ -400,7 +411,7 @@ jobs:
400
411
  fail_ci_if_error: false
401
412
 
402
413
  - name: Upload test results to Codecov
403
- uses: codecov/codecov-action@v5
414
+ uses: codecov/codecov-action@v6
404
415
  if: always()
405
416
  with:
406
417
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -410,7 +421,7 @@ jobs:
410
421
  fail_ci_if_error: false
411
422
 
412
423
  - name: Upload coverage artifacts
413
- uses: actions/upload-artifact@v4
424
+ uses: actions/upload-artifact@v7
414
425
  with:
415
426
  name: coverage-report
416
427
  path: coverage.xml
@@ -176,3 +176,6 @@ tmp/
176
176
  # MkDocs build output
177
177
  site/
178
178
  tck_*.txt
179
+
180
+ # Perf baseline results (machine-specific, generated by make test-perf)
181
+ benchmarks/real_dataset_baseline_v*.json
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.3.9] - 2026-05-04
11
+
12
+ ### Added
13
+ - **LALR(1) parser migration** (#365, #430) — grammar refactored to LALR(1); linear-time parsing replaces Earley; unknown function names now detected at parse time; 586 new parser tests; OOM-safe local coverage via sharded `make coverage`
14
+ - **Property equality index for O(1) node lookup** (#390, #427) — in-memory `_prop_index` (prop → value → {node\_id}) on `Graph`; `get_nodes_by_property` and `get_nodes_by_label_and_property` methods; executor `_extract_equality_hints` replaces full scan with index lookup when a `ScanNodes` is followed by a simple equality `Filter`; index maintained on `SET`/`REMOVE`/`DELETE`
15
+ - **Bulk ingestion API** (#389, #444) — `create_node_bulk`, `create_relationship_bulk` (skip per-call Pydantic validation); `bulk_ingest()` context manager defers statistics rebuilds until exit via `_flush_deferred_stats()`; CSV loader uses bulk path; significant throughput improvement for dataset loading
16
+ - **Real-dataset QA and performance profiling suite** (#417, #419) — 5-tier perf suite (karate 34n, ego-facebook 4k, amazon 334k, livejournal 4M, orkut 117M edges); `scripts/perf_report.py` renders baseline/delta Markdown tables; `make test-perf`, `make test-perf-xs`, `make test-perf-large`, `make test-perf-slow` targets; L/XL tier benchmarks added; `perf_slow` marker applied consistently (#440, #441)
17
+ - **`elementId()` scalar function** (#211, #447) — GQL-spec `elementId(node|rel)` returns the element id as `CypherString`; `id()` continues to return `CypherInt`; NULL-safe; arity-checked
18
+ - **Scale limits documentation** — `docs/reference/scale-limits.md` explains LIMIT-respecting (~20M edges) vs full-scan (~1M edges) performance ceilings; README graph-size claim updated to reflect edge-count as binding constraint (#443)
19
+ - **`make pre-push-fast`** (#429, #437) — fast-fail pre-push shortcut (format, lint, type, security, docstrings; no coverage); inline coverage thresholds (85% total, 90% patch)
20
+
21
+ ### Fixed
22
+ - **Fixed-length hop ignores rel predicate** (#431, #439) — fixed-length traversal now evaluates `rel_pattern.predicate` inline; parser predicate whitelist replaced with open accept
23
+ - **var-length relationship predicates** (#381, #425) — `_var_length_reachable` now evaluates inline relationship predicates (e.g. `[*1..3 {weight: 1}]`) at each hop instead of ignoring them
24
+ - **Cross-hop edge uniqueness in multi-segment patterns** (#382, #425) — `initial_used_edge_ids` seeds the visited-edge set from prior hops, preventing the same edge being traversed twice across pattern segments
25
+ - **SQLite delete persistence** (#409, #421) — deleted nodes and edges now removed from SQLite backend; previously they resurrected on reload
26
+ - **SQLite bulk I/O** (#392, #421) — `save_nodes_bulk` / `save_edges_bulk` use `executemany`; `_save_graph_to_backend` wrapped in rollback; resolves >20s hang on M-tier reload
27
+ - **`sys.setrecursionlimit` thread safety** (#433, #445) — limit set once in `CypherParser.__init__` instead of per-request get/set/restore, eliminating races in concurrent parser use
28
+ - **Transaction rollback restores ID counters** (#412) — `rollback()` restores `_next_node_id` and `_next_edge_id`, preventing ID gaps after aborted transactions
29
+ - **Closed-instance guard** (#411) — `execute()` and mutation methods raise `RuntimeError` after `close()`
30
+ - **`DatasetInfo` rejects `ftp://` URLs** (#414)
31
+ - **TCK metrics CI gate** (#410) — `tck_metrics.py` exits non-zero on TCK failures
32
+
33
+ ### Performance
34
+ - **UNWIND + WITH LIMIT short-circuit** (#393, #443) — `_pipeline_limit` reverse-scan treats pass-through `With(limit_count=N, no sort, no filter)` as transparent; `_execute_unwind` respects `row_limit` and exits early; `UNWIND range(1M, 2M) AS i WITH i LIMIT 3000 RETURN sum(i)` drops from ~4.5s to <10ms
35
+ - **LIMIT short-circuit for scan and expand operators** (#422, #423) — `_pipeline_limit` look-ahead stops scan/expand at row budget; write operators and Filter block short-circuit to preserve correctness
36
+ - **SQLite PRAGMA tuning** (#392, #446) — `synchronous=NORMAL` (eliminates `fdatasync` per commit), 64 MB page cache (`cache_size=-65536`), `temp_store=MEMORY`; safe with WAL mode for analytical workloads
37
+ - **Lazy statistics timestamp** — `_stats_last_updated` stamped at read time in `get_statistics()` rather than on every add; `_defer_stats` flag eliminates per-edge stat overhead during bulk ingest
38
+
39
+ ### CI / Tooling
40
+ - **Test suite zero-base renovation** (#428, #438) — fixture strategy audit, duplication removal, marker consistency, parametrization improvements across unit and integration suites
41
+ - **GHA actions updated** — `actions/upload-artifact` v7, `actions/download-artifact` v8, `codecov/codecov-action` v6, `actions/upload-pages-artifact` v5, `astral-sh/setup-uv` v8.1.0
42
+
10
43
  ## [0.3.8] - 2026-05-02
11
44
 
12
45
  ### Fixed - TCK Feature Completeness (3885/3885 passing)
@@ -51,6 +51,16 @@ make pre-push
51
51
 
52
52
  Runs: format-check, lint, type-check, coverage (85% total, 90% patch).
53
53
 
54
+ **Before running tests locally during planning:** If the branch has no committed changes yet (i.e., you're still in the planning phase), check the last CI run instead of running the full test suite locally. This avoids OOM errors from running all tests unnecessarily.
55
+
56
+ ```bash
57
+ # Check last CI run status and test results
58
+ gh run list --branch main --limit 5
59
+ gh run view <run-id> --log-failed # see only failed tests
60
+ ```
61
+
62
+ Only run tests locally once you have actual code changes to validate.
63
+
54
64
  ### 5. Commit with Issue Number
55
65
 
56
66
  ```bash
@@ -77,16 +87,21 @@ GitHub automatically closes the issue when PR merges.
77
87
  ## Development Commands
78
88
 
79
89
  ```bash
80
- make pre-push # Run all checks (mirrors CI)
90
+ make pre-push # Run all checks (mirrors CI): format, lint, type, security, docstrings, coverage + thresholds
91
+ make pre-push-fast # Fast checks only (no coverage, ~30s): format, lint, type, security, docstrings
81
92
  make test # All tests
82
93
  make test-unit # Unit tests only
83
94
  make test-integration # Integration tests only
84
- make coverage # Run with coverage
95
+ make coverage # Run with coverage + validate thresholds (sharded, includes 85%/90% checks)
96
+ make coverage-quick # Coverage on unit tests only (fast feedback during development)
85
97
  make coverage-report # View HTML coverage report
86
98
  make coverage-diff # Coverage for changed files only
87
99
 
88
100
  # Run tests in parallel (4x faster for TCK)
89
101
  pytest tests/ -n auto
102
+
103
+ # Override worker count (default 4, lower to reduce memory)
104
+ PYTEST_WORKERS=2 make test
90
105
  ```
91
106
 
92
107
  **Coverage Requirements:**
@@ -94,6 +109,8 @@ pytest tests/ -n auto
94
109
  - Patch: 90% minimum for changed files
95
110
  - Best practice: Aim for 100% on new code
96
111
 
112
+ **When to use `pre-push-fast`:** iterating on non-test changes (refactors, docs, config). Always run the full `pre-push` before opening a PR.
113
+
97
114
  ## Architecture: 4-Layer System
98
115
 
99
116
  ```
@@ -0,0 +1,180 @@
1
+ .PHONY: help lint format type-check security test pre-push pre-push-fast clean test-tck docstring-coverage test-network test-perf test-perf-xs test-perf-slow test-perf-large coverage coverage-quick coverage-report coverage-diff coverage-strict check-coverage check-patch-coverage test-durations test-analytics
2
+
3
+ help: ## Show this help message
4
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
5
+
6
+ lint: ## Run ruff linter
7
+ uv run ruff check .
8
+
9
+ format: ## Format code with ruff
10
+ uv run ruff format .
11
+
12
+ format-check: ## Check code formatting
13
+ uv run ruff format --check .
14
+
15
+ type-check: ## Run mypy type checker
16
+ uv run mypy src/graphforge --strict-optional --show-error-codes
17
+
18
+ security: ## Run Bandit security scanner
19
+ uv run bandit -c pyproject.toml -r src/
20
+
21
+ docstring-coverage: ## Check docstring coverage (90% minimum)
22
+ uv run interrogate src/graphforge --fail-under 90 --quiet
23
+
24
+ test: ## Run all tests in parallel (excludes snap/network downloads)
25
+ uv run pytest tests/ -n $${PYTEST_WORKERS:-4} -m "not snap"
26
+
27
+ test-unit: ## Run unit tests in parallel
28
+ uv run pytest tests/unit -n $${PYTEST_WORKERS:-4}
29
+
30
+ test-integration: ## Run integration tests in parallel (excludes snap/network downloads)
31
+ uv run pytest tests/integration -n $${PYTEST_WORKERS:-4} -m "not snap"
32
+
33
+ test-network: ## Run external network/download tests (snap datasets; requires internet)
34
+ uv run pytest tests/ -m "snap" -v
35
+
36
+ test-perf-xs: ## Run perf QA for XS/S datasets only (karate + ego-facebook, ~3 MB total)
37
+ uv run pytest tests/perf/ -m "perf and not perf_large and not perf_slow" -k "xs or s_face" -v -s
38
+
39
+ test-perf: ## Run perf QA through M-tier (Amazon 334k nodes, ~15 MB); writes baseline JSON
40
+ uv run pytest tests/perf/ -m "perf and not perf_large and not perf_slow" -v -s
41
+ @echo ""
42
+ @echo "Baseline written to benchmarks/real_dataset_baseline_v0.3.9.json"
43
+
44
+ test-perf-slow: ## Run slow two-hop full-expansion benchmarks (opt-in; minutes on S/M, hours on L)
45
+ uv run pytest tests/perf/ -m "perf_slow" -v -s
46
+
47
+ test-perf-large: ## Run L/XL tiers (livejournal 500 MB, cit-patents 270 MB, orkut 1.7 GB); needs 16 GB RAM
48
+ uv run pytest tests/perf/ -m "perf and perf_large" -v -s --timeout=3600
49
+
50
+ test-tck: ## Run TCK compliance tests in parallel
51
+ uv run pytest tests/tck/ -n $${PYTEST_WORKERS:-4} -v
52
+
53
+ coverage: ## Run tests with coverage and validate thresholds (sharded to avoid OOM)
54
+ @echo "━━━ Coverage shard 1/2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
55
+ uv run coverage erase
56
+ uv run pytest tests/unit tests/integration -m "not snap" \
57
+ --splits 2 --group 1 \
58
+ -n $${PYTEST_WORKERS:-4} \
59
+ --cov=src --cov-branch \
60
+ --cov-report= \
61
+ --cov-append
62
+ @echo "━━━ Coverage shard 2/2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
63
+ uv run pytest tests/unit tests/integration -m "not snap" \
64
+ --splits 2 --group 2 \
65
+ -n $${PYTEST_WORKERS:-4} \
66
+ --cov=src --cov-branch \
67
+ --cov-report=term-missing \
68
+ --cov-report=xml \
69
+ --cov-append
70
+ @echo "━━━ Threshold checks ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
71
+ @uv run coverage report --fail-under=85 || \
72
+ (echo "❌ Total coverage below 85% threshold" && exit 1)
73
+ @echo "✅ Total coverage ≥ 85%"
74
+ @DIFF_OUT=$$(git diff --name-only origin/main... 2>&1) || \
75
+ { echo "❌ git diff failed — check that origin/main is accessible"; exit 1; }; \
76
+ CHANGED_FILES=$$(printf '%s\n' "$$DIFF_OUT" | grep '^src/.*\.py$$' || true); \
77
+ if [ -z "$$CHANGED_FILES" ]; then \
78
+ echo "ℹ️ No source files changed — skipping patch coverage check"; \
79
+ else \
80
+ echo "Changed files:"; \
81
+ echo "$$CHANGED_FILES" | sed 's/^/ - /'; \
82
+ INCLUDE_PATTERN=$$(echo "$$CHANGED_FILES" | tr '\n' ',' | sed 's/,$$//'); \
83
+ uv run coverage report --include="$$INCLUDE_PATTERN" --fail-under=90 || \
84
+ (echo "❌ Patch coverage below 90% for changed files" && \
85
+ echo " Run 'make coverage-report' to see detailed coverage" && \
86
+ exit 1); \
87
+ echo "✅ Patch coverage ≥ 90%"; \
88
+ fi
89
+
90
+ coverage-quick: ## Quick coverage on unit tests only (for iterative development)
91
+ @echo "Running unit tests with coverage..."
92
+ uv run pytest tests/unit \
93
+ -n $${PYTEST_WORKERS:-4} \
94
+ --cov=src --cov-branch \
95
+ --cov-report=term-missing \
96
+ --cov-report=xml
97
+
98
+ test-durations: ## Generate .test_durations for pytest-split shard balancing
99
+ uv run pytest tests/unit tests/integration -m "not snap" \
100
+ --store-durations --durations-path=.test_durations -q
101
+
102
+ test-analytics: ## Run tests with analytics output (JUnit XML)
103
+ @echo "Running tests with analytics output..."
104
+ uv run pytest tests/unit tests/integration \
105
+ --junitxml=test-results-local.xml \
106
+ -v
107
+
108
+ check-coverage: ## Validate total coverage meets 85% threshold (uses existing .coverage data)
109
+ @echo "Checking coverage thresholds..."
110
+ @uv run coverage report --fail-under=85 || \
111
+ (echo "❌ Coverage below 85% threshold" && exit 1)
112
+ @echo "✅ Coverage meets threshold"
113
+
114
+ coverage-strict: ## Strict 90% coverage check for new features
115
+ @echo "Checking strict coverage (90%)..."
116
+ @uv run coverage report --fail-under=90 || \
117
+ (echo "❌ Coverage below 90% - consider adding more tests" && exit 1)
118
+ @echo "✅ Coverage meets strict threshold"
119
+
120
+ coverage-report: ## Generate HTML coverage report and open in browser
121
+ @echo "Generating HTML coverage report..."
122
+ uv run coverage html
123
+ @echo "Opening coverage report in browser..."
124
+ @open htmlcov/index.html || xdg-open htmlcov/index.html || \
125
+ echo "Coverage report generated at htmlcov/index.html"
126
+
127
+ coverage-diff: ## Show coverage for changed files only
128
+ @echo "Showing coverage for changed files..."
129
+ @CHANGED_FILES=$$(git diff --name-only origin/main... | grep '\.py$$' || true); \
130
+ if [ -z "$$CHANGED_FILES" ]; then \
131
+ echo "ℹ️ No Python files changed"; \
132
+ else \
133
+ INCLUDE_PATTERN=$$(echo "$$CHANGED_FILES" | tr '\n' ',' | sed 's/,$$//'); \
134
+ uv run coverage report --include="$$INCLUDE_PATTERN"; \
135
+ fi
136
+
137
+ check-patch-coverage: ## Validate patch coverage for changed files (90% threshold, uses existing .coverage data)
138
+ @echo "Checking patch coverage for changed files..."
139
+ @DIFF_OUT=$$(git diff --name-only origin/main... 2>&1) || \
140
+ { echo "❌ git diff failed — check that origin/main is accessible"; exit 1; }; \
141
+ CHANGED_FILES=$$(printf '%s\n' "$$DIFF_OUT" | grep '^src/.*\.py$$' || true); \
142
+ if [ -z "$$CHANGED_FILES" ]; then \
143
+ echo "ℹ️ No source files changed - skipping patch coverage check"; \
144
+ else \
145
+ echo "Changed files:"; \
146
+ echo "$$CHANGED_FILES" | sed 's/^/ - /'; \
147
+ INCLUDE_PATTERN=$$(echo "$$CHANGED_FILES" | tr '\n' ',' | sed 's/,$$//'); \
148
+ uv run coverage report --include="$$INCLUDE_PATTERN" --fail-under=90 || \
149
+ (echo "❌ Patch coverage below 90% for changed files" && \
150
+ echo " Run 'make coverage-report' to see detailed coverage" && \
151
+ exit 1); \
152
+ echo "✅ Patch coverage meets 90% threshold"; \
153
+ fi
154
+
155
+ pre-push-fast: ## Run fast checks only — format, lint, type, security, docstrings (no coverage, ~30s)
156
+ @echo "━━━ Format check ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
157
+ @$(MAKE) format-check
158
+ @echo "━━━ Lint ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
159
+ @$(MAKE) lint
160
+ @echo "━━━ Type check ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
161
+ @$(MAKE) type-check
162
+ @echo "━━━ Security ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
163
+ @$(MAKE) security
164
+ @echo "━━━ Docstring coverage ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
165
+ @$(MAKE) docstring-coverage
166
+ @echo "✅ Fast checks passed! Run 'make pre-push' to include coverage."
167
+
168
+ pre-push: ## Run all pre-push checks — fast checks + coverage with thresholds (mirrors CI)
169
+ @$(MAKE) pre-push-fast
170
+ @echo "━━━ Coverage + thresholds ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
171
+ @$(MAKE) coverage
172
+ @echo "✅ All pre-push checks passed!"
173
+
174
+ clean: ## Clean up cache files
175
+ find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
176
+ find . -type d -name .pytest_cache -exec rm -rf {} + 2>/dev/null || true
177
+ find . -type d -name .mypy_cache -exec rm -rf {} + 2>/dev/null || true
178
+ find . -type f -name "*.pyc" -delete 2>/dev/null || true
179
+ rm -f test-results*.xml coverage.xml 2>/dev/null || true
180
+ rm -rf htmlcov/ 2>/dev/null || true
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphforge
3
- Version: 0.3.8
3
+ Version: 0.3.9
4
4
  Summary: Composable graph tooling for analysis, construction, and refinement
5
5
  Project-URL: Homepage, https://github.com/DecisionNerd/graphforge
6
6
  Project-URL: Repository, https://github.com/DecisionNerd/graphforge
@@ -38,7 +38,7 @@ Requires-Dist: pytest-split>=0.9.0; extra == 'dev'
38
38
  Requires-Dist: pytest-timeout>=2.0; extra == 'dev'
39
39
  Requires-Dist: pytest-xdist>=3.0; extra == 'dev'
40
40
  Requires-Dist: pytest>=9.0.3; extra == 'dev'
41
- Requires-Dist: ruff==0.15.4; extra == 'dev'
41
+ Requires-Dist: ruff==0.15.12; extra == 'dev'
42
42
  Provides-Extra: docs
43
43
  Requires-Dist: mkdocs-autorefs>=1.0.0; extra == 'docs'
44
44
  Requires-Dist: mkdocs-material>=9.5.0; extra == 'docs'
@@ -84,6 +84,9 @@ Description-Content-Type: text/markdown
84
84
 
85
85
  ## Why GraphForge?
86
86
 
87
+ > *We are not building a database for applications.*
88
+ > *We are building a graph execution environment for thinking.*
89
+
87
90
  Modern data science and ML workflows increasingly produce graph-shaped data — entity relationships extracted by LLMs, citation networks, dependency graphs, social connections, knowledge bases. Working with this data shouldn't require running a database server. GraphForge brings the full expressiveness of the openCypher query language to the Python notebook and script environment: zero configuration, single-file persistence, and first-class Python integration.
88
91
 
89
92
  | | NetworkX | **GraphForge** | Neo4j / Memgraph |
@@ -92,19 +95,20 @@ Modern data science and ML workflows increasingly produce graph-shaped data —
92
95
  | **Query language** | Python API | **Full openCypher** | Full Cypher |
93
96
  | **Persistence** | Manual | **SQLite (automatic)** | Native |
94
97
  | **Notebook-friendly** | ✓ | ✓ | Requires connection |
95
- | **Graph size** | Millions | < 10M nodes | Billions |
98
+ | **Graph size** | Millions | up to ~20M edges† | Billions |
96
99
  | **TCK compliance** | N/A | **100% (3,885/3,885)** | ~100% |
97
100
 
98
101
  **Use GraphForge for:** knowledge graphs, citation networks, research workflows, LLM output storage, social network analysis in notebooks.
99
102
 
100
- **Use a production database for:** high throughput, multi-user access, graphs > 10M nodes.
103
+ **Use a production database for:** high throughput, multi-user access, or graphs beyond the limits in [Scale Limits](docs/reference/scale-limits.md).
101
104
 
102
- > *We are not building a database for applications.*
103
- > *We are building a graph execution environment for thinking.*
105
+ † *Traversal queries with LIMIT scale to ~20M edges; full-scan aggregations are practical up to ~1M edges.*
106
+
107
+ ### v0.3.9 — Performance Release
104
108
 
105
- ### v0.3.8 — Full TCK Compliance
109
+ v0.3.9 delivers substantial performance improvements over v0.3.8: LALR(1) linear-time parsing, O(1) property equality index, LIMIT short-circuit for traversal and UNWIND, bulk ingestion API, SQLite PRAGMA tuning, and `elementId()`. TCK compliance is maintained at **3,885/3,885 (100%)**.
106
110
 
107
- As of v0.3.8, GraphForge passes **all 3,885 openCypher TCK scenarios** with zero failures and zero expected failures. This is the first embedded Python graph database to achieve complete openCypher TCK compliance.
111
+ See [CHANGELOG.md](CHANGELOG.md) for the full list of changes.
108
112
 
109
113
  ---
110
114
 
@@ -282,9 +286,6 @@ load_dataset(db, "snap-ego-facebook") # Facebook ego networks (SNAP)
282
286
  load_dataset(db, "ldbc-snb-sf0.1") # Social network benchmark (LDBC)
283
287
  load_dataset(db, "netrepo-karate") # Karate club (NetworkRepository)
284
288
 
285
- # Load from URL directly
286
- load_dataset(db, "https://nrvis.com/download/data/labeled/karate.zip")
287
-
288
289
  # Browse available datasets
289
290
  for ds in list_datasets(source="snap")[:3]:
290
291
  print(f"{ds.name}: {ds.nodes:,} nodes, {ds.edges:,} edges")
@@ -300,7 +301,7 @@ results = db.execute("""
300
301
  **Available sources:**
301
302
  - **SNAP** (Stanford): 95 social, web, email, citation, and collaboration networks
302
303
  - **LDBC**: 10 social network benchmark datasets with temporal data
303
- - **NetworkRepository**: 10 pre-registered + thousands via direct URL
304
+ - **NetworkRepository**: 10 pre-registered datasets
304
305
 
305
306
  ---
306
307
 
@@ -329,13 +330,13 @@ GraphForge is built in four independent layers:
329
330
 
330
331
  ```
331
332
  ┌─────────────────────────────────────────────────┐
332
- │ Parser cypher.lark + parser.py │ Cypher → AST
333
+ │ Parser cypher.lark + parser.py │ Cypher → AST
333
334
  ├─────────────────────────────────────────────────┤
334
- │ Planner planner.py + operators.py │ AST → Logical plan
335
+ │ Planner planner.py + operators.py │ AST → Logical plan
335
336
  ├─────────────────────────────────────────────────┤
336
- │ Executor executor.py + evaluator.py │ Plan → Results
337
+ │ Executor executor.py + evaluator.py │ Plan → Results
337
338
  ├─────────────────────────────────────────────────┤
338
- │ Storage memory.py + sqlite_backend.py │ In-memory + SQLite
339
+ │ Storage memory.py + sqlite_backend.py │ In-memory + SQLite
339
340
  └─────────────────────────────────────────────────┘
340
341
  ```
341
342
 
@@ -367,8 +368,9 @@ make coverage
367
368
  | Version | Focus | Status |
368
369
  |---------|-------|--------|
369
370
  | v0.3.8 | Full TCK compliance (3,885/3,885) | **Released** |
370
- | v0.3.9 | Performance: LALR parser, property indexes, SQLite tuning | Planned |
371
- | v0.4.0 | Analytics: NetworkX/igraph integration, SNA algorithms | Planned |
371
+ | v0.3.9 | Performance: LALR parser, property indexes, bulk ingest, SQLite tuning, LIMIT short-circuit | **Released** |
372
+ | v0.3.10 | Analytics integration: NetworkX/igraph export, parse/plan cache | Planned |
373
+ | v0.4.0 | Native SNA algorithms: PageRank, betweenness, WCC, shortest path via `CALL gf.algo.*` | Planned |
372
374
  | v1.0 | Production-ready: thread safety, large graph support | Future |
373
375
 
374
376
  See [CHANGELOG.md](CHANGELOG.md) for full release history.