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.
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/Cargo.lock +5 -5
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/PKG-INFO +1 -1
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/pyproject.toml +1 -1
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/CHANGELOG.md +69 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/Cargo.toml +6 -1
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/README.md +38 -35
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/backend_comparison.rs +50 -53
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/bench_utils.rs +23 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/cold_cache.rs +17 -13
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/memory_profiling.rs +9 -18
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/sqlite_v3_comparison.rs +79 -69
- sqlitegraph-0.5.2/sqlitegraph-core/benches/sqlite_v3_curated.rs +415 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/v3_backend_benchmarks.rs +11 -13
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_performance_comparison.rs +16 -18
- sqlitegraph-0.5.2/sqlitegraph-core/src/algo/backend/iterator.rs +966 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/backend/mod.rs +5 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/mod.rs +5 -3
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/pubsub/publisher.rs +11 -29
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/core.rs +72 -35
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/statement_tracker.rs +3 -2
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/index.rs +303 -3
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/index_api.rs +195 -24
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/index_internal.rs +39 -19
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/index_persist.rs +73 -11
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/neighborhood.rs +60 -26
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/storage.rs +39 -21
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/progress.rs +3 -8
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/query_cache.rs +13 -146
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/schema.rs +7 -0
- sqlitegraph-0.5.2/sqlitegraph-core/tests/bench_lifetime_tests.rs +38 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/CHANGELOG.md +8 -1
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/Cargo.toml +2 -2
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/src/lib.rs +7 -28
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/Cargo.toml +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/README.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/python/sqlitegraph/__init__.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/python/sqlitegraph/_native.pyi +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/python/sqlitegraph/py.typed +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/.gitignore +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/BLOCK_AWARE_CACHE_BEHAVIOR_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/BLOCK_LOCALITY_PROTOTYPE_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/BUG_10K_INVESTIGATION_SUMMARY.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/BUG_SNAPSHOTID_SQLITE_BACKEND.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/CACHE_CAPACITY_SWEEP_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/CACHE_CLONE_FIX_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/COLD_PATH_FORENSICS_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/COLD_WARM_BENCHMARK_SPLIT_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/EDGE_CORRUPTION_ROOT_CAUSE.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/LICENSE +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/MAIN_BENCHMARK_RERUN_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/NODE_PAGE_OVERFLOW_FIX_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/PAGE_ID_COLLISION_ROOT_CAUSE.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/PHASE3_NODE_PAGE_CACHE_FIX_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/PHYSICAL_BLOCK_PLACEMENT_PROTOTYPE_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/REBUILD_INDEXES_FIX_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/REOPEN_CORRUPTION_FORENSICS.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/V3_10K_NODE_BUG_FIX.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/V3_FILE_IO_COORDINATION.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/V3_FORENSIC_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/V3_REGRESSION_SWEEP_REPORT.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/adaptive_page_simple.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/adjlist_benchmark.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/algo_benchmarks.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/bfs.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/comparative_benchmark.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/comprehensive_performance.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/compression_benchmark.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/concurrent_access.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/connection_pool.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/graph_generators.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/graph_theory_benchmarks.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/hnsw.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/hnsw_multilayer.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/insert.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/k_hop.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/mvcc_benchmarks.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/native_disk_io.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/parallel_bfs.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/read_path_benchmarks.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/real_datasets.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_memory.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_non_chain_patterns.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_pubsub_memory.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_pubsub_non_chain.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_pubsub_write_cost.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/regression_write_cost.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/v3_algorithm_benchmarks.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/benches/wal_recovery_benchmarks.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/clippy.toml +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/core.d +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/debug_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/HNSW_DEVELOPMENT_RULES.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/HNSW_VECTOR_INTEGRATION_FUTURE_ROADMAP.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/SEQUENTIAL_IO_PERFORMANCE.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/WAL_MODE_IMPLEMENTATION_GUIDE.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase-40-benchmark-report.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase10_performance_tuning.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase11_native_perf_plan.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase12_optimization_plan.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase14_step9_khop_corruption_codebase_mapping.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase29_step7_mmap_preaudit_notes.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase5_real_adjacency.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase6_implementation_status.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase6_native_graphbackend_plan.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/phase7_native_backend_refactor.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/docs/superpowers/plans/2026-04-23-task-1-analysis.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/algo_benchmark.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/basic_functionality_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/batch_bench.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/batch_stress_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/bench_parallel_bfs.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/block_locality_benchmark.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/cache_capacity_benchmark.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/cache_clone_forensics.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/cache_perf_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/cold_path_decomposition.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/compression_analysis.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/compression_detailed.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/compression_diagnostics.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/crash_test_child.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/debug_buffer_error.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/get_node_cache_sweep.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/hybrid_sqlite_v3_hnsw_pubsub.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/phase53_1_execution.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/phase55_simple_benchmark.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/reopen_corruption_repro.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_100k.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_adaptive_pages.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_allocator_startup.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_batch_simple.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_binary_search.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_btree_100k.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_cache_warm.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_chunked_bfs.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_delta_encoding.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_direct_backend_benchmark.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_direct_edgestore.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_edge_store_direct.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_edgestore_perf.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_index_restore.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_index_staleness.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_lazy_decode.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_lock_overhead.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_native_edge.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_neighbors_cache.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_neighbors_detailed.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_neighbors_profile.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_open_detailed_timing.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_open_roundtrip.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_open_stage_timing.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_rwlock_overhead.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_sqlite_neighbors_perf.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_v3_neighbors_perf.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/test_vec_clone.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_forensic_page_analysis.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_forensics_example.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_get_node_profile.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_offset_forensic.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_perf_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_readonly_profile.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/examples/v3_reopen_verify.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/libtest_syntax.rlib +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/manual.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/snapshot_export/snapshot_1766284406.v2 +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/snapshot_export/snapshot_1766284420.v2 +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/sqlitegraph_bench.json +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/backend/centrality.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/backend/graph_ops.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/backend/traversal.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/call_graph_analysis.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/centrality.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/community.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/control_dependence.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/critical_path.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/cut_partition.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/cycle_basis.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/dominance_frontiers.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/dominators.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/graph_diff.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/graph_rewriting.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/graph_similarity.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/natural_loops.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/observability.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/path_enumeration.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/post_dominators.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/program_slicing.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/reachability.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/scc.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/structure.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/subgraph_isomorphism.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/taint_analysis.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/topological_sort.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/transitive_closure.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/transitive_reduction.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/algo/wcc.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/api_ergonomics.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/constants.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/cpu_tuning.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/aliases.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/cpu_profile.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/errors.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/flags.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/kv_types.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/types/utils.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/algorithm/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/algorithm/parallel_bfs.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/allocator.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/backend.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/btree.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/compact_edge_record.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/compression/delta.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/compression/edge_delta.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/compression/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/compression/varint.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/constants.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/edge_compat.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/file_coordinator.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/forensics.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/header.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/index/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/index/page.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/index_persistence.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/kind_index.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/kv_store/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/kv_store/store.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/kv_store/types.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/lazy_init_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/name_index.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/block_cache.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/cache.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/page.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/record.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/store.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/node/tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/pubsub/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/pubsub/types.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/storage/adaptive_page.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/storage/media_detector.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/storage/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/string_table/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/string_table/table.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/string_table/tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/tests/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/wal.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/native/v3/write_batch.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/helpers.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/impl_.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/kv_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/pubsub_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend/sqlite/types.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/backend_selector.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/bench_gates.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/bench_meta.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/bench_regression.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/bench_utils.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/bfs.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/cache.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/client.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/factory.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/graph_config.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/kinds.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/native.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/config/sqlite.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/cypher.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/dependency_monitor.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/dsl.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/errors.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/fault_injection.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/adjacency.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/edge_ops.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/entity_ops.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/instrumented.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/metrics_core.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/metrics_snapshot.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics/utils.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/metrics_schema.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/pattern_matching.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/pool.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/snapshot.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph/types.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/graph_opt.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/batch_filter.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/builder.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/config.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/distance_functions.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/distance_metric.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/errors.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/layer.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/multilayer.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/serialization.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/simd.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/v3_storage.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/hnsw/v3_storage_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/index.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/inference/engine.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/inference/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/inference/sampling.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/inference/simd.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/introspection.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/lib.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/multi_hop.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/mvcc.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/matcher.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/pattern.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/property.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/query.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine/tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine_cache/edge_validation.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine_cache/fast_path_detection.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine_cache/fast_path_execution.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine_cache/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/pattern_engine_cache/tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/query.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/reasoning.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/recovery.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/snapshot.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/typed_digraph/algo.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/typed_digraph/graph.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/typed_digraph/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/src/typed_digraph/tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/acid_regression_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/acid_snapshot_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/algo_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/backend_selector_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bench_data_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bench_gate_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bench_gates_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bench_meta_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bench_report_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/benchmark_isolation_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bfs_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bincode_compatibility_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/bulk_insert_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/cache_effectiveness_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/cache_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/check_write_path.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/cluster_offset_corruption_regression.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/cold_path_forensics.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/cypher_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/debug_file_size.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/debug_index_rebuilding.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/debug_overflow.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/debug_scenario_c.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/deterministic_index_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/direct_file_read_corruption_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/doc_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/edge_corruption_minimal.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/edge_corruption_repro.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/edge_insertion_corruption_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/edge_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/entity_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/file_extension_debug.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/fuzz_common.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/get_node_forensics.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/graph_node_existence_enforcement.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/graph_opt_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/helpers/mod.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/hnsw_persistence_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/index_persistence_integration.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/index_persistence_validation.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/index_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/instrumentation_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/integration_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/isolate_open_bug.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/kv_durability_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/lib_api_smoke_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/multi_hop_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/multi_node_corruption_regression.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/mvcc_baseline_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/mvcc_concurrent_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/mvcc_edge_case_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/mvcc_snapshot_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/mvcc_wal_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/native_edge_insertion_regression.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/node_overflow_forensics.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/node_read_forensics_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/node_slot_transaction_persistence.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/oom_reproduction_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/page_42_debug.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/page_write_debug.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/pattern_cache_fastpath_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/pattern_engine_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/pattern_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/perf_gate_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/perf_gate_v32_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/phase32_cluster_pipeline_reconstruction_tests_clean.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/phase44_2_cluster_size_contract_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/phase64_node_count_durability_regression.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/phase65_cluster_size_corruption_regression.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/phase73_node_count_corruption_capture.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/query_cache_performance_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/query_cache_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/query_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/recovery_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/regression_concurrent_traversal.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/reopen_corruption_investigation.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/reopen_integration_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/rowid_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/schema_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/snapshot_isolation_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/sqlite_reopen_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/sqlite_snapshot_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/test_10k_bug_reproduction.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/unsafe_invariants_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_algorithm_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_block_locality_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_btree_forensics.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_check_nodepages.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_dump_page_headers.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_edge_durability_tdd.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_file_write_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_focused_perf.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_forensics_test.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_header_forensics.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_insert_read_forensics.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_integrity_check.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_kind_index_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_name_index_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_page_ownership_forensics.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_persistence_100.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_query_truth_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_regression_sweep.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_reopen_durability.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_sync_fix_validation.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/v3_verify_file_persistence.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/wal_mode_default_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/wal_tuning_tests.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-core/tests/write_buffer_coherence_regression.rs +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/.gitignore +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/README.md +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/01_basic_crud.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/02_graph_algorithms.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/03_vector_search.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/04_social_network.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/05_file_backed.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/examples/06_hybrid_sqlite_hnsw_query.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_algo.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_basic.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_bulk_insert.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_crud.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_errors.py +0 -0
- {sqlitegraph-0.5.0 → sqlitegraph-0.5.2}/sqlitegraph-py/tests/test_filtered_traversal.py +0 -0
- {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.
|
|
166
|
+
version = "2.13.0"
|
|
167
167
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
168
|
-
checksum = "
|
|
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.
|
|
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.
|
|
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.
|
|
1432
|
+
version = "0.5.2"
|
|
1433
1433
|
dependencies = [
|
|
1434
1434
|
"ndarray 0.16.1",
|
|
1435
1435
|
"numpy",
|
|
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "sqlitegraph"
|
|
7
|
-
version = "0.5.
|
|
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.
|
|
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
|
|
15
|
+
## What's New in the 3.2 Line
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
43
|
-
| Parallel BFS | No | Yes
|
|
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
|
-
**
|
|
48
|
+
**Representative clean samples from 2026-06-07 (AMD Ryzen 7 7800X3D, tmpfs, Rust 1.95.0):**
|
|
50
49
|
|
|
51
|
-
| Benchmark | SQLite | V3 |
|
|
52
|
-
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
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
|
-
|
|
62
|
-
|
|
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
|
|
69
|
-
|
|
70
|
-
|
|
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
|
|
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
|
|
79
|
+
sqlitegraph = "3.2"
|
|
81
80
|
|
|
82
81
|
# OR Native V3 backend (graph-oriented storage)
|
|
83
|
-
sqlitegraph
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
6
|
-
//!
|
|
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
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
|
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(
|
|
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
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
(backend, temp)
|
|
246
|
+
let ctx = create_v3_bench_context("v3.db");
|
|
247
|
+
populate_v3_backend(&ctx.backend, data);
|
|
248
|
+
ctx
|
|
251
249
|
},
|
|
252
|
-
|
|
|
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(
|
|
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
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
(backend, temp)
|
|
301
|
+
let ctx = create_v3_bench_context("v3.db");
|
|
302
|
+
populate_v3_backend(&ctx.backend, data);
|
|
303
|
+
ctx
|
|
306
304
|
},
|
|
307
|
-
|
|
|
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(
|
|
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
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
(backend, temp)
|
|
355
|
+
let ctx = create_v3_bench_context("v3.db");
|
|
356
|
+
populate_v3_backend(&ctx.backend, data);
|
|
357
|
+
ctx
|
|
360
358
|
},
|
|
361
|
-
|
|
|
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
|
|
410
|
-
|
|
411
|
-
|
|
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
|
-
|(
|
|
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
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
(backend, temp)
|
|
459
|
+
let ctx = create_v3_bench_context("v3.db");
|
|
460
|
+
populate_v3_backend(&ctx.backend, data);
|
|
461
|
+
ctx
|
|
462
462
|
},
|
|
463
|
-
|
|
|
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(
|
|
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
|
-
|
|
507
|
-
let
|
|
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
|
|
78
|
-
let db_path =
|
|
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,
|
|
120
|
+
(BenchmarkState { backend, temp_dir }, node_ids)
|
|
120
121
|
},
|
|
121
|
-
|(
|
|
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
|
|
181
|
-
let db_path =
|
|
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,
|
|
212
|
+
(BenchmarkState { backend, temp_dir }, node_ids)
|
|
211
213
|
},
|
|
212
|
-
|(
|
|
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
|
|
252
|
-
let db_path =
|
|
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,
|
|
284
|
+
(BenchmarkState { backend, temp_dir }, node_ids)
|
|
282
285
|
},
|
|
283
|
-
|(
|
|
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
|
|