lora-python 0.26.3__tar.gz → 0.27.1__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 (435) hide show
  1. {lora_python-0.26.3 → lora_python-0.27.1}/Cargo.lock +19 -19
  2. {lora_python-0.26.3 → lora_python-0.27.1}/Cargo.toml +13 -13
  3. {lora_python-0.26.3 → lora_python-0.27.1}/PKG-INFO +1 -1
  4. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-compiler/src/lib.rs +42 -4
  5. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-compiler/src/optimizer.rs +72 -34
  6. lora_python-0.27.1/crates/lora-compiler/src/param_fold.rs +197 -0
  7. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-compiler/src/pattern.rs +27 -0
  8. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/compile.rs +66 -9
  9. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/execute.rs +1 -1
  10. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/explain.rs +4 -2
  11. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/mod.rs +1 -1
  12. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/profile.rs +1 -1
  13. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/stream.rs +1 -1
  14. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/plan_cache.rs +1 -1
  15. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/transaction.rs +17 -7
  16. lora_python-0.27.1/crates/lora-database/tests/planner_known_parameters.rs +203 -0
  17. lora_python-0.27.1/crates/lora-database/tests/point_scan_choice.rs +125 -0
  18. {lora_python-0.26.3 → lora_python-0.27.1}/pyproject.toml +1 -1
  19. {lora_python-0.26.3 → lora_python-0.27.1}/LICENSE +0 -0
  20. {lora_python-0.26.3 → lora_python-0.27.1}/README.md +0 -0
  21. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-binding-buffer/Cargo.toml +0 -0
  22. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-binding-buffer/src/lib.rs +0 -0
  23. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-binding-buffer/src/stream.rs +0 -0
  24. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/.gitignore +0 -0
  25. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/Cargo.toml +0 -0
  26. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/LICENSE +0 -0
  27. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/README.md +0 -0
  28. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/build.rs +0 -0
  29. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  30. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/examples/basic.py +0 -0
  31. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/src/errors.rs +0 -0
  32. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/src/from_python.rs +0 -0
  33. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/src/gil.rs +0 -0
  34. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/src/lib.rs +0 -0
  35. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/src/stream.rs +0 -0
  36. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/src/to_python.rs +0 -0
  37. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/tests/test_async.py +0 -0
  38. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/tests/test_concurrency.py +0 -0
  39. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  40. {lora_python-0.26.3 → lora_python-0.27.1}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  41. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/Cargo.toml +0 -0
  42. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
  43. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
  44. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
  45. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  46. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  47. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
  48. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
  49. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/errors.rs +0 -0
  50. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/lib.rs +0 -0
  51. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/resolved.rs +0 -0
  52. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/scope.rs +0 -0
  53. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/src/symbols.rs +0 -0
  54. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  55. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-ast/Cargo.toml +0 -0
  56. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-ast/src/ast.rs +0 -0
  57. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-ast/src/lib.rs +0 -0
  58. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-builtins-meta/Cargo.toml +0 -0
  59. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-builtins-meta/src/lib.rs +0 -0
  60. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-compiler/Cargo.toml +0 -0
  61. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-compiler/src/logical.rs +0 -0
  62. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-compiler/src/physical.rs +0 -0
  63. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-compiler/src/plan_tree.rs +0 -0
  64. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-compiler/src/planner.rs +0 -0
  65. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/Cargo.toml +0 -0
  66. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/README.md +0 -0
  67. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/advanced.rs +0 -0
  68. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/concurrency_guard.rs +0 -0
  69. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/concurrent.rs +0 -0
  70. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/engine.rs +0 -0
  71. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/fixtures.rs +0 -0
  72. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/index_acceleration.rs +0 -0
  73. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/memory.rs +0 -0
  74. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/memory_baseline.json +0 -0
  75. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/perf_smoke.rs +0 -0
  76. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
  77. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/query_implementations.rs +0 -0
  78. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/realistic.rs +0 -0
  79. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/scale.rs +0 -0
  80. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/temporal_spatial.rs +0 -0
  81. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/benches/wal.rs +0 -0
  82. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/examples/bulk_probe.rs +0 -0
  83. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/examples/carried_probe.rs +0 -0
  84. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/examples/heap_probe.rs +0 -0
  85. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/examples/keyset_probe.rs +0 -0
  86. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/examples/optional_probe.rs +0 -0
  87. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/examples/perf_probe.rs +0 -0
  88. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/examples/pushdown_probe.rs +0 -0
  89. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/examples/storage_baseline.rs +0 -0
  90. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/changes/build.rs +0 -0
  91. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/changes/history.rs +0 -0
  92. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/changes/mod.rs +0 -0
  93. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/builder.rs +0 -0
  94. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/changes.rs +0 -0
  95. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/graph_api.rs +0 -0
  96. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/occ.rs +0 -0
  97. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/procedures.rs +0 -0
  98. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/pull_mode.rs +0 -0
  99. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/replay.rs +0 -0
  100. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/row_projection.rs +0 -0
  101. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/schema.rs +0 -0
  102. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/show_pipeline.rs +0 -0
  103. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/database/write_guard.rs +0 -0
  104. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/durable_io.rs +0 -0
  105. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/error.rs +0 -0
  106. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/explain.rs +0 -0
  107. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/io.rs +0 -0
  108. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/lib.rs +0 -0
  109. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/live_store.rs +0 -0
  110. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/named.rs +0 -0
  111. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/snapshot/json.rs +0 -0
  112. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/snapshot/mod.rs +0 -0
  113. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/snapshot/store.rs +0 -0
  114. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/stream.rs +0 -0
  115. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/wal/admin.rs +0 -0
  116. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/wal/archive/format.rs +0 -0
  117. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  118. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  119. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/wal/archive/worker.rs +0 -0
  120. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
  121. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/wal/archive.rs +0 -0
  122. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/wal/mod.rs +0 -0
  123. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/src/wal/write_scope.rs +0 -0
  124. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/advanced_queries.rs +0 -0
  125. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/aggregate_semantics.rs +0 -0
  126. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/aggregation.rs +0 -0
  127. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/and_or_short_circuit.rs +0 -0
  128. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/backend_stub.rs +0 -0
  129. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/bbox_antimeridian.rs +0 -0
  130. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/binary.rs +0 -0
  131. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/bit_shifts.rs +0 -0
  132. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/borrowed_variable_reads.rs +0 -0
  133. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
  134. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/call_subquery_writes.rs +0 -0
  135. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/carried_value_sharing.rs +0 -0
  136. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/change_feed.rs +0 -0
  137. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/collect_nulls.rs +0 -0
  138. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/comparison_ordering.rs +0 -0
  139. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/constraints.rs +0 -0
  140. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/create.rs +0 -0
  141. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/cypher_compat.rs +0 -0
  142. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/deferred_existence_end_state.rs +0 -0
  143. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/docs_examples.rs +0 -0
  144. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/early_limit.rs +0 -0
  145. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/empty_ranges.rs +0 -0
  146. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/entity_property_values.rs +0 -0
  147. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/error_messages.rs +0 -0
  148. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/errors.rs +0 -0
  149. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/explain_estimates.rs +0 -0
  150. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/explain_profile.rs +0 -0
  151. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/expression_semantics.rs +0 -0
  152. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/expressions.rs +0 -0
  153. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/foreach.rs +0 -0
  154. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/fulltext_index.rs +0 -0
  155. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/fulltext_list_properties.rs +0 -0
  156. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/functions_extended.rs +0 -0
  157. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/grouping_key_identity.rs +0 -0
  158. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/id_seek.rs +0 -0
  159. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/index_acceleration.rs +0 -0
  160. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/integer_literals.rs +0 -0
  161. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/invariants.rs +0 -0
  162. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/limit_skip_counts.rs +0 -0
  163. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/managed_snapshots.rs +0 -0
  164. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/match.rs +0 -0
  165. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/merge.rs +0 -0
  166. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/merge_bound_end.rs +0 -0
  167. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/missing_parameters.rs +0 -0
  168. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/nested_aggregates.rs +0 -0
  169. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/null_pattern_variables.rs +0 -0
  170. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/null_properties_and_deferred_existence.rs +0 -0
  171. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/optional_match_correlated.rs +0 -0
  172. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/optional_match_leading.rs +0 -0
  173. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/order_by_aggregates.rs +0 -0
  174. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/order_by_grouping_key_parts.rs +0 -0
  175. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/order_by_index.rs +0 -0
  176. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/order_limit_semantics.rs +0 -0
  177. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/ordering.rs +0 -0
  178. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/parameters.rs +0 -0
  179. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/parser.rs +0 -0
  180. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/paths.rs +0 -0
  181. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/pattern_subquery_property_seek.rs +0 -0
  182. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/pattern_subquery_rel_properties.rs +0 -0
  183. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/pattern_subquery_scope.rs +0 -0
  184. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/pattern_subquery_var_length.rs +0 -0
  185. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/pattern_subquery_where_seek.rs +0 -0
  186. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/planner_pushdown.rs +0 -0
  187. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/planner_stats.rs +0 -0
  188. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/procedure_yield.rs +0 -0
  189. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/projection.rs +0 -0
  190. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/range_scan_bound_intersection.rs +0 -0
  191. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/range_scan_other_kinds.rs +0 -0
  192. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/restart_index_state.rs +0 -0
  193. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/scale.rs +0 -0
  194. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/schema.rs +0 -0
  195. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/schema_in_transaction.rs +0 -0
  196. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/seeds.rs +0 -0
  197. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/shared_index_value_writes.rs +0 -0
  198. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/snapshot.rs +0 -0
  199. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/sort_limit_probe.rs +0 -0
  200. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/spatial.rs +0 -0
  201. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/starts_with_range_seek.rs +0 -0
  202. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/statement_atomicity.rs +0 -0
  203. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/streaming_scans.rs +0 -0
  204. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/string_number_addition.rs +0 -0
  205. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/sum_empty.rs +0 -0
  206. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/temporal.rs +0 -0
  207. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/temporal_constructor_functions.rs +0 -0
  208. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/temporal_constructors.rs +0 -0
  209. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/temporal_map_components.rs +0 -0
  210. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/temporal_range_index.rs +0 -0
  211. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/temporal_strings.rs +0 -0
  212. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/temporal_time_zones.rs +0 -0
  213. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/temporal_zone_accessors.rs +0 -0
  214. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/test_helpers.rs +0 -0
  215. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/timeouts.rs +0 -0
  216. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/transactions.rs +0 -0
  217. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/types_advanced.rs +0 -0
  218. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/union.rs +0 -0
  219. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/unknown_names.rs +0 -0
  220. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
  221. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/update.rs +0 -0
  222. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/var_length_bound_endpoint.rs +0 -0
  223. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/var_length_hop_ranges.rs +0 -0
  224. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/vector_index.rs +0 -0
  225. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/vectors.rs +0 -0
  226. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/wal.rs +0 -0
  227. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/where_clause.rs +0 -0
  228. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/with.rs +0 -0
  229. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/with_predicates.rs +0 -0
  230. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/write_path_bindings.rs +0 -0
  231. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/write_results.rs +0 -0
  232. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-database/tests/write_scaling.rs +0 -0
  233. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/Cargo.toml +0 -0
  234. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/cancel.rs +0 -0
  235. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/errors.rs +0 -0
  236. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/binops.rs +0 -0
  237. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
  238. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
  239. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
  240. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
  241. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
  242. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
  243. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/index_ns.rs +0 -0
  244. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
  245. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/list.rs +0 -0
  246. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
  247. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
  248. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
  249. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
  250. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
  251. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
  252. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
  253. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
  254. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/temporal_build.rs +0 -0
  255. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
  256. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
  257. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
  258. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
  259. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
  260. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/errors.rs +0 -0
  261. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/expr.rs +0 -0
  262. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/functions.rs +0 -0
  263. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/mod.rs +0 -0
  264. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/point.rs +0 -0
  265. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/regex.rs +0 -0
  266. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/eval/vector.rs +0 -0
  267. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/executor/aggregation.rs +0 -0
  268. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/executor/helpers.rs +0 -0
  269. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/executor/immutable.rs +0 -0
  270. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/executor/mod.rs +0 -0
  271. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/executor/mutable.rs +0 -0
  272. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/executor/optional.rs +0 -0
  273. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/executor/sort.rs +0 -0
  274. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/lib.rs +0 -0
  275. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/profile.rs +0 -0
  276. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/aggregate.rs +0 -0
  277. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
  278. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/columns.rs +0 -0
  279. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/context.rs +0 -0
  280. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/expand.rs +0 -0
  281. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/filter.rs +0 -0
  282. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/hydration.rs +0 -0
  283. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/mod.rs +0 -0
  284. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/mutable.rs +0 -0
  285. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/optional.rs +0 -0
  286. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/path.rs +0 -0
  287. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/projection.rs +0 -0
  288. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/scan.rs +0 -0
  289. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/shape.rs +0 -0
  290. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/sort.rs +0 -0
  291. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/source.rs +0 -0
  292. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/tests.rs +0 -0
  293. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/traits.rs +0 -0
  294. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/pull/union.rs +0 -0
  295. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/src/value.rs +0 -0
  296. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-executor/tests/error_messages.rs +0 -0
  297. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-io/Cargo.toml +0 -0
  298. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-io/src/csv.rs +0 -0
  299. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-io/src/format.rs +0 -0
  300. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-io/src/json_array.rs +0 -0
  301. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-io/src/jsonl.rs +0 -0
  302. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-io/src/lib.rs +0 -0
  303. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-io/src/mapping.rs +0 -0
  304. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-io/src/value_json.rs +0 -0
  305. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/Cargo.toml +0 -0
  306. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/cypher.pest +0 -0
  307. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/errors.rs +0 -0
  308. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/lib.rs +0 -0
  309. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/parser/clauses.rs +0 -0
  310. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/parser/expressions.rs +0 -0
  311. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/parser/literals.rs +0 -0
  312. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/parser/mod.rs +0 -0
  313. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/parser/patterns.rs +0 -0
  314. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/parser/query.rs +0 -0
  315. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/parser/schema.rs +0 -0
  316. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/parser/tests.rs +0 -0
  317. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/src/parser/util.rs +0 -0
  318. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-parser/tests/error_messages.rs +0 -0
  319. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/Cargo.toml +0 -0
  320. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/src/body.rs +0 -0
  321. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/src/codec.rs +0 -0
  322. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/src/columnar.rs +0 -0
  323. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/src/envelope.rs +0 -0
  324. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/src/errors.rs +0 -0
  325. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/src/format.rs +0 -0
  326. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/src/lib.rs +0 -0
  327. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/src/options.rs +0 -0
  328. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/src/tests.rs +0 -0
  329. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/src/transform.rs +0 -0
  330. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/src/view.rs +0 -0
  331. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  332. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/Cargo.toml +0 -0
  333. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/codec.rs +0 -0
  334. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/dict.rs +0 -0
  335. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/encoded.rs +0 -0
  336. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/intern.rs +0 -0
  337. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/lib.rs +0 -0
  338. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/lock_table.rs +0 -0
  339. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/adjacency.rs +0 -0
  340. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/chunked_vec.rs +0 -0
  341. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
  342. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/constraint_enforce.rs +0 -0
  343. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/cow.rs +0 -0
  344. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/distinct_stats.rs +0 -0
  345. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/entity_index_store.rs +0 -0
  346. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/fulltext_index.rs +0 -0
  347. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/graph.rs +0 -0
  348. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/hnsw.rs +0 -0
  349. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/id_bitmap.rs +0 -0
  350. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/id_map.rs +0 -0
  351. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/id_set.rs +0 -0
  352. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/impls.rs +0 -0
  353. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/index_catalog.rs +0 -0
  354. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/mem_report.rs +0 -0
  355. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/mod.rs +0 -0
  356. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/model_tests.rs +0 -0
  357. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/point_index.rs +0 -0
  358. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/property_index.rs +0 -0
  359. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/record_slab.rs +0 -0
  360. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
  361. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/snapshot.rs +0 -0
  362. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/sorted_property_index.rs +0 -0
  363. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/stats.rs +0 -0
  364. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/test_util.rs +0 -0
  365. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/tests.rs +0 -0
  366. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/text_index.rs +0 -0
  367. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/memory/vector_index.rs +0 -0
  368. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/mutation.rs +0 -0
  369. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/snapshot.rs +0 -0
  370. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/traits.rs +0 -0
  371. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/binary/mod.rs +0 -0
  372. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/binary/tests.rs +0 -0
  373. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/binary/traits.rs +0 -0
  374. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/binary/types.rs +0 -0
  375. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/graph.rs +0 -0
  376. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/mod.rs +0 -0
  377. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/name.rs +0 -0
  378. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/property_map.rs +0 -0
  379. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/property_value.rs +0 -0
  380. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/spatial/bbox.rs +0 -0
  381. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  382. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/spatial/mod.rs +0 -0
  383. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/spatial/point.rs +0 -0
  384. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  385. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  386. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  387. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/temporal/date.rs +0 -0
  388. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
  389. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/temporal/duration.rs +0 -0
  390. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/temporal/format.rs +0 -0
  391. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  392. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  393. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/temporal/time.rs +0 -0
  394. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/temporal/zone.rs +0 -0
  395. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/vector/build.rs +0 -0
  396. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/vector/mod.rs +0 -0
  397. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  398. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/vector/tests.rs +0 -0
  399. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/vector/types.rs +0 -0
  400. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/types/view.rs +0 -0
  401. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/src/varint.rs +0 -0
  402. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-store/tests/error_messages.rs +0 -0
  403. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/Cargo.toml +0 -0
  404. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/codec/decode.rs +0 -0
  405. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/codec/encode.rs +0 -0
  406. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/codec/format.rs +0 -0
  407. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/codec/mod.rs +0 -0
  408. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/codec/tests.rs +0 -0
  409. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/config.rs +0 -0
  410. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/dir.rs +0 -0
  411. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/errors.rs +0 -0
  412. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/history.rs +0 -0
  413. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/io.rs +0 -0
  414. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/lib.rs +0 -0
  415. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/lock.rs +0 -0
  416. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/lsn.rs +0 -0
  417. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/record.rs +0 -0
  418. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/recorder/errors.rs +0 -0
  419. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  420. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/recorder/mod.rs +0 -0
  421. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/recorder/recorder.rs +0 -0
  422. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/recorder/tests.rs +0 -0
  423. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/replay.rs +0 -0
  424. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/segment.rs +0 -0
  425. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/testing.rs +0 -0
  426. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
  427. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/wal/mod.rs +0 -0
  428. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/wal/tests.rs +0 -0
  429. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/src/wal/wal.rs +0 -0
  430. {lora_python-0.26.3 → lora_python-0.27.1}/crates/lora-wal/tests/error_messages.rs +0 -0
  431. {lora_python-0.26.3 → lora_python-0.27.1}/python/lora_python/__init__.py +0 -0
  432. {lora_python-0.26.3 → lora_python-0.27.1}/python/lora_python/_async.py +0 -0
  433. {lora_python-0.26.3 → lora_python-0.27.1}/python/lora_python/_native.pyi +0 -0
  434. {lora_python-0.26.3 → lora_python-0.27.1}/python/lora_python/py.typed +0 -0
  435. {lora_python-0.26.3 → lora_python-0.27.1}/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.3"
