graphforge 0.3.7__tar.gz → 0.3.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (708) hide show
  1. {graphforge-0.3.7 → graphforge-0.3.9}/.github/workflows/changelog-check.yml +4 -0
  2. {graphforge-0.3.7 → graphforge-0.3.9}/.github/workflows/docs.yml +3 -3
  3. {graphforge-0.3.7 → graphforge-0.3.9}/.github/workflows/publish.yaml +1 -1
  4. graphforge-0.3.9/.github/workflows/test.yml +427 -0
  5. {graphforge-0.3.7 → graphforge-0.3.9}/.gitignore +3 -0
  6. {graphforge-0.3.7 → graphforge-0.3.9}/CHANGELOG.md +72 -1
  7. {graphforge-0.3.7 → graphforge-0.3.9}/CLAUDE.md +19 -2
  8. graphforge-0.3.9/Makefile +180 -0
  9. graphforge-0.3.9/PKG-INFO +384 -0
  10. graphforge-0.3.9/README.md +336 -0
  11. graphforge-0.3.9/benchmarks/.gitkeep +0 -0
  12. {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/snap.md +1 -1
  13. graphforge-0.3.9/docs/development/parser-performance-analysis.md +139 -0
  14. graphforge-0.3.9/docs/development/perf-baseline-findings-v0.3.9.md +104 -0
  15. graphforge-0.3.9/docs/development/perf-v038-to-v039-delta.md +297 -0
  16. graphforge-0.3.9/docs/getting-started/installation.md +43 -0
  17. graphforge-0.3.9/docs/getting-started/quickstart.md +112 -0
  18. {graphforge-0.3.7 → graphforge-0.3.9}/docs/getting-started/tutorial.md +3 -3
  19. graphforge-0.3.9/docs/guide/cypher-guide.md +840 -0
  20. graphforge-0.3.9/docs/index.md +83 -0
  21. graphforge-0.3.9/docs/reference/RELEASE_TRACKING.md +61 -0
  22. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/implementation-status/clauses.md +2 -0
  23. graphforge-0.3.9/docs/reference/implementation-status/functions.md +347 -0
  24. graphforge-0.3.9/docs/reference/opencypher-compatibility-matrix.md +469 -0
  25. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-compatibility.md +70 -163
  26. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-features/01-clauses.md +1 -1
  27. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-features/05-data-types.md +2 -2
  28. graphforge-0.3.9/docs/reference/scale-limits.md +139 -0
  29. graphforge-0.3.9/docs/reference/tck-compliance.md +58 -0
  30. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/tck-inventory.md +1 -1
  31. graphforge-0.3.9/docs/releases/roadmap.md +90 -0
  32. {graphforge-0.3.7 → graphforge-0.3.9}/docs/use-cases/agent-grounding.md +2 -1
  33. graphforge-0.3.9/docs/use-cases/agent-tool-recall.md +467 -0
  34. graphforge-0.3.9/docs/use-cases/knowledge-graph-construction.md +524 -0
  35. graphforge-0.3.9/docs/use-cases/llm-workflows.md +589 -0
  36. graphforge-0.3.9/docs/use-cases/network-analysis.md +619 -0
  37. {graphforge-0.3.7 → graphforge-0.3.9}/mkdocs.yml +6 -0
  38. {graphforge-0.3.7 → graphforge-0.3.9}/pyproject.toml +19 -5
  39. graphforge-0.3.9/scripts/perf_report.py +86 -0
  40. {graphforge-0.3.7 → graphforge-0.3.9}/scripts/tck_metrics.py +20 -8
  41. graphforge-0.3.9/scripts/tck_perf_report.py +179 -0
  42. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/api.py +229 -60
  43. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/ast/__init__.py +2 -0
  44. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/ast/clause.py +34 -18
  45. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/ast/expression.py +46 -7
  46. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/ast/pattern.py +4 -0
  47. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/base.py +1 -1
  48. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/csv.py +59 -61
  49. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/executor/evaluator.py +1100 -93
  50. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/executor/executor.py +1495 -331
  51. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/optimizer/join_reorder.py +16 -9
  52. graphforge-0.3.9/src/graphforge/optimizer/predicate_utils.py +288 -0
  53. graphforge-0.3.9/src/graphforge/parser/cypher.lark +374 -0
  54. graphforge-0.3.9/src/graphforge/parser/parser.py +1922 -0
  55. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/planner/operators.py +92 -7
  56. graphforge-0.3.9/src/graphforge/planner/planner.py +3487 -0
  57. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/planner/types.py +32 -1
  58. graphforge-0.3.9/src/graphforge/procedures/__init__.py +5 -0
  59. graphforge-0.3.9/src/graphforge/procedures/registry.py +142 -0
  60. graphforge-0.3.9/src/graphforge/storage/memory.py +530 -0
  61. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/storage/serialization.py +22 -6
  62. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/storage/sqlite_backend.py +83 -4
  63. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/types/values.py +401 -60
  64. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_end_to_end_workflows.py +2 -0
  65. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/executor/test_graph_functions.py +6 -6
  66. graphforge-0.3.9/tests/integration/test_call_procedures.py +140 -0
  67. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_column_naming.py +6 -6
  68. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_complex_merge_patterns.py +6 -22
  69. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_create_edge_cases.py +10 -13
  70. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_merge_edge_cases.py +34 -114
  71. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_merge_on_create_real.py +7 -15
  72. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_mixed_type_sort.py +20 -17
  73. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_optional_match.py +9 -3
  74. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_path_binding_variable_length.py +8 -7
  75. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_pattern_comprehension.py +56 -36
  76. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_pattern_predicates.py +118 -2
  77. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_sqlite_persistence.py +80 -0
  78. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_transactions.py +90 -0
  79. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_type_functions.py +16 -17
  80. graphforge-0.3.9/tests/integration/test_varlen_predicate_and_uniqueness.py +142 -0
  81. graphforge-0.3.9/tests/perf/__init__.py +0 -0
  82. graphforge-0.3.9/tests/perf/conftest.py +90 -0
  83. graphforge-0.3.9/tests/perf/test_real_datasets.py +262 -0
  84. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/conftest.py +433 -82
  85. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/tck_config.yaml +1 -26
  86. graphforge-0.3.9/tests/unit/api/test_api_coverage.py +268 -0
  87. graphforge-0.3.9/tests/unit/api/test_bulk_ingest.py +138 -0
  88. graphforge-0.3.9/tests/unit/ast/test_expression_coverage.py +253 -0
  89. graphforge-0.3.9/tests/unit/datasets/test_compression_coverage.py +866 -0
  90. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_registry.py +16 -16
  91. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_snap_datasets.py +5 -1
  92. graphforge-0.3.9/tests/unit/executor/test_element_id.py +95 -0
  93. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_evaluator.py +11 -18
  94. graphforge-0.3.9/tests/unit/executor/test_evaluator_coverage_boost.py +1345 -0
  95. graphforge-0.3.9/tests/unit/executor/test_executor_coverage_boost.py +1318 -0
  96. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_executor_error_paths.py +5 -5
  97. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_expressions_match.py +31 -1
  98. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_graph_functions.py +6 -6
  99. graphforge-0.3.9/tests/unit/executor/test_infer_rel_var.py +84 -0
  100. graphforge-0.3.9/tests/unit/executor/test_limit_short_circuit.py +210 -0
  101. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_map_property_access.py +13 -8
  102. graphforge-0.3.9/tests/unit/executor/test_optional_expand_bound_dst.py +188 -0
  103. graphforge-0.3.9/tests/unit/executor/test_parenthesized_expr_coverage.py +121 -0
  104. graphforge-0.3.9/tests/unit/executor/test_procedure_call_executor.py +143 -0
  105. graphforge-0.3.9/tests/unit/executor/test_property_index_executor.py +294 -0
  106. graphforge-0.3.9/tests/unit/executor/test_set_extensions.py +143 -0
  107. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_temporal_truncate_arithmetic.py +5 -3
  108. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_type_conversion_complex.py +11 -11
  109. graphforge-0.3.9/tests/unit/executor/test_unwind_limit_short_circuit.py +95 -0
  110. graphforge-0.3.9/tests/unit/optimizer/test_join_reorder_coverage.py +362 -0
  111. graphforge-0.3.9/tests/unit/optimizer/test_optimizer_coverage.py +232 -0
  112. graphforge-0.3.9/tests/unit/optimizer/test_predicate_utils_coverage.py +286 -0
  113. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_statistics.py +3 -3
  114. graphforge-0.3.9/tests/unit/parser/test_call_procedure_parser.py +84 -0
  115. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_parser_caching.py +14 -4
  116. graphforge-0.3.9/tests/unit/parser/test_parser_coverage_boost.py +869 -0
  117. graphforge-0.3.9/tests/unit/parser/test_pattern_comprehension_binding.py +108 -0
  118. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_pattern_predicates.py +56 -0
  119. graphforge-0.3.9/tests/unit/planner/test_call_procedure_planner.py +101 -0
  120. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_planner_branch_coverage.py +8 -4
  121. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_planner_edge_cases.py +9 -7
  122. graphforge-0.3.9/tests/unit/planner/test_syntax_error_validation.py +286 -0
  123. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_type_tracking.py +7 -2
  124. graphforge-0.3.9/tests/unit/procedures/__init__.py +0 -0
  125. graphforge-0.3.9/tests/unit/procedures/test_registry.py +138 -0
  126. graphforge-0.3.9/tests/unit/storage/test_property_index.py +185 -0
  127. graphforge-0.3.9/tests/unit/storage/test_sqlite_backend_delete_bulk.py +194 -0
  128. graphforge-0.3.9/tests/unit/storage/test_storage_coverage.py +217 -0
  129. graphforge-0.3.9/tests/unit/test_procedure_registry_coverage.py +191 -0
  130. graphforge-0.3.9/tests/unit/types/test_extreme_temporal_values.py +554 -0
  131. {graphforge-0.3.7 → graphforge-0.3.9}/uv.lock +60 -36
  132. graphforge-0.3.7/.github/workflows/test.yml +0 -227
  133. graphforge-0.3.7/Makefile +0 -107
  134. graphforge-0.3.7/PKG-INFO +0 -1645
  135. graphforge-0.3.7/README.md +0 -1599
  136. graphforge-0.3.7/docs/getting-started/installation.md +0 -44
  137. graphforge-0.3.7/docs/getting-started/quickstart.md +0 -112
  138. graphforge-0.3.7/docs/guide/cypher-guide.md +0 -811
  139. graphforge-0.3.7/docs/index.md +0 -109
  140. graphforge-0.3.7/docs/reference/RELEASE_TRACKING.md +0 -279
  141. graphforge-0.3.7/docs/reference/implementation-status/functions.md +0 -451
  142. graphforge-0.3.7/docs/reference/opencypher-compatibility-matrix.md +0 -539
  143. graphforge-0.3.7/docs/reference/tck-compliance.md +0 -272
  144. graphforge-0.3.7/docs/releases/roadmap.md +0 -685
  145. graphforge-0.3.7/src/graphforge/optimizer/predicate_utils.py +0 -184
  146. graphforge-0.3.7/src/graphforge/parser/cypher.lark +0 -313
  147. graphforge-0.3.7/src/graphforge/parser/parser.py +0 -1255
  148. graphforge-0.3.7/src/graphforge/planner/planner.py +0 -1478
  149. graphforge-0.3.7/src/graphforge/storage/memory.py +0 -435
  150. {graphforge-0.3.7 → graphforge-0.3.9}/.codecov.yml +0 -0
  151. {graphforge-0.3.7 → graphforge-0.3.9}/.coderabbit.yaml +0 -0
  152. {graphforge-0.3.7 → graphforge-0.3.9}/.editorconfig +0 -0
  153. {graphforge-0.3.7 → graphforge-0.3.9}/.github/CODEOWNERS +0 -0
  154. {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  155. {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  156. {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  157. {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  158. {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  159. {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  160. {graphforge-0.3.7 → graphforge-0.3.9}/.github/ISSUE_WORKFLOW.md +0 -0
  161. {graphforge-0.3.7 → graphforge-0.3.9}/.github/SECURITY.md +0 -0
  162. {graphforge-0.3.7 → graphforge-0.3.9}/.github/dependabot.yml +0 -0
  163. {graphforge-0.3.7 → graphforge-0.3.9}/.github/pull_request_template.md +0 -0
  164. {graphforge-0.3.7 → graphforge-0.3.9}/.github/workflows/README.md +0 -0
  165. {graphforge-0.3.7 → graphforge-0.3.9}/.github/workflows/pr-labeler.yml +0 -0
  166. {graphforge-0.3.7 → graphforge-0.3.9}/.github/workflows/release-tracking.yml +0 -0
  167. {graphforge-0.3.7 → graphforge-0.3.9}/.pre-commit-config.yaml +0 -0
  168. {graphforge-0.3.7 → graphforge-0.3.9}/CHANGELOG_v0.3.0.md +0 -0
  169. {graphforge-0.3.7 → graphforge-0.3.9}/CODE_OF_CONDUCT.md +0 -0
  170. {graphforge-0.3.7 → graphforge-0.3.9}/CONTRIBUTING.md +0 -0
  171. {graphforge-0.3.7 → graphforge-0.3.9}/IMPLEMENTATION_PLAN.md +0 -0
  172. {graphforge-0.3.7 → graphforge-0.3.9}/LICENSE +0 -0
  173. {graphforge-0.3.7 → graphforge-0.3.9}/RELEASING.md +0 -0
  174. {graphforge-0.3.7 → graphforge-0.3.9}/coverage.json +0 -0
  175. {graphforge-0.3.7 → graphforge-0.3.9}/docs/architecture/ast-and-planning.md +0 -0
  176. {graphforge-0.3.7 → graphforge-0.3.9}/docs/architecture/execution-model.md +0 -0
  177. {graphforge-0.3.7 → graphforge-0.3.9}/docs/architecture/overview.md +0 -0
  178. {graphforge-0.3.7 → graphforge-0.3.9}/docs/architecture/storage-analysis.md +0 -0
  179. {graphforge-0.3.7 → graphforge-0.3.9}/docs/architecture/storage.md +0 -0
  180. {graphforge-0.3.7 → graphforge-0.3.9}/docs/community/code-of-conduct.md +0 -0
  181. {graphforge-0.3.7 → graphforge-0.3.9}/docs/community/security.md +0 -0
  182. {graphforge-0.3.7 → graphforge-0.3.9}/docs/cypher-guide.md +0 -0
  183. {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/cypher-script-loading.md +0 -0
  184. {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/ldbc.md +0 -0
  185. {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/neo4j-examples.md +0 -0
  186. {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/networkrepository.md +0 -0
  187. {graphforge-0.3.7 → graphforge-0.3.9}/docs/datasets/overview.md +0 -0
  188. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/QUICKSTART_V0.2.md +0 -0
  189. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/codecov-integration.md +0 -0
  190. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/contributing.md +0 -0
  191. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/documentation-update-summary.md +0 -0
  192. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/phase-1a-completion-report.md +0 -0
  193. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/release-process.md +0 -0
  194. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/release-strategy.md +0 -0
  195. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/requirements.md +0 -0
  196. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-cicd-infrastructure.md +0 -0
  197. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-documentation.md +0 -0
  198. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-regression-fix.md +0 -0
  199. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-01-31-with-clause.md +0 -0
  200. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-02-01-codecov-setup.md +0 -0
  201. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-2026-02-01-column-naming-investigation.md +0 -0
  202. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/session-summary.md +0 -0
  203. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/tck-session-2026-01-31-final.md +0 -0
  204. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/sessions/tck-session-2026-01-31.md +0 -0
  205. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/tck_baseline_analysis_v0.3.md +0 -0
  206. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/testing-setup-complete.md +0 -0
  207. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/testing.md +0 -0
  208. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/v0.2-plan-summary.md +0 -0
  209. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/v0.4-revised-plan.md +0 -0
  210. {graphforge-0.3.7 → graphforge-0.3.9}/docs/development/workflow.md +0 -0
  211. {graphforge-0.3.7 → graphforge-0.3.9}/docs/guide/graph-construction.md +0 -0
  212. {graphforge-0.3.7 → graphforge-0.3.9}/docs/guide/overview.md +0 -0
  213. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/INCOMPLETE_FEATURES_ISSUES.md +0 -0
  214. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/README.md +0 -0
  215. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/VALIDATION_REPORT.md +0 -0
  216. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/api.md +0 -0
  217. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/changelog.md +0 -0
  218. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/column-naming-behavior.md +0 -0
  219. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-aggregation-functions.md +0 -0
  220. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-graph-queries.md +0 -0
  221. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-graph-schema.md +0 -0
  222. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-mapping/clause-to-tck.md +0 -0
  223. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-mapping/function-to-tck.md +0 -0
  224. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-order-by.md +0 -0
  225. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/feature-return-aliasing.md +0 -0
  226. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/implementation-status/operators.md +0 -0
  227. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/implementation-status/patterns.md +0 -0
  228. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-features/02-functions.md +0 -0
  229. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-features/03-operators.md +0 -0
  230. {graphforge-0.3.7 → graphforge-0.3.9}/docs/reference/opencypher-features/04-patterns.md +0 -0
  231. {graphforge-0.3.7 → graphforge-0.3.9}/docs/releases/implementation-summary.md +0 -0
  232. {graphforge-0.3.7 → graphforge-0.3.9}/docs/releases/next-steps.md +0 -0
  233. {graphforge-0.3.7 → graphforge-0.3.9}/docs/releases/phase-1-complete.md +0 -0
  234. {graphforge-0.3.7 → graphforge-0.3.9}/docs/releases/phase-2-complete.md +0 -0
  235. {graphforge-0.3.7 → graphforge-0.3.9}/docs/releases/phase-3-complete.md +0 -0
  236. {graphforge-0.3.7 → graphforge-0.3.9}/docs/stylesheets/extra.css +0 -0
  237. {graphforge-0.3.7 → graphforge-0.3.9}/examples/01_social_network.py +0 -0
  238. {graphforge-0.3.7 → graphforge-0.3.9}/examples/02_knowledge_graph.py +0 -0
  239. {graphforge-0.3.7 → graphforge-0.3.9}/examples/03_data_lineage.py +0 -0
  240. {graphforge-0.3.7 → graphforge-0.3.9}/examples/04_citation_network.py +0 -0
  241. {graphforge-0.3.7 → graphforge-0.3.9}/examples/05_migration_from_networkx.py +0 -0
  242. {graphforge-0.3.7 → graphforge-0.3.9}/examples/agent_grounding/ecommerce_agent.ipynb +0 -0
  243. {graphforge-0.3.7 → graphforge-0.3.9}/examples/basic_graph.py +0 -0
  244. {graphforge-0.3.7 → graphforge-0.3.9}/examples/basic_usage.py +0 -0
  245. {graphforge-0.3.7 → graphforge-0.3.9}/scripts/build_feature_graph.py +0 -0
  246. {graphforge-0.3.7 → graphforge-0.3.9}/scripts/bump_version.py +0 -0
  247. {graphforge-0.3.7 → graphforge-0.3.9}/scripts/check_release_needed.py +0 -0
  248. {graphforge-0.3.7 → graphforge-0.3.9}/scripts/inventory_tck.py +0 -0
  249. {graphforge-0.3.7 → graphforge-0.3.9}/scripts/pre-push-check.sh +0 -0
  250. {graphforge-0.3.7 → graphforge-0.3.9}/scripts/validate_datasets.py +0 -0
  251. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/__init__.py +0 -0
  252. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/ast/query.py +0 -0
  253. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/__init__.py +0 -0
  254. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/data/__init__.py +0 -0
  255. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/data/networkrepository.json +0 -0
  256. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/data/snap.json +0 -0
  257. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/exporters/__init__.py +0 -0
  258. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/exporters/json_graph.py +0 -0
  259. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/formats/__init__.py +0 -0
  260. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/formats/json_graph.py +0 -0
  261. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/__init__.py +0 -0
  262. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/compression.py +0 -0
  263. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/cypher.py +0 -0
  264. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/graphml.py +0 -0
  265. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/json_graph.py +0 -0
  266. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/ldbc.py +0 -0
  267. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/loaders/ldbc_schema.py +0 -0
  268. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/registry.py +0 -0
  269. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/__init__.py +0 -0
  270. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/graphml.py +0 -0
  271. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/json_graph.py +0 -0
  272. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/ldbc.py +0 -0
  273. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/networkrepository.py +0 -0
  274. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/datasets/sources/snap.py +0 -0
  275. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/executor/__init__.py +0 -0
  276. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/optimizer/__init__.py +0 -0
  277. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/optimizer/cost_model.py +0 -0
  278. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/optimizer/optimizer.py +0 -0
  279. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/optimizer/statistics.py +0 -0
  280. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/parser/__init__.py +0 -0
  281. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/planner/__init__.py +0 -0
  282. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/storage/__init__.py +0 -0
  283. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/storage/pydantic_serialization.py +0 -0
  284. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/types/__init__.py +0 -0
  285. {graphforge-0.3.7 → graphforge-0.3.9}/src/graphforge/types/graph.py +0 -0
  286. {graphforge-0.3.7 → graphforge-0.3.9}/tests/README.md +0 -0
  287. {graphforge-0.3.7 → graphforge-0.3.9}/tests/__init__.py +0 -0
  288. {graphforge-0.3.7 → graphforge-0.3.9}/tests/conftest.py +0 -0
  289. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/__init__.py +0 -0
  290. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/conftest.py +0 -0
  291. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_compression.py +0 -0
  292. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_cypher_loader_docs.py +0 -0
  293. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_graphml_loader.py +0 -0
  294. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_exporter.py +0 -0
  295. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_loader.py +0 -0
  296. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_json_graph_roundtrip.py +0 -0
  297. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_ldbc_loader.py +0 -0
  298. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/datasets/test_networkrepository_loader.py +0 -0
  299. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_aggregation_edge_cases.py +0 -0
  300. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_aggregation_functions_advanced.py +0 -0
  301. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_anonymous_relationships.py +0 -0
  302. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_arithmetic.py +0 -0
  303. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_builder_api.py +0 -0
  304. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_call_subqueries.py +0 -0
  305. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_case_expressions.py +0 -0
  306. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_collect.py +0 -0
  307. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_compact_iso8601.py +0 -0
  308. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_complex_where_predicates.py +0 -0
  309. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_create_clause.py +0 -0
  310. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_delete_null.py +0 -0
  311. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_detach_delete.py +0 -0
  312. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_distinct_clause.py +0 -0
  313. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_e2e_queries.py +0 -0
  314. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_executor_edge_cases.py +0 -0
  315. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_exists_is_empty.py +0 -0
  316. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_graph_element_comparison.py +0 -0
  317. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_hex_octal_literals.py +0 -0
  318. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_iana_timezones.py +0 -0
  319. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_id_function.py +0 -0
  320. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_issues_271_274.py +0 -0
  321. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_label_disjunction.py +0 -0
  322. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_label_predicate.py +0 -0
  323. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_comprehension.py +0 -0
  324. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_concatenation.py +0 -0
  325. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_functions.py +0 -0
  326. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_operations.py +0 -0
  327. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_path_overloading.py +0 -0
  328. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_list_subscript.py +0 -0
  329. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_logical_operators.py +0 -0
  330. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_map_subscript.py +0 -0
  331. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_match_create.py +0 -0
  332. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_math_functions.py +0 -0
  333. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_math_functions_extended.py +0 -0
  334. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_math_functions_new.py +0 -0
  335. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_merge_on_match_real.py +0 -0
  336. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_nan_handling.py +0 -0
  337. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_null_handling.py +0 -0
  338. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_operator_precedence.py +0 -0
  339. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_optimizer_aggregate_pushdown.py +0 -0
  340. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_optimizer_integration.py +0 -0
  341. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_optimizer_redundant_elimination.py +0 -0
  342. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_optional_match_delete.py +0 -0
  343. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_path_binding.py +0 -0
  344. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_path_functions.py +0 -0
  345. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_persistence.py +0 -0
  346. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_power_operator.py +0 -0
  347. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_predicate_functions.py +0 -0
  348. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_properties_keys_functions.py +0 -0
  349. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_relationship_directions.py +0 -0
  350. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_relationship_uniqueness.py +0 -0
  351. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_remove_clause.py +0 -0
  352. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_set_delete_merge.py +0 -0
  353. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_size_function.py +0 -0
  354. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_skip_limit_expressions.py +0 -0
  355. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_snap_dataset_loading.py +0 -0
  356. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_sort_after_aggregation.py +0 -0
  357. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_spatial_api.py +0 -0
  358. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_startnode_endnode_functions.py +0 -0
  359. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_string_functions.py +0 -0
  360. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_string_functions_new.py +0 -0
  361. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_string_matching.py +0 -0
  362. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_subquery_expressions.py +0 -0
  363. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_temporal_map_constructors.py +0 -0
  364. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_temporal_queries.py +0 -0
  365. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_temporal_select_into.py +0 -0
  366. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_type_conversion_fixes.py +0 -0
  367. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_union.py +0 -0
  368. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_unwind.py +0 -0
  369. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_variable_length_paths.py +0 -0
  370. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_wildcard_execution.py +0 -0
  371. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_with_aggregation_real.py +0 -0
  372. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_with_clause.py +0 -0
  373. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_with_clause_modifiers.py +0 -0
  374. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_with_clause_positions.py +0 -0
  375. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_with_distinct_skip_limit.py +0 -0
  376. {graphforge-0.3.7 → graphforge-0.3.9}/tests/integration/test_xor_operator.py +0 -0
  377. {graphforge-0.3.7 → graphforge-0.3.9}/tests/property/__init__.py +0 -0
  378. {graphforge-0.3.7 → graphforge-0.3.9}/tests/property/strategies.py +0 -0
  379. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/__init__.py +0 -0
  380. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/coverage_matrix.json +0 -0
  381. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/download_tck.py +0 -0
  382. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/Aggregation1_BasicAggregation.feature +0 -0
  383. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/Match1_SimpleMatches.feature +0 -0
  384. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call1.feature +0 -0
  385. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call2.feature +0 -0
  386. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call3.feature +0 -0
  387. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call4.feature +0 -0
  388. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call5.feature +0 -0
  389. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/call/Call6.feature +0 -0
  390. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create1.feature +0 -0
  391. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create2.feature +0 -0
  392. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create3.feature +0 -0
  393. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create4.feature +0 -0
  394. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create5.feature +0 -0
  395. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/create/Create6.feature +0 -0
  396. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete1.feature +0 -0
  397. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete2.feature +0 -0
  398. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete3.feature +0 -0
  399. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete4.feature +0 -0
  400. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete5.feature +0 -0
  401. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/delete/Delete6.feature +0 -0
  402. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match1.feature +0 -0
  403. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match2.feature +0 -0
  404. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match3.feature +0 -0
  405. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match4.feature +0 -0
  406. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match5.feature +0 -0
  407. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match6.feature +0 -0
  408. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match7.feature +0 -0
  409. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match8.feature +0 -0
  410. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match/Match9.feature +0 -0
  411. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere1.feature +0 -0
  412. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere2.feature +0 -0
  413. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere3.feature +0 -0
  414. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere4.feature +0 -0
  415. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere5.feature +0 -0
  416. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/match-where/MatchWhere6.feature +0 -0
  417. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge1.feature +0 -0
  418. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge2.feature +0 -0
  419. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge3.feature +0 -0
  420. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge4.feature +0 -0
  421. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge5.feature +0 -0
  422. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge6.feature +0 -0
  423. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge7.feature +0 -0
  424. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge8.feature +0 -0
  425. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/merge/Merge9.feature +0 -0
  426. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove1.feature +0 -0
  427. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove2.feature +0 -0
  428. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/remove/Remove3.feature +0 -0
  429. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return1.feature +0 -0
  430. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return2.feature +0 -0
  431. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return3.feature +0 -0
  432. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return4.feature +0 -0
  433. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return5.feature +0 -0
  434. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return6.feature +0 -0
  435. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return7.feature +0 -0
  436. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return/Return8.feature +0 -0
  437. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy1.feature +0 -0
  438. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy2.feature +0 -0
  439. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy3.feature +0 -0
  440. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy4.feature +0 -0
  441. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy5.feature +0 -0
  442. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy6.feature +0 -0
  443. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit1.feature +0 -0
  444. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit2.feature +0 -0
  445. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit3.feature +0 -0
  446. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set1.feature +0 -0
  447. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set2.feature +0 -0
  448. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set3.feature +0 -0
  449. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set4.feature +0 -0
  450. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set5.feature +0 -0
  451. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/set/Set6.feature +0 -0
  452. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union1.feature +0 -0
  453. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union2.feature +0 -0
  454. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/union/Union3.feature +0 -0
  455. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/unwind/Unwind1.feature +0 -0
  456. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With1.feature +0 -0
  457. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With2.feature +0 -0
  458. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With3.feature +0 -0
  459. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With4.feature +0 -0
  460. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With5.feature +0 -0
  461. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With6.feature +0 -0
  462. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with/With7.feature +0 -0
  463. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy1.feature +0 -0
  464. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy2.feature +0 -0
  465. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy3.feature +0 -0
  466. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy4.feature +0 -0
  467. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit1.feature +0 -0
  468. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit2.feature +0 -0
  469. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit3.feature +0 -0
  470. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere1.feature +0 -0
  471. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere2.feature +0 -0
  472. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere3.feature +0 -0
  473. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere4.feature +0 -0
  474. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere5.feature +0 -0
  475. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere6.feature +0 -0
  476. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/clauses/with-where/WithWhere7.feature +0 -0
  477. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation1.feature +0 -0
  478. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation2.feature +0 -0
  479. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation3.feature +0 -0
  480. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation4.feature +0 -0
  481. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation5.feature +0 -0
  482. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation6.feature +0 -0
  483. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation7.feature +0 -0
  484. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/aggregation/Aggregation8.feature +0 -0
  485. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean1.feature +0 -0
  486. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean2.feature +0 -0
  487. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean3.feature +0 -0
  488. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean4.feature +0 -0
  489. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/boolean/Boolean5.feature +0 -0
  490. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison1.feature +0 -0
  491. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison2.feature +0 -0
  492. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison3.feature +0 -0
  493. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/comparison/Comparison4.feature +0 -0
  494. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/conditional/Conditional1.feature +0 -0
  495. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/conditional/Conditional2.feature +0 -0
  496. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery1.feature +0 -0
  497. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery2.feature +0 -0
  498. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery3.feature +0 -0
  499. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph1.feature +0 -0
  500. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph2.feature +0 -0
  501. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph3.feature +0 -0
  502. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph4.feature +0 -0
  503. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph5.feature +0 -0
  504. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph6.feature +0 -0
  505. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph7.feature +0 -0
  506. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph8.feature +0 -0
  507. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/graph/Graph9.feature +0 -0
  508. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List1.feature +0 -0
  509. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List10.feature +0 -0
  510. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List11.feature +0 -0
  511. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List12.feature +0 -0
  512. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List2.feature +0 -0
  513. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List3.feature +0 -0
  514. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List4.feature +0 -0
  515. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List5.feature +0 -0
  516. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List6.feature +0 -0
  517. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List7.feature +0 -0
  518. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List8.feature +0 -0
  519. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/list/List9.feature +0 -0
  520. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals1.feature +0 -0
  521. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals2.feature +0 -0
  522. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals3.feature +0 -0
  523. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals4.feature +0 -0
  524. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals5.feature +0 -0
  525. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals6.feature +0 -0
  526. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals7.feature +0 -0
  527. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/literals/Literals8.feature +0 -0
  528. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map1.feature +0 -0
  529. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map2.feature +0 -0
  530. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/map/Map3.feature +0 -0
  531. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical1.feature +0 -0
  532. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical10.feature +0 -0
  533. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical11.feature +0 -0
  534. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical12.feature +0 -0
  535. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical13.feature +0 -0
  536. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical14.feature +0 -0
  537. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical15.feature +0 -0
  538. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical16.feature +0 -0
  539. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical17.feature +0 -0
  540. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical2.feature +0 -0
  541. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical3.feature +0 -0
  542. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical4.feature +0 -0
  543. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical5.feature +0 -0
  544. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical6.feature +0 -0
  545. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical7.feature +0 -0
  546. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical8.feature +0 -0
  547. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/mathematical/Mathematical9.feature +0 -0
  548. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null1.feature +0 -0
  549. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null2.feature +0 -0
  550. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/null/Null3.feature +0 -0
  551. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path1.feature +0 -0
  552. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path2.feature +0 -0
  553. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/path/Path3.feature +0 -0
  554. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/pattern/Pattern1.feature +0 -0
  555. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/pattern/Pattern2.feature +0 -0
  556. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence1.feature +0 -0
  557. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence2.feature +0 -0
  558. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence3.feature +0 -0
  559. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/precedence/Precedence4.feature +0 -0
  560. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier1.feature +0 -0
  561. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier10.feature +0 -0
  562. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier11.feature +0 -0
  563. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier12.feature +0 -0
  564. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier2.feature +0 -0
  565. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier3.feature +0 -0
  566. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier4.feature +0 -0
  567. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier5.feature +0 -0
  568. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier6.feature +0 -0
  569. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier7.feature +0 -0
  570. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier8.feature +0 -0
  571. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/quantifier/Quantifier9.feature +0 -0
  572. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String1.feature +0 -0
  573. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String10.feature +0 -0
  574. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String11.feature +0 -0
  575. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String12.feature +0 -0
  576. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String13.feature +0 -0
  577. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String14.feature +0 -0
  578. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String2.feature +0 -0
  579. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String3.feature +0 -0
  580. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String4.feature +0 -0
  581. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String5.feature +0 -0
  582. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String6.feature +0 -0
  583. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String7.feature +0 -0
  584. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String8.feature +0 -0
  585. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/string/String9.feature +0 -0
  586. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal1.feature +0 -0
  587. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal10.feature +0 -0
  588. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal2.feature +0 -0
  589. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal3.feature +0 -0
  590. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal4.feature +0 -0
  591. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal5.feature +0 -0
  592. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal6.feature +0 -0
  593. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal7.feature +0 -0
  594. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal8.feature +0 -0
  595. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/temporal/Temporal9.feature +0 -0
  596. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion1.feature +0 -0
  597. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion2.feature +0 -0
  598. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion3.feature +0 -0
  599. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion4.feature +0 -0
  600. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion5.feature +0 -0
  601. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/expressions/typeConversion/TypeConversion6.feature +0 -0
  602. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature +0 -0
  603. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/features/official/useCases/triadicSelection/TriadicSelection1.feature +0 -0
  604. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-1/binary-tree-1.cypher +0 -0
  605. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-1/binary-tree-1.json +0 -0
  606. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-2/binary-tree-2.cypher +0 -0
  607. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/graphs/binary-tree-2/binary-tree-2.json +0 -0
  608. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/graphs/named-graphs.adoc +0 -0
  609. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/tck_markers.py +0 -0
  610. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/test_features.py +0 -0
  611. {graphforge-0.3.7 → graphforge-0.3.9}/tests/tck/test_tck_compliance.py +0 -0
  612. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/__init__.py +0 -0
  613. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/api/__init__.py +0 -0
  614. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/api/test_clear.py +0 -0
  615. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/api/test_clone.py +0 -0
  616. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/api/test_cypher_value_conversion.py +0 -0
  617. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/ast/__init__.py +0 -0
  618. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/ast/test_ast_nodes.py +0 -0
  619. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/__init__.py +0 -0
  620. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_csv_loader.py +0 -0
  621. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_cypher_loader.py +0 -0
  622. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_graphml_loader.py +0 -0
  623. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_exporter.py +0 -0
  624. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_format.py +0 -0
  625. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_json_graph_loader.py +0 -0
  626. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_ldbc_schema.py +0 -0
  627. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_networkrepository.py +0 -0
  628. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/datasets/test_sources_registration.py +0 -0
  629. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/__init__.py +0 -0
  630. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_aggregation_errors.py +0 -0
  631. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_aggregation_functions_advanced.py +0 -0
  632. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_arithmetic_evaluator.py +0 -0
  633. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_evaluator_additional_coverage.py +0 -0
  634. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_evaluator_error_paths.py +0 -0
  635. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_expression_matching.py +0 -0
  636. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_id_function.py +0 -0
  637. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_in_operator.py +0 -0
  638. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_list_functions.py +0 -0
  639. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_list_functions_errors.py +0 -0
  640. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_merge_on_create.py +0 -0
  641. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_merge_on_match.py +0 -0
  642. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_multihop_create.py +0 -0
  643. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_optional_scan_coverage.py +0 -0
  644. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_path_functions.py +0 -0
  645. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_properties_keys_errors.py +0 -0
  646. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_sort_edge_cases.py +0 -0
  647. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_spatial_functions.py +0 -0
  648. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_startnode_endnode_errors.py +0 -0
  649. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_string_functions_new.py +0 -0
  650. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_string_matching_evaluator.py +0 -0
  651. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_subquery_planner_check.py +0 -0
  652. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_temporal_functions.py +0 -0
  653. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_three_valued_logic.py +0 -0
  654. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_undirected_relationship_bugs.py +0 -0
  655. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/executor/test_with_aggregation.py +0 -0
  656. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/__init__.py +0 -0
  657. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_aggregate_pushdown.py +0 -0
  658. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_cost_model.py +0 -0
  659. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_filter_pushdown.py +0 -0
  660. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_join_reorder.py +0 -0
  661. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_optimizer_reuse.py +0 -0
  662. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_predicate_reorder.py +0 -0
  663. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_predicate_utils.py +0 -0
  664. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/optimizer/test_redundant_elimination.py +0 -0
  665. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/__init__.py +0 -0
  666. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_arithmetic_parser.py +0 -0
  667. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_case_parser.py +0 -0
  668. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_collect_parser.py +0 -0
  669. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_delete_parser.py +0 -0
  670. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_float_literals.py +0 -0
  671. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_grammar.py +0 -0
  672. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_hex_octal_literals.py +0 -0
  673. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_label_predicate_parser.py +0 -0
  674. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_merge_on_create.py +0 -0
  675. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_merge_on_match.py +0 -0
  676. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_optional_match_delete.py +0 -0
  677. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_order_by_direction.py +0 -0
  678. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_parser.py +0 -0
  679. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_path_binding.py +0 -0
  680. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_remove_parser.py +0 -0
  681. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_string_matching_parser.py +0 -0
  682. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_wildcard_parsing.py +0 -0
  683. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_with_at_query_start.py +0 -0
  684. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/parser/test_with_clause_positions.py +0 -0
  685. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/__init__.py +0 -0
  686. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_expand_multi_hop_operator.py +0 -0
  687. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_operator_validation.py +0 -0
  688. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_operators.py +0 -0
  689. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_planner_comprehensive.py +0 -0
  690. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_remove_planner.py +0 -0
  691. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/planner/test_with_validation.py +0 -0
  692. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/__init__.py +0 -0
  693. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_graph_edge_cases.py +0 -0
  694. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_memory_store.py +0 -0
  695. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_pydantic_serialization.py +0 -0
  696. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_serialization_edge_cases.py +0 -0
  697. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_spatial_serialization.py +0 -0
  698. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_sqlite_backend_adjacency.py +0 -0
  699. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/storage/test_temporal_serialization.py +0 -0
  700. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/test_graph_elements.py +0 -0
  701. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/test_iana_timezone_construction.py +0 -0
  702. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/test_values.py +0 -0
  703. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_cypher_values_deep_equality.py +0 -0
  704. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_cypher_values_edge_cases.py +0 -0
  705. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_graph_element_edge_cases.py +0 -0
  706. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_path_values.py +0 -0
  707. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_spatial_values.py +0 -0
  708. {graphforge-0.3.7 → graphforge-0.3.9}/tests/unit/types/test_temporal_values.py +0 -0
@@ -5,6 +5,10 @@ on:
5
5
  branches: [main]
6
6
  types: [opened, synchronize, reopened, labeled, unlabeled]
7
7
 
8
+ permissions:
9
+ contents: read
10
+ pull-requests: write
11
+
8
12
  jobs:
9
13
  check-changelog:
10
14
  name: Verify CHANGELOG Updated
@@ -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
@@ -0,0 +1,427 @@
1
+ name: Test Suite
2
+
3
+ on:
4
+ push:
5
+ branches: ["main", "develop"]
6
+ pull_request:
7
+ branches: ["main"]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+ name: Test Python ${{ matrix.python-version }} on ${{ matrix.os }}
15
+ runs-on: ${{ matrix.os }}
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ os: [ubuntu-latest, macos-latest, windows-latest]
20
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
21
+
22
+ steps:
23
+ - name: Checkout code
24
+ uses: actions/checkout@v6
25
+
26
+ - name: Install uv
27
+ uses: astral-sh/setup-uv@v8.1.0
28
+ with:
29
+ enable-cache: true
30
+
31
+ - name: Set up Python ${{ matrix.python-version }}
32
+ uses: actions/setup-python@v6
33
+ with:
34
+ python-version: ${{ matrix.python-version }}
35
+
36
+ - name: Install dependencies
37
+ run: uv sync --all-extras
38
+
39
+ - name: Download SNAP ego-facebook dataset
40
+ run: |
41
+ mkdir -p ~/.graphforge/datasets
42
+ curl -L -o ~/.graphforge/datasets/snap-ego-facebook.txt.gz https://snap.stanford.edu/data/facebook_combined.txt.gz
43
+ shell: bash
44
+
45
+ - name: Run unit tests
46
+ run: uv run pytest tests/unit -n auto --junitxml=test-results-unit.xml
47
+
48
+ - name: Run integration tests
49
+ run: uv run pytest tests/integration -n auto -m "not snap" --junitxml=test-results-integration.xml
50
+
51
+ - name: Upload test results to Codecov
52
+ uses: codecov/codecov-action@v6
53
+ if: always()
54
+ with:
55
+ token: ${{ secrets.CODECOV_TOKEN }}
56
+ files: test-results-unit.xml,test-results-integration.xml
57
+ flags: ${{ matrix.os }}-py${{ matrix.python-version }}
58
+ report_type: test_results
59
+ fail_ci_if_error: false
60
+
61
+ lint:
62
+ name: Lint and Format Check
63
+ runs-on: ubuntu-latest
64
+
65
+ steps:
66
+ - name: Checkout code
67
+ uses: actions/checkout@v6
68
+
69
+ - name: Install uv
70
+ uses: astral-sh/setup-uv@v8.1.0
71
+
72
+ - name: Set up Python
73
+ uses: actions/setup-python@v6
74
+ with:
75
+ python-version: "3.12"
76
+
77
+ - name: Install dependencies
78
+ run: uv sync --all-extras
79
+
80
+ - name: Check code formatting
81
+ run: uv run ruff format --check .
82
+
83
+ - name: Lint code
84
+ run: uv run ruff check .
85
+
86
+ type-check:
87
+ name: Type Checking (mypy)
88
+ runs-on: ubuntu-latest
89
+
90
+ steps:
91
+ - name: Checkout code
92
+ uses: actions/checkout@v6
93
+
94
+ - name: Install uv
95
+ uses: astral-sh/setup-uv@v8.1.0
96
+
97
+ - name: Set up Python
98
+ uses: actions/setup-python@v6
99
+ with:
100
+ python-version: "3.12"
101
+
102
+ - name: Install dependencies
103
+ run: uv sync --all-extras
104
+
105
+ - name: Run mypy type checker
106
+ run: uv run mypy src/graphforge --strict-optional --show-error-codes
107
+
108
+ security:
109
+ name: Security Scanning
110
+ runs-on: ubuntu-latest
111
+
112
+ steps:
113
+ - name: Checkout code
114
+ uses: actions/checkout@v6
115
+
116
+ - name: Install uv
117
+ uses: astral-sh/setup-uv@v8.1.0
118
+
119
+ - name: Set up Python
120
+ uses: actions/setup-python@v6
121
+ with:
122
+ python-version: "3.12"
123
+
124
+ - name: Install dependencies
125
+ run: uv sync --all-extras
126
+
127
+ - name: Run bandit security scanner
128
+ run: uv run bandit -c pyproject.toml -r src/
129
+
130
+ tck-regression:
131
+ name: TCK Shard ${{ matrix.group }}/4
132
+ runs-on: ubuntu-latest
133
+ strategy:
134
+ fail-fast: false
135
+ matrix:
136
+ group: [1, 2, 3, 4]
137
+
138
+ steps:
139
+ - name: Checkout code
140
+ uses: actions/checkout@v6
141
+
142
+ - name: Install uv
143
+ uses: astral-sh/setup-uv@v8.1.0
144
+
145
+ - name: Set up Python
146
+ uses: actions/setup-python@v6
147
+ with:
148
+ python-version: "3.12"
149
+
150
+ - name: Install dependencies
151
+ run: uv sync --all-extras
152
+
153
+ - name: Restore test durations cache
154
+ uses: actions/cache/restore@v5
155
+ with:
156
+ path: .test_durations
157
+ key: tck-durations-${{ github.ref }}
158
+ restore-keys: tck-durations-
159
+
160
+ - name: Run TCK shard ${{ matrix.group }}/4
161
+ id: tck_tests
162
+ continue-on-error: true
163
+ run: |
164
+ uv run pytest tests/tck/ -n auto \
165
+ --splits 4 --group ${{ matrix.group }} \
166
+ --splitting-algorithm duration_based_chunks \
167
+ --store-durations --durations-path=.test_durations_${{ matrix.group }} \
168
+ --junitxml=test-results-tck-${{ matrix.group }}.xml
169
+
170
+ - name: Upload shard results artifact
171
+ uses: actions/upload-artifact@v7
172
+ if: always()
173
+ with:
174
+ name: tck-shard-${{ matrix.group }}
175
+ path: |
176
+ test-results-tck-${{ matrix.group }}.xml
177
+ .test_durations_${{ matrix.group }}
178
+
179
+ tck-report:
180
+ name: TCK OpenCypher Compliance
181
+ runs-on: ubuntu-latest
182
+ needs: tck-regression
183
+ if: always()
184
+ permissions:
185
+ contents: read
186
+ actions: write
187
+
188
+ steps:
189
+ - name: Checkout code
190
+ uses: actions/checkout@v6
191
+
192
+ - name: Install uv
193
+ uses: astral-sh/setup-uv@v8.1.0
194
+
195
+ - name: Set up Python
196
+ uses: actions/setup-python@v6
197
+ with:
198
+ python-version: "3.12"
199
+
200
+ - name: Install dependencies
201
+ run: uv sync --all-extras
202
+
203
+ - name: Download all shard results
204
+ uses: actions/download-artifact@v8
205
+ with:
206
+ pattern: tck-shard-*
207
+ run-id: ${{ github.run_id }}
208
+ merge-multiple: true
209
+ path: tck-results/
210
+
211
+ - name: Merge JUnit XML results
212
+ run: |
213
+ uv run python3 -c "
214
+ import glob, sys
215
+ from xml.etree import ElementTree as ET
216
+
217
+ files = sorted(glob.glob('tck-results/test-results-tck-*.xml'))
218
+ if not files:
219
+ print('No shard result files found')
220
+ sys.exit(1)
221
+
222
+ root = ET.parse(files[0]).getroot()
223
+ suite = root if root.tag == 'testsuite' else root.find('testsuite')
224
+
225
+ for f in files[1:]:
226
+ tree = ET.parse(f).getroot()
227
+ src = tree if tree.tag == 'testsuite' else tree.find('testsuite')
228
+ for tc in src.findall('testcase'):
229
+ suite.append(tc)
230
+
231
+ tests = len(suite.findall('testcase'))
232
+ failures = len(suite.findall('.//failure'))
233
+ errors = len(suite.findall('.//error'))
234
+ suite.set('tests', str(tests))
235
+ suite.set('failures', str(failures))
236
+ suite.set('errors', str(errors))
237
+
238
+ ET.ElementTree(root).write('test-results-tck.xml', xml_declaration=True, encoding='utf-8')
239
+ print(f'Merged {len(files)} shards: {tests} tests, {failures} failures')
240
+ "
241
+
242
+ - name: Merge test durations for future balancing
243
+ run: |
244
+ uv run python3 -c "
245
+ import glob, json
246
+ files = glob.glob('tck-results/.test_durations_*')
247
+ merged = {}
248
+ for f in files:
249
+ with open(f) as fh:
250
+ merged.update(json.load(fh))
251
+ with open('.test_durations', 'w') as fh:
252
+ json.dump(merged, fh)
253
+ print(f'Merged durations for {len(merged)} tests from {len(files)} shards')
254
+ " || echo "No duration files found, skipping merge"
255
+
256
+ - name: Save test durations cache
257
+ uses: actions/cache/save@v5
258
+ if: always()
259
+ with:
260
+ path: .test_durations
261
+ key: tck-durations-${{ github.ref }}-${{ github.run_id }}
262
+
263
+ - name: Report TCK compliance metrics
264
+ if: always()
265
+ run: uv run python3 scripts/tck_metrics.py test-results-tck.xml
266
+
267
+ - name: Report TCK performance metrics
268
+ if: always()
269
+ run: uv run python3 scripts/tck_perf_report.py test-results-tck.xml --threshold 5
270
+
271
+ - name: Upload TCK results to Codecov
272
+ uses: codecov/codecov-action@v6
273
+ if: always()
274
+ with:
275
+ token: ${{ secrets.CODECOV_TOKEN }}
276
+ files: test-results-tck.xml
277
+ flags: tck-compliance
278
+ report_type: test_results
279
+ fail_ci_if_error: false
280
+
281
+ - name: Upload merged TCK results artifact
282
+ uses: actions/upload-artifact@v7
283
+ if: always()
284
+ with:
285
+ name: tck-test-results
286
+ path: test-results-tck.xml
287
+
288
+ coverage-shard:
289
+ name: Coverage Shard ${{ matrix.group }}/4
290
+ runs-on: ubuntu-latest
291
+ strategy:
292
+ fail-fast: false
293
+ matrix:
294
+ group: [1, 2, 3, 4]
295
+
296
+ steps:
297
+ - name: Checkout code
298
+ uses: actions/checkout@v6
299
+
300
+ - name: Install uv
301
+ uses: astral-sh/setup-uv@v8.1.0
302
+
303
+ - name: Set up Python
304
+ uses: actions/setup-python@v6
305
+ with:
306
+ python-version: "3.12"
307
+
308
+ - name: Install dependencies
309
+ run: uv sync --all-extras
310
+
311
+ - name: Download SNAP ego-facebook dataset
312
+ run: |
313
+ mkdir -p ~/.graphforge/datasets
314
+ curl -L -o ~/.graphforge/datasets/snap-ego-facebook.txt.gz https://snap.stanford.edu/data/facebook_combined.txt.gz
315
+ shell: bash
316
+
317
+ - name: Run tests with coverage (shard ${{ matrix.group }}/4)
318
+ run: |
319
+ uv run pytest tests/unit tests/integration \
320
+ --splits 4 --group ${{ matrix.group }} \
321
+ --splitting-algorithm duration_based_chunks \
322
+ -n auto \
323
+ -m "not snap" \
324
+ --cov=src --cov-branch \
325
+ --cov-report=xml:coverage-${{ matrix.group }}.xml \
326
+ --junitxml=test-results-cov-${{ matrix.group }}.xml
327
+
328
+ - name: Upload coverage shard artifact
329
+ uses: actions/upload-artifact@v7
330
+ if: always()
331
+ with:
332
+ name: coverage-shard-${{ matrix.group }}
333
+ path: |
334
+ coverage-${{ matrix.group }}.xml
335
+ test-results-cov-${{ matrix.group }}.xml
336
+
337
+ coverage:
338
+ name: Coverage Report
339
+ runs-on: ubuntu-latest
340
+ needs: coverage-shard
341
+ if: always()
342
+
343
+ steps:
344
+ - name: Checkout code
345
+ uses: actions/checkout@v6
346
+
347
+ - name: Install uv
348
+ uses: astral-sh/setup-uv@v8.1.0
349
+
350
+ - name: Set up Python
351
+ uses: actions/setup-python@v6
352
+ with:
353
+ python-version: "3.12"
354
+
355
+ - name: Install dependencies
356
+ run: uv sync --all-extras
357
+
358
+ - name: Download all coverage shards
359
+ uses: actions/download-artifact@v8
360
+ with:
361
+ pattern: coverage-shard-*
362
+ run-id: ${{ github.run_id }}
363
+ merge-multiple: true
364
+ path: cov-results/
365
+
366
+ - name: Merge coverage reports
367
+ run: |
368
+ uv run python3 -c "
369
+ import glob, sys
370
+ from xml.etree import ElementTree as ET
371
+
372
+ files = sorted(glob.glob('cov-results/coverage-*.xml'))
373
+ if not files:
374
+ print('No coverage files found')
375
+ sys.exit(1)
376
+
377
+ base = ET.parse(files[0])
378
+ base_root = base.getroot()
379
+ base_packages = base_root.find('packages')
380
+
381
+ for f in files[1:]:
382
+ tree = ET.parse(f).getroot()
383
+ for pkg in tree.findall('.//package'):
384
+ base_packages.append(pkg)
385
+
386
+ base.write('coverage.xml', xml_declaration=True, encoding='utf-8')
387
+ print(f'Merged {len(files)} coverage shards')
388
+ "
389
+
390
+ - name: Check coverage threshold
391
+ run: |
392
+ uv run python3 -c "
393
+ import xml.etree.ElementTree as ET, sys
394
+ tree = ET.parse('coverage.xml')
395
+ line_rate = float(tree.getroot().get('line-rate', 0))
396
+ pct = round(line_rate * 100, 1)
397
+ print(f'Coverage: {pct}%')
398
+ if pct < 85:
399
+ print(f'Coverage {pct}% is below 85% threshold')
400
+ sys.exit(1)
401
+ print('Coverage meets 85% threshold')
402
+ " || echo "Coverage check failed - see above for details"
403
+
404
+ - name: Upload coverage to Codecov
405
+ uses: codecov/codecov-action@v6
406
+ with:
407
+ token: ${{ secrets.CODECOV_TOKEN }}
408
+ files: ./coverage.xml
409
+ flags: full-coverage
410
+ name: codecov-full
411
+ fail_ci_if_error: false
412
+
413
+ - name: Upload test results to Codecov
414
+ uses: codecov/codecov-action@v6
415
+ if: always()
416
+ with:
417
+ token: ${{ secrets.CODECOV_TOKEN }}
418
+ files: cov-results/test-results-cov-*.xml
419
+ flags: full-suite
420
+ report_type: test_results
421
+ fail_ci_if_error: false
422
+
423
+ - name: Upload coverage artifacts
424
+ uses: actions/upload-artifact@v7
425
+ with:
426
+ name: coverage-report
427
+ path: coverage.xml
@@ -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
@@ -5,6 +5,77 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ## [0.3.9] - 2026-05-04
11
+
12
+ ### Added
13
+ - **LALR(1) parser migration** (#365, #430) — grammar refactored to LALR(1); linear-time parsing replaces Earley; unknown function names now detected at parse time; 586 new parser tests; OOM-safe local coverage via sharded `make coverage`
14
+ - **Property equality index for O(1) node lookup** (#390, #427) — in-memory `_prop_index` (prop → value → {node\_id}) on `Graph`; `get_nodes_by_property` and `get_nodes_by_label_and_property` methods; executor `_extract_equality_hints` replaces full scan with index lookup when a `ScanNodes` is followed by a simple equality `Filter`; index maintained on `SET`/`REMOVE`/`DELETE`
15
+ - **Bulk ingestion API** (#389, #444) — `create_node_bulk`, `create_relationship_bulk` (skip per-call Pydantic validation); `bulk_ingest()` context manager defers statistics rebuilds until exit via `_flush_deferred_stats()`; CSV loader uses bulk path; significant throughput improvement for dataset loading
16
+ - **Real-dataset QA and performance profiling suite** (#417, #419) — 5-tier perf suite (karate 34n, ego-facebook 4k, amazon 334k, livejournal 4M, orkut 117M edges); `scripts/perf_report.py` renders baseline/delta Markdown tables; `make test-perf`, `make test-perf-xs`, `make test-perf-large`, `make test-perf-slow` targets; L/XL tier benchmarks added; `perf_slow` marker applied consistently (#440, #441)
17
+ - **`elementId()` scalar function** (#211, #447) — GQL-spec `elementId(node|rel)` returns the element id as `CypherString`; `id()` continues to return `CypherInt`; NULL-safe; arity-checked
18
+ - **Scale limits documentation** — `docs/reference/scale-limits.md` explains LIMIT-respecting (~20M edges) vs full-scan (~1M edges) performance ceilings; README graph-size claim updated to reflect edge-count as binding constraint (#443)
19
+ - **`make pre-push-fast`** (#429, #437) — fast-fail pre-push shortcut (format, lint, type, security, docstrings; no coverage); inline coverage thresholds (85% total, 90% patch)
20
+
21
+ ### Fixed
22
+ - **Fixed-length hop ignores rel predicate** (#431, #439) — fixed-length traversal now evaluates `rel_pattern.predicate` inline; parser predicate whitelist replaced with open accept
23
+ - **var-length relationship predicates** (#381, #425) — `_var_length_reachable` now evaluates inline relationship predicates (e.g. `[*1..3 {weight: 1}]`) at each hop instead of ignoring them
24
+ - **Cross-hop edge uniqueness in multi-segment patterns** (#382, #425) — `initial_used_edge_ids` seeds the visited-edge set from prior hops, preventing the same edge being traversed twice across pattern segments
25
+ - **SQLite delete persistence** (#409, #421) — deleted nodes and edges now removed from SQLite backend; previously they resurrected on reload
26
+ - **SQLite bulk I/O** (#392, #421) — `save_nodes_bulk` / `save_edges_bulk` use `executemany`; `_save_graph_to_backend` wrapped in rollback; resolves >20s hang on M-tier reload
27
+ - **`sys.setrecursionlimit` thread safety** (#433, #445) — limit set once in `CypherParser.__init__` instead of per-request get/set/restore, eliminating races in concurrent parser use
28
+ - **Transaction rollback restores ID counters** (#412) — `rollback()` restores `_next_node_id` and `_next_edge_id`, preventing ID gaps after aborted transactions
29
+ - **Closed-instance guard** (#411) — `execute()` and mutation methods raise `RuntimeError` after `close()`
30
+ - **`DatasetInfo` rejects `ftp://` URLs** (#414)
31
+ - **TCK metrics CI gate** (#410) — `tck_metrics.py` exits non-zero on TCK failures
32
+
33
+ ### Performance
34
+ - **UNWIND + WITH LIMIT short-circuit** (#393, #443) — `_pipeline_limit` reverse-scan treats pass-through `With(limit_count=N, no sort, no filter)` as transparent; `_execute_unwind` respects `row_limit` and exits early; `UNWIND range(1M, 2M) AS i WITH i LIMIT 3000 RETURN sum(i)` drops from ~4.5s to <10ms
35
+ - **LIMIT short-circuit for scan and expand operators** (#422, #423) — `_pipeline_limit` look-ahead stops scan/expand at row budget; write operators and Filter block short-circuit to preserve correctness
36
+ - **SQLite PRAGMA tuning** (#392, #446) — `synchronous=NORMAL` (eliminates `fdatasync` per commit), 64 MB page cache (`cache_size=-65536`), `temp_store=MEMORY`; safe with WAL mode for analytical workloads
37
+ - **Lazy statistics timestamp** — `_stats_last_updated` stamped at read time in `get_statistics()` rather than on every add; `_defer_stats` flag eliminates per-edge stat overhead during bulk ingest
38
+
39
+ ### CI / Tooling
40
+ - **Test suite zero-base renovation** (#428, #438) — fixture strategy audit, duplication removal, marker consistency, parametrization improvements across unit and integration suites
41
+ - **GHA actions updated** — `actions/upload-artifact` v7, `actions/download-artifact` v8, `codecov/codecov-action` v6, `actions/upload-pages-artifact` v5, `astral-sh/setup-uv` v8.1.0
42
+
43
+ ## [0.3.8] - 2026-05-02
44
+
45
+ ### Fixed - TCK Feature Completeness (3885/3885 passing)
46
+ - **Nanosecond precision in temporal types** — `CypherDateTime` and `CypherTime` now store a `_ns_residue` (0–999) for sub-microsecond precision; `_components` tuple extended to 8 elements with nanoseconds; construction, accessors, arithmetic, comparison, and serialization all updated (#224)
47
+ - **Statement clock caching** — `now()`, `datetime()`, `date()`, `time()` (without arguments) now return consistent values within a single query by caching the start time via `time.time_ns()` (#224)
48
+ - **Extreme year support** — dates/datetimes outside Python's 1–9999 range now handled via `_WideDate` / `_WideDateTime` classes; durations too large for `timedelta` use `_BigDuration`; Julian Day Number arithmetic for cross-extreme-year duration computation (#224)
49
+ - **IANA timezone name preservation** — `CypherDateTime` stores the IANA zone name (e.g. `Europe/Stockholm`) separately; `.timezone` accessor returns the zone name rather than the numeric offset; `utcoffset()` now receives a concrete datetime for DST-aware lookup (#224)
50
+ - **Aggregate detection in QuantifierExpression** — `ALL(ok IN collect(...) WHERE ok)` patterns now correctly detected as aggregate-containing; planner emits `Aggregate` instead of `Project` (#224)
51
+ - **OPTIONAL MATCH multi-WHERE placement** — multiple `WHERE` clauses no longer overwrite each other; multi-hop OPTIONAL MATCH WHERE is emitted after all hops so all variables are bound (#224)
52
+ - **`coalesce()` type inference** — return type is inferred from argument types so `MATCH (x)` after `WITH coalesce(a, b) AS x` accepts node-typed variables (#224)
53
+ - **Non-deterministic aggregate arguments** — `count(rand())` and similar expressions now raise `AmbiguousAggregationExpression` per the openCypher spec (#224)
54
+ - **Temporal accessor for extreme-year datetimes** — `year`, `month`, `day`, `hour`, `minute`, `second` accessors work on `_WideDateTime`-backed `CypherDateTime` values (#224)
55
+ - **All 23 xfail markers removed** — previously marked as expected failures; all were fixable (#224)
56
+
57
+ ### Added
58
+ - **75-test unit coverage for extreme temporal classes** — `tests/unit/types/test_extreme_temporal_values.py` covers `_WideDate`, `_WideDateTime`, `_BigDuration`, extreme-year construction/accessors, IANA timezone preservation, and large duration handling
59
+
60
+ ### Fixed
61
+ - **WITH clause WHERE filtering and variable scoping** (#362) — `WITH n WHERE n.age > 30` now correctly filters post-projection; chained WITH propagates bindings properly
62
+ - **Triadic OPTIONAL MATCH semantics** (#302 partial) — `OPTIONAL MATCH (a)-[r]->(b)` with pre-bound `b` now correctly filters to only edges reaching that specific destination (LEFT JOIN semantics)
63
+ - **Relationship type disjunction without colon prefix** (#363) — `[:KNOWS|FOLLOWS]` (pipe without colon on subsequent types) now parses correctly
64
+ - **Multi-CREATE variable scoping** (#364 partial) — variables created in one CREATE clause are now visible in subsequent CREATE clauses within the same query
65
+
66
+ ### Performance
67
+ - **O(n²) → O(1) graph statistics updates** (#366) — `_update_statistics_after_add_edge` no longer scans all edges on every insert; replaced with incremental `_unique_sources_by_type` tracking. Eliminated 2,000+ Pydantic `model_copy()` calls per 1,000-node graph by switching to mutable counters with lazy `GraphStatistics` construction
68
+ - **Parser fast path for long CREATE sequences** (#366) — queries with many consecutive CREATE clauses (e.g. the TCK movie graph with 971 CREATEs) are pre-split into batches of 5 before Earley parsing, reducing wall-clock time from 27 minutes to ~26 seconds. See docs/development/parser-performance-analysis.md for full analysis and the LALR(1) migration plan (issue #365)
69
+
70
+ ### CI
71
+ - **TCK sharding across 4 parallel runners** — TCK tests now split using `pytest-split` with duration-based balancing (~4x faster CI)
72
+ - **Coverage sharding** — coverage collection also split across 4 shards and merged in report job
73
+ - **Python 3.14 experimental matrix** — added as non-blocking `continue-on-error` entries
74
+ - **TCK performance reporting** — new `scripts/tck_perf_report.py` runs after each TCK run, reporting tests over 5s and tracking use-case tests (movie graph, school graph) for performance regression detection
75
+
76
+ ### TCK Coverage
77
+ - **3,885 / 3,885 passing (100%)** — first release with zero TCK failures and zero expected failures
78
+
8
79
  ## [0.3.7] - 2026-04-07
9
80
 
10
81
  ### Added - Functions
@@ -38,7 +109,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
38
109
  - **Temporal select-into constructors** (#334) — cross-type temporal projection (`date({date: other})`, `localdatetime({datetime: dt})`, etc.) with component overrides; null propagation, hour-overflow normalization, and timezone conversion all correct
39
110
 
40
111
  ### TCK Coverage
41
- - **~2,894 passing** (up from ~2,507 at v0.3.6) — +387 net new passing scenarios
112
+ - **3,235 / 3,885 passing (83.3%)** (up from ~2,507 at v0.3.6) — +728 net new passing scenarios
42
113
  - Theme: ORDER BY correctness, aggregation, operator precedence, graph semantics, temporal completeness
43
114
 
44
115
  ## [0.3.6] - 2026-02-28
@@ -51,6 +51,16 @@ make pre-push
51
51
 
52
52
  Runs: format-check, lint, type-check, coverage (85% total, 90% patch).
53
53
 
54
+ **Before running tests locally during planning:** If the branch has no committed changes yet (i.e., you're still in the planning phase), check the last CI run instead of running the full test suite locally. This avoids OOM errors from running all tests unnecessarily.
55
+
56
+ ```bash
57
+ # Check last CI run status and test results
58
+ gh run list --branch main --limit 5
59
+ gh run view <run-id> --log-failed # see only failed tests
60
+ ```
61
+
62
+ Only run tests locally once you have actual code changes to validate.
63
+
54
64
  ### 5. Commit with Issue Number
55
65
 
56
66
  ```bash
@@ -77,16 +87,21 @@ GitHub automatically closes the issue when PR merges.
77
87
  ## Development Commands
78
88
 
79
89
  ```bash
80
- make pre-push # Run all checks (mirrors CI)
90
+ make pre-push # Run all checks (mirrors CI): format, lint, type, security, docstrings, coverage + thresholds
91
+ make pre-push-fast # Fast checks only (no coverage, ~30s): format, lint, type, security, docstrings
81
92
  make test # All tests
82
93
  make test-unit # Unit tests only
83
94
  make test-integration # Integration tests only
84
- make coverage # Run with coverage
95
+ make coverage # Run with coverage + validate thresholds (sharded, includes 85%/90% checks)
96
+ make coverage-quick # Coverage on unit tests only (fast feedback during development)
85
97
  make coverage-report # View HTML coverage report
86
98
  make coverage-diff # Coverage for changed files only
87
99
 
88
100
  # Run tests in parallel (4x faster for TCK)
89
101
  pytest tests/ -n auto
102
+
103
+ # Override worker count (default 4, lower to reduce memory)
104
+ PYTEST_WORKERS=2 make test
90
105
  ```
91
106
 
92
107
  **Coverage Requirements:**
@@ -94,6 +109,8 @@ pytest tests/ -n auto
94
109
  - Patch: 90% minimum for changed files
95
110
  - Best practice: Aim for 100% on new code
96
111
 
112
+ **When to use `pre-push-fast`:** iterating on non-test changes (refactors, docs, config). Always run the full `pre-push` before opening a PR.
113
+
97
114
  ## Architecture: 4-Layer System
98
115
 
99
116
  ```