lora-python 0.26.1__tar.gz → 0.26.3__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 (432) hide show
  1. {lora_python-0.26.1 → lora_python-0.26.3}/Cargo.lock +19 -19
  2. {lora_python-0.26.1 → lora_python-0.26.3}/Cargo.toml +13 -13
  3. {lora_python-0.26.1 → lora_python-0.26.3}/PKG-INFO +1 -1
  4. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/lib.rs +5 -5
  5. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/logical.rs +16 -0
  6. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/optimizer.rs +105 -84
  7. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/physical.rs +4 -0
  8. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/plan_tree.rs +46 -40
  9. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/builtin_namespaces.rs +14 -0
  10. lora_python-0.26.3/crates/lora-database/tests/range_scan_bound_intersection.rs +183 -0
  11. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/list.rs +11 -0
  12. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/helpers.rs +99 -33
  13. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/mod.rs +1 -1
  14. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/scan.rs +9 -12
  15. {lora_python-0.26.1 → lora_python-0.26.3}/pyproject.toml +1 -1
  16. {lora_python-0.26.1 → lora_python-0.26.3}/LICENSE +0 -0
  17. {lora_python-0.26.1 → lora_python-0.26.3}/README.md +0 -0
  18. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-binding-buffer/Cargo.toml +0 -0
  19. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-binding-buffer/src/lib.rs +0 -0
  20. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-binding-buffer/src/stream.rs +0 -0
  21. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/.gitignore +0 -0
  22. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/Cargo.toml +0 -0
  23. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/LICENSE +0 -0
  24. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/README.md +0 -0
  25. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/build.rs +0 -0
  26. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  27. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/examples/basic.py +0 -0
  28. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/errors.rs +0 -0
  29. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/from_python.rs +0 -0
  30. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/gil.rs +0 -0
  31. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/lib.rs +0 -0
  32. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/stream.rs +0 -0
  33. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/to_python.rs +0 -0
  34. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/tests/test_async.py +0 -0
  35. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/tests/test_concurrency.py +0 -0
  36. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  37. {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  38. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/Cargo.toml +0 -0
  39. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
  40. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
  41. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
  42. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  43. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  44. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
  45. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
  46. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/errors.rs +0 -0
  47. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/lib.rs +0 -0
  48. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/resolved.rs +0 -0
  49. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/scope.rs +0 -0
  50. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/symbols.rs +0 -0
  51. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  52. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-ast/Cargo.toml +0 -0
  53. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-ast/src/ast.rs +0 -0
  54. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-ast/src/lib.rs +0 -0
  55. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-builtins-meta/Cargo.toml +0 -0
  56. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-builtins-meta/src/lib.rs +0 -0
  57. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/Cargo.toml +0 -0
  58. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/pattern.rs +0 -0
  59. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/planner.rs +0 -0
  60. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/Cargo.toml +0 -0
  61. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/README.md +0 -0
  62. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/advanced.rs +0 -0
  63. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/concurrency_guard.rs +0 -0
  64. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/concurrent.rs +0 -0
  65. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/engine.rs +0 -0
  66. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/fixtures.rs +0 -0
  67. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/index_acceleration.rs +0 -0
  68. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/memory.rs +0 -0
  69. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/memory_baseline.json +0 -0
  70. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/perf_smoke.rs +0 -0
  71. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
  72. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/query_implementations.rs +0 -0
  73. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/realistic.rs +0 -0
  74. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/scale.rs +0 -0
  75. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/temporal_spatial.rs +0 -0
  76. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/wal.rs +0 -0
  77. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/bulk_probe.rs +0 -0
  78. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/carried_probe.rs +0 -0
  79. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/heap_probe.rs +0 -0
  80. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/keyset_probe.rs +0 -0
  81. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/optional_probe.rs +0 -0
  82. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/perf_probe.rs +0 -0
  83. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/pushdown_probe.rs +0 -0
  84. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/storage_baseline.rs +0 -0
  85. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/changes/build.rs +0 -0
  86. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/changes/history.rs +0 -0
  87. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/changes/mod.rs +0 -0
  88. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/builder.rs +0 -0
  89. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/changes.rs +0 -0
  90. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/compile.rs +0 -0
  91. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/execute.rs +0 -0
  92. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/explain.rs +0 -0
  93. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/graph_api.rs +0 -0
  94. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/mod.rs +0 -0
  95. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/occ.rs +0 -0
  96. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/procedures.rs +0 -0
  97. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/profile.rs +0 -0
  98. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/pull_mode.rs +0 -0
  99. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/replay.rs +0 -0
  100. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/row_projection.rs +0 -0
  101. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/schema.rs +0 -0
  102. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/show_pipeline.rs +0 -0
  103. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/stream.rs +0 -0
  104. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/write_guard.rs +0 -0
  105. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/durable_io.rs +0 -0
  106. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/error.rs +0 -0
  107. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/explain.rs +0 -0
  108. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/io.rs +0 -0
  109. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/lib.rs +0 -0
  110. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/live_store.rs +0 -0
  111. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/named.rs +0 -0
  112. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/plan_cache.rs +0 -0
  113. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/snapshot/json.rs +0 -0
  114. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/snapshot/mod.rs +0 -0
  115. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/snapshot/store.rs +0 -0
  116. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/stream.rs +0 -0
  117. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/transaction.rs +0 -0
  118. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/admin.rs +0 -0
  119. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive/format.rs +0 -0
  120. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  121. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  122. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive/worker.rs +0 -0
  123. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
  124. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive.rs +0 -0
  125. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/mod.rs +0 -0
  126. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/write_scope.rs +0 -0
  127. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/advanced_queries.rs +0 -0
  128. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/aggregate_semantics.rs +0 -0
  129. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/aggregation.rs +0 -0
  130. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/and_or_short_circuit.rs +0 -0
  131. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/backend_stub.rs +0 -0
  132. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/bbox_antimeridian.rs +0 -0
  133. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/binary.rs +0 -0
  134. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/bit_shifts.rs +0 -0
  135. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/borrowed_variable_reads.rs +0 -0
  136. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/call_subquery_writes.rs +0 -0
  137. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/carried_value_sharing.rs +0 -0
  138. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/change_feed.rs +0 -0
  139. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/collect_nulls.rs +0 -0
  140. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/comparison_ordering.rs +0 -0
  141. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/constraints.rs +0 -0
  142. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/create.rs +0 -0
  143. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/cypher_compat.rs +0 -0
  144. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/deferred_existence_end_state.rs +0 -0
  145. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/docs_examples.rs +0 -0
  146. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/early_limit.rs +0 -0
  147. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/empty_ranges.rs +0 -0
  148. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/entity_property_values.rs +0 -0
  149. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/error_messages.rs +0 -0
  150. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/errors.rs +0 -0
  151. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/explain_estimates.rs +0 -0
  152. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/explain_profile.rs +0 -0
  153. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/expression_semantics.rs +0 -0
  154. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/expressions.rs +0 -0
  155. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/foreach.rs +0 -0
  156. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/fulltext_index.rs +0 -0
  157. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/fulltext_list_properties.rs +0 -0
  158. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/functions_extended.rs +0 -0
  159. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/grouping_key_identity.rs +0 -0
  160. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/id_seek.rs +0 -0
  161. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/index_acceleration.rs +0 -0
  162. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/integer_literals.rs +0 -0
  163. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/invariants.rs +0 -0
  164. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/limit_skip_counts.rs +0 -0
  165. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/managed_snapshots.rs +0 -0
  166. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/match.rs +0 -0
  167. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/merge.rs +0 -0
  168. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/merge_bound_end.rs +0 -0
  169. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/missing_parameters.rs +0 -0
  170. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/nested_aggregates.rs +0 -0
  171. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/null_pattern_variables.rs +0 -0
  172. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/null_properties_and_deferred_existence.rs +0 -0
  173. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/optional_match_correlated.rs +0 -0
  174. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/optional_match_leading.rs +0 -0
  175. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/order_by_aggregates.rs +0 -0
  176. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/order_by_grouping_key_parts.rs +0 -0
  177. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/order_by_index.rs +0 -0
  178. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/order_limit_semantics.rs +0 -0
  179. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/ordering.rs +0 -0
  180. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/parameters.rs +0 -0
  181. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/parser.rs +0 -0
  182. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/paths.rs +0 -0
  183. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/pattern_subquery_property_seek.rs +0 -0
  184. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/pattern_subquery_rel_properties.rs +0 -0
  185. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/pattern_subquery_scope.rs +0 -0
  186. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/pattern_subquery_var_length.rs +0 -0
  187. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/pattern_subquery_where_seek.rs +0 -0
  188. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/planner_pushdown.rs +0 -0
  189. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/planner_stats.rs +0 -0
  190. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/procedure_yield.rs +0 -0
  191. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/projection.rs +0 -0
  192. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/range_scan_other_kinds.rs +0 -0
  193. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/restart_index_state.rs +0 -0
  194. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/scale.rs +0 -0
  195. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/schema.rs +0 -0
  196. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/schema_in_transaction.rs +0 -0
  197. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/seeds.rs +0 -0
  198. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/shared_index_value_writes.rs +0 -0
  199. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/snapshot.rs +0 -0
  200. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/sort_limit_probe.rs +0 -0
  201. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/spatial.rs +0 -0
  202. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/starts_with_range_seek.rs +0 -0
  203. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/statement_atomicity.rs +0 -0
  204. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/streaming_scans.rs +0 -0
  205. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/string_number_addition.rs +0 -0
  206. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/sum_empty.rs +0 -0
  207. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal.rs +0 -0
  208. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_constructor_functions.rs +0 -0
  209. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_constructors.rs +0 -0
  210. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_map_components.rs +0 -0
  211. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_range_index.rs +0 -0
  212. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_strings.rs +0 -0
  213. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_time_zones.rs +0 -0
  214. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_zone_accessors.rs +0 -0
  215. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/test_helpers.rs +0 -0
  216. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/timeouts.rs +0 -0
  217. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/transactions.rs +0 -0
  218. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/types_advanced.rs +0 -0
  219. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/union.rs +0 -0
  220. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/unknown_names.rs +0 -0
  221. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
  222. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/update.rs +0 -0
  223. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/var_length_bound_endpoint.rs +0 -0
  224. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/var_length_hop_ranges.rs +0 -0
  225. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/vector_index.rs +0 -0
  226. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/vectors.rs +0 -0
  227. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/wal.rs +0 -0
  228. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/where_clause.rs +0 -0
  229. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/with.rs +0 -0
  230. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/with_predicates.rs +0 -0
  231. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/write_path_bindings.rs +0 -0
  232. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/write_results.rs +0 -0
  233. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/write_scaling.rs +0 -0
  234. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/Cargo.toml +0 -0
  235. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/cancel.rs +0 -0
  236. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/errors.rs +0 -0
  237. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/binops.rs +0 -0
  238. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
  239. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
  240. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
  241. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
  242. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
  243. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
  244. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/index_ns.rs +0 -0
  245. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
  246. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
  247. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
  248. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
  249. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
  250. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
  251. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
  252. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
  253. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
  254. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/temporal_build.rs +0 -0
  255. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
  256. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
  257. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
  258. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
  259. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
  260. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/errors.rs +0 -0
  261. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/expr.rs +0 -0
  262. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/functions.rs +0 -0
  263. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/mod.rs +0 -0
  264. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/point.rs +0 -0
  265. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/regex.rs +0 -0
  266. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/vector.rs +0 -0
  267. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/aggregation.rs +0 -0
  268. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/immutable.rs +0 -0
  269. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/mutable.rs +0 -0
  270. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/optional.rs +0 -0
  271. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/sort.rs +0 -0
  272. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/lib.rs +0 -0
  273. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/profile.rs +0 -0
  274. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/aggregate.rs +0 -0
  275. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
  276. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/columns.rs +0 -0
  277. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/context.rs +0 -0
  278. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/expand.rs +0 -0
  279. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/filter.rs +0 -0
  280. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/hydration.rs +0 -0
  281. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/mod.rs +0 -0
  282. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/mutable.rs +0 -0
  283. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/optional.rs +0 -0
  284. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/path.rs +0 -0
  285. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/projection.rs +0 -0
  286. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/shape.rs +0 -0
  287. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/sort.rs +0 -0
  288. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/source.rs +0 -0
  289. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/tests.rs +0 -0
  290. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/traits.rs +0 -0
  291. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/union.rs +0 -0
  292. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/value.rs +0 -0
  293. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/tests/error_messages.rs +0 -0
  294. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/Cargo.toml +0 -0
  295. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/csv.rs +0 -0
  296. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/format.rs +0 -0
  297. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/json_array.rs +0 -0
  298. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/jsonl.rs +0 -0
  299. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/lib.rs +0 -0
  300. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/mapping.rs +0 -0
  301. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/value_json.rs +0 -0
  302. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/Cargo.toml +0 -0
  303. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/cypher.pest +0 -0
  304. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/errors.rs +0 -0
  305. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/lib.rs +0 -0
  306. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/clauses.rs +0 -0
  307. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/expressions.rs +0 -0
  308. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/literals.rs +0 -0
  309. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/mod.rs +0 -0
  310. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/patterns.rs +0 -0
  311. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/query.rs +0 -0
  312. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/schema.rs +0 -0
  313. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/tests.rs +0 -0
  314. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/util.rs +0 -0
  315. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/tests/error_messages.rs +0 -0
  316. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/Cargo.toml +0 -0
  317. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/body.rs +0 -0
  318. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/codec.rs +0 -0
  319. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/columnar.rs +0 -0
  320. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/envelope.rs +0 -0
  321. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/errors.rs +0 -0
  322. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/format.rs +0 -0
  323. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/lib.rs +0 -0
  324. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/options.rs +0 -0
  325. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/tests.rs +0 -0
  326. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/transform.rs +0 -0
  327. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/view.rs +0 -0
  328. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  329. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/Cargo.toml +0 -0
  330. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/codec.rs +0 -0
  331. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/dict.rs +0 -0
  332. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/encoded.rs +0 -0
  333. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/intern.rs +0 -0
  334. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/lib.rs +0 -0
  335. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/lock_table.rs +0 -0
  336. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/adjacency.rs +0 -0
  337. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/chunked_vec.rs +0 -0
  338. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
  339. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/constraint_enforce.rs +0 -0
  340. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/cow.rs +0 -0
  341. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/distinct_stats.rs +0 -0
  342. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/entity_index_store.rs +0 -0
  343. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/fulltext_index.rs +0 -0
  344. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/graph.rs +0 -0
  345. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/hnsw.rs +0 -0
  346. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/id_bitmap.rs +0 -0
  347. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/id_map.rs +0 -0
  348. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/id_set.rs +0 -0
  349. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/impls.rs +0 -0
  350. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/index_catalog.rs +0 -0
  351. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/mem_report.rs +0 -0
  352. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/mod.rs +0 -0
  353. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/model_tests.rs +0 -0
  354. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/point_index.rs +0 -0
  355. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/property_index.rs +0 -0
  356. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/record_slab.rs +0 -0
  357. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
  358. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/snapshot.rs +0 -0
  359. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/sorted_property_index.rs +0 -0
  360. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/stats.rs +0 -0
  361. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/test_util.rs +0 -0
  362. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/tests.rs +0 -0
  363. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/text_index.rs +0 -0
  364. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/vector_index.rs +0 -0
  365. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/mutation.rs +0 -0
  366. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/snapshot.rs +0 -0
  367. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/traits.rs +0 -0
  368. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/binary/mod.rs +0 -0
  369. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/binary/tests.rs +0 -0
  370. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/binary/traits.rs +0 -0
  371. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/binary/types.rs +0 -0
  372. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/graph.rs +0 -0
  373. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/mod.rs +0 -0
  374. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/name.rs +0 -0
  375. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/property_map.rs +0 -0
  376. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/property_value.rs +0 -0
  377. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/bbox.rs +0 -0
  378. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  379. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/mod.rs +0 -0
  380. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/point.rs +0 -0
  381. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  382. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  383. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  384. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/date.rs +0 -0
  385. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
  386. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/duration.rs +0 -0
  387. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/format.rs +0 -0
  388. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  389. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  390. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/time.rs +0 -0
  391. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/zone.rs +0 -0
  392. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/vector/build.rs +0 -0
  393. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/vector/mod.rs +0 -0
  394. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  395. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/vector/tests.rs +0 -0
  396. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/vector/types.rs +0 -0
  397. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/view.rs +0 -0
  398. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/varint.rs +0 -0
  399. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/tests/error_messages.rs +0 -0
  400. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/Cargo.toml +0 -0
  401. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/codec/decode.rs +0 -0
  402. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/codec/encode.rs +0 -0
  403. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/codec/format.rs +0 -0
  404. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/codec/mod.rs +0 -0
  405. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/codec/tests.rs +0 -0
  406. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/config.rs +0 -0
  407. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/dir.rs +0 -0
  408. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/errors.rs +0 -0
  409. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/history.rs +0 -0
  410. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/io.rs +0 -0
  411. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/lib.rs +0 -0
  412. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/lock.rs +0 -0
  413. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/lsn.rs +0 -0
  414. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/record.rs +0 -0
  415. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/recorder/errors.rs +0 -0
  416. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  417. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/recorder/mod.rs +0 -0
  418. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/recorder/recorder.rs +0 -0
  419. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/recorder/tests.rs +0 -0
  420. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/replay.rs +0 -0
  421. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/segment.rs +0 -0
  422. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/testing.rs +0 -0
  423. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
  424. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/wal/mod.rs +0 -0
  425. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/wal/tests.rs +0 -0
  426. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/wal/wal.rs +0 -0
  427. {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/tests/error_messages.rs +0 -0
  428. {lora_python-0.26.1 → lora_python-0.26.3}/python/lora_python/__init__.py +0 -0
  429. {lora_python-0.26.1 → lora_python-0.26.3}/python/lora_python/_async.py +0 -0
  430. {lora_python-0.26.1 → lora_python-0.26.3}/python/lora_python/_native.pyi +0 -0
  431. {lora_python-0.26.1 → lora_python-0.26.3}/python/lora_python/py.typed +0 -0
  432. {lora_python-0.26.1 → lora_python-0.26.3}/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.26.1"
857
+ version = "0.26.3"
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.26.1"
868
+ version = "0.26.3"
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.26.1"
875
+ version = "0.26.3"
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.26.1"
883
+ version = "0.26.3"
884
884
 
885
885
  [[package]]
886
886
  name = "lora-compiler"
887
- version = "0.26.1"
887
+ version = "0.26.3"
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.26.1"
896
+ version = "0.26.3"
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.26.1"
921
+ version = "0.26.3"
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.26.1"
944
+ version = "0.26.3"
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.26.1"
956
+ version = "0.26.3"
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.26.1"
967
+ version = "0.26.3"
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.26.1"
982
+ version = "0.26.3"
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.26.1"
993
+ version = "0.26.3"
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.26.1"
1006
+ version = "0.26.3"
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.26.1"
1020
+ version = "0.26.3"
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.26.1"
1035
+ version = "0.26.3"
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.26.1"
1050
+ version = "0.26.3"
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.26.1"
1065
+ version = "0.26.3"
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.26.1"
1075
+ version = "0.26.3"
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.26.1"
1091
+ version = "0.26.3"
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.26.1"
7
+ version = "0.26.3"
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.26.1" }
19
- lora-parser = { path = "crates/lora-parser", version = "=0.26.1" }
20
- lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.26.1" }
21
- lora-analyzer = { path = "crates/lora-analyzer", version = "=0.26.1" }
22
- lora-compiler = { path = "crates/lora-compiler", version = "=0.26.1" }
23
- lora-store = { path = "crates/lora-store", version = "=0.26.1" }
24
- lora-snapshot = { path = "crates/lora-snapshot", version = "=0.26.1", default-features = false }
25
- lora-io = { path = "crates/lora-io", version = "=0.26.1" }
26
- lora-wal = { path = "crates/lora-wal", version = "=0.26.1" }
27
- lora-executor = { path = "crates/lora-executor", version = "=0.26.1", default-features = false }
28
- lora-database = { path = "crates/lora-database", version = "=0.26.1" }
29
- lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.26.1" }
18
+ lora-ast = { path = "crates/lora-ast", version = "=0.26.3" }
19
+ lora-parser = { path = "crates/lora-parser", version = "=0.26.3" }
20
+ lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.26.3" }
21
+ lora-analyzer = { path = "crates/lora-analyzer", version = "=0.26.3" }
22
+ lora-compiler = { path = "crates/lora-compiler", version = "=0.26.3" }
23
+ lora-store = { path = "crates/lora-store", version = "=0.26.3" }
24
+ lora-snapshot = { path = "crates/lora-snapshot", version = "=0.26.3", default-features = false }
25
+ lora-io = { path = "crates/lora-io", version = "=0.26.3" }
26
+ lora-wal = { path = "crates/lora-wal", version = "=0.26.3" }
27
+ lora-executor = { path = "crates/lora-executor", version = "=0.26.3", default-features = false }
28
+ lora-database = { path = "crates/lora-database", version = "=0.26.3" }
29
+ lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.26.3" }
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.26.1
3
+ Version: 0.26.3
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -9,11 +9,11 @@ mod planner;
9
9
  pub use plan_tree::{plan_tree_from_compiled, PlanTree, PlanTreeNode};
10
10
 
11
11
  pub use logical::{
12
- Aggregation, Argument, Create, Delete, Expand, Filter, Foreach, Limit, LogicalOp, LogicalPlan,
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,
12
+ Aggregation, Argument, Create, Delete, Expand, ExtraRangeBound, Filter, Foreach, Limit,
13
+ LogicalOp, LogicalPlan, Merge, NodeByIdSeek, NodeByPointScan, NodeByPropertyRangeScan,
14
+ NodeByPropertyScan, NodeByTextScan, NodeScan, OptionalMatch, PathBuild, PlanNodeId,
15
+ PointPredicate, Projection, RelByIdSeek, RelByPointScan, RelByPropertyRangeScan, RelByTextScan,
16
+ Remove, Set, Sort, SortLimit, TextPredicate, Unwind,
17
17
  };
18
18
  pub use optimizer::Optimizer;
19
19
  pub use physical::{
@@ -150,6 +150,8 @@ pub struct NodeByPropertyRangeScan {
150
150
  pub lo_inclusive: bool,
151
151
  pub hi: Option<ResolvedExpr>,
152
152
  pub hi_inclusive: bool,
153
+ /// More bounds on `key`, intersected with `lo`/`hi` per row.
154
+ pub extra_bounds: Vec<ExtraRangeBound>,
153
155
  /// Set when the optimizer replaced an `ORDER BY var.key` above this
154
156
  /// scan: rows must come out in that order (from the index when it can
155
157
  /// supply it, otherwise sorted by the operator itself).
@@ -223,6 +225,20 @@ pub struct RelByPropertyRangeScan {
223
225
  pub lo_inclusive: bool,
224
226
  pub hi: Option<ResolvedExpr>,
225
227
  pub hi_inclusive: bool,
228
+ /// More bounds on `key`, intersected with `lo`/`hi` per row.
229
+ pub extra_bounds: Vec<ExtraRangeBound>,
230
+ }
231
+
232
+ /// A range-scan bound the planner cannot order against the scan's `lo` or
233
+ /// `hi` (a parameter, say, where `lo` is a STARTS WITH prefix). The
234
+ /// executor evaluates it per row and seeks from the tighter of the two, so
235
+ /// `x STARTS WITH $p AND x > $after` reads from `max($p, $after)`.
236
+ #[derive(Debug, Clone)]
237
+ pub struct ExtraRangeBound {
238
+ /// `true` for a lower bound (`>`, `>=`), `false` for an upper one.
239
+ pub lower: bool,
240
+ pub value: ResolvedExpr,
241
+ pub inclusive: bool,
226
242
  }
227
243
 
228
244
  /// Trigram-backed relationship scan. Mirror of [`NodeByTextScan`].
@@ -365,6 +365,7 @@ fn lower_logical_op(op: LogicalOp) -> PhysicalOp {
365
365
  lo_inclusive: scan.lo_inclusive,
366
366
  hi: scan.hi,
367
367
  hi_inclusive: scan.hi_inclusive,
368
+ extra_bounds: scan.extra_bounds,
368
369
  order: scan.order,
369
370
  })
370
371
  }
@@ -399,6 +400,7 @@ fn lower_logical_op(op: LogicalOp) -> PhysicalOp {
399
400
  lo_inclusive: scan.lo_inclusive,
400
401
  hi: scan.hi,
401
402
  hi_inclusive: scan.hi_inclusive,
403
+ extra_bounds: scan.extra_bounds,
402
404
  })
403
405
  }