857
+ version = "0.27.1"
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.3"
868
+ version = "0.27.1"
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.3"
875
+ version = "0.27.1"
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.3"
883
+ version = "0.27.1"
884
884
 
885
885
  [[package]]
886
886
  name = "lora-compiler"
887
- version = "0.26.3"
887
+ version = "0.27.1"
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.3"
896
+ version = "0.27.1"
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.3"
921
+ version = "0.27.1"
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.3"
944
+ version = "0.27.1"
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.3"
956
+ version = "0.27.1"
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.3"
967
+ version = "0.27.1"
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.3"
982
+ version = "0.27.1"
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.3"
993
+ version = "0.27.1"
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.3"
1006
+ version = "0.27.1"
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.3"
1020
+ version = "0.27.1"
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.3"
1035
+ version = "0.27.1"
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.3"
1050
+ version = "0.27.1"
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.3"
1065
+ version = "0.27.1"
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.3"
1075
+ version = "0.27.1"
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.3"
1091
+ version = "0.27.1"
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.3"
7
+ version = "0.27.1"
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.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" }
18
+ lora-ast = { path = "crates/lora-ast", version = "=0.27.1" }
19
+ lora-parser = { path = "crates/lora-parser", version = "=0.27.1" }
20
+ lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.27.1" }
21
+ lora-analyzer = { path = "crates/lora-analyzer", version = "=0.27.1" }
22
+ lora-compiler = { path = "crates/lora-compiler", version = "=0.27.1" }
23
+ lora-store = { path = "crates/lora-store", version = "=0.27.1" }
24
+ lora-snapshot = { path = "crates/lora-snapshot", version = "=0.27.1", default-features = false }
25
+ lora-io = { path = "crates/lora-io", version = "=0.27.1" }
26
+ lora-wal = { path = "crates/lora-wal", version = "=0.27.1" }
27
+ lora-executor = { path = "crates/lora-executor", version = "=0.27.1", default-features = false }
28
+ lora-database = { path = "crates/lora-database", version = "=0.27.1" }
29
+ lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.27.1" }
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.3
3
+ Version: 0.27.1
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -3,6 +3,7 @@ pub mod optimizer;
3
3
  pub mod physical;
