lora-python 0.22.3__tar.gz → 0.24.0__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 (427) hide show
  1. {lora_python-0.22.3 → lora_python-0.24.0}/Cargo.lock +19 -19
  2. {lora_python-0.22.3 → lora_python-0.24.0}/Cargo.toml +13 -13
  3. {lora_python-0.22.3 → lora_python-0.24.0}/PKG-INFO +1 -1
  4. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-compiler/src/lib.rs +9 -7
  5. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-compiler/src/logical.rs +39 -0
  6. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-compiler/src/optimizer.rs +138 -4
  7. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-compiler/src/pattern.rs +59 -5
  8. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-compiler/src/physical.rs +26 -0
  9. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-compiler/src/plan_tree.rs +31 -0
  10. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/README.md +1 -0
  11. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/memory_baseline.json +29 -29
  12. lora_python-0.24.0/crates/lora-database/examples/storage_baseline.rs +1270 -0
  13. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/changes/build.rs +19 -19
  14. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/explain.rs +11 -0
  15. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/pull_mode.rs +3 -1
  16. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/backend_stub.rs +15 -16
  17. lora_python-0.24.0/crates/lora-database/tests/id_seek.rs +569 -0
  18. lora_python-0.24.0/crates/lora-database/tests/planner_stats.rs +398 -0
  19. lora_python-0.24.0/crates/lora-database/tests/restart_index_state.rs +402 -0
  20. lora_python-0.24.0/crates/lora-database/tests/streaming_scans.rs +64 -0
  21. lora_python-0.24.0/crates/lora-database/tests/write_scaling.rs +268 -0
  22. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/edge.rs +5 -5
  23. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/node.rs +6 -6
  24. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/value.rs +4 -4
  25. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/expr.rs +20 -27
  26. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/executor/helpers.rs +268 -64
  27. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/executor/immutable.rs +46 -6
  28. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/executor/mod.rs +5 -4
  29. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/executor/mutable.rs +43 -5
  30. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/columns.rs +2 -0
  31. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/expand.rs +1 -1
  32. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/hydration.rs +2 -2
  33. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/scan.rs +170 -36
  34. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/traits.rs +28 -5
  35. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/value.rs +22 -3
  36. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/src/columnar.rs +6 -6
  37. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/src/tests.rs +3 -3
  38. lora_python-0.24.0/crates/lora-store/src/dict.rs +178 -0
  39. lora_python-0.24.0/crates/lora-store/src/encoded.rs +1017 -0
  40. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/lib.rs +16 -11
  41. lora_python-0.24.0/crates/lora-store/src/memory/adjacency.rs +335 -0
  42. lora_python-0.24.0/crates/lora-store/src/memory/chunked_vec.rs +511 -0
  43. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/constraint_enforce.rs +38 -32
  44. lora_python-0.24.0/crates/lora-store/src/memory/cow.rs +1643 -0
  45. lora_python-0.24.0/crates/lora-store/src/memory/distinct_stats.rs +861 -0
  46. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/entity_index_store.rs +35 -25
  47. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/fulltext_index.rs +34 -22
  48. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/graph.rs +499 -554
  49. lora_python-0.24.0/crates/lora-store/src/memory/id_map.rs +530 -0
  50. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/id_set.rs +302 -94
  51. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/impls.rs +154 -220
  52. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/index_catalog.rs +1 -1
  53. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/mem_report.rs +150 -79
  54. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/mod.rs +12 -4
  55. lora_python-0.24.0/crates/lora-store/src/memory/model_tests.rs +571 -0
  56. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/point_index.rs +15 -13
  57. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/property_index.rs +261 -55
  58. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/secondary_index_maintenance.rs +6 -6
  59. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/snapshot.rs +21 -5
  60. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/sorted_property_index.rs +8 -8
  61. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/stats.rs +25 -15
  62. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/tests.rs +373 -17
  63. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/text_index.rs +2 -1
  64. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/traits.rs +62 -80
  65. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/graph.rs +4 -4
  66. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/mod.rs +5 -0
  67. lora_python-0.24.0/crates/lora-store/src/types/name.rs +356 -0
  68. lora_python-0.24.0/crates/lora-store/src/types/view.rs +722 -0
  69. {lora_python-0.22.3 → lora_python-0.24.0}/pyproject.toml +1 -1
  70. lora_python-0.22.3/crates/lora-database/tests/write_scaling.rs +0 -75
  71. lora_python-0.22.3/crates/lora-store/src/memory/chunked_vec.rs +0 -252
  72. lora_python-0.22.3/crates/lora-store/src/memory/cow.rs +0 -585
  73. {lora_python-0.22.3 → lora_python-0.24.0}/LICENSE +0 -0
  74. {lora_python-0.22.3 → lora_python-0.24.0}/README.md +0 -0
  75. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-binding-buffer/Cargo.toml +0 -0
  76. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-binding-buffer/src/lib.rs +0 -0
  77. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-binding-buffer/src/stream.rs +0 -0
  78. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/.gitignore +0 -0
  79. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/Cargo.toml +0 -0
  80. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/LICENSE +0 -0
  81. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/README.md +0 -0
  82. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/build.rs +0 -0
  83. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  84. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/examples/basic.py +0 -0
  85. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/src/errors.rs +0 -0
  86. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/src/from_python.rs +0 -0
  87. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/src/gil.rs +0 -0
  88. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/src/lib.rs +0 -0
  89. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/src/stream.rs +0 -0
  90. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/src/to_python.rs +0 -0
  91. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/tests/test_async.py +0 -0
  92. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/tests/test_concurrency.py +0 -0
  93. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  94. {lora_python-0.22.3 → lora_python-0.24.0}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  95. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/Cargo.toml +0 -0
  96. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
  97. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
  98. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
  99. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  100. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  101. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
  102. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
  103. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/errors.rs +0 -0
  104. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/lib.rs +0 -0
  105. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/resolved.rs +0 -0
  106. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/scope.rs +0 -0
  107. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/src/symbols.rs +0 -0
  108. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  109. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-ast/Cargo.toml +0 -0
  110. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-ast/src/ast.rs +0 -0
  111. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-ast/src/lib.rs +0 -0
  112. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-builtins-meta/Cargo.toml +0 -0
  113. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-builtins-meta/src/lib.rs +0 -0
  114. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-compiler/Cargo.toml +0 -0
  115. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-compiler/src/planner.rs +0 -0
  116. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/Cargo.toml +0 -0
  117. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/advanced.rs +0 -0
  118. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/concurrency_guard.rs +0 -0
  119. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/concurrent.rs +0 -0
  120. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/engine.rs +0 -0
  121. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/fixtures.rs +0 -0
  122. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/index_acceleration.rs +0 -0
  123. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/memory.rs +0 -0
  124. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/perf_smoke.rs +0 -0
  125. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
  126. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/query_implementations.rs +0 -0
  127. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/realistic.rs +0 -0
  128. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/scale.rs +0 -0
  129. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/temporal_spatial.rs +0 -0
  130. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/benches/wal.rs +0 -0
  131. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/examples/bulk_probe.rs +0 -0
  132. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/examples/carried_probe.rs +0 -0
  133. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/examples/heap_probe.rs +0 -0
  134. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/examples/keyset_probe.rs +0 -0
  135. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/examples/optional_probe.rs +0 -0
  136. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/examples/perf_probe.rs +0 -0
  137. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/examples/pushdown_probe.rs +0 -0
  138. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/changes/history.rs +0 -0
  139. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/changes/mod.rs +0 -0
  140. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/builder.rs +0 -0
  141. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/changes.rs +0 -0
  142. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/compile.rs +0 -0
  143. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/execute.rs +0 -0
  144. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/graph_api.rs +0 -0
  145. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/mod.rs +0 -0
  146. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/occ.rs +0 -0
  147. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/procedures.rs +0 -0
  148. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/profile.rs +0 -0
  149. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/replay.rs +0 -0
  150. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/row_projection.rs +0 -0
  151. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/schema.rs +0 -0
  152. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/show_pipeline.rs +0 -0
  153. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/stream.rs +0 -0
  154. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/database/write_guard.rs +0 -0
  155. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/durable_io.rs +0 -0
  156. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/error.rs +0 -0
  157. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/explain.rs +0 -0
  158. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/io.rs +0 -0
  159. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/lib.rs +0 -0
  160. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/live_store.rs +0 -0
  161. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/named.rs +0 -0
  162. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/plan_cache.rs +0 -0
  163. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/snapshot/json.rs +0 -0
  164. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/snapshot/mod.rs +0 -0
  165. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/snapshot/store.rs +0 -0
  166. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/stream.rs +0 -0
  167. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/transaction.rs +0 -0
  168. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/wal/admin.rs +0 -0
  169. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/wal/archive/format.rs +0 -0
  170. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  171. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  172. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/wal/archive/worker.rs +0 -0
  173. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
  174. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/wal/archive.rs +0 -0
  175. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/wal/mod.rs +0 -0
  176. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/src/wal/write_scope.rs +0 -0
  177. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/advanced_queries.rs +0 -0
  178. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/aggregate_semantics.rs +0 -0
  179. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/aggregation.rs +0 -0
  180. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/and_or_short_circuit.rs +0 -0
  181. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/bbox_antimeridian.rs +0 -0
  182. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/binary.rs +0 -0
  183. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/bit_shifts.rs +0 -0
  184. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/borrowed_variable_reads.rs +0 -0
  185. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
  186. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/call_subquery_writes.rs +0 -0
  187. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/carried_value_sharing.rs +0 -0
  188. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/change_feed.rs +0 -0
  189. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/collect_nulls.rs +0 -0
  190. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/comparison_ordering.rs +0 -0
  191. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/constraints.rs +0 -0
  192. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/create.rs +0 -0
  193. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/cypher_compat.rs +0 -0
  194. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/deferred_existence_end_state.rs +0 -0
  195. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/docs_examples.rs +0 -0
  196. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/early_limit.rs +0 -0
  197. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/empty_ranges.rs +0 -0
  198. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/entity_property_values.rs +0 -0
  199. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/error_messages.rs +0 -0
  200. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/errors.rs +0 -0
  201. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/explain_estimates.rs +0 -0
  202. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/explain_profile.rs +0 -0
  203. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/expression_semantics.rs +0 -0
  204. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/expressions.rs +0 -0
  205. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/foreach.rs +0 -0
  206. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/fulltext_index.rs +0 -0
  207. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/fulltext_list_properties.rs +0 -0
  208. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/functions_extended.rs +0 -0
  209. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/grouping_key_identity.rs +0 -0
  210. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/index_acceleration.rs +0 -0
  211. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/integer_literals.rs +0 -0
  212. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/invariants.rs +0 -0
  213. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/limit_skip_counts.rs +0 -0
  214. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/managed_snapshots.rs +0 -0
  215. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/match.rs +0 -0
  216. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/merge.rs +0 -0
  217. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/merge_bound_end.rs +0 -0
  218. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/missing_parameters.rs +0 -0
  219. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/nested_aggregates.rs +0 -0
  220. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/null_properties_and_deferred_existence.rs +0 -0
  221. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/optional_match_correlated.rs +0 -0
  222. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/optional_match_leading.rs +0 -0
  223. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/order_by_aggregates.rs +0 -0
  224. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/order_by_index.rs +0 -0
  225. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/order_limit_semantics.rs +0 -0
  226. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/ordering.rs +0 -0
  227. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/parameters.rs +0 -0
  228. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/parser.rs +0 -0
  229. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/paths.rs +0 -0
  230. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/pattern_subquery_property_seek.rs +0 -0
  231. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/pattern_subquery_rel_properties.rs +0 -0
  232. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/pattern_subquery_scope.rs +0 -0
  233. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/pattern_subquery_var_length.rs +0 -0
  234. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/planner_pushdown.rs +0 -0
  235. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/procedure_yield.rs +0 -0
  236. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/projection.rs +0 -0
  237. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/range_scan_other_kinds.rs +0 -0
  238. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/scale.rs +0 -0
  239. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/schema.rs +0 -0
  240. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/schema_in_transaction.rs +0 -0
  241. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/seeds.rs +0 -0
  242. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/shared_index_value_writes.rs +0 -0
  243. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/snapshot.rs +0 -0
  244. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/sort_limit_probe.rs +0 -0
  245. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/spatial.rs +0 -0
  246. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/starts_with_range_seek.rs +0 -0
  247. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/statement_atomicity.rs +0 -0
  248. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/string_number_addition.rs +0 -0
  249. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/sum_empty.rs +0 -0
  250. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/temporal.rs +0 -0
  251. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/temporal_constructor_functions.rs +0 -0
  252. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/temporal_constructors.rs +0 -0
  253. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/temporal_map_components.rs +0 -0
  254. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/temporal_range_index.rs +0 -0
  255. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/temporal_strings.rs +0 -0
  256. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/temporal_time_zones.rs +0 -0
  257. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/temporal_zone_accessors.rs +0 -0
  258. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/test_helpers.rs +0 -0
  259. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/timeouts.rs +0 -0
  260. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/transactions.rs +0 -0
  261. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/types_advanced.rs +0 -0
  262. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/union.rs +0 -0
  263. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/unknown_names.rs +0 -0
  264. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
  265. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/update.rs +0 -0
  266. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/var_length_bound_endpoint.rs +0 -0
  267. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/var_length_hop_ranges.rs +0 -0
  268. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/vector_index.rs +0 -0
  269. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/vectors.rs +0 -0
  270. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/wal.rs +0 -0
  271. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/where_clause.rs +0 -0
  272. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/with.rs +0 -0
  273. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/with_predicates.rs +0 -0
  274. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/write_path_bindings.rs +0 -0
  275. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-database/tests/write_results.rs +0 -0
  276. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/Cargo.toml +0 -0
  277. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/cancel.rs +0 -0
  278. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/errors.rs +0 -0
  279. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/binops.rs +0 -0
  280. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
  281. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
  282. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
  283. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
  284. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
  285. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/index_ns.rs +0 -0
  286. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
  287. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/list.rs +0 -0
  288. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
  289. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
  290. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
  291. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
  292. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
  293. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
  294. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
  295. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/temporal_build.rs +0 -0
  296. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
  297. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
  298. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
  299. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
  300. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/errors.rs +0 -0
  301. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/functions.rs +0 -0
  302. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/mod.rs +0 -0
  303. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/point.rs +0 -0
  304. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/regex.rs +0 -0
  305. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/eval/vector.rs +0 -0
  306. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/executor/aggregation.rs +0 -0
  307. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/executor/optional.rs +0 -0
  308. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/executor/sort.rs +0 -0
  309. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/lib.rs +0 -0
  310. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/profile.rs +0 -0
  311. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/aggregate.rs +0 -0
  312. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
  313. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/context.rs +0 -0
  314. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/filter.rs +0 -0
  315. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/mod.rs +0 -0
  316. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/mutable.rs +0 -0
  317. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/optional.rs +0 -0
  318. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/path.rs +0 -0
  319. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/projection.rs +0 -0
  320. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/shape.rs +0 -0
  321. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/sort.rs +0 -0
  322. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/source.rs +0 -0
  323. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/tests.rs +0 -0
  324. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/src/pull/union.rs +0 -0
  325. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-executor/tests/error_messages.rs +0 -0
  326. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-io/Cargo.toml +0 -0
  327. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-io/src/csv.rs +0 -0
  328. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-io/src/format.rs +0 -0
  329. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-io/src/json_array.rs +0 -0
  330. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-io/src/jsonl.rs +0 -0
  331. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-io/src/lib.rs +0 -0
  332. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-io/src/mapping.rs +0 -0
  333. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-io/src/value_json.rs +0 -0
  334. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/Cargo.toml +0 -0
  335. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/cypher.pest +0 -0
  336. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/errors.rs +0 -0
  337. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/lib.rs +0 -0
  338. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/parser/clauses.rs +0 -0
  339. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/parser/expressions.rs +0 -0
  340. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/parser/literals.rs +0 -0
  341. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/parser/mod.rs +0 -0
  342. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/parser/patterns.rs +0 -0
  343. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/parser/query.rs +0 -0
  344. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/parser/schema.rs +0 -0
  345. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/parser/tests.rs +0 -0
  346. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/src/parser/util.rs +0 -0
  347. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-parser/tests/error_messages.rs +0 -0
  348. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/Cargo.toml +0 -0
  349. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/src/body.rs +0 -0
  350. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/src/codec.rs +0 -0
  351. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/src/envelope.rs +0 -0
  352. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/src/errors.rs +0 -0
  353. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/src/format.rs +0 -0
  354. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/src/lib.rs +0 -0
  355. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/src/options.rs +0 -0
  356. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/src/transform.rs +0 -0
  357. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/src/view.rs +0 -0
  358. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  359. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/Cargo.toml +0 -0
  360. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/codec.rs +0 -0
  361. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/intern.rs +0 -0
  362. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/lock_table.rs +0 -0
  363. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
  364. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/hnsw.rs +0 -0
  365. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/memory/vector_index.rs +0 -0
  366. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/mutation.rs +0 -0
  367. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/snapshot.rs +0 -0
  368. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/binary/mod.rs +0 -0
  369. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/binary/tests.rs +0 -0
  370. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/binary/traits.rs +0 -0
  371. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/binary/types.rs +0 -0
  372. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/property_map.rs +0 -0
  373. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/property_value.rs +0 -0
  374. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/spatial/bbox.rs +0 -0
  375. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  376. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/spatial/mod.rs +0 -0
  377. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/spatial/point.rs +0 -0
  378. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  379. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  380. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  381. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/temporal/date.rs +0 -0
  382. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
  383. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/temporal/duration.rs +0 -0
  384. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/temporal/format.rs +0 -0
  385. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  386. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  387. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/temporal/time.rs +0 -0
  388. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/temporal/zone.rs +0 -0
  389. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/vector/build.rs +0 -0
  390. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/vector/mod.rs +0 -0
  391. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  392. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/vector/tests.rs +0 -0
  393. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/src/types/vector/types.rs +0 -0
  394. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-store/tests/error_messages.rs +0 -0
  395. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/Cargo.toml +0 -0
  396. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/codec/decode.rs +0 -0
  397. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/codec/encode.rs +0 -0
  398. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/codec/format.rs +0 -0
  399. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/codec/mod.rs +0 -0
  400. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/codec/tests.rs +0 -0
  401. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/config.rs +0 -0
  402. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/dir.rs +0 -0
  403. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/errors.rs +0 -0
  404. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/history.rs +0 -0
  405. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/io.rs +0 -0
  406. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/lib.rs +0 -0
  407. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/lock.rs +0 -0
  408. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/lsn.rs +0 -0
  409. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/record.rs +0 -0
  410. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/recorder/errors.rs +0 -0
  411. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  412. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/recorder/mod.rs +0 -0
  413. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/recorder/recorder.rs +0 -0
  414. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/recorder/tests.rs +0 -0
  415. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/replay.rs +0 -0
  416. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/segment.rs +0 -0
  417. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/testing.rs +0 -0
  418. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
  419. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/wal/mod.rs +0 -0
  420. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/wal/tests.rs +0 -0
  421. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/src/wal/wal.rs +0 -0
  422. {lora_python-0.22.3 → lora_python-0.24.0}/crates/lora-wal/tests/error_messages.rs +0 -0
  423. {lora_python-0.22.3 → lora_python-0.24.0}/python/lora_python/__init__.py +0 -0
  424. {lora_python-0.22.3 → lora_python-0.24.0}/python/lora_python/_async.py +0 -0
  425. {lora_python-0.22.3 → lora_python-0.24.0}/python/lora_python/_native.pyi +0 -0
  426. {lora_python-0.22.3 → lora_python-0.24.0}/python/lora_python/py.typed +0 -0
  427. {lora_python-0.22.3 → lora_python-0.24.0}/python/lora_python/types.py +0 -0