404
406
 
@@ -597,7 +599,36 @@ fn collect_index_candidates(
597
599
  }
598
600
  }
599
601
 
600
- if let Some(bounds) = collect_range_bounds(predicate, scan.var) {
602
+ let text = text_predicate_for_var(predicate, scan.var);
603
+ // `x STARTS WITH s` is the range `s <= x < string.prefix_end(s)`,
604
+ // which a RANGE index answers when there is no TEXT index. It
605
+ // intersects with the comparisons on the same property, so a keyset
606
+ // page within a prefix seeks from its cursor.
607
+ let prefix = text.as_ref().filter(|candidate| {
608
+ matches!(candidate.predicate, TextPredicate::StartsWith) && !is_tautological_text(candidate)
609
+ });
610
+ let mut range = collect_range_bounds(predicate, scan.var);
611
+ match (&mut range, prefix) {
612
+ (Some(bounds), Some(prefix)) if bounds.key == prefix.key => {
613
+ add_prefix_bounds(bounds, &prefix.query);
614
+ }
615
+ (None, Some(prefix)) => {
616
+ let mut bounds = RangeBounds::new(prefix.key.clone());
617
+ add_prefix_bounds(&mut bounds, &prefix.query);
618
+ range = Some(bounds);
619
+ }
620
+ _ => {}
621
+ }
622
+ // A prefix on another property than the comparisons: its own scan.
623
+ let prefix_range = prefix
624
+ .filter(|prefix| range.as_ref().is_some_and(|b| b.key != prefix.key))
625
+ .map(|prefix| {
626
+ let mut bounds = RangeBounds::new(prefix.key.clone());
627
+ add_prefix_bounds(&mut bounds, &prefix.query);
628
+ bounds
629
+ });
630
+
631
+ for bounds in range.into_iter().chain(prefix_range) {
601
632
  if !is_tautological_range(&bounds)
602
633
  && first_simple_label(&scan.labels)
603
634
  .is_some_and(|label| stats.has_node_range_index(label, &bounds.key))
@@ -612,39 +643,14 @@ fn collect_index_candidates(
612
643
  lo_inclusive: bounds.lo_inclusive,
613
644
  hi: bounds.hi,
614
645
  hi_inclusive: bounds.hi_inclusive,
646
+ extra_bounds: bounds.extra,
615
647
  order: None,
616
648
  },
617
649
  ));
