sqlitegraph 0.1.1__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/Cargo.lock +2 -2
  2. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/PKG-INFO +1 -1
  3. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/pyproject.toml +1 -1
  4. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/Cargo.toml +1 -1
  5. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/backend.rs +27 -0
  6. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/impl_.rs +80 -1
  7. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend.rs +73 -0
  8. sqlitegraph-0.3.0/sqlitegraph-core/src/bfs.rs +171 -0
  9. sqlitegraph-0.3.0/sqlitegraph-core/src/graph/edge_ops.rs +118 -0
  10. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/entity_ops.rs +57 -0
  11. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/multi_hop.rs +10 -1
  12. sqlitegraph-0.3.0/sqlitegraph-core/tests/bfs_tests.rs +226 -0
  13. sqlitegraph-0.3.0/sqlitegraph-core/tests/bulk_insert_tests.rs +173 -0
  14. sqlitegraph-0.3.0/sqlitegraph-py/CHANGELOG.md +88 -0
  15. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/Cargo.toml +1 -1
  16. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/src/lib.rs +182 -13
  17. sqlitegraph-0.3.0/sqlitegraph-py/tests/test_bulk_insert.py +118 -0
  18. sqlitegraph-0.3.0/sqlitegraph-py/tests/test_filtered_traversal.py +113 -0
  19. sqlitegraph-0.1.1/sqlitegraph-core/src/bfs.rs +0 -80
  20. sqlitegraph-0.1.1/sqlitegraph-core/src/graph/edge_ops.rs +0 -58
  21. sqlitegraph-0.1.1/sqlitegraph-core/tests/bfs_tests.rs +0 -100
  22. sqlitegraph-0.1.1/sqlitegraph-py/CHANGELOG.md +0 -42
  23. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/Cargo.toml +0 -0
  24. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/README.md +0 -0
  25. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/python/sqlitegraph/__init__.py +0 -0
  26. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/python/sqlitegraph/_native.pyi +0 -0
  27. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/python/sqlitegraph/py.typed +0 -0
  28. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/.gitignore +0 -0
  29. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/BLOCK_AWARE_CACHE_BEHAVIOR_REPORT.md +0 -0
  30. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/BLOCK_LOCALITY_PROTOTYPE_REPORT.md +0 -0
  31. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/BUG_10K_INVESTIGATION_SUMMARY.md +0 -0
  32. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/BUG_SNAPSHOTID_SQLITE_BACKEND.md +0 -0
  33. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/CACHE_CAPACITY_SWEEP_REPORT.md +0 -0
  34. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/CACHE_CLONE_FIX_REPORT.md +0 -0
  35. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/CHANGELOG.md +0 -0
  36. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/COLD_PATH_FORENSICS_REPORT.md +0 -0
  37. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/COLD_WARM_BENCHMARK_SPLIT_REPORT.md +0 -0
  38. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/EDGE_CORRUPTION_ROOT_CAUSE.md +0 -0
  39. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/LICENSE +0 -0
  40. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/MAIN_BENCHMARK_RERUN_REPORT.md +0 -0
  41. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/NODE_PAGE_OVERFLOW_FIX_REPORT.md +0 -0
  42. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/PAGE_ID_COLLISION_ROOT_CAUSE.md +0 -0
  43. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/PHASE3_NODE_PAGE_CACHE_FIX_REPORT.md +0 -0
  44. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/PHYSICAL_BLOCK_PLACEMENT_PROTOTYPE_REPORT.md +0 -0
  45. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/README.md +0 -0
  46. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/REBUILD_INDEXES_FIX_REPORT.md +0 -0
  47. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/REOPEN_CORRUPTION_FORENSICS.md +0 -0
  48. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_10K_NODE_BUG_FIX.md +0 -0
  49. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_FILE_IO_COORDINATION.md +0 -0
  50. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_FORENSIC_REPORT.md +0 -0
  51. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_REGRESSION_SWEEP_REPORT.md +0 -0
  52. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/adaptive_page_simple.rs +0 -0
  53. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/adjlist_benchmark.rs +0 -0
  54. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/algo_benchmarks.rs +0 -0
  55. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/backend_comparison.rs +0 -0
  56. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/bench_utils.rs +0 -0
  57. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/bfs.rs +0 -0
  58. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/cold_cache.rs +0 -0
  59. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/comparative_benchmark.rs +0 -0
  60. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/comprehensive_performance.rs +0 -0
  61. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/compression_benchmark.rs +0 -0
  62. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/concurrent_access.rs +0 -0
  63. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/connection_pool.rs +0 -0
  64. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/graph_generators.rs +0 -0
  65. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/graph_theory_benchmarks.rs +0 -0
  66. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/hnsw.rs +0 -0
  67. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/hnsw_multilayer.rs +0 -0
  68. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/insert.rs +0 -0
  69. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/k_hop.rs +0 -0
  70. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/memory_profiling.rs +0 -0
  71. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/mvcc_benchmarks.rs +0 -0
  72. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/native_disk_io.rs +0 -0
  73. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/parallel_bfs.rs +0 -0
  74. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/read_path_benchmarks.rs +0 -0
  75. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/real_datasets.rs +0 -0
  76. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_memory.rs +0 -0
  77. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_non_chain_patterns.rs +0 -0
  78. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_pubsub_memory.rs +0 -0
  79. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_pubsub_non_chain.rs +0 -0
  80. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_pubsub_write_cost.rs +0 -0
  81. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_write_cost.rs +0 -0
  82. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/sqlite_v3_comparison.rs +0 -0
  83. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/v3_algorithm_benchmarks.rs +0 -0
  84. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/v3_backend_benchmarks.rs +0 -0
  85. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/wal_recovery_benchmarks.rs +0 -0
  86. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/clippy.toml +0 -0
  87. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/core.d +0 -0
  88. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/debug_test.rs +0 -0
  89. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/HNSW_DEVELOPMENT_RULES.md +0 -0
  90. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/HNSW_VECTOR_INTEGRATION_FUTURE_ROADMAP.md +0 -0
  91. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/SEQUENTIAL_IO_PERFORMANCE.md +0 -0
  92. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/WAL_MODE_IMPLEMENTATION_GUIDE.md +0 -0
  93. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase-40-benchmark-report.md +0 -0
  94. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase10_performance_tuning.md +0 -0
  95. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase11_native_perf_plan.md +0 -0
  96. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase12_optimization_plan.md +0 -0
  97. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase14_step9_khop_corruption_codebase_mapping.md +0 -0
  98. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase29_step7_mmap_preaudit_notes.md +0 -0
  99. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase5_real_adjacency.md +0 -0
  100. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase6_implementation_status.md +0 -0
  101. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase6_native_graphbackend_plan.md +0 -0
  102. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase7_native_backend_refactor.md +0 -0
  103. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/superpowers/plans/2026-04-23-task-1-analysis.md +0 -0
  104. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/algo_benchmark.rs +0 -0
  105. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/basic_functionality_test.rs +0 -0
  106. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/batch_bench.rs +0 -0
  107. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/batch_stress_test.rs +0 -0
  108. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/bench_parallel_bfs.rs +0 -0
  109. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/block_locality_benchmark.rs +0 -0
  110. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cache_capacity_benchmark.rs +0 -0
  111. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cache_clone_forensics.rs +0 -0
  112. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cache_perf_test.rs +0 -0
  113. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cold_path_decomposition.rs +0 -0
  114. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/compression_analysis.rs +0 -0
  115. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/compression_detailed.rs +0 -0
  116. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/compression_diagnostics.rs +0 -0
  117. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/crash_test_child.rs +0 -0
  118. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/debug_buffer_error.rs +0 -0
  119. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/get_node_cache_sweep.rs +0 -0
  120. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/phase53_1_execution.rs +0 -0
  121. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/phase55_simple_benchmark.rs +0 -0
  122. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/reopen_corruption_repro.rs +0 -0
  123. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_100k.rs +0 -0
  124. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_adaptive_pages.rs +0 -0
  125. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_allocator_startup.rs +0 -0
  126. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_batch_simple.rs +0 -0
  127. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_binary_search.rs +0 -0
  128. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_btree_100k.rs +0 -0
  129. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_cache_warm.rs +0 -0
  130. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_chunked_bfs.rs +0 -0
  131. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_delta_encoding.rs +0 -0
  132. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_direct_backend_benchmark.rs +0 -0
  133. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_direct_edgestore.rs +0 -0
  134. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_edge_store_direct.rs +0 -0
  135. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_edgestore_perf.rs +0 -0
  136. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_index_restore.rs +0 -0
  137. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_index_staleness.rs +0 -0
  138. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_lazy_decode.rs +0 -0
  139. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_lock_overhead.rs +0 -0
  140. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_native_edge.rs +0 -0
  141. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_neighbors_cache.rs +0 -0
  142. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_neighbors_detailed.rs +0 -0
  143. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_neighbors_profile.rs +0 -0
  144. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_open_detailed_timing.rs +0 -0
  145. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_open_roundtrip.rs +0 -0
  146. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_open_stage_timing.rs +0 -0
  147. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_performance_comparison.rs +0 -0
  148. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_rwlock_overhead.rs +0 -0
  149. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_sqlite_neighbors_perf.rs +0 -0
  150. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_v3_neighbors_perf.rs +0 -0
  151. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_vec_clone.rs +0 -0
  152. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_forensic_page_analysis.rs +0 -0
  153. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_forensics_example.rs +0 -0
  154. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_get_node_profile.rs +0 -0
  155. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_offset_forensic.rs +0 -0
  156. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_perf_test.rs +0 -0
  157. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_readonly_profile.rs +0 -0
  158. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_reopen_verify.rs +0 -0
  159. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/libtest_syntax.rlib +0 -0
  160. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/manual.md +0 -0
  161. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/snapshot_export/snapshot_1766284406.v2 +0 -0
  162. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/snapshot_export/snapshot_1766284420.v2 +0 -0
  163. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/sqlitegraph_bench.json +0 -0
  164. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/centrality.rs +0 -0
  165. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/graph_ops.rs +0 -0
  166. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/mod.rs +0 -0
  167. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/traversal.rs +0 -0
  168. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/call_graph_analysis.rs +0 -0
  169. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/centrality.rs +0 -0
  170. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/community.rs +0 -0
  171. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/control_dependence.rs +0 -0
  172. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/critical_path.rs +0 -0
  173. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/cut_partition.rs +0 -0
  174. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/cycle_basis.rs +0 -0
  175. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/dominance_frontiers.rs +0 -0
  176. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/dominators.rs +0 -0
  177. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/graph_diff.rs +0 -0
  178. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/graph_rewriting.rs +0 -0
  179. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/graph_similarity.rs +0 -0
  180. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/mod.rs +0 -0
  181. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/natural_loops.rs +0 -0
  182. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/observability.rs +0 -0
  183. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/path_enumeration.rs +0 -0
  184. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/post_dominators.rs +0 -0
  185. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/program_slicing.rs +0 -0
  186. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/reachability.rs +0 -0
  187. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/scc.rs +0 -0
  188. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/structure.rs +0 -0
  189. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/subgraph_isomorphism.rs +0 -0
  190. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/taint_analysis.rs +0 -0
  191. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/tests.rs +0 -0
  192. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/topological_sort.rs +0 -0
  193. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/transitive_closure.rs +0 -0
  194. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/transitive_reduction.rs +0 -0
  195. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/wcc.rs +0 -0
  196. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/api_ergonomics.rs +0 -0
  197. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/constants.rs +0 -0
  198. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/cpu_tuning.rs +0 -0
  199. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/mod.rs +0 -0
  200. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/aliases.rs +0 -0
  201. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/cpu_profile.rs +0 -0
  202. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/errors.rs +0 -0
  203. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/flags.rs +0 -0
  204. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/kv_types.rs +0 -0
  205. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/mod.rs +0 -0
  206. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/utils.rs +0 -0
  207. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/algorithm/mod.rs +0 -0
  208. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/algorithm/parallel_bfs.rs +0 -0
  209. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/allocator.rs +0 -0
  210. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/btree.rs +0 -0
  211. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compact_edge_record.rs +0 -0
  212. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/delta.rs +0 -0
  213. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/edge_delta.rs +0 -0
  214. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/mod.rs +0 -0
  215. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/varint.rs +0 -0
  216. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/constants.rs +0 -0
  217. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/edge_compat.rs +0 -0
  218. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/file_coordinator.rs +0 -0
  219. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/forensics.rs +0 -0
  220. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/header.rs +0 -0
  221. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/index/mod.rs +0 -0
  222. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/index/page.rs +0 -0
  223. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/index_persistence.rs +0 -0
  224. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kind_index.rs +0 -0
  225. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kv_store/mod.rs +0 -0
  226. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kv_store/store.rs +0 -0
  227. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kv_store/types.rs +0 -0
  228. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/lazy_init_tests.rs +0 -0
  229. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/mod.rs +0 -0
  230. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/name_index.rs +0 -0
  231. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/block_cache.rs +0 -0
  232. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/cache.rs +0 -0
  233. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/mod.rs +0 -0
  234. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/page.rs +0 -0
  235. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/record.rs +0 -0
  236. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/store.rs +0 -0
  237. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/tests.rs +0 -0
  238. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/pubsub/mod.rs +0 -0
  239. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/pubsub/publisher.rs +0 -0
  240. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/pubsub/types.rs +0 -0
  241. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/storage/adaptive_page.rs +0 -0
  242. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/storage/media_detector.rs +0 -0
  243. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/storage/mod.rs +0 -0
  244. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/string_table/mod.rs +0 -0
  245. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/string_table/table.rs +0 -0
  246. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/string_table/tests.rs +0 -0
  247. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/tests/mod.rs +0 -0
  248. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/wal.rs +0 -0
  249. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/write_batch.rs +0 -0
  250. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/helpers.rs +0 -0
  251. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/kv_tests.rs +0 -0
  252. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/mod.rs +0 -0
  253. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/pubsub_tests.rs +0 -0
  254. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/types.rs +0 -0
  255. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend_selector.rs +0 -0
  256. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_gates.rs +0 -0
  257. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_meta.rs +0 -0
  258. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_regression.rs +0 -0
  259. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_utils.rs +0 -0
  260. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/cache.rs +0 -0
  261. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/client.rs +0 -0
  262. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/factory.rs +0 -0
  263. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/graph_config.rs +0 -0
  264. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/kinds.rs +0 -0
  265. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/mod.rs +0 -0
  266. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/native.rs +0 -0
  267. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/sqlite.rs +0 -0
  268. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/dependency_monitor.rs +0 -0
  269. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/dsl.rs +0 -0
  270. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/errors.rs +0 -0
  271. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/fault_injection.rs +0 -0
  272. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/adjacency.rs +0 -0
  273. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/core.rs +0 -0
  274. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/instrumented.rs +0 -0
  275. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/metrics_core.rs +0 -0
  276. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/metrics_snapshot.rs +0 -0
  277. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/mod.rs +0 -0
  278. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/statement_tracker.rs +0 -0
  279. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/utils.rs +0 -0
  280. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics_schema.rs +0 -0
  281. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/mod.rs +0 -0
  282. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/pattern_matching.rs +0 -0
  283. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/pool.rs +0 -0
  284. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/snapshot.rs +0 -0
  285. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/types.rs +0 -0
  286. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph_opt.rs +0 -0
  287. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/batch_filter.rs +0 -0
  288. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/builder.rs +0 -0
  289. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/config.rs +0 -0
  290. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/distance_functions.rs +0 -0
  291. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/distance_metric.rs +0 -0
  292. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/errors.rs +0 -0
  293. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index.rs +0 -0
  294. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index_api.rs +0 -0
  295. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index_internal.rs +0 -0
  296. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index_persist.rs +0 -0
  297. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/layer.rs +0 -0
  298. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/mod.rs +0 -0
  299. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/multilayer.rs +0 -0
  300. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/neighborhood.rs +0 -0
  301. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/serialization.rs +0 -0
  302. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/simd.rs +0 -0
  303. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/storage.rs +0 -0
  304. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/v3_storage.rs +0 -0
  305. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/v3_storage_tests.rs +0 -0
  306. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/index.rs +0 -0
  307. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/engine.rs +0 -0
  308. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/mod.rs +0 -0
  309. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/sampling.rs +0 -0
  310. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/simd.rs +0 -0
  311. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/introspection.rs +0 -0
  312. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/lib.rs +0 -0
  313. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/mvcc.rs +0 -0
  314. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern.rs +0 -0
  315. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/matcher.rs +0 -0
  316. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/mod.rs +0 -0
  317. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/pattern.rs +0 -0
  318. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/property.rs +0 -0
  319. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/query.rs +0 -0
  320. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/tests.rs +0 -0
  321. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/edge_validation.rs +0 -0
  322. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/fast_path_detection.rs +0 -0
  323. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/fast_path_execution.rs +0 -0
  324. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/mod.rs +0 -0
  325. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/tests.rs +0 -0
  326. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/progress.rs +0 -0
  327. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/query.rs +0 -0
  328. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/query_cache.rs +0 -0
  329. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/reasoning.rs +0 -0
  330. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/recovery.rs +0 -0
  331. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/schema.rs +0 -0
  332. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/src/snapshot.rs +0 -0
  333. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/acid_regression_test.rs +0 -0
  334. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/acid_snapshot_test.rs +0 -0
  335. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/algo_tests.rs +0 -0
  336. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/backend_selector_tests.rs +0 -0
  337. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_data_tests.rs +0 -0
  338. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_gate_tests.rs +0 -0
  339. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_gates_tests.rs +0 -0
  340. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_meta_tests.rs +0 -0
  341. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_report_tests.rs +0 -0
  342. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/benchmark_isolation_test.rs +0 -0
  343. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bincode_compatibility_test.rs +0 -0
  344. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cache_effectiveness_tests.rs +0 -0
  345. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cache_tests.rs +0 -0
  346. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/check_write_path.rs +0 -0
  347. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cluster_offset_corruption_regression.rs +0 -0
  348. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cold_path_forensics.rs +0 -0
  349. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_file_size.rs +0 -0
  350. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_index_rebuilding.rs +0 -0
  351. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_overflow.rs +0 -0
  352. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_scenario_c.rs +0 -0
  353. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/deterministic_index_tests.rs +0 -0
  354. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/direct_file_read_corruption_test.rs +0 -0
  355. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/doc_tests.rs +0 -0
  356. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_corruption_minimal.rs +0 -0
  357. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_corruption_repro.rs +0 -0
  358. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_insertion_corruption_test.rs +0 -0
  359. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_tests.rs +0 -0
  360. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/entity_tests.rs +0 -0
  361. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/file_extension_debug.rs +0 -0
  362. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/fuzz_common.rs +0 -0
  363. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/get_node_forensics.rs +0 -0
  364. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/graph_node_existence_enforcement.rs +0 -0
  365. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/graph_opt_tests.rs +0 -0
  366. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/helpers/mod.rs +0 -0
  367. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/hnsw_persistence_tests.rs +0 -0
  368. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/index_persistence_integration.rs +0 -0
  369. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/index_persistence_validation.rs +0 -0
  370. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/index_tests.rs +0 -0
  371. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/instrumentation_tests.rs +0 -0
  372. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/integration_tests.rs +0 -0
  373. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/isolate_open_bug.rs +0 -0
  374. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/json_parsing_diagnostics.rs +0 -0
  375. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/kv_durability_tests.rs +0 -0
  376. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/lib_api_smoke_tests.rs +0 -0
  377. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/multi_hop_tests.rs +0 -0
  378. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/multi_node_corruption_regression.rs +0 -0
  379. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_baseline_tests.rs +0 -0
  380. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_concurrent_tests.rs +0 -0
  381. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_edge_case_tests.rs +0 -0
  382. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_snapshot_tests.rs +0 -0
  383. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_wal_tests.rs +0 -0
  384. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/native_edge_insertion_regression.rs +0 -0
  385. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/node_overflow_forensics.rs +0 -0
  386. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/node_read_forensics_test.rs +0 -0
  387. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/node_slot_transaction_persistence.rs +0 -0
  388. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/oom_reproduction_test.rs +0 -0
  389. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/page_42_debug.rs +0 -0
  390. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/page_write_debug.rs +0 -0
  391. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/pattern_cache_fastpath_tests.rs +0 -0
  392. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/pattern_engine_tests.rs +0 -0
  393. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/pattern_tests.rs +0 -0
  394. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/perf_gate_tests.rs +0 -0
  395. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/perf_gate_v32_tests.rs +0 -0
  396. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase32_cluster_pipeline_reconstruction_tests_clean.rs +0 -0
  397. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase44_2_cluster_size_contract_tests.rs +0 -0
  398. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase64_node_count_durability_regression.rs +0 -0
  399. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase65_cluster_size_corruption_regression.rs +0 -0
  400. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase73_node_count_corruption_capture.rs +0 -0
  401. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/query_cache_performance_tests.rs +0 -0
  402. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/query_cache_tests.rs +0 -0
  403. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/query_tests.rs +0 -0
  404. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/recovery_tests.rs +0 -0
  405. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/regression_concurrent_traversal.rs +0 -0
  406. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/reopen_corruption_investigation.rs +0 -0
  407. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/reopen_integration_test.rs +0 -0
  408. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/rowid_tests.rs +0 -0
  409. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/schema_tests.rs +0 -0
  410. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/snapshot_isolation_tests.rs +0 -0
  411. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/sqlite_reopen_tests.rs +0 -0
  412. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/sqlite_snapshot_tests.rs +0 -0
  413. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/test_10k_bug_reproduction.rs +0 -0
  414. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/transaction_begin_corruption_proof.rs +0 -0
  415. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/unsafe_invariants_tests.rs +0 -0
  416. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_algorithm_tests.rs +0 -0
  417. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_block_locality_tests.rs +0 -0
  418. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_btree_forensics.rs +0 -0
  419. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_check_nodepages.rs +0 -0
  420. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_dump_page_headers.rs +0 -0
  421. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_edge_durability_tdd.rs +0 -0
  422. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_file_write_test.rs +0 -0
  423. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_focused_perf.rs +0 -0
  424. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_forensics_test.rs +0 -0
  425. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_header_forensics.rs +0 -0
  426. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_insert_read_forensics.rs +0 -0
  427. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_integrity_check.rs +0 -0
  428. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_kind_index_tests.rs +0 -0
  429. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_name_index_tests.rs +0 -0
  430. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_page_ownership_forensics.rs +0 -0
  431. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_persistence_100.rs +0 -0
  432. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_query_truth_tests.rs +0 -0
  433. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_regression_sweep.rs +0 -0
  434. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_reopen_durability.rs +0 -0
  435. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_sync_fix_validation.rs +0 -0
  436. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_verify_file_persistence.rs +0 -0
  437. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/wal_mode_default_tests.rs +0 -0
  438. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/wal_tuning_tests.rs +0 -0
  439. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/write_buffer_coherence_regression.rs +0 -0
  440. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/.gitignore +0 -0
  441. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/README.md +0 -0
  442. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/01_basic_crud.py +0 -0
  443. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/02_graph_algorithms.py +0 -0
  444. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/03_vector_search.py +0 -0
  445. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/04_social_network.py +0 -0
  446. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/05_file_backed.py +0 -0
  447. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_algo.py +0 -0
  448. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_basic.py +0 -0
  449. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_crud.py +0 -0
  450. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_errors.py +0 -0
  451. {sqlitegraph-0.1.1 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_hnsw.py +0 -0
@@ -1387,7 +1387,7 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
1387
1387
 
1388
1388
  [[package]]
1389
1389
  name = "sqlitegraph"
1390
- version = "2.2.5"
1390
+ version = "2.4.0"
1391
1391
  dependencies = [
1392
1392
  "ahash",
1393
1393
  "arc-swap",
@@ -1428,7 +1428,7 @@ dependencies = [
1428
1428
 
1429
1429
  [[package]]
1430
1430
  name = "sqlitegraph-py"
1431
- version = "0.1.1"
1431
+ version = "0.3.0"
1432
1432
  dependencies = [
1433
1433
  "ndarray 0.16.1",
1434
1434
  "numpy",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlitegraph
3
- Version: 0.1.1
3
+ Version: 0.3.0
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.1.1"
7
+ version = "0.3.0"
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,6 +1,6 @@
1
1
  [package]
2
2
  name = "sqlitegraph"
3
- version = "2.2.5"
3
+ version = "2.4.0"
4
4
  edition = "2024"
5
5
  description = "Embedded graph database with full ACID transactions, HNSW vector search, dual backend support, and comprehensive graph algorithms library"
6
6
  license = "GPL-3.0"
@@ -1237,6 +1237,33 @@ impl GraphBackend for V3Backend {
1237
1237
  self.k_hop(_snapshot_id, _start, _depth, _direction)
1238
1238
  }
1239
1239
 
1240
+ fn bfs_filtered(
1241
+ &self,
1242
+ snapshot_id: SnapshotId,
1243
+ start: i64,
1244
+ depth: u32,
1245
+ _direction: BackendDirection,
1246
+ _allowed_edge_types: &[&str],
1247
+ ) -> Result<Vec<i64>, SqliteGraphError> {
1248
+ // TODO: Implement edge type filtering for V3 backend.
1249
+ // V3's edge_store exposes `neighbors_filtered`, but typed-edge traversal
1250
+ // is not yet wired into the BFS path. Tracked alongside `k_hop_filtered`.
1251
+ // For now, delegate to unfiltered bfs to match the existing stub pattern.
1252
+ self.bfs(snapshot_id, start, depth)
1253
+ }
1254
+
1255
+ fn shortest_path_filtered(
1256
+ &self,
1257
+ snapshot_id: SnapshotId,
1258
+ start: i64,
1259
+ end: i64,
1260
+ _allowed_edge_types: &[&str],
1261
+ ) -> Result<Option<Vec<i64>>, SqliteGraphError> {
1262
+ // TODO: Implement edge type filtering for V3 backend.
1263
+ // See note on `bfs_filtered`.
1264
+ self.shortest_path(snapshot_id, start, end)
1265
+ }
1266
+
1240
1267
  fn chain_query(
1241
1268
  &self,
1242
1269
  _snapshot_id: SnapshotId,
@@ -10,7 +10,7 @@ use crate::{
10
10
  SqliteGraphError,
11
11
  backend::sqlite::types::{BackendDirection, EdgeSpec, NeighborQuery, NodeSpec},
12
12
  backend::{PubSubEvent, SubscriptionFilter},
13
- bfs::{bfs_neighbors, shortest_path},
13
+ bfs::{bfs_neighbors, bfs_neighbors_filtered, shortest_path, shortest_path_filtered},
14
14
  graph::{GraphEdge, GraphEntity, SqliteGraph},
15
15
  multi_hop,
16
16
  pattern::{self, PatternMatch, PatternQuery},
@@ -296,6 +296,62 @@ impl crate::backend::GraphBackend for SqliteGraphBackend {
296
296
  Ok(id)
297
297
  }
298
298
 
299
+ fn insert_nodes_bulk(&self, nodes: &[NodeSpec]) -> Result<Vec<i64>, SqliteGraphError> {
300
+ let entities: Vec<GraphEntity> = nodes
301
+ .iter()
302
+ .map(|node| GraphEntity {
303
+ id: 0,
304
+ kind: node.kind.clone(),
305
+ name: node.name.clone(),
306
+ file_path: node.file_path.clone(),
307
+ data: node.data.clone(),
308
+ })
309
+ .collect();
310
+ let ids = self.graph.insert_entities_bulk(&entities)?;
311
+
312
+ // Emit per-row events after the commit, matching single-insert
313
+ // observer semantics.
314
+ let pub_guard = self.publisher.read();
315
+ if let Some(ref publisher) = *pub_guard {
316
+ for id in &ids {
317
+ publisher.emit(PubSubEvent::NodeChanged {
318
+ node_id: *id,
319
+ snapshot_id: 0,
320
+ });
321
+ }
322
+ }
323
+
324
+ Ok(ids)
325
+ }
326
+
327
+ fn insert_edges_bulk(&self, edges: &[EdgeSpec]) -> Result<Vec<i64>, SqliteGraphError> {
328
+ let graph_edges: Vec<GraphEdge> = edges
329
+ .iter()
330
+ .map(|edge| GraphEdge {
331
+ id: 0,
332
+ from_id: edge.from,
333
+ to_id: edge.to,
334
+ edge_type: edge.edge_type.clone(),
335
+ data: edge.data.clone(),
336
+ })
337
+ .collect();
338
+ let ids = self.graph.insert_edges_bulk(&graph_edges)?;
339
+
340
+ let pub_guard = self.publisher.read();
341
+ if let Some(ref publisher) = *pub_guard {
342
+ for (id, edge) in ids.iter().zip(edges.iter()) {
343
+ publisher.emit(PubSubEvent::EdgeChanged {
344
+ from_node: edge.from,
345
+ to_node: edge.to,
346
+ edge_id: *id,
347
+ snapshot_id: 0,
348
+ });
349
+ }
350
+ }
351
+
352
+ Ok(ids)
353
+ }
354
+
299
355
  fn delete_entity(&self, id: i64) -> Result<(), SqliteGraphError> {
300
356
  self.graph.delete_entity(id)
301
357
  }
@@ -427,6 +483,29 @@ impl crate::backend::GraphBackend for SqliteGraphBackend {
427
483
  Ok(result)
428
484
  }
429
485
 
486
+ fn bfs_filtered(
487
+ &self,
488
+ snapshot_id: crate::snapshot::SnapshotId,
489
+ start: i64,
490
+ depth: u32,
491
+ direction: BackendDirection,
492
+ allowed_edge_types: &[&str],
493
+ ) -> Result<Vec<i64>, SqliteGraphError> {
494
+ validate_snapshot_for_sqlite(snapshot_id)?;
495
+ bfs_neighbors_filtered(&self.graph, start, depth, allowed_edge_types, direction)
496
+ }
497
+
498
+ fn shortest_path_filtered(
499
+ &self,
500
+ snapshot_id: crate::snapshot::SnapshotId,
501
+ start: i64,
502
+ end: i64,
503
+ allowed_edge_types: &[&str],
504
+ ) -> Result<Option<Vec<i64>>, SqliteGraphError> {
505
+ validate_snapshot_for_sqlite(snapshot_id)?;
506
+ shortest_path_filtered(&self.graph, start, end, allowed_edge_types)
507
+ }
508
+
430
509
  fn chain_query(
431
510
  &self,
432
511
  snapshot_id: crate::snapshot::SnapshotId,
@@ -117,6 +117,35 @@ pub trait GraphBackend {
117
117
  fn insert_node(&self, node: NodeSpec) -> Result<i64, SqliteGraphError>;
118
118
  fn insert_edge(&self, edge: EdgeSpec) -> Result<i64, SqliteGraphError>;
119
119
 
120
+ /// Insert many nodes atomically.
121
+ ///
122
+ /// Default implementation loops single-insert for each item; backends
123
+ /// override with a single-transaction path. Returns the new node IDs in
124
+ /// the same order as `nodes`. All-or-nothing: if any insert fails the
125
+ /// caller should assume nothing was committed.
126
+ fn insert_nodes_bulk(&self, nodes: &[NodeSpec]) -> Result<Vec<i64>, SqliteGraphError> {
127
+ let mut ids = Vec::with_capacity(nodes.len());
128
+ for n in nodes {
129
+ ids.push(self.insert_node(n.clone())?);
130
+ }
131
+ Ok(ids)
132
+ }
133
+
134
+ /// Insert many edges atomically.
135
+ ///
136
+ /// Default implementation loops single-insert for each item; backends
137
+ /// override with a single-transaction path. Returns the new edge IDs in
138
+ /// the same order as `edges`. All-or-nothing semantics on the bulk path;
139
+ /// the default fallback inherits whatever atomicity the single
140
+ /// `insert_edge` provides.
141
+ fn insert_edges_bulk(&self, edges: &[EdgeSpec]) -> Result<Vec<i64>, SqliteGraphError> {
142
+ let mut ids = Vec::with_capacity(edges.len());
143
+ for e in edges {
144
+ ids.push(self.insert_edge(e.clone())?);
145
+ }
146
+ Ok(ids)
147
+ }
148
+
120
149
  /// Update an existing node in place without allocating a new node ID
121
150
  ///
122
151
  /// This modifies the data associated with an existing node while preserving
@@ -250,6 +279,21 @@ pub trait GraphBackend {
250
279
  direction: BackendDirection,
251
280
  allowed_edge_types: &[&str],
252
281
  ) -> Result<Vec<i64>, SqliteGraphError>;
282
+ fn bfs_filtered(
283
+ &self,
284
+ snapshot_id: SnapshotId,
285
+ start: i64,
286
+ depth: u32,
287
+ direction: BackendDirection,
288
+ allowed_edge_types: &[&str],
289
+ ) -> Result<Vec<i64>, SqliteGraphError>;
290
+ fn shortest_path_filtered(
291
+ &self,
292
+ snapshot_id: SnapshotId,
293
+ start: i64,
294
+ end: i64,
295
+ allowed_edge_types: &[&str],
296
+ ) -> Result<Option<Vec<i64>>, SqliteGraphError>;
253
297
  fn chain_query(
254
298
  &self,
255
299
  snapshot_id: SnapshotId,
@@ -550,6 +594,14 @@ where
550
594
  (*self).entity_ids()
551
595
  }
552
596
 
597
+ fn insert_nodes_bulk(&self, nodes: &[NodeSpec]) -> Result<Vec<i64>, SqliteGraphError> {
598
+ (*self).insert_nodes_bulk(nodes)
599
+ }
600
+
601
+ fn insert_edges_bulk(&self, edges: &[EdgeSpec]) -> Result<Vec<i64>, SqliteGraphError> {
602
+ (*self).insert_edges_bulk(edges)
603
+ }
604
+
553
605
  fn neighbors(
554
606
  &self,
555
607
  snapshot_id: SnapshotId,
@@ -606,6 +658,27 @@ where
606
658
  (*self).k_hop_filtered(snapshot_id, start, depth, direction, allowed_edge_types)
607
659
  }
608
660
 
661
+ fn bfs_filtered(
662
+ &self,
663
+ snapshot_id: SnapshotId,
664
+ start: i64,
665
+ depth: u32,
666
+ direction: BackendDirection,
667
+ allowed_edge_types: &[&str],
668
+ ) -> Result<Vec<i64>, SqliteGraphError> {
669
+ (*self).bfs_filtered(snapshot_id, start, depth, direction, allowed_edge_types)
670
+ }
671
+
672
+ fn shortest_path_filtered(
673
+ &self,
674
+ snapshot_id: SnapshotId,
675
+ start: i64,
676
+ end: i64,
677
+ allowed_edge_types: &[&str],
678
+ ) -> Result<Option<Vec<i64>>, SqliteGraphError> {
679
+ (*self).shortest_path_filtered(snapshot_id, start, end, allowed_edge_types)
680
+ }
681
+
609
682
  fn chain_query(
610
683
  &self,
611
684
  snapshot_id: SnapshotId,
@@ -0,0 +1,171 @@
1
+ use std::collections::VecDeque;
2
+
3
+ use ahash::{AHashMap, AHashSet};
4
+
5
+ use crate::{
6
+ backend::BackendDirection,
7
+ errors::SqliteGraphError,
8
+ graph::SqliteGraph,
9
+ multi_hop::{build_lookup, typed_adjacency},
10
+ };
11
+
12
+ pub fn bfs_neighbors(
13
+ graph: &SqliteGraph,
14
+ start: i64,
15
+ max_depth: u32,
16
+ ) -> Result<Vec<i64>, SqliteGraphError> {
17
+ graph.get_entity(start)?;
18
+ let mut visited = Vec::new();
19
+ let mut seen = AHashSet::new();
20
+ let mut queue = VecDeque::new();
21
+ queue.push_back((start, 0));
22
+ seen.insert(start);
23
+ while let Some((node, depth)) = queue.pop_front() {
24
+ visited.push(node);
25
+ if depth >= max_depth {
26
+ continue;
27
+ }
28
+ for next in graph.fetch_outgoing(node)? {
29
+ if seen.insert(next) {
30
+ queue.push_back((next, depth + 1));
31
+ }
32
+ }
33
+ }
34
+ Ok(visited)
35
+ }
36
+
37
+ pub fn bfs_neighbors_filtered(
38
+ graph: &SqliteGraph,
39
+ start: i64,
40
+ max_depth: u32,
41
+ allowed_edge_types: &[&str],
42
+ direction: BackendDirection,
43
+ ) -> Result<Vec<i64>, SqliteGraphError> {
44
+ graph.get_entity(start)?;
45
+ if allowed_edge_types.is_empty() {
46
+ return Ok(Vec::new());
47
+ }
48
+ let lookup = build_lookup(allowed_edge_types);
49
+ let mut visited = Vec::new();
50
+ let mut seen = AHashSet::new();
51
+ let mut queue = VecDeque::new();
52
+ queue.push_back((start, 0));
53
+ seen.insert(start);
54
+ while let Some((node, depth)) = queue.pop_front() {
55
+ visited.push(node);
56
+ if depth >= max_depth {
57
+ continue;
58
+ }
59
+ for next in typed_adjacency(graph, node, direction, Some(&lookup))? {
60
+ if seen.insert(next) {
61
+ queue.push_back((next, depth + 1));
62
+ }
63
+ }
64
+ }
65
+ Ok(visited)
66
+ }
67
+
68
+ pub fn shortest_path(
69
+ graph: &SqliteGraph,
70
+ start: i64,
71
+ end: i64,
72
+ ) -> Result<Option<Vec<i64>>, SqliteGraphError> {
73
+ graph.get_entity(start)?;
74
+ graph.get_entity(end)?;
75
+ if start == end {
76
+ return Ok(Some(vec![start]));
77
+ }
78
+ let mut queue = VecDeque::new();
79
+ let mut parents = AHashMap::new();
80
+ let mut seen = AHashSet::new();
81
+ queue.push_back(start);
82
+ seen.insert(start);
83
+ let mut found = false;
84
+ while let Some(node) = queue.pop_front() {
85
+ for next in graph.fetch_outgoing(node)? {
86
+ if seen.insert(next) {
87
+ parents.insert(next, node);
88
+ if next == end {
89
+ found = true;
90
+ break;
91
+ }
92
+ queue.push_back(next);
93
+ }
94
+ }
95
+ if found {
96
+ break;
97
+ }
98
+ }
99
+ if !found {
100
+ return Ok(None);
101
+ }
102
+ let mut path = vec![end];
103
+ let mut current = end;
104
+ while let Some(&parent) = parents.get(&current) {
105
+ path.push(parent);
106
+ if parent == start {
107
+ break;
108
+ }
109
+ current = parent;
110
+ }
111
+ if path.last().map(|last| *last != start).unwrap_or(true) {
112
+ return Ok(None);
113
+ }
114
+ path.reverse();
115
+ Ok(Some(path))
116
+ }
117
+
118
+ pub fn shortest_path_filtered(
119
+ graph: &SqliteGraph,
120
+ start: i64,
121
+ end: i64,
122
+ allowed_edge_types: &[&str],
123
+ ) -> Result<Option<Vec<i64>>, SqliteGraphError> {
124
+ graph.get_entity(start)?;
125
+ graph.get_entity(end)?;
126
+ if start == end {
127
+ return Ok(Some(vec![start]));
128
+ }
129
+ if allowed_edge_types.is_empty() {
130
+ return Ok(None);
131
+ }
132
+ let lookup = build_lookup(allowed_edge_types);
133
+ let mut queue = VecDeque::new();
134
+ let mut parents = AHashMap::new();
135
+ let mut seen = AHashSet::new();
136
+ queue.push_back(start);
137
+ seen.insert(start);
138
+ let mut found = false;
139
+ while let Some(node) = queue.pop_front() {
140
+ for next in typed_adjacency(graph, node, BackendDirection::Outgoing, Some(&lookup))? {
141
+ if seen.insert(next) {
142
+ parents.insert(next, node);
143
+ if next == end {
144
+ found = true;
145
+ break;
146
+ }
147
+ queue.push_back(next);
148
+ }
149
+ }
150
+ if found {
151
+ break;
152
+ }
153
+ }
154
+ if !found {
155
+ return Ok(None);
156
+ }
157
+ let mut path = vec![end];
158
+ let mut current = end;
159
+ while let Some(&parent) = parents.get(&current) {
160
+ path.push(parent);
161
+ if parent == start {
162
+ break;
163
+ }
164
+ current = parent;
165
+ }
166
+ if path.last().map(|last| *last != start).unwrap_or(true) {
167
+ return Ok(None);
168
+ }
169
+ path.reverse();
170
+ Ok(Some(path))
171
+ }
@@ -0,0 +1,118 @@
1
+ //! Edge CRUD operations for SqliteGraph.
2
+
3
+ use rusqlite::params;
4
+
5
+ use crate::errors::SqliteGraphError;
6
+
7
+ use super::{
8
+ SqliteGraph,
9
+ types::{GraphEdge, row_to_edge, validate_edge},
10
+ };
11
+
12
+ impl SqliteGraph {
13
+ pub fn insert_edge(&self, edge: &GraphEdge) -> Result<i64, SqliteGraphError> {
14
+ validate_edge(edge)?;
15
+ if !self.entity_exists(edge.from_id)? || !self.entity_exists(edge.to_id)? {
16
+ return Err(SqliteGraphError::invalid_input(
17
+ "edge endpoints must reference existing entities",
18
+ ));
19
+ }
20
+ let data = serde_json::to_string(&edge.data)
21
+ .map_err(|e| SqliteGraphError::invalid_input(e.to_string()))?;
22
+ self.connection()
23
+ .execute(
24
+ "INSERT INTO graph_edges(from_id, to_id, edge_type, data) VALUES(?1, ?2, ?3, ?4)",
25
+ params![edge.from_id, edge.to_id, edge.edge_type.as_str(), data],
26
+ )
27
+ .map_err(|e| SqliteGraphError::query(e.to_string()))?;
28
+ self.invalidate_caches();
29
+ Ok(self.connection().last_insert_rowid())
30
+ }
31
+
32
+ /// Insert many edges atomically inside a single transaction.
33
+ ///
34
+ /// Returns the rowids of the inserted edges in the same order as the
35
+ /// input. Empty input returns an empty vector without opening a
36
+ /// transaction. On any error, the transaction is rolled back and the
37
+ /// database is left untouched.
38
+ pub fn insert_edges_bulk(&self, edges: &[GraphEdge]) -> Result<Vec<i64>, SqliteGraphError> {
39
+ if edges.is_empty() {
40
+ return Ok(Vec::new());
41
+ }
42
+ for edge in edges {
43
+ validate_edge(edge)?;
44
+ if !self.entity_exists(edge.from_id)? || !self.entity_exists(edge.to_id)? {
45
+ return Err(SqliteGraphError::invalid_input(
46
+ "edge endpoints must reference existing entities",
47
+ ));
48
+ }
49
+ }
50
+ let conn = self.connection();
51
+ conn.underlying()
52
+ .execute_batch("BEGIN")
53
+ .map_err(|e| SqliteGraphError::query(e.to_string()))?;
54
+
55
+ let mut ids = Vec::with_capacity(edges.len());
56
+ let insert_result: Result<(), SqliteGraphError> = (|| {
57
+ let mut stmt = conn
58
+ .prepare_cached(
59
+ "INSERT INTO graph_edges(from_id, to_id, edge_type, data) VALUES(?1, ?2, ?3, ?4)",
60
+ )
61
+ .map_err(|e| SqliteGraphError::query(e.to_string()))?;
62
+ for edge in edges {
63
+ let data = serde_json::to_string(&edge.data)
64
+ .map_err(|e| SqliteGraphError::invalid_input(e.to_string()))?;
65
+ stmt.execute(params![
66
+ edge.from_id,
67
+ edge.to_id,
68
+ edge.edge_type.as_str(),
69
+ data,
70
+ ])
71
+ .map_err(|e| SqliteGraphError::query(e.to_string()))?;
72
+ ids.push(conn.last_insert_rowid());
73
+ }
74
+ Ok(())
75
+ })();
76
+
77
+ match insert_result {
78
+ Ok(()) => {
79
+ conn.underlying()
80
+ .execute_batch("COMMIT")
81
+ .map_err(|e| SqliteGraphError::query(e.to_string()))?;
82
+ self.invalidate_caches();
83
+ Ok(ids)
84
+ }
85
+ Err(err) => {
86
+ let _ = conn.underlying().execute_batch("ROLLBACK");
87
+ Err(err)
88
+ }
89
+ }
90
+ }
91
+
92
+ pub fn get_edge(&self, id: i64) -> Result<GraphEdge, SqliteGraphError> {
93
+ self.connection()
94
+ .query_row(
95
+ "SELECT id, from_id, to_id, edge_type, data FROM graph_edges WHERE id=?1",
96
+ params![id],
97
+ row_to_edge,
98
+ )
99
+ .map_err(|err| match err {
100
+ rusqlite::Error::QueryReturnedNoRows => {
101
+ SqliteGraphError::not_found(format!("edge {id}"))
102
+ }
103
+ other => SqliteGraphError::query(other.to_string()),
104
+ })
105
+ }
106
+
107
+ pub fn delete_edge(&self, id: i64) -> Result<(), SqliteGraphError> {
108
+ let affected = self
109
+ .connection()
110
+ .execute("DELETE FROM graph_edges WHERE id=?1", params![id])
111
+ .map_err(|e| SqliteGraphError::query(e.to_string()))?;
112
+ if affected == 0 {
113
+ return Err(SqliteGraphError::not_found(format!("edge {id}")));
114
+ }
115
+ self.invalidate_caches();
116
+ Ok(())
117
+ }
118
+ }
@@ -28,6 +28,63 @@ impl SqliteGraph {
28
28
  Ok(self.connection().last_insert_rowid())
29
29
  }
30
30
 
31
+ /// Insert many entities atomically inside a single transaction.
32
+ ///
33
+ /// Returns the rowids of the inserted entities in the same order as the
34
+ /// input. Empty input returns an empty vector without opening a
35
+ /// transaction. On any error, the transaction is rolled back and the
36
+ /// database is left untouched.
37
+ pub fn insert_entities_bulk(
38
+ &self,
39
+ entities: &[GraphEntity],
40
+ ) -> Result<Vec<i64>, SqliteGraphError> {
41
+ if entities.is_empty() {
42
+ return Ok(Vec::new());
43
+ }
44
+ for entity in entities {
45
+ validate_entity(entity)?;
46
+ }
47
+ let conn = self.connection();
48
+ conn.underlying()
49
+ .execute_batch("BEGIN")
50
+ .map_err(|e| SqliteGraphError::query(e.to_string()))?;
51
+
52
+ let mut ids = Vec::with_capacity(entities.len());
53
+ let insert_result: Result<(), SqliteGraphError> = (|| {
54
+ let mut stmt = conn
55
+ .prepare_cached(
56
+ "INSERT INTO graph_entities(kind, name, file_path, data) VALUES(?1, ?2, ?3, ?4)",
57
+ )
58
+ .map_err(|e| SqliteGraphError::query(e.to_string()))?;
59
+ for entity in entities {
60
+ let data = serde_json::to_string(&entity.data)
61
+ .map_err(|e| SqliteGraphError::invalid_input(e.to_string()))?;
62
+ stmt.execute(params![
63
+ entity.kind.as_str(),
64
+ entity.name.as_str(),
65
+ entity.file_path.as_deref(),
66
+ data,
67
+ ])
68
+ .map_err(|e| SqliteGraphError::query(e.to_string()))?;
69
+ ids.push(conn.last_insert_rowid());
70
+ }
71
+ Ok(())
72
+ })();
73
+
74
+ match insert_result {
75
+ Ok(()) => {
76
+ conn.underlying()
77
+ .execute_batch("COMMIT")
78
+ .map_err(|e| SqliteGraphError::query(e.to_string()))?;
79
+ Ok(ids)
80
+ }
81
+ Err(err) => {
82
+ let _ = conn.underlying().execute_batch("ROLLBACK");
83
+ Err(err)
84
+ }
85
+ }
86
+ }
87
+
31
88
  pub fn get_entity(&self, id: i64) -> Result<GraphEntity, SqliteGraphError> {
32
89
  self.connection()
33
90
  .query_row(
@@ -139,6 +139,15 @@ fn adjacency_for(
139
139
  node: i64,
140
140
  direction: BackendDirection,
141
141
  allowed_types: Option<&AHashSet<&str>>,
142
+ ) -> Result<Vec<i64>, SqliteGraphError> {
143
+ typed_adjacency(graph, node, direction, allowed_types)
144
+ }
145
+
146
+ pub(crate) fn typed_adjacency(
147
+ graph: &SqliteGraph,
148
+ node: i64,
149
+ direction: BackendDirection,
150
+ allowed_types: Option<&AHashSet<&str>>,
142
151
  ) -> Result<Vec<i64>, SqliteGraphError> {
143
152
  match allowed_types {
144
153
  Some(set) => filter_neighbors(graph, node, direction, set),
@@ -183,7 +192,7 @@ fn filter_neighbors(
183
192
  Ok(result)
184
193
  }
185
194
 
186
- fn build_lookup<'a>(types: &'a [&'a str]) -> AHashSet<&'a str> {
195
+ pub(crate) fn build_lookup<'a>(types: &'a [&'a str]) -> AHashSet<&'a str> {
187
196
  let mut lookup = AHashSet::with_capacity(types.len());
188
197
  for ty in types {
189
198
  lookup.insert(*ty);