lora-python 0.15.0__tar.gz → 0.16.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 (363) hide show
  1. {lora_python-0.15.0 → lora_python-0.16.0}/Cargo.lock +22 -19
  2. {lora_python-0.15.0 → lora_python-0.16.0}/Cargo.toml +13 -13
  3. {lora_python-0.15.0 → lora_python-0.16.0}/PKG-INFO +1 -1
  4. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/analyzer/clauses.rs +93 -7
  5. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/analyzer/state.rs +64 -53
  6. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/analyzer/tests.rs +3 -4
  7. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/resolved.rs +4 -1
  8. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-builtins-meta/src/lib.rs +44 -0
  9. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-compiler/src/lib.rs +1 -1
  10. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-compiler/src/logical.rs +7 -0
  11. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-compiler/src/optimizer.rs +183 -25
  12. lora_python-0.16.0/crates/lora-compiler/src/pattern.rs +605 -0
  13. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-compiler/src/physical.rs +7 -0
  14. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-compiler/src/plan_tree.rs +3 -0
  15. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-compiler/src/planner.rs +246 -79
  16. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/README.md +17 -0
  17. lora_python-0.16.0/crates/lora-database/benches/memory_baseline.json +66 -0
  18. lora_python-0.16.0/crates/lora-database/examples/bulk_probe.rs +32 -0
  19. lora_python-0.16.0/crates/lora-database/examples/heap_probe.rs +208 -0
  20. lora_python-0.16.0/crates/lora-database/examples/keyset_probe.rs +41 -0
  21. lora_python-0.16.0/crates/lora-database/examples/optional_probe.rs +74 -0
  22. lora_python-0.16.0/crates/lora-database/examples/perf_probe.rs +270 -0
  23. lora_python-0.16.0/crates/lora-database/examples/pushdown_probe.rs +126 -0
  24. lora_python-0.16.0/crates/lora-database/src/changes/build.rs +343 -0
  25. lora_python-0.16.0/crates/lora-database/src/changes/history.rs +190 -0
  26. lora_python-0.16.0/crates/lora-database/src/changes/mod.rs +635 -0
  27. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/builder.rs +2 -0
  28. lora_python-0.16.0/crates/lora-database/src/database/changes.rs +143 -0
  29. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/compile.rs +9 -2
  30. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/execute.rs +30 -4
  31. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/explain.rs +16 -0
  32. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/mod.rs +18 -3
  33. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/occ.rs +12 -2
  34. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/procedures.rs +10 -2
  35. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/pull_mode.rs +3 -1
  36. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/replay.rs +16 -1
  37. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/schema.rs +93 -117
  38. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/stream.rs +19 -0
  39. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/write_guard.rs +95 -8
  40. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/error.rs +22 -2
  41. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/lib.rs +9 -1
  42. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/plan_cache.rs +157 -60
  43. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/snapshot/mod.rs +5 -1
  44. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/snapshot/store.rs +20 -0
  45. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/transaction.rs +122 -2
  46. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/wal/write_scope.rs +21 -6
  47. lora_python-0.16.0/crates/lora-database/tests/call_subquery_writes.rs +227 -0
  48. lora_python-0.16.0/crates/lora-database/tests/change_feed.rs +528 -0
  49. lora_python-0.16.0/crates/lora-database/tests/cypher_compat.rs +77 -0
  50. lora_python-0.16.0/crates/lora-database/tests/early_limit.rs +172 -0
  51. lora_python-0.16.0/crates/lora-database/tests/empty_ranges.rs +28 -0
  52. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/errors.rs +11 -15
  53. lora_python-0.16.0/crates/lora-database/tests/explain_estimates.rs +48 -0
  54. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/invariants.rs +4 -3
  55. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/match.rs +1 -2
  56. lora_python-0.16.0/crates/lora-database/tests/merge_bound_end.rs +80 -0
  57. lora_python-0.16.0/crates/lora-database/tests/null_properties_and_deferred_existence.rs +173 -0
  58. lora_python-0.16.0/crates/lora-database/tests/optional_match_correlated.rs +115 -0
  59. lora_python-0.16.0/crates/lora-database/tests/order_by_index.rs +116 -0
  60. lora_python-0.16.0/crates/lora-database/tests/order_limit_semantics.rs +115 -0
  61. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/paths.rs +2 -3
  62. lora_python-0.16.0/crates/lora-database/tests/planner_pushdown.rs +533 -0
  63. lora_python-0.16.0/crates/lora-database/tests/procedure_yield.rs +141 -0
  64. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/projection.rs +4 -3
  65. lora_python-0.16.0/crates/lora-database/tests/schema_in_transaction.rs +128 -0
  66. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/snapshot.rs +4 -4
  67. lora_python-0.16.0/crates/lora-database/tests/temporal_range_index.rs +231 -0
  68. lora_python-0.16.0/crates/lora-database/tests/timeouts.rs +88 -0
  69. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/transactions.rs +2 -1
  70. lora_python-0.16.0/crates/lora-database/tests/unknown_names.rs +137 -0
  71. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/update.rs +6 -3
  72. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/wal.rs +3 -2
  73. lora_python-0.16.0/crates/lora-database/tests/write_results.rs +34 -0
  74. lora_python-0.16.0/crates/lora-database/tests/write_scaling.rs +75 -0
  75. lora_python-0.16.0/crates/lora-executor/src/cancel.rs +173 -0
  76. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/binops.rs +13 -7
  77. lora_python-0.16.0/crates/lora-executor/src/eval/builtins/index_ns.rs +210 -0
  78. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/mod.rs +3 -0
  79. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/expr.rs +16 -0
  80. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/executor/helpers.rs +408 -64
  81. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/executor/immutable.rs +32 -5
  82. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/executor/mod.rs +7 -3
  83. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/executor/mutable.rs +454 -201
  84. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/executor/optional.rs +58 -5
  85. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/lib.rs +5 -2
  86. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/columns.rs +2 -2
  87. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/hydration.rs +10 -0
  88. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/mod.rs +5 -2
  89. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/mutable.rs +27 -2
  90. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/optional.rs +41 -17
  91. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/scan.rs +74 -11
  92. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/source.rs +37 -0
  93. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/tests.rs +6 -6
  94. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/traits.rs +98 -12
  95. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/value.rs +51 -8
  96. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/cypher.pest +18 -0
  97. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/parser/expressions.rs +78 -0
  98. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/parser/query.rs +12 -0
  99. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/src/columnar.rs +4 -4
  100. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/src/tests.rs +6 -8
  101. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/Cargo.toml +5 -0
  102. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/lib.rs +9 -6
  103. lora_python-0.16.0/crates/lora-store/src/memory/chunked_vec.rs +234 -0
  104. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/constraint_enforce.rs +157 -40
  105. lora_python-0.16.0/crates/lora-store/src/memory/cow.rs +585 -0
  106. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/entity_index_store.rs +61 -15
  107. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/fulltext_index.rs +158 -34
  108. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/graph.rs +104 -35
  109. lora_python-0.16.0/crates/lora-store/src/memory/id_set.rs +260 -0
  110. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/impls.rs +85 -8
  111. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/mem_report.rs +55 -39
  112. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/mod.rs +3 -0
  113. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/point_index.rs +42 -17
  114. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/property_index.rs +146 -45
  115. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/secondary_index_maintenance.rs +74 -1
  116. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/sorted_property_index.rs +145 -17
  117. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/text_index.rs +28 -10
  118. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/mutation.rs +14 -1
  119. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/traits.rs +62 -0
  120. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/graph.rs +6 -4
  121. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/mod.rs +4 -2
  122. lora_python-0.16.0/crates/lora-store/src/types/property_map.rs +492 -0
  123. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/spatial/mod.rs +1 -1
  124. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/spatial/point.rs +45 -0
  125. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/temporal/date.rs +6 -0
  126. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/temporal/datetime.rs +36 -1
  127. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/temporal/time.rs +47 -0
  128. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/codec/decode.rs +1 -1
  129. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/errors.rs +1 -1
  130. lora_python-0.16.0/crates/lora-wal/src/history.rs +148 -0
  131. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/lib.rs +2 -0
  132. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/recorder/recorder.rs +46 -12
  133. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/wal/wal.rs +15 -4
  134. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/tests/error_messages.rs +1 -1
  135. {lora_python-0.15.0 → lora_python-0.16.0}/pyproject.toml +1 -1
  136. lora_python-0.15.0/crates/lora-compiler/src/pattern.rs +0 -235
  137. lora_python-0.15.0/crates/lora-database/benches/memory_baseline.json +0 -66
  138. {lora_python-0.15.0 → lora_python-0.16.0}/LICENSE +0 -0
  139. {lora_python-0.15.0 → lora_python-0.16.0}/README.md +0 -0
  140. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/.gitignore +0 -0
  141. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/Cargo.toml +0 -0
  142. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/LICENSE +0 -0
  143. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/README.md +0 -0
  144. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/build.rs +0 -0
  145. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  146. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/examples/basic.py +0 -0
  147. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/src/errors.rs +0 -0
  148. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/src/from_python.rs +0 -0
  149. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/src/lib.rs +0 -0
  150. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/src/to_python.rs +0 -0
  151. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/tests/test_async.py +0 -0
  152. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  153. {lora_python-0.15.0 → lora_python-0.16.0}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  154. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/Cargo.toml +0 -0
  155. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
  156. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
  157. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  158. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  159. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/errors.rs +0 -0
  160. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/lib.rs +0 -0
  161. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/scope.rs +0 -0
  162. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/src/symbols.rs +0 -0
  163. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  164. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-ast/Cargo.toml +0 -0
  165. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-ast/src/ast.rs +0 -0
  166. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-ast/src/lib.rs +0 -0
  167. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-builtins-meta/Cargo.toml +0 -0
  168. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-compiler/Cargo.toml +0 -0
  169. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/Cargo.toml +0 -0
  170. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/advanced.rs +0 -0
  171. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/concurrency_guard.rs +0 -0
  172. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/concurrent.rs +0 -0
  173. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/engine.rs +0 -0
  174. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/fixtures.rs +0 -0
  175. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/index_acceleration.rs +0 -0
  176. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/memory.rs +0 -0
  177. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/perf_smoke.rs +0 -0
  178. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
  179. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/query_implementations.rs +0 -0
  180. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/realistic.rs +0 -0
  181. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/scale.rs +0 -0
  182. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/temporal_spatial.rs +0 -0
  183. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/benches/wal.rs +0 -0
  184. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/graph_api.rs +0 -0
  185. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/profile.rs +0 -0
  186. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/row_projection.rs +0 -0
  187. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/database/show_pipeline.rs +0 -0
  188. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/durable_io.rs +0 -0
  189. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/explain.rs +0 -0
  190. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/io.rs +0 -0
  191. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/live_store.rs +0 -0
  192. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/named.rs +0 -0
  193. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/snapshot/json.rs +0 -0
  194. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/stream.rs +0 -0
  195. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/wal/admin.rs +0 -0
  196. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/wal/archive/format.rs +0 -0
  197. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  198. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  199. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/wal/archive/worker.rs +0 -0
  200. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
  201. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/wal/archive.rs +0 -0
  202. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/src/wal/mod.rs +0 -0
  203. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/advanced_queries.rs +0 -0
  204. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/aggregation.rs +0 -0
  205. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/backend_stub.rs +0 -0
  206. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/binary.rs +0 -0
  207. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
  208. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/constraints.rs +0 -0
  209. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/create.rs +0 -0
  210. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/docs_examples.rs +0 -0
  211. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/error_messages.rs +0 -0
  212. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/explain_profile.rs +0 -0
  213. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/expressions.rs +0 -0
  214. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/foreach.rs +0 -0
  215. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/fulltext_index.rs +0 -0
  216. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/functions_extended.rs +0 -0
  217. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/index_acceleration.rs +0 -0
  218. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/managed_snapshots.rs +0 -0
  219. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/merge.rs +0 -0
  220. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/ordering.rs +0 -0
  221. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/parameters.rs +0 -0
  222. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/parser.rs +0 -0
  223. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/scale.rs +0 -0
  224. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/schema.rs +0 -0
  225. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/seeds.rs +0 -0
  226. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/spatial.rs +0 -0
  227. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/temporal.rs +0 -0
  228. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/test_helpers.rs +0 -0
  229. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/types_advanced.rs +0 -0
  230. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/union.rs +0 -0
  231. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
  232. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/vector_index.rs +0 -0
  233. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/vectors.rs +0 -0
  234. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/where_clause.rs +0 -0
  235. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-database/tests/with.rs +0 -0
  236. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/Cargo.toml +0 -0
  237. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/errors.rs +0 -0
  238. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
  239. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
  240. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
  241. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
  242. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
  243. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
  244. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
  245. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/list.rs +0 -0
  246. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
  247. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
  248. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
  249. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
  250. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
  251. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
  252. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
  253. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
  254. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
  255. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
  256. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
  257. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
  258. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/errors.rs +0 -0
  259. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/functions.rs +0 -0
  260. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/mod.rs +0 -0
  261. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/point.rs +0 -0
  262. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/regex.rs +0 -0
  263. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/eval/vector.rs +0 -0
  264. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/executor/aggregation.rs +0 -0
  265. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/executor/sort.rs +0 -0
  266. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/profile.rs +0 -0
  267. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/aggregate.rs +0 -0
  268. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
  269. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/context.rs +0 -0
  270. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/expand.rs +0 -0
  271. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/filter.rs +0 -0
  272. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/path.rs +0 -0
  273. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/projection.rs +0 -0
  274. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/shape.rs +0 -0
  275. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/sort.rs +0 -0
  276. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/src/pull/union.rs +0 -0
  277. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-executor/tests/error_messages.rs +0 -0
  278. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-io/Cargo.toml +0 -0
  279. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-io/src/csv.rs +0 -0
  280. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-io/src/format.rs +0 -0
  281. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-io/src/json_array.rs +0 -0
  282. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-io/src/jsonl.rs +0 -0
  283. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-io/src/lib.rs +0 -0
  284. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-io/src/mapping.rs +0 -0
  285. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-io/src/value_json.rs +0 -0
  286. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/Cargo.toml +0 -0
  287. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/errors.rs +0 -0
  288. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/lib.rs +0 -0
  289. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/parser/clauses.rs +0 -0
  290. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/parser/literals.rs +0 -0
  291. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/parser/mod.rs +0 -0
  292. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/parser/patterns.rs +0 -0
  293. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/parser/schema.rs +0 -0
  294. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/parser/tests.rs +0 -0
  295. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/src/parser/util.rs +0 -0
  296. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-parser/tests/error_messages.rs +0 -0
  297. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/Cargo.toml +0 -0
  298. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/src/body.rs +0 -0
  299. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/src/codec.rs +0 -0
  300. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/src/envelope.rs +0 -0
  301. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/src/errors.rs +0 -0
  302. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/src/format.rs +0 -0
  303. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/src/lib.rs +0 -0
  304. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/src/options.rs +0 -0
  305. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/src/transform.rs +0 -0
  306. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/src/view.rs +0 -0
  307. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  308. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/codec.rs +0 -0
  309. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/intern.rs +0 -0
  310. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/lock_table.rs +0 -0
  311. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
  312. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/hnsw.rs +0 -0
  313. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/index_catalog.rs +0 -0
  314. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/snapshot.rs +0 -0
  315. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/stats.rs +0 -0
  316. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/tests.rs +0 -0
  317. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/memory/vector_index.rs +0 -0
  318. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/snapshot.rs +0 -0
  319. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/binary/mod.rs +0 -0
  320. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/binary/tests.rs +0 -0
  321. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/binary/traits.rs +0 -0
  322. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/binary/types.rs +0 -0
  323. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/property_value.rs +0 -0
  324. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  325. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  326. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  327. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  328. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/temporal/duration.rs +0 -0
  329. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/temporal/format.rs +0 -0
  330. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  331. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  332. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/vector/build.rs +0 -0
  333. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/vector/mod.rs +0 -0
  334. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  335. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/vector/tests.rs +0 -0
  336. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/src/types/vector/types.rs +0 -0
  337. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-store/tests/error_messages.rs +0 -0
  338. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/Cargo.toml +0 -0
  339. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/codec/encode.rs +0 -0
  340. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/codec/format.rs +0 -0
  341. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/codec/mod.rs +0 -0
  342. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/codec/tests.rs +0 -0
  343. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/config.rs +0 -0
  344. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/dir.rs +0 -0
  345. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/io.rs +0 -0
  346. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/lock.rs +0 -0
  347. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/lsn.rs +0 -0
  348. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/record.rs +0 -0
  349. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/recorder/errors.rs +0 -0
  350. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  351. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/recorder/mod.rs +0 -0
  352. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/recorder/tests.rs +0 -0
  353. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/replay.rs +0 -0
  354. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/segment.rs +0 -0
  355. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/testing.rs +0 -0
  356. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
  357. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/wal/mod.rs +0 -0
  358. {lora_python-0.15.0 → lora_python-0.16.0}/crates/lora-wal/src/wal/tests.rs +0 -0
  359. {lora_python-0.15.0 → lora_python-0.16.0}/python/lora_python/__init__.py +0 -0
  360. {lora_python-0.15.0 → lora_python-0.16.0}/python/lora_python/_async.py +0 -0
  361. {lora_python-0.15.0 → lora_python-0.16.0}/python/lora_python/_native.pyi +0 -0
  362. {lora_python-0.15.0 → lora_python-0.16.0}/python/lora_python/py.typed +0 -0
  363. {lora_python-0.15.0 → lora_python-0.16.0}/python/lora_python/types.py +0 -0
