graphforge 0.3.4__tar.gz → 0.3.6__tar.gz

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