618
650
  }
619
651
  }
620
652
 
621
- if let Some(candidate) = text_predicate_for_var(predicate, scan.var) {
622
- // `x STARTS WITH s` is the range `s <= x < string.prefix_end(s)`,
623
- // which a RANGE index answers when there is no TEXT index.
624
- if matches!(candidate.predicate, TextPredicate::StartsWith)
625
- && !is_tautological_text(&candidate)
626
- && first_simple_label(&scan.labels)
627
- .is_some_and(|label| stats.has_node_range_index(label, &candidate.key))
628
- {
629
- out.push(LogicalOp::NodeByPropertyRangeScan(
630
- NodeByPropertyRangeScan {
631
- input: scan.input,
632
- var: scan.var,
633
- labels: scan.labels.clone(),
634
- key: candidate.key.clone(),
635
- lo: Some(candidate.query.clone()),
636
- lo_inclusive: true,
637
- hi: Some(ResolvedExpr::Function {
638
- function: lora_analyzer::FunctionId::builtin("string.prefix_end")
639
- .expect("string.prefix_end is a builtin"),
640
- distinct: false,
641
- args: vec![candidate.query.clone()],
642
- }),
643
- hi_inclusive: false,
644
- order: None,
645
- },
646
- ));
647
- }
653
+ if let Some(candidate) = text {
648
654
  if !is_tautological_text(&candidate)
649
655
  && first_simple_label(&scan.labels)
650
656
  .is_some_and(|label| stats.has_node_text_index(label, &candidate.key))
@@ -729,6 +735,7 @@ fn collect_rel_index_candidates(
729
735
  lo_inclusive: bounds.lo_inclusive,
730
736
  hi: bounds.hi,
731
737
  hi_inclusive: bounds.hi_inclusive,
738
+ extra_bounds: bounds.extra,
732
739
  }));
