sqlitegraph 0.5.0__tar.gz → 0.5.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/Cargo.lock +5 -5
  2. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/PKG-INFO +1 -1
  3. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/pyproject.toml +1 -1
  4. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/CHANGELOG.md +69 -0
  5. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/Cargo.toml +6 -1
  6. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/README.md +38 -35
  7. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/backend_comparison.rs +50 -53
  8. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/bench_utils.rs +23 -0
  9. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/cold_cache.rs +17 -13
  10. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/memory_profiling.rs +9 -18
  11. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/sqlite_v3_comparison.rs +79 -69
  12. sqlitegraph-0.5.2/sqlitegraph-core/benches/sqlite_v3_curated.rs +415 -0
  13. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/v3_backend_benchmarks.rs +11 -13
  14. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_performance_comparison.rs +16 -18
  15. sqlitegraph-0.5.2/sqlitegraph-core/src/algo/backend/iterator.rs +966 -0
  16. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/backend/mod.rs +5 -0
  17. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/mod.rs +5 -3
  18. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/pubsub/publisher.rs +11 -29
  19. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/core.rs +72 -35
  20. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/statement_tracker.rs +3 -2
  21. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/index.rs +303 -3
  22. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/index_api.rs +195 -24
  23. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/index_internal.rs +39 -19
  24. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/index_persist.rs +73 -11
  25. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/neighborhood.rs +60 -26
  26. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/storage.rs +39 -21
  27. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/progress.rs +3 -8
  28. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/query_cache.rs +13 -146
  29. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/schema.rs +7 -0
  30. sqlitegraph-0.5.2/sqlitegraph-core/tests/bench_lifetime_tests.rs +38 -0
  31. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/CHANGELOG.md +8 -1
  32. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/Cargo.toml +2 -2
  33. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/src/lib.rs +7 -28
  34. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/Cargo.toml +0 -0
  35. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/README.md +0 -0
  36. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/python/sqlitegraph/__init__.py +0 -0
  37. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/python/sqlitegraph/_native.pyi +0 -0
  38. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/python/sqlitegraph/py.typed +0 -0
  39. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/.gitignore +0 -0
  40. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/BLOCK_AWARE_CACHE_BEHAVIOR_REPORT.md +0 -0
  41. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/BLOCK_LOCALITY_PROTOTYPE_REPORT.md +0 -0
  42. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/BUG_10K_INVESTIGATION_SUMMARY.md +0 -0
  43. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/BUG_SNAPSHOTID_SQLITE_BACKEND.md +0 -0
  44. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/CACHE_CAPACITY_SWEEP_REPORT.md +0 -0
  45. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/CACHE_CLONE_FIX_REPORT.md +0 -0
  46. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/COLD_PATH_FORENSICS_REPORT.md +0 -0
  47. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/COLD_WARM_BENCHMARK_SPLIT_REPORT.md +0 -0
  48. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/EDGE_CORRUPTION_ROOT_CAUSE.md +0 -0
  49. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/LICENSE +0 -0
  50. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/MAIN_BENCHMARK_RERUN_REPORT.md +0 -0
  51. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/NODE_PAGE_OVERFLOW_FIX_REPORT.md +0 -0
  52. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/PAGE_ID_COLLISION_ROOT_CAUSE.md +0 -0
  53. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/PHASE3_NODE_PAGE_CACHE_FIX_REPORT.md +0 -0
  54. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/PHYSICAL_BLOCK_PLACEMENT_PROTOTYPE_REPORT.md +0 -0
  55. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/REBUILD_INDEXES_FIX_REPORT.md +0 -0
  56. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/REOPEN_CORRUPTION_FORENSICS.md +0 -0
  57. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/V3_10K_NODE_BUG_FIX.md +0 -0
  58. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/V3_FILE_IO_COORDINATION.md +0 -0
  59. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/V3_FORENSIC_REPORT.md +0 -0
  60. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/V3_REGRESSION_SWEEP_REPORT.md +0 -0
  61. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/adaptive_page_simple.rs +0 -0
  62. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/adjlist_benchmark.rs +0 -0
  63. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/algo_benchmarks.rs +0 -0
  64. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/bfs.rs +0 -0
  65. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/comparative_benchmark.rs +0 -0
  66. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/comprehensive_performance.rs +0 -0
  67. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/compression_benchmark.rs +0 -0
  68. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/concurrent_access.rs +0 -0
  69. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/connection_pool.rs +0 -0
  70. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/graph_generators.rs +0 -0
  71. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/graph_theory_benchmarks.rs +0 -0
  72. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/hnsw.rs +0 -0
  73. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/hnsw_multilayer.rs +0 -0
  74. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/insert.rs +0 -0
  75. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/k_hop.rs +0 -0
  76. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/mvcc_benchmarks.rs +0 -0
  77. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/native_disk_io.rs +0 -0
  78. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/parallel_bfs.rs +0 -0
  79. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/read_path_benchmarks.rs +0 -0
  80. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/real_datasets.rs +0 -0
  81. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_memory.rs +0 -0
  82. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_non_chain_patterns.rs +0 -0
  83. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_pubsub_memory.rs +0 -0
  84. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_pubsub_non_chain.rs +0 -0
  85. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_pubsub_write_cost.rs +0 -0
  86. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_write_cost.rs +0 -0
  87. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/v3_algorithm_benchmarks.rs +0 -0
  88. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/wal_recovery_benchmarks.rs +0 -0
  89. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/clippy.toml +0 -0
  90. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/core.d +0 -0
  91. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/debug_test.rs +0 -0
  92. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/HNSW_DEVELOPMENT_RULES.md +0 -0
  93. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/HNSW_VECTOR_INTEGRATION_FUTURE_ROADMAP.md +0 -0
  94. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/SEQUENTIAL_IO_PERFORMANCE.md +0 -0
  95. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/WAL_MODE_IMPLEMENTATION_GUIDE.md +0 -0
  96. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase-40-benchmark-report.md +0 -0
  97. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase10_performance_tuning.md +0 -0
  98. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase11_native_perf_plan.md +0 -0
  99. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase12_optimization_plan.md +0 -0
  100. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase14_step9_khop_corruption_codebase_mapping.md +0 -0
  101. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase29_step7_mmap_preaudit_notes.md +0 -0
  102. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase5_real_adjacency.md +0 -0
  103. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase6_implementation_status.md +0 -0
  104. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase6_native_graphbackend_plan.md +0 -0
  105. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase7_native_backend_refactor.md +0 -0
  106. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/superpowers/plans/2026-04-23-task-1-analysis.md +0 -0
  107. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/algo_benchmark.rs +0 -0
  108. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/basic_functionality_test.rs +0 -0
  109. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/batch_bench.rs +0 -0
  110. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/batch_stress_test.rs +0 -0
  111. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/bench_parallel_bfs.rs +0 -0
  112. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/block_locality_benchmark.rs +0 -0
  113. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/cache_capacity_benchmark.rs +0 -0
  114. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/cache_clone_forensics.rs +0 -0
  115. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/cache_perf_test.rs +0 -0
  116. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/cold_path_decomposition.rs +0 -0
  117. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/compression_analysis.rs +0 -0
  118. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/compression_detailed.rs +0 -0
  119. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/compression_diagnostics.rs +0 -0
  120. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/crash_test_child.rs +0 -0
  121. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/debug_buffer_error.rs +0 -0
  122. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/get_node_cache_sweep.rs +0 -0
  123. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/hybrid_sqlite_v3_hnsw_pubsub.rs +0 -0
  124. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/phase53_1_execution.rs +0 -0
  125. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/phase55_simple_benchmark.rs +0 -0
  126. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/reopen_corruption_repro.rs +0 -0
  127. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_100k.rs +0 -0
  128. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_adaptive_pages.rs +0 -0
  129. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_allocator_startup.rs +0 -0
  130. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_batch_simple.rs +0 -0
  131. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_binary_search.rs +0 -0
  132. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_btree_100k.rs +0 -0
  133. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_cache_warm.rs +0 -0
  134. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_chunked_bfs.rs +0 -0
  135. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_delta_encoding.rs +0 -0
  136. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_direct_backend_benchmark.rs +0 -0
  137. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_direct_edgestore.rs +0 -0
  138. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_edge_store_direct.rs +0 -0
  139. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_edgestore_perf.rs +0 -0
  140. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_index_restore.rs +0 -0
  141. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_index_staleness.rs +0 -0
  142. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_lazy_decode.rs +0 -0
  143. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_lock_overhead.rs +0 -0
  144. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_native_edge.rs +0 -0
  145. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_neighbors_cache.rs +0 -0
  146. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_neighbors_detailed.rs +0 -0
  147. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_neighbors_profile.rs +0 -0
  148. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_open_detailed_timing.rs +0 -0
  149. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_open_roundtrip.rs +0 -0
  150. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_open_stage_timing.rs +0 -0
  151. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_rwlock_overhead.rs +0 -0
  152. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_sqlite_neighbors_perf.rs +0 -0
  153. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_v3_neighbors_perf.rs +0 -0
  154. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_vec_clone.rs +0 -0
  155. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_forensic_page_analysis.rs +0 -0
  156. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_forensics_example.rs +0 -0
  157. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_get_node_profile.rs +0 -0
  158. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_offset_forensic.rs +0 -0
  159. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_perf_test.rs +0 -0
  160. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_readonly_profile.rs +0 -0
  161. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_reopen_verify.rs +0 -0
  162. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/libtest_syntax.rlib +0 -0
  163. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/manual.md +0 -0
  164. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/snapshot_export/snapshot_1766284406.v2 +0 -0
  165. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/snapshot_export/snapshot_1766284420.v2 +0 -0
  166. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/sqlitegraph_bench.json +0 -0
  167. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/backend/centrality.rs +0 -0
  168. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/backend/graph_ops.rs +0 -0
  169. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/backend/traversal.rs +0 -0
  170. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/call_graph_analysis.rs +0 -0
  171. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/centrality.rs +0 -0
  172. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/community.rs +0 -0
  173. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/control_dependence.rs +0 -0
  174. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/critical_path.rs +0 -0
  175. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/cut_partition.rs +0 -0
  176. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/cycle_basis.rs +0 -0
  177. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/dominance_frontiers.rs +0 -0
  178. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/dominators.rs +0 -0
  179. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/graph_diff.rs +0 -0
  180. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/graph_rewriting.rs +0 -0
  181. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/graph_similarity.rs +0 -0
  182. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/natural_loops.rs +0 -0
  183. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/observability.rs +0 -0
  184. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/path_enumeration.rs +0 -0
  185. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/post_dominators.rs +0 -0
  186. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/program_slicing.rs +0 -0
  187. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/reachability.rs +0 -0
  188. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/scc.rs +0 -0
  189. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/structure.rs +0 -0
  190. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/subgraph_isomorphism.rs +0 -0
  191. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/taint_analysis.rs +0 -0
  192. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/tests.rs +0 -0
  193. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/topological_sort.rs +0 -0
  194. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/transitive_closure.rs +0 -0
  195. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/transitive_reduction.rs +0 -0
  196. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/wcc.rs +0 -0
  197. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/api_ergonomics.rs +0 -0
  198. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/constants.rs +0 -0
  199. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/cpu_tuning.rs +0 -0
  200. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/mod.rs +0 -0
  201. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/aliases.rs +0 -0
  202. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/cpu_profile.rs +0 -0
  203. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/errors.rs +0 -0
  204. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/flags.rs +0 -0
  205. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/kv_types.rs +0 -0
  206. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/mod.rs +0 -0
  207. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/utils.rs +0 -0
  208. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/algorithm/mod.rs +0 -0
  209. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/algorithm/parallel_bfs.rs +0 -0
  210. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/allocator.rs +0 -0
  211. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/backend.rs +0 -0
  212. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/btree.rs +0 -0
  213. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/compact_edge_record.rs +0 -0
  214. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/compression/delta.rs +0 -0
  215. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/compression/edge_delta.rs +0 -0
  216. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/compression/mod.rs +0 -0
  217. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/compression/varint.rs +0 -0
  218. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/constants.rs +0 -0
  219. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/edge_compat.rs +0 -0
  220. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/file_coordinator.rs +0 -0
  221. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/forensics.rs +0 -0
  222. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/header.rs +0 -0
  223. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/index/mod.rs +0 -0
  224. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/index/page.rs +0 -0
  225. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/index_persistence.rs +0 -0
  226. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/kind_index.rs +0 -0
  227. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/kv_store/mod.rs +0 -0
  228. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/kv_store/store.rs +0 -0
  229. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/kv_store/types.rs +0 -0
  230. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/lazy_init_tests.rs +0 -0
  231. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/mod.rs +0 -0
  232. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/name_index.rs +0 -0
  233. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/block_cache.rs +0 -0
  234. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/cache.rs +0 -0
  235. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/mod.rs +0 -0
  236. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/page.rs +0 -0
  237. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/record.rs +0 -0
  238. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/store.rs +0 -0
  239. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/tests.rs +0 -0
  240. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/pubsub/mod.rs +0 -0
  241. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/pubsub/types.rs +0 -0
  242. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/storage/adaptive_page.rs +0 -0
  243. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/storage/media_detector.rs +0 -0
  244. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/storage/mod.rs +0 -0
  245. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/string_table/mod.rs +0 -0
  246. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/string_table/table.rs +0 -0
  247. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/string_table/tests.rs +0 -0
  248. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/tests/mod.rs +0 -0
  249. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/wal.rs +0 -0
  250. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/write_batch.rs +0 -0
  251. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/helpers.rs +0 -0
  252. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/impl_.rs +0 -0
  253. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/kv_tests.rs +0 -0
  254. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/mod.rs +0 -0
  255. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/pubsub_tests.rs +0 -0
  256. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/types.rs +0 -0
  257. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend.rs +0 -0
  258. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend_selector.rs +0 -0
  259. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/bench_gates.rs +0 -0
  260. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/bench_meta.rs +0 -0
  261. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/bench_regression.rs +0 -0
  262. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/bench_utils.rs +0 -0
  263. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/bfs.rs +0 -0
  264. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/cache.rs +0 -0
  265. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/client.rs +0 -0
  266. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/factory.rs +0 -0
  267. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/graph_config.rs +0 -0
  268. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/kinds.rs +0 -0
  269. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/mod.rs +0 -0
  270. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/native.rs +0 -0
  271. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/sqlite.rs +0 -0
  272. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/cypher.rs +0 -0
  273. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/dependency_monitor.rs +0 -0
  274. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/dsl.rs +0 -0
  275. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/errors.rs +0 -0
  276. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/fault_injection.rs +0 -0
  277. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/adjacency.rs +0 -0
  278. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/edge_ops.rs +0 -0
  279. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/entity_ops.rs +0 -0
  280. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/instrumented.rs +0 -0
  281. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/metrics_core.rs +0 -0
  282. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/metrics_snapshot.rs +0 -0
  283. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/mod.rs +0 -0
  284. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/utils.rs +0 -0
  285. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics_schema.rs +0 -0
  286. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/mod.rs +0 -0
  287. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/pattern_matching.rs +0 -0
  288. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/pool.rs +0 -0
  289. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/snapshot.rs +0 -0
  290. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/types.rs +0 -0
  291. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph_opt.rs +0 -0
  292. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/batch_filter.rs +0 -0
  293. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/builder.rs +0 -0
  294. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/config.rs +0 -0
  295. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/distance_functions.rs +0 -0
  296. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/distance_metric.rs +0 -0
  297. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/errors.rs +0 -0
  298. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/layer.rs +0 -0
  299. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/mod.rs +0 -0
  300. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/multilayer.rs +0 -0
  301. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/serialization.rs +0 -0
  302. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/simd.rs +0 -0
  303. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/v3_storage.rs +0 -0
  304. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/v3_storage_tests.rs +0 -0
  305. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/index.rs +0 -0
  306. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/inference/engine.rs +0 -0
  307. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/inference/mod.rs +0 -0
  308. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/inference/sampling.rs +0 -0
  309. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/inference/simd.rs +0 -0
  310. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/introspection.rs +0 -0
  311. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/lib.rs +0 -0
  312. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/multi_hop.rs +0 -0
  313. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/mvcc.rs +0 -0
  314. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern.rs +0 -0
  315. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/matcher.rs +0 -0
  316. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/mod.rs +0 -0
  317. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/pattern.rs +0 -0
  318. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/property.rs +0 -0
  319. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/query.rs +0 -0
  320. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/tests.rs +0 -0
  321. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine_cache/edge_validation.rs +0 -0
  322. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine_cache/fast_path_detection.rs +0 -0
  323. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine_cache/fast_path_execution.rs +0 -0
  324. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine_cache/mod.rs +0 -0
  325. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine_cache/tests.rs +0 -0
  326. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/query.rs +0 -0
  327. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/reasoning.rs +0 -0
  328. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/recovery.rs +0 -0
  329. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/snapshot.rs +0 -0
  330. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/typed_digraph/algo.rs +0 -0
  331. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/typed_digraph/graph.rs +0 -0
  332. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/typed_digraph/mod.rs +0 -0
  333. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/typed_digraph/tests.rs +0 -0
  334. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/acid_regression_test.rs +0 -0
  335. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/acid_snapshot_test.rs +0 -0
  336. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/algo_tests.rs +0 -0
  337. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/backend_selector_tests.rs +0 -0
  338. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bench_data_tests.rs +0 -0
  339. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bench_gate_tests.rs +0 -0
  340. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bench_gates_tests.rs +0 -0
  341. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bench_meta_tests.rs +0 -0
  342. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bench_report_tests.rs +0 -0
  343. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/benchmark_isolation_test.rs +0 -0
  344. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bfs_tests.rs +0 -0
  345. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bincode_compatibility_test.rs +0 -0
  346. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bulk_insert_tests.rs +0 -0
  347. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/cache_effectiveness_tests.rs +0 -0
  348. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/cache_tests.rs +0 -0
  349. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/check_write_path.rs +0 -0
  350. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/cluster_offset_corruption_regression.rs +0 -0
  351. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/cold_path_forensics.rs +0 -0
  352. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/cypher_tests.rs +0 -0
  353. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/debug_file_size.rs +0 -0
  354. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/debug_index_rebuilding.rs +0 -0
  355. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/debug_overflow.rs +0 -0
  356. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/debug_scenario_c.rs +0 -0
  357. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/deterministic_index_tests.rs +0 -0
  358. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/direct_file_read_corruption_test.rs +0 -0
  359. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/doc_tests.rs +0 -0
  360. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/edge_corruption_minimal.rs +0 -0
  361. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/edge_corruption_repro.rs +0 -0
  362. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/edge_insertion_corruption_test.rs +0 -0
  363. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/edge_tests.rs +0 -0
  364. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/entity_tests.rs +0 -0
  365. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/file_extension_debug.rs +0 -0
  366. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/fuzz_common.rs +0 -0
  367. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/get_node_forensics.rs +0 -0
  368. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/graph_node_existence_enforcement.rs +0 -0
  369. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/graph_opt_tests.rs +0 -0
  370. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/helpers/mod.rs +0 -0
  371. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/hnsw_persistence_tests.rs +0 -0
  372. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/index_persistence_integration.rs +0 -0
  373. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/index_persistence_validation.rs +0 -0
  374. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/index_tests.rs +0 -0
  375. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/instrumentation_tests.rs +0 -0
  376. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/integration_tests.rs +0 -0
  377. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/isolate_open_bug.rs +0 -0
  378. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/kv_durability_tests.rs +0 -0
  379. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/lib_api_smoke_tests.rs +0 -0
  380. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/multi_hop_tests.rs +0 -0
  381. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/multi_node_corruption_regression.rs +0 -0
  382. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/mvcc_baseline_tests.rs +0 -0
  383. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/mvcc_concurrent_tests.rs +0 -0
  384. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/mvcc_edge_case_tests.rs +0 -0
  385. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/mvcc_snapshot_tests.rs +0 -0
  386. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/mvcc_wal_tests.rs +0 -0
  387. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/native_edge_insertion_regression.rs +0 -0
  388. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/node_overflow_forensics.rs +0 -0
  389. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/node_read_forensics_test.rs +0 -0
  390. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/node_slot_transaction_persistence.rs +0 -0
  391. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/oom_reproduction_test.rs +0 -0
  392. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/page_42_debug.rs +0 -0
  393. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/page_write_debug.rs +0 -0
  394. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/pattern_cache_fastpath_tests.rs +0 -0
  395. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/pattern_engine_tests.rs +0 -0
  396. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/pattern_tests.rs +0 -0
  397. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/perf_gate_tests.rs +0 -0
  398. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/perf_gate_v32_tests.rs +0 -0
  399. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/phase32_cluster_pipeline_reconstruction_tests_clean.rs +0 -0
  400. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/phase44_2_cluster_size_contract_tests.rs +0 -0
  401. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/phase64_node_count_durability_regression.rs +0 -0
  402. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/phase65_cluster_size_corruption_regression.rs +0 -0
  403. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/phase73_node_count_corruption_capture.rs +0 -0
  404. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/query_cache_performance_tests.rs +0 -0
  405. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/query_cache_tests.rs +0 -0
  406. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/query_tests.rs +0 -0
  407. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/recovery_tests.rs +0 -0
  408. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/regression_concurrent_traversal.rs +0 -0
  409. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/reopen_corruption_investigation.rs +0 -0
  410. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/reopen_integration_test.rs +0 -0
  411. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/rowid_tests.rs +0 -0
  412. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/schema_tests.rs +0 -0
  413. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/snapshot_isolation_tests.rs +0 -0
  414. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/sqlite_reopen_tests.rs +0 -0
  415. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/sqlite_snapshot_tests.rs +0 -0
  416. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/test_10k_bug_reproduction.rs +0 -0
  417. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/unsafe_invariants_tests.rs +0 -0
  418. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_algorithm_tests.rs +0 -0
  419. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_block_locality_tests.rs +0 -0
  420. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_btree_forensics.rs +0 -0
  421. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_check_nodepages.rs +0 -0
  422. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_dump_page_headers.rs +0 -0
  423. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_edge_durability_tdd.rs +0 -0
  424. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_file_write_test.rs +0 -0
  425. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_focused_perf.rs +0 -0
  426. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_forensics_test.rs +0 -0
  427. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_header_forensics.rs +0 -0
  428. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_insert_read_forensics.rs +0 -0
  429. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_integrity_check.rs +0 -0
  430. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_kind_index_tests.rs +0 -0
  431. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_name_index_tests.rs +0 -0
  432. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_page_ownership_forensics.rs +0 -0
  433. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_persistence_100.rs +0 -0
  434. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_query_truth_tests.rs +0 -0
  435. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_regression_sweep.rs +0 -0
  436. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_reopen_durability.rs +0 -0
  437. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_sync_fix_validation.rs +0 -0
  438. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_verify_file_persistence.rs +0 -0
  439. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/wal_mode_default_tests.rs +0 -0
  440. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/wal_tuning_tests.rs +0 -0
  441. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/write_buffer_coherence_regression.rs +0 -0
  442. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/.gitignore +0 -0
  443. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/README.md +0 -0
  444. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/01_basic_crud.py +0 -0
  445. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/02_graph_algorithms.py +0 -0
  446. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/03_vector_search.py +0 -0
  447. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/04_social_network.py +0 -0
  448. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/05_file_backed.py +0 -0
  449. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/06_hybrid_sqlite_hnsw_query.py +0 -0
  450. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_algo.py +0 -0
  451. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_basic.py +0 -0
  452. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_bulk_insert.py +0 -0
  453. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_crud.py +0 -0
  454. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_errors.py +0 -0
  455. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_filtered_traversal.py +0 -0
  456. {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_hnsw.py +0 -0
@@ -163,9 +163,9 @@ dependencies = [
163
163
 
164
164
  [[package]]
165
165
  name = "bitflags"
166
- version = "2.12.1"
166
+ version = "2.13.0"
167
167
  source = "registry+https://github.com/rust-lang/crates.io-index"
168
- checksum = "84d7ced0ae9557296835c32bf1b1e02b44c746701f898460fb000d7eaa84f00a"
168
+ checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
169
169
 
170
170
  [[package]]
171
171
  name = "block-buffer"
@@ -1387,7 +1387,7 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
1387
1387
 
1388
1388
  [[package]]
1389
1389
  name = "sqlitegraph"
1390
- version = "3.1.0"
1390
+ version = "3.2.3"
1391
1391
  dependencies = [
1392
1392
  "ahash",
1393
1393
  "arc-swap",
@@ -1419,7 +1419,7 @@ dependencies = [
1419
1419
 
1420
1420
  [[package]]
1421
1421
  name = "sqlitegraph-cli"
1422
- version = "3.1.0"
1422
+ version = "3.2.0"
1423
1423
  dependencies = [
1424
1424
  "anyhow",
1425
1425
  "clap",
@@ -1429,7 +1429,7 @@ dependencies = [
1429
1429
 
1430
1430
  [[package]]
1431
1431
  name = "sqlitegraph-py"
1432
- version = "0.5.0"
1432
+ version = "0.5.2"
1433
1433
  dependencies = [
1434
1434
  "ndarray 0.16.1",
1435
1435
  "numpy",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlitegraph
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
6
6
  Classifier: Programming Language :: Python :: 3
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "sqlitegraph"
7
- version = "0.5.0"
7
+ version = "0.5.2"
8
8
  description = "Embedded graph database with HNSW vector search — Python bindings to the sqlitegraph Rust crate."
9
9
  license = { text = "GPL-3.0-only" }
10
10
  authors = [{ name = "Luiz Spies" }]
@@ -1,5 +1,74 @@
1
1
  # SQLiteGraph Changelog
2
2
 
3
+ ## [3.2.3] - 2026-06-07
4
+
5
+ ### Changed
6
+
7
+ - **Benchmarking guidance corrected and consolidated** — Added
8
+ `docs/BENCHMARKING.md`, updated README benchmark instructions to use release
9
+ mode for the quick comparison example, and removed stale claims that no
10
+ longer matched current clean runs.
11
+ - **`sqlite_v3_curated` benchmark added** — A small-case Criterion suite for
12
+ high-signal SQLite vs V3 comparisons that completes in practical time on a
13
+ developer workstation.
14
+ - **`examples/test_performance_comparison.rs` now describes itself correctly** —
15
+ The example is documented as a warm-cache microbenchmark and no longer ends
16
+ with hardcoded backend recommendations that could contradict measured output.
17
+
18
+ - **HNSW index lock upgraded from `std::sync::Mutex` to `parking_lot::Mutex`** —
19
+ Removed poison handling at 10 call sites in `index_api.rs`. `parking_lot::Mutex`
20
+ provides smaller lock size and eliminates poison handling overhead. (SG-1)
21
+
22
+ - **All remaining `std::sync::Mutex` replaced with `parking_lot::Mutex`** —
23
+ `progress.rs` (2 sites), `statement_tracker.rs` (1 site), `publisher.rs`
24
+ (5 sites). All `.expect("... poisoned")` patterns eliminated. (SG-2)
25
+
26
+ - **HNSW runtime operation counters added with atomics** — `HnswIndexStats`
27
+ now reports lock-free `insert_count`, `search_count`, `vector_cache_hits`,
28
+ and `vector_cache_misses`, all backed by `AtomicU64`. Rebuild/autoload paths
29
+ reset these counters after internal recovery so they reflect runtime traffic
30
+ instead of startup repair work. `Publisher::next_id` also now uses
31
+ `AtomicU64` instead of `Arc<Mutex<u64>>`. (SG-2/SG-3)
32
+
33
+ - **`std::sync::RwLock` replaced with `parking_lot::RwLock` in `query_cache.rs`** —
34
+ 11 poison handling blocks removed. (SG-2)
35
+
36
+ ### Added
37
+
38
+ - **Streaming graph traversal iterators** — `bfs_iter`, `dfs_iter`,
39
+ `topological_sort_iter`, `connected_components_iter` in
40
+ `algo::backend::iterator`. Implement `GraphIterator` trait (BFS/DFS/topo)
41
+ and `Iterator<Item=Result<Vec<i64>>>` (connected components) for lazy,
42
+ composable traversal. O(frontier) memory for node iterators,
43
+ O(|V_component|) for connected components. (SG-4)
44
+
45
+ ## [3.1.4] - 2026-06-06
46
+
47
+ ### Fixed
48
+ - Set `busy_timeout(5000ms)` on `conn_for_storage` in `hnsw_index_persistent`. Without
49
+ this, concurrent writes from the magellan service daemon caused `persist_topology` to
50
+ receive SQLITE_BUSY and silently discard entry_points and layer data (via
51
+ `let _ = self.persist_topology()`). Result: 0 rows in hnsw_entry_points,
52
+ incomplete hnsw_layers, and "Index not initialized" errors on every hopgraph query.
53
+
54
+ ## [3.1.3] - 2026-06-06
55
+
56
+ ### Fixed
57
+ - `search_layer` now implements proper HNSW greedy search with early termination. Previous
58
+ implementation stopped after `k + M` candidates (e.g. 21 for k=5, M=16), exploring only
59
+ the entry point's immediate neighborhood. New implementation uses `ef_search` as the
60
+ candidate pool size and stops when the closest unexplored candidate is farther than the
61
+ worst result seen, matching the standard HNSW algorithm. Fixes hopgraph returning only
62
+ symbols from the first indexed file regardless of query.
63
+
64
+ ## [3.1.2] - 2026-06-04
65
+
66
+ ### Fixed
67
+ - `store_vector` now uses `INSERT` without explicit `id` + `last_insert_rowid()` instead of
68
+ `SELECT MAX(id) + 1`. Removes a TOCTOU race where two concurrent writers to the same DB
69
+ could compute the same next-id and collide on PRIMARY KEY. `store_vector_with_id` (used
70
+ only for topology restore) retains explicit-id `INSERT OR IGNORE` semantics unchanged.
71
+
3
72
  ## [3.0.4] - 2026-05-26
4
73
 
5
74
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "sqlitegraph"
3
- version = "3.1.0"
3
+ version = "3.2.3"
4
4
  edition = "2024"
5
5
  rust-version = "1.89"
6
6
  description = "Embedded graph database with full ACID transactions, HNSW vector search, dual backend support, and comprehensive graph algorithms library"
@@ -128,6 +128,11 @@ harness = false
128
128
  name = "sqlite_v3_comparison"
129
129
  harness = false
130
130
 
131
+ # Curated SQLite vs V3 comparison suite
132
+ [[bench]]
133
+ name = "sqlite_v3_curated"
134
+ harness = false
135
+
131
136
  # Phase 45: Graph Theory algorithms benchmarks
132
137
  [[bench]]
133
138
  name = "graph_theory_benchmarks"
@@ -12,20 +12,19 @@ SQLite: stable, mature, and easy to inspect with standard tooling. Native V3:
12
12
  graph-oriented storage with cache, KV, pub/sub, and traversal features. See the
13
13
  benchmarks below for workload-specific behavior.
14
14
 
15
- ## What's New in v3.0.0
15
+ ## What's New in the 3.2 Line
16
16
 
17
- `v3.0.0` is the first release that ships the full Cypher engine, the
18
- expanded CLI surface, and the cross-session HNSW persistence fix:
17
+ The current 3.2 release line builds on the 3.0 backend/model transition with
18
+ concrete HNSW and traversal improvements:
19
19
 
20
- - Cypher-inspired `MATCH`, `CREATE`, `SET`, `DELETE`, multi-hop, variable-depth,
21
- star/multi-pattern joins, `WHERE` with precedence/parentheses, and HNSW
22
- vector search via `CALL db.index.vector.queryNodes(...)`.
23
- - CLI coverage for PageRank, betweenness, WCC/SCC, Louvain, label propagation,
24
- cycle search, dominators, topological sort, critical path, and HNSW
25
- create/insert/search/list/delete.
26
- - Python `Graph.query()` plus algorithm bindings for SCC, label propagation,
27
- cycle search, dominators, critical path, and HNSW index deletion.
28
- - V3 durability fixes and HNSW autoload persistence fixes.
20
+ - `HnswIndex::batch_insert_vectors()` for lower-overhead bulk vector ingestion.
21
+ - Transactional topology persistence for HNSW metadata and layers.
22
+ - `HnswIndexStats` runtime counters for inserts, searches, vector-cache hits,
23
+ and vector-cache misses.
24
+ - Streaming traversal iterators for BFS, DFS, topological sort, and connected
25
+ components, so callers can avoid materializing full `Vec`s when they only
26
+ need incremental results.
27
+ - `parking_lot`-based lock cleanup across the HNSW path and related hot locks.
29
28
 
30
29
  See [CHANGELOG](https://github.com/oldnordic/sqlitegraph/blob/main/CHANGELOG.md) for full history.
31
30
 
@@ -39,48 +38,48 @@ See [CHANGELOG](https://github.com/oldnordic/sqlitegraph/blob/main/CHANGELOG.md)
39
38
  | Graph algorithms | 35+ | 35+ |
40
39
  | HNSW vectors | Yes | Yes |
41
40
  | Pub/Sub | Yes | Yes |
42
- | LRU Cache | No | Yes (v2.1.0) |
43
- | Parallel BFS | No | Yes (v2.1.1) |
41
+ | LRU Cache | No | Yes |
42
+ | Parallel BFS | No | Yes |
44
43
 
45
44
  ## Benchmarks
46
45
 
47
- See [Architecture](https://github.com/oldnordic/sqlitegraph/blob/main/docs/ARCHITECTURE.md) for system design details.
46
+ See [Architecture](https://github.com/oldnordic/sqlitegraph/blob/main/docs/ARCHITECTURE.md) for system design details and [Benchmarking](https://github.com/oldnordic/sqlitegraph/blob/main/docs/BENCHMARKING.md) for methodology.
48
47
 
49
- **Backend Comparison (v2.2.4 - AMD Ryzen 7 7800X3D, tmpfs, Rust 1.95.0):**
48
+ **Representative clean samples from 2026-06-07 (AMD Ryzen 7 7800X3D, tmpfs, Rust 1.95.0):**
50
49
 
51
- | Benchmark | SQLite | V3 | Ratio |
52
- |-----------|--------|----|-------|
53
- | BFS 1K nodes / 5K edges | 2.5ms | 0.45ms | V3 **5.5x faster** |
54
- | BFS 10K / 50K | 26ms | 27ms | ~parity |
55
- | BFS 50K / 250K | 160ms | 586ms | SQLite 3.6x faster |
56
- | DFS 1K / 5K | 2.4ms | 0.46ms | V3 **5.2x faster** |
57
- | Point lookup 1K | 15us | 82us | SQLite 5.4x faster |
58
- | Point lookup 10K | 27us | 503us | SQLite 18x faster |
59
- | Shortest path 1K | 304us | 393us | SQLite 29% faster |
50
+ | Benchmark | SQLite | V3 |
51
+ |-----------|--------|----|
52
+ | Criterion `bfs_traversal/small_random_1k_5k` | `2.3680 ms` | `3.3191 ms` |
53
+ | Criterion `bfs_traversal/medium_random_10k_50k` | `26.510 ms` | `56.240 ms` |
54
+ | Release microbenchmark point lookup | `3965 ns` | `146 ns` |
60
55
 
61
- V3 excels at small-scale traversals. SQLite dominates at larger graph sizes and
62
- point lookups.
56
+ Use the release microbenchmark for fast sanity checks and the Criterion suites
57
+ for workload comparisons.
63
58
 
64
59
  **Run benchmarks yourself:**
65
60
 
66
61
  ```bash
67
62
  git clone https://github.com/oldnordic/sqlitegraph.git
68
- cd sqlitegraph/sqlitegraph-core
69
- cargo run --example test_performance_comparison --features native-v3
70
- cargo bench --features native-v3 -- backend_comparison
63
+ cd sqlitegraph
64
+ ./scripts/run-curated-benchmarks.sh
65
+
66
+ cd sqlitegraph-core
67
+ cargo run --release --example test_performance_comparison --features native-v3
68
+ cargo bench --features native-v3 --bench backend_comparison
69
+ cargo bench --features native-v3 --bench sqlite_v3_curated
71
70
  ```
72
71
 
73
- See [examples/](https://github.com/oldnordic/sqlitegraph/tree/main/sqlitegraph-core/examples) for reproducible performance tests.
72
+ See [examples/](https://github.com/oldnordic/sqlitegraph/tree/main/sqlitegraph-core/examples) for quick performance checks and [docs/BENCHMARKING.md](https://github.com/oldnordic/sqlitegraph/blob/main/docs/BENCHMARKING.md) for the full workflow.
74
73
 
75
74
  ## Quick Start
76
75
 
77
76
  ```toml
78
77
  [dependencies]
79
78
  # SQLite backend (default)
80
- sqlitegraph-core = "3.0"
79
+ sqlitegraph = "3.2"
81
80
 
82
81
  # OR Native V3 backend (graph-oriented storage)
83
- sqlitegraph-core = { version = "3.0", features = ["native-v3"] }
82
+ sqlitegraph = { version = "3.2", features = ["native-v3"] }
84
83
  ```
85
84
 
86
85
  ```rust
@@ -128,7 +127,7 @@ let mut dfs = Dfs::new(&g, a);
128
127
  assert_eq!(dfs.by_ref().collect::<Vec<_>>(), vec![a, b, c]);
129
128
  ```
130
129
 
131
- New in v3.0.5.
130
+ Available in the current 3.x line.
132
131
 
133
132
  ## CLI
134
133
 
@@ -179,7 +178,11 @@ cargo run -p sqlitegraph --example hybrid_sqlite_v3_hnsw_pubsub --features nativ
179
178
 
180
179
  ## Performance & Instrumentation
181
180
 
182
- Performance thresholds in sqlitegraph_bench.json gate releases. Benchmarks produce HTML reports under `target/criterion`. Use `cargo bench --bench bench_insert` (etc.) to isolate suites. The `bench_driver` binary runs all benches sequentially and surfaces pass/fail summaries.
181
+ Performance thresholds in `sqlitegraph_bench.json` gate releases. Benchmarks
182
+ produce HTML reports under `target/criterion`. Use
183
+ `cargo bench --bench bench_insert` (etc.) to isolate suites. For comparison
184
+ work, prefer release-mode examples for quick sanity checks and Criterion suites
185
+ for workload data.
183
186
 
184
187
  Runtime instrumentation is exposed through the core APIs used by benchmarks and
185
188
  integration tests: prepare/execute counts, transaction begins/commits/rollbacks,
@@ -1,13 +1,12 @@
1
- //! Criterion Benchmark: SQLite vs Native V3 Backend
1
+ //! Criterion benchmark: curated SQLite vs Native V3 backend comparison.
2
2
  //!
3
- //! Run with: cargo bench --features native-v3 -- backend_comparison
3
+ //! Run with: cargo bench --features native-v3 --bench backend_comparison
4
4
  //!
5
- //! This benchmark provides statistically rigorous comparisons between
6
- //! SQLite and Native V3 backends using Criterion.rs for measurement.
5
+ //! This suite is intentionally curated to finish in practical time on a
6
+ //! developer workstation. It focuses on the highest-signal workload families.
7
7
 
8
8
  use criterion::{BenchmarkId, Criterion, Throughput, black_box, criterion_group, criterion_main};
9
9
  use std::time::Duration;
10
- use tempfile::TempDir;
11
10
 
12
11
  // Import graph types
13
12
  use sqlitegraph::algo::backend::{bfs_traversal, dfs_traversal, k_hop_neighbors, shortest_path};
@@ -15,8 +14,10 @@ use sqlitegraph::backend::native::v3::V3Backend;
15
14
  use sqlitegraph::backend::{EdgeSpec, GraphBackend, NodeSpec, SqliteGraphBackend};
16
15
  use sqlitegraph::snapshot::SnapshotId;
17
16
 
17
+ mod bench_utils;
18
18
  // Graph topology generators
19
19
  mod graph_generators;
20
+ use bench_utils::create_v3_bench_context;
20
21
 
21
22
  /// Hardware and environment information
22
23
  #[derive(Debug, Clone)]
@@ -169,7 +170,6 @@ fn bench_bfs_traversal(c: &mut Criterion) {
169
170
  for (name, nodes, edges) in &[
170
171
  ("small_random_1k_5k", 1000, 5000),
171
172
  ("medium_random_10k_50k", 10000, 50000),
172
- ("large_random_50k_250k", 50000, 250000),
173
173
  ] {
174
174
  group.throughput(Throughput::Elements(*nodes as u64));
175
175
 
@@ -196,13 +196,12 @@ fn bench_bfs_traversal(c: &mut Criterion) {
196
196
  group.bench_with_input(BenchmarkId::new("v3", name), &graph_data, |b, data| {
197
197
  b.iter_batched(
198
198
  || {
199
- let temp = TempDir::new().unwrap();
200
- let backend = V3Backend::create(temp.path().join("v3.db")).unwrap();
201
- populate_v3_backend(&backend, data);
202
- (backend, temp) // Keep temp alive
199
+ let ctx = create_v3_bench_context("v3.db");
200
+ populate_v3_backend(&ctx.backend, data);
201
+ ctx
203
202
  },
204
- |(backend, _temp)| {
205
- let result = bfs_traversal(&backend, black_box(1)).unwrap();
203
+ |ctx| {
204
+ let result = bfs_traversal(&ctx.backend, black_box(1)).unwrap();
206
205
  black_box(result.len());
207
206
  },
208
207
  criterion::BatchSize::SmallInput,
@@ -216,7 +215,7 @@ fn bench_bfs_traversal(c: &mut Criterion) {
216
215
  /// Benchmark: DFS Traversal
217
216
  fn bench_dfs_traversal(c: &mut Criterion) {
218
217
  let mut group = c.benchmark_group("dfs_traversal");
219
- group.measurement_time(Duration::from_secs(10));
218
+ group.measurement_time(Duration::from_secs(8));
220
219
  group.sample_size(10);
221
220
 
222
221
  for (name, nodes, edges) in &[
@@ -244,13 +243,12 @@ fn bench_dfs_traversal(c: &mut Criterion) {
244
243
  group.bench_with_input(BenchmarkId::new("v3", name), &graph_data, |b, data| {
245
244
  b.iter_batched(
246
245
  || {
247
- let temp = TempDir::new().unwrap();
248
- let backend = V3Backend::create(temp.path().join("v3.db")).unwrap();
249
- populate_v3_backend(&backend, data);
250
- (backend, temp)
246
+ let ctx = create_v3_bench_context("v3.db");
247
+ populate_v3_backend(&ctx.backend, data);
248
+ ctx
251
249
  },
252
- |(backend, _temp)| {
253
- let result = dfs_traversal(&backend, black_box(1)).unwrap();
250
+ |ctx| {
251
+ let result = dfs_traversal(&ctx.backend, black_box(1)).unwrap();
254
252
  black_box(result.len());
255
253
  },
256
254
  criterion::BatchSize::SmallInput,
@@ -264,7 +262,8 @@ fn bench_dfs_traversal(c: &mut Criterion) {
264
262
  /// Benchmark: k-hop neighbors
265
263
  fn bench_k_hop(c: &mut Criterion) {
266
264
  let mut group = c.benchmark_group("k_hop_neighbors");
267
- group.measurement_time(Duration::from_secs(5));
265
+ group.measurement_time(Duration::from_secs(4));
266
+ group.sample_size(10);
268
267
 
269
268
  for (name, nodes, edges, k) in &[
270
269
  ("small_k2", 1000, 5000, 2),
@@ -299,14 +298,13 @@ fn bench_k_hop(c: &mut Criterion) {
299
298
  |b, (data, k)| {
300
299
  b.iter_batched(
301
300
  || {
302
- let temp = TempDir::new().unwrap();
303
- let backend = V3Backend::create(temp.path().join("v3.db")).unwrap();
304
- populate_v3_backend(&backend, data);
305
- (backend, temp)
301
+ let ctx = create_v3_bench_context("v3.db");
302
+ populate_v3_backend(&ctx.backend, data);
303
+ ctx
306
304
  },
307
- |(backend, _temp)| {
305
+ |ctx| {
308
306
  let result =
309
- k_hop_neighbors(&backend, black_box(1), black_box(*k)).unwrap();
307
+ k_hop_neighbors(&ctx.backend, black_box(1), black_box(*k)).unwrap();
310
308
  black_box(result.len());
311
309
  },
312
310
  criterion::BatchSize::SmallInput,
@@ -321,7 +319,8 @@ fn bench_k_hop(c: &mut Criterion) {
321
319
  /// Benchmark: Shortest path
322
320
  fn bench_shortest_path(c: &mut Criterion) {
323
321
  let mut group = c.benchmark_group("shortest_path");
324
- group.measurement_time(Duration::from_secs(5));
322
+ group.measurement_time(Duration::from_secs(4));
323
+ group.sample_size(10);
325
324
 
326
325
  for (name, nodes, edges) in &[("small", 1000, 5000), ("medium", 10000, 50000)] {
327
326
  let graph_data = generate_random_graph(*nodes, *edges);
@@ -353,14 +352,13 @@ fn bench_shortest_path(c: &mut Criterion) {
353
352
  |b, (data, target)| {
354
353
  b.iter_batched(
355
354
  || {
356
- let temp = TempDir::new().unwrap();
357
- let backend = V3Backend::create(temp.path().join("v3.db")).unwrap();
358
- populate_v3_backend(&backend, data);
359
- (backend, temp)
355
+ let ctx = create_v3_bench_context("v3.db");
356
+ populate_v3_backend(&ctx.backend, data);
357
+ ctx
360
358
  },
361
- |(backend, _temp)| {
359
+ |ctx| {
362
360
  let result =
363
- shortest_path(&backend, black_box(1), black_box(*target)).unwrap();
361
+ shortest_path(&ctx.backend, black_box(1), black_box(*target)).unwrap();
364
362
  black_box(result.map(|p| p.len()));
365
363
  },
366
364
  criterion::BatchSize::SmallInput,
@@ -375,6 +373,8 @@ fn bench_shortest_path(c: &mut Criterion) {
375
373
  /// Benchmark: Point lookup (get_node)
376
374
  fn bench_point_lookup(c: &mut Criterion) {
377
375
  let mut group = c.benchmark_group("point_lookup");
376
+ group.measurement_time(Duration::from_secs(4));
377
+ group.sample_size(10);
378
378
 
379
379
  for (name, nodes) in &[("1k", 1000), ("10k", 10000), ("100k", 100000)] {
380
380
  let graph_data = generate_random_graph(*nodes, 0); // No edges for pure lookup test
@@ -406,14 +406,13 @@ fn bench_point_lookup(c: &mut Criterion) {
406
406
  |b, (data, target)| {
407
407
  b.iter_batched(
408
408
  || {
409
- let temp = TempDir::new().unwrap();
410
- let backend = V3Backend::create(temp.path().join("v3.db")).unwrap();
411
- populate_v3_backend(&backend, data);
412
- (backend, temp, *target)
409
+ let ctx = create_v3_bench_context("v3.db");
410
+ populate_v3_backend(&ctx.backend, data);
411
+ (ctx, *target)
413
412
  },
414
- |(backend, _temp, target)| {
413
+ |(ctx, target)| {
415
414
  let snapshot = SnapshotId::current();
416
- let result = backend.get_node(snapshot, black_box(target)).unwrap();
415
+ let result = ctx.backend.get_node(snapshot, black_box(target)).unwrap();
417
416
  black_box(result);
418
417
  },
419
418
  criterion::BatchSize::SmallInput,
@@ -428,6 +427,8 @@ fn bench_point_lookup(c: &mut Criterion) {
428
427
  /// Benchmark: Fetch outgoing edges
429
428
  fn bench_fetch_outgoing(c: &mut Criterion) {
430
429
  let mut group = c.benchmark_group("fetch_outgoing");
430
+ group.measurement_time(Duration::from_secs(4));
431
+ group.sample_size(10);
431
432
 
432
433
  for (name, nodes, edges) in &[
433
434
  ("sparse_1k_1k", 1000, 1000), // 1 edge per node avg
@@ -455,13 +456,12 @@ fn bench_fetch_outgoing(c: &mut Criterion) {
455
456
  group.bench_with_input(BenchmarkId::new("v3", name), &graph_data, |b, data| {
456
457
  b.iter_batched(
457
458
  || {
458
- let temp = TempDir::new().unwrap();
459
- let backend = V3Backend::create(temp.path().join("v3.db")).unwrap();
460
- populate_v3_backend(&backend, data);
461
- (backend, temp)
459
+ let ctx = create_v3_bench_context("v3.db");
460
+ populate_v3_backend(&ctx.backend, data);
461
+ ctx
462
462
  },
463
- |(backend, _temp)| {
464
- let result = backend.fetch_outgoing(black_box(1)).unwrap();
463
+ |ctx| {
464
+ let result = ctx.backend.fetch_outgoing(black_box(1)).unwrap();
465
465
  black_box(result.len());
466
466
  },
467
467
  criterion::BatchSize::SmallInput,
@@ -475,7 +475,8 @@ fn bench_fetch_outgoing(c: &mut Criterion) {
475
475
  /// Benchmark: Batch insert performance
476
476
  fn bench_batch_insert(c: &mut Criterion) {
477
477
  let mut group = c.benchmark_group("batch_insert");
478
- group.measurement_time(Duration::from_secs(20));
478
+ group.measurement_time(Duration::from_secs(8));
479
+ group.sample_size(10);
479
480
 
480
481
  for (name, count) in &[("100_nodes", 100), ("1k_nodes", 1000), ("10k_nodes", 10000)] {
481
482
  group.throughput(Throughput::Elements(*count as u64));
@@ -502,13 +503,9 @@ fn bench_batch_insert(c: &mut Criterion) {
502
503
 
503
504
  group.bench_with_input(BenchmarkId::new("v3", name), count, |b, &count| {
504
505
  b.iter_batched(
505
- || {
506
- let temp = TempDir::new().unwrap();
507
- let backend = V3Backend::create(temp.path().join("v3.db")).unwrap();
508
- (backend, temp)
509
- },
510
- |(backend, _temp)| {
511
- let mut batch = backend.begin_batch();
506
+ || create_v3_bench_context("v3.db"),
507
+ |ctx| {
508
+ let mut batch = ctx.backend.begin_batch();
512
509
  for i in 0..count {
513
510
  batch
514
511
  .insert_node(sqlitegraph::backend::NodeSpec {
@@ -15,6 +15,7 @@ use std::time::Duration;
15
15
  use tempfile::TempDir;
16
16
 
17
17
  use rand::{RngCore, SeedableRng};
18
+ use sqlitegraph::backend::native::v3::V3Backend;
18
19
  use sqlitegraph::{BackendKind, EdgeSpec, GraphConfig, NodeSpec, open_graph};
19
20
 
20
21
  /// Common benchmark configuration
@@ -22,6 +23,28 @@ pub const SAMPLE_SIZE: usize = 20;
22
23
  pub const WARM_UP: Duration = Duration::from_millis(300);
23
24
  pub const MEASURE: Duration = Duration::from_millis(500);
24
25
 
26
+ /// Benchmark-owned state that guarantees the backend drops before the temp dir.
27
+ ///
28
+ /// Benchmarks often need an ephemeral on-disk backend. Returning `(backend,
29
+ /// temp_dir)` from `iter_batched` is subtly wrong because pattern destructuring
30
+ /// drops the temp dir before the backend, which triggers teardown noise in
31
+ /// `V3Backend::drop`. This wrapper makes the intended drop order explicit.
32
+ pub struct BenchmarkState<B, T> {
33
+ pub backend: B,
34
+ pub temp_dir: T,
35
+ }
36
+
37
+ pub type V3BenchContext = BenchmarkState<V3Backend, TempDir>;
38
+
39
+ pub fn create_v3_bench_context(db_name: &str) -> V3BenchContext {
40
+ let temp_dir = create_benchmark_temp_dir();
41
+ let db_path = temp_dir.path().join(db_name);
42
+ let backend = V3Backend::create(&db_path)
43
+ .unwrap_or_else(|e| panic!("Failed to create V3 backend at {:?}: {}", db_path, e));
44
+
45
+ V3BenchContext { backend, temp_dir }
46
+ }
47
+
25
48
  /// Graph topology types for benchmarking
26
49
  #[derive(Debug, Clone, Copy)]
27
50
  pub enum GraphTopology {
@@ -12,8 +12,9 @@ use criterion::{BenchmarkId, Criterion, Throughput, black_box, criterion_group,
12
12
  use std::fs::OpenOptions;
13
13
  use std::io::Write;
14
14
  use std::time::Duration;
15
- use tempfile::TempDir;
16
15
 
16
+ mod bench_utils;
17
+ use bench_utils::BenchmarkState;
17
18
  use sqlitegraph::backend::native::v3::V3Backend;
18
19
  use sqlitegraph::backend::{BackendDirection, EdgeSpec, GraphBackend, NeighborQuery, NodeSpec};
19
20
  use sqlitegraph::snapshot::SnapshotId;
@@ -74,8 +75,8 @@ fn bench_cold_cache_bfs(c: &mut Criterion) {
74
75
  // Setup: Create a fresh database for each iteration
75
76
  b.iter_batched(
76
77
  || {
77
- let temp = TempDir::new().unwrap();
78
- let db_path = temp.path().join("cold_cache_bfs.db");
78
+ let temp_dir = bench_utils::create_benchmark_temp_dir();
79
+ let db_path = temp_dir.path().join("cold_cache_bfs.db");
79
80
  let backend = V3Backend::create(&db_path).unwrap();
80
81
 
81
82
  // Create chain graph: 0 -> 1 -> 2 -> ... -> (size-1)
@@ -116,10 +117,11 @@ fn bench_cold_cache_bfs(c: &mut Criterion) {
116
117
  // Reopen backend (this will be cold cache)
117
118
  let backend = V3Backend::open(&db_path).unwrap();
118
119
 
119
- (backend, node_ids, temp)
120
+ (BenchmarkState { backend, temp_dir }, node_ids)
120
121
  },
121
- |(backend, node_ids, _temp)| {
122
+ |(ctx, node_ids)| {
122
123
  // BFS traversal from first node
124
+ let backend = &ctx.backend;
123
125
  let snapshot = SnapshotId::current();
124
126
  let mut visited = std::collections::HashSet::new();
125
127
  let mut queue = vec![node_ids[0]];
@@ -177,8 +179,8 @@ fn bench_cold_cache_point_lookup(c: &mut Criterion) {
177
179
  // Setup: Create a fresh database for each iteration
178
180
  b.iter_batched(
179
181
  || {
180
- let temp = TempDir::new().unwrap();
181
- let db_path = temp.path().join("cold_cache_lookup.db");
182
+ let temp_dir = bench_utils::create_benchmark_temp_dir();
183
+ let db_path = temp_dir.path().join("cold_cache_lookup.db");
182
184
  let backend = V3Backend::create(&db_path).unwrap();
183
185
 
184
186
  // Create nodes
@@ -207,10 +209,11 @@ fn bench_cold_cache_point_lookup(c: &mut Criterion) {
207
209
  // Reopen backend (this will be cold cache)
208
210
  let backend = V3Backend::open(&db_path).unwrap();
209
211
 
210
- (backend, node_ids, temp)
212
+ (BenchmarkState { backend, temp_dir }, node_ids)
211
213
  },
212
- |(backend, node_ids, _temp)| {
214
+ |(ctx, node_ids)| {
213
215
  // Point lookups: fetch every 10th node
216
+ let backend = &ctx.backend;
214
217
  let snapshot = SnapshotId::current();
215
218
  let mut count = 0;
216
219
 
@@ -248,8 +251,8 @@ fn bench_cold_cache_sequential_scan(c: &mut Criterion) {
248
251
  // Setup: Create a fresh database for each iteration
249
252
  b.iter_batched(
250
253
  || {
251
- let temp = TempDir::new().unwrap();
252
- let db_path = temp.path().join("cold_cache_scan.db");
254
+ let temp_dir = bench_utils::create_benchmark_temp_dir();
255
+ let db_path = temp_dir.path().join("cold_cache_scan.db");
253
256
  let backend = V3Backend::create(&db_path).unwrap();
254
257
 
255
258
  // Create nodes
@@ -278,10 +281,11 @@ fn bench_cold_cache_sequential_scan(c: &mut Criterion) {
278
281
  // Reopen backend (this will be cold cache)
279
282
  let backend = V3Backend::open(&db_path).unwrap();
280
283
 
281
- (backend, node_ids, temp)
284
+ (BenchmarkState { backend, temp_dir }, node_ids)
282
285
  },
283
- |(backend, node_ids, _temp)| {
286
+ |(ctx, node_ids)| {
284
287
  // Sequential scan: fetch all nodes in order
288
+ let backend = &ctx.backend;
285
289
  let snapshot = SnapshotId::current();
286
290
  let mut count = 0;
287
291