@@ -854,7 +854,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
854
854
 
855
855
  [[package]]
856
856
  name = "lora-analyzer"
857
- version = "0.22.3"
857
+ version = "0.24.0"
858
858
  dependencies = [
859
859
  "lora-ast",
860
860
  "lora-builtins-meta",
@@ -865,14 +865,14 @@ dependencies = [
865
865
 
866
866
  [[package]]
867
867
  name = "lora-ast"
868
- version = "0.22.3"
868
+ version = "0.24.0"
869
869
  dependencies = [
870
870
  "smallvec 2.0.0-alpha.12",
871
871
  ]
872
872
 
873
873
  [[package]]
874
874
  name = "lora-binding-buffer"
875
- version = "0.22.3"
875
+ version = "0.24.0"
876
876
  dependencies = [
877
877
  "lora-database",
878
878
  "lora-store",
@@ -880,11 +880,11 @@ dependencies = [
880
880
 
881
881
  [[package]]
882
882
  name = "lora-builtins-meta"
883
- version = "0.22.3"
883
+ version = "0.24.0"
884
884
 
885
885
  [[package]]
886
886
  name = "lora-compiler"
887
- version = "0.22.3"
887
+ version = "0.24.0"
888
888
  dependencies = [
889
889
  "lora-analyzer",
890
890
  "lora-ast",
@@ -893,7 +893,7 @@ dependencies = [
893
893
 
894
894
  [[package]]
895
895
  name = "lora-database"
896
- version = "0.22.3"
896
+ version = "0.24.0"
897
897
  dependencies = [
898
898
  "anyhow",
899
899
  "chacha20poly1305",
@@ -918,7 +918,7 @@ dependencies = [
918
918
 
919
919
  [[package]]
920
920
  name = "lora-executor"
921
- version = "0.22.3"
921
+ version = "0.24.0"
922
922
  dependencies = [
923
923
  "blake3",
924
924
  "crc32fast",
@@ -941,7 +941,7 @@ dependencies = [
941
941
 
942
942
  [[package]]
943
943
  name = "lora-ffi"
944
- version = "0.22.3"
944
+ version = "0.24.0"
945
945
  dependencies = [
946
946
  "anyhow",
947
947
  "lora-binding-buffer",
@@ -953,7 +953,7 @@ dependencies = [
953
953
 
954
954
  [[package]]
955
955
  name = "lora-io"
956
- version = "0.22.3"
956
+ version = "0.24.0"
957
957
  dependencies = [
958
958
  "lora-executor",
959
959
  "lora-store",
@@ -964,7 +964,7 @@ dependencies = [
964
964
 
965
965
  [[package]]
966
966
  name = "lora-node"
967
- version = "0.22.3"
967
+ version = "0.24.0"
968
968
  dependencies = [
969
969
  "anyhow",
970
970
  "lora-binding-buffer",
@@ -979,7 +979,7 @@ dependencies = [
979
979
 
980
980
  [[package]]
981
981
  name = "lora-parser"
982
- version = "0.22.3"
982
+ version = "0.24.0"
983
983
  dependencies = [
984
984
  "lora-ast",
985
985
  "pest",
@@ -990,7 +990,7 @@ dependencies = [
990
990
 
991
991
  [[package]]
992
992
  name = "lora-python"
993
- version = "0.22.3"
993
+ version = "0.24.0"
994
994
  dependencies = [
995
995
  "anyhow",
996
996
  "lora-binding-buffer",
@@ -1003,7 +1003,7 @@ dependencies = [
1003
1003
 
1004
1004
  [[package]]
1005
1005
  name = "lora-query-wasm"
1006
- version = "0.22.3"
1006
+ version = "0.24.0"
1007
1007
  dependencies = [
1008
1008
  "console_error_panic_hook",
1009
1009
  "js-sys",
@@ -1017,7 +1017,7 @@ dependencies = [
1017
1017
 
1018
1018
  [[package]]
1019
1019
  name = "lora-server"
1020
- version = "0.22.3"
1020
+ version = "0.24.0"
1021
1021
  dependencies = [
1022
1022
  "anyhow",
1023
1023
  "axum",
@@ -1032,7 +1032,7 @@ dependencies = [
1032
1032
 
1033
1033
  [[package]]
1034
1034
  name = "lora-snapshot"
1035
- version = "0.22.3"
1035
+ version = "0.24.0"
1036
1036
  dependencies = [
1037
1037
  "argon2",
1038
1038
  "blake3",
@@ -1047,7 +1047,7 @@ dependencies = [
1047
1047
 
1048
1048
  [[package]]
1049
1049
  name = "lora-store"
1050
- version = "0.22.3"
1050
+ version = "0.24.0"
1051
1051
  dependencies = [
1052
1052
  "crc32fast",
1053
1053
  "jiff",
@@ -1062,7 +1062,7 @@ dependencies = [
1062
1062
 
1063
1063
  [[package]]
1064
1064
  name = "lora-wal"
1065
- version = "0.22.3"
1065
+ version = "0.24.0"
1066
1066
  dependencies = [
1067
1067
  "crc32fast",
1068
1068
  "lora-store",
@@ -1072,7 +1072,7 @@ dependencies = [
1072
1072
 
1073
1073
  [[package]]
1074
1074
  name = "lora-wasm"
1075
- version = "0.22.3"
1075
+ version = "0.24.0"
1076
1076
  dependencies = [
1077
1077
  "anyhow",
1078
1078
  "console_error_panic_hook",
@@ -1088,7 +1088,7 @@ dependencies = [
1088
1088
 
1089
1089
  [[package]]
1090
1090
  name = "lora_ruby"
1091
- version = "0.22.3"
1091
+ version = "0.24.0"
1092
1092
  dependencies = [
1093
1093
  "anyhow",
1094
1094
  "lora-database",
@@ -4,7 +4,7 @@ resolver = "2"
4
4
 
5
5
  [workspace.package]
6
6
  edition = "2021"
7
- version = "0.22.3"
7
+ version = "0.24.0"
8
8
  license = "BUSL-1.1"
9
9
  authors = ["LoraDB, Inc."]
10
10
  repository = "https://github.com/lora-db/lora"
@@ -15,18 +15,18 @@ rust-version = "1.87"
15
15
  # Internal crates — versions are kept in lockstep with [workspace.package].version
16
16
  # by `scripts/sync-versions.mjs`. Both `path` and `version` are set so that
17
17
  # `cargo publish` works (crates.io cannot resolve path-only deps).
18
- lora-ast = { path = "crates/lora-ast", version = "=0.22.3" }
19
- lora-parser = { path = "crates/lora-parser", version = "=0.22.3" }
20
- lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.22.3" }
21
- lora-analyzer = { path = "crates/lora-analyzer", version = "=0.22.3" }
22
- lora-compiler = { path = "crates/lora-compiler", version = "=0.22.3" }
23
- lora-store = { path = "crates/lora-store", version = "=0.22.3" }
24
- lora-snapshot = { path = "crates/lora-snapshot", version = "=0.22.3", default-features = false }
25
- lora-io = { path = "crates/lora-io", version = "=0.22.3" }
26
- lora-wal = { path = "crates/lora-wal", version = "=0.22.3" }
27
- lora-executor = { path = "crates/lora-executor", version = "=0.22.3", default-features = false }
28
- lora-database = { path = "crates/lora-database", version = "=0.22.3" }
29
- lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.22.3" }
18
+ lora-ast = { path = "crates/lora-ast", version = "=0.24.0" }
19
+ lora-parser = { path = "crates/lora-parser", version = "=0.24.0" }
20
+ lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.24.0" }
21
+ lora-analyzer = { path = "crates/lora-analyzer", version = "=0.24.0" }
22
+ lora-compiler = { path = "crates/lora-compiler", version = "=0.24.0" }
23
+ lora-store = { path = "crates/lora-store", version = "=0.24.0" }
24
+ lora-snapshot = { path = "crates/lora-snapshot", version = "=0.24.0", default-features = false }
25
+ lora-io = { path = "crates/lora-io", version = "=0.24.0" }
26
+ lora-wal = { path = "crates/lora-wal", version = "=0.24.0" }
27
+ lora-executor = { path = "crates/lora-executor", version = "=0.24.0", default-features = false }
28
+ lora-database = { path = "crates/lora-database", version = "=0.24.0" }
29
+ lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.24.0" }
30
30
 
31
31
  # External crates.
32
32
  anyhow = "1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lora-python
3
- Version: 0.22.3
3
+ Version: 0.24.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -10,17 +10,19 @@ pub use plan_tree::{plan_tree_from_compiled, PlanTree, PlanTreeNode};
10
10
 
11
11
  pub use logical::{
12
12
  Aggregation, Argument, Create, Delete, Expand, Filter, Foreach, Limit, LogicalOp, LogicalPlan,
13
- Merge, NodeByPointScan, NodeByPropertyRangeScan, NodeByPropertyScan, NodeByTextScan, NodeScan,
14
- OptionalMatch, PathBuild, PlanNodeId, PointPredicate, Projection, RelByPointScan,
15
- RelByPropertyRangeScan, RelByTextScan, Remove, Set, Sort, SortLimit, TextPredicate, Unwind,
13
+ Merge, NodeByIdSeek, NodeByPointScan, NodeByPropertyRangeScan, NodeByPropertyScan,
14
+ NodeByTextScan, NodeScan, OptionalMatch, PathBuild, PlanNodeId, PointPredicate, Projection,
15
+ RelByIdSeek, RelByPointScan, RelByPropertyRangeScan, RelByTextScan, Remove, Set, Sort,
16
+ SortLimit, TextPredicate, Unwind,
16
17
  };
17
18
  pub use optimizer::Optimizer;
18
19
  pub use physical::{
19
20
  ArgumentExec, CreateExec, DeleteExec, ExpandExec, FilterExec, ForeachExec, HashAggregationExec,
20
- LimitExec, MergeExec, NodeByLabelScanExec, NodeByPointScanExec, NodeByPropertyRangeScanExec,
21
- NodeByPropertyScanExec, NodeByTextScanExec, NodeScanExec, OptionalMatchExec, PathBuildExec,
22
- PhysicalNodeId, PhysicalOp, PhysicalPlan, ProjectionExec, RelByPointScanExec,
23
- RelByPropertyRangeScanExec, RelByTextScanExec, RemoveExec, SetExec, SortExec, UnwindExec,
21
+ LimitExec, MergeExec, NodeByIdSeekExec, NodeByLabelScanExec, NodeByPointScanExec,
22
+ NodeByPropertyRangeScanExec, NodeByPropertyScanExec, NodeByTextScanExec, NodeScanExec,
23
+ OptionalMatchExec, PathBuildExec, PhysicalNodeId, PhysicalOp, PhysicalPlan, ProjectionExec,
24
+ RelByIdSeekExec, RelByPointScanExec, RelByPropertyRangeScanExec, RelByTextScanExec, RemoveExec,
25
+ SetExec, SortExec, UnwindExec,
24
26
  };
25
27
  pub use planner::Planner;
26
28
 
@@ -17,6 +17,7 @@ pub struct LogicalPlan {
17
17
  pub enum LogicalOp {
18
18
  Argument(Argument),
19
19
  NodeScan(NodeScan),
20
+ NodeByIdSeek(NodeByIdSeek),
20
21
  NodeByPropertyScan(NodeByPropertyScan),
21
22
  NodeByPropertyRangeScan(NodeByPropertyRangeScan),
22
23
  NodeByTextScan(NodeByTextScan),
@@ -24,6 +25,7 @@ pub enum LogicalOp {
24
25
  RelByPropertyRangeScan(RelByPropertyRangeScan),
25
26
  RelByTextScan(RelByTextScan),
26
27
  RelByPointScan(RelByPointScan),
28
+ RelByIdSeek(RelByIdSeek),
27
29
  Expand(Expand),
28
30
  Filter(Filter),
29
31
  Projection(Projection),
@@ -104,6 +106,23 @@ pub struct NodeScan {
104
106
  pub labels: Vec<Vec<String>>,
105
107
  }
106
108
 
109
+ /// Seek nodes by internal id, rewritten from `Filter(NodeScan)` when the
110
+ /// filter has an `id(var) = value` or `id(var) IN list` conjunct whose
111
+ /// value does not read `var`. Emits each existing node whose id equals
112
+ /// the value (or one of the list's elements, once per distinct id) and
113
+ /// whose labels match `labels`. The `Filter` stays above, so the id test
114
+ /// and every other conjunct are still judged with expression semantics.
115
+ #[derive(Debug, Clone)]
116
+ pub struct NodeByIdSeek {
117
+ pub input: Option<PlanNodeId>,
118
+ pub var: VarId,
119
+ /// Each inner Vec is a disjunctive group (OR). Outer Vec is conjunctive (AND).
120
+ pub labels: Vec<Vec<String>>,
121
+ pub ids: ResolvedExpr,
122
+ /// `false`: `id(var) = ids`. `true`: `ids` is a list, `id(var) IN ids`.
123
+ pub in_list: bool,
124
+ }
125
+
107
126
  #[derive(Debug, Clone)]
108
127
  pub struct NodeByPropertyScan {
109
128
  pub input: Option<PlanNodeId>,
@@ -233,6 +252,26 @@ pub struct RelByPointScan {
233
252
  pub predicate: PointPredicate,
234
253
  }
235
254
 
255
+ /// Seek a relationship by internal id, rewritten from
256
+ /// `Filter(Expand(NodeScan(src)))` when the filter has an `id(rel) = value`
257
+ /// or `id(rel) IN list` conjunct. Binds `src`, `rel` and `dst` from the
258
+ /// stored endpoints as the expand would (direction, `types`, both
259
+ /// orientations of an undirected pattern, already-bound variables), and
260
+ /// checks `src_labels` that the replaced scan carried. The `Filter` stays
261
+ /// above.
262
+ #[derive(Debug, Clone)]
263
+ pub struct RelByIdSeek {
264
+ pub input: Option<PlanNodeId>,
265
+ pub src: VarId,
266
+ pub src_labels: Vec<Vec<String>>,
267
+ pub rel: VarId,
268
+ pub dst: VarId,
269
+ pub types: Vec<String>,
270
+ pub direction: Direction,
271
+ pub ids: ResolvedExpr,
272
+ pub in_list: bool,
273
+ }
274
+
236
275
  #[derive(Debug, Clone)]
237
276
  pub struct Expand {
238
277
  pub input: PlanNodeId,
@@ -176,6 +176,20 @@ impl Optimizer {
176
176
  continue;
177
177
  };
178
178
 
179
+ // A seek by internal id reads at most one node per id, so it
180
+ // beats every other access path whatever the stats say (and an
181
+ // empty or stale stats snapshot must not keep a scan).
182
+ if let Some((ids, in_list)) = id_seek_value(&predicate, scan.var, NODE_ID_FUNCTIONS) {
183
+ plan.nodes[input_id] = LogicalOp::NodeByIdSeek(NodeByIdSeek {
184
+ input: scan.input,
185
+ var: scan.var,
186
+ labels: scan.labels.clone(),
187
+ ids,
188
+ in_list,
189
+ });
190
+ continue;
191
+ }
192
+
179
193
  let candidates = collect_index_candidates(scan, &predicate, stats);
180
194
  let Some(best) = pick_best_candidate(&plan.nodes[input_id], candidates, stats) else {
181
195
  continue;
@@ -209,12 +223,35 @@ impl Optimizer {
209
223
  let Some(rel_var) = expand.rel else {
210
224
  continue;
211
225
  };
212
- // Source must be a root, unconstrained NodeScan; otherwise
213
- // replacing it can bypass upstream rows or an already-bound
214
- // source variable.
215
226
  let LogicalOp::NodeScan(src_scan) = &plan.nodes[expand.input] else {
216
227
  continue;
217
228
  };
229
+ if src_scan.var != expand.src {
230
+ continue;
231
+ }
232
+
233
+ // `id(r) = value`: seek the relationship and bind its endpoints.
234
+ // Unlike the index scans below this works under any source
235
+ // scan: the seek runs once per upstream row, checks the
236
+ // source's labels, and binds through already-bound variables.
237
+ if let Some((ids, in_list)) = id_seek_value(&predicate, rel_var, REL_ID_FUNCTIONS) {
238
+ plan.nodes[filter_input] = LogicalOp::RelByIdSeek(RelByIdSeek {
239
+ input: src_scan.input,
240
+ src: expand.src,
241
+ src_labels: src_scan.labels.clone(),
242
+ rel: rel_var,
243
+ dst: expand.dst,
244
+ types: expand.types.clone(),
245
+ direction: expand.direction,
246
+ ids,
247
+ in_list,
248
+ });
249
+ continue;
250
+ }
251
+
252
+ // Source must be a root, unconstrained NodeScan; otherwise
253
+ // replacing it can bypass upstream rows or an already-bound
254
+ // source variable.
218
255
  if src_scan.input.is_some() || !src_scan.labels.is_empty() {
219
256
  continue;
220
257
  }
@@ -292,6 +329,26 @@ fn lower_logical_op(op: LogicalOp) -> PhysicalOp {
292
329
 
293
330
  LogicalOp::NodeScan(scan) => lower_node_scan(scan),
294
331
 
332
+ LogicalOp::NodeByIdSeek(seek) => PhysicalOp::NodeByIdSeek(NodeByIdSeekExec {
333
+ input: seek.input,
334
+ var: seek.var,
335
+ labels: seek.labels,
336
+ ids: seek.ids,
337
+ in_list: seek.in_list,
338
+ }),
339
+
340
+ LogicalOp::RelByIdSeek(seek) => PhysicalOp::RelByIdSeek(RelByIdSeekExec {
341
+ input: seek.input,
342
+ src: seek.src,
343
+ src_labels: seek.src_labels,
344
+ rel: seek.rel,
345
+ dst: seek.dst,
346
+ types: seek.types,
347
+ direction: seek.direction,
348
+ ids: seek.ids,
349
+ in_list: seek.in_list,
350
+ }),
351
+
295
352
  LogicalOp::NodeByPropertyScan(scan) => {
296
353
  PhysicalOp::NodeByPropertyScan(NodeByPropertyScanExec {
297
354
  input: scan.input,
@@ -819,6 +876,14 @@ fn score_logical_op(op: &LogicalOp, stats: &GraphStats) -> Option<u64> {
819
876
  // fraction of the labelled set.
820
877
  Some(base.div_ceil(5))
821
878
  }
879
+ LogicalOp::NodeByIdSeek(seek) => Some(id_seek_rows(&seek.ids, seek.in_list)),
880
+ LogicalOp::RelByIdSeek(seek) => {
881
+ let rows = id_seek_rows(&seek.ids, seek.in_list);
882
+ Some(match seek.direction {
883
+ lora_ast::Direction::Undirected => rows.saturating_mul(2),
884
+ _ => rows,
885
+ })
886
+ }
822
887
  LogicalOp::Filter(_) => None,
823
888
  LogicalOp::Expand(expand) => {
824
889
  // Used as the baseline when evaluating rel-index rewrites.
@@ -1294,6 +1359,75 @@ fn text_predicate_for_var(predicate: &ResolvedExpr, var: VarId) -> Option<TextCa
1294
1359
  })
1295
1360
  }
1296
1361
 
1362
+ /// The id functions whose result for a node is the node's id.
1363
+ pub(crate) const NODE_ID_FUNCTIONS: &[&str] = &["value.id", "node.id"];
1364
+ /// The id functions whose result for a relationship is its id.
1365
+ pub(crate) const REL_ID_FUNCTIONS: &[&str] = &["value.id", "edge.id"];
1366
+
1367
+ /// `true` when `expr` is `f(var)` for one of the id functions `names`.
1368
+ pub(crate) fn is_id_of_var(expr: &ResolvedExpr, var: VarId, names: &[&str]) -> bool {
1369
+ matches!(
1370
+ expr,
1371
+ ResolvedExpr::Function { function, distinct: false, args }
1372
+ if args.len() == 1
1373
+ && matches!(&args[0], ResolvedExpr::Variable(v) if *v == var)
1374
+ && names.iter().any(|name| function.eq_ignore_ascii_case(name))
1375
+ )
1376
+ }
1377
+
1378
+ /// The first `id(var) = value` conjunct of an AND-tree (either side), or
1379
+ /// failing that the first `id(var) IN list`, where the value does not read
1380
+ /// `var`. Returns the value and whether it is an `IN` list. Equality comes
1381
+ /// first: it seeks one id, a list possibly many.
1382
+ fn id_seek_value(
1383
+ predicate: &ResolvedExpr,
1384
+ var: VarId,
1385
+ names: &[&str],
1386
+ ) -> Option<(ResolvedExpr, bool)> {
1387
+ let conjuncts = and_conjuncts(predicate);
1388
+ let free_of_var = |e: &ResolvedExpr| !collect_vars(e).contains(&var);
1389
+ let equality = conjuncts.iter().find_map(|conjunct| {
1390
+ let ResolvedExpr::Binary {
1391
+ lhs,
1392
+ op: BinaryOp::Eq,
1393
+ rhs,
1394
+ } = conjunct
1395
+ else {
1396
+ return None;
1397
+ };
1398
+ if is_id_of_var(lhs, var, names) && free_of_var(rhs) {
1399
+ Some((**rhs).clone())
1400
+ } else if is_id_of_var(rhs, var, names) && free_of_var(lhs) {
1401
+ Some((**lhs).clone())
1402
+ } else {
1403
+ None
1404
+ }
1405
+ });
1406
+ if let Some(value) = equality {
1407
+ return Some((value, false));
1408
+ }
1409
+ conjuncts.iter().find_map(|conjunct| {
1410
+ let ResolvedExpr::Binary {
1411
+ lhs,
1412
+ op: BinaryOp::In,
1413
+ rhs,
1414
+ } = conjunct
1415
+ else {
1416
+ return None;
1417
+ };
1418
+ (is_id_of_var(lhs, var, names) && free_of_var(rhs)).then(|| ((**rhs).clone(), true))
1419
+ })
1420
+ }
1421
+
1422
+ /// Estimated rows of an id seek: one per id (a literal list's length,
1423
+ /// otherwise one).
1424
+ fn id_seek_rows(ids: &ResolvedExpr, in_list: bool) -> u64 {
1425
+ match (in_list, ids) {
1426
+ (true, ResolvedExpr::List(items)) => items.len() as u64,
1427
+ _ => 1,
1428
+ }
1429
+ }
1430
+
1297
1431
  /// Every `var.key = value` conjunct of an AND-tree, in order, where
1298
1432
  /// `value` does not mention `var`.
1299
1433
  fn property_equalities_for_var(
@@ -1426,7 +1560,7 @@ mod tests {
1426
1560
  };
1427
1561
  s.nodes_by_label.insert(label.to_string(), total);
1428
1562
  if let Some(d) = distinct {
1429
- s.node_distinct_values
1563
+ std::sync::Arc::make_mut(&mut s.node_distinct_values)
1430
1564
  .insert((label.to_string(), "id".to_string()), d);
1431
1565
  }
1432
1566
  s
@@ -265,14 +265,62 @@ impl<'a> PatternPlanner<'a> {
265
265
  /// first: true when the last node is clearly cheaper to start from
266
266
  /// (already bound, a key seek, or a smaller label).
267
267
  fn should_start_from_tail(&self, head: &ResolvedNode, chain: &[ResolvedChain]) -> bool {
268
- let Some(last) = chain.last() else {
268
+ let (Some(first), Some(last)) = (chain.first(), chain.last()) else {
269
269
  return false;
270
270
  };
271
- let head_cost = self.start_cost(head);
272
- let tail_cost = self.start_cost(&last.node);
271
+ let head_cost = self
272
+ .start_cost(head)
273
+ .min(self.rel_seek_cost(head, &first.rel));
274
+ let tail_cost = self
275
+ .start_cost(&last.node)
276
+ .min(self.rel_seek_cost(&last.node, &last.rel));
273
277
  tail_cost < head_cost
274
278
  }
275
279
 
280
+ /// Cost of starting at `end` when the chain's relationship next to it,
281
+ /// `rel`, can be sought by id (`id(r) = value` pending): the optimizer
282
+ /// turns `Expand(NodeScan(end))` into a relationship seek, one row.
283
+ /// `u64::MAX` when it cannot.
284
+ fn rel_seek_cost(&self, end: &ResolvedNode, rel: &ResolvedRel) -> u64 {
285
+ let Some(rel_var) = rel.var else {
286
+ return u64::MAX;
287
+ };
288
+ // Inline properties put a Filter between the scan and the expand,
289
+ // which the seek rewrite does not look through.
290
+ if end.properties.is_some() || rel.properties.is_some() || rel.range.is_some() {
291
+ return u64::MAX;
292
+ }
293
+ if self.has_pending_id_seek(rel_var, crate::optimizer::REL_ID_FUNCTIONS) {
294
+ 2
295
+ } else {
296
+ u64::MAX
297
+ }
298
+ }
299
+
300
+ /// Whether a pending conjunct `id(var) = value` / `id(var) IN list`
301
+ /// could be evaluated once `var` is bound (the value reads only
302
+ /// variables already available).
303
+ fn has_pending_id_seek(&self, var: VarId, names: &[&str]) -> bool {
304
+ self.pending.iter().any(|pending| {
305
+ if !pending
306
+ .needs
307
+ .iter()
308
+ .all(|v| *v == var || self.available.contains(v))
309
+ {
310
+ return false;
311
+ }
312
+ let ResolvedExpr::Binary { lhs, op, rhs } = &pending.expr else {
313
+ return false;
314
+ };
315
+ let is_id = |e: &ResolvedExpr| crate::optimizer::is_id_of_var(e, var, names);
316
+ match op {
317
+ BinaryOp::Eq => is_id(lhs) || is_id(rhs),
318
+ BinaryOp::In => is_id(lhs),
319
+ _ => false,
320
+ }
321
+ })
322
+ }
323
+
276
324
  /// Rough number of rows a scan of `node` would start with, if it were
277
325
  /// the first node planned from here.
278
326
  fn start_cost(&self, node: &ResolvedNode) -> u64 {
@@ -280,6 +328,10 @@ impl<'a> PatternPlanner<'a> {
280
328
  if self.available.contains(&var) || self.planner.is_bound(var) {
281
329
  return 0;
282
330
  }
331
+ // `id(var) = value`: a seek by id, one row.
332
+ if self.has_pending_id_seek(var, crate::optimizer::NODE_ID_FUNCTIONS) {
333
+ return 2;
334
+ }
283
335
  let stats = self.planner.stats();
284
336
  let label = match node.labels.as_slice() {
285
337
  [group, ..] if group.len() == 1 => Some(group[0].as_str()),
@@ -291,10 +343,12 @@ impl<'a> PatternPlanner<'a> {
291
343
 
292
344
  let mut best = stats.label_count(label).unwrap_or(0);
293
345
  for key in self.seekable_keys(var, node) {
294
- let indexed = stats
346
+ // A distinct count exists for every key some node of the label
347
+ // carries, indexed or not.
348
+ let counted = stats
295
349
  .node_distinct_values
296
350
  .contains_key(&(label.to_string(), key.clone()));
297
- if indexed {
351
+ if counted {
298
352
  if let Some(rows) = stats.estimate_node_property_equality(label, &key) {
299
353
  best = best.min(rows);
300
354
  }
@@ -18,6 +18,7 @@ pub enum PhysicalOp {
18
18
  Argument(ArgumentExec),
19
19
  NodeScan(NodeScanExec),
20
20
  NodeByLabelScan(NodeByLabelScanExec),
21
+ NodeByIdSeek(NodeByIdSeekExec),
21
22
  NodeByPropertyScan(NodeByPropertyScanExec),
22
23
  NodeByPropertyRangeScan(NodeByPropertyRangeScanExec),
23
24
  NodeByTextScan(NodeByTextScanExec),
@@ -25,6 +26,7 @@ pub enum PhysicalOp {
25
26
  RelByPropertyRangeScan(RelByPropertyRangeScanExec),
26
27
  RelByTextScan(RelByTextScanExec),
27
28
  RelByPointScan(RelByPointScanExec),
29
+ RelByIdSeek(RelByIdSeekExec),
28
30
  Expand(ExpandExec),
29
31
  Filter(FilterExec),
30
32
  Projection(ProjectionExec),
@@ -95,6 +97,16 @@ pub struct NodeByLabelScanExec {
95
97
  pub labels: Vec<Vec<String>>,
96
98
  }
97
99
 
100
+ /// See [`crate::logical::NodeByIdSeek`].
101
+ #[derive(Debug, Clone)]
102
+ pub struct NodeByIdSeekExec {
103
+ pub input: Option<PhysicalNodeId>,
104
+ pub var: VarId,
105
+ pub labels: Vec<Vec<String>>,
106
+ pub ids: ResolvedExpr,
107
+ pub in_list: bool,
108
+ }
109
+
98
110
  #[derive(Debug, Clone)]
99
111
  pub struct NodeByPropertyScanExec {
100
112
  pub input: Option<PhysicalNodeId>,
@@ -183,6 +195,20 @@ pub struct RelByPointScanExec {
183
195
  pub predicate: crate::logical::PointPredicate,
184
196
  }
185
197
 
198
+ /// See [`crate::logical::RelByIdSeek`].
199
+ #[derive(Debug, Clone)]
200
+ pub struct RelByIdSeekExec {
201
+ pub input: Option<PhysicalNodeId>,
202
+ pub src: VarId,
203
+ pub src_labels: Vec<Vec<String>>,
204
+ pub rel: VarId,
205
+ pub dst: VarId,
206
+ pub types: Vec<String>,
207
+ pub direction: Direction,
208
+ pub ids: ResolvedExpr,
209
+ pub in_list: bool,
210
+ }
211
+
186
212
  #[derive(Debug, Clone)]
187
213
  pub struct ExpandExec {
188
214
  pub input: PhysicalNodeId,
@@ -146,6 +146,37 @@ fn describe(op: &PhysicalOp) -> PlanDescription {
146
146
  d.insert("labels".to_string(), label_groups_str(&n.labels));
147
147
  PlanDescription::with_children("NodeByLabelScan", d, opt_input(n.input))
148
148
  }
149
+ PhysicalOp::NodeByIdSeek(n) => {
150
+ d.insert("var".to_string(), var_str(n.var));
151
+ if !n.labels.is_empty() {
152
+ d.insert("labels".to_string(), label_groups_str(&n.labels));
153
+ }
154
+ d.insert("ids".to_string(), expr_str(&n.ids));
155
+ if n.in_list {
156
+ d.insert("mode".to_string(), "in".to_string());
157
+ }
158
+ PlanDescription::with_children("NodeByIdSeek", d, opt_input(n.input))
159
+ }
160
+ PhysicalOp::RelByIdSeek(n) => {
161
+ d.insert("rel".to_string(), var_str(n.rel));
162
+ d.insert("src".to_string(), var_str(n.src));
163
+ d.insert("dst".to_string(), var_str(n.dst));
164
+ if !n.src_labels.is_empty() {
165
+ d.insert("src_labels".to_string(), label_groups_str(&n.src_labels));
166
+ }
167
+ if !n.types.is_empty() {
168
+ d.insert("types".to_string(), n.types.join("|"));
169
+ }
170
+ d.insert(
171
+ "direction".to_string(),
172
+ direction_str(n.direction).to_string(),
173
+ );
174
+ d.insert("ids".to_string(), expr_str(&n.ids));
175
+ if n.in_list {
176
+ d.insert("mode".to_string(), "in".to_string());
177
+ }
178
+ PlanDescription::with_children("RelByIdSeek", d, opt_input(n.input))
179
+ }
149
180
  PhysicalOp::NodeByPropertyScan(n) => {
150
181
  d.insert("var".to_string(), var_str(n.var));
151
182
  if !n.labels.is_empty() {