lora-python 0.21.0__tar.gz → 0.22.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. {lora_python-0.21.0 → lora_python-0.22.0}/Cargo.lock +19 -19
  2. {lora_python-0.21.0 → lora_python-0.22.0}/Cargo.toml +13 -13
  3. {lora_python-0.21.0 → lora_python-0.22.0}/PKG-INFO +1 -1
  4. lora_python-0.22.0/crates/lora-database/tests/timeouts.rs +211 -0
  5. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/cancel.rs +55 -0
  6. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/errors.rs +13 -0
  7. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/expr.rs +50 -9
  8. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/mod.rs +1 -1
  9. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/aggregation.rs +3 -5
  10. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/helpers.rs +75 -18
  11. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/immutable.rs +14 -9
  12. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/aggregate.rs +8 -7
  13. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/filter.rs +1 -1
  14. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/projection.rs +1 -1
  15. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/source.rs +8 -1
  16. {lora_python-0.21.0 → lora_python-0.22.0}/pyproject.toml +1 -1
  17. lora_python-0.21.0/crates/lora-database/tests/timeouts.rs +0 -88
  18. {lora_python-0.21.0 → lora_python-0.22.0}/LICENSE +0 -0
  19. {lora_python-0.21.0 → lora_python-0.22.0}/README.md +0 -0
  20. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-binding-buffer/Cargo.toml +0 -0
  21. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-binding-buffer/src/lib.rs +0 -0
  22. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-binding-buffer/src/stream.rs +0 -0
  23. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/.gitignore +0 -0
  24. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/Cargo.toml +0 -0
  25. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/LICENSE +0 -0
  26. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/README.md +0 -0
  27. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/build.rs +0 -0
  28. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  29. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/examples/basic.py +0 -0
  30. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/errors.rs +0 -0
  31. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/from_python.rs +0 -0
  32. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/gil.rs +0 -0
  33. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/lib.rs +0 -0
  34. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/stream.rs +0 -0
  35. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/to_python.rs +0 -0
  36. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/tests/test_async.py +0 -0
  37. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/tests/test_concurrency.py +0 -0
  38. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  39. {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  40. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/Cargo.toml +0 -0
  41. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
  42. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
  43. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
  44. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  45. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  46. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
  47. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
  48. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/errors.rs +0 -0
  49. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/lib.rs +0 -0
  50. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/resolved.rs +0 -0
  51. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/scope.rs +0 -0
  52. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/symbols.rs +0 -0
  53. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  54. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-ast/Cargo.toml +0 -0
  55. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-ast/src/ast.rs +0 -0
  56. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-ast/src/lib.rs +0 -0
  57. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-builtins-meta/Cargo.toml +0 -0
  58. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-builtins-meta/src/lib.rs +0 -0
  59. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/Cargo.toml +0 -0
  60. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/lib.rs +0 -0
  61. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/logical.rs +0 -0
  62. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/optimizer.rs +0 -0
  63. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/pattern.rs +0 -0
  64. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/physical.rs +0 -0
  65. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/plan_tree.rs +0 -0
  66. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/planner.rs +0 -0
  67. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/Cargo.toml +0 -0
  68. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/README.md +0 -0
  69. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/advanced.rs +0 -0
  70. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/concurrency_guard.rs +0 -0
  71. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/concurrent.rs +0 -0
  72. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/engine.rs +0 -0
  73. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/fixtures.rs +0 -0
  74. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/index_acceleration.rs +0 -0
  75. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/memory.rs +0 -0
  76. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/memory_baseline.json +0 -0
  77. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/perf_smoke.rs +0 -0
  78. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
  79. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/query_implementations.rs +0 -0
  80. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/realistic.rs +0 -0
  81. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/scale.rs +0 -0
  82. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/temporal_spatial.rs +0 -0
  83. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/wal.rs +0 -0
  84. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/bulk_probe.rs +0 -0
  85. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/carried_probe.rs +0 -0
  86. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/heap_probe.rs +0 -0
  87. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/keyset_probe.rs +0 -0
  88. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/optional_probe.rs +0 -0
  89. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/perf_probe.rs +0 -0
  90. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/pushdown_probe.rs +0 -0
  91. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/changes/build.rs +0 -0
  92. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/changes/history.rs +0 -0
  93. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/changes/mod.rs +0 -0
  94. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/builder.rs +0 -0
  95. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/changes.rs +0 -0
  96. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/compile.rs +0 -0
  97. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/execute.rs +0 -0
  98. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/explain.rs +0 -0
  99. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/graph_api.rs +0 -0
  100. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/mod.rs +0 -0
  101. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/occ.rs +0 -0
  102. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/procedures.rs +0 -0
  103. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/profile.rs +0 -0
  104. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/pull_mode.rs +0 -0
  105. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/replay.rs +0 -0
  106. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/row_projection.rs +0 -0
  107. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/schema.rs +0 -0
  108. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/show_pipeline.rs +0 -0
  109. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/stream.rs +0 -0
  110. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/write_guard.rs +0 -0
  111. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/durable_io.rs +0 -0
  112. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/error.rs +0 -0
  113. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/explain.rs +0 -0
  114. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/io.rs +0 -0
  115. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/lib.rs +0 -0
  116. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/live_store.rs +0 -0
  117. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/named.rs +0 -0
  118. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/plan_cache.rs +0 -0
  119. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/snapshot/json.rs +0 -0
  120. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/snapshot/mod.rs +0 -0
  121. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/snapshot/store.rs +0 -0
  122. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/stream.rs +0 -0
  123. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/transaction.rs +0 -0
  124. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/admin.rs +0 -0
  125. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive/format.rs +0 -0
  126. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  127. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  128. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive/worker.rs +0 -0
  129. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
  130. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive.rs +0 -0
  131. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/mod.rs +0 -0
  132. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/write_scope.rs +0 -0
  133. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/advanced_queries.rs +0 -0
  134. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/aggregation.rs +0 -0
  135. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/and_or_short_circuit.rs +0 -0
  136. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/backend_stub.rs +0 -0
  137. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/bbox_antimeridian.rs +0 -0
  138. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/binary.rs +0 -0
  139. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/borrowed_variable_reads.rs +0 -0
  140. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
  141. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/call_subquery_writes.rs +0 -0
  142. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/carried_value_sharing.rs +0 -0
  143. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/change_feed.rs +0 -0
  144. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/comparison_ordering.rs +0 -0
  145. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/constraints.rs +0 -0
  146. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/create.rs +0 -0
  147. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/cypher_compat.rs +0 -0
  148. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/docs_examples.rs +0 -0
  149. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/early_limit.rs +0 -0
  150. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/empty_ranges.rs +0 -0
  151. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/error_messages.rs +0 -0
  152. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/errors.rs +0 -0
  153. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/explain_estimates.rs +0 -0
  154. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/explain_profile.rs +0 -0
  155. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/expressions.rs +0 -0
  156. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/foreach.rs +0 -0
  157. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/fulltext_index.rs +0 -0
  158. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/fulltext_list_properties.rs +0 -0
  159. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/functions_extended.rs +0 -0
  160. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/index_acceleration.rs +0 -0
  161. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/invariants.rs +0 -0
  162. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/limit_skip_counts.rs +0 -0
  163. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/managed_snapshots.rs +0 -0
  164. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/match.rs +0 -0
  165. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/merge.rs +0 -0
  166. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/merge_bound_end.rs +0 -0
  167. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/null_properties_and_deferred_existence.rs +0 -0
  168. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/optional_match_correlated.rs +0 -0
  169. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/order_by_index.rs +0 -0
  170. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/order_limit_semantics.rs +0 -0
  171. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/ordering.rs +0 -0
  172. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/parameters.rs +0 -0
  173. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/parser.rs +0 -0
  174. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/paths.rs +0 -0
  175. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/pattern_subquery_property_seek.rs +0 -0
  176. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/pattern_subquery_rel_properties.rs +0 -0
  177. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/pattern_subquery_scope.rs +0 -0
  178. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/pattern_subquery_var_length.rs +0 -0
  179. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/planner_pushdown.rs +0 -0
  180. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/procedure_yield.rs +0 -0
  181. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/projection.rs +0 -0
  182. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/range_scan_other_kinds.rs +0 -0
  183. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/scale.rs +0 -0
  184. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/schema.rs +0 -0
  185. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/schema_in_transaction.rs +0 -0
  186. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/seeds.rs +0 -0
  187. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/shared_index_value_writes.rs +0 -0
  188. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/snapshot.rs +0 -0
  189. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/sort_limit_probe.rs +0 -0
  190. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/spatial.rs +0 -0
  191. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/starts_with_range_seek.rs +0 -0
  192. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/string_number_addition.rs +0 -0
  193. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal.rs +0 -0
  194. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_constructor_functions.rs +0 -0
  195. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_constructors.rs +0 -0
  196. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_map_components.rs +0 -0
  197. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_range_index.rs +0 -0
  198. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_strings.rs +0 -0
  199. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_time_zones.rs +0 -0
  200. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_zone_accessors.rs +0 -0
  201. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/test_helpers.rs +0 -0
  202. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/transactions.rs +0 -0
  203. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/types_advanced.rs +0 -0
  204. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/union.rs +0 -0
  205. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/unknown_names.rs +0 -0
  206. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
  207. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/update.rs +0 -0
  208. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/var_length_bound_endpoint.rs +0 -0
  209. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/var_length_hop_ranges.rs +0 -0
  210. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/vector_index.rs +0 -0
  211. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/vectors.rs +0 -0
  212. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/wal.rs +0 -0
  213. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/where_clause.rs +0 -0
  214. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/with.rs +0 -0
  215. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/with_predicates.rs +0 -0
  216. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/write_results.rs +0 -0
  217. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/write_scaling.rs +0 -0
  218. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/Cargo.toml +0 -0
  219. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/binops.rs +0 -0
  220. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
  221. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
  222. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
  223. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
  224. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
  225. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
  226. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/index_ns.rs +0 -0
  227. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
  228. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/list.rs +0 -0
  229. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
  230. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
  231. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
  232. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
  233. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
  234. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
  235. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
  236. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
  237. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/temporal_build.rs +0 -0
  238. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
  239. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
  240. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
  241. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
  242. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
  243. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/errors.rs +0 -0
  244. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/functions.rs +0 -0
  245. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/point.rs +0 -0
  246. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/regex.rs +0 -0
  247. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/vector.rs +0 -0
  248. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/mod.rs +0 -0
  249. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/mutable.rs +0 -0
  250. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/optional.rs +0 -0
  251. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/sort.rs +0 -0
  252. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/lib.rs +0 -0
  253. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/profile.rs +0 -0
  254. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
  255. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/columns.rs +0 -0
  256. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/context.rs +0 -0
  257. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/expand.rs +0 -0
  258. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/hydration.rs +0 -0
  259. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/mod.rs +0 -0
  260. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/mutable.rs +0 -0
  261. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/optional.rs +0 -0
  262. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/path.rs +0 -0
  263. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/scan.rs +0 -0
  264. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/shape.rs +0 -0
  265. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/sort.rs +0 -0
  266. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/tests.rs +0 -0
  267. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/traits.rs +0 -0
  268. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/union.rs +0 -0
  269. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/value.rs +0 -0
  270. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/tests/error_messages.rs +0 -0
  271. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/Cargo.toml +0 -0
  272. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/csv.rs +0 -0
  273. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/format.rs +0 -0
  274. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/json_array.rs +0 -0
  275. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/jsonl.rs +0 -0
  276. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/lib.rs +0 -0
  277. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/mapping.rs +0 -0
  278. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/value_json.rs +0 -0
  279. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/Cargo.toml +0 -0
  280. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/cypher.pest +0 -0
  281. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/errors.rs +0 -0
  282. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/lib.rs +0 -0
  283. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/clauses.rs +0 -0
  284. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/expressions.rs +0 -0
  285. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/literals.rs +0 -0
  286. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/mod.rs +0 -0
  287. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/patterns.rs +0 -0
  288. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/query.rs +0 -0
  289. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/schema.rs +0 -0
  290. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/tests.rs +0 -0
  291. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/util.rs +0 -0
  292. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/tests/error_messages.rs +0 -0
  293. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/Cargo.toml +0 -0
  294. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/body.rs +0 -0
  295. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/codec.rs +0 -0
  296. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/columnar.rs +0 -0
  297. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/envelope.rs +0 -0
  298. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/errors.rs +0 -0
  299. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/format.rs +0 -0
  300. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/lib.rs +0 -0
  301. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/options.rs +0 -0
  302. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/tests.rs +0 -0
  303. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/transform.rs +0 -0
  304. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/view.rs +0 -0
  305. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  306. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/Cargo.toml +0 -0
  307. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/codec.rs +0 -0
  308. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/intern.rs +0 -0
  309. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/lib.rs +0 -0
  310. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/lock_table.rs +0 -0
  311. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/chunked_vec.rs +0 -0
  312. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
  313. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/constraint_enforce.rs +0 -0
  314. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/cow.rs +0 -0
  315. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/entity_index_store.rs +0 -0
  316. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/fulltext_index.rs +0 -0
  317. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/graph.rs +0 -0
  318. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/hnsw.rs +0 -0
  319. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/id_set.rs +0 -0
  320. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/impls.rs +0 -0
  321. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/index_catalog.rs +0 -0
  322. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/mem_report.rs +0 -0
  323. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/mod.rs +0 -0
  324. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/point_index.rs +0 -0
  325. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/property_index.rs +0 -0
  326. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
  327. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/snapshot.rs +0 -0
  328. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/sorted_property_index.rs +0 -0
  329. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/stats.rs +0 -0
  330. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/tests.rs +0 -0
  331. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/text_index.rs +0 -0
  332. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/vector_index.rs +0 -0
  333. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/mutation.rs +0 -0
  334. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/snapshot.rs +0 -0
  335. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/traits.rs +0 -0
  336. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/binary/mod.rs +0 -0
  337. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/binary/tests.rs +0 -0
  338. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/binary/traits.rs +0 -0
  339. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/binary/types.rs +0 -0
  340. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/graph.rs +0 -0
  341. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/mod.rs +0 -0
  342. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/property_map.rs +0 -0
  343. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/property_value.rs +0 -0
  344. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/bbox.rs +0 -0
  345. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  346. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/mod.rs +0 -0
  347. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/point.rs +0 -0
  348. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  349. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  350. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  351. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/date.rs +0 -0
  352. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
  353. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/duration.rs +0 -0
  354. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/format.rs +0 -0
  355. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  356. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  357. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/time.rs +0 -0
  358. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/zone.rs +0 -0
  359. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/vector/build.rs +0 -0
  360. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/vector/mod.rs +0 -0
  361. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  362. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/vector/tests.rs +0 -0
  363. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/vector/types.rs +0 -0
  364. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/tests/error_messages.rs +0 -0
  365. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/Cargo.toml +0 -0
  366. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/codec/decode.rs +0 -0
  367. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/codec/encode.rs +0 -0
  368. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/codec/format.rs +0 -0
  369. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/codec/mod.rs +0 -0
  370. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/codec/tests.rs +0 -0
  371. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/config.rs +0 -0
  372. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/dir.rs +0 -0
  373. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/errors.rs +0 -0
  374. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/history.rs +0 -0
  375. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/io.rs +0 -0
  376. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/lib.rs +0 -0
  377. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/lock.rs +0 -0
  378. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/lsn.rs +0 -0
  379. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/record.rs +0 -0
  380. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/recorder/errors.rs +0 -0
  381. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  382. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/recorder/mod.rs +0 -0
  383. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/recorder/recorder.rs +0 -0
  384. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/recorder/tests.rs +0 -0
  385. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/replay.rs +0 -0
  386. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/segment.rs +0 -0
  387. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/testing.rs +0 -0
  388. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
  389. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/wal/mod.rs +0 -0
  390. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/wal/tests.rs +0 -0
  391. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/wal/wal.rs +0 -0
  392. {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/tests/error_messages.rs +0 -0
  393. {lora_python-0.21.0 → lora_python-0.22.0}/python/lora_python/__init__.py +0 -0
  394. {lora_python-0.21.0 → lora_python-0.22.0}/python/lora_python/_async.py +0 -0
  395. {lora_python-0.21.0 → lora_python-0.22.0}/python/lora_python/_native.pyi +0 -0
  396. {lora_python-0.21.0 → lora_python-0.22.0}/python/lora_python/py.typed +0 -0
  397. {lora_python-0.21.0 → lora_python-0.22.0}/python/lora_python/types.py +0 -0
@@ -854,7 +854,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
854
854
 
855
855
  [[package]]
856
856
  name = "lora-analyzer"
857
- version = "0.21.0"
857
+ version = "0.22.0"
858
858
  dependencies = [
859
859
  "lora-ast",
860
860
  "lora-builtins-meta",
@@ -865,14 +865,14 @@ dependencies = [
865
865
 
866
866
  [[package]]
867
867
  name = "lora-ast"
868
- version = "0.21.0"
868
+ version = "0.22.0"
869
869
  dependencies = [
870
870
  "smallvec 2.0.0-alpha.12",
871
871
  ]
872
872
 
873
873
  [[package]]
874
874
  name = "lora-binding-buffer"
875
- version = "0.21.0"
875
+ version = "0.22.0"
876
876
  dependencies = [
877
877
  "lora-database",
878
878
  "lora-store",
@@ -880,11 +880,11 @@ dependencies = [
880
880
 
881
881
  [[package]]
882
882
  name = "lora-builtins-meta"
883
- version = "0.21.0"
883
+ version = "0.22.0"
884
884
 
885
885
  [[package]]
886
886
  name = "lora-compiler"
887
- version = "0.21.0"
887
+ version = "0.22.0"
888
888
  dependencies = [
889
889
  "lora-analyzer",
890
890
  "lora-ast",
@@ -893,7 +893,7 @@ dependencies = [
893
893
 
894
894
  [[package]]
895
895
  name = "lora-database"
896
- version = "0.21.0"
896
+ version = "0.22.0"
897
897
  dependencies = [
898
898
  "anyhow",
899
899
  "chacha20poly1305",
@@ -918,7 +918,7 @@ dependencies = [
918
918
 
919
919
  [[package]]
920
920
  name = "lora-executor"
921
- version = "0.21.0"
921
+ version = "0.22.0"
922
922
  dependencies = [
923
923
  "blake3",
924
924
  "crc32fast",
@@ -941,7 +941,7 @@ dependencies = [
941
941
 
942
942
  [[package]]
943
943
  name = "lora-ffi"
944
- version = "0.21.0"
944
+ version = "0.22.0"
945
945
  dependencies = [
946
946
  "anyhow",
947
947
  "lora-binding-buffer",
@@ -953,7 +953,7 @@ dependencies = [
953
953
 
954
954
  [[package]]
955
955
  name = "lora-io"
956
- version = "0.21.0"
956
+ version = "0.22.0"
957
957
  dependencies = [
958
958
  "lora-executor",
959
959
  "lora-store",
@@ -964,7 +964,7 @@ dependencies = [
964
964
 
965
965
  [[package]]
966
966
  name = "lora-node"
967
- version = "0.21.0"
967
+ version = "0.22.0"
968
968
  dependencies = [
969
969
  "anyhow",
970
970
  "lora-binding-buffer",
@@ -979,7 +979,7 @@ dependencies = [
979
979
 
980
980
  [[package]]
981
981
  name = "lora-parser"
982
- version = "0.21.0"
982
+ version = "0.22.0"
983
983
  dependencies = [
984
984
  "lora-ast",
985
985
  "pest",
@@ -990,7 +990,7 @@ dependencies = [
990
990
 
991
991
  [[package]]
992
992
  name = "lora-python"
993
- version = "0.21.0"
993
+ version = "0.22.0"
994
994
  dependencies = [
995
995
  "anyhow",
996
996
  "lora-binding-buffer",
@@ -1003,7 +1003,7 @@ dependencies = [
1003
1003
 
1004
1004
  [[package]]
1005
1005
  name = "lora-query-wasm"
1006
- version = "0.21.0"
1006
+ version = "0.22.0"
1007
1007
  dependencies = [
1008
1008
  "console_error_panic_hook",
1009
1009
  "js-sys",
@@ -1017,7 +1017,7 @@ dependencies = [
1017
1017
 
1018
1018
  [[package]]
1019
1019
  name = "lora-server"
1020
- version = "0.21.0"
1020
+ version = "0.22.0"
1021
1021
  dependencies = [
1022
1022
  "anyhow",
1023
1023
  "axum",
@@ -1032,7 +1032,7 @@ dependencies = [
1032
1032
 
1033
1033
  [[package]]
1034
1034
  name = "lora-snapshot"
1035
- version = "0.21.0"
1035
+ version = "0.22.0"
1036
1036
  dependencies = [
1037
1037
  "argon2",
1038
1038
  "blake3",
@@ -1047,7 +1047,7 @@ dependencies = [
1047
1047
 
1048
1048
  [[package]]
1049
1049
  name = "lora-store"
1050
- version = "0.21.0"
1050
+ version = "0.22.0"
1051
1051
  dependencies = [
1052
1052
  "crc32fast",
1053
1053
  "jiff",
@@ -1062,7 +1062,7 @@ dependencies = [
1062
1062
 
1063
1063
  [[package]]
1064
1064
  name = "lora-wal"
1065
- version = "0.21.0"
1065
+ version = "0.22.0"
1066
1066
  dependencies = [
1067
1067
  "crc32fast",
1068
1068
  "lora-store",
@@ -1072,7 +1072,7 @@ dependencies = [
1072
1072
 
1073
1073
  [[package]]
1074
1074
  name = "lora-wasm"
1075
- version = "0.21.0"
1075
+ version = "0.22.0"
1076
1076
  dependencies = [
1077
1077
  "anyhow",
1078
1078
  "console_error_panic_hook",
@@ -1088,7 +1088,7 @@ dependencies = [
1088
1088
 
1089
1089
  [[package]]
1090
1090
  name = "lora_ruby"
1091
- version = "0.21.0"
1091
+ version = "0.22.0"
1092
1092
  dependencies = [
1093
1093
  "anyhow",
1094
1094
  "lora-database",
@@ -4,7 +4,7 @@ resolver = "2"
4
4
 
5
5
  [workspace.package]
6
6
  edition = "2021"
7
- version = "0.21.0"
7
+ version = "0.22.0"
8
8
  license = "BUSL-1.1"
9
9
  authors = ["LoraDB, Inc."]
10
10
  repository = "https://github.com/lora-db/lora"
@@ -15,18 +15,18 @@ rust-version = "1.87"
15
15
  # Internal crates — versions are kept in lockstep with [workspace.package].version
16
16
  # by `scripts/sync-versions.mjs`. Both `path` and `version` are set so that
17
17
  # `cargo publish` works (crates.io cannot resolve path-only deps).
18
- lora-ast = { path = "crates/lora-ast", version = "=0.21.0" }
19
- lora-parser = { path = "crates/lora-parser", version = "=0.21.0" }
20
- lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.21.0" }
21
- lora-analyzer = { path = "crates/lora-analyzer", version = "=0.21.0" }
22
- lora-compiler = { path = "crates/lora-compiler", version = "=0.21.0" }
23
- lora-store = { path = "crates/lora-store", version = "=0.21.0" }
24
- lora-snapshot = { path = "crates/lora-snapshot", version = "=0.21.0", default-features = false }
25
- lora-io = { path = "crates/lora-io", version = "=0.21.0" }
26
- lora-wal = { path = "crates/lora-wal", version = "=0.21.0" }
27
- lora-executor = { path = "crates/lora-executor", version = "=0.21.0", default-features = false }
28
- lora-database = { path = "crates/lora-database", version = "=0.21.0" }
29
- lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.21.0" }
18
+ lora-ast = { path = "crates/lora-ast", version = "=0.22.0" }
19
+ lora-parser = { path = "crates/lora-parser", version = "=0.22.0" }
20
+ lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.22.0" }
21
+ lora-analyzer = { path = "crates/lora-analyzer", version = "=0.22.0" }
22
+ lora-compiler = { path = "crates/lora-compiler", version = "=0.22.0" }
23
+ lora-store = { path = "crates/lora-store", version = "=0.22.0" }
24
+ lora-snapshot = { path = "crates/lora-snapshot", version = "=0.22.0", default-features = false }
25
+ lora-io = { path = "crates/lora-io", version = "=0.22.0" }
26
+ lora-wal = { path = "crates/lora-wal", version = "=0.22.0" }
27
+ lora-executor = { path = "crates/lora-executor", version = "=0.22.0", default-features = false }
28
+ lora-database = { path = "crates/lora-database", version = "=0.22.0" }
29
+ lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.22.0" }
30
30
 
31
31
  # External crates.
32
32
  anyhow = "1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lora-python
3
- Version: 0.21.0
3
+ Version: 0.22.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -0,0 +1,211 @@
1
+ //! Query deadlines and cancellation reach every execution path.
2
+ //!
3
+ //! Regression coverage for two gaps: writes whose input runs on the pull
4
+ //! pipeline never checked their deadline, and a bounded write that timed
5
+ //! out on the in-place fast path could leave a partial write behind.
6
+
7
+ mod test_helpers;
8
+
9
+ use std::collections::BTreeMap;
10
+ use std::time::{Duration, Instant};
11
+
12
+ use lora_database::{CancellableDeadline, LoraErrorCode};
13
+ use test_helpers::TestDb;
14
+
15
+ const N: usize = 20_000;
16
+
17
+ fn seeded() -> TestDb {
18
+ let db = TestDb::new();
19
+ db.run(&format!("UNWIND range(1, {N}) AS i CREATE (:A {{i: i}})"));
20
+ db.run(&format!("UNWIND range(1, {N}) AS i CREATE (:B {{i: i}})"));
21
+ db
22
+ }
23
+
24
+ fn timed_out(db: &TestDb, query: &str, timeout: Duration) -> Duration {
25
+ let start = Instant::now();
26
+ let err = db
27
+ .service
28
+ .execute_with_params_timeout(query, None, BTreeMap::new(), timeout)
29
+ .expect_err("query should time out");
30
+ assert_eq!(err.code(), LoraErrorCode::Timeout, "{err}");
31
+ start.elapsed()
32
+ }
33
+
34
+ #[test]
35
+ fn streaming_write_honours_its_deadline_and_leaves_nothing() {
36
+ let db = seeded();
37
+ // CREATE over a 4e8-row cartesian product runs on the pull pipeline.
38
+ let took = timed_out(
39
+ &db,
40
+ "MATCH (a:A), (b:B) CREATE (:Pair)",
41
+ Duration::from_millis(50),
42
+ );
43
+ assert!(took < Duration::from_secs(2), "took {took:?}");
44
+ db.assert_count("MATCH (p:Pair) RETURN p", 0);
45
+ // The writer lock was released.
46
+ db.run("CREATE (:After)");
47
+ db.assert_count("MATCH (x:After) RETURN x", 1);
48
+ }
49
+
50
+ #[test]
51
+ fn filter_that_never_yields_still_times_out() {
52
+ let db = seeded();
53
+ // The condition reads both variables, so it cannot be pushed down to
54
+ // either scan (a lone `a.i = -1` now becomes an empty index seek) and
55
+ // the filter really does reject all 4e8 rows of the product.
56
+ let took = timed_out(
57
+ &db,
58
+ "MATCH (a:A), (b:B) WHERE a.i + b.i = -1 SET a.hit = true",
59
+ Duration::from_millis(50),
60
+ );
61
+ assert!(took < Duration::from_secs(2), "took {took:?}");
62
+ }
63
+
64
+ #[test]
65
+ fn cancellation_stops_a_running_query() {
66
+ let db = std::sync::Arc::new(seeded());
67
+ let mut handle = CancellableDeadline::new(None);
68
+ let deadline = handle.deadline();
69
+ let shared = db.clone();
70
+ let worker = std::thread::spawn(move || {
71
+ let service = &shared.service;
72
+ service.execute_with_params_deadline(
73
+ "MATCH (a:A), (b:B) RETURN count(*) AS c",
74
+ None,
75
+ BTreeMap::new(),
76
+ deadline,
77
+ )
78
+ });
79
+ std::thread::sleep(Duration::from_millis(50));
80
+ let start = Instant::now();
81
+ handle.cancel();
82
+ let err = worker
83
+ .join()
84
+ .unwrap()
85
+ .expect_err("cancelled query must fail");
86
+ assert_eq!(err.code(), LoraErrorCode::Timeout);
87
+ assert!(start.elapsed() < Duration::from_secs(2));
88
+ }
89
+
90
+ // ---------------------------------------------------------------------------
91
+ // Deadlines inside expression evaluation
92
+ // ---------------------------------------------------------------------------
93
+ //
94
+ // `@loradb/lora-graphql` compiles relationship-filter quantifiers to
95
+ // `size([(a)-[:R]->(b) WHERE <pred> | 1]) > 0`, nested for nested filters.
96
+ // Those comprehensions run inside one expression evaluation, below the
97
+ // operator boundaries the pipeline checks, so a three-level nested filter
98
+ // once ran 15 s past a 1 s deadline and returned rows.
99
+
100
+ /// ~5k festivals, ~2k users, ~23k user->festival and ~4k user->user
101
+ /// FOLLOWS edges, spread deterministically.
102
+ fn follows_graph() -> TestDb {
103
+ let db = TestDb::new();
104
+ db.run("CREATE INDEX FOR (n:Festival) ON (n.i)");
105
+ db.run("CREATE INDEX FOR (n:User) ON (n.i)");
106
+ db.run("UNWIND range(0, 4999) AS i CREATE (:Festival {i: i, key: 'f' + toString(i)})");
107
+ db.run(
108
+ "UNWIND range(0, 1999) AS i \
109
+ CREATE (:User {i: i, key: 'u' + toString(i), name: 'user ' + toString(i)})",
110
+ );
111
+ db.run(
112
+ "UNWIND range(0, 22999) AS i \
113
+ MATCH (u:User {i: (i * 7919) % 2000}), (f:Festival {i: (i * 104729) % 5000}) \
114
+ CREATE (u)-[:FOLLOWS]->(f)",
115
+ );
116
+ db.run(
117
+ "UNWIND range(0, 3999) AS i \
118
+ MATCH (a:User {i: (i * 7919) % 2000}), (b:User {i: (i * 6007 + 1) % 2000}) \
119
+ CREATE (a)-[:FOLLOWS]->(b)",
120
+ );
121
+ db
122
+ }
123
+
124
+ /// No user name contains 'zz', so every level of the nested filter runs
125
+ /// to completion: about a second of work in a release build.
126
+ const NESTED_FILTER: &str = "MATCH (f:Festival) \
127
+ WHERE size([(f)<-[:FOLLOWS]-(u:User) \
128
+ WHERE size([(u)-[:FOLLOWS]->(g:Festival) \
129
+ WHERE size([(g)<-[:FOLLOWS]-(w:User) WHERE w.name CONTAINS 'zz' | 1]) > 0 \
130
+ | 1]) > 0 \
131
+ | 1]) > 0 \
132
+ RETURN f.key";
133
+
134
+ #[test]
135
+ fn nested_pattern_comprehension_honours_its_deadline() {
136
+ let db = follows_graph();
137
+ let timeout = Duration::from_millis(150);
138
+ // Without a LIMIT the read runs on the buffered executor, whose filter
139
+ // loop never checked the deadline; with one it streams. Both must stop.
140
+ for query in [
141
+ NESTED_FILTER.to_string(),
142
+ format!("{NESTED_FILTER} ORDER BY f.key LIMIT 10"),
143
+ format!("{NESTED_FILTER} LIMIT 1"),
144
+ ] {
145
+ let took = timed_out(&db, &query, timeout);
146
+ assert!(
147
+ took < timeout + Duration::from_millis(150),
148
+ "{query}: took {took:?} for a {timeout:?} deadline"
149
+ );
150
+ }
151
+ }
152
+
153
+ #[test]
154
+ fn nested_pattern_comprehension_stops_on_cancel() {
155
+ let db = std::sync::Arc::new(follows_graph());
156
+ let mut handle = CancellableDeadline::new(None);
157
+ let deadline = handle.deadline();
158
+ let shared = db.clone();
159
+ let worker = std::thread::spawn(move || {
160
+ shared
161
+ .service
162
+ .execute_with_params_deadline(NESTED_FILTER, None, BTreeMap::new(), deadline)
163
+ });
164
+ std::thread::sleep(Duration::from_millis(50));
165
+ let start = Instant::now();
166
+ handle.cancel();
167
+ let err = worker
168
+ .join()
169
+ .unwrap()
170
+ .expect_err("cancelled query must fail");
171
+ assert_eq!(err.code(), LoraErrorCode::Timeout);
172
+ assert!(
173
+ start.elapsed() < Duration::from_millis(150),
174
+ "stopped {:?} after cancel",
175
+ start.elapsed()
176
+ );
177
+ }
178
+
179
+ #[test]
180
+ fn list_comprehension_reduce_and_quantifiers_honour_their_deadline() {
181
+ let db = TestDb::new();
182
+ let timeout = Duration::from_millis(200);
183
+ for query in [
184
+ // One row, one expression: no operator boundary inside the work.
185
+ "RETURN size([x IN range(1, 3000) WHERE size([y IN range(1, 3000) WHERE x * y = -1]) > 0]) AS n",
186
+ "RETURN reduce(acc = 0, x IN range(1, 3000) | acc + size([y IN range(1, 3000) WHERE x = y])) AS n",
187
+ "RETURN any(x IN range(1, 3000) WHERE any(y IN range(1, 3000) WHERE x * y = -1)) AS n",
188
+ "RETURN all(x IN range(1, 3000) WHERE none(y IN range(1, 3000) WHERE x * y = -1)) AS n",
189
+ ] {
190
+ let took = timed_out(&db, query, timeout);
191
+ assert!(
192
+ took < timeout + Duration::from_millis(150),
193
+ "{query}: took {took:?} for a {timeout:?} deadline"
194
+ );
195
+ }
196
+ }
197
+
198
+ #[test]
199
+ fn cartesian_match_stops_close_to_its_deadline() {
200
+ let db = seeded();
201
+ let timeout = Duration::from_millis(300);
202
+ let took = timed_out(
203
+ &db,
204
+ "MATCH (a:A), (b:B) WHERE a.i + b.i = -1 RETURN a.i",
205
+ timeout,
206
+ );
207
+ assert!(
208
+ took < timeout + Duration::from_millis(150),
209
+ "took {took:?} for a {timeout:?} deadline"
210
+ );
211
+ }
@@ -108,8 +108,20 @@ pub(crate) fn is_cancelled(deadline: Instant) -> bool {
108
108
 
109
109
  thread_local! {
110
110
  static ACTIVE: std::cell::Cell<Option<Instant>> = const { std::cell::Cell::new(None) };
111
+ /// Iterations of expression-level loops since the last clock read.
112
+ static EVAL_TICK: std::cell::Cell<u32> = const { std::cell::Cell::new(0) };
113
+ /// Set once an expression-level check saw the active deadline pass
114
+ /// (or its query cancelled). Sticky for the rest of the query on this
115
+ /// thread so every enclosing loop unwinds at its next iteration.
116
+ static EVAL_TRIPPED: std::cell::Cell<bool> = const { std::cell::Cell::new(false) };
111
117
  }
112
118
 
119
+ /// Expression-level loop iterations between two clock reads. One
120
+ /// iteration is at least a row clone plus a storage lookup, so 256 of them
121
+ /// cost tens of microseconds: the check stays far below 1% of the work
122
+ /// while a deadline is still noticed within a millisecond or so.
123
+ const EVAL_CHECK_STRIDE: u32 = 256;
124
+
113
125
  /// Makes a query's deadline visible to everything that runs on this
114
126
  /// thread while the query executes, including pull pipelines that
115
127
  /// operators build lazily mid-query (`OPTIONAL MATCH`, `CALL {}`) and
@@ -123,6 +135,10 @@ pub(crate) struct DeadlineScope {
123
135
  impl DeadlineScope {
124
136
  pub(crate) fn enter(deadline: Option<Instant>) -> Self {
125
137
  let prev = ACTIVE.with(|a| a.get());
138
+ if prev.is_none() {
139
+ // A new query on this thread: forget a trip left by the last.
140
+ EVAL_TRIPPED.with(|t| t.set(false));
141
+ }
126
142
  ACTIVE.with(|a| a.set(deadline.or(prev)));
127
143
  Self { prev }
128
144
  }
@@ -132,7 +148,46 @@ impl Drop for DeadlineScope {
132
148
  fn drop(&mut self) {
133
149
  let prev = self.prev;
134
150
  ACTIVE.with(|a| a.set(prev));
151
+ if prev.is_none() {
152
+ EVAL_TRIPPED.with(|t| t.set(false));
153
+ }
154
+ }
155
+ }
156
+
157
+ /// Cheap per-iteration check for loops that run inside one expression
158
+ /// evaluation (pattern and list comprehensions, `reduce`, list
159
+ /// quantifiers, pattern expansion). Those loops sit below every operator
160
+ /// boundary the pipeline checks, so without this a single `WHERE` could
161
+ /// run arbitrarily far past the query's deadline. Reads the clock every
162
+ /// [`EVAL_CHECK_STRIDE`] calls; once it fires it stays fired for the rest
163
+ /// of the query, and `eval_expr_result` then reports the timeout.
164
+ #[inline]
165
+ pub(crate) fn eval_deadline_hit() -> bool {
166
+ if EVAL_TRIPPED.with(|t| t.get()) {
167
+ return true;
135
168
  }
169
+ let tick = EVAL_TICK.with(|t| {
170
+ let n = t.get().wrapping_add(1);
171
+ t.set(n);
172
+ n
173
+ });
174
+ if !tick.is_multiple_of(EVAL_CHECK_STRIDE) {
175
+ return false;
176
+ }
177
+ match active_deadline() {
178
+ Some(deadline) if deadline_reached(deadline) => {
179
+ EVAL_TRIPPED.with(|t| t.set(true));
180
+ true
181
+ }
182
+ _ => false,
183
+ }
184
+ }
185
+
186
+ /// Whether an expression on this thread stopped early because the active
187
+ /// query's deadline passed: its value is incomplete and must not be used.
188
+ #[inline]
189
+ pub(crate) fn eval_tripped() -> bool {
190
+ EVAL_TRIPPED.with(|t| t.get())
136
191
  }
137
192
 
138
193
  /// The deadline of the query currently executing on this thread, if any.
@@ -106,6 +106,19 @@ pub enum ExecutorError {
106
106
 
107
107
  pub type ExecResult<T> = Result<T, ExecutorError>;
108
108
 
109
+ impl ExecutorError {
110
+ /// The error for a failed expression evaluation: the query timeout
111
+ /// when the expression stopped on the deadline, a runtime error
112
+ /// carrying its message otherwise.
113
+ pub(crate) fn from_eval(message: String) -> Self {
114
+ if message == crate::eval::DEADLINE_EXCEEDED {
115
+ ExecutorError::QueryTimeout
116
+ } else {
117
+ ExecutorError::RuntimeError(message)
118
+ }
119
+ }
120
+ }
121
+
109
122
  pub fn value_kind(value: &LoraValue) -> String {
110
123
  match value {
111
124
  LoraValue::Null => "null".into(),
@@ -25,6 +25,13 @@ use super::binops::{eval_binary, eval_in, eval_unary, value_eq};
25
25
  use super::errors::{clear_eval_error, take_eval_error};
26
26
  use super::functions::eval_function;
27
27
 
28
+ /// The message [`eval_expr_result`] fails with when an expression stopped
29
+ /// because the query's deadline passed or the query was cancelled.
30
+ /// [`crate::ExecutorError`] maps it back to `QueryTimeout`.
31
+ pub const DEADLINE_EXCEEDED: &str = "query deadline exceeded";
32
+
33
+ use crate::cancel::eval_deadline_hit;
34
+
28
35
  pub struct EvalContext<'a, S: GraphStorage> {
29
36
  pub storage: &'a S,
30
37
  pub params: &'a BTreeMap<String, LoraValue>,
@@ -125,6 +132,9 @@ pub fn eval_expr<S: GraphStorage>(
125
132
  let mut inner_row = row.clone();
126
133
  let mut count = 0usize;
127
134
  for item in items {
135
+ if eval_deadline_hit() {
136
+ return LoraValue::Null;
137
+ }
128
138
  inner_row.insert_inline(*variable, item);
129
139
  if eval_expr(predicate, &inner_row, ctx).is_truthy() {
130
140
  count += 1;
@@ -154,6 +164,9 @@ pub fn eval_expr<S: GraphStorage>(
154
164
  let mut result = Vec::with_capacity(items.len());
155
165
  let mut inner_row = row.clone();
156
166
  for item in items {
167
+ if eval_deadline_hit() {
168
+ return LoraValue::Null;
169
+ }
157
170
  // When no map_expr, we need the item after filter —
158
171
  // stash it in the row binding and read it back if kept.
159
172
  inner_row.insert_inline(*variable, item);
@@ -194,6 +207,9 @@ pub fn eval_expr<S: GraphStorage>(
194
207
  let mut inner_row = row.clone();
195
208
  let mut acc = init_val;
196
209
  for item in items {
210
+ if eval_deadline_hit() {
211
+ return LoraValue::Null;
212
+ }
197
213
  inner_row.insert_inline(*accumulator, acc);
198
214
  inner_row.insert_inline(*variable, item);
199
215
  acc = eval_expr(expr, &inner_row, ctx);
@@ -409,6 +425,9 @@ fn eval_exists_subquery<S: GraphStorage>(
409
425
  let is_last_part = part_idx + 1 == pattern.parts.len();
410
426
  let mut next_rows = Vec::new();
411
427
  for current_row in &candidate_rows {
428
+ if eval_deadline_hit() {
429
+ return LoraValue::Null;
430
+ }
412
431
  match &part.element {
413
432
  ResolvedPatternElement::Node {
414
433
  var,
@@ -470,6 +489,9 @@ fn eval_exists_subquery<S: GraphStorage>(
470
489
  step.rel.direction,
471
490
  &step.rel.types,
472
491
  |rel_id, dst_id| {
492
+ if eval_deadline_hit() {
493
+ return Err(());
494
+ }
473
495
  if let Some(bound) = dst_bound {
474
496
  if dst_id != bound {
475
497
  return Ok::<(), ()>(());
@@ -544,7 +566,7 @@ fn exists_candidate_matches<S: GraphStorage>(
544
566
  ctx: &EvalContext<'_, S>,
545
567
  ) -> bool {
546
568
  where_
547
- .map(|where_expr| eval_expr(where_expr, row, ctx).is_truthy())
569
+ .map(|where_expr| !eval_deadline_hit() && eval_expr(where_expr, row, ctx).is_truthy())
548
570
  .unwrap_or(true)
549
571
  }
550
572
 
@@ -565,6 +587,9 @@ fn eval_pattern_comprehension<S: GraphStorage>(
565
587
  for part in &pattern.parts {
566
588
  let mut next_rows = Vec::new();
567
589
  for current_row in &candidate_rows {
590
+ if eval_deadline_hit() {
591
+ return LoraValue::Null;
592
+ }
568
593
  match &part.element {
569
594
  lora_analyzer::ResolvedPatternElement::Node {
570
595
  var,
@@ -617,6 +642,9 @@ fn eval_pattern_comprehension<S: GraphStorage>(
617
642
  step.rel.direction,
618
643
  &step.rel.types,
619
644
  |rel_id, dst_id| {
645
+ if eval_deadline_hit() {
646
+ return Err(());
647
+ }
620
648
  if dst_bound.is_some_and(|bound| bound != dst_id)
621
649
  || rel_bound.is_some_and(|bound| bound != rel_id)
622
650
  {
@@ -671,16 +699,22 @@ fn eval_pattern_comprehension<S: GraphStorage>(
671
699
  }
672
700
 
673
701
  if let Some(where_expr) = where_ {
674
- candidate_rows.retain(|r| eval_expr(where_expr, r, ctx).is_truthy());
702
+ candidate_rows
703
+ .retain(|r| !eval_deadline_hit() && eval_expr(where_expr, r, ctx).is_truthy());
704
+ }
705
+ if crate::cancel::eval_tripped() {
706
+ return LoraValue::Null;
675
707
  }
676
708
 
677
709
  // Map each matched row through the map expression
678
- LoraValue::List(
679
- candidate_rows
680
- .iter()
681
- .map(|r| eval_expr(map_expr, r, ctx))
682
- .collect(),
683
- )
710
+ let mut out = Vec::with_capacity(candidate_rows.len());
711
+ for r in &candidate_rows {
712
+ if eval_deadline_hit() {
713
+ return LoraValue::Null;
714
+ }
715
+ out.push(eval_expr(map_expr, r, ctx));
716
+ }
717
+ LoraValue::List(out)
684
718
  }
685
719
 
686
720
  /// A copy of `row` holding only `reads`, the variables a pattern subquery
@@ -754,6 +788,9 @@ fn match_node_pattern<S: GraphStorage>(
754
788
 
755
789
  let mut out = Vec::new();
756
790
  for id in candidate_ids {
791
+ if eval_deadline_hit() {
792
+ break;
793
+ }
757
794
  let matched = ctx
758
795
  .storage
759
796
  .with_node(id, |n| {
@@ -833,7 +870,7 @@ impl<S: GraphStorage> VarLengthWalk<'_, '_, S> {
833
870
  if hops >= self.min_hops {
834
871
  self.emit(node, path, out);
835
872
  }
836
- if hops >= self.max_hops {
873
+ if hops >= self.max_hops || eval_deadline_hit() {
837
874
  return;
838
875
  }
839
876
  let mut next = Vec::new();
@@ -976,6 +1013,10 @@ pub fn eval_expr_result<S: GraphStorage>(
976
1013
  ) -> Result<LoraValue, String> {
977
1014
  clear_eval_error();
978
1015
  let value = eval_expr(expr, row, ctx);
1016
+ if crate::cancel::eval_tripped() {
1017
+ clear_eval_error();
1018
+ return Err(DEADLINE_EXCEEDED.to_string());
1019
+ }
979
1020
  match take_eval_error() {
980
1021
  Some(err) => Err(err),
981
1022
  None => Ok(value),
@@ -36,4 +36,4 @@ mod regex;
36
36
  mod vector;
37
37
 
38
38
  pub use errors::clear_eval_error;
39
- pub use expr::{eval_expr, eval_expr_result, eval_truthy_result, EvalContext};
39
+ pub use expr::{eval_expr, eval_expr_result, eval_truthy_result, EvalContext, DEADLINE_EXCEEDED};