@@ -773,7 +773,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
773
773
 
774
774
  [[package]]
775
775
  name = "lora-analyzer"
776
- version = "0.15.0"
776
+ version = "0.16.0"
777
777
  dependencies = [
778
778
  "lora-ast",
779
779
  "lora-builtins-meta",
@@ -784,14 +784,14 @@ dependencies = [
784
784
 
785
785
  [[package]]
786
786
  name = "lora-ast"
787
- version = "0.15.0"
787
+ version = "0.16.0"
788
788
  dependencies = [
789
789
  "smallvec 2.0.0-alpha.12",
790
790
  ]
791
791
 
792
792
  [[package]]
793
793
  name = "lora-binding-buffer"
794
- version = "0.15.0"
794
+ version = "0.16.0"
795
795
  dependencies = [
796
796
  "lora-database",
797
797
  "lora-store",
@@ -799,11 +799,11 @@ dependencies = [
799
799
 
800
800
  [[package]]
801
801
  name = "lora-builtins-meta"
802
- version = "0.15.0"
802
+ version = "0.16.0"
803
803
 
804
804
  [[package]]
805
805
  name = "lora-compiler"
806
- version = "0.15.0"
806
+ version = "0.16.0"
807
807
  dependencies = [
808
808
  "lora-analyzer",
809
809
  "lora-ast",
@@ -812,7 +812,7 @@ dependencies = [
812
812
 
813
813
  [[package]]
814
814
  name = "lora-database"
815
- version = "0.15.0"
815
+ version = "0.16.0"
816
816
  dependencies = [
817
817
  "anyhow",
818
818
  "chacha20poly1305",
@@ -837,7 +837,7 @@ dependencies = [
837
837
 
838
838
  [[package]]
839
839
  name = "lora-executor"
840
- version = "0.15.0"
840
+ version = "0.16.0"
841
841
  dependencies = [
842
842
  "blake3",
843
843
  "crc32fast",
@@ -860,7 +860,7 @@ dependencies = [
860
860
 
861
861
  [[package]]
862
862
  name = "lora-ffi"
863
- version = "0.15.0"
863
+ version = "0.16.0"
864
864
  dependencies = [
865
865
  "anyhow",
866
866
  "lora-binding-buffer",
@@ -872,7 +872,7 @@ dependencies = [
872
872
 
873
873
  [[package]]
874
874
  name = "lora-io"
875
- version = "0.15.0"
875
+ version = "0.16.0"
876
876
  dependencies = [
877
877
  "lora-executor",
878
878
  "lora-store",
@@ -883,7 +883,7 @@ dependencies = [
883
883
 
884
884
  [[package]]
885
885
  name = "lora-node"
886
- version = "0.15.0"
886
+ version = "0.16.0"
887
887
  dependencies = [
888
888
  "anyhow",
889
889
  "lora-binding-buffer",
@@ -898,7 +898,7 @@ dependencies = [
898
898
 
899
899
  [[package]]
900
900
  name = "lora-parser"
901
- version = "0.15.0"
901
+ version = "0.16.0"
902
902
  dependencies = [
903
903
  "lora-ast",
904
904
  "pest",
@@ -909,7 +909,7 @@ dependencies = [
909
909
 
910
910
  [[package]]
911
911
  name = "lora-python"
912
- version = "0.15.0"
912
+ version = "0.16.0"
913
913
  dependencies = [
914
914
  "anyhow",
915
915
  "lora-database",
@@ -921,7 +921,7 @@ dependencies = [
921
921
 
922
922
  [[package]]
923
923
  name = "lora-query-wasm"
924
- version = "0.15.0"
924
+ version = "0.16.0"
925
925
  dependencies = [
926
926
  "console_error_panic_hook",
927
927
  "js-sys",
@@ -935,7 +935,7 @@ dependencies = [
935
935
 
936
936
  [[package]]
937
937
  name = "lora-server"
938
- version = "0.15.0"
938
+ version = "0.16.0"
939
939
  dependencies = [
940
940
  "anyhow",
941
941
  "axum",
@@ -950,7 +950,7 @@ dependencies = [
950
950
 
951
951
  [[package]]
952
952
  name = "lora-snapshot"
953
- version = "0.15.0"
953
+ version = "0.16.0"
954
954
  dependencies = [
955
955
  "argon2",
956
956
  "blake3",
@@ -965,18 +965,21 @@ dependencies = [
965
965
 
966
966
  [[package]]
967
967
  name = "lora-store"
968
- version = "0.15.0"
968
+ version = "0.16.0"
969
969
  dependencies = [
970
970
  "crc32fast",
971
971
  "js-sys",
972
972
  "lora-ast",
973
973
  "serde",
974
+ "serde_json",
975
+ "smallvec 2.0.0-alpha.12",
974
976
  "thiserror",
977
+ "unicode-normalization",
975
978
  ]
976
979
 
977
980
  [[package]]
978
981
  name = "lora-wal"
979
- version = "0.15.0"
982
+ version = "0.16.0"
980
983
  dependencies = [
981
984
  "crc32fast",
982
985
  "lora-store",
@@ -986,7 +989,7 @@ dependencies = [
986
989
 
987
990
  [[package]]
988
991
  name = "lora-wasm"
989
- version = "0.15.0"
992
+ version = "0.16.0"
990
993
  dependencies = [
991
994
  "anyhow",
992
995
  "console_error_panic_hook",
@@ -1002,7 +1005,7 @@ dependencies = [
1002
1005
 
1003
1006
  [[package]]
1004
1007
  name = "lora_ruby"
1005
- version = "0.15.0"
1008
+ version = "0.16.0"
1006
1009
  dependencies = [
1007
1010
  "anyhow",
1008
1011
  "lora-database",
@@ -4,7 +4,7 @@ resolver = "2"
4
4
 
5
5
  [workspace.package]
6
6
  edition = "2021"
7
- version = "0.15.0"
7
+ version = "0.16.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.15.0" }
19
- lora-parser = { path = "crates/lora-parser", version = "=0.15.0" }
20
- lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.15.0" }
21
- lora-analyzer = { path = "crates/lora-analyzer", version = "=0.15.0" }
22
- lora-compiler = { path = "crates/lora-compiler", version = "=0.15.0" }
23
- lora-store = { path = "crates/lora-store", version = "=0.15.0" }
24
- lora-snapshot = { path = "crates/lora-snapshot", version = "=0.15.0", default-features = false }
25
- lora-io = { path = "crates/lora-io", version = "=0.15.0" }
26
- lora-wal = { path = "crates/lora-wal", version = "=0.15.0" }
27
- lora-executor = { path = "crates/lora-executor", version = "=0.15.0", default-features = false }
28
- lora-database = { path = "crates/lora-database", version = "=0.15.0" }
29
- lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.15.0" }
18
+ lora-ast = { path = "crates/lora-ast", version = "=0.16.0" }
19
+ lora-parser = { path = "crates/lora-parser", version = "=0.16.0" }
20
+ lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.16.0" }
21
+ lora-analyzer = { path = "crates/lora-analyzer", version = "=0.16.0" }
22
+ lora-compiler = { path = "crates/lora-compiler", version = "=0.16.0" }
23
+ lora-store = { path = "crates/lora-store", version = "=0.16.0" }
24
+ lora-snapshot = { path = "crates/lora-snapshot", version = "=0.16.0", default-features = false }
25
+ lora-io = { path = "crates/lora-io", version = "=0.16.0" }
26
+ lora-wal = { path = "crates/lora-wal", version = "=0.16.0" }
27
+ lora-executor = { path = "crates/lora-executor", version = "=0.16.0", default-features = false }
28
+ lora-database = { path = "crates/lora-database", version = "=0.16.0" }
29
+ lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.16.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.15.0
3
+ Version: 0.16.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -3,7 +3,7 @@ use super::state::{Analyzer, PatternContext};
3
3
  use crate::{errors::*, resolved::*, symbols::*};
4
4
  use lora_ast::{
5
5
  Create, Delete, Expr, Foreach, InQueryCall, Match, Merge, ProjectionBody, ProjectionItem,
6
- Remove, RemoveItem, Return, Set, SetItem, Unwind, UpdatingClause, With,
6
+ Remove, RemoveItem, Return, Set, SetItem, Unwind, UpdatingClause, Variable, With,
7
7
  };
8
8
  use lora_store::GraphCatalog;
9
9
  use std::collections::{BTreeMap, BTreeSet};
@@ -63,13 +63,99 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
63
63
  Ok(ResolvedUnwind { expr, alias })
64
64
  }
65
65
 
66
+ /// `CALL proc(args) YIELD f [AS a], ... [WHERE cond]` as a clause.
67
+ ///
68
+ /// Supported procedures are the index queries. The call is rewritten
69
+ /// into clauses the rest of the pipeline already runs:
70
+ ///
71
+ /// ```text
72
+ /// UNWIND index.<op>(args) AS <hit>
73
+ /// WITH *, <hit>.f AS a, ... [WHERE cond]
74
+ /// ```
75
+ ///
76
+ /// so each hit becomes a row whose yielded variables are ordinary
77
+ /// bindings: a yielded `node` is a bound node that later `MATCH`
78
+ /// patterns expand from, and `score` is a number.
66
79
  pub(super) fn analyze_in_query_call(
67
80
  &mut self,
68
- _call: &InQueryCall,
69
- ) -> Result<ResolvedClause, SemanticError> {
70
- Err(SemanticError::UnsupportedFeature(
71
- "CALL ... YIELD is not yet supported by the analyzer".into(),
72
- ))
81
+ call: &InQueryCall,
82
+ ) -> Result<Vec<ResolvedClause>, SemanticError> {
83
+ let span = call.span;
84
+ let qualified = call.procedure.name.parts.join(".");
85
+ let (function, entity_field) = match qualified.to_ascii_lowercase().as_str() {
86
+ "db.index.fulltext.querynodes" => ("fulltext_nodes", "node"),
87
+ "db.index.fulltext.queryrelationships" => ("fulltext_relationships", "relationship"),
88
+ "db.index.vector.querynodes" => ("vector_nodes", "node"),
89
+ "db.index.vector.queryrelationships" => ("vector_relationships", "relationship"),
90
+ _ => {
91
+ return Err(SemanticError::UnsupportedFeature(format!(
92
+ "unknown procedure `{qualified}` (supported in CALL ... YIELD: \
93
+ db.index.fulltext.queryNodes, db.index.fulltext.queryRelationships, \
94
+ db.index.vector.queryNodes, db.index.vector.queryRelationships)"
95
+ )))
96
+ }
97
+ };
98
+ if call.yield_items.is_empty() {
99
+ return Err(SemanticError::UnsupportedFeature(format!(
100
+ "CALL {qualified}(...) inside a query needs YIELD (fields: {entity_field}, score)"
101
+ )));
102
+ }
103
+
104
+ // Unique per call site so two CALLs in one query don't collide.
105
+ let hit_name = format!("__call_hit_{}", span.start);
106
+ let hit = Variable {
107
+ name: hit_name,
108
+ span,
109
+ };
110
+ let unwind = Unwind {
111
+ expr: Expr::FunctionCall {
112
+ name: vec!["index".to_string(), function.to_string()],
113
+ distinct: false,
114
+ args: call.procedure.args.clone(),
115
+ span,
116
+ },
117
+ alias: hit.clone(),
118
+ span,
119
+ };
120
+
121
+ let mut items = vec![ProjectionItem::Star { span }];
122
+ for item in &call.yield_items {
123
+ let field = item
124
+ .field
125
+ .clone()
126
+ .unwrap_or_else(|| item.alias.name.clone());
127
+ if field != entity_field && field != "score" {
128
+ return Err(SemanticError::UnsupportedFeature(format!(
129
+ "{qualified} yields `{entity_field}` and `score`, not `{field}`"
130
+ )));
131
+ }
132
+ items.push(ProjectionItem::Expr {
133
+ expr: Expr::Property {
134
+ expr: Box::new(Expr::Variable(hit.clone())),
135
+ key: field,
136
+ span: item.span,
137
+ },
138
+ alias: Some(item.alias.clone()),
139
+ span: item.span,
140
+ });
141
+ }
142
+ let with = With {
143
+ body: ProjectionBody {
144
+ distinct: false,
145
+ items,
146
+ order: Vec::new(),
147
+ skip: None,
148
+ limit: None,
149
+ span,
150
+ },
151
+ where_: call.where_.clone(),
152
+ span,
153
+ };
154
+
155
+ Ok(vec![
156
+ ResolvedClause::Unwind(self.analyze_unwind(&unwind)?),
157
+ ResolvedClause::With(self.analyze_with(&with)?),
158
+ ])
73
159
  }
74
160
 
75
161
  pub(super) fn analyze_create(&mut self, c: &Create) -> Result<ResolvedCreate, SemanticError> {
@@ -308,7 +394,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
308
394
  items.push(ResolvedProjection {
309
395
  expr: resolved,
310
396
  output,
311
- name,
397
+ name: name.into(),
312
398
  explicit_alias: explicit,
313
399
  span: *span,
314
400
  });
@@ -7,7 +7,11 @@ use lora_store::GraphCatalog;
7
7
  use std::collections::{BTreeMap, BTreeSet};
8
8
 
9
9
  pub struct Analyzer<'a, S: GraphCatalog + ?Sized> {
10
- pub(super) storage: &'a S,
10
+ /// Analysis deliberately does not read the stored data: whether a
11
+ /// query is valid must not depend on which labels, types or keys
12
+ /// happen to exist right now. The catalog type stays in the signature
13
+ /// so callers keep constructing the analyzer against their store.
14
+ pub(super) _catalog: std::marker::PhantomData<&'a S>,
11
15
  pub(super) scopes: ScopeStack,
12
16
  pub(super) symbols: SymbolTable,
13
17
  /// Variables whose runtime value shape isn't tracked by the analyzer
@@ -27,9 +31,9 @@ pub(super) enum PatternContext {
27
31
  }
28
32
 
29
33
  impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
30
- pub fn new(storage: &'a S) -> Self {
34
+ pub fn new(_storage: &'a S) -> Self {
31
35
  Self {
32
- storage,
36
+ _catalog: std::marker::PhantomData,
33
37
  scopes: ScopeStack::new(),
34
38
  symbols: SymbolTable::default(),
35
39
  dynamic_property_vars: BTreeSet::new(),
@@ -131,7 +135,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
131
135
  let mut clauses = Vec::new();
132
136
 
133
137
  for rc in &part.reading_clauses {
134
- clauses.push(self.analyze_reading_clause(rc)?);
138
+ clauses.extend(self.analyze_reading_clause(rc)?);
135
139
  }
136
140
 
137
141
  for uc in &part.updating_clauses {
@@ -149,7 +153,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
149
153
  let mut clauses = Vec::new();
150
154
 
151
155
  for rc in &q.reading_clauses {
152
- clauses.push(self.analyze_reading_clause(rc)?);
156
+ clauses.extend(self.analyze_reading_clause(rc)?);
153
157
  }
154
158
 
155
159
  for uc in &q.updating_clauses {
@@ -158,6 +162,19 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
158
162
 
159
163
  if let Some(ret) = &q.return_clause {
160
164
  clauses.push(ResolvedClause::Return(self.analyze_return(ret)?));
165
+ } else if q.updating_clauses.is_empty() {
166
+ // The parser only lets a query end in a reading clause when it
167
+ // is a `CALL { ... }`; it must be a unit subquery.
168
+ match clauses.last() {
169
+ Some(ResolvedClause::CallSubquery(call)) if call.return_vars.is_empty() => {}
170
+ _ => {
171
+ return Err(SemanticError::UnsupportedFeature(
172
+ "a query can only end in CALL { ... } when the subquery ends in an \
173
+ updating clause; add a RETURN"
174
+ .into(),
175
+ ))
176
+ }
177
+ }
161
178
  }
162
179
 
163
180
  Ok(clauses)
@@ -166,15 +183,15 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
166
183
  fn analyze_reading_clause(
167
184
  &mut self,
168
185
  rc: &ReadingClause,
169
- ) -> Result<ResolvedClause, SemanticError> {
170
- match rc {
171
- ReadingClause::Match(m) => Ok(ResolvedClause::Match(self.analyze_match(m)?)),
172
- ReadingClause::Unwind(u) => Ok(ResolvedClause::Unwind(self.analyze_unwind(u)?)),
173
- ReadingClause::InQueryCall(c) => self.analyze_in_query_call(c),
186
+ ) -> Result<Vec<ResolvedClause>, SemanticError> {
187
+ Ok(match rc {
188
+ ReadingClause::Match(m) => vec![ResolvedClause::Match(self.analyze_match(m)?)],
189
+ ReadingClause::Unwind(u) => vec![ResolvedClause::Unwind(self.analyze_unwind(u)?)],
190
+ ReadingClause::InQueryCall(c) => self.analyze_in_query_call(c)?,
174
191
  ReadingClause::CallSubquery(c) => {
175
- Ok(ResolvedClause::CallSubquery(self.analyze_call_subquery(c)?))
192
+ vec![ResolvedClause::CallSubquery(self.analyze_call_subquery(c)?)]
176
193
  }
177
- }
194
+ })
178
195
  }
179
196
 
180
197
  /// Analyze a CALL { ... } subquery. The inner body is analyzed
@@ -200,11 +217,23 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
200
217
  Some(ResolvedClause::Return(ret)) => ret
201
218
  .items
202
219
  .iter()
203
- .map(|p| (p.name.clone(), p.output))
220
+ .map(|p| (p.name.to_string(), p.output))
204
221
  .collect(),
222
+ // A unit subquery: its body ends in an update and returns
223
+ // nothing. It runs once per outer row for its side effects and
224
+ // leaves the outer rows (and scope) unchanged.
225
+ Some(
226
+ ResolvedClause::Create(_)
227
+ | ResolvedClause::Merge(_)
228
+ | ResolvedClause::Delete(_)
229
+ | ResolvedClause::Set(_)
230
+ | ResolvedClause::Remove(_)
231
+ | ResolvedClause::Foreach(_),
232
+ ) => Vec::new(),
233
+ Some(ResolvedClause::CallSubquery(inner)) if inner.return_vars.is_empty() => Vec::new(),
205
234
  _ => {
206
235
  return Err(SemanticError::UnsupportedFeature(
207
- "CALL { ... } subquery must end with RETURN".into(),
236
+ "CALL { ... } subquery must end with RETURN or an updating clause".into(),
208
237
  ));
209
238
  }
210
239
  };
@@ -274,38 +303,28 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
274
303
  }
275
304
  }
276
305
 
306
+ /// Label names are never rejected. Standard Cypher treats a label no
307
+ /// node carries as an empty match, not an error, and checking against
308
+ /// the stored data made the *kind* of answer depend on what happens to
309
+ /// exist right now: the same query errored after the last `:Comment`
310
+ /// was deleted, but not on an empty database. A pattern with an unknown
311
+ /// label simply matches nothing.
277
312
  pub(super) fn validate_label_name(
278
313
  &self,
279
- label: &str,
280
- context: PatternContext,
314
+ _label: &str,
315
+ _context: PatternContext,
281
316
  ) -> Result<(), SemanticError> {
282
- if matches!(
283
- context,
284
- PatternContext::Write | PatternContext::OptionalRead
285
- ) || self.storage.has_label_name(label)
286
- || self.storage.node_count() == 0
287
- {
288
- Ok(())
289
- } else {
290
- Err(SemanticError::UnknownLabel(label.to_string()))
291
- }
317
+ Ok(())
292
318
  }
293
319
 
320
+ /// Relationship types follow the same rule as labels: an unknown type
321
+ /// matches nothing.
294
322
  pub(super) fn validate_relationship_type_name(
295
323
  &self,
296
- rel_type: &str,
297
- context: PatternContext,
324
+ _rel_type: &str,
325
+ _context: PatternContext,
298
326
  ) -> Result<(), SemanticError> {
299
- if matches!(
300
- context,
301
- PatternContext::Write | PatternContext::OptionalRead
302
- ) || self.storage.has_relationship_type_name(rel_type)
303
- || self.storage.relationship_count() == 0
304
- {
305
- Ok(())
306
- } else {
307
- Err(SemanticError::UnknownRelationshipType(rel_type.to_string()))
308
- }
327
+ Ok(())
309
328
  }
310
329
 
311
330
  /// Analyze an expression that is the target of a SET operation.
@@ -329,20 +348,12 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
329
348
  }
330
349
  }
331
350
 
332
- pub(super) fn property_access_allowed(&self, base: &ResolvedExpr, key: &str) -> bool {
333
- match base {
334
- // Map literals and query parameters carry their own keys —
335
- // there's nothing in the graph catalog to check against.
336
- ResolvedExpr::Map(_) | ResolvedExpr::Parameter(_) => true,
337
- // Variables whose value shape isn't tracked (UNWIND-bound
338
- // row elements, etc.) — the catalog can't speak to keys on
339
- // values that come from `$params` at execution time.
340
- ResolvedExpr::Variable(id) if self.dynamic_property_vars.contains(id) => true,
341
- _ => {
342
- self.storage.has_property_key(key)
343
- || (self.storage.node_count() == 0 && self.storage.relationship_count() == 0)
344
- }
345
- }
351
+ /// Property access is always allowed: reading a key no entity carries
352
+ /// yields `null` (standard Cypher), including a key written earlier in
353
+ /// the same statement. Checking the stored catalog made the query's
354
+ /// validity depend on the data.
355
+ pub(super) fn property_access_allowed(&self, _base: &ResolvedExpr, _key: &str) -> bool {
356
+ true
346
357
  }
347
358
 
348
359
  pub(super) fn visible_bindings(&self) -> BTreeMap<String, VarId> {
@@ -364,7 +375,7 @@ fn return_column_info(clauses: &[ResolvedClause]) -> Option<Vec<(String, bool)>>
364
375
  return Some(
365
376
  ret.items
366
377
  .iter()
367
- .map(|p| (p.name.clone(), p.explicit_alias))
378
+ .map(|p| (p.name.to_string(), p.explicit_alias))
368
379
  .collect(),
369
380
  );
370
381
  }
@@ -23,12 +23,11 @@ fn create_allows_new_relationship_type_when_graph_is_not_empty() {
23
23
  let mut analyzer = Analyzer::new(&graph);
24
24
  assert!(analyzer.analyze(&doc).is_ok());
25
25
 
26
+ // A type no relationship carries yet is not an error: it matches
27
+ // nothing (standard Cypher), independent of the stored data.
26
28
  let match_doc = parse_query("MATCH (a)-[:KNOWS]->(b) RETURN a, b").unwrap();
27
29
  let mut analyzer = Analyzer::new(&graph);
28
- assert!(matches!(
29
- analyzer.analyze(&match_doc),
30
- Err(SemanticError::UnknownRelationshipType(rel_type)) if rel_type == "KNOWS"
31
- ));
30
+ assert!(analyzer.analyze(&match_doc).is_ok());
32
31
  }
33
32
 
34
33
  #[test]
@@ -161,7 +161,10 @@ pub struct ResolvedWith {
161
161
  pub struct ResolvedProjection {
162
162
  pub expr: ResolvedExpr,
163
163
  pub output: VarId,
164
- pub name: String,
164
+ /// Output column name. `Arc<str>` because executors stamp it onto
165
+ /// every produced row; cloning it per row is a refcount bump rather
166
+ /// than a heap allocation per cell.
167
+ pub name: std::sync::Arc<str>,
165
168
  /// True when the name came from an explicit `AS` alias.
166
169
  pub explicit_alias: bool,
167
170
  pub span: Span,
@@ -424,6 +424,11 @@ pub const BUILTIN_SPECS: &[BuiltinSpec] = &[
424
424
  spec("json.path", 2, Some(2)),
425
425
  // -- geo.* --------------------------------------------------------------
426
426
  spec("geo.distance", 2, Some(2)),
427
+ // -- index.* (backs in-query `CALL db.index.* YIELD ...`) --------------
428
+ spec("index.fulltext_nodes", 2, Some(3)),
429
+ spec("index.fulltext_relationships", 2, Some(3)),
430
+ spec("index.vector_nodes", 3, Some(4)),
431
+ spec("index.vector_relationships", 3, Some(4)),
427
432
  spec("geo.within_bbox", 3, Some(3)),
428
433
  spec("geo.point", 1, Some(1)),
429
434
  // -- vector.* -----------------------------------------------------------
@@ -522,6 +527,45 @@ pub const BUILTIN_ALIASES: &[BuiltinAlias] = &[
522
527
  alias("tofloatornull", "cast.try"),
523
528
  alias("tobooleanornull", "cast.try"),
524
529
  alias("tostringornull", "cast.try"),
530
+ // Standard Cypher scalar names, so queries written from memory (by
531
+ // people or LLMs) work unchanged. Lookup is case-insensitive, so
532
+ // `startNode` resolves through `startnode`.
533
+ alias("split", "string.split"),
534
+ alias("trim", "string.trim"),
535
+ alias("ltrim", "string.trim_left"),
536
+ alias("rtrim", "string.trim_right"),
537
+ alias("replace", "string.replace"),
538
+ alias("normalize", "string.normalize"),
539
+ alias("char_length", "string.length"),
540
+ alias("character_length", "string.length"),
541
+ alias("point.distance", "geo.distance"),
542
+ alias("distance", "geo.distance"),
543
+ alias("abs", "math.abs"),
544
+ alias("ceil", "math.ceil"),
545
+ alias("floor", "math.floor"),
546
+ alias("round", "math.round"),
547
+ alias("sqrt", "math.sqrt"),
548
+ alias("sign", "math.sign"),
549
+ alias("log", "math.ln"),
550
+ alias("log10", "math.log10"),
551
+ alias("exp", "math.exp"),
552
+ alias("sin", "math.sin"),
553
+ alias("cos", "math.cos"),
554
+ alias("tan", "math.tan"),
555
+ alias("cot", "math.cot"),
556
+ alias("asin", "math.asin"),
557
+ alias("acos", "math.acos"),
558
+ alias("atan", "math.atan"),
559
+ alias("atan2", "math.atan2"),
560
+ alias("degrees", "math.degrees"),
561
+ alias("radians", "math.radians"),
562
+ alias("pi", "math.pi"),
563
+ alias("e", "math.e"),
564
+ alias("tail", "list.rest"),
565
+ alias("nodes", "path.nodes"),
566
+ alias("relationships", "path.edges"),
567
+ alias("startnode", "edge.start"),
568
+ alias("endnode", "edge.end"),
525
569
  ];
526
570
 
527
571
  pub fn builtin_spec(name: &str) -> Option<&'static BuiltinSpec> {
@@ -71,7 +71,7 @@ impl Compiler {
71
71
  }
72
72
 
73
73
  fn compile_physical(query: &ResolvedQuery, stats: &GraphStats) -> PhysicalPlan {
74
- let mut planner = Planner::new();
74
+ let mut planner = Planner::with_stats(stats);
75
75
  let logical = planner.plan(query);
76
76
 
77
77
  let mut optimizer = Optimizer::new();
@@ -112,6 +112,9 @@ pub struct NodeByPropertyScan {
112
112
  pub labels: Vec<Vec<String>>,
113
113
  pub key: String,
114
114
  pub value: ResolvedExpr,
115
+ /// `false`: seek `key = value`. `true`: `value` evaluates to a list and
116
+ /// the scan seeks `key IN value`, one lookup per distinct element.
117
+ pub in_list: bool,
115
118
  }
116
119
 
117
120
  /// Range-bounded property scan rewritten from `Filter(NodeScan, var.prop CMP value)`
@@ -128,6 +131,10 @@ pub struct NodeByPropertyRangeScan {
128
131
  pub lo_inclusive: bool,
129
132
  pub hi: Option<ResolvedExpr>,
130
133
  pub hi_inclusive: bool,
134
+ /// Set when the optimizer replaced an `ORDER BY var.key` above this
135
+ /// scan: rows must come out in that order (from the index when it can
136
+ /// supply it, otherwise sorted by the operator itself).
137
+ pub order: Option<lora_ast::SortDirection>,
131
138
  }
132
139
 
133
140
  /// Trigram-backed property scan rewritten from `Filter(NodeScan, var.prop OP "literal")`