sqlitegraph 0.2.0__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 (448) hide show
  1. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/Cargo.lock +2 -2
  2. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/PKG-INFO +1 -1
  3. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/pyproject.toml +1 -1
  4. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/Cargo.toml +1 -1
  5. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/impl_.rs +56 -0
  6. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend.rs +37 -0
  7. sqlitegraph-0.3.0/sqlitegraph-core/src/graph/edge_ops.rs +118 -0
  8. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/entity_ops.rs +57 -0
  9. sqlitegraph-0.3.0/sqlitegraph-core/tests/bulk_insert_tests.rs +173 -0
  10. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/CHANGELOG.md +21 -0
  11. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/Cargo.toml +1 -1
  12. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/src/lib.rs +96 -0
  13. sqlitegraph-0.3.0/sqlitegraph-py/tests/test_bulk_insert.py +118 -0
  14. sqlitegraph-0.2.0/sqlitegraph-core/src/graph/edge_ops.rs +0 -58
  15. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/Cargo.toml +0 -0
  16. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/README.md +0 -0
  17. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/python/sqlitegraph/__init__.py +0 -0
  18. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/python/sqlitegraph/_native.pyi +0 -0
  19. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/python/sqlitegraph/py.typed +0 -0
  20. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/.gitignore +0 -0
  21. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/BLOCK_AWARE_CACHE_BEHAVIOR_REPORT.md +0 -0
  22. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/BLOCK_LOCALITY_PROTOTYPE_REPORT.md +0 -0
  23. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/BUG_10K_INVESTIGATION_SUMMARY.md +0 -0
  24. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/BUG_SNAPSHOTID_SQLITE_BACKEND.md +0 -0
  25. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/CACHE_CAPACITY_SWEEP_REPORT.md +0 -0
  26. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/CACHE_CLONE_FIX_REPORT.md +0 -0
  27. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/CHANGELOG.md +0 -0
  28. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/COLD_PATH_FORENSICS_REPORT.md +0 -0
  29. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/COLD_WARM_BENCHMARK_SPLIT_REPORT.md +0 -0
  30. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/EDGE_CORRUPTION_ROOT_CAUSE.md +0 -0
  31. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/LICENSE +0 -0
  32. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/MAIN_BENCHMARK_RERUN_REPORT.md +0 -0
  33. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/NODE_PAGE_OVERFLOW_FIX_REPORT.md +0 -0
  34. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/PAGE_ID_COLLISION_ROOT_CAUSE.md +0 -0
  35. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/PHASE3_NODE_PAGE_CACHE_FIX_REPORT.md +0 -0
  36. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/PHYSICAL_BLOCK_PLACEMENT_PROTOTYPE_REPORT.md +0 -0
  37. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/README.md +0 -0
  38. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/REBUILD_INDEXES_FIX_REPORT.md +0 -0
  39. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/REOPEN_CORRUPTION_FORENSICS.md +0 -0
  40. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_10K_NODE_BUG_FIX.md +0 -0
  41. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_FILE_IO_COORDINATION.md +0 -0
  42. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_FORENSIC_REPORT.md +0 -0
  43. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_REGRESSION_SWEEP_REPORT.md +0 -0
  44. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/adaptive_page_simple.rs +0 -0
  45. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/adjlist_benchmark.rs +0 -0
  46. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/algo_benchmarks.rs +0 -0
  47. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/backend_comparison.rs +0 -0
  48. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/bench_utils.rs +0 -0
  49. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/bfs.rs +0 -0
  50. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/cold_cache.rs +0 -0
  51. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/comparative_benchmark.rs +0 -0
  52. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/comprehensive_performance.rs +0 -0
  53. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/compression_benchmark.rs +0 -0
  54. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/concurrent_access.rs +0 -0
  55. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/connection_pool.rs +0 -0
  56. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/graph_generators.rs +0 -0
  57. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/graph_theory_benchmarks.rs +0 -0
  58. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/hnsw.rs +0 -0
  59. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/hnsw_multilayer.rs +0 -0
  60. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/insert.rs +0 -0
  61. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/k_hop.rs +0 -0
  62. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/memory_profiling.rs +0 -0
  63. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/mvcc_benchmarks.rs +0 -0
  64. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/native_disk_io.rs +0 -0
  65. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/parallel_bfs.rs +0 -0
  66. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/read_path_benchmarks.rs +0 -0
  67. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/real_datasets.rs +0 -0
  68. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_memory.rs +0 -0
  69. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_non_chain_patterns.rs +0 -0
  70. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_pubsub_memory.rs +0 -0
  71. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_pubsub_non_chain.rs +0 -0
  72. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_pubsub_write_cost.rs +0 -0
  73. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_write_cost.rs +0 -0
  74. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/sqlite_v3_comparison.rs +0 -0
  75. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/v3_algorithm_benchmarks.rs +0 -0
  76. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/v3_backend_benchmarks.rs +0 -0
  77. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/wal_recovery_benchmarks.rs +0 -0
  78. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/clippy.toml +0 -0
  79. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/core.d +0 -0
  80. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/debug_test.rs +0 -0
  81. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/HNSW_DEVELOPMENT_RULES.md +0 -0
  82. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/HNSW_VECTOR_INTEGRATION_FUTURE_ROADMAP.md +0 -0
  83. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/SEQUENTIAL_IO_PERFORMANCE.md +0 -0
  84. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/WAL_MODE_IMPLEMENTATION_GUIDE.md +0 -0
  85. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase-40-benchmark-report.md +0 -0
  86. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase10_performance_tuning.md +0 -0
  87. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase11_native_perf_plan.md +0 -0
  88. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase12_optimization_plan.md +0 -0
  89. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase14_step9_khop_corruption_codebase_mapping.md +0 -0
  90. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase29_step7_mmap_preaudit_notes.md +0 -0
  91. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase5_real_adjacency.md +0 -0
  92. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase6_implementation_status.md +0 -0
  93. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase6_native_graphbackend_plan.md +0 -0
  94. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase7_native_backend_refactor.md +0 -0
  95. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/superpowers/plans/2026-04-23-task-1-analysis.md +0 -0
  96. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/algo_benchmark.rs +0 -0
  97. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/basic_functionality_test.rs +0 -0
  98. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/batch_bench.rs +0 -0
  99. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/batch_stress_test.rs +0 -0
  100. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/bench_parallel_bfs.rs +0 -0
  101. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/block_locality_benchmark.rs +0 -0
  102. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cache_capacity_benchmark.rs +0 -0
  103. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cache_clone_forensics.rs +0 -0
  104. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cache_perf_test.rs +0 -0
  105. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cold_path_decomposition.rs +0 -0
  106. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/compression_analysis.rs +0 -0
  107. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/compression_detailed.rs +0 -0
  108. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/compression_diagnostics.rs +0 -0
  109. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/crash_test_child.rs +0 -0
  110. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/debug_buffer_error.rs +0 -0
  111. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/get_node_cache_sweep.rs +0 -0
  112. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/phase53_1_execution.rs +0 -0
  113. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/phase55_simple_benchmark.rs +0 -0
  114. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/reopen_corruption_repro.rs +0 -0
  115. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_100k.rs +0 -0
  116. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_adaptive_pages.rs +0 -0
  117. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_allocator_startup.rs +0 -0
  118. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_batch_simple.rs +0 -0
  119. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_binary_search.rs +0 -0
  120. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_btree_100k.rs +0 -0
  121. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_cache_warm.rs +0 -0
  122. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_chunked_bfs.rs +0 -0
  123. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_delta_encoding.rs +0 -0
  124. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_direct_backend_benchmark.rs +0 -0
  125. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_direct_edgestore.rs +0 -0
  126. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_edge_store_direct.rs +0 -0
  127. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_edgestore_perf.rs +0 -0
  128. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_index_restore.rs +0 -0
  129. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_index_staleness.rs +0 -0
  130. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_lazy_decode.rs +0 -0
  131. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_lock_overhead.rs +0 -0
  132. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_native_edge.rs +0 -0
  133. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_neighbors_cache.rs +0 -0
  134. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_neighbors_detailed.rs +0 -0
  135. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_neighbors_profile.rs +0 -0
  136. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_open_detailed_timing.rs +0 -0
  137. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_open_roundtrip.rs +0 -0
  138. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_open_stage_timing.rs +0 -0
  139. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_performance_comparison.rs +0 -0
  140. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_rwlock_overhead.rs +0 -0
  141. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_sqlite_neighbors_perf.rs +0 -0
  142. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_v3_neighbors_perf.rs +0 -0
  143. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_vec_clone.rs +0 -0
  144. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_forensic_page_analysis.rs +0 -0
  145. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_forensics_example.rs +0 -0
  146. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_get_node_profile.rs +0 -0
  147. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_offset_forensic.rs +0 -0
  148. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_perf_test.rs +0 -0
  149. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_readonly_profile.rs +0 -0
  150. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_reopen_verify.rs +0 -0
  151. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/libtest_syntax.rlib +0 -0
  152. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/manual.md +0 -0
  153. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/snapshot_export/snapshot_1766284406.v2 +0 -0
  154. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/snapshot_export/snapshot_1766284420.v2 +0 -0
  155. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/sqlitegraph_bench.json +0 -0
  156. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/centrality.rs +0 -0
  157. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/graph_ops.rs +0 -0
  158. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/mod.rs +0 -0
  159. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/traversal.rs +0 -0
  160. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/call_graph_analysis.rs +0 -0
  161. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/centrality.rs +0 -0
  162. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/community.rs +0 -0
  163. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/control_dependence.rs +0 -0
  164. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/critical_path.rs +0 -0
  165. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/cut_partition.rs +0 -0
  166. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/cycle_basis.rs +0 -0
  167. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/dominance_frontiers.rs +0 -0
  168. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/dominators.rs +0 -0
  169. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/graph_diff.rs +0 -0
  170. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/graph_rewriting.rs +0 -0
  171. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/graph_similarity.rs +0 -0
  172. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/mod.rs +0 -0
  173. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/natural_loops.rs +0 -0
  174. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/observability.rs +0 -0
  175. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/path_enumeration.rs +0 -0
  176. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/post_dominators.rs +0 -0
  177. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/program_slicing.rs +0 -0
  178. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/reachability.rs +0 -0
  179. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/scc.rs +0 -0
  180. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/structure.rs +0 -0
  181. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/subgraph_isomorphism.rs +0 -0
  182. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/taint_analysis.rs +0 -0
  183. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/tests.rs +0 -0
  184. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/topological_sort.rs +0 -0
  185. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/transitive_closure.rs +0 -0
  186. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/transitive_reduction.rs +0 -0
  187. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/wcc.rs +0 -0
  188. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/api_ergonomics.rs +0 -0
  189. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/constants.rs +0 -0
  190. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/cpu_tuning.rs +0 -0
  191. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/mod.rs +0 -0
  192. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/aliases.rs +0 -0
  193. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/cpu_profile.rs +0 -0
  194. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/errors.rs +0 -0
  195. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/flags.rs +0 -0
  196. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/kv_types.rs +0 -0
  197. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/mod.rs +0 -0
  198. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/utils.rs +0 -0
  199. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/algorithm/mod.rs +0 -0
  200. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/algorithm/parallel_bfs.rs +0 -0
  201. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/allocator.rs +0 -0
  202. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/backend.rs +0 -0
  203. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/btree.rs +0 -0
  204. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compact_edge_record.rs +0 -0
  205. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/delta.rs +0 -0
  206. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/edge_delta.rs +0 -0
  207. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/mod.rs +0 -0
  208. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/varint.rs +0 -0
  209. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/constants.rs +0 -0
  210. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/edge_compat.rs +0 -0
  211. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/file_coordinator.rs +0 -0
  212. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/forensics.rs +0 -0
  213. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/header.rs +0 -0
  214. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/index/mod.rs +0 -0
  215. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/index/page.rs +0 -0
  216. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/index_persistence.rs +0 -0
  217. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kind_index.rs +0 -0
  218. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kv_store/mod.rs +0 -0
  219. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kv_store/store.rs +0 -0
  220. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kv_store/types.rs +0 -0
  221. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/lazy_init_tests.rs +0 -0
  222. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/mod.rs +0 -0
  223. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/name_index.rs +0 -0
  224. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/block_cache.rs +0 -0
  225. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/cache.rs +0 -0
  226. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/mod.rs +0 -0
  227. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/page.rs +0 -0
  228. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/record.rs +0 -0
  229. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/store.rs +0 -0
  230. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/tests.rs +0 -0
  231. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/pubsub/mod.rs +0 -0
  232. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/pubsub/publisher.rs +0 -0
  233. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/pubsub/types.rs +0 -0
  234. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/storage/adaptive_page.rs +0 -0
  235. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/storage/media_detector.rs +0 -0
  236. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/storage/mod.rs +0 -0
  237. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/string_table/mod.rs +0 -0
  238. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/string_table/table.rs +0 -0
  239. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/string_table/tests.rs +0 -0
  240. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/tests/mod.rs +0 -0
  241. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/wal.rs +0 -0
  242. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/write_batch.rs +0 -0
  243. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/helpers.rs +0 -0
  244. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/kv_tests.rs +0 -0
  245. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/mod.rs +0 -0
  246. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/pubsub_tests.rs +0 -0
  247. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/types.rs +0 -0
  248. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend_selector.rs +0 -0
  249. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_gates.rs +0 -0
  250. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_meta.rs +0 -0
  251. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_regression.rs +0 -0
  252. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_utils.rs +0 -0
  253. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bfs.rs +0 -0
  254. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/cache.rs +0 -0
  255. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/client.rs +0 -0
  256. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/factory.rs +0 -0
  257. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/graph_config.rs +0 -0
  258. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/kinds.rs +0 -0
  259. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/mod.rs +0 -0
  260. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/native.rs +0 -0
  261. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/sqlite.rs +0 -0
  262. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/dependency_monitor.rs +0 -0
  263. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/dsl.rs +0 -0
  264. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/errors.rs +0 -0
  265. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/fault_injection.rs +0 -0
  266. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/adjacency.rs +0 -0
  267. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/core.rs +0 -0
  268. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/instrumented.rs +0 -0
  269. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/metrics_core.rs +0 -0
  270. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/metrics_snapshot.rs +0 -0
  271. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/mod.rs +0 -0
  272. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/statement_tracker.rs +0 -0
  273. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/utils.rs +0 -0
  274. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics_schema.rs +0 -0
  275. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/mod.rs +0 -0
  276. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/pattern_matching.rs +0 -0
  277. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/pool.rs +0 -0
  278. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/snapshot.rs +0 -0
  279. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/types.rs +0 -0
  280. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph_opt.rs +0 -0
  281. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/batch_filter.rs +0 -0
  282. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/builder.rs +0 -0
  283. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/config.rs +0 -0
  284. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/distance_functions.rs +0 -0
  285. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/distance_metric.rs +0 -0
  286. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/errors.rs +0 -0
  287. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index.rs +0 -0
  288. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index_api.rs +0 -0
  289. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index_internal.rs +0 -0
  290. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index_persist.rs +0 -0
  291. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/layer.rs +0 -0
  292. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/mod.rs +0 -0
  293. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/multilayer.rs +0 -0
  294. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/neighborhood.rs +0 -0
  295. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/serialization.rs +0 -0
  296. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/simd.rs +0 -0
  297. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/storage.rs +0 -0
  298. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/v3_storage.rs +0 -0
  299. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/v3_storage_tests.rs +0 -0
  300. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/index.rs +0 -0
  301. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/engine.rs +0 -0
  302. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/mod.rs +0 -0
  303. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/sampling.rs +0 -0
  304. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/simd.rs +0 -0
  305. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/introspection.rs +0 -0
  306. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/lib.rs +0 -0
  307. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/multi_hop.rs +0 -0
  308. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/mvcc.rs +0 -0
  309. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern.rs +0 -0
  310. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/matcher.rs +0 -0
  311. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/mod.rs +0 -0
  312. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/pattern.rs +0 -0
  313. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/property.rs +0 -0
  314. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/query.rs +0 -0
  315. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/tests.rs +0 -0
  316. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/edge_validation.rs +0 -0
  317. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/fast_path_detection.rs +0 -0
  318. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/fast_path_execution.rs +0 -0
  319. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/mod.rs +0 -0
  320. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/tests.rs +0 -0
  321. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/progress.rs +0 -0
  322. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/query.rs +0 -0
  323. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/query_cache.rs +0 -0
  324. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/reasoning.rs +0 -0
  325. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/recovery.rs +0 -0
  326. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/schema.rs +0 -0
  327. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/snapshot.rs +0 -0
  328. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/acid_regression_test.rs +0 -0
  329. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/acid_snapshot_test.rs +0 -0
  330. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/algo_tests.rs +0 -0
  331. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/backend_selector_tests.rs +0 -0
  332. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_data_tests.rs +0 -0
  333. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_gate_tests.rs +0 -0
  334. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_gates_tests.rs +0 -0
  335. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_meta_tests.rs +0 -0
  336. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_report_tests.rs +0 -0
  337. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/benchmark_isolation_test.rs +0 -0
  338. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bfs_tests.rs +0 -0
  339. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bincode_compatibility_test.rs +0 -0
  340. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cache_effectiveness_tests.rs +0 -0
  341. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cache_tests.rs +0 -0
  342. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/check_write_path.rs +0 -0
  343. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cluster_offset_corruption_regression.rs +0 -0
  344. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cold_path_forensics.rs +0 -0
  345. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_file_size.rs +0 -0
  346. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_index_rebuilding.rs +0 -0
  347. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_overflow.rs +0 -0
  348. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_scenario_c.rs +0 -0
  349. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/deterministic_index_tests.rs +0 -0
  350. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/direct_file_read_corruption_test.rs +0 -0
  351. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/doc_tests.rs +0 -0
  352. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_corruption_minimal.rs +0 -0
  353. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_corruption_repro.rs +0 -0
  354. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_insertion_corruption_test.rs +0 -0
  355. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_tests.rs +0 -0
  356. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/entity_tests.rs +0 -0
  357. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/file_extension_debug.rs +0 -0
  358. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/fuzz_common.rs +0 -0
  359. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/get_node_forensics.rs +0 -0
  360. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/graph_node_existence_enforcement.rs +0 -0
  361. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/graph_opt_tests.rs +0 -0
  362. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/helpers/mod.rs +0 -0
  363. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/hnsw_persistence_tests.rs +0 -0
  364. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/index_persistence_integration.rs +0 -0
  365. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/index_persistence_validation.rs +0 -0
  366. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/index_tests.rs +0 -0
  367. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/instrumentation_tests.rs +0 -0
  368. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/integration_tests.rs +0 -0
  369. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/isolate_open_bug.rs +0 -0
  370. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/json_parsing_diagnostics.rs +0 -0
  371. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/kv_durability_tests.rs +0 -0
  372. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/lib_api_smoke_tests.rs +0 -0
  373. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/multi_hop_tests.rs +0 -0
  374. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/multi_node_corruption_regression.rs +0 -0
  375. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_baseline_tests.rs +0 -0
  376. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_concurrent_tests.rs +0 -0
  377. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_edge_case_tests.rs +0 -0
  378. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_snapshot_tests.rs +0 -0
  379. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_wal_tests.rs +0 -0
  380. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/native_edge_insertion_regression.rs +0 -0
  381. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/node_overflow_forensics.rs +0 -0
  382. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/node_read_forensics_test.rs +0 -0
  383. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/node_slot_transaction_persistence.rs +0 -0
  384. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/oom_reproduction_test.rs +0 -0
  385. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/page_42_debug.rs +0 -0
  386. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/page_write_debug.rs +0 -0
  387. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/pattern_cache_fastpath_tests.rs +0 -0
  388. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/pattern_engine_tests.rs +0 -0
  389. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/pattern_tests.rs +0 -0
  390. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/perf_gate_tests.rs +0 -0
  391. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/perf_gate_v32_tests.rs +0 -0
  392. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase32_cluster_pipeline_reconstruction_tests_clean.rs +0 -0
  393. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase44_2_cluster_size_contract_tests.rs +0 -0
  394. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase64_node_count_durability_regression.rs +0 -0
  395. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase65_cluster_size_corruption_regression.rs +0 -0
  396. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase73_node_count_corruption_capture.rs +0 -0
  397. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/query_cache_performance_tests.rs +0 -0
  398. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/query_cache_tests.rs +0 -0
  399. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/query_tests.rs +0 -0
  400. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/recovery_tests.rs +0 -0
  401. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/regression_concurrent_traversal.rs +0 -0
  402. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/reopen_corruption_investigation.rs +0 -0
  403. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/reopen_integration_test.rs +0 -0
  404. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/rowid_tests.rs +0 -0
  405. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/schema_tests.rs +0 -0
  406. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/snapshot_isolation_tests.rs +0 -0
  407. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/sqlite_reopen_tests.rs +0 -0
  408. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/sqlite_snapshot_tests.rs +0 -0
  409. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/test_10k_bug_reproduction.rs +0 -0
  410. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/transaction_begin_corruption_proof.rs +0 -0
  411. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/unsafe_invariants_tests.rs +0 -0
  412. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_algorithm_tests.rs +0 -0
  413. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_block_locality_tests.rs +0 -0
  414. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_btree_forensics.rs +0 -0
  415. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_check_nodepages.rs +0 -0
  416. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_dump_page_headers.rs +0 -0
  417. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_edge_durability_tdd.rs +0 -0
  418. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_file_write_test.rs +0 -0
  419. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_focused_perf.rs +0 -0
  420. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_forensics_test.rs +0 -0
  421. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_header_forensics.rs +0 -0
  422. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_insert_read_forensics.rs +0 -0
  423. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_integrity_check.rs +0 -0
  424. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_kind_index_tests.rs +0 -0
  425. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_name_index_tests.rs +0 -0
  426. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_page_ownership_forensics.rs +0 -0
  427. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_persistence_100.rs +0 -0
  428. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_query_truth_tests.rs +0 -0
  429. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_regression_sweep.rs +0 -0
  430. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_reopen_durability.rs +0 -0
  431. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_sync_fix_validation.rs +0 -0
  432. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_verify_file_persistence.rs +0 -0
  433. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/wal_mode_default_tests.rs +0 -0
  434. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/wal_tuning_tests.rs +0 -0
  435. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/write_buffer_coherence_regression.rs +0 -0
  436. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/.gitignore +0 -0
  437. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/README.md +0 -0
  438. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/01_basic_crud.py +0 -0
  439. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/02_graph_algorithms.py +0 -0
  440. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/03_vector_search.py +0 -0
  441. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/04_social_network.py +0 -0
  442. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/05_file_backed.py +0 -0
  443. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_algo.py +0 -0
  444. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_basic.py +0 -0
  445. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_crud.py +0 -0
  446. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_errors.py +0 -0
  447. {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_filtered_traversal.py +0 -0
  448. {sqlitegraph-0.2.0 → 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.3.0"
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.2.0"
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.2.0
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.2.0"
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.3.0"
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"
@@ -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
  }
@@ -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
@@ -565,6 +594,14 @@ where
565
594
  (*self).entity_ids()
566
595
  }
