lora-python 0.27.0__tar.gz → 0.28.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 (439) hide show
  1. {lora_python-0.27.0 → lora_python-0.28.0}/Cargo.lock +19 -19
  2. {lora_python-0.27.0 → lora_python-0.28.0}/Cargo.toml +13 -13
  3. {lora_python-0.27.0 → lora_python-0.28.0}/PKG-INFO +1 -1
  4. lora_python-0.28.0/crates/lora-database/examples/crash_probe.rs +245 -0
  5. lora_python-0.28.0/crates/lora-database/examples/sync_memory_probe.rs +190 -0
  6. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/changes/history.rs +16 -11
  7. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/builder.rs +10 -14
  8. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/changes.rs +4 -4
  9. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/mod.rs +29 -15
  10. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/snapshot/mod.rs +35 -35
  11. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/snapshot/store.rs +20 -16
  12. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/wal/archive/format.rs +278 -62
  13. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/wal/archive/worker.rs +1 -13
  14. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/wal/archive/workspace.rs +35 -22
  15. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/wal/archive.rs +74 -52
  16. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/change_feed.rs +41 -0
  17. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/wal.rs +173 -0
  18. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/src/codec.rs +2 -2
  19. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/src/envelope.rs +2 -2
  20. lora_python-0.28.0/crates/lora-snapshot/src/graph.rs +1261 -0
  21. lora_python-0.28.0/crates/lora-snapshot/src/graph_tests.rs +241 -0
  22. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/src/lib.rs +8 -0
  23. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/lib.rs +1 -1
  24. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/mod.rs +1 -0
  25. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/snapshot.rs +160 -70
  26. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/recorder/recorder.rs +9 -0
  27. {lora_python-0.27.0 → lora_python-0.28.0}/pyproject.toml +1 -1
  28. {lora_python-0.27.0 → lora_python-0.28.0}/LICENSE +0 -0
  29. {lora_python-0.27.0 → lora_python-0.28.0}/README.md +0 -0
  30. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-binding-buffer/Cargo.toml +0 -0
  31. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-binding-buffer/src/lib.rs +0 -0
  32. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-binding-buffer/src/stream.rs +0 -0
  33. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/.gitignore +0 -0
  34. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/Cargo.toml +0 -0
  35. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/LICENSE +0 -0
  36. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/README.md +0 -0
  37. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/build.rs +0 -0
  38. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  39. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/examples/basic.py +0 -0
  40. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/src/errors.rs +0 -0
  41. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/src/from_python.rs +0 -0
  42. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/src/gil.rs +0 -0
  43. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/src/lib.rs +0 -0
  44. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/src/stream.rs +0 -0
  45. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/src/to_python.rs +0 -0
  46. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/tests/test_async.py +0 -0
  47. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/tests/test_concurrency.py +0 -0
  48. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  49. {lora_python-0.27.0 → lora_python-0.28.0}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  50. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/Cargo.toml +0 -0
  51. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
  52. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
  53. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
  54. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  55. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  56. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
  57. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
  58. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/errors.rs +0 -0
  59. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/lib.rs +0 -0
  60. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/resolved.rs +0 -0
  61. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/scope.rs +0 -0
  62. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/src/symbols.rs +0 -0
  63. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  64. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-ast/Cargo.toml +0 -0
  65. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-ast/src/ast.rs +0 -0
  66. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-ast/src/lib.rs +0 -0
  67. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-builtins-meta/Cargo.toml +0 -0
  68. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-builtins-meta/src/lib.rs +0 -0
  69. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-compiler/Cargo.toml +0 -0
  70. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-compiler/src/lib.rs +0 -0
  71. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-compiler/src/logical.rs +0 -0
  72. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-compiler/src/optimizer.rs +0 -0
  73. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-compiler/src/param_fold.rs +0 -0
  74. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-compiler/src/pattern.rs +0 -0
  75. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-compiler/src/physical.rs +0 -0
  76. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-compiler/src/plan_tree.rs +0 -0
  77. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-compiler/src/planner.rs +0 -0
  78. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/Cargo.toml +0 -0
  79. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/README.md +0 -0
  80. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/advanced.rs +0 -0
  81. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/concurrency_guard.rs +0 -0
  82. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/concurrent.rs +0 -0
  83. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/engine.rs +0 -0
  84. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/fixtures.rs +0 -0
  85. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/index_acceleration.rs +0 -0
  86. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/memory.rs +0 -0
  87. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/memory_baseline.json +0 -0
  88. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/perf_smoke.rs +0 -0
  89. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
  90. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/query_implementations.rs +0 -0
  91. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/realistic.rs +0 -0
  92. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/scale.rs +0 -0
  93. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/temporal_spatial.rs +0 -0
  94. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/benches/wal.rs +0 -0
  95. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/examples/bulk_probe.rs +0 -0
  96. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/examples/carried_probe.rs +0 -0
  97. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/examples/heap_probe.rs +0 -0
  98. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/examples/keyset_probe.rs +0 -0
  99. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/examples/optional_probe.rs +0 -0
  100. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/examples/perf_probe.rs +0 -0
  101. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/examples/pushdown_probe.rs +0 -0
  102. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/examples/storage_baseline.rs +0 -0
  103. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/changes/build.rs +0 -0
  104. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/changes/mod.rs +0 -0
  105. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/compile.rs +0 -0
  106. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/execute.rs +0 -0
  107. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/explain.rs +0 -0
  108. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/graph_api.rs +0 -0
  109. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/occ.rs +0 -0
  110. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/procedures.rs +0 -0
  111. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/profile.rs +0 -0
  112. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/pull_mode.rs +0 -0
  113. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/replay.rs +0 -0
  114. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/row_projection.rs +0 -0
  115. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/schema.rs +0 -0
  116. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/show_pipeline.rs +0 -0
  117. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/stream.rs +0 -0
  118. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/database/write_guard.rs +0 -0
  119. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/durable_io.rs +0 -0
  120. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/error.rs +0 -0
  121. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/explain.rs +0 -0
  122. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/io.rs +0 -0
  123. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/lib.rs +0 -0
  124. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/live_store.rs +0 -0
  125. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/named.rs +0 -0
  126. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/plan_cache.rs +0 -0
  127. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/snapshot/json.rs +0 -0
  128. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/stream.rs +0 -0
  129. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/transaction.rs +0 -0
  130. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/wal/admin.rs +0 -0
  131. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  132. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  133. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/wal/mod.rs +0 -0
  134. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/src/wal/write_scope.rs +0 -0
  135. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/advanced_queries.rs +0 -0
  136. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/aggregate_semantics.rs +0 -0
  137. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/aggregation.rs +0 -0
  138. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/and_or_short_circuit.rs +0 -0
  139. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/backend_stub.rs +0 -0
  140. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/bbox_antimeridian.rs +0 -0
  141. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/binary.rs +0 -0
  142. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/bit_shifts.rs +0 -0
  143. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/borrowed_variable_reads.rs +0 -0
  144. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
  145. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/call_subquery_writes.rs +0 -0
  146. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/carried_value_sharing.rs +0 -0
  147. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/collect_nulls.rs +0 -0
  148. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/comparison_ordering.rs +0 -0
  149. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/constraints.rs +0 -0
  150. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/create.rs +0 -0
  151. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/cypher_compat.rs +0 -0
  152. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/deferred_existence_end_state.rs +0 -0
  153. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/docs_examples.rs +0 -0
  154. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/early_limit.rs +0 -0
  155. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/empty_ranges.rs +0 -0
  156. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/entity_property_values.rs +0 -0
  157. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/error_messages.rs +0 -0
  158. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/errors.rs +0 -0
  159. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/explain_estimates.rs +0 -0
  160. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/explain_profile.rs +0 -0
  161. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/expression_semantics.rs +0 -0
  162. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/expressions.rs +0 -0
  163. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/foreach.rs +0 -0
  164. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/fulltext_index.rs +0 -0
  165. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/fulltext_list_properties.rs +0 -0
  166. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/functions_extended.rs +0 -0
  167. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/grouping_key_identity.rs +0 -0
  168. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/id_seek.rs +0 -0
  169. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/index_acceleration.rs +0 -0
  170. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/integer_literals.rs +0 -0
  171. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/invariants.rs +0 -0
  172. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/limit_skip_counts.rs +0 -0
  173. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/managed_snapshots.rs +0 -0
  174. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/match.rs +0 -0
  175. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/merge.rs +0 -0
  176. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/merge_bound_end.rs +0 -0
  177. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/missing_parameters.rs +0 -0
  178. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/nested_aggregates.rs +0 -0
  179. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/null_pattern_variables.rs +0 -0
  180. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/null_properties_and_deferred_existence.rs +0 -0
  181. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/optional_match_correlated.rs +0 -0
  182. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/optional_match_leading.rs +0 -0
  183. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/order_by_aggregates.rs +0 -0
  184. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/order_by_grouping_key_parts.rs +0 -0
  185. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/order_by_index.rs +0 -0
  186. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/order_limit_semantics.rs +0 -0
  187. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/ordering.rs +0 -0
  188. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/parameters.rs +0 -0
  189. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/parser.rs +0 -0
  190. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/paths.rs +0 -0
  191. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/pattern_subquery_property_seek.rs +0 -0
  192. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/pattern_subquery_rel_properties.rs +0 -0
  193. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/pattern_subquery_scope.rs +0 -0
  194. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/pattern_subquery_var_length.rs +0 -0
  195. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/pattern_subquery_where_seek.rs +0 -0
  196. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/planner_known_parameters.rs +0 -0
  197. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/planner_pushdown.rs +0 -0
  198. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/planner_stats.rs +0 -0
  199. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/point_scan_choice.rs +0 -0
  200. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/procedure_yield.rs +0 -0
  201. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/projection.rs +0 -0
  202. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/range_scan_bound_intersection.rs +0 -0
  203. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/range_scan_other_kinds.rs +0 -0
  204. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/restart_index_state.rs +0 -0
  205. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/scale.rs +0 -0
  206. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/schema.rs +0 -0
  207. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/schema_in_transaction.rs +0 -0
  208. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/seeds.rs +0 -0
  209. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/shared_index_value_writes.rs +0 -0
  210. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/snapshot.rs +0 -0
  211. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/sort_limit_probe.rs +0 -0
  212. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/spatial.rs +0 -0
  213. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/starts_with_range_seek.rs +0 -0
  214. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/statement_atomicity.rs +0 -0
  215. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/streaming_scans.rs +0 -0
  216. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/string_number_addition.rs +0 -0
  217. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/sum_empty.rs +0 -0
  218. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/temporal.rs +0 -0
  219. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/temporal_constructor_functions.rs +0 -0
  220. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/temporal_constructors.rs +0 -0
  221. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/temporal_map_components.rs +0 -0
  222. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/temporal_range_index.rs +0 -0
  223. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/temporal_strings.rs +0 -0
  224. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/temporal_time_zones.rs +0 -0
  225. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/temporal_zone_accessors.rs +0 -0
  226. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/test_helpers.rs +0 -0
  227. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/timeouts.rs +0 -0
  228. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/transactions.rs +0 -0
  229. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/types_advanced.rs +0 -0
  230. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/union.rs +0 -0
  231. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/unknown_names.rs +0 -0
  232. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
  233. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/update.rs +0 -0
  234. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/var_length_bound_endpoint.rs +0 -0
  235. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/var_length_hop_ranges.rs +0 -0
  236. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/vector_index.rs +0 -0
  237. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/vectors.rs +0 -0
  238. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/where_clause.rs +0 -0
  239. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/with.rs +0 -0
  240. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/with_predicates.rs +0 -0
  241. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/write_path_bindings.rs +0 -0
  242. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/write_results.rs +0 -0
  243. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-database/tests/write_scaling.rs +0 -0
  244. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/Cargo.toml +0 -0
  245. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/cancel.rs +0 -0
  246. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/errors.rs +0 -0
  247. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/binops.rs +0 -0
  248. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
  249. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
  250. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
  251. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
  252. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
  253. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
  254. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/index_ns.rs +0 -0
  255. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
  256. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/list.rs +0 -0
  257. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
  258. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
  259. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
  260. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
  261. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
  262. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
  263. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
  264. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
  265. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/temporal_build.rs +0 -0
  266. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
  267. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
  268. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
  269. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
  270. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
  271. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/errors.rs +0 -0
  272. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/expr.rs +0 -0
  273. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/functions.rs +0 -0
  274. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/mod.rs +0 -0
  275. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/point.rs +0 -0
  276. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/regex.rs +0 -0
  277. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/eval/vector.rs +0 -0
  278. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/executor/aggregation.rs +0 -0
  279. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/executor/helpers.rs +0 -0
  280. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/executor/immutable.rs +0 -0
  281. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/executor/mod.rs +0 -0
  282. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/executor/mutable.rs +0 -0
  283. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/executor/optional.rs +0 -0
  284. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/executor/sort.rs +0 -0
  285. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/lib.rs +0 -0
  286. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/profile.rs +0 -0
  287. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/aggregate.rs +0 -0
  288. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
  289. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/columns.rs +0 -0
  290. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/context.rs +0 -0
  291. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/expand.rs +0 -0
  292. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/filter.rs +0 -0
  293. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/hydration.rs +0 -0
  294. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/mod.rs +0 -0
  295. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/mutable.rs +0 -0
  296. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/optional.rs +0 -0
  297. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/path.rs +0 -0
  298. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/projection.rs +0 -0
  299. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/scan.rs +0 -0
  300. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/shape.rs +0 -0
  301. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/sort.rs +0 -0
  302. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/source.rs +0 -0
  303. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/tests.rs +0 -0
  304. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/traits.rs +0 -0
  305. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/pull/union.rs +0 -0
  306. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/src/value.rs +0 -0
  307. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-executor/tests/error_messages.rs +0 -0
  308. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-io/Cargo.toml +0 -0
  309. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-io/src/csv.rs +0 -0
  310. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-io/src/format.rs +0 -0
  311. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-io/src/json_array.rs +0 -0
  312. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-io/src/jsonl.rs +0 -0
  313. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-io/src/lib.rs +0 -0
  314. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-io/src/mapping.rs +0 -0
  315. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-io/src/value_json.rs +0 -0
  316. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/Cargo.toml +0 -0
  317. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/cypher.pest +0 -0
  318. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/errors.rs +0 -0
  319. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/lib.rs +0 -0
  320. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/parser/clauses.rs +0 -0
  321. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/parser/expressions.rs +0 -0
  322. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/parser/literals.rs +0 -0
  323. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/parser/mod.rs +0 -0
  324. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/parser/patterns.rs +0 -0
  325. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/parser/query.rs +0 -0
  326. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/parser/schema.rs +0 -0
  327. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/parser/tests.rs +0 -0
  328. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/src/parser/util.rs +0 -0
  329. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-parser/tests/error_messages.rs +0 -0
  330. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/Cargo.toml +0 -0
  331. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/src/body.rs +0 -0
  332. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/src/columnar.rs +0 -0
  333. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/src/errors.rs +0 -0
  334. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/src/format.rs +0 -0
  335. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/src/options.rs +0 -0
  336. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/src/tests.rs +0 -0
  337. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/src/transform.rs +0 -0
  338. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/src/view.rs +0 -0
  339. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  340. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/Cargo.toml +0 -0
  341. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/codec.rs +0 -0
  342. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/dict.rs +0 -0
  343. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/encoded.rs +0 -0
  344. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/intern.rs +0 -0
  345. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/lock_table.rs +0 -0
  346. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/adjacency.rs +0 -0
  347. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/chunked_vec.rs +0 -0
  348. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
  349. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/constraint_enforce.rs +0 -0
  350. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/cow.rs +0 -0
  351. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/distinct_stats.rs +0 -0
  352. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/entity_index_store.rs +0 -0
  353. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/fulltext_index.rs +0 -0
  354. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/graph.rs +0 -0
  355. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/hnsw.rs +0 -0
  356. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/id_bitmap.rs +0 -0
  357. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/id_map.rs +0 -0
  358. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/id_set.rs +0 -0
  359. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/impls.rs +0 -0
  360. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/index_catalog.rs +0 -0
  361. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/mem_report.rs +0 -0
  362. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/model_tests.rs +0 -0
  363. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/point_index.rs +0 -0
  364. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/property_index.rs +0 -0
  365. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/record_slab.rs +0 -0
  366. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
  367. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/sorted_property_index.rs +0 -0
  368. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/stats.rs +0 -0
  369. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/test_util.rs +0 -0
  370. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/tests.rs +0 -0
  371. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/text_index.rs +0 -0
  372. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/memory/vector_index.rs +0 -0
  373. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/mutation.rs +0 -0
  374. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/snapshot.rs +0 -0
  375. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/traits.rs +0 -0
  376. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/binary/mod.rs +0 -0
  377. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/binary/tests.rs +0 -0
  378. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/binary/traits.rs +0 -0
  379. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/binary/types.rs +0 -0
  380. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/graph.rs +0 -0
  381. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/mod.rs +0 -0
  382. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/name.rs +0 -0
  383. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/property_map.rs +0 -0
  384. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/property_value.rs +0 -0
  385. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/spatial/bbox.rs +0 -0
  386. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  387. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/spatial/mod.rs +0 -0
  388. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/spatial/point.rs +0 -0
  389. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  390. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  391. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  392. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/temporal/date.rs +0 -0
  393. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
  394. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/temporal/duration.rs +0 -0
  395. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/temporal/format.rs +0 -0
  396. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  397. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  398. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/temporal/time.rs +0 -0
  399. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/temporal/zone.rs +0 -0
  400. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/vector/build.rs +0 -0
  401. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/vector/mod.rs +0 -0
  402. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  403. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/vector/tests.rs +0 -0
  404. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/vector/types.rs +0 -0
  405. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/types/view.rs +0 -0
  406. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/src/varint.rs +0 -0
  407. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-store/tests/error_messages.rs +0 -0
  408. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/Cargo.toml +0 -0
  409. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/codec/decode.rs +0 -0
  410. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/codec/encode.rs +0 -0
  411. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/codec/format.rs +0 -0
  412. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/codec/mod.rs +0 -0
  413. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/codec/tests.rs +0 -0
  414. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/config.rs +0 -0
  415. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/dir.rs +0 -0
  416. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/errors.rs +0 -0
  417. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/history.rs +0 -0
  418. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/io.rs +0 -0
  419. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/lib.rs +0 -0
  420. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/lock.rs +0 -0
  421. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/lsn.rs +0 -0
  422. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/record.rs +0 -0
  423. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/recorder/errors.rs +0 -0
  424. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  425. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/recorder/mod.rs +0 -0
  426. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/recorder/tests.rs +0 -0
  427. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/replay.rs +0 -0
  428. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/segment.rs +0 -0
  429. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/testing.rs +0 -0
  430. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
  431. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/wal/mod.rs +0 -0
  432. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/wal/tests.rs +0 -0
  433. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/src/wal/wal.rs +0 -0
  434. {lora_python-0.27.0 → lora_python-0.28.0}/crates/lora-wal/tests/error_messages.rs +0 -0
  435. {lora_python-0.27.0 → lora_python-0.28.0}/python/lora_python/__init__.py +0 -0
  436. {lora_python-0.27.0 → lora_python-0.28.0}/python/lora_python/_async.py +0 -0
  437. {lora_python-0.27.0 → lora_python-0.28.0}/python/lora_python/_native.pyi +0 -0
  438. {lora_python-0.27.0 → lora_python-0.28.0}/python/lora_python/py.typed +0 -0
  439. {lora_python-0.27.0 → lora_python-0.28.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.27.0"
857
+ version = "0.28.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.27.0"
868
+ version = "0.28.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.27.0"
875
+ version = "0.28.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.27.0"
883
+ version = "0.28.0"
884
884
 
885
885
  [[package]]
886
886
  name = "lora-compiler"
887
- version = "0.27.0"
887
+ version = "0.28.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.27.0"
896
+ version = "0.28.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.27.0"
921
+ version = "0.28.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.27.0"
944
+ version = "0.28.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.27.0"
956
+ version = "0.28.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.27.0"
967
+ version = "0.28.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.27.0"
982
+ version = "0.28.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.27.0"
993
+ version = "0.28.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.27.0"
1006
+ version = "0.28.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.27.0"
1020
+ version = "0.28.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.27.0"
1035
+ version = "0.28.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.27.0"
1050
+ version = "0.28.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.27.0"
1065
+ version = "0.28.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.27.0"
1075
+ version = "0.28.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.27.0"
1091
+ version = "0.28.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.27.0"
7
+ version = "0.28.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.27.0" }
19
- lora-parser = { path = "crates/lora-parser", version = "=0.27.0" }
20
- lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.27.0" }
21
- lora-analyzer = { path = "crates/lora-analyzer", version = "=0.27.0" }
22
- lora-compiler = { path = "crates/lora-compiler", version = "=0.27.0" }
23
- lora-store = { path = "crates/lora-store", version = "=0.27.0" }
24
- lora-snapshot = { path = "crates/lora-snapshot", version = "=0.27.0", default-features = false }
25
- lora-io = { path = "crates/lora-io", version = "=0.27.0" }
26
- lora-wal = { path = "crates/lora-wal", version = "=0.27.0" }
27
- lora-executor = { path = "crates/lora-executor", version = "=0.27.0", default-features = false }
28
- lora-database = { path = "crates/lora-database", version = "=0.27.0" }
29
- lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.27.0" }
18
+ lora-ast = { path = "crates/lora-ast", version = "=0.28.0" }
19
+ lora-parser = { path = "crates/lora-parser", version = "=0.28.0" }
20
+ lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.28.0" }
21
+ lora-analyzer = { path = "crates/lora-analyzer", version = "=0.28.0" }
22
+ lora-compiler = { path = "crates/lora-compiler", version = "=0.28.0" }
23
+ lora-store = { path = "crates/lora-store", version = "=0.28.0" }
24
+ lora-snapshot = { path = "crates/lora-snapshot", version = "=0.28.0", default-features = false }
25
+ lora-io = { path = "crates/lora-io", version = "=0.28.0" }
26
+ lora-wal = { path = "crates/lora-wal", version = "=0.28.0" }
27
+ lora-executor = { path = "crates/lora-executor", version = "=0.28.0", default-features = false }
28
+ lora-database = { path = "crates/lora-database", version = "=0.28.0" }
29
+ lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.28.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.27.0
3
+ Version: 0.28.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,245 @@
1
+ //! Kill-9 probe for a named database's write, `sync()` and open paths.
2
+ //!
3
+ //! Run with:
4
+ //!
5
+ //! ```text
6
+ //! cargo run --release -p lora-database --example crash_probe -- <dir> <rounds> [preload]
7
+ //! ```
8
+ //!
9
+ //! Each round starts a child that opens `<dir>/probe.loradb`, writes and
10
+ //! calls `sync()` in a loop, and prints each write once it is
11
+ //! acknowledged; the parent kills it with SIGKILL after a random delay,
12
+ //! which lands in writes, in `sync()` and in the open itself. The parent
13
+ //! then opens the database and checks that every acknowledged write is
14
+ //! there and that the graph is whole: each id at most once, a chain of
15
+ //! relationships between consecutive ids, and each node's counter equal
16
+ //! to the number of updates acknowledged for it (or one more, for a write
17
+ //! killed after it committed and before it was acknowledged).
18
+ //!
19
+ //! `preload` nodes are written before the first round, so a checkpoint
20
+ //! takes long enough to be killed in the middle.
21
+
22
+ use std::collections::BTreeMap;
23
+ use std::io::{BufRead, BufReader};
24
+ use std::path::{Path, PathBuf};
25
+ use std::process::{Command, Stdio};
26
+ use std::time::{Duration, Instant};
27
+
28
+ use lora_database::{Database, DatabaseOpenOptions, ExecuteOptions, ResultFormat};
29
+
30
+ fn rows() -> Option<ExecuteOptions> {
31
+ Some(ExecuteOptions {
32
+ format: ResultFormat::Rows,
33
+ })
34
+ }
35
+
36
+ fn options(dir: &Path) -> DatabaseOpenOptions {
37
+ DatabaseOpenOptions {
38
+ segment_target_bytes: 256 * 1024,
39
+ ..DatabaseOpenOptions::default().with_database_dir(dir)
40
+ }
41
+ }
42
+
43
+ fn random_u64() -> u64 {
44
+ let mut bytes = [0u8; 8];
45
+ getrandom::getrandom(&mut bytes).unwrap();
46
+ u64::from_le_bytes(bytes)
47
+ }
48
+
49
+ fn query_rows(db: &Database<lora_database::InMemoryGraph>, query: &str) -> Vec<serde_json::Value> {
50
+ let result = db.execute(query, rows()).unwrap();
51
+ let json = serde_json::to_value(&result).unwrap();
52
+ json["rows"].as_array().cloned().unwrap_or_default()
53
+ }
54
+
55
+ /// Highest id in the database, or -1 when empty.
56
+ fn max_id(db: &Database<lora_database::InMemoryGraph>) -> i64 {
57
+ query_rows(db, "MATCH (n:P) RETURN coalesce(max(n.id), -1) AS m")[0]["m"]
58
+ .as_i64()
59
+ .unwrap()
60
+ }
61
+
62
+ /// Child: write forever, printing `c <id>` after a create and `u <id>`
63
+ /// after an update, and `s` after a sync.
64
+ fn child(dir: &Path) {
65
+ let db = Database::open_named("probe", options(dir)).unwrap();
66
+ println!("open");
67
+ let mut next = max_id(&db) + 1;
68
+ loop {
69
+ let roll = random_u64() % 100;
70
+ if roll < 3 {
71
+ db.sync().unwrap();
72
+ println!("s");
73
+ } else if roll < 30 && next > 0 {
74
+ let id = (random_u64() % next as u64) as i64;
75
+ db.execute(
76
+ &format!("MATCH (n:P {{id: {id}}}) SET n.updates = n.updates + 1"),
77
+ rows(),
78
+ )
79
+ .unwrap();
80
+ println!("u {id}");
81
+ } else {
82
+ let id = next;
83
+ db.execute(
84
+ &format!(
85
+ "CREATE (n:P {{id: {id}, updates: 0, name: 'p' + toString({id}), tags: ['a', {id}]}}) \
86
+ WITH n OPTIONAL MATCH (prev:P {{id: {id} - 1}}) \
87
+ FOREACH (_ IN CASE WHEN prev IS NULL THEN [] ELSE [1] END | CREATE (prev)-[:NEXT]->(n))"
88
+ ),
89
+ rows(),
90
+ )
91
+ .unwrap();
92
+ next += 1;
93
+ println!("c {id}");
94
+ }
95
+ }
96
+ }
97
+
98
+ struct Acked {
99
+ max_created: i64,
100
+ updates: BTreeMap<i64, i64>,
101
+ syncs: u64,
102
+ }
103
+
104
+ fn verify(dir: &Path, acked: &Acked) {
105
+ let db = Database::open_named("probe", options(dir)).unwrap();
106
+ let max = max_id(&db);
107
+ assert!(
108
+ max >= acked.max_created && max <= acked.max_created + 1,
109
+ "max id {max}, acknowledged {}",
110
+ acked.max_created
111
+ );
112
+ let counts = &query_rows(
113
+ &db,
114
+ "MATCH (n:P) RETURN count(n) AS n, count(DISTINCT n.id) AS d",
115
+ )[0];
116
+ assert_eq!(counts["n"].as_i64().unwrap(), max + 1, "node count");
117
+ assert_eq!(counts["d"].as_i64().unwrap(), max + 1, "distinct ids");
118
+ let chain = &query_rows(
119
+ &db,
120
+ "MATCH (a:P)-[:NEXT]->(b:P) RETURN count(*) AS n, sum(CASE WHEN b.id = a.id + 1 THEN 1 ELSE 0 END) AS ok",
121
+ )[0];
122
+ assert_eq!(chain["n"].as_i64().unwrap(), max.max(0), "chain length");
123
+ assert_eq!(chain["ok"].as_i64().unwrap(), max.max(0), "chain order");
124
+ let stored: BTreeMap<i64, i64> = query_rows(
125
+ &db,
126
+ "MATCH (n:P) WHERE n.updates > 0 RETURN n.id AS id, n.updates AS u",
127
+ )
128
+ .into_iter()
129
+ .map(|row| (row["id"].as_i64().unwrap(), row["u"].as_i64().unwrap()))
130
+ .collect();
131
+ let mut extra = 0;
132
+ for (id, want) in &acked.updates {
133
+ let got = stored.get(id).copied().unwrap_or(0);
134
+ assert!(
135
+ got >= *want,
136
+ "node {id}: {got} updates, {want} acknowledged"
137
+ );
138
+ extra += got - want;
139
+ }
140
+ for (id, got) in &stored {
141
+ if !acked.updates.contains_key(id) {
142
+ extra += got;
143
+ }
144
+ }
145
+ assert!(extra <= 1, "{extra} unacknowledged updates");
146
+ }
147
+
148
+ fn main() {
149
+ let args: Vec<String> = std::env::args().collect();
150
+ if args.get(1).map(String::as_str) == Some("child") {
151
+ child(Path::new(&args[2]));
152
+ return;
153
+ }
154
+ let dir = PathBuf::from(&args[1]);
155
+ let rounds: usize = args[2].parse().unwrap();
156
+ let preload: usize = args.get(3).map_or(0, |n| n.parse().unwrap());
157
+ std::fs::create_dir_all(&dir).unwrap();
158
+
159
+ if preload > 0 {
160
+ let db = Database::open_named("probe", options(&dir)).unwrap();
161
+ db.execute(
162
+ &format!(
163
+ "UNWIND list.range(0, {}) AS i CREATE (:Pad {{i: i, s: 'pad' + toString(i)}})",
164
+ preload - 1
165
+ ),
166
+ rows(),
167
+ )
168
+ .unwrap();
169
+ db.sync().unwrap();
170
+ }
171
+
172
+ let mut acked = {
173
+ let db = Database::open_named("probe", options(&dir)).unwrap();
174
+ let updates = query_rows(
175
+ &db,
176
+ "MATCH (n:P) WHERE n.updates > 0 RETURN n.id AS id, n.updates AS u",
177
+ )
178
+ .into_iter()
179
+ .map(|row| (row["id"].as_i64().unwrap(), row["u"].as_i64().unwrap()))
180
+ .collect();
181
+ Acked {
182
+ max_created: max_id(&db),
183
+ updates,
184
+ syncs: 0,
185
+ }
186
+ };
187
+
188
+ let exe = std::env::current_exe().unwrap();
189
+ let started = Instant::now();
190
+ let mut killed_in_open = 0;
191
+ for round in 0..rounds {
192
+ let mut child = Command::new(&exe)
193
+ .arg("child")
194
+ .arg(&dir)
195
+ .stdout(Stdio::piped())
196
+ .spawn()
197
+ .unwrap();
198
+ let stdout = child.stdout.take().unwrap();
199
+ let reader = std::thread::spawn(move || {
200
+ BufReader::new(stdout)
201
+ .lines()
202
+ .map_while(Result::ok)
203
+ .collect::<Vec<_>>()
204
+ });
205
+ std::thread::sleep(Duration::from_millis(50 + random_u64() % 1500));
206
+ child.kill().unwrap();
207
+ child.wait().unwrap();
208
+ let lines = reader.join().unwrap();
209
+ if !lines.iter().any(|l| l == "open") {
210
+ killed_in_open += 1;
211
+ }
212
+ for line in &lines {
213
+ match line.split_once(' ') {
214
+ Some(("c", id)) => acked.max_created = id.parse().unwrap(),
215
+ Some(("u", id)) => *acked.updates.entry(id.parse().unwrap()).or_insert(0) += 1,
216
+ _ if line == "s" => acked.syncs += 1,
217
+ _ => {}
218
+ }
219
+ }
220
+ verify(&dir, &acked);
221
+ // The verify's own open counts as one more clean open: an
222
+ // unacknowledged write it found is now part of the history.
223
+ let db = Database::open_named("probe", options(&dir)).unwrap();
224
+ acked.max_created = max_id(&db);
225
+ acked.updates = query_rows(
226
+ &db,
227
+ "MATCH (n:P) WHERE n.updates > 0 RETURN n.id AS id, n.updates AS u",
228
+ )
229
+ .into_iter()
230
+ .map(|row| (row["id"].as_i64().unwrap(), row["u"].as_i64().unwrap()))
231
+ .collect();
232
+ drop(db);
233
+ if (round + 1) % 10 == 0 {
234
+ println!(
235
+ "round {:>4}: {} nodes, {} syncs acknowledged, {} kills during open, {:.0} s",
236
+ round + 1,
237
+ acked.max_created + 1,
238
+ acked.syncs,
239
+ killed_in_open,
240
+ started.elapsed().as_secs_f64()
241
+ );
242
+ }
243
+ }
244
+ println!("ok: {rounds} rounds");
245
+ }
@@ -0,0 +1,190 @@
1
+ //! Heap probe for a named database's checkpoint (`sync()`) and open.
2
+ //!
3
+ //! Run with:
4
+ //!
5
+ //! ```text
6
+ //! cargo run --release -p lora-database --example sync_memory_probe -- build <dir> <nodes>
7
+ //! cargo run --release -p lora-database --example sync_memory_probe -- measure <dir>
8
+ //! ```
9
+ //!
10
+ //! `build` writes a `.loradb` with `<nodes>` nodes (a unique key, a short
11
+ //! hash, two integers, a float and a list each) and as many relationships.
12
+ //! `writes <dir> <count>` times single-statement creates against it.
13
+ //! `measure` opens it, calls `sync()` three times and drops it, reporting
14
+ //! for each step the live heap after it and the peak during it. The
15
+ //! allocator is wrapped with a live-byte counter, so the figures are the
16
+ //! bytes the process asked for, whatever malloc then keeps resident; the
17
+ //! resident set after each step is printed beside them.
18
+
19
+ use std::alloc::{GlobalAlloc, Layout, System};
20
+ use std::path::PathBuf;
21
+ use std::sync::atomic::{AtomicIsize, Ordering};
22
+ use std::time::Instant;
23
+
24
+ use lora_database::{Database, DatabaseOpenOptions, ExecuteOptions, ResultFormat};
25
+
26
+ struct Counting;
27
+
28
+ static LIVE: AtomicIsize = AtomicIsize::new(0);
29
+ static PEAK: AtomicIsize = AtomicIsize::new(0);
30
+
31
+ fn grew(by: isize) {
32
+ let live = LIVE.fetch_add(by, Ordering::Relaxed) + by;
33
+ PEAK.fetch_max(live, Ordering::Relaxed);
34
+ }
35
+
36
+ unsafe impl GlobalAlloc for Counting {
37
+ unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
38
+ let p = System.alloc(layout);
39
+ if !p.is_null() {
40
+ grew(layout.size() as isize);
41
+ }
42
+ p
43
+ }
44
+ unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
45
+ System.dealloc(ptr, layout);
46
+ LIVE.fetch_sub(layout.size() as isize, Ordering::Relaxed);
47
+ }
48
+ unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 {
49
+ let p = System.realloc(ptr, layout, new_size);
50
+ if !p.is_null() {
51
+ grew(new_size as isize - layout.size() as isize);
52
+ }
53
+ p
54
+ }
55
+ }
56
+
57
+ #[global_allocator]
58
+ static GLOBAL: Counting = Counting;
59
+
60
+ /// Resident set size from `ps`, in bytes: what malloc kept, beside the
61
+ /// counter's view of what the process asked for.
62
+ fn rss() -> isize {
63
+ std::process::Command::new("ps")
64
+ .args(["-o", "rss=", "-p", &std::process::id().to_string()])
65
+ .output()
66
+ .ok()
67
+ .and_then(|out| String::from_utf8(out.stdout).ok())
68
+ .and_then(|out| out.trim().parse::<isize>().ok())
69
+ .map_or(0, |kib| kib * 1024)
70
+ }
71
+
72
+ fn mib(bytes: isize) -> f64 {
73
+ bytes as f64 / (1024.0 * 1024.0)
74
+ }
75
+
76
+ /// Run `step`, printing the live heap after it and the peak during it.
77
+ fn measure<T>(name: &str, step: impl FnOnce() -> T) -> T {
78
+ PEAK.store(LIVE.load(Ordering::Relaxed), Ordering::Relaxed);
79
+ let before = LIVE.load(Ordering::Relaxed);
80
+ let started = Instant::now();
81
+ let out = step();
82
+ let elapsed = started.elapsed();
83
+ let after = LIVE.load(Ordering::Relaxed);
84
+ let peak = PEAK.load(Ordering::Relaxed);
85
+ println!(
86
+ "{name:<10} live {:>8.1} MiB peak {:>8.1} MiB (+{:>7.1} over before) rss {:>8.1} MiB {:>6.2} s",
87
+ mib(after),
88
+ mib(peak),
89
+ mib(peak - before),
90
+ mib(rss()),
91
+ elapsed.as_secs_f64()
92
+ );
93
+ out
94
+ }
95
+
96
+ fn options(dir: &PathBuf) -> DatabaseOpenOptions {
97
+ DatabaseOpenOptions::default().with_database_dir(dir)
98
+ }
99
+
100
+ fn rows() -> Option<ExecuteOptions> {
101
+ Some(ExecuteOptions {
102
+ format: ResultFormat::Rows,
103
+ })
104
+ }
105
+
106
+ fn main() {
107
+ let args: Vec<String> = std::env::args().collect();
108
+ match args.get(1).map(String::as_str) {
109
+ Some("build") => {
110
+ let dir = PathBuf::from(&args[2]);
111
+ let nodes: usize = args[3].parse().expect("node count");
112
+ let db = Database::open_named("probe", options(&dir)).unwrap();
113
+ db.execute(
114
+ "CREATE CONSTRAINT probe_key FOR (n:Place) REQUIRE n.key IS UNIQUE",
115
+ rows(),
116
+ )
117
+ .unwrap();
118
+ let batch = 50_000;
119
+ let mut start = 0;
120
+ while start < nodes {
121
+ let end = (start + batch).min(nodes) - 1;
122
+ db.execute(
123
+ &format!(
124
+ "UNWIND list.range({start}, {end}) AS i \
125
+ CREATE (:Place {{key: i, hash: 'h' + toString(i * 7919), \
126
+ a: i % 1000, b: i * 3, lat: i / 1000.0, tags: ['x', i % 7]}})"
127
+ ),
128
+ rows(),
129
+ )
130
+ .unwrap();
131
+ start = end + 1;
132
+ }
133
+ let mut start = 1;
134
+ while start < nodes {
135
+ let end = (start + batch).min(nodes) - 1;
136
+ db.execute(
137
+ &format!(
138
+ "UNWIND list.range({start}, {end}) AS i \
139
+ MATCH (a:Place {{key: i - 1}}), (b:Place {{key: i}}) \
140
+ CREATE (a)-[:NEXT {{d: i % 13}}]->(b)"
141
+ ),
142
+ rows(),
143
+ )
144
+ .unwrap();
145
+ start = end + 1;
146
+ }
147
+ db.sync().unwrap();
148
+ println!(
149
+ "built {} nodes, {} relationships",
150
+ db.node_count(),
151
+ db.relationship_count()
152
+ );
153
+ }
154
+ Some("measure") => {
155
+ let dir = PathBuf::from(&args[2]);
156
+ let db = measure("open", || {
157
+ Database::open_named("probe", options(&dir)).unwrap()
158
+ });
159
+ for i in 1..=3 {
160
+ measure(&format!("sync {i}"), || db.sync().unwrap());
161
+ }
162
+ measure("dispose", || drop(db));
163
+ }
164
+ Some("writes") => {
165
+ // Single-statement creates against the built database: commit
166
+ // throughput while the archive worker rewrites the container
167
+ // behind them.
168
+ let dir = PathBuf::from(&args[2]);
169
+ let count: usize = args[3].parse().expect("write count");
170
+ let db = Database::open_named("probe", options(&dir)).unwrap();
171
+ let started = Instant::now();
172
+ for i in 0..count {
173
+ db.execute(&format!("CREATE (:Extra {{i: {i}}})"), rows())
174
+ .unwrap();
175
+ }
176
+ let writes = started.elapsed();
177
+ let started = Instant::now();
178
+ drop(db);
179
+ println!(
180
+ "{count} writes in {:.2} s ({:.0}/s), dispose {:.2} s",
181
+ writes.as_secs_f64(),
182
+ count as f64 / writes.as_secs_f64(),
183
+ started.elapsed().as_secs_f64()
184
+ );
185
+ }
186
+ _ => eprintln!(
187
+ "usage: sync_memory_probe build <dir> <nodes> | measure <dir> | writes <dir> <count>"
188
+ ),
189
+ }
190
+ }