graphforge 0.3.5__tar.gz → 0.3.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (624) hide show
  1. {graphforge-0.3.5 → graphforge-0.3.6}/CHANGELOG.md +24 -0
  2. {graphforge-0.3.5 → graphforge-0.3.6}/Makefile +19 -16
  3. {graphforge-0.3.5 → graphforge-0.3.6}/PKG-INFO +12 -11
  4. {graphforge-0.3.5 → graphforge-0.3.6}/README.md +11 -10
  5. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/testing.md +65 -0
  6. {graphforge-0.3.5 → graphforge-0.3.6}/pyproject.toml +2 -1
  7. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/api.py +13 -6
  8. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/ast/expression.py +16 -0
  9. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/ast/pattern.py +5 -4
  10. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/executor/evaluator.py +1636 -205
  11. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/executor/executor.py +8 -2
  12. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/predicate_utils.py +3 -0
  13. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/parser/cypher.lark +16 -4
  14. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/parser/parser.py +55 -11
  15. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/types/values.py +339 -10
  16. graphforge-0.3.6/tests/integration/test_anonymous_relationships.py +75 -0
  17. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_column_naming.py +5 -4
  18. graphforge-0.3.6/tests/integration/test_compact_iso8601.py +132 -0
  19. graphforge-0.3.6/tests/integration/test_hex_octal_literals.py +128 -0
  20. graphforge-0.3.6/tests/integration/test_iana_timezones.py +102 -0
  21. graphforge-0.3.6/tests/integration/test_issues_271_274.py +123 -0
  22. graphforge-0.3.6/tests/integration/test_label_predicate.py +106 -0
  23. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_temporal_map_constructors.py +75 -10
  24. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_temporal_queries.py +14 -7
  25. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/conftest.py +370 -20
  26. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_temporal_functions.py +57 -8
  27. graphforge-0.3.6/tests/unit/executor/test_temporal_truncate_arithmetic.py +1241 -0
  28. graphforge-0.3.6/tests/unit/parser/test_hex_octal_literals.py +131 -0
  29. graphforge-0.3.6/tests/unit/parser/test_label_predicate_parser.py +77 -0
  30. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_parser.py +44 -0
  31. graphforge-0.3.6/tests/unit/test_iana_timezone_construction.py +35 -0
  32. {graphforge-0.3.5 → graphforge-0.3.6}/uv.lock +68 -23
  33. graphforge-0.3.5/tests/unit/executor/test_temporal_truncate_arithmetic.py +0 -358
  34. {graphforge-0.3.5 → graphforge-0.3.6}/.codecov.yml +0 -0
  35. {graphforge-0.3.5 → graphforge-0.3.6}/.coderabbit.yaml +0 -0
  36. {graphforge-0.3.5 → graphforge-0.3.6}/.editorconfig +0 -0
  37. {graphforge-0.3.5 → graphforge-0.3.6}/.github/CODEOWNERS +0 -0
  38. {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  39. {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  40. {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  41. {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  42. {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  43. {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  44. {graphforge-0.3.5 → graphforge-0.3.6}/.github/ISSUE_WORKFLOW.md +0 -0
  45. {graphforge-0.3.5 → graphforge-0.3.6}/.github/SECURITY.md +0 -0
  46. {graphforge-0.3.5 → graphforge-0.3.6}/.github/dependabot.yml +0 -0
  47. {graphforge-0.3.5 → graphforge-0.3.6}/.github/pull_request_template.md +0 -0
  48. {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/README.md +0 -0
  49. {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/changelog-check.yml +0 -0
  50. {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/docs.yml +0 -0
  51. {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/pr-labeler.yml +0 -0
  52. {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/publish.yaml +0 -0
  53. {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/release-tracking.yml +0 -0
  54. {graphforge-0.3.5 → graphforge-0.3.6}/.github/workflows/test.yml +0 -0
  55. {graphforge-0.3.5 → graphforge-0.3.6}/.gitignore +0 -0
  56. {graphforge-0.3.5 → graphforge-0.3.6}/.pre-commit-config.yaml +0 -0
  57. {graphforge-0.3.5 → graphforge-0.3.6}/CHANGELOG_v0.3.0.md +0 -0
  58. {graphforge-0.3.5 → graphforge-0.3.6}/CLAUDE.md +0 -0
  59. {graphforge-0.3.5 → graphforge-0.3.6}/CODE_OF_CONDUCT.md +0 -0
  60. {graphforge-0.3.5 → graphforge-0.3.6}/CONTRIBUTING.md +0 -0
  61. {graphforge-0.3.5 → graphforge-0.3.6}/IMPLEMENTATION_PLAN.md +0 -0
  62. {graphforge-0.3.5 → graphforge-0.3.6}/LICENSE +0 -0
  63. {graphforge-0.3.5 → graphforge-0.3.6}/RELEASING.md +0 -0
  64. {graphforge-0.3.5 → graphforge-0.3.6}/coverage.json +0 -0
  65. {graphforge-0.3.5 → graphforge-0.3.6}/docs/architecture/ast-and-planning.md +0 -0
  66. {graphforge-0.3.5 → graphforge-0.3.6}/docs/architecture/execution-model.md +0 -0
  67. {graphforge-0.3.5 → graphforge-0.3.6}/docs/architecture/overview.md +0 -0
  68. {graphforge-0.3.5 → graphforge-0.3.6}/docs/architecture/storage-analysis.md +0 -0
  69. {graphforge-0.3.5 → graphforge-0.3.6}/docs/architecture/storage.md +0 -0
  70. {graphforge-0.3.5 → graphforge-0.3.6}/docs/community/code-of-conduct.md +0 -0
  71. {graphforge-0.3.5 → graphforge-0.3.6}/docs/community/security.md +0 -0
  72. {graphforge-0.3.5 → graphforge-0.3.6}/docs/cypher-guide.md +0 -0
  73. {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/cypher-script-loading.md +0 -0
  74. {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/ldbc.md +0 -0
  75. {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/neo4j-examples.md +0 -0
  76. {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/networkrepository.md +0 -0
  77. {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/overview.md +0 -0
  78. {graphforge-0.3.5 → graphforge-0.3.6}/docs/datasets/snap.md +0 -0
  79. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/QUICKSTART_V0.2.md +0 -0
  80. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/codecov-integration.md +0 -0
  81. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/contributing.md +0 -0
  82. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/documentation-update-summary.md +0 -0
  83. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/phase-1a-completion-report.md +0 -0
  84. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/release-process.md +0 -0
  85. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/release-strategy.md +0 -0
  86. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/requirements.md +0 -0
  87. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-cicd-infrastructure.md +0 -0
  88. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-documentation.md +0 -0
  89. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-regression-fix.md +0 -0
  90. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-01-31-with-clause.md +0 -0
  91. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-02-01-codecov-setup.md +0 -0
  92. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-2026-02-01-column-naming-investigation.md +0 -0
  93. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/session-summary.md +0 -0
  94. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/tck-session-2026-01-31-final.md +0 -0
  95. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/sessions/tck-session-2026-01-31.md +0 -0
  96. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/tck_baseline_analysis_v0.3.md +0 -0
  97. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/testing-setup-complete.md +0 -0
  98. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/v0.2-plan-summary.md +0 -0
  99. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/v0.4-revised-plan.md +0 -0
  100. {graphforge-0.3.5 → graphforge-0.3.6}/docs/development/workflow.md +0 -0
  101. {graphforge-0.3.5 → graphforge-0.3.6}/docs/getting-started/installation.md +0 -0
  102. {graphforge-0.3.5 → graphforge-0.3.6}/docs/getting-started/quickstart.md +0 -0
  103. {graphforge-0.3.5 → graphforge-0.3.6}/docs/getting-started/tutorial.md +0 -0
  104. {graphforge-0.3.5 → graphforge-0.3.6}/docs/guide/cypher-guide.md +0 -0
  105. {graphforge-0.3.5 → graphforge-0.3.6}/docs/guide/graph-construction.md +0 -0
  106. {graphforge-0.3.5 → graphforge-0.3.6}/docs/guide/overview.md +0 -0
  107. {graphforge-0.3.5 → graphforge-0.3.6}/docs/index.md +0 -0
  108. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/INCOMPLETE_FEATURES_ISSUES.md +0 -0
  109. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/README.md +0 -0
  110. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/RELEASE_TRACKING.md +0 -0
  111. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/VALIDATION_REPORT.md +0 -0
  112. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/api.md +0 -0
  113. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/changelog.md +0 -0
  114. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/column-naming-behavior.md +0 -0
  115. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-aggregation-functions.md +0 -0
  116. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-graph-queries.md +0 -0
  117. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-graph-schema.md +0 -0
  118. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-mapping/clause-to-tck.md +0 -0
  119. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-mapping/function-to-tck.md +0 -0
  120. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-order-by.md +0 -0
  121. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/feature-return-aliasing.md +0 -0
  122. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/implementation-status/clauses.md +0 -0
  123. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/implementation-status/functions.md +0 -0
  124. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/implementation-status/operators.md +0 -0
  125. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/implementation-status/patterns.md +0 -0
  126. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-compatibility-matrix.md +0 -0
  127. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-compatibility.md +0 -0
  128. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-features/01-clauses.md +0 -0
  129. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-features/02-functions.md +0 -0
  130. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-features/03-operators.md +0 -0
  131. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-features/04-patterns.md +0 -0
  132. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/opencypher-features/05-data-types.md +0 -0
  133. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/tck-compliance.md +0 -0
  134. {graphforge-0.3.5 → graphforge-0.3.6}/docs/reference/tck-inventory.md +0 -0
  135. {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/implementation-summary.md +0 -0
  136. {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/next-steps.md +0 -0
  137. {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/phase-1-complete.md +0 -0
  138. {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/phase-2-complete.md +0 -0
  139. {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/phase-3-complete.md +0 -0
  140. {graphforge-0.3.5 → graphforge-0.3.6}/docs/releases/roadmap.md +0 -0
  141. {graphforge-0.3.5 → graphforge-0.3.6}/docs/stylesheets/extra.css +0 -0
  142. {graphforge-0.3.5 → graphforge-0.3.6}/docs/use-cases/agent-grounding.md +0 -0
  143. {graphforge-0.3.5 → graphforge-0.3.6}/examples/01_social_network.py +0 -0
  144. {graphforge-0.3.5 → graphforge-0.3.6}/examples/02_knowledge_graph.py +0 -0
  145. {graphforge-0.3.5 → graphforge-0.3.6}/examples/03_data_lineage.py +0 -0
  146. {graphforge-0.3.5 → graphforge-0.3.6}/examples/04_citation_network.py +0 -0
  147. {graphforge-0.3.5 → graphforge-0.3.6}/examples/05_migration_from_networkx.py +0 -0
  148. {graphforge-0.3.5 → graphforge-0.3.6}/examples/agent_grounding/ecommerce_agent.ipynb +0 -0
  149. {graphforge-0.3.5 → graphforge-0.3.6}/examples/basic_graph.py +0 -0
  150. {graphforge-0.3.5 → graphforge-0.3.6}/examples/basic_usage.py +0 -0
  151. {graphforge-0.3.5 → graphforge-0.3.6}/mkdocs.yml +0 -0
  152. {graphforge-0.3.5 → graphforge-0.3.6}/scripts/build_feature_graph.py +0 -0
  153. {graphforge-0.3.5 → graphforge-0.3.6}/scripts/bump_version.py +0 -0
  154. {graphforge-0.3.5 → graphforge-0.3.6}/scripts/check_release_needed.py +0 -0
  155. {graphforge-0.3.5 → graphforge-0.3.6}/scripts/inventory_tck.py +0 -0
  156. {graphforge-0.3.5 → graphforge-0.3.6}/scripts/pre-push-check.sh +0 -0
  157. {graphforge-0.3.5 → graphforge-0.3.6}/scripts/tck_metrics.py +0 -0
  158. {graphforge-0.3.5 → graphforge-0.3.6}/scripts/validate_datasets.py +0 -0
  159. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/__init__.py +0 -0
  160. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/ast/__init__.py +0 -0
  161. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/ast/clause.py +0 -0
  162. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/ast/query.py +0 -0
  163. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/__init__.py +0 -0
  164. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/base.py +0 -0
  165. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/data/__init__.py +0 -0
  166. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/data/networkrepository.json +0 -0
  167. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/data/snap.json +0 -0
  168. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/exporters/__init__.py +0 -0
  169. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/exporters/json_graph.py +0 -0
  170. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/formats/__init__.py +0 -0
  171. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/formats/json_graph.py +0 -0
  172. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/__init__.py +0 -0
  173. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/compression.py +0 -0
  174. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/csv.py +0 -0
  175. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/cypher.py +0 -0
  176. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/graphml.py +0 -0
  177. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/json_graph.py +0 -0
  178. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/ldbc.py +0 -0
  179. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/loaders/ldbc_schema.py +0 -0
  180. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/registry.py +0 -0
  181. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/__init__.py +0 -0
  182. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/graphml.py +0 -0
  183. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/json_graph.py +0 -0
  184. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/ldbc.py +0 -0
  185. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/networkrepository.py +0 -0
  186. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/datasets/sources/snap.py +0 -0
  187. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/executor/__init__.py +0 -0
  188. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/__init__.py +0 -0
  189. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/cost_model.py +0 -0
  190. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/join_reorder.py +0 -0
  191. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/optimizer.py +0 -0
  192. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/optimizer/statistics.py +0 -0
  193. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/parser/__init__.py +0 -0
  194. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/planner/__init__.py +0 -0
  195. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/planner/operators.py +0 -0
  196. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/planner/planner.py +0 -0
  197. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/planner/types.py +0 -0
  198. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/storage/__init__.py +0 -0
  199. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/storage/memory.py +0 -0
  200. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/storage/pydantic_serialization.py +0 -0
  201. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/storage/serialization.py +0 -0
  202. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/storage/sqlite_backend.py +0 -0
  203. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/types/__init__.py +0 -0
  204. {graphforge-0.3.5 → graphforge-0.3.6}/src/graphforge/types/graph.py +0 -0
  205. {graphforge-0.3.5 → graphforge-0.3.6}/tests/README.md +0 -0
  206. {graphforge-0.3.5 → graphforge-0.3.6}/tests/__init__.py +0 -0
  207. {graphforge-0.3.5 → graphforge-0.3.6}/tests/conftest.py +0 -0
  208. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/__init__.py +0 -0
  209. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/conftest.py +0 -0
  210. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_compression.py +0 -0
  211. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_cypher_loader_docs.py +0 -0
  212. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_end_to_end_workflows.py +0 -0
  213. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_graphml_loader.py +0 -0
  214. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_json_graph_exporter.py +0 -0
  215. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_json_graph_loader.py +0 -0
  216. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_json_graph_roundtrip.py +0 -0
  217. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_ldbc_loader.py +0 -0
  218. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/datasets/test_networkrepository_loader.py +0 -0
  219. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/executor/test_graph_functions.py +0 -0
  220. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_aggregation_edge_cases.py +0 -0
  221. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_aggregation_functions_advanced.py +0 -0
  222. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_arithmetic.py +0 -0
  223. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_builder_api.py +0 -0
  224. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_call_subqueries.py +0 -0
  225. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_case_expressions.py +0 -0
  226. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_collect.py +0 -0
  227. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_complex_merge_patterns.py +0 -0
  228. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_complex_where_predicates.py +0 -0
  229. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_create_clause.py +0 -0
  230. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_create_edge_cases.py +0 -0
  231. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_delete_null.py +0 -0
  232. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_detach_delete.py +0 -0
  233. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_distinct_clause.py +0 -0
  234. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_e2e_queries.py +0 -0
  235. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_executor_edge_cases.py +0 -0
  236. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_exists_is_empty.py +0 -0
  237. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_id_function.py +0 -0
  238. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_label_disjunction.py +0 -0
  239. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_list_comprehension.py +0 -0
  240. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_list_functions.py +0 -0
  241. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_list_operations.py +0 -0
  242. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_list_path_overloading.py +0 -0
  243. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_list_subscript.py +0 -0
  244. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_logical_operators.py +0 -0
  245. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_match_create.py +0 -0
  246. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_math_functions.py +0 -0
  247. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_math_functions_extended.py +0 -0
  248. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_merge_edge_cases.py +0 -0
  249. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_merge_on_create_real.py +0 -0
  250. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_merge_on_match_real.py +0 -0
  251. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_null_handling.py +0 -0
  252. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_optimizer_aggregate_pushdown.py +0 -0
  253. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_optimizer_integration.py +0 -0
  254. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_optimizer_redundant_elimination.py +0 -0
  255. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_optional_match.py +0 -0
  256. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_optional_match_delete.py +0 -0
  257. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_path_binding.py +0 -0
  258. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_path_binding_variable_length.py +0 -0
  259. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_path_functions.py +0 -0
  260. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_pattern_comprehension.py +0 -0
  261. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_pattern_predicates.py +0 -0
  262. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_persistence.py +0 -0
  263. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_power_operator.py +0 -0
  264. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_predicate_functions.py +0 -0
  265. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_relationship_directions.py +0 -0
  266. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_remove_clause.py +0 -0
  267. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_set_delete_merge.py +0 -0
  268. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_size_function.py +0 -0
  269. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_snap_dataset_loading.py +0 -0
  270. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_sort_after_aggregation.py +0 -0
  271. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_spatial_api.py +0 -0
  272. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_sqlite_persistence.py +0 -0
  273. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_string_functions.py +0 -0
  274. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_string_functions_new.py +0 -0
  275. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_string_matching.py +0 -0
  276. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_subquery_expressions.py +0 -0
  277. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_transactions.py +0 -0
  278. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_type_functions.py +0 -0
  279. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_union.py +0 -0
  280. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_unwind.py +0 -0
  281. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_variable_length_paths.py +0 -0
  282. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_wildcard_execution.py +0 -0
  283. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_with_aggregation_real.py +0 -0
  284. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_with_clause.py +0 -0
  285. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_with_clause_modifiers.py +0 -0
  286. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_with_distinct_skip_limit.py +0 -0
  287. {graphforge-0.3.5 → graphforge-0.3.6}/tests/integration/test_xor_operator.py +0 -0
  288. {graphforge-0.3.5 → graphforge-0.3.6}/tests/property/__init__.py +0 -0
  289. {graphforge-0.3.5 → graphforge-0.3.6}/tests/property/strategies.py +0 -0
  290. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/__init__.py +0 -0
  291. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/coverage_matrix.json +0 -0
  292. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/download_tck.py +0 -0
  293. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/Aggregation1_BasicAggregation.feature +0 -0
  294. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/Match1_SimpleMatches.feature +0 -0
  295. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call1.feature +0 -0
  296. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call2.feature +0 -0
  297. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call3.feature +0 -0
  298. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call4.feature +0 -0
  299. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call5.feature +0 -0
  300. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/call/Call6.feature +0 -0
  301. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create1.feature +0 -0
  302. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create2.feature +0 -0
  303. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create3.feature +0 -0
  304. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create4.feature +0 -0
  305. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create5.feature +0 -0
  306. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/create/Create6.feature +0 -0
  307. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete1.feature +0 -0
  308. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete2.feature +0 -0
  309. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete3.feature +0 -0
  310. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete4.feature +0 -0
  311. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete5.feature +0 -0
  312. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/delete/Delete6.feature +0 -0
  313. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match1.feature +0 -0
  314. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match2.feature +0 -0
  315. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match3.feature +0 -0
  316. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match4.feature +0 -0
  317. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match5.feature +0 -0
  318. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match6.feature +0 -0
  319. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match7.feature +0 -0
  320. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match8.feature +0 -0
  321. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match/Match9.feature +0 -0
  322. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere1.feature +0 -0
  323. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere2.feature +0 -0
  324. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere3.feature +0 -0
  325. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere4.feature +0 -0
  326. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere5.feature +0 -0
  327. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/match-where/MatchWhere6.feature +0 -0
  328. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge1.feature +0 -0
  329. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge2.feature +0 -0
  330. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge3.feature +0 -0
  331. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge4.feature +0 -0
  332. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge5.feature +0 -0
  333. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge6.feature +0 -0
  334. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge7.feature +0 -0
  335. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge8.feature +0 -0
  336. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/merge/Merge9.feature +0 -0
  337. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/remove/Remove1.feature +0 -0
  338. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/remove/Remove2.feature +0 -0
  339. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/remove/Remove3.feature +0 -0
  340. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return1.feature +0 -0
  341. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return2.feature +0 -0
  342. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return3.feature +0 -0
  343. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return4.feature +0 -0
  344. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return5.feature +0 -0
  345. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return6.feature +0 -0
  346. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return7.feature +0 -0
  347. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return/Return8.feature +0 -0
  348. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy1.feature +0 -0
  349. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy2.feature +0 -0
  350. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy3.feature +0 -0
  351. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy4.feature +0 -0
  352. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy5.feature +0 -0
  353. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy6.feature +0 -0
  354. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit1.feature +0 -0
  355. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit2.feature +0 -0
  356. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit3.feature +0 -0
  357. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set1.feature +0 -0
  358. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set2.feature +0 -0
  359. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set3.feature +0 -0
  360. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set4.feature +0 -0
  361. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set5.feature +0 -0
  362. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/set/Set6.feature +0 -0
  363. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/union/Union1.feature +0 -0
  364. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/union/Union2.feature +0 -0
  365. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/union/Union3.feature +0 -0
  366. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/unwind/Unwind1.feature +0 -0
  367. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With1.feature +0 -0
  368. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With2.feature +0 -0
  369. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With3.feature +0 -0
  370. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With4.feature +0 -0
  371. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With5.feature +0 -0
  372. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With6.feature +0 -0
  373. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with/With7.feature +0 -0
  374. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy1.feature +0 -0
  375. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy2.feature +0 -0
  376. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy3.feature +0 -0
  377. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy4.feature +0 -0
  378. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit1.feature +0 -0
  379. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit2.feature +0 -0
  380. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit3.feature +0 -0
  381. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere1.feature +0 -0
  382. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere2.feature +0 -0
  383. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere3.feature +0 -0
  384. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere4.feature +0 -0
  385. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere5.feature +0 -0
  386. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere6.feature +0 -0
  387. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/clauses/with-where/WithWhere7.feature +0 -0
  388. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation1.feature +0 -0
  389. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation2.feature +0 -0
  390. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation3.feature +0 -0
  391. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation4.feature +0 -0
  392. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation5.feature +0 -0
  393. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation6.feature +0 -0
  394. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation7.feature +0 -0
  395. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/aggregation/Aggregation8.feature +0 -0
  396. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean1.feature +0 -0
  397. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean2.feature +0 -0
  398. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean3.feature +0 -0
  399. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean4.feature +0 -0
  400. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/boolean/Boolean5.feature +0 -0
  401. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison1.feature +0 -0
  402. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison2.feature +0 -0
  403. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison3.feature +0 -0
  404. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/comparison/Comparison4.feature +0 -0
  405. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/conditional/Conditional1.feature +0 -0
  406. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/conditional/Conditional2.feature +0 -0
  407. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery1.feature +0 -0
  408. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery2.feature +0 -0
  409. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery3.feature +0 -0
  410. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph1.feature +0 -0
  411. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph2.feature +0 -0
  412. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph3.feature +0 -0
  413. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph4.feature +0 -0
  414. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph5.feature +0 -0
  415. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph6.feature +0 -0
  416. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph7.feature +0 -0
  417. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph8.feature +0 -0
  418. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/graph/Graph9.feature +0 -0
  419. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List1.feature +0 -0
  420. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List10.feature +0 -0
  421. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List11.feature +0 -0
  422. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List12.feature +0 -0
  423. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List2.feature +0 -0
  424. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List3.feature +0 -0
  425. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List4.feature +0 -0
  426. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List5.feature +0 -0
  427. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List6.feature +0 -0
  428. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List7.feature +0 -0
  429. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List8.feature +0 -0
  430. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/list/List9.feature +0 -0
  431. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals1.feature +0 -0
  432. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals2.feature +0 -0
  433. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals3.feature +0 -0
  434. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals4.feature +0 -0
  435. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals5.feature +0 -0
  436. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals6.feature +0 -0
  437. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals7.feature +0 -0
  438. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/literals/Literals8.feature +0 -0
  439. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/map/Map1.feature +0 -0
  440. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/map/Map2.feature +0 -0
  441. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/map/Map3.feature +0 -0
  442. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical1.feature +0 -0
  443. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical10.feature +0 -0
  444. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical11.feature +0 -0
  445. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical12.feature +0 -0
  446. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical13.feature +0 -0
  447. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical14.feature +0 -0
  448. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical15.feature +0 -0
  449. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical16.feature +0 -0
  450. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical17.feature +0 -0
  451. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical2.feature +0 -0
  452. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical3.feature +0 -0
  453. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical4.feature +0 -0
  454. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical5.feature +0 -0
  455. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical6.feature +0 -0
  456. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical7.feature +0 -0
  457. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical8.feature +0 -0
  458. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/mathematical/Mathematical9.feature +0 -0
  459. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/null/Null1.feature +0 -0
  460. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/null/Null2.feature +0 -0
  461. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/null/Null3.feature +0 -0
  462. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/path/Path1.feature +0 -0
  463. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/path/Path2.feature +0 -0
  464. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/path/Path3.feature +0 -0
  465. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/pattern/Pattern1.feature +0 -0
  466. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/pattern/Pattern2.feature +0 -0
  467. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence1.feature +0 -0
  468. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence2.feature +0 -0
  469. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence3.feature +0 -0
  470. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/precedence/Precedence4.feature +0 -0
  471. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier1.feature +0 -0
  472. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier10.feature +0 -0
  473. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier11.feature +0 -0
  474. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier12.feature +0 -0
  475. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier2.feature +0 -0
  476. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier3.feature +0 -0
  477. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier4.feature +0 -0
  478. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier5.feature +0 -0
  479. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier6.feature +0 -0
  480. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier7.feature +0 -0
  481. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier8.feature +0 -0
  482. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/quantifier/Quantifier9.feature +0 -0
  483. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String1.feature +0 -0
  484. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String10.feature +0 -0
  485. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String11.feature +0 -0
  486. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String12.feature +0 -0
  487. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String13.feature +0 -0
  488. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String14.feature +0 -0
  489. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String2.feature +0 -0
  490. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String3.feature +0 -0
  491. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String4.feature +0 -0
  492. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String5.feature +0 -0
  493. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String6.feature +0 -0
  494. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String7.feature +0 -0
  495. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String8.feature +0 -0
  496. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/string/String9.feature +0 -0
  497. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal1.feature +0 -0
  498. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal10.feature +0 -0
  499. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal2.feature +0 -0
  500. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal3.feature +0 -0
  501. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal4.feature +0 -0
  502. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal5.feature +0 -0
  503. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal6.feature +0 -0
  504. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal7.feature +0 -0
  505. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal8.feature +0 -0
  506. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/temporal/Temporal9.feature +0 -0
  507. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion1.feature +0 -0
  508. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion2.feature +0 -0
  509. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion3.feature +0 -0
  510. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion4.feature +0 -0
  511. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion5.feature +0 -0
  512. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/expressions/typeConversion/TypeConversion6.feature +0 -0
  513. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature +0 -0
  514. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/features/official/useCases/triadicSelection/TriadicSelection1.feature +0 -0
  515. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-1/binary-tree-1.cypher +0 -0
  516. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-1/binary-tree-1.json +0 -0
  517. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-2/binary-tree-2.cypher +0 -0
  518. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/graphs/binary-tree-2/binary-tree-2.json +0 -0
  519. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/graphs/named-graphs.adoc +0 -0
  520. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/tck_config.yaml +0 -0
  521. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/tck_markers.py +0 -0
  522. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/test_features.py +0 -0
  523. {graphforge-0.3.5 → graphforge-0.3.6}/tests/tck/test_tck_compliance.py +0 -0
  524. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/__init__.py +0 -0
  525. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/api/__init__.py +0 -0
  526. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/api/test_clear.py +0 -0
  527. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/api/test_clone.py +0 -0
  528. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/api/test_cypher_value_conversion.py +0 -0
  529. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/ast/__init__.py +0 -0
  530. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/ast/test_ast_nodes.py +0 -0
  531. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/__init__.py +0 -0
  532. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_csv_loader.py +0 -0
  533. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_cypher_loader.py +0 -0
  534. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_graphml_loader.py +0 -0
  535. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_json_graph_exporter.py +0 -0
  536. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_json_graph_format.py +0 -0
  537. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_json_graph_loader.py +0 -0
  538. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_ldbc_schema.py +0 -0
  539. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_networkrepository.py +0 -0
  540. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_registry.py +0 -0
  541. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_snap_datasets.py +0 -0
  542. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/datasets/test_sources_registration.py +0 -0
  543. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/__init__.py +0 -0
  544. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_aggregation_errors.py +0 -0
  545. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_aggregation_functions_advanced.py +0 -0
  546. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_arithmetic_evaluator.py +0 -0
  547. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_evaluator.py +0 -0
  548. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_evaluator_additional_coverage.py +0 -0
  549. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_evaluator_error_paths.py +0 -0
  550. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_executor_error_paths.py +0 -0
  551. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_expression_matching.py +0 -0
  552. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_expressions_match.py +0 -0
  553. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_graph_functions.py +0 -0
  554. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_id_function.py +0 -0
  555. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_in_operator.py +0 -0
  556. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_list_functions.py +0 -0
  557. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_list_functions_errors.py +0 -0
  558. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_map_property_access.py +0 -0
  559. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_merge_on_create.py +0 -0
  560. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_merge_on_match.py +0 -0
  561. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_multihop_create.py +0 -0
  562. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_optional_scan_coverage.py +0 -0
  563. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_path_functions.py +0 -0
  564. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_sort_edge_cases.py +0 -0
  565. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_spatial_functions.py +0 -0
  566. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_string_functions_new.py +0 -0
  567. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_string_matching_evaluator.py +0 -0
  568. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_subquery_planner_check.py +0 -0
  569. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_three_valued_logic.py +0 -0
  570. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_type_conversion_complex.py +0 -0
  571. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_undirected_relationship_bugs.py +0 -0
  572. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/executor/test_with_aggregation.py +0 -0
  573. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/__init__.py +0 -0
  574. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_aggregate_pushdown.py +0 -0
  575. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_cost_model.py +0 -0
  576. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_filter_pushdown.py +0 -0
  577. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_join_reorder.py +0 -0
  578. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_optimizer_reuse.py +0 -0
  579. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_predicate_reorder.py +0 -0
  580. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_predicate_utils.py +0 -0
  581. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_redundant_elimination.py +0 -0
  582. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/optimizer/test_statistics.py +0 -0
  583. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/__init__.py +0 -0
  584. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_arithmetic_parser.py +0 -0
  585. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_case_parser.py +0 -0
  586. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_collect_parser.py +0 -0
  587. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_delete_parser.py +0 -0
  588. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_grammar.py +0 -0
  589. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_merge_on_create.py +0 -0
  590. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_merge_on_match.py +0 -0
  591. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_optional_match_delete.py +0 -0
  592. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_parser_caching.py +0 -0
  593. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_path_binding.py +0 -0
  594. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_pattern_predicates.py +0 -0
  595. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_remove_parser.py +0 -0
  596. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_string_matching_parser.py +0 -0
  597. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_wildcard_parsing.py +0 -0
  598. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/parser/test_with_at_query_start.py +0 -0
  599. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/__init__.py +0 -0
  600. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_expand_multi_hop_operator.py +0 -0
  601. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_operator_validation.py +0 -0
  602. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_operators.py +0 -0
  603. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_planner_branch_coverage.py +0 -0
  604. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_planner_comprehensive.py +0 -0
  605. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_planner_edge_cases.py +0 -0
  606. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_remove_planner.py +0 -0
  607. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_type_tracking.py +0 -0
  608. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/planner/test_with_validation.py +0 -0
  609. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/__init__.py +0 -0
  610. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_graph_edge_cases.py +0 -0
  611. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_memory_store.py +0 -0
  612. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_pydantic_serialization.py +0 -0
  613. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_serialization_edge_cases.py +0 -0
  614. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_spatial_serialization.py +0 -0
  615. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_sqlite_backend_adjacency.py +0 -0
  616. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/storage/test_temporal_serialization.py +0 -0
  617. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/test_graph_elements.py +0 -0
  618. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/test_values.py +0 -0
  619. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_cypher_values_deep_equality.py +0 -0
  620. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_cypher_values_edge_cases.py +0 -0
  621. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_graph_element_edge_cases.py +0 -0
  622. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_path_values.py +0 -0
  623. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_spatial_values.py +0 -0
  624. {graphforge-0.3.5 → graphforge-0.3.6}/tests/unit/types/test_temporal_values.py +0 -0
@@ -5,6 +5,30 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.3.6] - 2026-02-28
9
+
10
+ ### Fixed - TCK Harness Correctness
11
+ - **Integer property comparison** (#252) — TCK harness was comparing integer properties as strings, causing ~423 false failures; now coerced correctly
12
+ - **Map literal value coercion** (#261) — `_parse_map_literal` in conftest now coerces numeric string values, fixing ~30 false failures
13
+
14
+ ### Fixed - Temporal Correctness
15
+ - **`date({})` / `datetime({})` / `time({})` map constructors** (#253, #268) — component validation, UTC defaults, and function-as-argument parsing
16
+ - **`UnexpectedEOF` on duration/datetime literals** (#254) — parser now handles all ISO 8601 duration and datetime forms
17
+ - **Timezone offset `+HH:MM` parsing** (#255) — `+HH:MM` and `-HH:MM` offsets now parsed correctly
18
+ - **Date map constructor component validation** (#256) — out-of-range components raise `ValueError`
19
+ - **`datetime(string)` defaults to UTC** (#276) — string datetimes without timezone now default to UTC per spec
20
+ - **Map constructor omitted components default to 1** (#278) — `date({year: 2015})` → `2015-01-01`, not error
21
+ - **`TRUNCATE` units: week, weekYear, quarter, decade, century, millennium** (#269) — all truncation units now return correct values
22
+ - **Week-based and select-form datetime constructors** (#270) — `datetime({week: 30, ...})` and similar forms return correct values
23
+ - **Duration serialization, comparison, multiplication, and fractional arithmetic** (#271) — full duration correctness including `duration.between()`
24
+ - **`datetime(aDatetime)` type coercion** (#274) — coercing datetime subtypes no longer conflicts with `:E` label parser token
25
+ - **Compact ISO 8601 date/datetime string formats** (#273) — ordinal (`YYYY-DDD`, `YYYYDDD`), week date (`YYYY-Www[-D]`), year-month (`YYYY-MM`, `YYYYMM`), and year-only (`YYYY`) all parsed correctly
26
+ - **IANA timezone names** (#272) — `[Region/City]` suffix in datetime strings is parsed; IANA zone is authoritative over explicit offset; historical second-precision offsets (e.g. `+00:53:28`) handled correctly
27
+
28
+ ### TCK Coverage
29
+ - **2,507 passing** (up from ~1,694 at v0.3.5) — +813 net new passing scenarios
30
+ - Theme: all temporal TCK scenarios now pass; harness accuracy fully corrected
31
+
8
32
  ## [0.3.5] - 2026-02-19
9
33
 
10
34
  ### Added - Math Functions (#195, #196, #197)
@@ -1,4 +1,4 @@
1
- .PHONY: help lint format type-check security test pre-push clean test-tck test-tck-parallel
1
+ .PHONY: help lint format type-check security test pre-push clean test-tck docstring-coverage test-network
2
2
 
3
3
  help: ## Show this help message
4
4
  @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
@@ -18,30 +18,31 @@ type-check: ## Run mypy type checker
18
18
  security: ## Run Bandit security scanner
19
19
  uv run bandit -c pyproject.toml -r src/
20
20
 
21
- 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
29
 
30
- test-tck: ## Run TCK compliance tests
31
- uv run pytest tests/tck/ -v
30
+ test-integration: ## Run integration tests in parallel (excludes snap/network downloads)
31
+ uv run pytest tests/integration -n auto -m "not snap"
32
32
 
33
- test-tck-parallel: ## Run TCK tests in parallel (requires pytest-xdist)
33
+ test-network: ## Run external network/download tests (snap datasets; requires internet)
34
+ uv run pytest tests/ -m "snap" -v
35
+
36
+ test-tck: ## Run TCK compliance tests in parallel
34
37
  uv run pytest tests/tck/ -n auto -v
35
38
 
36
39
  coverage: ## Run tests with coverage measurement
37
40
  @echo "Running tests with coverage..."
38
- uv run pytest tests/unit tests/integration \
41
+ uv run pytest tests/unit tests/integration -m "not snap" \
39
42
  --cov=src \
40
43
  --cov-branch \
41
44
  --cov-report=term-missing \
42
- --cov-report=xml \
43
- --cov-report=html \
44
- -n auto
45
+ --cov-report=xml
45
46
 
46
47
  test-analytics: ## Run tests with analytics output (JUnit XML)
47
48
  @echo "Running tests with analytics output..."
@@ -61,7 +62,9 @@ coverage-strict: ## Strict 90% coverage check for new features
61
62
  (echo "❌ Coverage below 90% - consider adding more tests" && exit 1)
62
63
  @echo "✅ Coverage meets strict threshold"
63
64
 
64
- coverage-report: ## 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
65
68
  @echo "Opening coverage report in browser..."
66
69
  @open htmlcov/index.html || xdg-open htmlcov/index.html || \
67
70
  echo "Coverage report generated at htmlcov/index.html"
@@ -92,7 +95,7 @@ check-patch-coverage: ## Validate patch coverage for changed files (90% thresho
92
95
  echo "✅ Patch coverage meets 90% threshold"; \
93
96
  fi
94
97
 
95
- pre-push: format-check lint type-check security coverage check-coverage check-patch-coverage ## Run all pre-push checks (mirrors CI)
98
+ pre-push: format-check lint type-check security docstring-coverage coverage check-coverage check-patch-coverage ## Run all pre-push checks (mirrors CI)
96
99
  @echo "✅ All pre-push checks passed!"
97
100
 
98
101
  clean: ## Clean up cache files
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphforge
3
- Version: 0.3.5
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% |
@@ -624,6 +624,71 @@ pip install -e ".[dev]"
624
624
 
625
625
  ---
626
626
 
627
+ ## Known Issues & Investigated Solutions
628
+
629
+ ### pytest-xdist + pytest-cov deadlock on macOS / Python 3.13
630
+
631
+ **Symptom:** `make pre-push` (or any `pytest -n auto --cov=...` invocation) hangs
632
+ indefinitely at the very end of the test run. Progress reaches ~100% then freezes.
633
+ CPU drops to 0%. Only `kill` escapes it.
634
+
635
+ **Root cause:** `pytest-cov` collects coverage data from xdist workers via IPC
636
+ (inter-process communication sockets). When workers finish and close their sockets,
637
+ a coverage data-collection thread in the main process is still blocked on `read()`.
638
+ The main thread waits for that lock → deadlock. Confirmed via `sample <PID>`:
639
+ ```
640
+ main thread: lock_PyThread_acquire_lock → _PyMutex_LockTimed → _PySemaphore_Wait
641
+ worker thread: read() (44020 calls pending)
642
+ ```
643
+ Reproduced consistently on macOS (Darwin 25.x) + Python 3.13.7 + pytest-cov 7.0.0 +
644
+ pytest-xdist 3.x. Not observed on Linux CI.
645
+
646
+ **What does NOT work:**
647
+
648
+ | Attempted fix | Result |
649
+ |---|---|
650
+ | `--cov-report=html` alone | Still deadlocks; HTML is slow but not the cause |
651
+ | `[tool.coverage.run] parallel = true` + `-n auto` | No deadlock but **2× slower** (3:54 vs 1:30) — per-process `.coverage.PID` file I/O overwhelms the speedup from parallelism |
652
+ | `concurrency = ["multiprocessing", "thread"]` + `parallel = true` | Same outcome as above; requires `coverage combine` step which adds no benefit |
653
+
654
+ **Solution (current `Makefile`):** Run coverage serially (no `-n auto`) and exclude
655
+ the two other causes of slowdown:
656
+
657
+ ```makefile
658
+ coverage:
659
+ uv run pytest tests/unit tests/integration -m "not snap" \
660
+ --cov=src \
661
+ --cov-branch \
662
+ --cov-report=term-missing \
663
+ --cov-report=xml
664
+ ```
665
+
666
+ Key flags:
667
+ - **No `-n auto`** — eliminates the IPC deadlock entirely.
668
+ - **`-m "not snap"`** — skips SNAP network-dataset tests (they download files, run
669
+ alphabetically last, and are already skipped in CI per their marker description).
670
+ - **No `--cov-report=html`** — HTML generation over ~13 k lines of source is slow;
671
+ use `make coverage-report` on demand instead.
672
+
673
+ **Timing (Apple Silicon, Python 3.13, ~3 450 tests):**
674
+
675
+ | Approach | Wall time |
676
+ |---|---|
677
+ | `-n auto`, no coverage (baseline) | ~91 s |
678
+ | `-n auto` + `--cov` (original, pre-fix) | ∞ (deadlock) |
679
+ | `-n auto` + `--cov` + `parallel=true` | ~234 s |
680
+ | Serial `--cov`, `-m "not snap"`, no HTML (current) | ~150 s |
681
+
682
+ The serial run is only ~60 s slower than the parallel baseline because coverage
683
+ overhead is modest (~38 s) and `parallel=true` file-I/O costs more than it saves.
684
+
685
+ **If this is re-investigated in the future:** the deadlock is a known upstream issue
686
+ between pytest-cov and pytest-xdist on Python 3.13's stricter GIL/semaphore
687
+ behaviour. Check the [pytest-cov changelog](https://pytest-cov.readthedocs.io/) for
688
+ a fix before attempting another workaround.
689
+
690
+ ---
691
+
627
692
  ## Success Metrics
628
693
 
629
694
  The testing infrastructure is successful when:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "graphforge"
3
- version = "0.3.5"
3
+ version = "0.3.6"
4
4
  description = "Composable graph tooling for analysis, construction, and refinement"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -270,4 +270,5 @@ dev = [
270
270
  "bandit[toml]>=1.7.0",
271
271
  "pre-commit>=3.6.0",
272
272
  "types-defusedxml>=0.7.0.20250822",
273
+ "interrogate>=1.7.0",
273
274
  ]
@@ -257,10 +257,20 @@ class GraphForge:
257
257
  # Validate query input
258
258
  QueryInput(query=query)
259
259
 
260
- # Parse query
260
+ # Parse query (may return a single CypherQuery or a list for multi-statement scripts)
261
261
  ast = self.parser.parse(query)
262
262
 
263
- # Check if this is a UNION query
263
+ # Multi-statement script: execute each query sequentially, return last result
264
+ if isinstance(ast, list):
265
+ results: list[dict] = []
266
+ for single_ast in ast:
267
+ results = self._execute_single_ast(single_ast)
268
+ return results
269
+
270
+ return self._execute_single_ast(ast)
271
+
272
+ def _execute_single_ast(self, ast: Any) -> list[dict]:
273
+ """Execute a single parsed AST and return results."""
264
274
  from graphforge.ast.query import UnionQuery
265
275
 
266
276
  if isinstance(ast, UnionQuery):
@@ -290,10 +300,7 @@ class GraphForge:
290
300
  self.optimizer.update_statistics(self.graph.get_statistics())
291
301
  operators = self.optimizer.optimize(operators)
292
302
 
293
- # Execute
294
- results = self.executor.execute(operators)
295
-
296
- return results
303
+ return self.executor.execute(operators)
297
304
 
298
305
  def create_node(self, labels: list[str] | None = None, **properties: Any) -> NodeRef:
299
306
  """Create a node with labels and properties.
@@ -451,3 +451,19 @@ class QuantifierExpression(BaseModel):
451
451
  return v
452
452
 
453
453
  model_config = {"frozen": True, "arbitrary_types_allowed": True}
454
+
455
+
456
+ class LabelPredicate(BaseModel):
457
+ """Label membership predicate expression.
458
+
459
+ Represents ``n:Person``, ``n:Person:Employee`` (all labels must match), etc.
460
+
461
+ Examples:
462
+ WHERE n:Person -> LabelPredicate(variable="n", labels=["Person"])
463
+ WHERE n:Person:Employee -> LabelPredicate(variable="n", labels=["Person", "Employee"])
464
+ """
465
+
466
+ variable: str = Field(..., min_length=1, description="Variable name to test")
467
+ labels: list[str] = Field(..., min_length=1, description="Labels that must all be present")
468
+
469
+ model_config = {"frozen": True}
@@ -57,11 +57,12 @@ class NodePattern(BaseModel):
57
57
 
58
58
  @field_validator("labels")
59
59
  @classmethod
60
- def validate_labels(cls, v: list[str]) -> list[str]:
60
+ def validate_labels(cls, v: list[list[str]]) -> list[list[str]]:
61
61
  """Validate label names."""
62
- for label in v:
63
- if not label or not label[0].isalpha():
64
- raise ValueError(f"Label must start with a letter: {label}")
62
+ for label_group in v:
63
+ for label in label_group:
64
+ if not label or not label[0].isalpha():
65
+ raise ValueError(f"Label must start with a letter: {label}")
65
66
  return v
66
67
 
67
68
  model_config = {"frozen": True, "arbitrary_types_allowed": True}