733
740
  }
734
741
  }
@@ -977,7 +984,7 @@ fn is_tautological_range(bounds: &RangeBounds) -> bool {
977
984
  ),
978
985
  (Some(_), true) => false,
979
986
  };
980
- lo_open && hi_open
987
+ lo_open && hi_open && bounds.extra.is_empty()
981
988
  }
982
989
 
983
990
  fn is_tautological_text(candidate: &TextCandidate) -> bool {
@@ -1075,66 +1082,75 @@ struct RangeBounds {
1075
1082
  lo_inclusive: bool,
1076
1083
  hi: Option<ResolvedExpr>,
1077
1084
  hi_inclusive: bool,
1085
+ /// Bounds that could not be ordered against `lo`/`hi` at plan time.
1086
+ extra: Vec<ExtraRangeBound>,
1087
+ }
1088
+
1089
+ impl RangeBounds {
1090
+ fn new(key: String) -> Self {
1091
+ Self {
1092
+ key,
1093
+ lo: None,
1094
+ lo_inclusive: false,
1095
+ hi: None,
1096
+ hi_inclusive: false,
1097
+ extra: Vec::new(),
1098
+ }
1099
+ }
1100
+
1101
+ /// Intersect one more bound: keep the tighter of it and the current
1102
+ /// one when both are literals, else keep it for the executor to order.
1103
+ fn add(&mut self, side: RangeSide, value: ResolvedExpr, inclusive: bool) {
1104
+ let (current, current_inclusive, tighter): (_, _, fn(_, _, _, _) -> _) = match side {
1105
+ RangeSide::Lower => (&mut self.lo, &mut self.lo_inclusive, lower_bound_is_tighter),
1106
+ RangeSide::Upper => (&mut self.hi, &mut self.hi_inclusive, upper_bound_is_tighter),
1107
+ };
1108
+ let Some(existing) = current.as_ref() else {
1109
+ *current = Some(value);
1110
+ *current_inclusive = inclusive;
1111
+ return;
1112
+ };
1113
+ if compare_literal_bounds(&value, existing).is_none() {
1114
+ self.extra.push(ExtraRangeBound {
1115
+ lower: matches!(side, RangeSide::Lower),
1116
+ value,
1117
+ inclusive,
1118
+ });
1119
+ } else if tighter(&value, inclusive, existing, *current_inclusive) {
1120
+ *current = Some(value);
1121
+ *current_inclusive = inclusive;
1122
+ }
1123
+ }
1078
1124
  }
1079
1125
 
1080
- /// Walk an AND-tree and collect any `var.prop CMP literal` bounds.
1081
- /// Returns `None` if no comparison touches `var.prop` for a single
1082
- /// property key — we don't try to combine multi-property bounds in v1.
1126
+ /// Walk an AND-tree and collect any `var.prop CMP value` bounds on the
1127
+ /// first property compared. Returns `None` if no comparison touches
1128
+ /// `var`; bounds on other properties are left to the filter.
1083
1129
  fn collect_range_bounds(predicate: &ResolvedExpr, var: VarId) -> Option<RangeBounds> {
1084
- let mut key: Option<String> = None;
1085
- let mut lo: Option<ResolvedExpr> = None;
1086
- let mut lo_inclusive = false;
1087
- let mut hi: Option<ResolvedExpr> = None;
1088
- let mut hi_inclusive = false;
1089
- let mut any = false;
1090
-
1091
- walk_and_for_range(
1092
- predicate,
1093
- var,
1094
- &mut |found_key, side, value, inclusive| match side {
1095
- RangeSide::Lower => {
1096
- if key.as_deref().map(|k| k != found_key).unwrap_or(false) {
1097
- return;
1098
- }
1099
- key = Some(found_key.to_string());
1100
- if lo
1101
- .as_ref()
1102
- .map(|current| lower_bound_is_tighter(&value, inclusive, current, lo_inclusive))
1103
- .unwrap_or(true)
1104
- {
1105
- lo = Some(value);
1106
- lo_inclusive = inclusive;
1107
- }
1108
- any = true;
1109
- }
1110
- RangeSide::Upper => {
1111
- if key.as_deref().map(|k| k != found_key).unwrap_or(false) {
1112
- return;
1113
- }
1114
- key = Some(found_key.to_string());
1115
- if hi
1116
- .as_ref()
1117
- .map(|current| upper_bound_is_tighter(&value, inclusive, current, hi_inclusive))
1118
- .unwrap_or(true)
1119
- {
1120
- hi = Some(value);
1121
- hi_inclusive = inclusive;
1122
- }
1123
- any = true;
1124
- }
1130
+ let mut bounds: Option<RangeBounds> = None;
1131
+ walk_and_for_range(predicate, var, &mut |found_key, side, value, inclusive| {
1132
+ let bounds = bounds.get_or_insert_with(|| RangeBounds::new(found_key.to_string()));
1133
+ if bounds.key == found_key {
1134
+ bounds.add(side, value, inclusive);
1135
+ }
1136
+ });
1137
+ bounds
1138
+ }
1139
+
1140
+ /// The range `prefix <= x < string.prefix_end(prefix)` of `x STARTS WITH
1141
+ /// prefix`, added to `bounds`.
1142
+ fn add_prefix_bounds(bounds: &mut RangeBounds, prefix: &ResolvedExpr) {
1143
+ bounds.add(RangeSide::Lower, prefix.clone(), true);
1144
+ bounds.add(
1145
+ RangeSide::Upper,
1146
+ ResolvedExpr::Function {
1147
+ function: lora_analyzer::FunctionId::builtin("string.prefix_end")
1148
+ .expect("string.prefix_end is a builtin"),
1149
+ distinct: false,
1150
+ args: vec![prefix.clone()],
1125
1151
  },
1152
+ false,
1126
1153
  );
1127
-
1128
- if !any {
1129
- return None;
1130
- }
1131
- Some(RangeBounds {
1132
- key: key?,
1133
- lo,
1134
- lo_inclusive,
1135
- hi,
1136
- hi_inclusive,
1137
- })
1138
1154
  }
1139
1155
 
1140
1156
  #[derive(Clone, Copy)]
@@ -1703,6 +1719,7 @@ mod tests {
1703
1719
  lo_inclusive: false,
1704
1720
  hi: None,
1705
1721
  hi_inclusive: false,
1722
+ extra_bounds: Vec::new(),
1706
1723
  order: None,
1707
1724
  }),
1708
1725
  LogicalOp::NodeByPropertyScan(NodeByPropertyScan {
@@ -1759,6 +1776,7 @@ mod tests {
1759
1776
  lo_inclusive: false,
1760
1777
  hi: None,
1761
1778
  hi_inclusive: false,
1779
+ extra: Vec::new(),
1762
1780
  };
1763
1781
  assert!(is_tautological_range(&bounds));
1764
1782
  }
@@ -1771,6 +1789,7 @@ mod tests {
1771
1789
  lo_inclusive: false,
1772
1790
  hi: Some(lit_int(i64::MAX)),
1773
1791
  hi_inclusive: false,
1792
+ extra: Vec::new(),
1774
1793
  };
1775
1794
  assert!(is_tautological_range(&bounds));
1776
1795
  }
@@ -1783,6 +1802,7 @@ mod tests {
1783
1802
  lo_inclusive: false,
1784
1803
  hi: Some(lit_int(i64::MAX)),
1785
1804
  hi_inclusive: false,
1805
+ extra: Vec::new(),
1786
1806
  };
1787
1807
  assert!(is_tautological_range(&bounds));
1788
1808
  }
@@ -1795,6 +1815,7 @@ mod tests {
1795
1815
  lo_inclusive: false,
1796
1816
  hi: Some(lit_int(100)),
1797
1817
  hi_inclusive: false,
1818
+ extra: Vec::new(),
1798
1819
  };
1799
1820
  assert!(!is_tautological_range(&bounds));
1800
1821
  }