4
4
  pub mod plan_tree;
5
5
 
6
+ mod param_fold;
6
7
  mod pattern;
7
8
  mod planner;
8
9
 
@@ -16,6 +17,7 @@ pub use logical::{
16
17
  Remove, Set, Sort, SortLimit, TextPredicate, Unwind,
17
18
  };
18
19
  pub use optimizer::Optimizer;
20
+ pub use param_fold::NullnessOf;
19
21
  pub use physical::{
20
22
  ArgumentExec, CreateExec, DeleteExec, ExpandExec, FilterExec, ForeachExec, HashAggregationExec,
21
23
  LimitExec, MergeExec, NodeByIdSeekExec, NodeByLabelScanExec, NodeByPointScanExec,
@@ -36,6 +38,21 @@ pub struct CompiledQuery {
36
38
  pub parameters: std::collections::BTreeSet<String>,
37
39
  /// Additional UNION branches, each compiled independently.
38
40
  pub unions: Vec<CompiledUnionBranch>,
41
+ /// Parameters a filter tests with `IS NULL` / `IS NOT NULL`, with the
42
+ /// nullness the plan folded the test for (`Some(true)`: null; `None`:
43
+ /// unknown, not folded). The plan is valid only for parameters with
44
+ /// the same nullness; see [`CompiledQuery::fits`].
45
+ pub null_params: std::collections::BTreeMap<String, Option<bool>>,
46
+ }
47
+
48
+ impl CompiledQuery {
49
+ /// Whether this plan was built for parameters with the nullness
50
+ /// `nullness` reports.
51
+ pub fn fits(&self, nullness: NullnessOf<'_>) -> bool {
52
+ self.null_params
53
+ .iter()
54
+ .all(|(name, assumed)| nullness(name) == *assumed)
55
+ }
39
56
  }
40
57
 
41
58
  #[derive(Debug, Clone)]
@@ -54,7 +71,21 @@ impl Compiler {
54
71
  /// then falls back to the conservative "commit any matching
55
72
  /// rewrite" behaviour that the runtime executor handles safely.
56
73
  pub fn compile(query: &ResolvedQuery, stats: &GraphStats) -> CompiledQuery {
57
- let physical = compile_physical(query, stats);
74
+ Self::compile_for(query, stats, &|_| None)
75
+ }
76
+
77
+ /// [`Self::compile`] for parameters whose nullness `nullness` knows:
78
+ /// `$p IS NULL` and `$p IS NOT NULL` in a filter fold to constants, so
79
+ /// `$p IS NULL OR n.k IN $p` plans as the `IN` alone (or as no filter).
80
+ /// The result records what it assumed in
81
+ /// [`CompiledQuery::null_params`].
82
+ pub fn compile_for(
83
+ query: &ResolvedQuery,
84
+ stats: &GraphStats,
85
+ nullness: NullnessOf<'_>,
86
+ ) -> CompiledQuery {
87
+ let mut null_params = std::collections::BTreeMap::new();
88
+ let physical = compile_physical(query, stats, nullness, &mut null_params);
58
89
  let unions = query
59
90
  .unions
60
91
  .iter()
@@ -66,7 +97,7 @@ impl Compiler {
66
97
  };
67
98
  CompiledUnionBranch {
68
99
  all: union_part.all,
69
- physical: compile_physical(&branch_query, stats),
100
+ physical: compile_physical(&branch_query, stats, nullness, &mut null_params),
70
101
  }
71
102
  })
72
103
  .collect();
@@ -75,13 +106,20 @@ impl Compiler {
75
106
  physical,
76
107
  unions,
77
108
  parameters: query.parameters.clone(),
109
+ null_params,
78
110
  }
79
111
  }
80
112
  }
81
113
 
82
- fn compile_physical(query: &ResolvedQuery, stats: &GraphStats) -> PhysicalPlan {
114
+ fn compile_physical(
115
+ query: &ResolvedQuery,
116
+ stats: &GraphStats,
117
+ nullness: NullnessOf<'_>,
118
+ null_params: &mut std::collections::BTreeMap<String, Option<bool>>,
119
+ ) -> PhysicalPlan {
83
120
  let mut planner = Planner::with_stats(stats);
84
- let logical = planner.plan(query);
121
+ let mut logical = planner.plan(query);
122
+ param_fold::fold_parameter_null_tests(&mut logical, nullness, null_params);
85
123
 
86
124
  let mut optimizer = Optimizer::new();
87
125
  let optimized = optimizer.optimize(logical, stats);
@@ -874,9 +874,7 @@ fn score_logical_op(op: &LogicalOp, stats: &GraphStats) -> Option<u64> {
874
874
  }
875
875
  LogicalOp::NodeByPointScan(scan) => {
876
876
  let base = label_estimate(&scan.labels, stats)?;
877
- // Spatial probes: bbox/distance usually returns a small
878
- // fraction of the labelled set.
879
- Some(base.div_ceil(5))
877
+ Some(point_scan_estimate(&scan.predicate, base))
880
878
  }
881
879
  LogicalOp::NodeByIdSeek(seek) => Some(id_seek_rows(&seek.ids, seek.in_list)),
882
880
  LogicalOp::RelByIdSeek(seek) => {
@@ -1008,50 +1006,90 @@ fn is_tautological_point(candidate: &PointCandidate) -> bool {
1008
1006
  /// `{longitude: 180, latitude: 90}::POINT` covers every WGS-84 point.
1009
1007
  /// Detecting the literal form avoids a trigram lookup that would yield
1010
1008
  /// every indexed row only to be re-filtered to the same set.
1011
- fn is_world_bbox(lower_left: &ResolvedExpr, upper_right: &ResolvedExpr) -> bool {
1012
- /// Cypher parses `-180` as `Unary{Neg, Literal(180)}`, not as a
1013
- /// negative integer literal — peel one such layer so the
1014
- /// world-bbox detection works on natural query forms.
1015
- fn const_number(expr: &ResolvedExpr) -> Option<f64> {
1016
- match expr {
1017
- ResolvedExpr::Literal(LiteralValue::Float(v)) => Some(*v),
1018
- ResolvedExpr::Literal(LiteralValue::Integer(v)) => Some(*v as f64),
1019
- ResolvedExpr::Unary {
1020
- op: lora_ast::UnaryOp::Neg,
1021
- expr,
1022
- } => const_number(expr).map(|v| -v),
1023
- ResolvedExpr::Unary {
1024
- op: lora_ast::UnaryOp::Pos,
1025
- expr,
1026
- } => const_number(expr),
1027
- _ => None,
1028
- }
1009
+ /// Cypher parses `-180` as `Unary{Neg, Literal(180)}`, not as a negative
1010
+ /// integer literal: peel one such layer so the box checks below work on
1011
+ /// natural query forms.
1012
+ fn const_number(expr: &ResolvedExpr) -> Option<f64> {
1013
+ match expr {
1014
+ ResolvedExpr::Literal(LiteralValue::Float(v)) => Some(*v),
1015
+ ResolvedExpr::Literal(LiteralValue::Integer(v)) => Some(*v as f64),
1016
+ ResolvedExpr::Unary {
1017
+ op: lora_ast::UnaryOp::Neg,
1018
+ expr,
1019
+ } => const_number(expr).map(|v| -v),
1020
+ ResolvedExpr::Unary {
1021
+ op: lora_ast::UnaryOp::Pos,
1022
+ expr,
1023
+ } => const_number(expr),
1024
+ _ => None,
1029
1025
  }
1026
+ }
1030
1027
 
1031
- fn point_lon_lat(expr: &ResolvedExpr) -> Option<(f64, f64)> {
1032
- let items = point_literal_map(expr)?;
1033
- let mut lon: Option<f64> = None;
1034
- let mut lat: Option<f64> = None;
1035
- for (key, value) in items {
1036
- let n = const_number(value)?;
1037
- match key.as_str() {
1038
- "longitude" | "x" => lon = Some(n),
1039
- "latitude" | "y" => lat = Some(n),
1040
- _ => {}
1028
+ /// `(x, y)` of a literal `point({...})`, and whether it names longitude
1029
+ /// and latitude (rather than cartesian `x` / `y`).
1030
+ fn literal_point(expr: &ResolvedExpr) -> Option<(f64, f64, bool)> {
1031
+ let items = point_literal_map(expr)?;
1032
+ let mut lon: Option<f64> = None;
1033
+ let mut lat: Option<f64> = None;
1034
+ let mut geographic = false;
1035
+ for (key, value) in items {
1036
+ let n = const_number(value)?;
1037
+ match key.as_str() {
1038
+ "longitude" => {
1039
+ lon = Some(n);
1040
+ geographic = true;
1041
1041
  }
1042
+ "latitude" => lat = Some(n),
1043
+ "x" => lon = Some(n),
1044
+ "y" => lat = Some(n),
1045
+ _ => {}
1042
1046
  }
1043
- Some((lon?, lat?))
1044
1047
  }
1048
+ Some((lon?, lat?, geographic))
1049
+ }
1045
1050
 
1046
- let Some((ll_lon, ll_lat)) = point_lon_lat(lower_left) else {
1051
+ fn is_world_bbox(lower_left: &ResolvedExpr, upper_right: &ResolvedExpr) -> bool {
1052
+ let Some((ll_lon, ll_lat, _)) = literal_point(lower_left) else {
1047
1053
  return false;
1048
1054
  };
1049
- let Some((ur_lon, ur_lat)) = point_lon_lat(upper_right) else {
1055
+ let Some((ur_lon, ur_lat, _)) = literal_point(upper_right) else {
1050
1056
  return false;
1051
1057
  };
1052
1058
  ll_lon <= -180.0 && ll_lat <= -90.0 && ur_lon >= 180.0 && ur_lat >= 90.0
1053
1059
  }
1054
1060
 
1061
+ /// Rows a point-index probe is estimated to return out of `base`.
1062
+ ///
1063
+ /// A literal geographic box covers its share of the globe. A box built
1064
+ /// from parameters or from the row (one per venue of a page, say) cannot
1065
+ /// be measured, and is taken as narrow: such a box is drawn around a
1066
+ /// place, so it beats an equality on a country or a kind, though not a
1067
+ /// unique key. Other probes keep the fifth they always had.
1068
+ fn point_scan_estimate(predicate: &PointPredicate, base: u64) -> u64 {
1069
+ match predicate {
1070
+ PointPredicate::WithinBBox {
1071
+ lower_left,
1072
+ upper_right,
1073
+ } => match (literal_point(lower_left), literal_point(upper_right)) {
1074
+ (Some((ll_lon, ll_lat, true)), Some((ur_lon, ur_lat, _))) => {
1075
+ // A box with its lower-left east of its upper-right
1076
+ // crosses the antimeridian.
1077
+ let width = if ur_lon >= ll_lon {
1078
+ ur_lon - ll_lon
1079
+ } else {
1080
+ 360.0 - (ll_lon - ur_lon)
1081
+ };
1082
+ let height = (ur_lat - ll_lat).max(0.0);
1083
+ let share = (width.clamp(0.0, 360.0) * height.min(180.0)) / (360.0 * 180.0);
1084
+ ((base as f64 * share).ceil() as u64).clamp(1, base.max(1))
1085
+ }
1086
+ (Some(_), Some(_)) => base.div_ceil(5),
1087
+ _ => 2.min(base.max(1)),
1088
+ },
1089
+ PointPredicate::WithinDistance { .. } => base.div_ceil(5),
1090
+ }
1091
+ }
1092
+
1055
1093
  fn point_literal_map(expr: &ResolvedExpr) -> Option<&Vec<(String, ResolvedExpr)>> {
1056
1094
  let ResolvedExpr::Function { function, args, .. } = expr else {
1057
1095
  return None;
@@ -0,0 +1,197 @@
1
+ //! Fold `$p IS NULL` / `$p IS NOT NULL` when the plan is built for known
2
+ //! parameters.
3
+ //!
4
+ //! An optional filter written as `$kinds IS NULL OR n.kind IN $kinds` is a
5
+ //! disjunction the index picker cannot use, so the seek falls to another
6
+ //! conjunct, however unselective, and every candidate it yields is held
7
+ //! until the filter drops it. With the parameter's value known, the test
8
+ //! is a constant: `false OR n.kind IN $kinds` is `n.kind IN $kinds`, which
9
+ //! the picker seeks like any `IN`, and `true OR …` drops the disjunction.
10
+ //!
11
+ //! The plan is then only valid for parameters with the same nullness;
12
+ //! [`CompiledQuery::null_params`](crate::CompiledQuery::null_params)
13
+ //! records what was assumed, and the plan cache keys on it.
14
+
15
+ use std::collections::BTreeMap;
16
+
17
+ use lora_analyzer::{LiteralValue, ResolvedExpr};
18
+ use lora_ast::{BinaryOp, UnaryOp};
19
+
20
+ use crate::logical::{LogicalOp, LogicalPlan};
21
+
22
+ /// Whether a parameter is null, for the parameters the caller knows.
23
+ pub type NullnessOf<'a> = &'a dyn Fn(&str) -> Option<bool>;
24
+
25
+ /// Fold the parameter null tests of every filter in `plan`, recording in
26
+ /// `assumed` every parameter tested and the nullness it was folded for
27
+ /// (`None`: unknown, left as it is).
28
+ pub(crate) fn fold_parameter_null_tests(
29
+ plan: &mut LogicalPlan,
30
+ nullness: NullnessOf<'_>,
31
+ assumed: &mut BTreeMap<String, Option<bool>>,
32
+ ) {
33
+ for op in &mut plan.nodes {
34
+ if let LogicalOp::Filter(filter) = op {
35
+ if mentions_null_test(&filter.predicate) {
36
+ let predicate = std::mem::replace(
37
+ &mut filter.predicate,
38
+ ResolvedExpr::Literal(LiteralValue::Null),
39
+ );
40
+ filter.predicate = fold(predicate, nullness, assumed);
41
+ }
42
+ }
43
+ }
44
+ }
45
+
46
+ fn mentions_null_test(expr: &ResolvedExpr) -> bool {
47
+ match expr {
48
+ ResolvedExpr::Binary { lhs, op, rhs } => match op {
49
+ BinaryOp::IsNull | BinaryOp::IsNotNull => {
50
+ matches!(**lhs, ResolvedExpr::Parameter(_))
51
+ }
52
+ BinaryOp::And | BinaryOp::Or => mentions_null_test(lhs) || mentions_null_test(rhs),
53
+ _ => false,
54
+ },
55
+ ResolvedExpr::Unary {
56
+ op: UnaryOp::Not,
57
+ expr,
58
+ } => mentions_null_test(expr),
59
+ _ => false,
60
+ }
61
+ }
62
+
63
+ fn boolean(expr: &ResolvedExpr) -> Option<bool> {
64
+ match expr {
65
+ ResolvedExpr::Literal(LiteralValue::Bool(b)) => Some(*b),
66
+ _ => None,
67
+ }
68
+ }
69
+
70
+ fn lit(b: bool) -> ResolvedExpr {
71
+ ResolvedExpr::Literal(LiteralValue::Bool(b))
72
+ }
73
+
74
+ /// Fold the null tests in `expr` and simplify the `AND`, `OR` and `NOT`
75
+ /// over them. Each rule holds in three-valued logic: `false AND x` and
76
+ /// `true OR x` are decided whatever `x` is, `true AND x` and `false OR x`
77
+ /// are `x`.
78
+ fn fold(
79
+ expr: ResolvedExpr,
80
+ nullness: NullnessOf<'_>,
81
+ assumed: &mut BTreeMap<String, Option<bool>>,
82
+ ) -> ResolvedExpr {
83
+ match expr {
84
+ ResolvedExpr::Binary { lhs, op, rhs }
85
+ if matches!(op, BinaryOp::IsNull | BinaryOp::IsNotNull)
86
+ && matches!(*lhs, ResolvedExpr::Parameter(_)) =>
87
+ {
88
+ let ResolvedExpr::Parameter(name) = &*lhs else {
89
+ unreachable!()
90
+ };
91
+ let known = nullness(name);
92
+ assumed.insert(name.clone(), known);
93
+ match known {
94
+ Some(is_null) => lit(if op == BinaryOp::IsNull {
95
+ is_null
96
+ } else {
97
+ !is_null
98
+ }),
99
+ None => ResolvedExpr::Binary { lhs, op, rhs },
100
+ }
101
+ }
102
+ ResolvedExpr::Binary {
103
+ lhs,
104
+ op: op @ (BinaryOp::And | BinaryOp::Or),
105
+ rhs,
106
+ } => {
107
+ let lhs = fold(*lhs, nullness, assumed);
108
+ let rhs = fold(*rhs, nullness, assumed);
109
+ let decides = op == BinaryOp::Or;
110
+ match (boolean(&lhs), boolean(&rhs)) {
111
+ (Some(b), _) | (_, Some(b)) if b == decides => lit(decides),
112
+ (Some(_), _) => rhs,
113
+ (_, Some(_)) => lhs,
114
+ _ => ResolvedExpr::Binary {
115
+ lhs: Box::new(lhs),
116
+ op,
117
+ rhs: Box::new(rhs),
118
+ },
119
+ }
120
+ }
121
+ ResolvedExpr::Unary {
122
+ op: UnaryOp::Not,
123
+ expr,
124
+ } => {
125
+ let inner = fold(*expr, nullness, assumed);
126
+ match boolean(&inner) {
127
+ Some(b) => lit(!b),
128
+ None => ResolvedExpr::Unary {
129
+ op: UnaryOp::Not,
130
+ expr: Box::new(inner),
131
+ },
132
+ }
133
+ }
134
+ other => other,
135
+ }
136
+ }
137
+
138
+ #[cfg(test)]
139
+ mod tests {
140
+ use super::*;
141
+ use lora_analyzer::symbols::VarId;
142
+
143
+ fn param_is_null(name: &str) -> ResolvedExpr {
144
+ ResolvedExpr::Binary {
145
+ lhs: Box::new(ResolvedExpr::Parameter(name.into())),
146
+ op: BinaryOp::IsNull,
147
+ rhs: Box::new(ResolvedExpr::Literal(LiteralValue::Null)),
148
+ }
149
+ }
150
+
151
+ fn other() -> ResolvedExpr {
152
+ ResolvedExpr::Property {
153
+ expr: Box::new(ResolvedExpr::Variable(VarId(1))),
154
+ property: "kind".into(),
155
+ }
156
+ }
157
+
158
+ fn or(a: ResolvedExpr, b: ResolvedExpr) -> ResolvedExpr {
159
+ ResolvedExpr::Binary {
160
+ lhs: Box::new(a),
161
+ op: BinaryOp::Or,
162
+ rhs: Box::new(b),
163
+ }
164
+ }
165
+
166
+ #[test]
167
+ fn a_known_parameter_folds_and_the_disjunction_simplifies() {
168
+ let mut assumed = BTreeMap::new();
169
+ let not_null = |_: &str| Some(false);
170
+ let folded = fold(or(param_is_null("k"), other()), &not_null, &mut assumed);
171
+ assert!(matches!(folded, ResolvedExpr::Property { .. }));
172
+ assert_eq!(assumed.get("k"), Some(&Some(false)));
173
+
174
+ let mut assumed = BTreeMap::new();
175
+ let null = |_: &str| Some(true);
176
+ let folded = fold(or(param_is_null("k"), other()), &null, &mut assumed);
177
+ assert!(matches!(
178
+ folded,
179
+ ResolvedExpr::Literal(LiteralValue::Bool(true))
180
+ ));
181
+ }
182
+
183
+ #[test]
184
+ fn an_unknown_parameter_is_left_alone() {
185
+ let mut assumed = BTreeMap::new();
186
+ let unknown = |_: &str| None;
187
+ let folded = fold(or(param_is_null("k"), other()), &unknown, &mut assumed);
188
+ assert!(matches!(
189
+ folded,
190
+ ResolvedExpr::Binary {
191
+ op: BinaryOp::Or,
192
+ ..
193
+ }
194
+ ));
195
+ assert_eq!(assumed.get("k"), Some(&None));
196
+ }
197
+ }
@@ -268,15 +268,42 @@ impl<'a> PatternPlanner<'a> {
268
268
  let (Some(first), Some(last)) = (chain.first(), chain.last()) else {
269
269
  return false;
270
270
  };
271
+ // Rows after the first expansion: a single row at an end whose
272
+ // relationship fans out to thousands costs thousands.
271
273
  let head_cost = self
272
274
  .start_cost(head)
275
+ .saturating_mul(self.fanout(head, &first.rel))
273
276
  .min(self.rel_seek_cost(head, &first.rel));
274
277
  let tail_cost = self
275
278
  .start_cost(&last.node)
279
+ .saturating_mul(self.fanout(&last.node, &last.rel))
276
280
  .min(self.rel_seek_cost(&last.node, &last.rel));
277
281
  tail_cost < head_cost
278
282
  }
279
283
 
284
+ /// Average number of `rel` relationships at a node like `end`: the
285
+ /// relationships of its types over the nodes of `end`'s label. 1 when
286
+ /// the stats cannot say, so the start costs alone decide.
287
+ fn fanout(&self, end: &ResolvedNode, rel: &ResolvedRel) -> u64 {
288
+ let stats = self.planner.stats();
289
+ let rels = if rel.types.is_empty() {
290
+ Some(stats.relationship_count as u64)
291
+ } else {
292
+ rel.types
293
+ .iter()
294
+ .map(|t| stats.relationship_type_count(t))
295
+ .sum::<Option<u64>>()
296
+ };
297
+ let nodes = match end.labels.as_slice() {
298
+ [group, ..] if group.len() == 1 => stats.label_count(&group[0]),
299
+ _ => Some(stats.node_count as u64),
300
+ };
301
+ match (rels, nodes) {
302
+ (Some(rels), Some(nodes)) if nodes > 0 => rels.div_ceil(nodes).max(1),
303
+ _ => 1,
304
+ }
305
+ }
306
+
280
307
  /// Cost of starting at `end` when the chain's relationship next to it,
281
308
  /// `rel`, can be sought by id (`id(r) = value` pending): the optimizer
282
309
  /// turns `Expand(NodeScan(end))` into a relationship seek, one row.