lora-python 0.8.3__tar.gz → 0.8.4__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 (252) hide show
  1. {lora_python-0.8.3 → lora_python-0.8.4}/Cargo.lock +20 -20
  2. {lora_python-0.8.3 → lora_python-0.8.4}/Cargo.toml +11 -11
  3. {lora_python-0.8.3 → lora_python-0.8.4}/PKG-INFO +1 -1
  4. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/benches/perf_smoke_baseline.json +16 -1
  5. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/benches/perf_smoke_benchmarks.rs +111 -2
  6. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/memory/graph.rs +17 -21
  7. {lora_python-0.8.3 → lora_python-0.8.4}/pyproject.toml +1 -1
  8. {lora_python-0.8.3 → lora_python-0.8.4}/LICENSE +0 -0
  9. {lora_python-0.8.3 → lora_python-0.8.4}/README.md +0 -0
  10. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/.gitignore +0 -0
  11. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/Cargo.toml +0 -0
  12. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/LICENSE +0 -0
  13. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/README.md +0 -0
  14. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/build.rs +0 -0
  15. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  16. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/examples/basic.py +0 -0
  17. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/src/errors.rs +0 -0
  18. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/src/from_python.rs +0 -0
  19. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/src/lib.rs +0 -0
  20. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/src/to_python.rs +0 -0
  21. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/tests/test_async.py +0 -0
  22. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  23. {lora_python-0.8.3 → lora_python-0.8.4}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  24. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/Cargo.toml +0 -0
  25. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
  26. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
  27. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  28. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  29. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
  30. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
  31. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/src/errors.rs +0 -0
  32. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/src/lib.rs +0 -0
  33. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/src/resolved.rs +0 -0
  34. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/src/scope.rs +0 -0
  35. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/src/symbols.rs +0 -0
  36. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  37. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-ast/Cargo.toml +0 -0
  38. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-ast/src/ast.rs +0 -0
  39. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-ast/src/lib.rs +0 -0
  40. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-compiler/Cargo.toml +0 -0
  41. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-compiler/src/lib.rs +0 -0
  42. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-compiler/src/logical.rs +0 -0
  43. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-compiler/src/optimizer.rs +0 -0
  44. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-compiler/src/pattern.rs +0 -0
  45. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-compiler/src/physical.rs +0 -0
  46. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-compiler/src/plan_tree.rs +0 -0
  47. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-compiler/src/planner.rs +0 -0
  48. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/Cargo.toml +0 -0
  49. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/benches/advanced_benchmarks.rs +0 -0
  50. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/benches/concurrency_guard_benchmarks.rs +0 -0
  51. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/benches/concurrent_benchmarks.rs +0 -0
  52. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/benches/engine_benchmarks.rs +0 -0
  53. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/benches/fixtures.rs +0 -0
  54. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/benches/scale_benchmarks.rs +0 -0
  55. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/benches/temporal_spatial_benchmarks.rs +0 -0
  56. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/benches/wal_benchmarks.rs +0 -0
  57. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/builder.rs +0 -0
  58. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/compile.rs +0 -0
  59. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/execute.rs +0 -0
  60. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/explain.rs +0 -0
  61. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/graph_api.rs +0 -0
  62. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/mod.rs +0 -0
  63. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/occ.rs +0 -0
  64. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/profile.rs +0 -0
  65. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/pull_mode.rs +0 -0
  66. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/replay.rs +0 -0
  67. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/stream.rs +0 -0
  68. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/database/write_guard.rs +0 -0
  69. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/durable_io.rs +0 -0
  70. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/error.rs +0 -0
  71. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/explain.rs +0 -0
  72. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/lib.rs +0 -0
  73. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/live_store.rs +0 -0
  74. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/named.rs +0 -0
  75. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/plan_cache.rs +0 -0
  76. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/snapshot/json.rs +0 -0
  77. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/snapshot/mod.rs +0 -0
  78. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/snapshot/store.rs +0 -0
  79. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/stream.rs +0 -0
  80. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/transaction.rs +0 -0
  81. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/wal/admin.rs +0 -0
  82. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/wal/archive/format.rs +0 -0
  83. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  84. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  85. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/wal/archive/worker.rs +0 -0
  86. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
  87. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/wal/archive.rs +0 -0
  88. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/wal/mod.rs +0 -0
  89. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/src/wal/write_scope.rs +0 -0
  90. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/advanced_queries.rs +0 -0
  91. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/aggregation.rs +0 -0
  92. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/backend_stub.rs +0 -0
  93. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/binary.rs +0 -0
  94. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/create.rs +0 -0
  95. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/error_messages.rs +0 -0
  96. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/errors.rs +0 -0
  97. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/explain_profile.rs +0 -0
  98. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/expressions.rs +0 -0
  99. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/functions_extended.rs +0 -0
  100. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/invariants.rs +0 -0
  101. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/managed_snapshots.rs +0 -0
  102. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/match.rs +0 -0
  103. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/merge.rs +0 -0
  104. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/ordering.rs +0 -0
  105. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/parameters.rs +0 -0
  106. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/parser.rs +0 -0
  107. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/paths.rs +0 -0
  108. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/projection.rs +0 -0
  109. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/scale.rs +0 -0
  110. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/seeds.rs +0 -0
  111. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/snapshot.rs +0 -0
  112. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/spatial.rs +0 -0
  113. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/temporal.rs +0 -0
  114. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/test_helpers.rs +0 -0
  115. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/transactions.rs +0 -0
  116. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/types_advanced.rs +0 -0
  117. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/union.rs +0 -0
  118. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/update.rs +0 -0
  119. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/vectors.rs +0 -0
  120. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/wal.rs +0 -0
  121. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/where_clause.rs +0 -0
  122. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-database/tests/with.rs +0 -0
  123. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/Cargo.toml +0 -0
  124. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/errors.rs +0 -0
  125. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/eval/binops.rs +0 -0
  126. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/eval/errors.rs +0 -0
  127. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/eval/expr.rs +0 -0
  128. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/eval/functions.rs +0 -0
  129. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/eval/mod.rs +0 -0
  130. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/eval/point.rs +0 -0
  131. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/eval/vector.rs +0 -0
  132. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/executor/helpers.rs +0 -0
  133. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/executor/immutable.rs +0 -0
  134. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/executor/mod.rs +0 -0
  135. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/executor/mutable.rs +0 -0
  136. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/lib.rs +0 -0
  137. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/profile.rs +0 -0
  138. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/aggregate.rs +0 -0
  139. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/columns.rs +0 -0
  140. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/context.rs +0 -0
  141. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/expand.rs +0 -0
  142. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/filter.rs +0 -0
  143. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/hydration.rs +0 -0
  144. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/mod.rs +0 -0
  145. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/mutable.rs +0 -0
  146. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/optional.rs +0 -0
  147. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/path.rs +0 -0
  148. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/projection.rs +0 -0
  149. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/scan.rs +0 -0
  150. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/shape.rs +0 -0
  151. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/sort.rs +0 -0
  152. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/source.rs +0 -0
  153. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/tests.rs +0 -0
  154. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/traits.rs +0 -0
  155. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/pull/union.rs +0 -0
  156. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/src/value.rs +0 -0
  157. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-executor/tests/error_messages.rs +0 -0
  158. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/Cargo.toml +0 -0
  159. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/src/cypher.pest +0 -0
  160. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/src/errors.rs +0 -0
  161. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/src/lib.rs +0 -0
  162. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/src/parser/clauses.rs +0 -0
  163. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/src/parser/expressions.rs +0 -0
  164. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/src/parser/literals.rs +0 -0
  165. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/src/parser/mod.rs +0 -0
  166. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/src/parser/patterns.rs +0 -0
  167. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/src/parser/query.rs +0 -0
  168. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/src/parser/tests.rs +0 -0
  169. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/src/parser/util.rs +0 -0
  170. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-parser/tests/error_messages.rs +0 -0
  171. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/Cargo.toml +0 -0
  172. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/src/body.rs +0 -0
  173. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/src/codec.rs +0 -0
  174. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/src/columnar.rs +0 -0
  175. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/src/envelope.rs +0 -0
  176. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/src/errors.rs +0 -0
  177. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/src/format.rs +0 -0
  178. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/src/lib.rs +0 -0
  179. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/src/options.rs +0 -0
  180. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/src/tests.rs +0 -0
  181. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/src/transform.rs +0 -0
  182. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/src/view.rs +0 -0
  183. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  184. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/Cargo.toml +0 -0
  185. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/lib.rs +0 -0
  186. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/lock_table.rs +0 -0
  187. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/memory/impls.rs +0 -0
  188. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/memory/mod.rs +0 -0
  189. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/memory/property_index.rs +0 -0
  190. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/memory/snapshot.rs +0 -0
  191. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/memory/tests.rs +0 -0
  192. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/mutation.rs +0 -0
  193. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/snapshot.rs +0 -0
  194. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/traits.rs +0 -0
  195. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/binary/mod.rs +0 -0
  196. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/binary/tests.rs +0 -0
  197. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/binary/traits.rs +0 -0
  198. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/binary/types.rs +0 -0
  199. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/graph.rs +0 -0
  200. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/mod.rs +0 -0
  201. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/property_value.rs +0 -0
  202. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  203. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/spatial/mod.rs +0 -0
  204. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/spatial/point.rs +0 -0
  205. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  206. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  207. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  208. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/temporal/date.rs +0 -0
  209. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
  210. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/temporal/duration.rs +0 -0
  211. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/temporal/format.rs +0 -0
  212. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  213. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  214. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/temporal/time.rs +0 -0
  215. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/vector/build.rs +0 -0
  216. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/vector/mod.rs +0 -0
  217. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  218. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/vector/tests.rs +0 -0
  219. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/src/types/vector/types.rs +0 -0
  220. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-store/tests/error_messages.rs +0 -0
  221. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/Cargo.toml +0 -0
  222. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/codec/decode.rs +0 -0
  223. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/codec/encode.rs +0 -0
  224. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/codec/format.rs +0 -0
  225. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/codec/mod.rs +0 -0
  226. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/codec/tests.rs +0 -0
  227. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/config.rs +0 -0
  228. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/dir.rs +0 -0
  229. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/errors.rs +0 -0
  230. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/io.rs +0 -0
  231. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/lib.rs +0 -0
  232. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/lock.rs +0 -0
  233. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/lsn.rs +0 -0
  234. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/record.rs +0 -0
  235. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/recorder/errors.rs +0 -0
  236. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  237. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/recorder/mod.rs +0 -0
  238. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/recorder/recorder.rs +0 -0
  239. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/recorder/tests.rs +0 -0
  240. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/replay.rs +0 -0
  241. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/segment.rs +0 -0
  242. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/testing.rs +0 -0
  243. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
  244. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/wal/mod.rs +0 -0
  245. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/wal/tests.rs +0 -0
  246. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/src/wal/wal.rs +0 -0
  247. {lora_python-0.8.3 → lora_python-0.8.4}/crates/lora-wal/tests/error_messages.rs +0 -0
  248. {lora_python-0.8.3 → lora_python-0.8.4}/python/lora_python/__init__.py +0 -0
  249. {lora_python-0.8.3 → lora_python-0.8.4}/python/lora_python/_async.py +0 -0
  250. {lora_python-0.8.3 → lora_python-0.8.4}/python/lora_python/_native.pyi +0 -0
  251. {lora_python-0.8.3 → lora_python-0.8.4}/python/lora_python/py.typed +0 -0
  252. {lora_python-0.8.3 → lora_python-0.8.4}/python/lora_python/types.py +0 -0