567
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
+
568
605
  fn neighbors(
569
606
  &self,
570
607
  snapshot_id: SnapshotId,
@@ -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(
@@ -0,0 +1,173 @@
1
+ //! Tests for bulk insert primitives on `SqliteGraph` and `GraphBackend`.
2
+
3
+ use serde_json::json;
4
+ use sqlitegraph::{
5
+ GraphEdge, GraphEntity, SqliteGraph, SqliteGraphBackend,
6
+ backend::{EdgeSpec, GraphBackend, NodeSpec},
7
+ };
8
+
9
+ fn entity(kind: &str, name: &str) -> GraphEntity {
10
+ GraphEntity {
11
+ id: 0,
12
+ kind: kind.to_string(),
13
+ name: name.to_string(),
14
+ file_path: None,
15
+ data: json!({}),
16
+ }
17
+ }
18
+
19
+ fn edge(from: i64, to: i64, kind: &str) -> GraphEdge {
20
+ GraphEdge {
21
+ id: 0,
22
+ from_id: from,
23
+ to_id: to,
24
+ edge_type: kind.to_string(),
25
+ data: json!({}),
26
+ }
27
+ }
28
+
29
+ fn node_spec(kind: &str, name: &str) -> NodeSpec {
30
+ NodeSpec {
31
+ kind: kind.to_string(),
32
+ name: name.to_string(),
33
+ file_path: None,
34
+ data: json!({}),
35
+ }
36
+ }
37
+
38
+ fn edge_spec(from: i64, to: i64, kind: &str) -> EdgeSpec {
39
+ EdgeSpec {
40
+ from: from,
41
+ to: to,
42
+ edge_type: kind.to_string(),
43
+ data: json!({}),
44
+ }
45
+ }
46
+
47
+ #[test]
48
+ fn insert_entities_bulk_returns_ids_in_input_order() {
49
+ let graph = SqliteGraph::open_in_memory().expect("graph");
50
+ let entities = vec![
51
+ entity("Function", "a"),
52
+ entity("Function", "b"),
53
+ entity("Function", "c"),
54
+ ];
55
+ let ids = graph
56
+ .insert_entities_bulk(&entities)
57
+ .expect("bulk insert entities");
58
+ assert_eq!(ids.len(), 3);
59
+ assert!(ids[0] < ids[1]);
60
+ assert!(ids[1] < ids[2]);
61
+ // Verify roundtrip
62
+ let stored = graph.get_entity(ids[1]).expect("get");
63
+ assert_eq!(stored.name, "b");
64
+ }
65
+
66
+ #[test]
67
+ fn insert_entities_bulk_empty_input_returns_empty_vec() {
68
+ let graph = SqliteGraph::open_in_memory().expect("graph");
69
+ let ids = graph.insert_entities_bulk(&[]).expect("bulk empty");
70
+ assert!(ids.is_empty());
71
+ }
72
+
73
+ #[test]
74
+ fn insert_entities_bulk_rolls_back_on_error() {
75
+ let graph = SqliteGraph::open_in_memory().expect("graph");
76
+ // Insert one valid entity to anchor a baseline count.
77
+ graph
78
+ .insert_entity(&entity("Function", "baseline"))
79
+ .unwrap();
80
+
81
+ // Build a batch where the second entity has an invalid (empty) name.
82
+ let entities = vec![
83
+ entity("Function", "valid_one"),
84
+ entity("Function", ""), // validate_entity rejects empty name
85
+ entity("Function", "valid_two"),
86
+ ];
87
+ let result = graph.insert_entities_bulk(&entities);
88
+ assert!(result.is_err(), "expected error for invalid entity");
89
+
90
+ // Count must remain 1 — the partial inserts in this batch were rolled back.
91
+ let ids = graph.list_entity_ids().unwrap();
92
+ assert_eq!(ids.len(), 1, "expected rollback to undo partial inserts");
93
+ }
94
+
95
+ #[test]
96
+ fn insert_edges_bulk_returns_ids_in_input_order() {
97
+ let graph = SqliteGraph::open_in_memory().expect("graph");
98
+ let a = graph.insert_entity(&entity("Node", "a")).unwrap();
99
+ let b = graph.insert_entity(&entity("Node", "b")).unwrap();
100
+ let c = graph.insert_entity(&entity("Node", "c")).unwrap();
101
+
102
+ let edges = vec![
103
+ edge(a, b, "CALL"),
104
+ edge(b, c, "CALL"),
105
+ edge(a, c, "IMPORTS"),
106
+ ];
107
+ let ids = graph.insert_edges_bulk(&edges).expect("bulk insert edges");
108
+ assert_eq!(ids.len(), 3);
109
+ assert!(ids[0] < ids[1]);
110
+ assert!(ids[1] < ids[2]);
111
+ }
112
+
113
+ #[test]
114
+ fn insert_edges_bulk_empty_input_returns_empty_vec() {
115
+ let graph = SqliteGraph::open_in_memory().expect("graph");
116
+ let ids = graph.insert_edges_bulk(&[]).expect("bulk empty");
117
+ assert!(ids.is_empty());
118
+ }
119
+
120
+ #[test]
121
+ fn graph_backend_insert_nodes_bulk_via_sqlite_backend() {
122
+ let backend = SqliteGraphBackend::in_memory().expect("backend");
123
+ let specs = vec![
124
+ node_spec("Function", "alpha"),
125
+ node_spec("Function", "beta"),
126
+ node_spec("Function", "gamma"),
127
+ ];
128
+ let ids = backend
129
+ .insert_nodes_bulk(&specs)
130
+ .expect("bulk insert nodes");
131
+ assert_eq!(ids.len(), 3);
132
+ assert!(ids[0] < ids[1]);
133
+ }
134
+
135
+ #[test]
136
+ fn graph_backend_insert_edges_bulk_via_sqlite_backend() {
137
+ let backend = SqliteGraphBackend::in_memory().expect("backend");
138
+ let node_specs = vec![node_spec("Node", "a"), node_spec("Node", "b")];
139
+ let ids = backend.insert_nodes_bulk(&node_specs).expect("nodes");
140
+ let edge_specs = vec![edge_spec(ids[0], ids[1], "LINK")];
141
+ let edge_ids = backend
142
+ .insert_edges_bulk(&edge_specs)
143
+ .expect("bulk insert edges");
144
+ assert_eq!(edge_ids.len(), 1);
145
+ }
146
+
147
+ #[test]
148
+ fn bulk_insert_matches_single_insert_observable_state() {
149
+ let single = SqliteGraph::open_in_memory().expect("single");
150
+ let bulk = SqliteGraph::open_in_memory().expect("bulk");
151
+
152
+ let entities = vec![
153
+ entity("Function", "a"),
154
+ entity("Function", "b"),
155
+ entity("Function", "c"),
156
+ ];
157
+ for e in &entities {
158
+ single.insert_entity(e).unwrap();
159
+ }
160
+ let bulk_ids = bulk.insert_entities_bulk(&entities).unwrap();
161
+
162
+ // Same observable state: same names, same kinds, same file_paths,
163
+ // same id ordering, same count.
164
+ assert_eq!(bulk_ids.len(), 3);
165
+ for (i, id) in bulk_ids.iter().enumerate() {
166
+ let stored = bulk.get_entity(*id).unwrap();
167
+ assert_eq!(stored.name, entities[i].name);
168
+ assert_eq!(stored.kind, entities[i].kind);
169
+ }
170
+ let bulk_count = bulk.list_entity_ids().unwrap().len();
171
+ let single_count = single.list_entity_ids().unwrap().len();
172
+ assert_eq!(bulk_count, single_count);
173
+ }
@@ -3,6 +3,27 @@
3
3
  This file tracks releases of the `sqlitegraph` package on PyPI. The Rust
4
4
  crate of the same name has its own changelog at the repository root.
5
5
 
6
+ ## [0.3.0] - 2026-05-16
7
+
8
+ ### Added
9
+ - **`Graph.add_nodes_bulk(items: list[dict])`** — Insert many nodes in a
10
+ single FFI call inside one transaction. Each dict must have `kind` and
11
+ `name`; `data` (dict) and `file_path` (str) are optional. Returns
12
+ IDs in input order.
13
+ - **`Graph.add_edges_bulk(items: list[dict])`** — Insert many edges in a
14
+ single FFI call inside one transaction. Each dict must have `from_id`,
15
+ `to_id`, and `edge_type`; `data` (dict) is optional. Returns IDs in
16
+ input order.
17
+ - **10 new pytest cases** in `tests/test_bulk_insert.py` covering both
18
+ bulk paths, missing-field validation, data round-trip, and parity
19
+ with per-item single-insert.
20
+
21
+ ### Notes
22
+ - Built against `sqlitegraph` (Rust) **v2.4.0**, which adds the
23
+ underlying `GraphBackend::insert_nodes_bulk` and `insert_edges_bulk`
24
+ trait methods.
25
+ - All existing `add_node`/`add_edge` signatures are unchanged.
26
+
6
27
  ## [0.2.0] - 2026-05-15
7
28
 
8
29
  ### Added
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "sqlitegraph-py"
3
- version = "0.2.0"
3
+ version = "0.3.0"
4
4
  edition = "2021"
5
5
  description = "Python bindings for sqlitegraph via PyO3"
6
6
  license = "GPL-3.0-only"
@@ -133,6 +133,51 @@ impl Graph {
133
133
  self.backend.insert_node(spec).map_err(into_pyerr)
134
134
  }
135
135
 
136
+ /// Insert many nodes atomically inside a single transaction.
137
+ ///
138
+ /// Args:
139
+ /// items: List of dicts, each with `kind` and `name` (required) plus
140
+ /// optional `data` (dict) and `file_path` (str).
141
+ ///
142
+ /// Returns:
143
+ /// List of new node IDs in the same order as ``items``.
144
+ ///
145
+ /// Raises:
146
+ /// InvalidArgumentError if any item is missing required fields or
147
+ /// fails validation. On error the transaction is rolled back; no
148
+ /// nodes are inserted.
149
+ fn add_nodes_bulk(&self, items: Vec<Bound<'_, PyDict>>) -> PyResult<Vec<i64>> {
150
+ let mut specs = Vec::with_capacity(items.len());
151
+ for item in items.iter() {
152
+ let kind: String = item
153
+ .get_item("kind")?
154
+ .ok_or_else(|| InvalidArgumentError::new_err("each item must have a 'kind' field"))?
155
+ .extract()?;
156
+ let name: String = item
157
+ .get_item("name")?
158
+ .ok_or_else(|| InvalidArgumentError::new_err("each item must have a 'name' field"))?
159
+ .extract()?;
160
+ let file_path: Option<String> = match item.get_item("file_path")? {
161
+ Some(v) if !v.is_none() => Some(v.extract()?),
162
+ _ => None,
163
+ };
164
+ let data = match item.get_item("data")? {
165
+ Some(v) if !v.is_none() => {
166
+ let dict = v.cast::<PyDict>()?;
167
+ dict_to_json(dict)?
168
+ }
169
+ _ => serde_json::json!({}),
170
+ };
171
+ specs.push(NodeSpec {
172
+ kind,
173
+ name,
174
+ file_path,
175
+ data,
176
+ });
177
+ }
178
+ self.backend.insert_nodes_bulk(&specs).map_err(into_pyerr)
179
+ }
180
+
136
181
  /// Get a node by ID. Returns a dict with keys: id, kind, name, data.
137
182
  fn get_node<'py>(&self, py: Python<'py>, id: i64) -> PyResult<Bound<'py, PyDict>> {
138
183
  let entity = self
@@ -230,6 +275,57 @@ impl Graph {
230
275
  self.backend.insert_edge(spec).map_err(into_pyerr)
231
276
  }
232
277
 
278
+ /// Insert many edges atomically inside a single transaction.
279
+ ///
280
+ /// Args:
281
+ /// items: List of dicts, each with `from_id`, `to_id`, and
282
+ /// `edge_type` (all required) plus optional `data` (dict).
283
+ ///
284
+ /// Returns:
285
+ /// List of new edge IDs in the same order as ``items``.
286
+ ///
287
+ /// Raises:
288
+ /// InvalidArgumentError if any item is missing required fields or
289
+ /// references non-existent endpoints. On error the transaction is
290
+ /// rolled back; no edges are inserted.
291
+ fn add_edges_bulk(&self, items: Vec<Bound<'_, PyDict>>) -> PyResult<Vec<i64>> {
292
+ let mut specs = Vec::with_capacity(items.len());
293
+ for item in items.iter() {
294
+ let from_id: i64 = item
295
+ .get_item("from_id")?
296
+ .ok_or_else(|| {
297
+ InvalidArgumentError::new_err("each item must have a 'from_id' field")
298
+ })?
299
+ .extract()?;
300
+ let to_id: i64 = item
301
+ .get_item("to_id")?
302
+ .ok_or_else(|| {
303
+ InvalidArgumentError::new_err("each item must have a 'to_id' field")
304
+ })?
305
+ .extract()?;
306
+ let edge_type: String = item
307
+ .get_item("edge_type")?
308
+ .ok_or_else(|| {
309
+ InvalidArgumentError::new_err("each item must have an 'edge_type' field")
310
+ })?
311
+ .extract()?;
312
+ let data = match item.get_item("data")? {
313
+ Some(v) if !v.is_none() => {
314
+ let dict = v.cast::<PyDict>()?;
315
+ dict_to_json(dict)?
316
+ }
317
+ _ => serde_json::json!({}),
318
+ };
319
+ specs.push(EdgeSpec {
320
+ from: from_id,
321
+ to: to_id,
322
+ edge_type,
323
+ data,
324
+ });
325
+ }
326
+ self.backend.insert_edges_bulk(&specs).map_err(into_pyerr)
327
+ }
328
+
233
329
  /// Get neighbors of a node.
234
330
  ///
235
331
  /// Args: