lora-python 0.20.0__tar.gz → 0.20.2__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 (396) hide show
  1. {lora_python-0.20.0 → lora_python-0.20.2}/Cargo.lock +19 -19
  2. {lora_python-0.20.0 → lora_python-0.20.2}/Cargo.toml +13 -13
  3. {lora_python-0.20.0 → lora_python-0.20.2}/PKG-INFO +1 -1
  4. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-builtins-meta/src/lib.rs +1 -0
  5. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-compiler/src/optimizer.rs +26 -0
  6. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/README.md +1 -0
  7. lora_python-0.20.2/crates/lora-database/examples/carried_probe.rs +51 -0
  8. lora_python-0.20.2/crates/lora-database/tests/carried_value_sharing.rs +163 -0
  9. lora_python-0.20.2/crates/lora-database/tests/starts_with_range_seek.rs +61 -0
  10. lora_python-0.20.2/crates/lora-database/tests/string_number_addition.rs +46 -0
  11. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/binops.rs +25 -2
  12. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/string_ns.rs +24 -0
  13. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/expr.rs +21 -8
  14. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/executor/helpers.rs +55 -8
  15. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/executor/immutable.rs +5 -8
  16. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/executor/mod.rs +1 -0
  17. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/executor/mutable.rs +1 -1
  18. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/executor/optional.rs +3 -1
  19. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/hydration.rs +2 -2
  20. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/projection.rs +3 -7
  21. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/scan.rs +7 -1
  22. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/value.rs +216 -14
  23. {lora_python-0.20.0 → lora_python-0.20.2}/pyproject.toml +1 -1
  24. {lora_python-0.20.0 → lora_python-0.20.2}/LICENSE +0 -0
  25. {lora_python-0.20.0 → lora_python-0.20.2}/README.md +0 -0
  26. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-binding-buffer/Cargo.toml +0 -0
  27. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-binding-buffer/src/lib.rs +0 -0
  28. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-binding-buffer/src/stream.rs +0 -0
  29. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/.gitignore +0 -0
  30. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/Cargo.toml +0 -0
  31. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/LICENSE +0 -0
  32. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/README.md +0 -0
  33. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/build.rs +0 -0
  34. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  35. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/examples/basic.py +0 -0
  36. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/src/errors.rs +0 -0
  37. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/src/from_python.rs +0 -0
  38. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/src/gil.rs +0 -0
  39. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/src/lib.rs +0 -0
  40. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/src/stream.rs +0 -0
  41. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/src/to_python.rs +0 -0
  42. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/tests/test_async.py +0 -0
  43. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/tests/test_concurrency.py +0 -0
  44. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  45. {lora_python-0.20.0 → lora_python-0.20.2}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  46. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/Cargo.toml +0 -0
  47. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
  48. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
  49. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
  50. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  51. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  52. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
  53. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
  54. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/errors.rs +0 -0
  55. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/lib.rs +0 -0
  56. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/resolved.rs +0 -0
  57. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/scope.rs +0 -0
  58. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/src/symbols.rs +0 -0
  59. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  60. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-ast/Cargo.toml +0 -0
  61. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-ast/src/ast.rs +0 -0
  62. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-ast/src/lib.rs +0 -0
  63. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-builtins-meta/Cargo.toml +0 -0
  64. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-compiler/Cargo.toml +0 -0
  65. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-compiler/src/lib.rs +0 -0
  66. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-compiler/src/logical.rs +0 -0
  67. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-compiler/src/pattern.rs +0 -0
  68. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-compiler/src/physical.rs +0 -0
  69. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-compiler/src/plan_tree.rs +0 -0
  70. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-compiler/src/planner.rs +0 -0
  71. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/Cargo.toml +0 -0
  72. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/advanced.rs +0 -0
  73. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/concurrency_guard.rs +0 -0
  74. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/concurrent.rs +0 -0
  75. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/engine.rs +0 -0
  76. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/fixtures.rs +0 -0
  77. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/index_acceleration.rs +0 -0
  78. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/memory.rs +0 -0
  79. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/memory_baseline.json +0 -0
  80. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/perf_smoke.rs +0 -0
  81. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
  82. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/query_implementations.rs +0 -0
  83. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/realistic.rs +0 -0
  84. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/scale.rs +0 -0
  85. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/temporal_spatial.rs +0 -0
  86. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/benches/wal.rs +0 -0
  87. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/examples/bulk_probe.rs +0 -0
  88. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/examples/heap_probe.rs +0 -0
  89. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/examples/keyset_probe.rs +0 -0
  90. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/examples/optional_probe.rs +0 -0
  91. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/examples/perf_probe.rs +0 -0
  92. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/examples/pushdown_probe.rs +0 -0
  93. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/changes/build.rs +0 -0
  94. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/changes/history.rs +0 -0
  95. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/changes/mod.rs +0 -0
  96. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/builder.rs +0 -0
  97. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/changes.rs +0 -0
  98. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/compile.rs +0 -0
  99. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/execute.rs +0 -0
  100. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/explain.rs +0 -0
  101. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/graph_api.rs +0 -0
  102. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/mod.rs +0 -0
  103. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/occ.rs +0 -0
  104. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/procedures.rs +0 -0
  105. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/profile.rs +0 -0
  106. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/pull_mode.rs +0 -0
  107. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/replay.rs +0 -0
  108. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/row_projection.rs +0 -0
  109. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/schema.rs +0 -0
  110. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/show_pipeline.rs +0 -0
  111. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/stream.rs +0 -0
  112. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/database/write_guard.rs +0 -0
  113. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/durable_io.rs +0 -0
  114. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/error.rs +0 -0
  115. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/explain.rs +0 -0
  116. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/io.rs +0 -0
  117. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/lib.rs +0 -0
  118. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/live_store.rs +0 -0
  119. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/named.rs +0 -0
  120. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/plan_cache.rs +0 -0
  121. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/snapshot/json.rs +0 -0
  122. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/snapshot/mod.rs +0 -0
  123. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/snapshot/store.rs +0 -0
  124. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/stream.rs +0 -0
  125. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/transaction.rs +0 -0
  126. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/wal/admin.rs +0 -0
  127. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/wal/archive/format.rs +0 -0
  128. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  129. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  130. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/wal/archive/worker.rs +0 -0
  131. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
  132. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/wal/archive.rs +0 -0
  133. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/wal/mod.rs +0 -0
  134. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/src/wal/write_scope.rs +0 -0
  135. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/advanced_queries.rs +0 -0
  136. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/aggregation.rs +0 -0
  137. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/and_or_short_circuit.rs +0 -0
  138. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/backend_stub.rs +0 -0
  139. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/bbox_antimeridian.rs +0 -0
  140. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/binary.rs +0 -0
  141. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/borrowed_variable_reads.rs +0 -0
  142. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
  143. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/call_subquery_writes.rs +0 -0
  144. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/change_feed.rs +0 -0
  145. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/comparison_ordering.rs +0 -0
  146. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/constraints.rs +0 -0
  147. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/create.rs +0 -0
  148. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/cypher_compat.rs +0 -0
  149. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/docs_examples.rs +0 -0
  150. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/early_limit.rs +0 -0
  151. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/empty_ranges.rs +0 -0
  152. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/error_messages.rs +0 -0
  153. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/errors.rs +0 -0
  154. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/explain_estimates.rs +0 -0
  155. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/explain_profile.rs +0 -0
  156. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/expressions.rs +0 -0
  157. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/foreach.rs +0 -0
  158. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/fulltext_index.rs +0 -0
  159. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/fulltext_list_properties.rs +0 -0
  160. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/functions_extended.rs +0 -0
  161. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/index_acceleration.rs +0 -0
  162. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/invariants.rs +0 -0
  163. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/limit_skip_counts.rs +0 -0
  164. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/managed_snapshots.rs +0 -0
  165. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/match.rs +0 -0
  166. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/merge.rs +0 -0
  167. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/merge_bound_end.rs +0 -0
  168. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/null_properties_and_deferred_existence.rs +0 -0
  169. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/optional_match_correlated.rs +0 -0
  170. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/order_by_index.rs +0 -0
  171. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/order_limit_semantics.rs +0 -0
  172. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/ordering.rs +0 -0
  173. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/parameters.rs +0 -0
  174. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/parser.rs +0 -0
  175. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/paths.rs +0 -0
  176. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/pattern_subquery_property_seek.rs +0 -0
  177. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/pattern_subquery_rel_properties.rs +0 -0
  178. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/pattern_subquery_scope.rs +0 -0
  179. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/pattern_subquery_var_length.rs +0 -0
  180. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/planner_pushdown.rs +0 -0
  181. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/procedure_yield.rs +0 -0
  182. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/projection.rs +0 -0
  183. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/range_scan_other_kinds.rs +0 -0
  184. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/scale.rs +0 -0
  185. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/schema.rs +0 -0
  186. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/schema_in_transaction.rs +0 -0
  187. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/seeds.rs +0 -0
  188. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/shared_index_value_writes.rs +0 -0
  189. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/snapshot.rs +0 -0
  190. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/sort_limit_probe.rs +0 -0
  191. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/spatial.rs +0 -0
  192. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/temporal.rs +0 -0
  193. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/temporal_constructor_functions.rs +0 -0
  194. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/temporal_constructors.rs +0 -0
  195. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/temporal_map_components.rs +0 -0
  196. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/temporal_range_index.rs +0 -0
  197. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/temporal_strings.rs +0 -0
  198. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/temporal_time_zones.rs +0 -0
  199. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/temporal_zone_accessors.rs +0 -0
  200. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/test_helpers.rs +0 -0
  201. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/timeouts.rs +0 -0
  202. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/transactions.rs +0 -0
  203. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/types_advanced.rs +0 -0
  204. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/union.rs +0 -0
  205. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/unknown_names.rs +0 -0
  206. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
  207. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/update.rs +0 -0
  208. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/var_length_bound_endpoint.rs +0 -0
  209. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/var_length_hop_ranges.rs +0 -0
  210. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/vector_index.rs +0 -0
  211. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/vectors.rs +0 -0
  212. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/wal.rs +0 -0
  213. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/where_clause.rs +0 -0
  214. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/with.rs +0 -0
  215. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/with_predicates.rs +0 -0
  216. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/write_results.rs +0 -0
  217. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-database/tests/write_scaling.rs +0 -0
  218. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/Cargo.toml +0 -0
  219. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/cancel.rs +0 -0
  220. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/errors.rs +0 -0
  221. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
  222. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
  223. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
  224. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
  225. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
  226. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
  227. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/index_ns.rs +0 -0
  228. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
  229. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/list.rs +0 -0
  230. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
  231. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
  232. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
  233. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
  234. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
  235. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
  236. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
  237. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/temporal_build.rs +0 -0
  238. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
  239. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
  240. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
  241. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
  242. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
  243. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/errors.rs +0 -0
  244. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/functions.rs +0 -0
  245. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/mod.rs +0 -0
  246. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/point.rs +0 -0
  247. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/regex.rs +0 -0
  248. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/eval/vector.rs +0 -0
  249. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/executor/aggregation.rs +0 -0
  250. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/executor/sort.rs +0 -0
  251. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/lib.rs +0 -0
  252. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/profile.rs +0 -0
  253. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/aggregate.rs +0 -0
  254. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
  255. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/columns.rs +0 -0
  256. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/context.rs +0 -0
  257. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/expand.rs +0 -0
  258. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/filter.rs +0 -0
  259. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/mod.rs +0 -0
  260. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/mutable.rs +0 -0
  261. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/optional.rs +0 -0
  262. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/path.rs +0 -0
  263. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/shape.rs +0 -0
  264. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/sort.rs +0 -0
  265. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/source.rs +0 -0
  266. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/tests.rs +0 -0
  267. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/traits.rs +0 -0
  268. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/src/pull/union.rs +0 -0
  269. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-executor/tests/error_messages.rs +0 -0
  270. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-io/Cargo.toml +0 -0
  271. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-io/src/csv.rs +0 -0
  272. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-io/src/format.rs +0 -0
  273. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-io/src/json_array.rs +0 -0
  274. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-io/src/jsonl.rs +0 -0
  275. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-io/src/lib.rs +0 -0
  276. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-io/src/mapping.rs +0 -0
  277. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-io/src/value_json.rs +0 -0
  278. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/Cargo.toml +0 -0
  279. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/cypher.pest +0 -0
  280. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/errors.rs +0 -0
  281. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/lib.rs +0 -0
  282. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/parser/clauses.rs +0 -0
  283. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/parser/expressions.rs +0 -0
  284. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/parser/literals.rs +0 -0
  285. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/parser/mod.rs +0 -0
  286. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/parser/patterns.rs +0 -0
  287. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/parser/query.rs +0 -0
  288. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/parser/schema.rs +0 -0
  289. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/parser/tests.rs +0 -0
  290. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/src/parser/util.rs +0 -0
  291. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-parser/tests/error_messages.rs +0 -0
  292. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/Cargo.toml +0 -0
  293. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/src/body.rs +0 -0
  294. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/src/codec.rs +0 -0
  295. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/src/columnar.rs +0 -0
  296. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/src/envelope.rs +0 -0
  297. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/src/errors.rs +0 -0
  298. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/src/format.rs +0 -0
  299. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/src/lib.rs +0 -0
  300. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/src/options.rs +0 -0
  301. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/src/tests.rs +0 -0
  302. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/src/transform.rs +0 -0
  303. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/src/view.rs +0 -0
  304. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  305. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/Cargo.toml +0 -0
  306. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/codec.rs +0 -0
  307. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/intern.rs +0 -0
  308. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/lib.rs +0 -0
  309. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/lock_table.rs +0 -0
  310. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/chunked_vec.rs +0 -0
  311. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
  312. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/constraint_enforce.rs +0 -0
  313. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/cow.rs +0 -0
  314. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/entity_index_store.rs +0 -0
  315. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/fulltext_index.rs +0 -0
  316. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/graph.rs +0 -0
  317. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/hnsw.rs +0 -0
  318. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/id_set.rs +0 -0
  319. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/impls.rs +0 -0
  320. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/index_catalog.rs +0 -0
  321. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/mem_report.rs +0 -0
  322. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/mod.rs +0 -0
  323. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/point_index.rs +0 -0
  324. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/property_index.rs +0 -0
  325. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
  326. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/snapshot.rs +0 -0
  327. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/sorted_property_index.rs +0 -0
  328. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/stats.rs +0 -0
  329. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/tests.rs +0 -0
  330. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/text_index.rs +0 -0
  331. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/memory/vector_index.rs +0 -0
  332. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/mutation.rs +0 -0
  333. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/snapshot.rs +0 -0
  334. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/traits.rs +0 -0
  335. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/binary/mod.rs +0 -0
  336. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/binary/tests.rs +0 -0
  337. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/binary/traits.rs +0 -0
  338. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/binary/types.rs +0 -0
  339. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/graph.rs +0 -0
  340. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/mod.rs +0 -0
  341. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/property_map.rs +0 -0
  342. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/property_value.rs +0 -0
  343. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/spatial/bbox.rs +0 -0
  344. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  345. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/spatial/mod.rs +0 -0
  346. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/spatial/point.rs +0 -0
  347. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  348. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  349. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  350. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/temporal/date.rs +0 -0
  351. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
  352. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/temporal/duration.rs +0 -0
  353. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/temporal/format.rs +0 -0
  354. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  355. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  356. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/temporal/time.rs +0 -0
  357. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/temporal/zone.rs +0 -0
  358. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/vector/build.rs +0 -0
  359. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/vector/mod.rs +0 -0
  360. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  361. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/vector/tests.rs +0 -0
  362. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/src/types/vector/types.rs +0 -0
  363. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-store/tests/error_messages.rs +0 -0
  364. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/Cargo.toml +0 -0
  365. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/codec/decode.rs +0 -0
  366. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/codec/encode.rs +0 -0
  367. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/codec/format.rs +0 -0
  368. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/codec/mod.rs +0 -0
  369. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/codec/tests.rs +0 -0
  370. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/config.rs +0 -0
  371. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/dir.rs +0 -0
  372. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/errors.rs +0 -0
  373. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/history.rs +0 -0
  374. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/io.rs +0 -0
  375. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/lib.rs +0 -0
  376. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/lock.rs +0 -0
  377. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/lsn.rs +0 -0
  378. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/record.rs +0 -0
  379. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/recorder/errors.rs +0 -0
  380. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  381. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/recorder/mod.rs +0 -0
  382. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/recorder/recorder.rs +0 -0
  383. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/recorder/tests.rs +0 -0
  384. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/replay.rs +0 -0
  385. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/segment.rs +0 -0
  386. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/testing.rs +0 -0
  387. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
  388. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/wal/mod.rs +0 -0
  389. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/wal/tests.rs +0 -0
  390. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/src/wal/wal.rs +0 -0
  391. {lora_python-0.20.0 → lora_python-0.20.2}/crates/lora-wal/tests/error_messages.rs +0 -0
  392. {lora_python-0.20.0 → lora_python-0.20.2}/python/lora_python/__init__.py +0 -0
  393. {lora_python-0.20.0 → lora_python-0.20.2}/python/lora_python/_async.py +0 -0
  394. {lora_python-0.20.0 → lora_python-0.20.2}/python/lora_python/_native.pyi +0 -0
  395. {lora_python-0.20.0 → lora_python-0.20.2}/python/lora_python/py.typed +0 -0
  396. {lora_python-0.20.0 → lora_python-0.20.2}/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.20.0"
857
+ version = "0.20.2"
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.20.0"
868
+ version = "0.20.2"
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.20.0"
875
+ version = "0.20.2"
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.20.0"
883
+ version = "0.20.2"
884
884
 
885
885
  [[package]]
886
886
  name = "lora-compiler"
887
- version = "0.20.0"
887
+ version = "0.20.2"
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.20.0"
896
+ version = "0.20.2"
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.20.0"
921
+ version = "0.20.2"
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.20.0"
944
+ version = "0.20.2"
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.20.0"
956
+ version = "0.20.2"
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.20.0"
967
+ version = "0.20.2"
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.20.0"
982
+ version = "0.20.2"
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.20.0"
993
+ version = "0.20.2"
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.20.0"
1006
+ version = "0.20.2"
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.20.0"
1020
+ version = "0.20.2"
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.20.0"
1035
+ version = "0.20.2"
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.20.0"
1050
+ version = "0.20.2"
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.20.0"
1065
+ version = "0.20.2"
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.20.0"
1075
+ version = "0.20.2"
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.20.0"
1091
+ version = "0.20.2"
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.20.0"
7
+ version = "0.20.2"
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.20.0" }
19
- lora-parser = { path = "crates/lora-parser", version = "=0.20.0" }
20
- lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.20.0" }
21
- lora-analyzer = { path = "crates/lora-analyzer", version = "=0.20.0" }
22
- lora-compiler = { path = "crates/lora-compiler", version = "=0.20.0" }
23
- lora-store = { path = "crates/lora-store", version = "=0.20.0" }
24
- lora-snapshot = { path = "crates/lora-snapshot", version = "=0.20.0", default-features = false }
25
- lora-io = { path = "crates/lora-io", version = "=0.20.0" }
26
- lora-wal = { path = "crates/lora-wal", version = "=0.20.0" }
27
- lora-executor = { path = "crates/lora-executor", version = "=0.20.0", default-features = false }
28
- lora-database = { path = "crates/lora-database", version = "=0.20.0" }
29
- lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.20.0" }
18
+ lora-ast = { path = "crates/lora-ast", version = "=0.20.2" }
19
+ lora-parser = { path = "crates/lora-parser", version = "=0.20.2" }
20
+ lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.20.2" }
21
+ lora-analyzer = { path = "crates/lora-analyzer", version = "=0.20.2" }
22
+ lora-compiler = { path = "crates/lora-compiler", version = "=0.20.2" }
23
+ lora-store = { path = "crates/lora-store", version = "=0.20.2" }
24
+ lora-snapshot = { path = "crates/lora-snapshot", version = "=0.20.2", default-features = false }
25
+ lora-io = { path = "crates/lora-io", version = "=0.20.2" }
26
+ lora-wal = { path = "crates/lora-wal", version = "=0.20.2" }
27
+ lora-executor = { path = "crates/lora-executor", version = "=0.20.2", default-features = false }
28
+ lora-database = { path = "crates/lora-database", version = "=0.20.2" }
29
+ lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.20.2" }
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.20.0
3
+ Version: 0.20.2
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -259,6 +259,7 @@ pub const BUILTIN_SPECS: &[BuiltinSpec] = &[
259
259
  spec("list.compact", 1, Some(1)),
260
260
  // -- string.* -----------------------------------------------------------
261
261
  spec("string.upper", 1, Some(1)),
262
+ spec("string.prefix_end", 1, Some(1)),
262
263
  spec("string.lower", 1, Some(1)),
263
264
  spec("string.capitalize", 1, Some(2)),
264
265
  spec("string.case", 2, Some(2)),
@@ -567,6 +567,32 @@ fn collect_index_candidates(
567
567
  }
568
568
 
569
569
  if let Some(candidate) = text_predicate_for_var(predicate, scan.var) {
570
+ // `x STARTS WITH s` is the range `s <= x < string.prefix_end(s)`,
571
+ // which a RANGE index answers when there is no TEXT index.
572
+ if matches!(candidate.predicate, TextPredicate::StartsWith)
573
+ && !is_tautological_text(&candidate)
574
+ && first_simple_label(&scan.labels)
575
+ .is_some_and(|label| stats.has_node_range_index(label, &candidate.key))
576
+ {
577
+ out.push(LogicalOp::NodeByPropertyRangeScan(
578
+ NodeByPropertyRangeScan {
579
+ input: scan.input,
580
+ var: scan.var,
581
+ labels: scan.labels.clone(),
582
+ key: candidate.key.clone(),
583
+ lo: Some(candidate.query.clone()),
584
+ lo_inclusive: true,
585
+ hi: Some(ResolvedExpr::Function {
586
+ function: lora_analyzer::FunctionId::builtin("string.prefix_end")
587
+ .expect("string.prefix_end is a builtin"),
588
+ distinct: false,
589
+ args: vec![candidate.query.clone()],
590
+ }),
591
+ hi_inclusive: false,
592
+ order: None,
593
+ },
594
+ ));
595
+ }
570
596
  if !is_tautological_text(&candidate)
571
597
  && first_simple_label(&scan.labels)
572
598
  .is_some_and(|label| stats.has_node_text_index(label, &candidate.key))
@@ -34,6 +34,7 @@ compare cleanly across branches (build each branch, run the same probe):
34
34
  | --- | --- |
35
35
  | `heap_probe` | Real retained heap per node / relationship / index entry via a counting allocator (`MemoryReport` is an estimate). `-- --festimap` runs the 25k-node / 100k-relationship shape from the Festimap report |
36
36
  | `perf_probe` | Mean latency of common query shapes; `-- <scenario> <seconds>` loops one scenario for an external sampler, `-- --stream` compares `execute()` with `stream()` |
37
+ | `carried_probe` | A 200-row hop / OPTIONAL MATCH with a 10k-element list carried in the row vs none (Festimap E-4; target: within 2x). `-- '<body>'` times another query body |
37
38
  | `optional_probe` | Anchored `OPTIONAL MATCH` vs the equivalent pattern comprehension (target: within 3x) |
38
39
  | `keyset_probe` | `WHERE n.key > $after ORDER BY n.key LIMIT 20` latency at 20k and 1M nodes (target: under 1 ms p50, flat in label size) |
39
40
  | `bulk_probe` | Bulk-load time with no schema vs a uniqueness constraint, range, or full-text index declared first |
@@ -0,0 +1,51 @@
1
+ //! Festimap E-4 repro: a value the row carries (a collected list) should not
2
+ //! multiply the cost of an operator that makes a row per candidate.
3
+ //! `cargo run --release -p lora-database --example carried_probe [-- '<body>']`
4
+ //! times `MATCH (c:C {key: 'c'}) WITH c, <big> AS big <body>` with `[]` and
5
+ //! with a 10k-element list; the ratio should stay under 2x.
6
+ use std::time::Instant;
7
+
8
+ use lora_database::{Database, ExecuteOptions, InMemoryGraph, ResultFormat};
9
+
10
+ fn opts() -> Option<ExecuteOptions> {
11
+ Some(ExecuteOptions {
12
+ format: ResultFormat::Rows,
13
+ })
14
+ }
15
+
16
+ fn time(db: &Database<InMemoryGraph>, q: &str) -> f64 {
17
+ for _ in 0..3 {
18
+ db.execute(q, opts()).unwrap();
19
+ }
20
+ let n = 50;
21
+ let t = Instant::now();
22
+ for _ in 0..n {
23
+ db.execute(q, opts()).unwrap();
24
+ }
25
+ t.elapsed().as_secs_f64() * 1000.0 / n as f64
26
+ }
27
+
28
+ fn main() {
29
+ let db = Database::in_memory();
30
+ db.execute(
31
+ "CREATE (c:C {key: 'c'}) WITH c UNWIND range(1, 200) AS i CREATE (:M {i: i})-[:IN]->(c)",
32
+ opts(),
33
+ )
34
+ .unwrap();
35
+ let bodies: Vec<String> = match std::env::args().nth(1) {
36
+ Some(body) => vec![body],
37
+ None => vec![
38
+ "MATCH (c)<-[:IN]-(m:M) RETURN count(m) AS n, size(big) AS b".into(),
39
+ "OPTIONAL MATCH (c)<-[:IN]-(m:M) RETURN count(m) AS n, size(big) AS b".into(),
40
+ ],
41
+ };
42
+ for body in bodies {
43
+ let q = |big: &str| format!("MATCH (c:C {{key: 'c'}}) WITH c, {big} AS big {body}");
44
+ let small = time(&db, &q("[]"));
45
+ let large = time(&db, &q("range(1, 10000)"));
46
+ println!(
47
+ "{body}\n []: {small:.3} ms 10k: {large:.3} ms ratio {:.1}x",
48
+ large / small
49
+ );
50
+ }
51
+ }
@@ -0,0 +1,163 @@
1
+ //! A value the row carries for other reasons is shared, not copied, when an
2
+ //! operator makes one row per candidate.
3
+ //!
4
+ //! An expand, an OPTIONAL MATCH, a variable-length expand, UNWIND, FOREACH and
5
+ //! the list constructs each clone their working row per candidate. A list
6
+ //! collected earlier in the query (Festimap's E-4: a `CALL` that collects a
7
+ //! page before its counts) used to be copied with it, so a 200-row hop over
8
+ //! a row carrying a 10k-element list ran ~250x slower than the same hop
9
+ //! without it. Large values now sit behind a shared pointer in the row slot,
10
+ //! and a lone variable argument (`size(big)`) is read in place.
11
+
12
+ mod test_helpers;
13
+ use std::time::Instant;
14
+
15
+ use test_helpers::TestDb;
16
+
17
+ fn hub(members: usize) -> TestDb {
18
+ let db = TestDb::new();
19
+ db.run(&format!(
20
+ "CREATE (c:C {{key: 'c'}}) WITH c UNWIND range(1, {members}) AS i \
21
+ CREATE (:M {{i: i}})-[:IN]->(c)"
22
+ ));
23
+ db
24
+ }
25
+
26
+ /// The query body after `MATCH (c:C {key: 'c'}) WITH c, <big> AS big`, for
27
+ /// each site that makes a row per candidate.
28
+ const SITES: &[(&str, &str)] = &[
29
+ (
30
+ "expand",
31
+ "MATCH (c)<-[:IN]-(m:M) RETURN count(m) AS n, size(big) AS b",
32
+ ),
33
+ (
34
+ "optional match",
35
+ "OPTIONAL MATCH (c)<-[:IN]-(m:M) RETURN count(m) AS n, size(big) AS b",
36
+ ),
37
+ (
38
+ "expand + filter",
39
+ "MATCH (c)<-[:IN]-(m:M) WHERE m.i > 10 RETURN count(m) AS n, size(big) AS b",
40
+ ),
41
+ (
42
+ "variable-length expand",
43
+ "MATCH (c)<-[:IN*1..2]-(m:M) RETURN count(m) AS n, size(big) AS b",
44
+ ),
45
+ (
46
+ "shortest path",
47
+ "MATCH (m:M) WITH c, big, m MATCH p = shortestPath((c)-[:IN*..2]-(m)) \
48
+ RETURN count(p) AS n, size(big) AS b",
49
+ ),
50
+ (
51
+ "foreach",
52
+ "FOREACH (i IN range(1, 200) | SET c.x = i) RETURN size(big) AS b",
53
+ ),
54
+ (
55
+ "unwind + where",
56
+ "UNWIND range(1, 200) AS i WITH c, big, i WHERE i > 10 RETURN count(i) AS n, size(big) AS b",
57
+ ),
58
+ (
59
+ "call without importing with",
60
+ "CALL { MATCH (m:M) RETURN m } RETURN count(m) AS n, size(big) AS b",
61
+ ),
62
+ (
63
+ "list comprehension",
64
+ "RETURN size([i IN range(1, 200) WHERE i > 10 | i]) AS n, size(big) AS b",
65
+ ),
66
+ (
67
+ "reduce",
68
+ "RETURN reduce(s = 0, i IN range(1, 200) | s + i) AS n, size(big) AS b",
69
+ ),
70
+ (
71
+ "quantifier",
72
+ "RETURN any(i IN range(1, 200) WHERE i < 0) AS n, size(big) AS b",
73
+ ),
74
+ ];
75
+
76
+ fn per_query(db: &TestDb, q: &str) -> f64 {
77
+ db.run(q);
78
+ // The fastest of several runs: robust against a loaded host.
79
+ (0..7)
80
+ .map(|_| {
81
+ let start = Instant::now();
82
+ db.run(q);
83
+ start.elapsed().as_secs_f64()
84
+ })
85
+ .fold(f64::MAX, f64::min)
86
+ }
87
+
88
+ fn query(big: &str, body: &str) -> String {
89
+ format!("MATCH (c:C {{key: 'c'}}) WITH c, {big} AS big {body}")
90
+ }
91
+
92
+ #[test]
93
+ fn a_carried_list_does_not_multiply_the_cost_of_a_row_per_candidate() {
94
+ let db = hub(200);
95
+ let mut slow = Vec::new();
96
+ for (site, body) in SITES {
97
+ let small = per_query(&db, &query("[]", body));
98
+ let large = per_query(&db, &query("range(1, 10000)", body));
99
+ // Copying the list per candidate made the row-per-candidate sites
100
+ // 200-380x slower (17 ms against 0.07 ms for the expand in a release
101
+ // build); now they run within 2x. Building the list once is the only
102
+ // cost left; the bound leaves room for a loaded host and a debug
103
+ // build.
104
+ if large > small * 5.0 + 0.01 {
105
+ slow.push(format!("{site}: [] {small:.5}s, 10k {large:.5}s"));
106
+ }
107
+ }
108
+ assert!(slow.is_empty(), "{slow:#?}");
109
+ }
110
+
111
+ #[test]
112
+ fn a_carried_list_keeps_its_value_through_every_site() {
113
+ let db = hub(20);
114
+ for (site, body) in SITES {
115
+ let rows = db.run(&query("range(1, 50)", body));
116
+ assert_eq!(rows.len(), 1, "{site}");
117
+ assert_eq!(rows[0]["b"], 50, "{site}");
118
+ }
119
+ }
120
+
121
+ #[test]
122
+ fn shared_values_are_independent_after_a_copy() {
123
+ let db = hub(3);
124
+ // The carried list and map reach every row intact, and a value built
125
+ // from one row's copy does not leak into another's.
126
+ let rows = db.run(
127
+ "MATCH (c:C {key: 'c'}) WITH c, range(1, 100) AS big, \
128
+ {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9} AS cfg \
129
+ MATCH (c)<-[:IN]-(m:M) \
130
+ WITH m, big + [m.i] AS mine, cfg \
131
+ RETURN m.i AS i, size(mine) AS n, mine[-1] AS last, mine[0] AS first, cfg.i AS ci \
132
+ ORDER BY i",
133
+ );
134
+ assert_eq!(rows.len(), 3);
135
+ for (row, i) in rows.iter().zip(1..) {
136
+ assert_eq!(row["i"], i);
137
+ assert_eq!(row["n"], 101);
138
+ assert_eq!(row["last"], i);
139
+ assert_eq!(row["first"], 1);
140
+ assert_eq!(row["ci"], 9);
141
+ }
142
+
143
+ // A large list returned from many rows is returned whole on each.
144
+ let rows = db.run("WITH range(1, 64) AS big MATCH (m:M) RETURN m.i AS i, big ORDER BY i");
145
+ assert_eq!(rows.len(), 3);
146
+ for row in &rows {
147
+ assert_eq!(row["big"].as_array().unwrap().len(), 64);
148
+ }
149
+
150
+ // OPTIONAL MATCH with no match null-extends and keeps the carried list.
151
+ let rows = db.run("WITH range(1, 64) AS big OPTIONAL MATCH (x:Nope) RETURN x, size(big) AS b");
152
+ assert_eq!(rows[0]["x"], serde_json::Value::Null);
153
+ assert_eq!(rows[0]["b"], 64);
154
+
155
+ // FOREACH over rows carrying a list writes once per element.
156
+ db.run(
157
+ "MATCH (c:C {key: 'c'}) WITH c, range(1, 100) AS big \
158
+ FOREACH (i IN range(1, 5) | CREATE (:F {i: i, b: size(big)}))",
159
+ );
160
+ let rows = db.run("MATCH (f:F) RETURN count(f) AS n, min(f.b) AS b");
161
+ assert_eq!(rows[0]["n"], 5);
162
+ assert_eq!(rows[0]["b"], 100);
163
+ }
@@ -0,0 +1,61 @@
1
+ //! `x STARTS WITH s` seeks a RANGE index as `s <= x < string.prefix_end(s)`
2
+ //! when no TEXT index covers the property, with the exact same rows.
3
+
4
+ mod test_helpers;
5
+ use std::collections::BTreeMap;
6
+
7
+ use lora_database::LoraValue;
8
+ use test_helpers::TestDb;
9
+
10
+ fn seeded() -> TestDb {
11
+ let db = TestDb::new();
12
+ db.run("CREATE INDEX post_video FOR (p:Post) ON (p.video)");
13
+ db.run(
14
+ "UNWIND range(1, 200) AS i CREATE (:Post {key: 'p' + i, video: CASE WHEN i % 10 = 0 THEN 'https://x/' + i ELSE null END})",
15
+ );
16
+ db.run("CREATE (:Post {key: 'h', video: 'http://y'}), (:Post {key: 'n', video: 42})");
17
+ db
18
+ }
19
+
20
+ fn plan(db: &TestDb, q: &str) -> String {
21
+ format!("{:?}", db.service.explain(q, None).unwrap().tree)
22
+ }
23
+
24
+ #[test]
25
+ fn starts_with_seeks_the_range_index() {
26
+ let db = seeded();
27
+ let q = "MATCH (p:Post) WHERE p.video STARTS WITH 'https://' RETURN count(p) AS n";
28
+ assert!(
29
+ plan(&db, q).contains("NodeByPropertyRangeScan"),
30
+ "{}",
31
+ plan(&db, q)
32
+ );
33
+ assert_eq!(db.scalar(q), 20);
34
+ // A parameter prefix too.
35
+ let rows = db.run_with_params(
36
+ "MATCH (p:Post) WHERE p.video STARTS WITH $s RETURN count(p) AS n",
37
+ BTreeMap::from([("s".to_string(), LoraValue::String("http".into()))]),
38
+ );
39
+ assert_eq!(rows[0]["n"], 21);
40
+ }
41
+
42
+ #[test]
43
+ fn edge_prefixes_match_exactly() {
44
+ let db = seeded();
45
+ let count = |s: &str| {
46
+ db.run_with_params(
47
+ "MATCH (p:Post) WHERE p.video STARTS WITH $s RETURN count(p) AS n",
48
+ BTreeMap::from([("s".to_string(), LoraValue::String(s.into()))]),
49
+ )[0]["n"]
50
+ .clone()
51
+ };
52
+ // The empty prefix: every string, no successor.
53
+ assert_eq!(count(""), 21);
54
+ assert_eq!(count("https://x/20"), 2); // 20 and 200
55
+ assert_eq!(count("zzz"), 0);
56
+ assert_eq!(db.scalar("RETURN string.prefix_end('ab') AS v"), "ac");
57
+ assert_eq!(
58
+ db.scalar("RETURN string.prefix_end('') AS v"),
59
+ serde_json::Value::Null
60
+ );
61
+ }
@@ -0,0 +1,46 @@
1
+ //! `+` follows Cypher across types: a string and a number concatenate, a
2
+ //! list and an element append or prepend, null stays null, and any other
3
+ //! mix is an error instead of a silent null.
4
+
5
+ mod test_helpers;
6
+ use test_helpers::TestDb;
7
+
8
+ #[test]
9
+ fn a_string_and_a_number_concatenate() {
10
+ let db = TestDb::new();
11
+ assert_eq!(db.scalar("RETURN 'p' + 1 AS v"), "p1");
12
+ assert_eq!(db.scalar("RETURN 1 + 'p' AS v"), "1p");
13
+ assert_eq!(db.scalar("RETURN 'v' + 2.5 AS v"), "v2.5");
14
+ assert_eq!(
15
+ db.column("UNWIND range(1, 3) AS i RETURN 'p' + i AS k", "k"),
16
+ vec!["p1", "p2", "p3"]
17
+ );
18
+ }
19
+
20
+ #[test]
21
+ fn a_list_and_an_element_append_or_prepend() {
22
+ let db = TestDb::new();
23
+ assert_eq!(
24
+ db.scalar("RETURN [1, 2] + 3 AS v"),
25
+ serde_json::json!([1, 2, 3])
26
+ );
27
+ assert_eq!(
28
+ db.scalar("RETURN 0 + [1, 2] AS v"),
29
+ serde_json::json!([0, 1, 2])
30
+ );
31
+ assert_eq!(
32
+ db.scalar("RETURN [1] + [2] AS v"),
33
+ serde_json::json!([1, 2])
34
+ );
35
+ }
36
+
37
+ #[test]
38
+ fn null_stays_null_and_other_mixes_are_errors() {
39
+ let db = TestDb::new();
40
+ assert_eq!(db.scalar("RETURN 'p' + null AS v"), serde_json::Value::Null);
41
+ assert_eq!(db.scalar("RETURN null + [1] AS v"), serde_json::Value::Null);
42
+ let err = db.run_err("RETURN 'p' + true AS v");
43
+ assert!(err.contains("Cannot add"), "{err}");
44
+ let err = db.run_err("RETURN {a: 1} + 1 AS v");
45
+ assert!(err.contains("Cannot add"), "{err}");
46
+ }
@@ -287,15 +287,31 @@ fn int_float_cmp(i: i64, f: f64) -> Option<std::cmp::Ordering> {
287
287
 
288
288
  fn add_values(lhs: LoraValue, rhs: LoraValue) -> LoraValue {
289
289
  match (lhs, rhs) {
290
+ (LoraValue::Null, _) | (_, LoraValue::Null) => LoraValue::Null,
290
291
  (LoraValue::Int(a), LoraValue::Int(b)) => match a.checked_add(b) {
291
292
  Some(out) => LoraValue::Int(out),
292
293
  None => arithmetic_overflow("integer addition"),
293
294
  },
294
295
  (LoraValue::String(a), LoraValue::String(b)) => LoraValue::String(a + &b),
296
+ // A string and a number concatenate, as toString would print the
297
+ // number: 'p' + 1 is 'p1' (it was a silent null).
298
+ (LoraValue::String(a), LoraValue::Int(b)) => LoraValue::String(format!("{a}{b}")),
299
+ (LoraValue::String(a), LoraValue::Float(b)) => LoraValue::String(format!("{a}{b}")),
300
+ (LoraValue::Int(a), LoraValue::String(b)) => LoraValue::String(format!("{a}{b}")),
301
+ (LoraValue::Float(a), LoraValue::String(b)) => LoraValue::String(format!("{a}{b}")),
295
302
  (LoraValue::List(mut a), LoraValue::List(b)) => {
296
303
  a.extend(b);
297
304
  LoraValue::List(a)
298
305
  }
306
+ // A list and an element: append or prepend it.
307
+ (LoraValue::List(mut a), b) => {
308
+ a.push(b);
309
+ LoraValue::List(a)
310
+ }
311
+ (a, LoraValue::List(mut b)) => {
312
+ b.insert(0, a);
313
+ LoraValue::List(b)
314
+ }
299
315
  // Temporal + Duration
300
316
  (LoraValue::Date(d), LoraValue::Duration(dur)) => match d.try_add_duration(&dur) {
301
317
  Some(out) => LoraValue::Date(out),
@@ -327,8 +343,15 @@ fn add_values(lhs: LoraValue, rhs: LoraValue) -> LoraValue {
327
343
  LoraValue::Null
328
344
  }
329
345
  (a, b) => match (a.as_f64(), b.as_f64()) {
330
- (Some(a), Some(b)) => LoraValue::Float(a + b),
331
- _ => LoraValue::Null,
346
+ (Some(x), Some(y)) => LoraValue::Float(x + y),
347
+ _ => {
348
+ set_eval_error(format!(
349
+ "Cannot add {} and {}",
350
+ crate::errors::value_kind(&a),
351
+ crate::errors::value_kind(&b)
352
+ ));
353
+ LoraValue::Null
354
+ }
332
355
  },
333
356
  }
334
357
  }
@@ -11,6 +11,7 @@ use crate::value::LoraValue;
11
11
  pub(super) fn dispatch(op: &str, args: &[LoraValue]) -> Option<LoraValue> {
12
12
  Some(match op {
13
13
  "upper" => unary_str(args, |s| s.to_uppercase()),
14
+ "prefix_end" => prefix_end(args),
14
15
  "lower" => unary_str(args, |s| s.to_lowercase()),
15
16
  "capitalize" => capitalize(args),
16
17
  "case" => case(args),
@@ -60,6 +61,29 @@ fn as_str(v: Option<&LoraValue>) -> Option<&str> {
60
61
  }
61
62
  }
62
63
 
64
+ /// The smallest string greater than every string starting with `s`: the
65
+ /// last character that can be incremented is, and what follows it is
66
+ /// dropped. `x STARTS WITH s` is `s <= x < string.prefix_end(s)`, which a
67
+ /// RANGE index answers. Null when there is no such string (the empty
68
+ /// prefix, or one of only U+10FFFF): every string at or above `s` matches.
69
+ fn prefix_end(args: &[LoraValue]) -> LoraValue {
70
+ let Some(s) = as_str(args.first()) else {
71
+ return LoraValue::Null;
72
+ };
73
+ let mut chars: Vec<char> = s.chars().collect();
74
+ while let Some(last) = chars.pop() {
75
+ let next = match last as u32 {
76
+ 0xD7FF => Some('\u{E000}'),
77
+ code => char::from_u32(code + 1),
78
+ };
79
+ if let Some(next) = next {
80
+ chars.push(next);
81
+ return LoraValue::String(chars.into_iter().collect());
82
+ }
83
+ }
84
+ LoraValue::Null
85
+ }
86
+
63
87
  fn unary_str(args: &[LoraValue], f: impl Fn(&str) -> String) -> LoraValue {
64
88
  match as_str(args.first()) {
65
89
  Some(s) => LoraValue::String(f(s)),