@@ -797,7 +797,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
797
797
 
798
798
  [[package]]
799
799
  name = "lora-analyzer"
800
- version = "0.8.3"
800
+ version = "0.8.4"
801
801
  dependencies = [
802
802
  "lora-ast",
803
803
  "lora-parser",
@@ -807,14 +807,14 @@ dependencies = [
807
807
 
808
808
  [[package]]
809
809
  name = "lora-ast"
810
- version = "0.8.3"
810
+ version = "0.8.4"
811
811
  dependencies = [
812
812
  "smallvec 2.0.0-alpha.12",
813
813
  ]
814
814
 
815
815
  [[package]]
816
816
  name = "lora-binding-buffer"
817
- version = "0.8.3"
817
+ version = "0.8.4"
818
818
  dependencies = [
819
819
  "lora-database",
820
820
  "lora-store",
@@ -822,7 +822,7 @@ dependencies = [
822
822
 
823
823
  [[package]]
824
824
  name = "lora-compiler"
825
- version = "0.8.3"
825
+ version = "0.8.4"
826
826
  dependencies = [
827
827
  "lora-analyzer",
828
828
  "lora-ast",
@@ -830,7 +830,7 @@ dependencies = [
830
830
 
831
831
  [[package]]
832
832
  name = "lora-database"
833
- version = "0.8.3"
833
+ version = "0.8.4"
834
834
  dependencies = [
835
835
  "anyhow",
836
836
  "arc-swap",
@@ -852,7 +852,7 @@ dependencies = [
852
852
 
853
853
  [[package]]
854
854
  name = "lora-executor"
855
- version = "0.8.3"
855
+ version = "0.8.4"
856
856
  dependencies = [
857
857
  "lora-analyzer",
858
858
  "lora-ast",
@@ -867,7 +867,7 @@ dependencies = [
867
867
 
868
868
  [[package]]
869
869
  name = "lora-ffi"
870
- version = "0.8.3"
870
+ version = "0.8.4"
871
871
  dependencies = [
872
872
  "anyhow",
873
873
  "lora-binding-buffer",
@@ -879,7 +879,7 @@ dependencies = [
879
879
 
880
880
  [[package]]
881
881
  name = "lora-node"
882
- version = "0.8.3"
882
+ version = "0.8.4"
883
883
  dependencies = [
884
884
  "anyhow",
885
885
  "lora-binding-buffer",
@@ -894,7 +894,7 @@ dependencies = [
894
894
 
895
895
  [[package]]
896
896
  name = "lora-parser"
897
- version = "0.8.3"
897
+ version = "0.8.4"
898
898
  dependencies = [
899
899
  "lora-ast",
900
900
  "pest",
@@ -905,7 +905,7 @@ dependencies = [
905
905
 
906
906
  [[package]]
907
907
  name = "lora-python"
908
- version = "0.8.3"
908
+ version = "0.8.4"
909
909
  dependencies = [
910
910
  "anyhow",
911
911
  "lora-database",
@@ -917,7 +917,7 @@ dependencies = [
917
917
 
918
918
  [[package]]
919
919
  name = "lora-server"
920
- version = "0.8.3"
920
+ version = "0.8.4"
921
921
  dependencies = [
922
922
  "anyhow",
923
923
  "axum",
@@ -931,7 +931,7 @@ dependencies = [
931
931
 
932
932
  [[package]]
933
933
  name = "lora-snapshot"
934
- version = "0.8.3"
934
+ version = "0.8.4"
935
935
  dependencies = [
936
936
  "argon2",
937
937
  "bincode",
@@ -946,7 +946,7 @@ dependencies = [
946
946
 
947
947
  [[package]]
948
948
  name = "lora-store"
949
- version = "0.8.3"
949
+ version = "0.8.4"
950
950
  dependencies = [
951
951
  "bincode",
952
952
  "crc32fast",
@@ -958,7 +958,7 @@ dependencies = [
958
958
 
959
959
  [[package]]
960
960
  name = "lora-wal"
961
- version = "0.8.3"
961
+ version = "0.8.4"
962
962
  dependencies = [
963
963
  "crc32fast",
964
964
  "lora-store",
@@ -968,7 +968,7 @@ dependencies = [
968
968
 
969
969
  [[package]]
970
970
  name = "lora-wasm"
971
- version = "0.8.3"
971
+ version = "0.8.4"
972
972
  dependencies = [
973
973
  "anyhow",
974
974
  "console_error_panic_hook",
@@ -984,7 +984,7 @@ dependencies = [
984
984
 
985
985
  [[package]]
986
986
  name = "lora_ruby"
987
- version = "0.8.3"
987
+ version = "0.8.4"
988
988
  dependencies = [
989
989
  "anyhow",
990
990
  "lora-database",
@@ -1408,18 +1408,18 @@ dependencies = [
1408
1408
 
1409
1409
  [[package]]
1410
1410
  name = "rb-sys"
1411
- version = "0.9.126"
1411
+ version = "0.9.128"
1412
1412
  source = "registry+https://github.com/rust-lang/crates.io-index"
1413
- checksum = "284799e73e899fe946fd77c7211b83bff61a1356e039ade7a2516a779e3212d0"
1413
+ checksum = "45ca28513560e56cfb79a62b1fce363c73af170a182024ce880c77ee9429920a"
1414
1414
  dependencies = [
1415
1415
  "rb-sys-build",
1416
1416
  ]
1417
1417
 
1418
1418
  [[package]]
1419
1419
  name = "rb-sys-build"
1420
- version = "0.9.126"
1420
+ version = "0.9.128"
1421
1421
  source = "registry+https://github.com/rust-lang/crates.io-index"
1422
- checksum = "855fc1ad8943d12c89ef12f9147f1cc531f5bf19fb744112fdd317bb6ee7b5c5"
1422
+ checksum = "ce04b2c55eff3a21aaa623fcc655d94373238e72cac6b3e1a3641ff31649f99a"
1423
1423
  dependencies = [
1424
1424
  "bindgen",
1425
1425
  "lazy_static",
@@ -4,7 +4,7 @@ resolver = "2"
4
4
 
5
5
  [workspace.package]
6
6
  edition = "2021"
7
- version = "0.8.3"
7
+ version = "0.8.4"
8
8
  license = "BUSL-1.1"
9
9
  authors = ["LoraDB, Inc."]
10
10
  repository = "https://github.com/lora-db/lora"
@@ -15,16 +15,16 @@ 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.8.3" }
19
- lora-parser = { path = "crates/lora-parser", version = "=0.8.3" }
20
- lora-analyzer = { path = "crates/lora-analyzer", version = "=0.8.3" }
21
- lora-compiler = { path = "crates/lora-compiler", version = "=0.8.3" }
22
- lora-store = { path = "crates/lora-store", version = "=0.8.3" }
23
- lora-snapshot = { path = "crates/lora-snapshot", version = "=0.8.3", default-features = false }
24
- lora-wal = { path = "crates/lora-wal", version = "=0.8.3" }
25
- lora-executor = { path = "crates/lora-executor", version = "=0.8.3" }
26
- lora-database = { path = "crates/lora-database", version = "=0.8.3" }
27
- lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.8.3" }
18
+ lora-ast = { path = "crates/lora-ast", version = "=0.8.4" }
19
+ lora-parser = { path = "crates/lora-parser", version = "=0.8.4" }
20
+ lora-analyzer = { path = "crates/lora-analyzer", version = "=0.8.4" }
21
+ lora-compiler = { path = "crates/lora-compiler", version = "=0.8.4" }
22
+ lora-store = { path = "crates/lora-store", version = "=0.8.4" }
23
+ lora-snapshot = { path = "crates/lora-snapshot", version = "=0.8.4", default-features = false }
24
+ lora-wal = { path = "crates/lora-wal", version = "=0.8.4" }
25
+ lora-executor = { path = "crates/lora-executor", version = "=0.8.4" }
26
+ lora-database = { path = "crates/lora-database", version = "=0.8.4" }
27
+ lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.8.4" }
28
28
 
29
29
  # External crates.
30
30
  anyhow = "1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lora-python
3
- Version: 0.8.3
3
+ Version: 0.8.4
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -5,7 +5,7 @@
5
5
  "default_threshold": 3,
6
6
  "seeded_on": "2026-04-24",
7
7
  "seeded_from": "Rough scaling of docs/performance/benchmarks.md numbers to allow for ubuntu-latest CI being slower and noisier than the reference Apple Silicon run. Replace with real CI-measured values on first green run.",
8
- "last_updated": "2026-04-26"
8
+ "last_updated": "2026-05-06"
9
9
  },
10
10
  "benchmarks": {
11
11
  "perf_smoke/scan_1k": {
@@ -40,6 +40,21 @@
40
40
  },
41
41
  "perf_smoke/tx_write_100": {
42
42
  "ns": 114336
43
+ },
44
+ "perf_smoke/write_one_wal_group": {
45
+ "ns": 40000,
46
+ "threshold": 5,
47
+ "note": "Seed estimate from local Apple Silicon (~15 µs/iter) scaled ~2.5x for ubuntu-latest. Refresh after first green CI run."
48
+ },
49
+ "perf_smoke/write_batch_100_wal_group": {
50
+ "ns": 4000000,
51
+ "threshold": 5,
52
+ "note": "Seed estimate from local Apple Silicon (~1.56 ms/iter) scaled ~2.5x for ubuntu-latest. Wide threshold because WAL segment rotation and FS noise inflate variance. Refresh after first green CI run."
53
+ },
54
+ "perf_smoke/tx_write_100_wal_group": {
55
+ "ns": 7000000,
56
+ "threshold": 5,
57
+ "note": "Seed estimate from local Apple Silicon (~2.6 ms/iter) scaled ~2.5x for ubuntu-latest. Wide threshold because the explicit-tx path stages-and-publishes alongside the WAL append and adds variance. Refresh after first green CI run."
43
58
  }
44
59
  }
45
60
  }
@@ -22,9 +22,12 @@ mod fixtures;
22
22
 
23
23
  use criterion::{criterion_group, criterion_main, BatchSize, Criterion};
24
24
  use fixtures::*;
25
- use lora_database::{ExecuteOptions, ResultFormat, TransactionMode};
25
+ use lora_database::{
26
+ Database, ExecuteOptions, InMemoryGraph, ResultFormat, SyncMode, TransactionMode, WalConfig,
27
+ };
26
28
  use std::hint::black_box;
27
- use std::time::Duration;
29
+ use std::path::PathBuf;
30
+ use std::time::{Duration, SystemTime, UNIX_EPOCH};
28
31
 
29
32
  fn opts() -> Option<ExecuteOptions> {
30
33
  Some(ExecuteOptions {
@@ -32,6 +35,51 @@ fn opts() -> Option<ExecuteOptions> {
32
35
  })
33
36
  }
34
37
 
38
+ /// Per-iteration scratch directory for WAL-backed benches. Removed on
39
+ /// drop, so each Criterion sample starts on an empty WAL.
40
+ struct WalScratch {
41
+ path: PathBuf,
42
+ }
43
+
44
+ impl WalScratch {
45
+ fn new(tag: &str) -> Self {
46
+ let mut path = std::env::temp_dir();
47
+ path.push(format!(
48
+ "lora-perf-smoke-{}-{}-{}",
49
+ tag,
50
+ std::process::id(),
51
+ SystemTime::now()
52
+ .duration_since(UNIX_EPOCH)
53
+ .unwrap()
54
+ .as_nanos()
55
+ ));
56
+ std::fs::create_dir_all(&path).unwrap();
57
+ Self { path }
58
+ }
59
+ }
60
+
61
+ impl Drop for WalScratch {
62
+ fn drop(&mut self) {
63
+ let _ = std::fs::remove_dir_all(&self.path);
64
+ }
65
+ }
66
+
67
+ /// Open a WAL-backed database with `SyncMode::Group`. Group sync matches
68
+ /// the durability profile most embedded callers reach for — write-only
69
+ /// on commit, background flusher fsyncs on a 50 ms interval — and keeps
70
+ /// the bench dominated by engine + WAL append cost rather than fsync
71
+ /// latency.
72
+ fn open_wal_group(tag: &str) -> (WalScratch, Database<InMemoryGraph>) {
73
+ let dir = WalScratch::new(tag);
74
+ let cfg = WalConfig::Enabled {
75
+ dir: dir.path.clone(),
76
+ sync_mode: SyncMode::Group { interval_ms: 50 },
77
+ segment_target_bytes: 8 * 1024 * 1024,
78
+ };
79
+ let db = Database::open_with_wal(cfg).unwrap();
80
+ (dir, db)
81
+ }
82
+
35
83
  /// CI-friendly Criterion config: short warmup + short measurement + modest
36
84
  /// sample count. Total measurement budget per bench ≈ 1.8 s.
37
85
  fn smoke_config() -> Criterion {
@@ -263,6 +311,67 @@ fn bench_perf_smoke(c: &mut Criterion) {
263
311
  );
264
312
  });
265
313
 
314
+ // --- 11. persistent single CREATE: WAL group sync --------------------
315
+ //
316
+ // Auto-commit `CREATE` against a WAL-backed DB. The DB is opened
317
+ // once and shared across iterations — the WAL grows, but UNWIND-free
318
+ // CREATE has no scan cost, so per-iteration cost stays steady-state.
319
+ // What this bench captures is one record-encode + one segment append
320
+ // + one `Arc::make_mut` mutation. A regression here means the
321
+ // durable single-write path picked up per-call overhead beyond the
322
+ // fixed WAL append cost.
323
+ {
324
+ let (_dir, db) = open_wal_group("write-one");
325
+ group.bench_function("write_one_wal_group", |b| {
326
+ b.iter(|| {
327
+ black_box(db.execute("CREATE (:B {n: 1})", opts()).unwrap());
328
+ });
329
+ });
330
+ }
331
+
332
+ // --- 12. persistent batched write: WAL group sync --------------------
333
+ //
334
+ // Same shape as `write_batch_100` but committed durably via the
335
+ // group-sync WAL path. Distance from `write_batch_100` is the
336
+ // batched-write WAL overhead (one append, not 100). A regression
337
+ // that affects only the persistence write path — e.g., a per-row
338
+ // WAL fence or extra encode pass — shows up here without moving
339
+ // the in-memory baseline.
340
+ {
341
+ let (_dir, db) = open_wal_group("write-batch-100");
342
+ group.bench_function("write_batch_100_wal_group", |b| {
343
+ b.iter(|| {
344
+ black_box(
345
+ db.execute(
346
+ "UNWIND range(1, 100) AS i CREATE (:B {id: i, val: i * 2})",
347
+ opts(),
348
+ )
349
+ .unwrap(),
350
+ );
351
+ });
352
+ });
353
+ }
354
+
355
+ // --- 13. persistent explicit transaction: WAL group sync -------------
356
+ //
357
+ // Mirror of `tx_write_100` against the WAL/group profile. Catches
358
+ // regressions in the explicit-transaction commit path where it
359
+ // intersects the WAL recorder (transaction commit promotes the
360
+ // staged graph and appends one batched commit record).
361
+ {
362
+ let (_dir, db) = open_wal_group("tx-write-100");
363
+ group.bench_function("tx_write_100_wal_group", |b| {
364
+ b.iter(|| {
365
+ let mut tx = db.begin_transaction(TransactionMode::ReadWrite).unwrap();
366
+ black_box(
367
+ tx.execute("UNWIND range(1, 100) AS i CREATE (:B {id: i})", opts())
368
+ .unwrap(),
369
+ );
370
+ tx.commit().unwrap();
371
+ });
372
+ });
373
+ }
374
+
266
375
  group.finish();
267
376
  }
268
377
 
@@ -360,23 +360,17 @@ impl InMemoryGraph {
360
360
  .filter_map(|(i, slot)| slot.as_ref().map(|r| (i as RelationshipId, r.as_ref())))
361
361
  }
362
362
 
363
- /// Add `rel_id` to `node_id`'s outgoing list. Idempotent: skips the push
364
- /// if the id is already present (it shouldn't be — relationship ids are
365
- /// monotonic — but the guard is cheap and keeps the invariant explicit).
363
+ /// Add `rel_id` to `node_id`'s outgoing list. Relies on the monotonic-id
364
+ /// invariant: relationship ids are allocated once and never re-used, so
365
+ /// the bucket can never see a duplicate.
366
366
  fn outgoing_push(&mut self, node_id: NodeId, rel_id: RelationshipId) {
367
367
  self.ensure_node_slot(node_id);
368
- let v = &mut self.outgoing[node_id as usize];
369
- if !v.contains(&rel_id) {
370
- v.push(rel_id);
371
- }
368
+ self.outgoing[node_id as usize].push(rel_id);
372
369
  }
373
370
 
374
371
  fn incoming_push(&mut self, node_id: NodeId, rel_id: RelationshipId) {
375
372
  self.ensure_node_slot(node_id);
376
- let v = &mut self.incoming[node_id as usize];
377
- if !v.contains(&rel_id) {
378
- v.push(rel_id);
379
- }
373
+ self.incoming[node_id as usize].push(rel_id);
380
374
  }
381
375
 
382
376
  /// Remove `rel_id` from `node_id`'s outgoing list. `swap_remove` keeps
@@ -409,12 +403,14 @@ impl InMemoryGraph {
409
403
  }
410
404
 
411
405
  pub(super) fn insert_node_label_index(&mut self, node_id: NodeId, label: &str) {
412
- let bucket = self.nodes_by_label.entry(label.to_string()).or_default();
413
- // Same monotonic-id invariant as `outgoing_push`: ids never appear
414
- // twice, but the `contains` guard is cheap on small buckets and
415
- // makes the invariant explicit for replay paths.
416
- if !bucket.contains(&node_id) {
406
+ // Hot path: skip the `String` alloc when the label bucket already
407
+ // exists. The monotonic-id invariant on the create path guarantees
408
+ // `node_id` is unique, so we push unconditionally; the previous
409
+ // `contains` guard turned bulk CREATE into O(n²).
410
+ if let Some(bucket) = self.nodes_by_label.get_mut(label) {
417
411
  bucket.push(node_id);
412
+ } else {
413
+ self.nodes_by_label.insert(label.to_string(), vec![node_id]);
418
414
  }
419
415
  }
420
416
 
@@ -430,12 +426,12 @@ impl InMemoryGraph {
430
426
  }
431
427
 
432
428
  fn insert_relationship_type_index(&mut self, rel_id: RelationshipId, rel_type: &str) {
433
- let bucket = self
434
- .relationships_by_type
435
- .entry(rel_type.to_string())
436
- .or_default();
437
- if !bucket.contains(&rel_id) {
429
+ // See `insert_node_label_index` for the same hot-path rationale.
430
+ if let Some(bucket) = self.relationships_by_type.get_mut(rel_type) {
438
431
  bucket.push(rel_id);
432
+ } else {
433
+ self.relationships_by_type
434
+ .insert(rel_type.to_string(), vec![rel_id]);
439
435
  }
440
436
  }
441
437
 
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "lora-python"
7
- version = "0.8.3"
7
+ version = "0.8.4"
8
8
  description = "Python bindings for the Lora in-memory graph database"
9
9
  readme = "README.md"
10
10
  license = { text = "BUSL-1.1" }
File without changes
File without changes