@@ -130,6 +130,8 @@ pub struct NodeByPropertyRangeScanExec {
130
130
  pub lo_inclusive: bool,
131
131
  pub hi: Option<ResolvedExpr>,
132
132
  pub hi_inclusive: bool,
133
+ /// See [`crate::logical::ExtraRangeBound`].
134
+ pub extra_bounds: Vec<crate::logical::ExtraRangeBound>,
133
135
  /// Set when the optimizer replaced an `ORDER BY var.key` above this
134
136
  /// scan: rows must come out in that order (from the index when it can
135
137
  /// supply it, otherwise sorted by the operator itself).
@@ -168,6 +170,8 @@ pub struct RelByPropertyRangeScanExec {
168
170
  pub lo_inclusive: bool,
169
171
  pub hi: Option<ResolvedExpr>,
170
172
  pub hi_inclusive: bool,
173
+ /// See [`crate::logical::ExtraRangeBound`].
174
+ pub extra_bounds: Vec<crate::logical::ExtraRangeBound>,
171
175
  }
172
176
 
173
177
  #[derive(Debug, Clone)]
@@ -195,26 +195,12 @@ fn describe(op: &PhysicalOp) -> PlanDescription {
195
195
  d.insert("labels".to_string(), label_groups_str(&n.labels));
196
196
  }
197
197
  d.insert("key".to_string(), n.key.clone());
198
- if let Some(lo) = &n.lo {
199
- d.insert(
200
- "lo".to_string(),
201
- format!(
202
- "{} {}",
203
- if n.lo_inclusive { ">=" } else { ">" },
204
- expr_str(lo)
205
- ),
206
- );
207
- }
208
- if let Some(hi) = &n.hi {
209
- d.insert(
210
- "hi".to_string(),
211
- format!(
212
- "{} {}",
213
- if n.hi_inclusive { "<=" } else { "<" },
214
- expr_str(hi)
215
- ),
216
- );
217
- }
198
+ insert_range_bounds(
199
+ &mut d,
200
+ (&n.lo, n.lo_inclusive),
201
+ (&n.hi, n.hi_inclusive),
202
+ &n.extra_bounds,
203
+ );
218
204
  PlanDescription::with_children("NodeByPropertyRangeScan", d, opt_input(n.input))
219
205
  }
220
206
  PhysicalOp::NodeByPointScan(n) => {
@@ -282,26 +268,12 @@ fn describe(op: &PhysicalOp) -> PlanDescription {
282
268
  direction_str(n.direction).to_string(),
283
269
  );
284
270
  d.insert("key".to_string(), n.key.clone());
285
- if let Some(lo) = &n.lo {
286
- d.insert(
287
- "lo".to_string(),
288
- format!(
289
- "{} {}",
290
- if n.lo_inclusive { ">=" } else { ">" },
291
- expr_str(lo)
292
- ),
293
- );
294
- }
295
- if let Some(hi) = &n.hi {
296
- d.insert(
297
- "hi".to_string(),
298
- format!(
299
- "{} {}",
300
- if n.hi_inclusive { "<=" } else { "<" },
301
- expr_str(hi)
302
- ),
303
- );
304
- }
271
+ insert_range_bounds(
272
+ &mut d,
273
+ (&n.lo, n.lo_inclusive),
274
+ (&n.hi, n.hi_inclusive),
275
+ &n.extra_bounds,
276
+ );
305
277
  PlanDescription::with_children("RelByPropertyRangeScan", d, opt_input(n.input))
306
278
  }
307
279
  PhysicalOp::RelByTextScan(n) => {
@@ -641,3 +613,37 @@ fn expr_str(e: &ResolvedExpr) -> String {
641
613
  fn pattern_summary(part_count: usize) -> String {
642
614
  format!("{} pattern part(s)", part_count)
643
615
  }
616
+
617
+ /// The `lo` and `hi` details of a range scan: each side's bounds joined
618
+ /// with `AND`, the scan seeking from the tightest at run time.
619
+ fn insert_range_bounds(
620
+ d: &mut BTreeMap<String, String>,
621
+ lo: (&Option<ResolvedExpr>, bool),
622
+ hi: (&Option<ResolvedExpr>, bool),
623
+ extra: &[crate::logical::ExtraRangeBound],
624
+ ) {
625
+ for (name, lower, (first, first_inclusive)) in [("lo", true, lo), ("hi", false, hi)] {
626
+ let parts: Vec<String> = first
627
+ .iter()
628
+ .map(|value| (value, first_inclusive))
629
+ .chain(
630
+ extra
631
+ .iter()
632
+ .filter(|b| b.lower == lower)
633
+ .map(|b| (&b.value, b.inclusive)),
634
+ )
635
+ .map(|(value, inclusive)| {
636
+ let op = match (lower, inclusive) {
637
+ (true, true) => ">=",
638
+ (true, false) => ">",
639
+ (false, true) => "<=",
640
+ (false, false) => "<",
641
+ };
642
+ format!("{op} {}", expr_str(value))
643
+ })
644
+ .collect();
645
+ if !parts.is_empty() {
646
+ d.insert(name.to_string(), parts.join(" AND "));
647
+ }
648
+ }
649
+ }